@openhands/agent-canvas 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1373) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/Trans-De9RwQhA.js +1 -0
  4. package/build/assets/__vite-browser-external-4xJsU2-u.js +1 -0
  5. package/build/assets/{acp-providers-B_ZxlEbx.js → acp-providers-D_D8VUpP.js} +1 -1
  6. package/build/assets/active-backend-context-DRFevVIj.js +1 -0
  7. package/build/assets/add-backend-modal-DzuB9zlG.js +1 -0
  8. package/build/assets/agent-profiles-settings-BfAwTshW.js +1 -0
  9. package/build/assets/{agent-server-client-options-CxnCYyIW.js → agent-server-client-options-DVLRd9sw.js} +1 -1
  10. package/build/assets/agent-server-conversation-service.api-DfH2k6Sx.js +5 -0
  11. package/build/assets/agent-settings-CMMms-0q.js +1 -0
  12. package/build/assets/agent-settings-DjVlKgaP.js +2 -0
  13. package/build/assets/alert-banner-BW0wRYw6.js +1 -0
  14. package/build/assets/api-key-entry-screen-O8gS-fnF.js +1 -0
  15. package/build/assets/app-settings-SlZvaXlk.js +1 -0
  16. package/build/assets/automation-detail-CwsNJ9AM.js +2 -0
  17. package/build/assets/automations-list-B9cPtugh.js +1 -0
  18. package/build/assets/back-nav-button-BYmxFxGt.js +1 -0
  19. package/build/assets/backend-form-modal-D2EDGVAc.js +1 -0
  20. package/build/assets/backend-synced-settings-badge-6OCwIuLY.js +1 -0
  21. package/build/assets/base-modal-CC5Pp8CF.js +1 -0
  22. package/build/assets/bot-D7eUAuSB.js +1 -0
  23. package/build/assets/brand-button-DKPMEKcW.js +1 -0
  24. package/build/assets/{browser-CCwPzPsD.js → browser-B39N74jU.js} +2 -2
  25. package/build/assets/browser-store-BI6uklCG.js +1 -0
  26. package/build/assets/browser-tab-aiDg7aEn.js +1 -0
  27. package/build/assets/chat-send-button-DxuZIoW8.js +1 -0
  28. package/build/assets/check-Bvi71siz.js +1 -0
  29. package/build/assets/checkmark-h7udgXMM.js +1 -0
  30. package/build/assets/{chevron-down-BxZEAIv4.js → chevron-down-CI8A6tet.js} +1 -1
  31. package/build/assets/circle-plus-check-toggle-T3eAIuPQ.js +1 -0
  32. package/build/assets/close-p3Op5lxI.js +1 -0
  33. package/build/assets/code-tag-DYlAhEQY.js +1 -0
  34. package/build/assets/{color-themes-CTNRQd1a.js → color-themes-Dd1sO5U6.js} +1 -1
  35. package/build/assets/combobox-caret-CLGvOs32.js +1 -0
  36. package/build/assets/command-menu-DKrLCRla.js +1 -0
  37. package/build/assets/{command-store-C-57Heey.js → command-store-D8J5LMW1.js} +1 -1
  38. package/build/assets/condenser-settings-BhxvlfoY.js +1 -0
  39. package/build/assets/confirmation-modal-BK1F0A68.js +1 -0
  40. package/build/assets/context-menu-list-item-DBFzplWW.js +1 -0
  41. package/build/assets/conversation-B8prFAZF.js +19 -0
  42. package/build/assets/conversation-DGVDwGn8.js +1 -0
  43. package/build/assets/conversation-local-storage-F6zVMM--.js +1 -0
  44. package/build/assets/conversation-panel-C7DC4Cxx.js +1 -0
  45. package/build/assets/conversation-service.api-Ch9kR9aE.js +1 -0
  46. package/build/assets/conversation-state-store-B2Bp32XI.js +1 -0
  47. package/build/assets/conversation-store-LptbOvKa.js +1 -0
  48. package/build/assets/conversation-tab-empty-state-m8IUkfMj.js +1 -0
  49. package/build/assets/copy-3JCw_XFB.js +1 -0
  50. package/build/assets/copy-BLmGeJcd.js +1 -0
  51. package/build/assets/copy-to-clipboard-button-Aj9wFmt2.js +1 -0
  52. package/build/assets/createLucideIcon-CVAsW2Yo.js +1 -0
  53. package/build/assets/declaration-B9kpCaYl.js +1 -0
  54. package/build/assets/device-verify-B5YCrvSu.js +1 -0
  55. package/build/assets/dist-CodhvuAP.js +1 -0
  56. package/build/assets/dropdown-classes-CgQ45JmQ.js +1 -0
  57. package/build/assets/edit-automation-modal-BoibW8cd.js +1 -0
  58. package/build/assets/ellipsis-button-1BV9Sga8.js +1 -0
  59. package/build/assets/entry.client-BgWj9jL_.js +2 -0
  60. package/build/assets/enum-filter-dropdown-DCITiYVi.js +1 -0
  61. package/build/assets/environment-switch-overlay-DUnKILNH.js +1 -0
  62. package/build/assets/extensions-hub-MtC8lK3A.js +1 -0
  63. package/build/assets/{extensions-navigation-DfLHdTUC.js → extensions-navigation-BtV14oQL.js} +1 -1
  64. package/build/assets/{external-link-D8njjDTk.js → external-link-D2zJjE9G.js} +1 -1
  65. package/build/assets/files-tab-DHqtsKLy.js +1 -0
  66. package/build/assets/files-tab-store-DJsPxYdg.js +1 -0
  67. package/build/assets/folder-mMWFvaw0.js +1 -0
  68. package/build/assets/form-control-classes-9rkU4usZ.js +1 -0
  69. package/build/assets/get-language-from-path-CPNnuVhI.js +1 -0
  70. package/build/assets/git-provider-icon-CGU7_KiU.js +1 -0
  71. package/build/assets/home-BgjWP_UN.js +1 -0
  72. package/build/assets/iconBase-DaTRRUjy.js +1 -0
  73. package/build/assets/index-redirect-CUUJiNki.js +1 -0
  74. package/build/assets/install-server-modal-J_eQ6lhG.js +1 -0
  75. package/build/assets/launch-DamfAY5L.js +1 -0
  76. package/build/assets/lesson-plan-HD886V64.js +4 -0
  77. package/build/assets/link-external-DfKQroKX.js +1 -0
  78. package/build/assets/{list-todo-B_Ts2JmZ.js → list-todo-BfH6yYUK.js} +1 -1
  79. package/build/assets/llm-not-configured-banner-DTrLsVr_.js +27 -0
  80. package/build/assets/llm-settings-BgSFkbHC.js +1 -0
  81. package/build/assets/llm-settings-Bkc8C5Bi.js +1 -0
  82. package/build/assets/{llm-subscription-service-BX_AtNlO.js → llm-subscription-service-CKyaV24y.js} +1 -1
  83. package/build/assets/loader-circle-BEykUKYG.js +1 -0
  84. package/build/assets/loading-spinner-DHAIPZkP.js +1 -0
  85. package/build/assets/manage-backends-modal-BUzj5_Lq.js +1 -0
  86. package/build/assets/manifest-4d6a1552.js +1 -0
  87. package/build/assets/{markdown-renderer-DWy7Np7u.js → markdown-renderer-D8mayGjI.js} +1 -1
  88. package/build/assets/mcp-DvqJYDbz.js +9 -0
  89. package/build/assets/messages-C4KEFkPk.js +40 -0
  90. package/build/assets/middleware-DYHYNAnP.js +6 -0
  91. package/build/assets/modal-backdrop-zVwfOJZr.js +1 -0
  92. package/build/assets/modal-body-Dcu5McCa.js +1 -0
  93. package/build/assets/{modal-classes-C4kS6ib_.js → modal-classes-DPqxSyuP.js} +1 -1
  94. package/build/assets/modal-close-button-CTCX4nCH.js +1 -0
  95. package/build/assets/model-selector-VDHBytb6.js +1 -0
  96. package/build/assets/{mouse-pointer-click-CXAx4FyM.js → mouse-pointer-click-PdEQPL6v.js} +1 -1
  97. package/build/assets/navigation-context-DPs2G0X8.js +1 -0
  98. package/build/assets/navigation-link-D8hfwvxI.js +1 -0
  99. package/build/assets/onboarding-gGIqoxvA.js +1 -0
  100. package/build/assets/onboarding-modal-CGHPoMp7.js +1 -0
  101. package/build/assets/openhands-logo-bcNw5bkY.js +1 -0
  102. package/build/assets/option-service.api-Dz7Eomnx.js +1 -0
  103. package/build/assets/organization-service.api-CnynNoT-.js +1 -0
  104. package/build/assets/path-utils-CBaRYg35.js +1 -0
  105. package/build/assets/{pencil-CsL0ns9y.js → pencil-Dj2XjKmI.js} +1 -1
  106. package/build/assets/plan-components-j9X4AxYM.js +1 -0
  107. package/build/assets/planner-tab-G4j36bJk.js +1 -0
  108. package/build/assets/plugins-management-service-BAp70KN7.js +1 -0
  109. package/build/assets/profiles-service.api-CeYEmSM3.js +1 -0
  110. package/build/assets/providers-CPoq0VXm.js +1 -0
  111. package/build/assets/{proxy-TeteRRW5.js → proxy-CHmFkV16.js} +1 -1
  112. package/build/assets/react-DPDgL6du.js +1 -0
  113. package/build/assets/recommended-automations-launcher-CXaEK1rW.js +50 -0
  114. package/build/assets/{refresh-cw-GkGYXsU-.js → refresh-cw-DM82EIyx.js} +1 -1
  115. package/build/assets/root-CxWZUXTQ.css +1 -0
  116. package/build/assets/root-S6CfVoNm.js +2 -0
  117. package/build/assets/root-layout-CvxdHJ6j.js +2 -0
  118. package/build/assets/runtime-waiting-state-DkzLgvMn.js +1 -0
  119. package/build/assets/schema-field-DwUzlw6b.js +1 -0
  120. package/build/assets/sdk-section-page-BUXONTx6.js +1 -0
  121. package/build/assets/sdk-settings-schema-BjBkMHzZ.js +1 -0
  122. package/build/assets/search-4DHskuhE.js +1 -0
  123. package/build/assets/search-BsjCEFNf.js +1 -0
  124. package/build/assets/secrets-service-CZYjNxFw.js +1 -0
  125. package/build/assets/secrets-settings-ZxyfRBgx.js +1 -0
  126. package/build/assets/segmented-toggle-Cen5AMUc.js +1 -0
  127. package/build/assets/settings-Bx6vn-g8.js +1 -0
  128. package/build/assets/settings-dropdown-input-xzoZwgUe.js +1 -0
  129. package/build/assets/settings-gear-MXCyZW0x.js +1 -0
  130. package/build/assets/settings-index-D4SM26d5.js +1 -0
  131. package/build/assets/settings-input-DYs7t3oK.js +1 -0
  132. package/build/assets/settings-list-classes-DvQr5jVS.js +1 -0
  133. package/build/assets/{settings-CN_HaPjH.js → settings-mQUckT0g.js} +1 -1
  134. package/build/assets/settings-modal-BoC8oMlg.js +1 -0
  135. package/build/assets/settings-section-header-context-COMOIaxV.js +1 -0
  136. package/build/assets/settings-service.api-DldkFI1x.js +1 -0
  137. package/build/assets/settings-switch-C2N2xqEb.js +1 -0
  138. package/build/assets/{settings-utils-9-_6iVIn.js → settings-utils-BMdG65By.js} +1 -1
  139. package/build/assets/shared-conversation-DMiaQFsj.js +1 -0
  140. package/build/assets/sidebar-layout-BtpUSN3j.js +1 -0
  141. package/build/assets/sidebar-mobile-menu-toggle-CaV3tQFF.js +1 -0
  142. package/build/assets/sidebar-nav-link-CIB3NBRW.js +1 -0
  143. package/build/assets/sidebar-store-CZuE8AH5.js +1 -0
  144. package/build/assets/skill-card-pill-row-D2bUe2kB.js +1 -0
  145. package/build/assets/skills-9cDZONKh.js +1 -0
  146. package/build/assets/skills-plugins-D2WkrXkr.js +1 -0
  147. package/build/assets/skills-settings-CZGVOp_t.js +2 -0
  148. package/build/assets/{square-chevron-right-Cfi-SUY0.js → square-chevron-right-Czw3FFWc.js} +1 -1
  149. package/build/assets/styled-tooltip-DsKsFjuq.js +1 -0
  150. package/build/assets/suspense-X5dBsJzn.js +1 -0
  151. package/build/assets/switch-skeleton-DqQwalyu.js +1 -0
  152. package/build/assets/task-list-tab-BAThr9Ex.js +1 -0
  153. package/build/assets/{terminal-HakoMrQX.js → terminal-B0aL_iDZ.js} +2 -2
  154. package/build/assets/terminal-BuLtIrb9.js +1 -0
  155. package/build/assets/toggle-switch-DBlOOzBr.js +1 -0
  156. package/build/assets/{trash-2-Bq4hqiRH.js → trash-2-Be_7y3Mn.js} +1 -1
  157. package/build/assets/typography-YGPBGzOG.js +1 -0
  158. package/build/assets/u-check-circle-BqoIxNz_.js +1 -0
  159. package/build/assets/u-check-circle-half-LiwZkuFe.js +1 -0
  160. package/build/assets/u-edit-DJ90xc8Z.js +1 -0
  161. package/build/assets/use-acp-credential-form-rzaqkJ1n.js +1 -0
  162. package/build/assets/use-activate-agent-profile-DY0txItX.js +1 -0
  163. package/build/assets/use-active-agent-profile-Cp5AFONR.js +1 -0
  164. package/build/assets/use-active-conversation-DvcFBqFe.js +1 -0
  165. package/build/assets/use-agent-profiles-DnH16_Vm.js +1 -0
  166. package/build/assets/use-agent-state-BvRcEzY4.js +1 -0
  167. package/build/assets/use-backends-health-e-Ull4wz.js +1 -0
  168. package/build/assets/use-breakpoint-B-O0lQ84.js +1 -0
  169. package/build/assets/use-can-manage-org-profiles-OIhplvQ0.js +1 -0
  170. package/build/assets/use-click-outside-element-Bf4Omzot.js +1 -0
  171. package/build/assets/use-cloud-current-user-id-ekU7UXDT.js +1 -0
  172. package/build/assets/use-config-Dwf5gla-.js +1 -0
  173. package/build/assets/use-create-conversation-CvAXfA3T.js +1 -0
  174. package/build/assets/use-create-secret-BKeXCo__.js +1 -0
  175. package/build/assets/use-event-store-YSOxy9FC.js +4 -0
  176. package/build/assets/use-handle-plan-click-cAXS-Hft.js +1 -0
  177. package/build/assets/use-is-authed-_dhQ2Xuj.js +1 -0
  178. package/build/assets/use-launch-skill-in-chat-BnoDgvAy.js +1 -0
  179. package/build/assets/use-llm-profiles-BcLibtGb.js +1 -0
  180. package/build/assets/use-onboarding-completion-C_Swglzp.js +1 -0
  181. package/build/assets/use-plugins-marketplace-BGb-KgfD.js +1 -0
  182. package/build/assets/use-runtime-is-ready-CBFe69Ew.js +1 -0
  183. package/build/assets/use-save-agent-profile-DFjxHhNx.js +1 -0
  184. package/build/assets/{use-save-settings-DErJDIDL.js → use-save-settings-5xPYpSQM.js} +1 -1
  185. package/build/assets/use-settings-B07msZ2Z.js +1 -0
  186. package/build/assets/use-settings-nav-items-CswsOEyw.js +16 -0
  187. package/build/assets/use-skills-Aoaoq_ei.js +1 -0
  188. package/build/assets/use-task-list-CmWGElgb.js +1 -0
  189. package/build/assets/use-tracking-CqODdfO4.js +1 -0
  190. package/build/assets/use-user-conversation-BPHQ-dm-.js +1 -0
  191. package/build/assets/useMutation-DCE9RcgK.js +1 -0
  192. package/build/assets/useMutationState-BUab8Kxr.js +1 -0
  193. package/build/assets/useQueries-CRzaAqzH.js +1 -0
  194. package/build/assets/useQuery-CpjHYtZc.js +1 -0
  195. package/build/assets/useTranslation-Cgy4JA_g.js +1 -0
  196. package/build/assets/utils-CE0lDWtb.js +1 -0
  197. package/build/assets/vendor-styling-CI0PQ3ab.js +22 -0
  198. package/build/assets/{vendor~browser-BQU4C3CQ.js → vendor~browser-Cvg7jXCP.js} +1 -1
  199. package/build/assets/{vendor~browser-tab-Cim6xN2k.js → vendor~browser-tab-Di0kh5Zw.js} +1 -1
  200. package/build/assets/vendor~conversation-panel~conversation~alert-banner-DHDkknt5.js +1 -0
  201. package/build/assets/vendor~entry.client-9tWQ_Ugw.js +1 -0
  202. package/build/assets/{vendor~entry.client-lAMyAlBD.js → vendor~entry.client-D6BtSOtn.js} +1 -1
  203. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~d1e18dtv-5Q6lQJdE.js +177 -0
  204. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~i3v2mlbw-BrJQ3XZH.js +1 -0
  205. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~ncdxw0bh-ClHnt5lR.js +10 -0
  206. package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~t35o0b0f-Bss49YXv.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~k6tszsdc-Bb-xMtbv.js} +1 -1
  207. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~nn5zty47-Zl0G1QCy.js +1 -0
  208. package/build/assets/{vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~fpbtwbmk-DDSPtjxR.js → vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~byh8a1g4-XNPdpuO8.js} +1 -1
  209. package/build/assets/{vendor~files-tab-BvQLon-P.js → vendor~files-tab-B02k3xvx.js} +1 -1
  210. package/build/assets/{vendor~home~conversation-panel~conversation-DBPRU26Z.js → vendor~home~conversation-panel~conversation-CYMF9JYB.js} +1 -1
  211. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DnEBAp2W.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-9UMeuPV6.js} +1 -1
  212. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CzI-A-Gz.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BD0GaRGa.js} +1 -1
  213. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-ByET2Quf.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CqXiHwjU.js} +1 -1
  214. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DCYBrned.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-D7EUmQ8Y.js} +1 -1
  215. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DnctfFZL.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DTzw2x50.js} +1 -1
  216. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-pSG7lnvH.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-d8aETPbZ.js} +1 -1
  217. package/build/assets/{vendor~launch-DqoOsAhA.js → vendor~launch-CHXA9cJu.js} +1 -1
  218. package/build/assets/vendor~root-layout~conversation-panel~conversation-CpiTHpHl.js +1 -0
  219. package/build/assets/{vendor~root-layout~conversation-panel~conversation~shared-conversation-BJl81v7J.js → vendor~root-layout~conversation-panel~conversation~shared-conversation-_TdZcNMD.js} +1 -1
  220. package/build/assets/vendor~root-layout~home~conversation-panel~conversation-Cn2jwSga.js +1 -0
  221. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~launch~settings~settings-index~agen~enjl5xdm-mMKDm94D.js +48 -0
  222. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~automations-~ki5qnp0d-DRld6s9c.js → vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~automations-~ki5qnp0d-DJHl5b-B.js} +236 -17
  223. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-9d2kA26V.js → vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-CZM4hwUT.js} +1 -1
  224. package/build/assets/vendor~root-layout~home~mcp~automations-list~onboarding-modal-L2sdihTY.js +1 -0
  225. package/build/assets/verification-settings-DZQ-JvKH.js +1 -0
  226. package/build/assets/x-Cb0WAtak.js +1 -0
  227. package/build/assets/x-mark-Batp6gXa.js +1 -0
  228. package/build/index.html +4 -4
  229. package/build/locales/ar/openhands.json +138 -1
  230. package/build/locales/ca/openhands.json +138 -1
  231. package/build/locales/de/openhands.json +138 -1
  232. package/build/locales/en/openhands.json +138 -1
  233. package/build/locales/es/openhands.json +138 -1
  234. package/build/locales/fr/openhands.json +138 -1
  235. package/build/locales/it/openhands.json +138 -1
  236. package/build/locales/ja/openhands.json +138 -1
  237. package/build/locales/ko-KR/openhands.json +138 -1
  238. package/build/locales/no/openhands.json +138 -1
  239. package/build/locales/pt/openhands.json +138 -1
  240. package/build/locales/tr/openhands.json +138 -1
  241. package/build/locales/uk/openhands.json +138 -1
  242. package/build/locales/zh-CN/openhands.json +138 -1
  243. package/build/locales/zh-TW/openhands.json +138 -1
  244. package/config/defaults.json +7 -9
  245. package/dist/_virtual/__vite-browser-external.cjs +2 -0
  246. package/dist/_virtual/__vite-browser-external.cjs.map +1 -0
  247. package/dist/_virtual/__vite-browser-external.js +9 -0
  248. package/dist/_virtual/__vite-browser-external.js.map +1 -0
  249. package/dist/api/agent-profiles-service/agent-profiles-service.api.cjs +2 -0
  250. package/dist/api/agent-profiles-service/agent-profiles-service.api.cjs.map +1 -0
  251. package/dist/api/agent-profiles-service/agent-profiles-service.api.d.ts +22 -0
  252. package/dist/api/agent-profiles-service/agent-profiles-service.api.js +35 -0
  253. package/dist/api/agent-profiles-service/agent-profiles-service.api.js.map +1 -0
  254. package/dist/api/agent-server-adapter.cjs +2 -2
  255. package/dist/api/agent-server-adapter.cjs.map +1 -1
  256. package/dist/api/agent-server-adapter.d.ts +11 -1
  257. package/dist/api/agent-server-adapter.js +60 -60
  258. package/dist/api/agent-server-adapter.js.map +1 -1
  259. package/dist/api/agent-server-compatibility.cjs +1 -1
  260. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  261. package/dist/api/agent-server-compatibility.js +1 -0
  262. package/dist/api/agent-server-compatibility.js.map +1 -1
  263. package/dist/api/agent-server-home.cjs +1 -1
  264. package/dist/api/agent-server-home.cjs.map +1 -1
  265. package/dist/api/agent-server-home.js +1 -0
  266. package/dist/api/agent-server-home.js.map +1 -1
  267. package/dist/api/cloud/agent-profiles-service.api.cjs +2 -0
  268. package/dist/api/cloud/agent-profiles-service.api.cjs.map +1 -0
  269. package/dist/api/cloud/agent-profiles-service.api.d.ts +7 -0
  270. package/dist/api/cloud/agent-profiles-service.api.js +58 -0
  271. package/dist/api/cloud/agent-profiles-service.api.js.map +1 -0
  272. package/dist/api/cloud/organization-service.api.cjs +1 -1
  273. package/dist/api/cloud/organization-service.api.cjs.map +1 -1
  274. package/dist/api/cloud/organization-service.api.d.ts +8 -0
  275. package/dist/api/cloud/organization-service.api.js +3 -1
  276. package/dist/api/cloud/organization-service.api.js.map +1 -1
  277. package/dist/api/cloud/profiles-service.api.cjs +2 -0
  278. package/dist/api/cloud/profiles-service.api.cjs.map +1 -0
  279. package/dist/api/cloud/profiles-service.api.d.ts +7 -0
  280. package/dist/api/cloud/profiles-service.api.js +75 -0
  281. package/dist/api/cloud/profiles-service.api.js.map +1 -0
  282. package/dist/api/cloud/settings-service.api.cjs +1 -1
  283. package/dist/api/cloud/settings-service.api.cjs.map +1 -1
  284. package/dist/api/cloud/settings-service.api.js +1 -1
  285. package/dist/api/cloud/settings-service.api.js.map +1 -1
  286. package/dist/api/config-service/config-service.api.cjs +1 -1
  287. package/dist/api/config-service/config-service.api.cjs.map +1 -1
  288. package/dist/api/config-service/config-service.api.js +1 -0
  289. package/dist/api/config-service/config-service.api.js.map +1 -1
  290. package/dist/api/conversation-metadata-store.cjs.map +1 -1
  291. package/dist/api/conversation-metadata-store.d.ts +11 -0
  292. package/dist/api/conversation-metadata-store.js.map +1 -1
  293. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  294. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  295. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +20 -1
  296. package/dist/api/conversation-service/agent-server-conversation-service.api.js +134 -105
  297. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  298. package/dist/api/conversation-service/agent-server-conversation-service.types.d.ts +2 -0
  299. package/dist/api/conversation-service/conversation-service.api.cjs +1 -1
  300. package/dist/api/conversation-service/conversation-service.api.cjs.map +1 -1
  301. package/dist/api/conversation-service/conversation-service.api.d.ts +1 -0
  302. package/dist/api/conversation-service/conversation-service.api.js +4 -0
  303. package/dist/api/conversation-service/conversation-service.api.js.map +1 -1
  304. package/dist/api/device-flow-client.cjs +1 -1
  305. package/dist/api/device-flow-client.cjs.map +1 -1
  306. package/dist/api/device-flow-client.js +33 -25
  307. package/dist/api/device-flow-client.js.map +1 -1
  308. package/dist/api/event-service/event-service.api.cjs +1 -1
  309. package/dist/api/event-service/event-service.api.cjs.map +1 -1
  310. package/dist/api/event-service/event-service.api.js +1 -0
  311. package/dist/api/event-service/event-service.api.js.map +1 -1
  312. package/dist/api/mcp-service/mcp-redacted-credentials.cjs +1 -1
  313. package/dist/api/mcp-service/mcp-redacted-credentials.cjs.map +1 -1
  314. package/dist/api/mcp-service/mcp-redacted-credentials.d.ts +3 -3
  315. package/dist/api/mcp-service/mcp-redacted-credentials.js +29 -30
  316. package/dist/api/mcp-service/mcp-redacted-credentials.js.map +1 -1
  317. package/dist/api/mcp-service/mcp-service.api.cjs +1 -1
  318. package/dist/api/mcp-service/mcp-service.api.cjs.map +1 -1
  319. package/dist/api/mcp-service/mcp-service.api.d.ts +8 -1
  320. package/dist/api/mcp-service/mcp-service.api.js +129 -23
  321. package/dist/api/mcp-service/mcp-service.api.js.map +1 -1
  322. package/dist/api/option-service/option-service.api.cjs +1 -1
  323. package/dist/api/option-service/option-service.api.cjs.map +1 -1
  324. package/dist/api/option-service/option-service.api.js +1 -0
  325. package/dist/api/option-service/option-service.api.js.map +1 -1
  326. package/dist/api/plugins-management-service.cjs +2 -0
  327. package/dist/api/plugins-management-service.cjs.map +1 -0
  328. package/dist/api/plugins-management-service.d.ts +50 -0
  329. package/dist/api/plugins-management-service.js +41 -0
  330. package/dist/api/plugins-management-service.js.map +1 -0
  331. package/dist/api/plugins-service.d.ts +49 -0
  332. package/dist/api/profiles-service/profiles-service.api.cjs +1 -1
  333. package/dist/api/profiles-service/profiles-service.api.cjs.map +1 -1
  334. package/dist/api/profiles-service/profiles-service.api.js +21 -14
  335. package/dist/api/profiles-service/profiles-service.api.js.map +1 -1
  336. package/dist/api/runtime-service/agent-server-runtime-service.cjs +1 -1
  337. package/dist/api/runtime-service/agent-server-runtime-service.cjs.map +1 -1
  338. package/dist/api/runtime-service/agent-server-runtime-service.js +1 -0
  339. package/dist/api/runtime-service/agent-server-runtime-service.js.map +1 -1
  340. package/dist/api/secrets-service.cjs +1 -1
  341. package/dist/api/secrets-service.cjs.map +1 -1
  342. package/dist/api/secrets-service.js +1 -0
  343. package/dist/api/secrets-service.js.map +1 -1
  344. package/dist/api/settings-service/settings-service.api.cjs +1 -1
  345. package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
  346. package/dist/api/settings-service/settings-service.api.js +92 -50
  347. package/dist/api/settings-service/settings-service.api.js.map +1 -1
  348. package/dist/api/skills-service.cjs +1 -1
  349. package/dist/api/skills-service.cjs.map +1 -1
  350. package/dist/api/skills-service.js +1 -0
  351. package/dist/api/skills-service.js.map +1 -1
  352. package/dist/api/workspaces-service/workspaces-service.api.cjs +1 -1
  353. package/dist/api/workspaces-service/workspaces-service.api.cjs.map +1 -1
  354. package/dist/api/workspaces-service/workspaces-service.api.js +1 -0
  355. package/dist/api/workspaces-service/workspaces-service.api.js.map +1 -1
  356. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  357. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  358. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +57 -38
  359. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  360. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs +2 -1
  361. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs.map +1 -1
  362. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js +13 -9
  363. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js.map +1 -1
  364. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs +1 -1
  365. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs.map +1 -1
  366. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js +65 -26
  367. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js.map +1 -1
  368. package/dist/components/conversation-events/chat/event-message.cjs +2 -2
  369. package/dist/components/conversation-events/chat/event-message.cjs.map +1 -1
  370. package/dist/components/conversation-events/chat/event-message.js +78 -76
  371. package/dist/components/conversation-events/chat/event-message.js.map +1 -1
  372. package/dist/components/features/analytics/telemetry-consent-banner.cjs +1 -1
  373. package/dist/components/features/analytics/telemetry-consent-banner.cjs.map +1 -1
  374. package/dist/components/features/analytics/telemetry-consent-banner.js +1 -0
  375. package/dist/components/features/analytics/telemetry-consent-banner.js.map +1 -1
  376. package/dist/components/features/automations/detail/activity-log-item.d.ts +3 -2
  377. package/dist/components/features/automations/detail/activity-log-section.d.ts +3 -2
  378. package/dist/components/features/automations/detail/debug-automation-button.d.ts +17 -0
  379. package/dist/components/features/automations/detail/run-logs-modal.d.ts +6 -1
  380. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  381. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  382. package/dist/components/features/backends/backend-form-modal.d.ts +6 -2
  383. package/dist/components/features/backends/backend-form-modal.js +198 -161
  384. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  385. package/dist/components/features/backends/backend-row.cjs +1 -1
  386. package/dist/components/features/backends/backend-row.cjs.map +1 -1
  387. package/dist/components/features/backends/backend-row.d.ts +2 -1
  388. package/dist/components/features/backends/backend-row.js +60 -54
  389. package/dist/components/features/backends/backend-row.js.map +1 -1
  390. package/dist/components/features/backends/backend-selector.cjs +1 -1
  391. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  392. package/dist/components/features/backends/backend-selector.js +4 -4
  393. package/dist/components/features/backends/backend-version.cjs +1 -1
  394. package/dist/components/features/backends/backend-version.cjs.map +1 -1
  395. package/dist/components/features/backends/backend-version.js +1 -0
  396. package/dist/components/features/backends/backend-version.js.map +1 -1
  397. package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
  398. package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
  399. package/dist/components/features/backends/manage-backends-modal.js +72 -61
  400. package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
  401. package/dist/components/features/chat/change-agent-button.cjs +1 -1
  402. package/dist/components/features/chat/change-agent-button.js +9 -9
  403. package/dist/components/features/chat/chat-add-file-button.cjs +1 -1
  404. package/dist/components/features/chat/chat-add-file-button.cjs.map +1 -1
  405. package/dist/components/features/chat/chat-add-file-button.js +38 -34
  406. package/dist/components/features/chat/chat-add-file-button.js.map +1 -1
  407. package/dist/components/features/chat/chat-interface.cjs +2 -2
  408. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  409. package/dist/components/features/chat/chat-interface.js +136 -129
  410. package/dist/components/features/chat/chat-interface.js.map +1 -1
  411. package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
  412. package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
  413. package/dist/components/features/chat/components/chat-input-actions.js +100 -87
  414. package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
  415. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs +2 -0
  416. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs.map +1 -0
  417. package/dist/components/features/chat/components/chat-input-llm-profile-picker.d.ts +15 -0
  418. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js +118 -0
  419. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js.map +1 -0
  420. package/dist/components/features/chat/components/chat-input-model.cjs +1 -1
  421. package/dist/components/features/chat/components/chat-input-model.js +17 -17
  422. package/dist/components/features/chat/components/chat-input-profile-picker.cjs +2 -0
  423. package/dist/components/features/chat/components/chat-input-profile-picker.cjs.map +1 -0
  424. package/dist/components/features/chat/components/chat-input-profile-picker.d.ts +9 -0
  425. package/dist/components/features/chat/components/chat-input-profile-picker.js +112 -0
  426. package/dist/components/features/chat/components/chat-input-profile-picker.js.map +1 -0
  427. package/dist/components/features/chat/components/resolve-picker-kind.cjs +2 -0
  428. package/dist/components/features/chat/components/resolve-picker-kind.cjs.map +1 -0
  429. package/dist/components/features/chat/components/resolve-picker-kind.d.ts +29 -0
  430. package/dist/components/features/chat/components/resolve-picker-kind.js +8 -0
  431. package/dist/components/features/chat/components/resolve-picker-kind.js.map +1 -0
  432. package/dist/components/features/chat/goal-status-banner.cjs +2 -0
  433. package/dist/components/features/chat/goal-status-banner.cjs.map +1 -0
  434. package/dist/components/features/chat/goal-status-banner.d.ts +11 -0
  435. package/dist/components/features/chat/goal-status-banner.js +12 -0
  436. package/dist/components/features/chat/goal-status-banner.js.map +1 -0
  437. package/dist/components/features/chat/goal-status-content.cjs +2 -0
  438. package/dist/components/features/chat/goal-status-content.cjs.map +1 -0
  439. package/dist/components/features/chat/goal-status-content.d.ts +21 -0
  440. package/dist/components/features/chat/goal-status-content.js +98 -0
  441. package/dist/components/features/chat/goal-status-content.js.map +1 -0
  442. package/dist/components/features/chat/interactive-chat-box.cjs +1 -1
  443. package/dist/components/features/chat/interactive-chat-box.cjs.map +1 -1
  444. package/dist/components/features/chat/interactive-chat-box.js +20 -19
  445. package/dist/components/features/chat/interactive-chat-box.js.map +1 -1
  446. package/dist/components/features/chat/tool-visualizers/primitives/code-block.cjs +1 -1
  447. package/dist/components/features/chat/tool-visualizers/primitives/code-block.cjs.map +1 -1
  448. package/dist/components/features/chat/tool-visualizers/primitives/code-block.d.ts +10 -3
  449. package/dist/components/features/chat/tool-visualizers/primitives/code-block.js +29 -16
  450. package/dist/components/features/chat/tool-visualizers/primitives/code-block.js.map +1 -1
  451. package/dist/components/features/chat/tool-visualizers/primitives/output-pane.cjs +1 -1
  452. package/dist/components/features/chat/tool-visualizers/primitives/output-pane.cjs.map +1 -1
  453. package/dist/components/features/chat/tool-visualizers/primitives/output-pane.d.ts +2 -2
  454. package/dist/components/features/chat/tool-visualizers/primitives/output-pane.js +16 -16
  455. package/dist/components/features/chat/tool-visualizers/primitives/output-pane.js.map +1 -1
  456. package/dist/components/features/chat/user-message-body.cjs +1 -1
  457. package/dist/components/features/chat/user-message-body.cjs.map +1 -1
  458. package/dist/components/features/chat/user-message-body.js +20 -20
  459. package/dist/components/features/chat/user-message-body.js.map +1 -1
  460. package/dist/components/features/command-menu/command-menu-items.d.ts +32 -0
  461. package/dist/components/features/command-menu/command-menu-trigger.cjs +2 -0
  462. package/dist/components/features/command-menu/command-menu-trigger.cjs.map +1 -0
  463. package/dist/components/features/command-menu/command-menu-trigger.d.ts +5 -0
  464. package/dist/components/features/command-menu/command-menu-trigger.js +53 -0
  465. package/dist/components/features/command-menu/command-menu-trigger.js.map +1 -0
  466. package/dist/components/features/command-menu/command-menu.d.ts +2 -0
  467. package/dist/components/features/command-menu/index.d.ts +2 -0
  468. package/dist/components/features/controls/tools-context-menu.cjs +1 -1
  469. package/dist/components/features/controls/tools-context-menu.cjs.map +1 -1
  470. package/dist/components/features/controls/tools-context-menu.d.ts +3 -1
  471. package/dist/components/features/controls/tools-context-menu.js +94 -77
  472. package/dist/components/features/controls/tools-context-menu.js.map +1 -1
  473. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.cjs +1 -1
  474. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.cjs.map +1 -1
  475. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.js +8 -5
  476. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.js.map +1 -1
  477. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  478. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +1 -1
  479. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  480. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  481. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  482. package/dist/components/features/conversation-panel/conversation-panel.js +2 -1
  483. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  484. package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs +1 -1
  485. package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs.map +1 -1
  486. package/dist/components/features/conversation-panel/local-new-conversation-menu.js +4 -1
  487. package/dist/components/features/conversation-panel/local-new-conversation-menu.js.map +1 -1
  488. package/dist/components/features/conversation-panel/plugins-modal.cjs +2 -0
  489. package/dist/components/features/conversation-panel/plugins-modal.cjs.map +1 -0
  490. package/dist/components/features/conversation-panel/plugins-modal.d.ts +12 -0
  491. package/dist/components/features/conversation-panel/plugins-modal.js +62 -0
  492. package/dist/components/features/conversation-panel/plugins-modal.js.map +1 -0
  493. package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.cjs +1 -1
  494. package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.cjs.map +1 -1
  495. package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.js +4 -4
  496. package/dist/components/features/mcp-logo-badge.cjs +1 -1
  497. package/dist/components/features/mcp-logo-badge.cjs.map +1 -1
  498. package/dist/components/features/mcp-logo-badge.js +17 -15
  499. package/dist/components/features/mcp-logo-badge.js.map +1 -1
  500. package/dist/components/features/mcp-page/custom-server-editor.cjs +1 -1
  501. package/dist/components/features/mcp-page/custom-server-editor.cjs.map +1 -1
  502. package/dist/components/features/mcp-page/custom-server-editor.js +102 -59
  503. package/dist/components/features/mcp-page/custom-server-editor.js.map +1 -1
  504. package/dist/components/features/mcp-page/install-server-modal.cjs +1 -1
  505. package/dist/components/features/mcp-page/install-server-modal.cjs.map +1 -1
  506. package/dist/components/features/mcp-page/install-server-modal.js +284 -169
  507. package/dist/components/features/mcp-page/install-server-modal.js.map +1 -1
  508. package/dist/components/features/mcp-page/installed-server-card.cjs +1 -1
  509. package/dist/components/features/mcp-page/installed-server-card.cjs.map +1 -1
  510. package/dist/components/features/mcp-page/installed-server-card.js +16 -18
  511. package/dist/components/features/mcp-page/installed-server-card.js.map +1 -1
  512. package/dist/components/features/onboarding/onboarding-host.d.ts +3 -13
  513. package/dist/components/features/plugins/add-plugin-modal.d.ts +6 -0
  514. package/dist/components/features/plugins/build-plugins-view-model.d.ts +39 -0
  515. package/dist/components/features/plugins/plugin-card.d.ts +13 -0
  516. package/dist/components/features/plugins/plugin-detail-modal.d.ts +13 -0
  517. package/dist/components/features/plugins/plugin-picker-card.d.ts +10 -0
  518. package/dist/components/features/plugins/plugin-picker-modal.d.ts +9 -0
  519. package/dist/components/features/plugins/plugin-picker-trigger.d.ts +9 -0
  520. package/dist/components/features/plugins/plugin-picker.d.ts +18 -0
  521. package/dist/components/features/plugins/plugin-spec-identity.d.ts +28 -0
  522. package/dist/components/features/plugins/plugins-toolbar.d.ts +9 -0
  523. package/dist/components/features/settings/agent-profiles/agent-profile-actions-menu.d.ts +16 -0
  524. package/dist/components/features/settings/agent-profiles/agent-profile-row.d.ts +13 -0
  525. package/dist/components/features/settings/agent-profiles/agent-profiles-body.d.ts +15 -0
  526. package/dist/components/features/settings/agent-profiles/agent-profiles-local-view.d.ts +7 -0
  527. package/dist/components/features/settings/agent-profiles/agent-profiles-manager.d.ts +7 -0
  528. package/dist/components/features/settings/agent-profiles/delete-agent-profile-modal.d.ts +7 -0
  529. package/dist/components/features/settings/agent-profiles/index.d.ts +6 -0
  530. package/dist/components/features/settings/agent-profiles/merge-agent-profile-save-input.d.ts +18 -0
  531. package/dist/components/features/settings/llm-profiles/llm-profiles-manager.cjs +1 -1
  532. package/dist/components/features/settings/llm-profiles/llm-profiles-manager.js +1 -0
  533. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  534. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +1 -1
  535. package/dist/components/features/settings/llm-profiles/profile-row.d.ts +3 -1
  536. package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +3 -1
  537. package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.cjs +1 -1
  538. package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.cjs.map +1 -1
  539. package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.js +3 -2
  540. package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.js.map +1 -1
  541. package/dist/components/features/settings/mcp-settings/mcp-server-form.cjs +7 -7
  542. package/dist/components/features/settings/mcp-settings/mcp-server-form.cjs.map +1 -1
  543. package/dist/components/features/settings/mcp-settings/mcp-server-form.js +279 -130
  544. package/dist/components/features/settings/mcp-settings/mcp-server-form.js.map +1 -1
  545. package/dist/components/features/settings/mcp-settings/mcp-server-list-item.d.ts +1 -12
  546. package/dist/components/features/settings/mcp-settings/mcp-server-list.d.ts +1 -11
  547. package/dist/components/features/settings/settings-dropdown-input.cjs +1 -1
  548. package/dist/components/features/settings/settings-dropdown-input.js +6 -6
  549. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  550. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  551. package/dist/components/features/sidebar/sidebar-rail-body.d.ts +1 -2
  552. package/dist/components/features/sidebar/sidebar-rail-body.js +81 -82
  553. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  554. package/dist/components/features/sidebar/sidebar.cjs +1 -1
  555. package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
  556. package/dist/components/features/sidebar/sidebar.js +45 -46
  557. package/dist/components/features/sidebar/sidebar.js.map +1 -1
  558. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  559. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  560. package/dist/components/features/skills/extensions-navigation.js +1 -2
  561. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  562. package/dist/components/shared/modals/modal-backdrop.cjs +1 -1
  563. package/dist/components/shared/modals/modal-backdrop.cjs.map +1 -1
  564. package/dist/components/shared/modals/modal-backdrop.d.ts +5 -1
  565. package/dist/components/shared/modals/modal-backdrop.js +3 -3
  566. package/dist/components/shared/modals/modal-backdrop.js.map +1 -1
  567. package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
  568. package/dist/components/shared/modals/settings/model-selector.js +16 -16
  569. package/dist/config/defaults.cjs +1 -1
  570. package/dist/config/defaults.cjs.map +1 -1
  571. package/dist/config/defaults.js +7 -3
  572. package/dist/config/defaults.js.map +1 -1
  573. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  574. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  575. package/dist/contexts/conversation-websocket-context.js +200 -197
  576. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  577. package/dist/hooks/chat/use-goal-interceptor.cjs +2 -0
  578. package/dist/hooks/chat/use-goal-interceptor.cjs.map +1 -0
  579. package/dist/hooks/chat/use-goal-interceptor.d.ts +8 -0
  580. package/dist/hooks/chat/use-goal-interceptor.js +37 -0
  581. package/dist/hooks/chat/use-goal-interceptor.js.map +1 -0
  582. package/dist/hooks/chat/use-grip-resize.cjs +1 -1
  583. package/dist/hooks/chat/use-grip-resize.cjs.map +1 -1
  584. package/dist/hooks/chat/use-grip-resize.js +17 -16
  585. package/dist/hooks/chat/use-grip-resize.js.map +1 -1
  586. package/dist/hooks/chat/use-model-interceptor.cjs +1 -1
  587. package/dist/hooks/chat/use-model-interceptor.cjs.map +1 -1
  588. package/dist/hooks/chat/use-model-interceptor.d.ts +3 -3
  589. package/dist/hooks/chat/use-model-interceptor.js +8 -9
  590. package/dist/hooks/chat/use-model-interceptor.js.map +1 -1
  591. package/dist/hooks/chat/use-slash-command.cjs +1 -1
  592. package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
  593. package/dist/hooks/chat/use-slash-command.js +4 -4
  594. package/dist/hooks/chat/use-slash-command.js.map +1 -1
  595. package/dist/hooks/mutation/conversation-mutation-utils.cjs +1 -1
  596. package/dist/hooks/mutation/conversation-mutation-utils.cjs.map +1 -1
  597. package/dist/hooks/mutation/conversation-mutation-utils.d.ts +17 -0
  598. package/dist/hooks/mutation/conversation-mutation-utils.js +23 -4
  599. package/dist/hooks/mutation/conversation-mutation-utils.js.map +1 -1
  600. package/dist/hooks/mutation/use-activate-agent-profile.cjs +2 -0
  601. package/dist/hooks/mutation/use-activate-agent-profile.cjs.map +1 -0
  602. package/dist/hooks/mutation/use-activate-agent-profile.d.ts +23 -0
  603. package/dist/hooks/mutation/use-activate-agent-profile.js +34 -0
  604. package/dist/hooks/mutation/use-activate-agent-profile.js.map +1 -0
  605. package/dist/hooks/mutation/use-activate-llm-profile.cjs +1 -1
  606. package/dist/hooks/mutation/use-activate-llm-profile.js +1 -1
  607. package/dist/hooks/mutation/use-add-mcp-server.cjs +1 -1
  608. package/dist/hooks/mutation/use-add-mcp-server.cjs.map +1 -1
  609. package/dist/hooks/mutation/use-add-mcp-server.d.ts +1 -12
  610. package/dist/hooks/mutation/use-add-mcp-server.js +10 -34
  611. package/dist/hooks/mutation/use-add-mcp-server.js.map +1 -1
  612. package/dist/hooks/mutation/use-apply-onboarding-agent-profile.d.ts +20 -0
  613. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  614. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  615. package/dist/hooks/mutation/use-create-conversation.d.ts +2 -0
  616. package/dist/hooks/mutation/use-create-conversation.js +94 -25
  617. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  618. package/dist/hooks/mutation/use-delete-agent-profile.d.ts +1 -0
  619. package/dist/hooks/mutation/use-delete-llm-profile.cjs +1 -1
  620. package/dist/hooks/mutation/use-delete-llm-profile.js +1 -1
  621. package/dist/hooks/mutation/use-delete-mcp-server.cjs +1 -1
  622. package/dist/hooks/mutation/use-delete-mcp-server.js +4 -4
  623. package/dist/hooks/mutation/use-fork-conversation.cjs +2 -0
  624. package/dist/hooks/mutation/use-fork-conversation.cjs.map +1 -0
  625. package/dist/hooks/mutation/use-fork-conversation.d.ts +24 -0
  626. package/dist/hooks/mutation/use-fork-conversation.js +29 -0
  627. package/dist/hooks/mutation/use-fork-conversation.js.map +1 -0
  628. package/dist/hooks/mutation/use-install-plugin.d.ts +7 -0
  629. package/dist/hooks/mutation/use-new-conversation-command.cjs +1 -1
  630. package/dist/hooks/mutation/use-new-conversation-command.cjs.map +1 -1
  631. package/dist/hooks/mutation/use-new-conversation-command.d.ts +1 -0
  632. package/dist/hooks/mutation/use-new-conversation-command.js +20 -10
  633. package/dist/hooks/mutation/use-new-conversation-command.js.map +1 -1
  634. package/dist/hooks/mutation/use-rename-agent-profile.d.ts +6 -0
  635. package/dist/hooks/mutation/use-rename-llm-profile.cjs +1 -1
  636. package/dist/hooks/mutation/use-rename-llm-profile.js +1 -1
  637. package/dist/hooks/mutation/use-save-agent-profile.d.ts +5 -0
  638. package/dist/hooks/mutation/use-save-llm-profile.cjs +1 -1
  639. package/dist/hooks/mutation/use-save-llm-profile.js +1 -1
  640. package/dist/hooks/mutation/use-switch-acp-model.cjs.map +1 -1
  641. package/dist/hooks/mutation/use-switch-acp-model.js.map +1 -1
  642. package/dist/hooks/mutation/use-switch-llm-profile-and-log.cjs +1 -1
  643. package/dist/hooks/mutation/use-switch-llm-profile-and-log.cjs.map +1 -1
  644. package/dist/hooks/mutation/use-switch-llm-profile-and-log.d.ts +3 -4
  645. package/dist/hooks/mutation/use-switch-llm-profile-and-log.js +10 -35
  646. package/dist/hooks/mutation/use-switch-llm-profile-and-log.js.map +1 -1
  647. package/dist/hooks/mutation/use-switch-llm-profile.cjs +1 -1
  648. package/dist/hooks/mutation/use-switch-llm-profile.cjs.map +1 -1
  649. package/dist/hooks/mutation/use-switch-llm-profile.d.ts +20 -5
  650. package/dist/hooks/mutation/use-switch-llm-profile.js +38 -14
  651. package/dist/hooks/mutation/use-switch-llm-profile.js.map +1 -1
  652. package/dist/hooks/mutation/use-update-mcp-server.cjs +1 -1
  653. package/dist/hooks/mutation/use-update-mcp-server.cjs.map +1 -1
  654. package/dist/hooks/mutation/use-update-mcp-server.js +11 -37
  655. package/dist/hooks/mutation/use-update-mcp-server.js.map +1 -1
  656. package/dist/hooks/query/query-keys.cjs +1 -1
  657. package/dist/hooks/query/query-keys.cjs.map +1 -1
  658. package/dist/hooks/query/query-keys.d.ts +21 -0
  659. package/dist/hooks/query/query-keys.js +7 -3
  660. package/dist/hooks/query/query-keys.js.map +1 -1
  661. package/dist/hooks/query/use-active-conversation.cjs +1 -1
  662. package/dist/hooks/query/use-active-conversation.cjs.map +1 -1
  663. package/dist/hooks/query/use-active-conversation.js +17 -16
  664. package/dist/hooks/query/use-active-conversation.js.map +1 -1
  665. package/dist/hooks/query/use-agent-profiles.cjs +2 -0
  666. package/dist/hooks/query/use-agent-profiles.cjs.map +1 -0
  667. package/dist/hooks/query/use-agent-profiles.d.ts +13 -0
  668. package/dist/hooks/query/use-agent-profiles.js +24 -0
  669. package/dist/hooks/query/use-agent-profiles.js.map +1 -0
  670. package/dist/hooks/query/use-backends-health.cjs +1 -1
  671. package/dist/hooks/query/use-backends-health.cjs.map +1 -1
  672. package/dist/hooks/query/use-backends-health.js +18 -3
  673. package/dist/hooks/query/use-backends-health.js.map +1 -1
  674. package/dist/hooks/query/use-conversation-history.cjs +1 -1
  675. package/dist/hooks/query/use-conversation-history.cjs.map +1 -1
  676. package/dist/hooks/query/use-conversation-history.js +4 -2
  677. package/dist/hooks/query/use-conversation-history.js.map +1 -1
  678. package/dist/hooks/query/use-local-workspaces.cjs +1 -1
  679. package/dist/hooks/query/use-local-workspaces.cjs.map +1 -1
  680. package/dist/hooks/query/use-local-workspaces.js +1 -0
  681. package/dist/hooks/query/use-local-workspaces.js.map +1 -1
  682. package/dist/hooks/query/use-plugins-marketplace.d.ts +7 -0
  683. package/dist/hooks/query/use-resolved-workspaces.cjs +1 -1
  684. package/dist/hooks/query/use-resolved-workspaces.cjs.map +1 -1
  685. package/dist/hooks/query/use-resolved-workspaces.js +7 -6
  686. package/dist/hooks/query/use-resolved-workspaces.js.map +1 -1
  687. package/dist/hooks/query/use-search-subdirs.cjs +1 -1
  688. package/dist/hooks/query/use-search-subdirs.cjs.map +1 -1
  689. package/dist/hooks/query/use-search-subdirs.js +1 -0
  690. package/dist/hooks/query/use-search-subdirs.js.map +1 -1
  691. package/dist/hooks/query/use-settings.cjs +1 -1
  692. package/dist/hooks/query/use-settings.cjs.map +1 -1
  693. package/dist/hooks/query/use-settings.js +11 -11
  694. package/dist/hooks/query/use-settings.js.map +1 -1
  695. package/dist/hooks/query/use-verified-models.cjs +1 -1
  696. package/dist/hooks/query/use-verified-models.cjs.map +1 -1
  697. package/dist/hooks/query/use-verified-models.js +1 -0
  698. package/dist/hooks/query/use-verified-models.js.map +1 -1
  699. package/dist/hooks/use-acp-model-context.cjs +1 -1
  700. package/dist/hooks/use-acp-model-context.cjs.map +1 -1
  701. package/dist/hooks/use-acp-model-context.d.ts +1 -1
  702. package/dist/hooks/use-acp-model-context.js +9 -8
  703. package/dist/hooks/use-acp-model-context.js.map +1 -1
  704. package/dist/hooks/use-active-agent-profile.cjs +2 -0
  705. package/dist/hooks/use-active-agent-profile.cjs.map +1 -0
  706. package/dist/hooks/use-active-agent-profile.d.ts +20 -0
  707. package/dist/hooks/use-active-agent-profile.js +17 -0
  708. package/dist/hooks/use-active-agent-profile.js.map +1 -0
  709. package/dist/hooks/use-auto-resize.cjs +1 -1
  710. package/dist/hooks/use-auto-resize.cjs.map +1 -1
  711. package/dist/hooks/use-auto-resize.d.ts +2 -0
  712. package/dist/hooks/use-auto-resize.js +49 -45
  713. package/dist/hooks/use-auto-resize.js.map +1 -1
  714. package/dist/hooks/use-can-manage-org-profiles.cjs +1 -0
  715. package/dist/hooks/use-can-manage-org-profiles.d.ts +18 -0
  716. package/dist/hooks/use-can-manage-org-profiles.js +2 -0
  717. package/dist/hooks/use-chat-input-llm-profile-state.cjs +2 -0
  718. package/dist/hooks/use-chat-input-llm-profile-state.cjs.map +1 -0
  719. package/dist/hooks/use-chat-input-llm-profile-state.d.ts +23 -0
  720. package/dist/hooks/use-chat-input-llm-profile-state.js +30 -0
  721. package/dist/hooks/use-chat-input-llm-profile-state.js.map +1 -0
  722. package/dist/hooks/use-chat-input-model-state.cjs.map +1 -1
  723. package/dist/hooks/use-chat-input-model-state.d.ts +1 -1
  724. package/dist/hooks/use-chat-input-model-state.js.map +1 -1
  725. package/dist/hooks/use-chat-input-profile-state.cjs +2 -0
  726. package/dist/hooks/use-chat-input-profile-state.cjs.map +1 -0
  727. package/dist/hooks/use-chat-input-profile-state.d.ts +20 -0
  728. package/dist/hooks/use-chat-input-profile-state.js +22 -0
  729. package/dist/hooks/use-chat-input-profile-state.js.map +1 -0
  730. package/dist/hooks/use-conversation-name-context-menu.cjs +1 -1
  731. package/dist/hooks/use-conversation-name-context-menu.cjs.map +1 -1
  732. package/dist/hooks/use-conversation-name-context-menu.d.ts +4 -0
  733. package/dist/hooks/use-conversation-name-context-menu.js +44 -37
  734. package/dist/hooks/use-conversation-name-context-menu.js.map +1 -1
  735. package/dist/hooks/use-conversation-plugins.cjs +2 -0
  736. package/dist/hooks/use-conversation-plugins.cjs.map +1 -0
  737. package/dist/hooks/use-conversation-plugins.d.ts +9 -0
  738. package/dist/hooks/use-conversation-plugins.js +12 -0
  739. package/dist/hooks/use-conversation-plugins.js.map +1 -0
  740. package/dist/hooks/use-handle-plan-click.cjs +1 -1
  741. package/dist/hooks/use-handle-plan-click.cjs.map +1 -1
  742. package/dist/hooks/use-handle-plan-click.js +2 -1
  743. package/dist/hooks/use-handle-plan-click.js.map +1 -1
  744. package/dist/hooks/use-llm-configured.cjs +1 -1
  745. package/dist/hooks/use-llm-configured.cjs.map +1 -1
  746. package/dist/hooks/use-llm-configured.js +17 -16
  747. package/dist/hooks/use-llm-configured.js.map +1 -1
  748. package/dist/hooks/use-tracking.cjs +1 -1
  749. package/dist/hooks/use-tracking.cjs.map +1 -1
  750. package/dist/hooks/use-tracking.d.ts +51 -1
  751. package/dist/hooks/use-tracking.js +61 -2
  752. package/dist/hooks/use-tracking.js.map +1 -1
  753. package/dist/i18n/declaration.cjs +1 -1
  754. package/dist/i18n/declaration.cjs.map +1 -1
  755. package/dist/i18n/declaration.d.ts +138 -1
  756. package/dist/i18n/declaration.js +1 -1
  757. package/dist/i18n/declaration.js.map +1 -1
  758. package/dist/i18n/translation.cjs +18 -3
  759. package/dist/i18n/translation.cjs.map +1 -1
  760. package/dist/i18n/translation.js +2329 -0
  761. package/dist/i18n/translation.js.map +1 -1
  762. package/dist/icons/slack.cjs +2 -0
  763. package/dist/icons/slack.cjs.map +1 -0
  764. package/dist/icons/slack.js +19 -0
  765. package/dist/icons/slack.js.map +1 -0
  766. package/dist/icons/u-puzzle-piece.cjs +2 -0
  767. package/dist/icons/u-puzzle-piece.cjs.map +1 -0
  768. package/dist/icons/u-puzzle-piece.js +19 -0
  769. package/dist/icons/u-puzzle-piece.js.map +1 -0
  770. package/dist/icons/x-circle-solid.cjs +2 -0
  771. package/dist/icons/x-circle-solid.cjs.map +1 -0
  772. package/dist/icons/x-circle-solid.js +13 -0
  773. package/dist/icons/x-circle-solid.js.map +1 -0
  774. package/dist/locales/ar/openhands.json +138 -1
  775. package/dist/locales/ca/openhands.json +138 -1
  776. package/dist/locales/de/openhands.json +138 -1
  777. package/dist/locales/en/openhands.json +138 -1
  778. package/dist/locales/es/openhands.json +138 -1
  779. package/dist/locales/fr/openhands.json +138 -1
  780. package/dist/locales/it/openhands.json +138 -1
  781. package/dist/locales/ja/openhands.json +138 -1
  782. package/dist/locales/ko-KR/openhands.json +138 -1
  783. package/dist/locales/no/openhands.json +138 -1
  784. package/dist/locales/pt/openhands.json +138 -1
  785. package/dist/locales/tr/openhands.json +138 -1
  786. package/dist/locales/uk/openhands.json +138 -1
  787. package/dist/locales/zh-CN/openhands.json +138 -1
  788. package/dist/locales/zh-TW/openhands.json +138 -1
  789. package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.cjs +1 -1
  790. package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.cjs.map +1 -1
  791. package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.js +0 -20
  792. package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.js.map +1 -1
  793. package/dist/node_modules/@openhands/extensions/integrations/catalog/asana.cjs +1 -1
  794. package/dist/node_modules/@openhands/extensions/integrations/catalog/asana.cjs.map +1 -1
  795. package/dist/node_modules/@openhands/extensions/integrations/catalog/asana.js +1 -6
  796. package/dist/node_modules/@openhands/extensions/integrations/catalog/asana.js.map +1 -1
  797. package/dist/node_modules/@openhands/extensions/integrations/catalog/bitbucket.cjs +1 -1
  798. package/dist/node_modules/@openhands/extensions/integrations/catalog/bitbucket.cjs.map +1 -1
  799. package/dist/node_modules/@openhands/extensions/integrations/catalog/bitbucket.js +1 -6
  800. package/dist/node_modules/@openhands/extensions/integrations/catalog/bitbucket.js.map +1 -1
  801. package/dist/node_modules/@openhands/extensions/integrations/catalog/box.cjs +1 -1
  802. package/dist/node_modules/@openhands/extensions/integrations/catalog/box.cjs.map +1 -1
  803. package/dist/node_modules/@openhands/extensions/integrations/catalog/box.js +1 -6
  804. package/dist/node_modules/@openhands/extensions/integrations/catalog/box.js.map +1 -1
  805. package/dist/node_modules/@openhands/extensions/integrations/catalog/canva.cjs +1 -1
  806. package/dist/node_modules/@openhands/extensions/integrations/catalog/canva.cjs.map +1 -1
  807. package/dist/node_modules/@openhands/extensions/integrations/catalog/canva.js +3 -7
  808. package/dist/node_modules/@openhands/extensions/integrations/catalog/canva.js.map +1 -1
  809. package/dist/node_modules/@openhands/extensions/integrations/catalog/confluence.cjs +1 -1
  810. package/dist/node_modules/@openhands/extensions/integrations/catalog/confluence.cjs.map +1 -1
  811. package/dist/node_modules/@openhands/extensions/integrations/catalog/confluence.js +1 -6
  812. package/dist/node_modules/@openhands/extensions/integrations/catalog/confluence.js.map +1 -1
  813. package/dist/node_modules/@openhands/extensions/integrations/catalog/discord.cjs +1 -1
  814. package/dist/node_modules/@openhands/extensions/integrations/catalog/discord.cjs.map +1 -1
  815. package/dist/node_modules/@openhands/extensions/integrations/catalog/discord.js +1 -6
  816. package/dist/node_modules/@openhands/extensions/integrations/catalog/discord.js.map +1 -1
  817. package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.cjs +1 -1
  818. package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.cjs.map +1 -1
  819. package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.js +20 -26
  820. package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.js.map +1 -1
  821. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.cjs +1 -1
  822. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.cjs.map +1 -1
  823. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.js +0 -9
  824. package/dist/node_modules/@openhands/extensions/integrations/catalog/github.js.map +1 -1
  825. package/dist/node_modules/@openhands/extensions/integrations/catalog/gmail.cjs +1 -1
  826. package/dist/node_modules/@openhands/extensions/integrations/catalog/gmail.cjs.map +1 -1
  827. package/dist/node_modules/@openhands/extensions/integrations/catalog/gmail.js +1 -6
  828. package/dist/node_modules/@openhands/extensions/integrations/catalog/gmail.js.map +1 -1
  829. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-calendar.cjs +1 -1
  830. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-calendar.cjs.map +1 -1
  831. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-calendar.js +1 -6
  832. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-calendar.js.map +1 -1
  833. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-docs.cjs +1 -1
  834. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-docs.cjs.map +1 -1
  835. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-docs.js +1 -6
  836. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-docs.js.map +1 -1
  837. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-drive.cjs +1 -1
  838. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-drive.cjs.map +1 -1
  839. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-drive.js +1 -6
  840. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-drive.js.map +1 -1
  841. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-sheets.cjs +1 -1
  842. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-sheets.cjs.map +1 -1
  843. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-sheets.js +1 -6
  844. package/dist/node_modules/@openhands/extensions/integrations/catalog/google-sheets.js.map +1 -1
  845. package/dist/node_modules/@openhands/extensions/integrations/catalog/intercom.cjs +1 -1
  846. package/dist/node_modules/@openhands/extensions/integrations/catalog/intercom.cjs.map +1 -1
  847. package/dist/node_modules/@openhands/extensions/integrations/catalog/intercom.js +1 -6
  848. package/dist/node_modules/@openhands/extensions/integrations/catalog/intercom.js.map +1 -1
  849. package/dist/node_modules/@openhands/extensions/integrations/catalog/jira.cjs +1 -1
  850. package/dist/node_modules/@openhands/extensions/integrations/catalog/jira.cjs.map +1 -1
  851. package/dist/node_modules/@openhands/extensions/integrations/catalog/jira.js +1 -6
  852. package/dist/node_modules/@openhands/extensions/integrations/catalog/jira.js.map +1 -1
  853. package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.cjs +1 -1
  854. package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.cjs.map +1 -1
  855. package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.js +13 -13
  856. package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.js.map +1 -1
  857. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-outlook.cjs +1 -1
  858. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-outlook.cjs.map +1 -1
  859. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-outlook.js +1 -6
  860. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-outlook.js.map +1 -1
  861. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-teams.cjs +1 -1
  862. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-teams.cjs.map +1 -1
  863. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-teams.js +1 -6
  864. package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-teams.js.map +1 -1
  865. package/dist/node_modules/@openhands/extensions/integrations/catalog/miro.cjs +1 -1
  866. package/dist/node_modules/@openhands/extensions/integrations/catalog/miro.cjs.map +1 -1
  867. package/dist/node_modules/@openhands/extensions/integrations/catalog/miro.js +14 -10
  868. package/dist/node_modules/@openhands/extensions/integrations/catalog/miro.js.map +1 -1
  869. package/dist/node_modules/@openhands/extensions/integrations/catalog/monday.cjs +1 -1
  870. package/dist/node_modules/@openhands/extensions/integrations/catalog/monday.cjs.map +1 -1
  871. package/dist/node_modules/@openhands/extensions/integrations/catalog/monday.js +13 -10
  872. package/dist/node_modules/@openhands/extensions/integrations/catalog/monday.js.map +1 -1
  873. package/dist/node_modules/@openhands/extensions/integrations/catalog/netlify.cjs +1 -1
  874. package/dist/node_modules/@openhands/extensions/integrations/catalog/netlify.cjs.map +1 -1
  875. package/dist/node_modules/@openhands/extensions/integrations/catalog/netlify.js +1 -6
  876. package/dist/node_modules/@openhands/extensions/integrations/catalog/netlify.js.map +1 -1
  877. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs +1 -1
  878. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs.map +1 -1
  879. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js +1 -8
  880. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js.map +1 -1
  881. package/dist/node_modules/@openhands/extensions/integrations/catalog/okta.cjs +1 -1
  882. package/dist/node_modules/@openhands/extensions/integrations/catalog/okta.cjs.map +1 -1
  883. package/dist/node_modules/@openhands/extensions/integrations/catalog/okta.js +1 -6
  884. package/dist/node_modules/@openhands/extensions/integrations/catalog/okta.js.map +1 -1
  885. package/dist/node_modules/@openhands/extensions/integrations/catalog/onedrive.cjs +1 -1
  886. package/dist/node_modules/@openhands/extensions/integrations/catalog/onedrive.cjs.map +1 -1
  887. package/dist/node_modules/@openhands/extensions/integrations/catalog/onedrive.js +1 -6
  888. package/dist/node_modules/@openhands/extensions/integrations/catalog/onedrive.js.map +1 -1
  889. package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.cjs +1 -1
  890. package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.cjs.map +1 -1
  891. package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.js +20 -18
  892. package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.js.map +1 -1
  893. package/dist/node_modules/@openhands/extensions/integrations/catalog/quickbooks.cjs +1 -1
  894. package/dist/node_modules/@openhands/extensions/integrations/catalog/quickbooks.cjs.map +1 -1
  895. package/dist/node_modules/@openhands/extensions/integrations/catalog/quickbooks.js +66 -21
  896. package/dist/node_modules/@openhands/extensions/integrations/catalog/quickbooks.js.map +1 -1
  897. package/dist/node_modules/@openhands/extensions/integrations/catalog/salesforce.cjs +1 -1
  898. package/dist/node_modules/@openhands/extensions/integrations/catalog/salesforce.cjs.map +1 -1
  899. package/dist/node_modules/@openhands/extensions/integrations/catalog/salesforce.js +17 -11
  900. package/dist/node_modules/@openhands/extensions/integrations/catalog/salesforce.js.map +1 -1
  901. package/dist/node_modules/@openhands/extensions/integrations/catalog/sentry.cjs +1 -1
  902. package/dist/node_modules/@openhands/extensions/integrations/catalog/sentry.cjs.map +1 -1
  903. package/dist/node_modules/@openhands/extensions/integrations/catalog/sentry.js +12 -17
  904. package/dist/node_modules/@openhands/extensions/integrations/catalog/sentry.js.map +1 -1
  905. package/dist/node_modules/@openhands/extensions/integrations/catalog/sharepoint.cjs +1 -1
  906. package/dist/node_modules/@openhands/extensions/integrations/catalog/sharepoint.cjs.map +1 -1
  907. package/dist/node_modules/@openhands/extensions/integrations/catalog/sharepoint.js +1 -6
  908. package/dist/node_modules/@openhands/extensions/integrations/catalog/sharepoint.js.map +1 -1
  909. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.cjs +1 -1
  910. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.cjs.map +1 -1
  911. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.js +1 -1
  912. package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.js.map +1 -1
  913. package/dist/node_modules/@openhands/extensions/integrations/catalog/stripe.cjs +1 -1
  914. package/dist/node_modules/@openhands/extensions/integrations/catalog/stripe.cjs.map +1 -1
  915. package/dist/node_modules/@openhands/extensions/integrations/catalog/stripe.js +14 -19
  916. package/dist/node_modules/@openhands/extensions/integrations/catalog/stripe.js.map +1 -1
  917. package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.cjs +1 -1
  918. package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.cjs.map +1 -1
  919. package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.js +15 -20
  920. package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.js.map +1 -1
  921. package/dist/node_modules/@openhands/extensions/integrations/catalog/trello.cjs +1 -1
  922. package/dist/node_modules/@openhands/extensions/integrations/catalog/trello.cjs.map +1 -1
  923. package/dist/node_modules/@openhands/extensions/integrations/catalog/trello.js +10 -8
  924. package/dist/node_modules/@openhands/extensions/integrations/catalog/trello.js.map +1 -1
  925. package/dist/node_modules/@openhands/extensions/integrations/catalog/vercel.cjs +1 -1
  926. package/dist/node_modules/@openhands/extensions/integrations/catalog/vercel.cjs.map +1 -1
  927. package/dist/node_modules/@openhands/extensions/integrations/catalog/vercel.js +1 -6
  928. package/dist/node_modules/@openhands/extensions/integrations/catalog/vercel.js.map +1 -1
  929. package/dist/node_modules/@openhands/extensions/integrations/catalog/xero.cjs +1 -1
  930. package/dist/node_modules/@openhands/extensions/integrations/catalog/xero.cjs.map +1 -1
  931. package/dist/node_modules/@openhands/extensions/integrations/catalog/xero.js +1 -6
  932. package/dist/node_modules/@openhands/extensions/integrations/catalog/xero.js.map +1 -1
  933. package/dist/node_modules/@openhands/extensions/integrations/catalog/zoom.cjs +1 -1
  934. package/dist/node_modules/@openhands/extensions/integrations/catalog/zoom.cjs.map +1 -1
  935. package/dist/node_modules/@openhands/extensions/integrations/catalog/zoom.js +1 -6
  936. package/dist/node_modules/@openhands/extensions/integrations/catalog/zoom.js.map +1 -1
  937. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs +1 -1
  938. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs.map +1 -1
  939. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js +67 -87
  940. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js.map +1 -1
  941. package/dist/node_modules/@openhands/extensions/integrations/index.cjs +1 -1
  942. package/dist/node_modules/@openhands/extensions/integrations/index.cjs.map +1 -1
  943. package/dist/node_modules/@openhands/extensions/integrations/index.js +4 -4
  944. package/dist/node_modules/@openhands/extensions/integrations/index.js.map +1 -1
  945. package/dist/node_modules/@openhands/extensions/skills/index.cjs +236 -17
  946. package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
  947. package/dist/node_modules/@openhands/extensions/skills/index.js +24 -5
  948. package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
  949. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-profiles-client.cjs +2 -0
  950. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-profiles-client.cjs.map +1 -0
  951. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-profiles-client.js +40 -0
  952. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-profiles-client.js.map +1 -0
  953. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.cjs +1 -1
  954. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.cjs.map +1 -1
  955. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.js +4 -4
  956. package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.js.map +1 -1
  957. package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.cjs +1 -1
  958. package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.cjs.map +1 -1
  959. package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.js +3 -0
  960. package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.js.map +1 -1
  961. package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs +1 -1
  962. package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs.map +1 -1
  963. package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.js +3 -0
  964. package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.js.map +1 -1
  965. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs +1 -0
  966. package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js +1 -0
  967. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs +1 -0
  968. package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js +1 -0
  969. package/dist/node_modules/@openhands/typescript-client/dist/client/http-client.cjs +1 -1
  970. package/dist/node_modules/@openhands/typescript-client/dist/client/http-client.cjs.map +1 -1
  971. package/dist/node_modules/@openhands/typescript-client/dist/client/http-client.js +84 -27
  972. package/dist/node_modules/@openhands/typescript-client/dist/client/http-client.js.map +1 -1
  973. package/dist/node_modules/@openhands/typescript-client/dist/client/mcp-client.cjs +1 -1
  974. package/dist/node_modules/@openhands/typescript-client/dist/client/mcp-client.cjs.map +1 -1
  975. package/dist/node_modules/@openhands/typescript-client/dist/client/mcp-client.js +9 -0
  976. package/dist/node_modules/@openhands/typescript-client/dist/client/mcp-client.js.map +1 -1
  977. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs +1 -0
  978. package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js +1 -0
  979. package/dist/node_modules/@openhands/typescript-client/dist/client/plugins-client.cjs +2 -0
  980. package/dist/node_modules/@openhands/typescript-client/dist/client/plugins-client.cjs.map +1 -0
  981. package/dist/node_modules/@openhands/typescript-client/dist/client/plugins-client.js +42 -0
  982. package/dist/node_modules/@openhands/typescript-client/dist/client/plugins-client.js.map +1 -0
  983. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs +1 -0
  984. package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js +1 -0
  985. package/dist/node_modules/@openhands/typescript-client/dist/client/skills-client.cjs +1 -1
  986. package/dist/node_modules/@openhands/typescript-client/dist/client/skills-client.cjs.map +1 -1
  987. package/dist/node_modules/@openhands/typescript-client/dist/client/skills-client.js +1 -1
  988. package/dist/node_modules/@openhands/typescript-client/dist/client/skills-client.js.map +1 -1
  989. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs +1 -0
  990. package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js +1 -0
  991. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs +1 -0
  992. package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js +1 -0
  993. package/dist/node_modules/@openhands/typescript-client/dist/clients.cjs +1 -0
  994. package/dist/node_modules/@openhands/typescript-client/dist/clients.js +20 -0
  995. package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation-manager.cjs +1 -1
  996. package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation-manager.js +18 -0
  997. package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation.cjs +1 -1
  998. package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation.js +1 -0
  999. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-conversation.cjs +1 -1
  1000. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-conversation.js +2 -0
  1001. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.cjs +1 -1
  1002. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.cjs.map +1 -1
  1003. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.js +15 -17
  1004. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.js.map +1 -1
  1005. package/dist/node_modules/@openhands/typescript-client/dist/index.cjs +1 -1
  1006. package/dist/node_modules/@openhands/typescript-client/dist/index.js +3 -0
  1007. package/dist/node_modules/@openhands/typescript-client/dist/workspace/workspace.cjs +1 -0
  1008. package/dist/node_modules/@openhands/typescript-client/dist/workspace/workspace.js +1 -0
  1009. package/dist/package.cjs +1 -1
  1010. package/dist/package.cjs.map +1 -1
  1011. package/dist/package.js +7 -4
  1012. package/dist/package.js.map +1 -1
  1013. package/dist/routes/agent-settings.d.ts +106 -0
  1014. package/dist/routes/files-tab.cjs +1 -1
  1015. package/dist/routes/files-tab.js +23 -23
  1016. package/dist/routes/llm-settings.cjs +1 -1
  1017. package/dist/routes/llm-settings.cjs.map +1 -1
  1018. package/dist/routes/llm-settings.d.ts +6 -4
  1019. package/dist/routes/llm-settings.js +0 -1
  1020. package/dist/routes/llm-settings.js.map +1 -1
  1021. package/dist/routes/mcp.cjs.map +1 -1
  1022. package/dist/routes/mcp.js.map +1 -1
  1023. package/dist/services/settings.cjs +1 -1
  1024. package/dist/services/settings.cjs.map +1 -1
  1025. package/dist/services/settings.js +2 -6
  1026. package/dist/services/settings.js.map +1 -1
  1027. package/dist/stores/command-menu-store.cjs +2 -0
  1028. package/dist/stores/command-menu-store.cjs.map +1 -0
  1029. package/dist/stores/command-menu-store.d.ts +8 -0
  1030. package/dist/stores/command-menu-store.js +12 -0
  1031. package/dist/stores/command-menu-store.js.map +1 -0
  1032. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  1033. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  1034. package/dist/stores/conversation-panel-preferences-store.js +1 -1
  1035. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  1036. package/dist/stores/conversation-store.cjs +1 -1
  1037. package/dist/stores/conversation-store.cjs.map +1 -1
  1038. package/dist/stores/conversation-store.d.ts +1 -0
  1039. package/dist/stores/conversation-store.js +1 -0
  1040. package/dist/stores/conversation-store.js.map +1 -1
  1041. package/dist/stores/goal-store.cjs +2 -0
  1042. package/dist/stores/goal-store.cjs.map +1 -0
  1043. package/dist/stores/goal-store.d.ts +28 -0
  1044. package/dist/stores/goal-store.js +14 -0
  1045. package/dist/stores/goal-store.js.map +1 -0
  1046. package/dist/types/agent-server/core/events/conversation-state-event.d.ts +39 -3
  1047. package/dist/types/agent-server/type-guards.cjs +1 -1
  1048. package/dist/types/agent-server/type-guards.cjs.map +1 -1
  1049. package/dist/types/agent-server/type-guards.d.ts +2 -1
  1050. package/dist/types/agent-server/type-guards.js +3 -3
  1051. package/dist/types/agent-server/type-guards.js.map +1 -1
  1052. package/dist/types/mcp-auth.cjs +2 -0
  1053. package/dist/types/mcp-auth.cjs.map +1 -0
  1054. package/dist/types/mcp-auth.d.ts +43 -0
  1055. package/dist/types/mcp-auth.js +13 -0
  1056. package/dist/types/mcp-auth.js.map +1 -0
  1057. package/dist/types/mcp-server.d.ts +22 -1
  1058. package/dist/types/settings.d.ts +6 -4
  1059. package/dist/ui/context-menu.d.ts +1 -1
  1060. package/dist/utils/acp-command.d.ts +64 -0
  1061. package/dist/utils/automation-debug-prompt.d.ts +18 -0
  1062. package/dist/utils/constants.cjs +1 -1
  1063. package/dist/utils/constants.cjs.map +1 -1
  1064. package/dist/utils/constants.d.ts +2 -0
  1065. package/dist/utils/constants.js +12 -3
  1066. package/dist/utils/constants.js.map +1 -1
  1067. package/dist/utils/dropdown-classes.cjs +1 -1
  1068. package/dist/utils/dropdown-classes.cjs.map +1 -1
  1069. package/dist/utils/dropdown-classes.js +4 -2
  1070. package/dist/utils/dropdown-classes.js.map +1 -1
  1071. package/dist/utils/form-control-classes.cjs +1 -1
  1072. package/dist/utils/form-control-classes.js +1 -1
  1073. package/dist/utils/handle-event-for-ui.cjs +1 -1
  1074. package/dist/utils/handle-event-for-ui.cjs.map +1 -1
  1075. package/dist/utils/handle-event-for-ui.js +72 -37
  1076. package/dist/utils/handle-event-for-ui.js.map +1 -1
  1077. package/dist/utils/mcp-config.cjs +1 -1
  1078. package/dist/utils/mcp-config.cjs.map +1 -1
  1079. package/dist/utils/mcp-config.d.ts +15 -9
  1080. package/dist/utils/mcp-config.js +124 -53
  1081. package/dist/utils/mcp-config.js.map +1 -1
  1082. package/dist/utils/mcp-installed-server-display.cjs +2 -0
  1083. package/dist/utils/mcp-installed-server-display.cjs.map +1 -0
  1084. package/dist/utils/mcp-installed-server-display.d.ts +8 -0
  1085. package/dist/utils/mcp-installed-server-display.js +12 -0
  1086. package/dist/utils/mcp-installed-server-display.js.map +1 -0
  1087. package/dist/utils/mcp-installed-servers.cjs +1 -1
  1088. package/dist/utils/mcp-installed-servers.cjs.map +1 -1
  1089. package/dist/utils/mcp-installed-servers.js +4 -4
  1090. package/dist/utils/mcp-installed-servers.js.map +1 -1
  1091. package/dist/utils/mcp-marketplace-utils.cjs +1 -1
  1092. package/dist/utils/mcp-marketplace-utils.cjs.map +1 -1
  1093. package/dist/utils/mcp-marketplace-utils.d.ts +2 -0
  1094. package/dist/utils/mcp-marketplace-utils.js +31 -16
  1095. package/dist/utils/mcp-marketplace-utils.js.map +1 -1
  1096. package/dist/utils/mcp-server-name.cjs +2 -0
  1097. package/dist/utils/mcp-server-name.cjs.map +1 -0
  1098. package/dist/utils/mcp-server-name.d.ts +3 -0
  1099. package/dist/utils/mcp-server-name.js +12 -0
  1100. package/dist/utils/mcp-server-name.js.map +1 -0
  1101. package/dist/utils/plugin-display.cjs +2 -0
  1102. package/dist/utils/plugin-display.cjs.map +1 -0
  1103. package/dist/utils/plugin-display.d.ts +20 -0
  1104. package/dist/utils/plugin-display.js +29 -0
  1105. package/dist/utils/plugin-display.js.map +1 -0
  1106. package/dist/utils/settings-utils.cjs.map +1 -1
  1107. package/dist/utils/settings-utils.js.map +1 -1
  1108. package/dist/utils/workspaces-compatibility.cjs +1 -1
  1109. package/dist/utils/workspaces-compatibility.cjs.map +1 -1
  1110. package/dist/utils/workspaces-compatibility.js +1 -0
  1111. package/dist/utils/workspaces-compatibility.js.map +1 -1
  1112. package/package.json +7 -4
  1113. package/scripts/check-sdk-version-sync.mjs +6 -6
  1114. package/scripts/check-translation-completeness.cjs +6 -0
  1115. package/scripts/dev-safe.mjs +14 -3
  1116. package/scripts/dev-with-automation.mjs +4 -0
  1117. package/scripts/gen-acp-docker-env.mjs +107 -0
  1118. package/scripts/ingress.mjs +66 -226
  1119. package/scripts/proxy-utils.mjs +171 -0
  1120. package/scripts/static-server.mjs +127 -283
  1121. package/build/assets/Trans-CiZR6eVI.js +0 -1
  1122. package/build/assets/active-backend-context-CEuva6ZJ.js +0 -1
  1123. package/build/assets/add-backend-modal-b_eiVk3A.js +0 -1
  1124. package/build/assets/agent-server-conversation-service.api-D_uJ7BKc.js +0 -5
  1125. package/build/assets/agent-settings-DyfziYyM.js +0 -2
  1126. package/build/assets/alert-banner-BFayS5vM.js +0 -1
  1127. package/build/assets/analytics-consent-form-modal-CQ22qlFF.js +0 -1
  1128. package/build/assets/api-key-entry-screen-KnIwP0vN.js +0 -1
  1129. package/build/assets/app-settings-CBaHJ5vJ.js +0 -1
  1130. package/build/assets/automation-detail-DgQswnXg.js +0 -1
  1131. package/build/assets/automations-list-D99p6CoQ.js +0 -1
  1132. package/build/assets/back-nav-button-Cp9z-wsG.js +0 -1
  1133. package/build/assets/backend-form-modal-BABAz-zH.js +0 -1
  1134. package/build/assets/backend-synced-settings-badge-DzwWQC4T.js +0 -1
  1135. package/build/assets/base-modal-1bHiB5Wf.js +0 -1
  1136. package/build/assets/brand-button-FHWgEb4Q.js +0 -1
  1137. package/build/assets/browser-store-B9h0eW79.js +0 -1
  1138. package/build/assets/browser-tab-JiCXo0Nc.js +0 -1
  1139. package/build/assets/chat-send-button-QtyofqFt.js +0 -1
  1140. package/build/assets/check-6ieIiPhW.js +0 -1
  1141. package/build/assets/checkmark-BfgRVMHK.js +0 -1
  1142. package/build/assets/circle-plus-check-toggle-CmINKfZj.js +0 -1
  1143. package/build/assets/close-DhH0uMa7.js +0 -1
  1144. package/build/assets/code-tag-CnORXDJj.js +0 -1
  1145. package/build/assets/combobox-caret-BB15S7zY.js +0 -1
  1146. package/build/assets/condenser-settings-BOKNShD9.js +0 -1
  1147. package/build/assets/confirmation-modal-CofmThy4.js +0 -1
  1148. package/build/assets/context-menu-list-item-DO12IEaK.js +0 -1
  1149. package/build/assets/conversation-DIzv-jq8.js +0 -1
  1150. package/build/assets/conversation-DV3odvMe.js +0 -19
  1151. package/build/assets/conversation-local-storage-DK7yJr5N.js +0 -1
  1152. package/build/assets/conversation-panel-CgCarTAn.js +0 -1
  1153. package/build/assets/conversation-service.api-RV_bOKNz.js +0 -1
  1154. package/build/assets/conversation-state-store-4obo4ZMf.js +0 -1
  1155. package/build/assets/conversation-store-CXrL0v-X.js +0 -6
  1156. package/build/assets/conversation-tab-empty-state-CqT5ur_H.js +0 -1
  1157. package/build/assets/copy-C5tBqfWu.js +0 -1
  1158. package/build/assets/copy-to-clipboard-button-BVFYcsg_.js +0 -1
  1159. package/build/assets/createLucideIcon-D3nkdIAN.js +0 -1
  1160. package/build/assets/declaration-B0yY_dkQ.js +0 -1
  1161. package/build/assets/device-verify-DRupI_hz.js +0 -1
  1162. package/build/assets/dist-D5d5zm8o.js +0 -1
  1163. package/build/assets/dist-fV7trlfb.js +0 -1
  1164. package/build/assets/dropdown-classes-5IsMjYYw.js +0 -1
  1165. package/build/assets/edit-automation-modal-BG-gd82b.js +0 -1
  1166. package/build/assets/ellipsis-button-DWvVZO_r.js +0 -1
  1167. package/build/assets/entry.client-uhbVfCtd.js +0 -2
  1168. package/build/assets/enum-filter-dropdown-CB2fqz_e.js +0 -1
  1169. package/build/assets/environment-switch-overlay-Oeal5TVq.js +0 -1
  1170. package/build/assets/extensions-hub-DxiE0AZR.js +0 -1
  1171. package/build/assets/files-tab-1F2OlNeH.js +0 -1
  1172. package/build/assets/files-tab-store-C1q5Rbx3.js +0 -1
  1173. package/build/assets/folder-C5tr7xyN.js +0 -1
  1174. package/build/assets/get-language-from-path-E1JKsbeE.js +0 -1
  1175. package/build/assets/git-provider-icon-CKs-22Ts.js +0 -1
  1176. package/build/assets/home-B3E0le0g.js +0 -1
  1177. package/build/assets/iconBase-DMoh3FEg.js +0 -1
  1178. package/build/assets/index-redirect-DhuK5mhS.js +0 -1
  1179. package/build/assets/install-server-modal-DjintV14.js +0 -1
  1180. package/build/assets/is-backend-llm-ready-Bj44pekN.js +0 -1
  1181. package/build/assets/launch-DCU3S84p.js +0 -1
  1182. package/build/assets/lesson-plan-BUUPKVsa.js +0 -3
  1183. package/build/assets/link-external-CF4KHxx-.js +0 -1
  1184. package/build/assets/llm-client-BakM_czF.js +0 -1
  1185. package/build/assets/llm-not-configured-banner-BV-NIjfR.js +0 -27
  1186. package/build/assets/llm-settings-B5d7PHzz.js +0 -1
  1187. package/build/assets/llm-settings-C5whb-0p.js +0 -1
  1188. package/build/assets/loader-circle-DyX8DmLg.js +0 -1
  1189. package/build/assets/loading-spinner-BvOAco8a.js +0 -1
  1190. package/build/assets/manage-backends-modal-D9ClxVpM.js +0 -1
  1191. package/build/assets/manifest-38a873aa.js +0 -1
  1192. package/build/assets/mcp-7rk44GRS.js +0 -9
  1193. package/build/assets/mcp-client-DxHXYNOw.js +0 -1
  1194. package/build/assets/messages-DgBEaXil.js +0 -43
  1195. package/build/assets/modal-backdrop-DjAC2zOZ.js +0 -1
  1196. package/build/assets/modal-body-OJdIUJ68.js +0 -1
  1197. package/build/assets/modal-close-button-BNjGesHc.js +0 -1
  1198. package/build/assets/model-selector-w2uGPM5y.js +0 -1
  1199. package/build/assets/navigation-context-CUJ60pLI.js +0 -1
  1200. package/build/assets/navigation-link-BiPKTOHF.js +0 -1
  1201. package/build/assets/onboarding-Cit87z8g.js +0 -1
  1202. package/build/assets/onboarding-modal-JPrzvr8W.js +0 -1
  1203. package/build/assets/openhands-logo-uNs9g6LY.js +0 -1
  1204. package/build/assets/option-service.api-BLYUhnCF.js +0 -1
  1205. package/build/assets/organization-service.api-DpSSwlZu.js +0 -1
  1206. package/build/assets/path-utils-B4WAVqvK.js +0 -1
  1207. package/build/assets/plan-components-DSOTFW2D.js +0 -1
  1208. package/build/assets/planner-tab-LmoxgKKe.js +0 -1
  1209. package/build/assets/preload-helper-D_sPnjeL.js +0 -1
  1210. package/build/assets/profiles-client-B4SJ4ZAf.js +0 -1
  1211. package/build/assets/providers-BGUAB8kf.js +0 -1
  1212. package/build/assets/react-Dn-iWFF5.js +0 -1
  1213. package/build/assets/react-dom-BBXlXOZX.js +0 -1
  1214. package/build/assets/react-uQK8du1l.js +0 -1
  1215. package/build/assets/recommended-automations-launcher-Df9MXUpX.js +0 -50
  1216. package/build/assets/root-BShAdYGY.css +0 -1
  1217. package/build/assets/root-C99reK-P.js +0 -2
  1218. package/build/assets/root-layout-BtH64XeC.js +0 -2
  1219. package/build/assets/runtime-waiting-state-C7MjXDeW.js +0 -1
  1220. package/build/assets/schema-field-BCDuEMrl.js +0 -1
  1221. package/build/assets/sdk-section-page-XJN9mGju.js +0 -1
  1222. package/build/assets/sdk-settings-schema-B15AE1GH.js +0 -1
  1223. package/build/assets/search-rob4u9f8.js +0 -1
  1224. package/build/assets/secrets-service-CrPyCR8u.js +0 -1
  1225. package/build/assets/secrets-settings-UJn15N7E.js +0 -1
  1226. package/build/assets/settings-C5aUD_sQ.js +0 -1
  1227. package/build/assets/settings-dropdown-input-DQRt2_RA.js +0 -1
  1228. package/build/assets/settings-gear-B7bZDo_8.js +0 -1
  1229. package/build/assets/settings-index-zP_rYIW1.js +0 -1
  1230. package/build/assets/settings-input-n8FzVso3.js +0 -1
  1231. package/build/assets/settings-list-classes-DquY3fwm.js +0 -1
  1232. package/build/assets/settings-modal-szlQ6LpE.js +0 -1
  1233. package/build/assets/settings-section-header-context-DrXgyNC-.js +0 -1
  1234. package/build/assets/settings-service.api-B4G8NzCM.js +0 -1
  1235. package/build/assets/settings-switch-DsbEm3ie.js +0 -1
  1236. package/build/assets/shared-conversation-BrAvqeaI.js +0 -1
  1237. package/build/assets/sidebar-mobile-menu-toggle-BRZGCe-l.js +0 -1
  1238. package/build/assets/sidebar-nav-link-B_EygIce.js +0 -1
  1239. package/build/assets/skill-card-pill-row-Bq9Imkdh.js +0 -1
  1240. package/build/assets/skills-Wg6i0kbu.js +0 -1
  1241. package/build/assets/skills-client-DNd444Bm.js +0 -1
  1242. package/build/assets/skills-plugins-DaGkVI7-.js +0 -1
  1243. package/build/assets/skills-settings-Dlp0WFaT.js +0 -2
  1244. package/build/assets/styled-tooltip-ulgpZDga.js +0 -1
  1245. package/build/assets/suspense-BqBQEuKs.js +0 -1
  1246. package/build/assets/switch-skeleton-C49gVWOQ.js +0 -1
  1247. package/build/assets/task-list-tab-Bz-UlCm2.js +0 -1
  1248. package/build/assets/telemetry-DD3HKMgf.js +0 -2
  1249. package/build/assets/terminal-BwLvVzyJ.js +0 -1
  1250. package/build/assets/toggle-switch-CxW8-lBI.js +0 -1
  1251. package/build/assets/typography-BLf_mRKH.js +0 -1
  1252. package/build/assets/u-check-circle-CxTAJuY9.js +0 -1
  1253. package/build/assets/u-check-circle-half-Bj73jfUG.js +0 -1
  1254. package/build/assets/u-circuit-C-6V9H9C.js +0 -1
  1255. package/build/assets/u-edit-C7OnK2sa.js +0 -1
  1256. package/build/assets/use-acp-credential-form-oehc057O.js +0 -1
  1257. package/build/assets/use-active-conversation-CFXVX2on.js +0 -1
  1258. package/build/assets/use-agent-state-D6xfZA4-.js +0 -1
  1259. package/build/assets/use-backends-health-93yRIOWs.js +0 -1
  1260. package/build/assets/use-breakpoint-Xdy_aZHE.js +0 -1
  1261. package/build/assets/use-click-outside-element-CADb_gCP.js +0 -1
  1262. package/build/assets/use-cloud-current-user-id-CzOXsy04.js +0 -1
  1263. package/build/assets/use-config-oXjEWyb6.js +0 -1
  1264. package/build/assets/use-create-conversation-D-YkgrxS.js +0 -1
  1265. package/build/assets/use-create-secret-CX7Ij7W4.js +0 -1
  1266. package/build/assets/use-event-store-DMRAQQi8.js +0 -1
  1267. package/build/assets/use-handle-plan-click-CwW2Ijc2.js +0 -1
  1268. package/build/assets/use-is-authed-CNbX1KMm.js +0 -1
  1269. package/build/assets/use-launch-skill-in-chat-xI9byRUw.js +0 -1
  1270. package/build/assets/use-llm-profiles-BXRZ2rBh.js +0 -1
  1271. package/build/assets/use-runtime-is-ready-Dwzs9_vp.js +0 -1
  1272. package/build/assets/use-settings-_usWr_qn.js +0 -1
  1273. package/build/assets/use-settings-nav-items-DoB5iH-7.js +0 -16
  1274. package/build/assets/use-skills-BtorhoCN.js +0 -1
  1275. package/build/assets/use-task-list-u46BhYBC.js +0 -1
  1276. package/build/assets/use-tracking-Ca7p71hH.js +0 -1
  1277. package/build/assets/use-user-conversation-U-16WF6G.js +0 -1
  1278. package/build/assets/useMutation-CseCrRRO.js +0 -1
  1279. package/build/assets/useQuery-bowvACed.js +0 -1
  1280. package/build/assets/useTranslation-KhTtKmnv.js +0 -1
  1281. package/build/assets/utils-cRyMoFbz.js +0 -1
  1282. package/build/assets/vendor~conversation-panel~conversation~alert-banner-CjfR7T3x.js +0 -1
  1283. package/build/assets/vendor~entry.client-_zl82x5T.js +0 -1
  1284. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~dj9x5fm9-CgCGB-3J.js +0 -177
  1285. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~jfvr34cq-BJdsUTJG.js +0 -1
  1286. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~m3df9r20-BynFAJ_S.js +0 -1
  1287. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~nk00xiud-MfCRtPrK.js +0 -9
  1288. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~ghtfhmuy-BHDILMe2.js +0 -1
  1289. package/build/assets/vendor~root-layout~conversation-panel~conversation-BFZmbXpq.js +0 -1
  1290. package/build/assets/vendor~root-layout~conversation-panel~conversation~index-BPY-kNjK.js +0 -1
  1291. package/build/assets/vendor~root-layout~home~conversation-panel~conversation-BhWqQNmF.js +0 -1
  1292. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~cfyi58ut-CnnEa0dP.js +0 -1
  1293. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~clac83qc-DMX6XUwI.js +0 -2
  1294. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~ldu51w4e-Cqp6k3RG.js +0 -1
  1295. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~ldu51w4e-DS4GWhCz.js +0 -9
  1296. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~launch~settings~settings-index~agen~ji28rqgb-DVffa9Ks.js +0 -48
  1297. package/build/assets/vendor~root-layout~home~mcp~automations-list~onboarding-modal-BzR6ypP3.js +0 -1
  1298. package/build/assets/vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~hzfcl1q6-BcvHZmEZ.js +0 -2
  1299. package/build/assets/vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~hzfcl1q6-Cuvp6wqR.js +0 -14
  1300. package/build/assets/verification-settings-DKZnUHD6.js +0 -1
  1301. package/build/assets/x-DpnGZyVW.js +0 -1
  1302. package/build/assets/x-mark-x3tvCZzc.js +0 -1
  1303. package/dist/components/features/analytics/analytics-consent-form-modal.d.ts +0 -5
  1304. package/dist/components/features/chat/switch-profile-button.cjs +0 -2
  1305. package/dist/components/features/chat/switch-profile-button.cjs.map +0 -1
  1306. package/dist/components/features/chat/switch-profile-button.d.ts +0 -1
  1307. package/dist/components/features/chat/switch-profile-button.js +0 -48
  1308. package/dist/components/features/chat/switch-profile-button.js.map +0 -1
  1309. package/dist/components/features/chat/switch-profile-context-menu.cjs +0 -2
  1310. package/dist/components/features/chat/switch-profile-context-menu.cjs.map +0 -1
  1311. package/dist/components/features/chat/switch-profile-context-menu.d.ts +0 -9
  1312. package/dist/components/features/chat/switch-profile-context-menu.js +0 -106
  1313. package/dist/components/features/chat/switch-profile-context-menu.js.map +0 -1
  1314. package/dist/components/features/onboarding/is-backend-llm-ready.d.ts +0 -30
  1315. package/dist/icons/u-circuit.cjs +0 -2
  1316. package/dist/icons/u-circuit.cjs.map +0 -1
  1317. package/dist/icons/u-circuit.js +0 -19
  1318. package/dist/icons/u-circuit.js.map +0 -1
  1319. package/dist/node_modules/@openhands/extensions/integrations/catalog/clickup.cjs +0 -2
  1320. package/dist/node_modules/@openhands/extensions/integrations/catalog/clickup.cjs.map +0 -1
  1321. package/dist/node_modules/@openhands/extensions/integrations/catalog/clickup.js +0 -35
  1322. package/dist/node_modules/@openhands/extensions/integrations/catalog/clickup.js.map +0 -1
  1323. package/dist/node_modules/@openhands/extensions/integrations/catalog/dropbox.cjs +0 -2
  1324. package/dist/node_modules/@openhands/extensions/integrations/catalog/dropbox.cjs.map +0 -1
  1325. package/dist/node_modules/@openhands/extensions/integrations/catalog/dropbox.js +0 -35
  1326. package/dist/node_modules/@openhands/extensions/integrations/catalog/dropbox.js.map +0 -1
  1327. package/dist/node_modules/@openhands/extensions/integrations/catalog/freshdesk.cjs +0 -2
  1328. package/dist/node_modules/@openhands/extensions/integrations/catalog/freshdesk.cjs.map +0 -1
  1329. package/dist/node_modules/@openhands/extensions/integrations/catalog/freshdesk.js +0 -35
  1330. package/dist/node_modules/@openhands/extensions/integrations/catalog/freshdesk.js.map +0 -1
  1331. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs +0 -2
  1332. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs.map +0 -1
  1333. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js +0 -35
  1334. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js.map +0 -1
  1335. package/dist/node_modules/@openhands/extensions/integrations/catalog/mailchimp.cjs +0 -2
  1336. package/dist/node_modules/@openhands/extensions/integrations/catalog/mailchimp.cjs.map +0 -1
  1337. package/dist/node_modules/@openhands/extensions/integrations/catalog/mailchimp.js +0 -35
  1338. package/dist/node_modules/@openhands/extensions/integrations/catalog/mailchimp.js.map +0 -1
  1339. package/dist/node_modules/@openhands/extensions/integrations/catalog/pipedrive.cjs +0 -2
  1340. package/dist/node_modules/@openhands/extensions/integrations/catalog/pipedrive.cjs.map +0 -1
  1341. package/dist/node_modules/@openhands/extensions/integrations/catalog/pipedrive.js +0 -35
  1342. package/dist/node_modules/@openhands/extensions/integrations/catalog/pipedrive.js.map +0 -1
  1343. package/dist/node_modules/@openhands/extensions/integrations/catalog/plaid.cjs +0 -2
  1344. package/dist/node_modules/@openhands/extensions/integrations/catalog/plaid.cjs.map +0 -1
  1345. package/dist/node_modules/@openhands/extensions/integrations/catalog/plaid.js +0 -28
  1346. package/dist/node_modules/@openhands/extensions/integrations/catalog/plaid.js.map +0 -1
  1347. package/dist/node_modules/@openhands/extensions/integrations/catalog/servicenow.cjs +0 -2
  1348. package/dist/node_modules/@openhands/extensions/integrations/catalog/servicenow.cjs.map +0 -1
  1349. package/dist/node_modules/@openhands/extensions/integrations/catalog/servicenow.js +0 -35
  1350. package/dist/node_modules/@openhands/extensions/integrations/catalog/servicenow.js.map +0 -1
  1351. package/dist/node_modules/@openhands/extensions/integrations/catalog/shopify.cjs +0 -2
  1352. package/dist/node_modules/@openhands/extensions/integrations/catalog/shopify.cjs.map +0 -1
  1353. package/dist/node_modules/@openhands/extensions/integrations/catalog/shopify.js +0 -35
  1354. package/dist/node_modules/@openhands/extensions/integrations/catalog/shopify.js.map +0 -1
  1355. package/dist/node_modules/@openhands/extensions/integrations/catalog/zendesk.cjs +0 -2
  1356. package/dist/node_modules/@openhands/extensions/integrations/catalog/zendesk.cjs.map +0 -1
  1357. package/dist/node_modules/@openhands/extensions/integrations/catalog/zendesk.js +0 -35
  1358. package/dist/node_modules/@openhands/extensions/integrations/catalog/zendesk.js.map +0 -1
  1359. /package/build/assets/{agent-server-ui-style-scope-CIDFDeQb.js → agent-server-ui-style-scope-COnDHTm5.js} +0 -0
  1360. /package/build/assets/{automation-DNgDxqtq.js → automation-BU8zu-FP.js} +0 -0
  1361. /package/build/assets/{common-KeiA2Rod.js → common-Dh7OqABE.js} +0 -0
  1362. /package/build/assets/{environment-switch-store-BpKxp6Xq.js → environment-switch-store-DkjlKWzN.js} +0 -0
  1363. /package/build/assets/{extension-module-card-classes-DvvyImGv.js → extension-module-card-classes-9V3J9J_b.js} +0 -0
  1364. /package/build/assets/{git-status-mapper-B3_HbzUT.js → git-status-mapper-BI8FyUVp.js} +0 -0
  1365. /package/build/assets/{handle-capture-consent-BChvj6mt.js → handle-capture-consent-CPMXU29K.js} +0 -0
  1366. /package/build/assets/{llm-subscription-C1xDoa3K.js → llm-subscription-DtsX5Lhg.js} +0 -0
  1367. /package/build/assets/{map-provider-MonJL5SS.js → map-provider-BM2SJarp.js} +0 -0
  1368. /package/build/assets/{objectWithoutPropertiesLoose-BRYudkUn.js → objectWithoutPropertiesLoose-BgYIAs2y.js} +0 -0
  1369. /package/build/assets/{rolldown-runtime-wFmyQBCi.js → rolldown-runtime-BFRubm34.js} +0 -0
  1370. /package/build/assets/{settings-like-page-layout-classes-DNg2vKSM.js → settings-like-page-layout-classes-DENKlZpD.js} +0 -0
  1371. /package/build/assets/{v4-BMWDcIWQ.js → v4-DbCkTSoU.js} +0 -0
  1372. /package/build/assets/{vendor~browser-yZEspfT9.js → vendor~browser-Dqd33JyP.js} +0 -0
  1373. /package/build/assets/{vendor~terminal-CcUoOdAH.js → vendor~terminal-aeP3PnKf.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"handle-event-for-ui.cjs","names":[],"sources":["../../src/utils/handle-event-for-ui.ts"],"sourcesContent":["import { MessageEvent, OpenHandsEvent } from \"#/types/agent-server/core\";\nimport {\n isACPToolCallEvent,\n isActionEvent,\n isMessageEvent,\n isObservationEvent,\n isStreamingDeltaEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { StreamingDeltaEvent } from \"#/types/agent-server/core/events/streaming-delta-event\";\n\nexport const mergeStreamingDeltaEvent = (\n incoming: StreamingDeltaEvent,\n existing: StreamingDeltaEvent,\n): StreamingDeltaEvent => ({\n ...existing,\n content: `${existing.content ?? \"\"}${incoming.content ?? \"\"}` || null,\n reasoning_content:\n `${existing.reasoning_content ?? \"\"}${incoming.reasoning_content ?? \"\"}` ||\n null,\n});\n\nconst appendContentToStreamingDeltaEvent = (\n existing: StreamingDeltaEvent,\n content: string,\n): StreamingDeltaEvent => ({\n ...existing,\n content: `${existing.content ?? \"\"}${content}` || null,\n});\n\nconst findLastUserMessageIndex = (events: OpenHandsEvent[]): number => {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (isMessageEvent(event) && event.source === \"user\") {\n return index;\n }\n }\n return -1;\n};\n\n// Join text blocks WITHOUT a separator: streaming deltas concatenate content\n// tokens directly with no separator between LLM content blocks, so using \"\\n\"\n// here would cause startsWith/findTextSegmentsInOrder to miss when reconciling\n// a multi-block MessageEvent against the already-rendered streaming delta.\nconst getAgentMessageText = (event: MessageEvent): string =>\n event.llm_message.content\n .filter((content) => content.type === \"text\")\n .map((content) => content.text)\n .join(\"\");\n\nconst getFinalAgentText = (event: OpenHandsEvent): string | null => {\n if (isActionEvent(event) && event.action.kind === \"FinishAction\") {\n return event.action.message;\n }\n\n if (isMessageEvent(event) && event.source === \"agent\") {\n return getAgentMessageText(event);\n }\n\n return null;\n};\n\nconst findTextSegmentsInOrder = (\n text: string,\n segments: string[],\n): { matched: boolean; lastMatchEnd: number } => {\n let searchStart = 0;\n let lastMatchEnd = 0;\n\n for (const segment of segments) {\n const index = text.indexOf(segment, searchStart);\n if (index === -1) {\n return { matched: false, lastMatchEnd };\n }\n lastMatchEnd = index + segment.length;\n searchStart = lastMatchEnd;\n }\n\n return { matched: true, lastMatchEnd };\n};\n\nconst finalizeStreamingDeltasInPlace = (\n finalEvent: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n const lastUserMessageIndex = findLastUserMessageIndex(uiEvents);\n const currentTurnStreamingDeltaIndexes = uiEvents\n .map((uiEvent, index) => ({ uiEvent, index }))\n .filter(\n ({ uiEvent, index }) =>\n index > lastUserMessageIndex && isStreamingDeltaEvent(uiEvent),\n )\n .map(({ index }) => index);\n\n if (currentTurnStreamingDeltaIndexes.length === 0) {\n return null;\n }\n\n const finalText = getFinalAgentText(finalEvent);\n // Only the regular `content` field participates in reconciliation.\n // Reasoning-only deltas (those that carry only `reasoning_content`) produce\n // an empty streamingSegments list, causing the function to return null so\n // the finalEvent is appended normally. This is intentional: reasoning\n // content renders in its own collapsed bubble and never overlaps with the\n // assistant's regular message text in `FinishAction.message`.\n const contentStreamingDeltas = currentTurnStreamingDeltaIndexes\n .map((index) => ({ event: uiEvents[index], index }))\n .filter(\n (item): item is { event: StreamingDeltaEvent; index: number } =>\n isStreamingDeltaEvent(item.event) &&\n (item.event.content?.length ?? 0) > 0,\n );\n const streamingSegments = contentStreamingDeltas.map(\n ({ event }) => event.content ?? \"\",\n );\n\n if (!finalText || streamingSegments.length === 0) {\n return null;\n }\n\n const nextUiEvents = [...uiEvents];\n const streamedText = streamingSegments.join(\"\");\n let unstreamedSuffix = \"\";\n\n if (finalText.startsWith(streamedText)) {\n unstreamedSuffix = finalText.slice(streamedText.length);\n } else {\n const match = findTextSegmentsInOrder(finalText, streamingSegments);\n if (!match.matched) {\n return null;\n }\n unstreamedSuffix = finalText.slice(match.lastMatchEnd);\n }\n\n const lastDeltaIndex = contentStreamingDeltas.at(-1)?.index;\n const lastDelta =\n lastDeltaIndex === undefined ? undefined : nextUiEvents[lastDeltaIndex];\n if (\n unstreamedSuffix &&\n lastDeltaIndex !== undefined &&\n lastDelta &&\n isStreamingDeltaEvent(lastDelta)\n ) {\n nextUiEvents[lastDeltaIndex] = appendContentToStreamingDeltaEvent(\n lastDelta,\n unstreamedSuffix,\n );\n }\n\n // Intentionally return nextUiEvents WITHOUT appending finalEvent.\n // The last content-bearing streaming delta (possibly extended with\n // unstreamedSuffix above) becomes the canonical final rendered bubble for\n // this turn. Appending finalEvent here would display the assistant message\n // twice.\n return nextUiEvents;\n};\n\n/**\n * Handles adding an event to the UI events array\n * Replaces actions with observations when they arrive (so UI shows observation instead of action)\n * Exception: ThinkAction is NOT replaced because the thought content is in the action, not in the observation\n *\n * ACPToolCallEvent merge: the SDK emits two events per ``tool_call_id`` — an\n * early ``started`` event (``pending`` / ``in_progress``) and one terminal\n * (completed / failed) event, the action->observation pair for a tool call.\n * Replace the started entry in place with the terminal one so a single card\n * updates from running to its result, exactly like an observation superseding\n * its action below.\n */\nexport const handleEventForUI = (\n event: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] => {\n const newUiEvents = [...uiEvents];\n\n if (isStreamingDeltaEvent(event)) {\n if (event.content === null && event.reasoning_content === null) {\n return newUiEvents;\n }\n\n const lastIndex = newUiEvents.length - 1;\n const lastEvent = newUiEvents[lastIndex];\n if (lastEvent && isStreamingDeltaEvent(lastEvent)) {\n newUiEvents[lastIndex] = mergeStreamingDeltaEvent(event, lastEvent);\n return newUiEvents;\n }\n\n newUiEvents.push(event);\n return newUiEvents;\n }\n\n if (\n (isActionEvent(event) && event.action.kind === \"FinishAction\") ||\n (isMessageEvent(event) && event.source === \"agent\")\n ) {\n const finalizedUiEvents = finalizeStreamingDeltasInPlace(\n event,\n newUiEvents,\n );\n if (finalizedUiEvents) {\n // The reconciled streaming delta intentionally replaces this final event\n // for rendering. Today streamed agent responses only render text and\n // reasoning content; if final-event metadata such as activated\n // microagents becomes meaningful for streamed responses, add a rendered\n // wrapper that carries both the stable delta identity and that metadata.\n return finalizedUiEvents;\n }\n }\n\n if (isACPToolCallEvent(event)) {\n const existingIndex = newUiEvents.findIndex(\n (uiEvent) =>\n isACPToolCallEvent(uiEvent) &&\n uiEvent.tool_call_id === event.tool_call_id,\n );\n if (existingIndex !== -1) {\n newUiEvents[existingIndex] = event;\n } else {\n newUiEvents.push(event);\n }\n return newUiEvents;\n }\n\n if (isObservationEvent(event)) {\n // Don't add ThinkObservation at all - we keep the ThinkAction instead\n // The thought content is in the action, not the observation\n if (event.observation.kind === \"ThinkObservation\") {\n return newUiEvents;\n }\n\n // Don't add FinishObservation at all - we keep the FinishAction instead\n // Both contain the same message content, so we only need to display one\n // This also prevents duplicate messages when events arrive out of order due to React batching\n if (event.observation.kind === \"FinishObservation\") {\n return newUiEvents;\n }\n\n // Find and replace the corresponding action from uiEvents\n const actionIndex = newUiEvents.findIndex(\n (uiEvent) => uiEvent.id === event.action_id,\n );\n if (actionIndex !== -1) {\n newUiEvents[actionIndex] = event;\n } else {\n // Action not found in uiEvents, just add the observation\n newUiEvents.push(event);\n }\n } else {\n // For non-observation events, just add them to uiEvents\n newUiEvents.push(event);\n }\n\n return newUiEvents;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"handle-event-for-ui.cjs","names":[],"sources":["../../src/utils/handle-event-for-ui.ts"],"sourcesContent":["import {\n ActionEvent,\n ImageContent,\n OpenHandsEvent,\n TextContent,\n} from \"#/types/agent-server/core\";\nimport {\n isACPToolCallEvent,\n isActionEvent,\n isMessageEvent,\n isObservationEvent,\n isStreamingDeltaEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { StreamingDeltaEvent } from \"#/types/agent-server/core/events/streaming-delta-event\";\nimport { getReasoningContent } from \"#/components/conversation-events/chat/event-thought-helpers\";\n\nexport const mergeStreamingDeltaEvent = (\n incoming: StreamingDeltaEvent,\n existing: StreamingDeltaEvent,\n): StreamingDeltaEvent => ({\n ...existing,\n content: `${existing.content ?? \"\"}${incoming.content ?? \"\"}` || null,\n reasoning_content:\n `${existing.reasoning_content ?? \"\"}${incoming.reasoning_content ?? \"\"}` ||\n null,\n});\n\nconst appendContentToStreamingDeltaEvent = (\n existing: StreamingDeltaEvent,\n content: string,\n): StreamingDeltaEvent => ({\n ...existing,\n content: `${existing.content ?? \"\"}${content}` || null,\n});\n\nconst findLastUserMessageIndex = (events: OpenHandsEvent[]): number => {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (isMessageEvent(event) && event.source === \"user\") {\n return index;\n }\n }\n return -1;\n};\n\n// Join text blocks WITHOUT a separator: streaming deltas concatenate content\n// tokens directly with no separator between LLM content blocks, so using \"\\n\"\n// here would cause startsWith/findTextSegmentsInOrder to miss when reconciling\n// a multi-block message/thought against the already-rendered streaming delta.\nconst joinTextBlocks = (blocks: (TextContent | ImageContent)[]): string =>\n blocks\n .filter((block) => block.type === \"text\")\n .map((block) => block.text)\n .join(\"\");\n\nconst getFinalAgentText = (event: OpenHandsEvent): string | null => {\n if (isActionEvent(event) && event.action.kind === \"FinishAction\") {\n return event.action.message;\n }\n\n if (isMessageEvent(event) && event.source === \"agent\") {\n return joinTextBlocks(event.llm_message.content);\n }\n\n return null;\n};\n\nconst findTextSegmentsInOrder = (\n text: string,\n segments: string[],\n): { matched: boolean; lastMatchEnd: number } => {\n let searchStart = 0;\n let lastMatchEnd = 0;\n\n for (const segment of segments) {\n const index = text.indexOf(segment, searchStart);\n if (index === -1) {\n return { matched: false, lastMatchEnd };\n }\n lastMatchEnd = index + segment.length;\n searchStart = lastMatchEnd;\n }\n\n return { matched: true, lastMatchEnd };\n};\n\n// Content-bearing streaming deltas of the current turn (after the last user\n// message). Reasoning-only deltas are excluded: reasoning renders in its own\n// collapsed bubble and never overlaps the message text being reconciled.\nconst getCurrentTurnContentDeltas = (\n uiEvents: OpenHandsEvent[],\n): { event: StreamingDeltaEvent; index: number }[] => {\n const lastUserMessageIndex = findLastUserMessageIndex(uiEvents);\n return uiEvents\n .map((event, index) => ({ event, index }))\n .filter(\n (item): item is { event: StreamingDeltaEvent; index: number } =>\n item.index > lastUserMessageIndex &&\n isStreamingDeltaEvent(item.event) &&\n (item.event.content?.length ?? 0) > 0,\n );\n};\n\n// The current step's streaming delta(s): the trailing run at the end of\n// `uiEvents`. Earlier steps' deltas are separated by their observations, so\n// this never folds an earlier step's delta into the current one.\nconst getTrailingContentDeltas = (\n uiEvents: OpenHandsEvent[],\n): { event: StreamingDeltaEvent; index: number }[] => {\n const deltas: { event: StreamingDeltaEvent; index: number }[] = [];\n for (let index = uiEvents.length - 1; index >= 0; index -= 1) {\n const event = uiEvents[index];\n if (!isStreamingDeltaEvent(event)) {\n break;\n }\n if ((event.content?.length ?? 0) > 0) {\n deltas.unshift({ event, index });\n }\n }\n return deltas;\n};\n\n// Whether the streamed `segments` (in order) reconcile against `targetText`.\n// `lastMatchEnd` is the offset past the matched text, so callers can recover\n// any not-yet-streamed suffix. The SDK strips the finalized text, so it may\n// lack trailing whitespace the model streamed; the match tolerates that by\n// also trying the trailing-trimmed streamed text.\nconst matchStreamedSegments = (\n targetText: string,\n segments: string[],\n): { matched: boolean; lastMatchEnd: number } => {\n const streamedText = segments.join(\"\");\n for (const candidate of [streamedText, streamedText.trimEnd()]) {\n if (candidate && targetText.startsWith(candidate)) {\n return { matched: true, lastMatchEnd: candidate.length };\n }\n }\n // Segments may be interleaved with not-yet-streamed text; locate them in\n // order, trimming the last segment's trailing whitespace.\n const lastIndex = segments.length - 1;\n const searchSegments = segments.map((segment, index) =>\n index === lastIndex ? segment.trimEnd() : segment,\n );\n return findTextSegmentsInOrder(targetText, searchSegments);\n};\n\nconst finalizeStreamingDeltasInPlace = (\n finalEvent: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n const contentStreamingDeltas = getCurrentTurnContentDeltas(uiEvents);\n if (contentStreamingDeltas.length === 0) {\n return null;\n }\n\n const finalText = getFinalAgentText(finalEvent);\n if (!finalText) {\n return null;\n }\n\n const streamingSegments = contentStreamingDeltas.map(\n ({ event }) => event.content ?? \"\",\n );\n const { matched, lastMatchEnd } = matchStreamedSegments(\n finalText,\n streamingSegments,\n );\n if (!matched) {\n return null;\n }\n\n const nextUiEvents = [...uiEvents];\n const unstreamedSuffix = finalText.slice(lastMatchEnd);\n\n const lastDeltaIndex = contentStreamingDeltas.at(-1)?.index;\n const lastDelta =\n lastDeltaIndex === undefined ? undefined : nextUiEvents[lastDeltaIndex];\n if (\n unstreamedSuffix &&\n lastDeltaIndex !== undefined &&\n lastDelta &&\n isStreamingDeltaEvent(lastDelta)\n ) {\n nextUiEvents[lastDeltaIndex] = appendContentToStreamingDeltaEvent(\n lastDelta,\n unstreamedSuffix,\n );\n }\n\n // Intentionally return nextUiEvents WITHOUT appending finalEvent.\n // The last content-bearing streaming delta (possibly extended with\n // unstreamedSuffix above) becomes the canonical final rendered bubble for\n // this turn. Appending finalEvent here would display the assistant message\n // twice.\n return nextUiEvents;\n};\n\n/**\n * Reconcile the current turn's streaming delta when an intermediate\n * (tool-calling) `ActionEvent` arrives. With `stream=true` the step's\n * pre-tool-call text is streamed as delta `content`, then the action's\n * `thought` repeats it and the chat hoists that into its own message (see\n * `group-events.ts`), so the text would render twice (issue #1534).\n *\n * Unlike `finalizeStreamingDeltasInPlace` (which drops the final event and\n * keeps the delta), the action must stay — it owns the tool call. So the\n * streamed text is cleared from the delta instead, and the delta is kept only\n * to carry reasoning the action itself lacks (for many models the delta is the\n * sole reasoning carrier), otherwise dropped.\n *\n * Only the current step's trailing delta run is considered. Returns the updated\n * array, or `null` when there is nothing to reconcile.\n */\nconst supersedeStreamedThoughtWithAction = (\n action: ActionEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n const thoughtText = joinTextBlocks(action.thought);\n if (!thoughtText) {\n return null;\n }\n\n const contentDeltas = getTrailingContentDeltas(uiEvents);\n if (contentDeltas.length === 0) {\n return null;\n }\n\n const streamingSegments = contentDeltas.map(\n ({ event }) => event.content ?? \"\",\n );\n\n // Only strip when the streamed text is the action's rendered thought.\n if (!matchStreamedSegments(thoughtText, streamingSegments).matched) {\n return null;\n }\n\n // Keeping the delta's reasoning would duplicate the action's own \"Thinking\".\n const actionRendersReasoning = getReasoningContent(action).trim().length > 0;\n const indexesToStrip = new Set(contentDeltas.map(({ index }) => index));\n const nextUiEvents: OpenHandsEvent[] = [];\n uiEvents.forEach((event, index) => {\n if (!indexesToStrip.has(index) || !isStreamingDeltaEvent(event)) {\n nextUiEvents.push(event);\n return;\n }\n // Keep the delta only to render reasoning the action itself lacks.\n if (!actionRendersReasoning && event.reasoning_content) {\n nextUiEvents.push({ ...event, content: null });\n }\n });\n\n return nextUiEvents;\n};\n\n/**\n * Handles adding an event to the UI events array\n * Replaces actions with observations when they arrive (so UI shows observation instead of action)\n * Exception: ThinkAction is NOT replaced because the thought content is in the action, not in the observation\n *\n * ACPToolCallEvent merge: the SDK emits two events per ``tool_call_id`` — an\n * early ``started`` event (``pending`` / ``in_progress``) and one terminal\n * (completed / failed) event, the action->observation pair for a tool call.\n * Replace the started entry in place with the terminal one so a single card\n * updates from running to its result, exactly like an observation superseding\n * its action below.\n */\nexport const handleEventForUI = (\n event: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] => {\n const newUiEvents = [...uiEvents];\n\n if (isStreamingDeltaEvent(event)) {\n if (event.content === null && event.reasoning_content === null) {\n return newUiEvents;\n }\n\n const lastIndex = newUiEvents.length - 1;\n const lastEvent = newUiEvents[lastIndex];\n if (lastEvent && isStreamingDeltaEvent(lastEvent)) {\n newUiEvents[lastIndex] = mergeStreamingDeltaEvent(event, lastEvent);\n return newUiEvents;\n }\n\n newUiEvents.push(event);\n return newUiEvents;\n }\n\n if (\n (isActionEvent(event) && event.action.kind === \"FinishAction\") ||\n (isMessageEvent(event) && event.source === \"agent\")\n ) {\n const finalizedUiEvents = finalizeStreamingDeltasInPlace(\n event,\n newUiEvents,\n );\n if (finalizedUiEvents) {\n // The reconciled streaming delta intentionally replaces this final event\n // for rendering. Today streamed agent responses only render text and\n // reasoning content; if final-event metadata such as activated\n // microagents becomes meaningful for streamed responses, add a rendered\n // wrapper that carries both the stable delta identity and that metadata.\n return finalizedUiEvents;\n }\n }\n\n // Intermediate tool-calling action whose thought was streamed: clear the\n // duplicated text from the delta (issue #1534). ThinkAction is excluded — its\n // thought renders through its own collapsible, not a hoisted thought.\n if (\n isActionEvent(event) &&\n event.action.kind !== \"FinishAction\" &&\n event.action.kind !== \"ThinkAction\"\n ) {\n const reconciledUiEvents = supersedeStreamedThoughtWithAction(\n event,\n newUiEvents,\n );\n if (reconciledUiEvents) {\n reconciledUiEvents.push(event);\n return reconciledUiEvents;\n }\n }\n\n if (isACPToolCallEvent(event)) {\n const existingIndex = newUiEvents.findIndex(\n (uiEvent) =>\n isACPToolCallEvent(uiEvent) &&\n uiEvent.tool_call_id === event.tool_call_id,\n );\n if (existingIndex !== -1) {\n newUiEvents[existingIndex] = event;\n } else {\n newUiEvents.push(event);\n }\n return newUiEvents;\n }\n\n if (isObservationEvent(event)) {\n // Don't add ThinkObservation at all - we keep the ThinkAction instead\n // The thought content is in the action, not the observation\n if (event.observation.kind === \"ThinkObservation\") {\n return newUiEvents;\n }\n\n // Don't add FinishObservation at all - we keep the FinishAction instead\n // Both contain the same message content, so we only need to display one\n // This also prevents duplicate messages when events arrive out of order due to React batching\n if (event.observation.kind === \"FinishObservation\") {\n return newUiEvents;\n }\n\n // Find and replace the corresponding action from uiEvents\n const actionIndex = newUiEvents.findIndex(\n (uiEvent) => uiEvent.id === event.action_id,\n );\n if (actionIndex !== -1) {\n newUiEvents[actionIndex] = event;\n } else {\n // Action not found in uiEvents, just add the observation\n newUiEvents.push(event);\n }\n } else {\n // For non-observation events, just add them to uiEvents\n newUiEvents.push(event);\n }\n\n return newUiEvents;\n};\n"],"mappings":"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"}
@@ -1,19 +1,20 @@
1
1
  import { isACPToolCallEvent as e, isActionEvent as t, isMessageEvent as n, isObservationEvent as r, isStreamingDeltaEvent as i } from "../types/agent-server/type-guards.js";
2
+ import { getReasoningContent as a } from "../components/conversation-events/chat/event-thought-helpers.js";
2
3
  //#region src/utils/handle-event-for-ui.ts
3
- var a = (e, t) => ({
4
+ var o = (e, t) => ({
4
5
  ...t,
5
6
  content: `${t.content ?? ""}${e.content ?? ""}` || null,
6
7
  reasoning_content: `${t.reasoning_content ?? ""}${e.reasoning_content ?? ""}` || null
7
- }), o = (e, t) => ({
8
+ }), s = (e, t) => ({
8
9
  ...e,
9
10
  content: `${e.content ?? ""}${t}` || null
10
- }), s = (e) => {
11
+ }), c = (e) => {
11
12
  for (let t = e.length - 1; t >= 0; --t) {
12
13
  let r = e[t];
13
14
  if (n(r) && r.source === "user") return t;
14
15
  }
15
16
  return -1;
16
- }, c = (e) => e.llm_message.content.filter((e) => e.type === "text").map((e) => e.text).join(""), l = (e) => t(e) && e.action.kind === "FinishAction" ? e.action.message : n(e) && e.source === "agent" ? c(e) : null, u = (e, t) => {
17
+ }, l = (e) => e.filter((e) => e.type === "text").map((e) => e.text).join(""), u = (e) => t(e) && e.action.kind === "FinishAction" ? e.action.message : n(e) && e.source === "agent" ? l(e.llm_message.content) : null, d = (e, t) => {
17
18
  let n = 0, r = 0;
18
19
  for (let i of t) {
19
20
  let t = e.indexOf(i, n);
@@ -27,49 +28,83 @@ var a = (e, t) => ({
27
28
  matched: !0,
28
29
  lastMatchEnd: r
29
30
  };
30
- }, d = (e, t) => {
31
- let n = s(t), r = t.map((e, t) => ({
32
- uiEvent: e,
31
+ }, f = (e) => {
32
+ let t = c(e);
33
+ return e.map((e, t) => ({
34
+ event: e,
33
35
  index: t
34
- })).filter(({ uiEvent: e, index: t }) => t > n && i(e)).map(({ index: e }) => e);
35
- if (r.length === 0) return null;
36
- let a = l(e), c = r.map((e) => ({
37
- event: t[e],
38
- index: e
39
- })).filter((e) => i(e.event) && (e.event.content?.length ?? 0) > 0), d = c.map(({ event: e }) => e.content ?? "");
40
- if (!a || d.length === 0) return null;
41
- let f = [...t], p = d.join(""), m = "";
42
- if (a.startsWith(p)) m = a.slice(p.length);
43
- else {
44
- let e = u(a, d);
45
- if (!e.matched) return null;
46
- m = a.slice(e.lastMatchEnd);
36
+ })).filter((e) => e.index > t && i(e.event) && (e.event.content?.length ?? 0) > 0);
37
+ }, p = (e) => {
38
+ let t = [];
39
+ for (let n = e.length - 1; n >= 0; --n) {
40
+ let r = e[n];
41
+ if (!i(r)) break;
42
+ (r.content?.length ?? 0) > 0 && t.unshift({
43
+ event: r,
44
+ index: n
45
+ });
47
46
  }
48
- let h = c.at(-1)?.index, g = h === void 0 ? void 0 : f[h];
49
- return m && h !== void 0 && g && i(g) && (f[h] = o(g, m)), f;
50
- }, f = (o, s) => {
47
+ return t;
48
+ }, m = (e, t) => {
49
+ let n = t.join("");
50
+ for (let t of [n, n.trimEnd()]) if (t && e.startsWith(t)) return {
51
+ matched: !0,
52
+ lastMatchEnd: t.length
53
+ };
54
+ let r = t.length - 1;
55
+ return d(e, t.map((e, t) => t === r ? e.trimEnd() : e));
56
+ }, h = (e, t) => {
57
+ let n = f(t);
58
+ if (n.length === 0) return null;
59
+ let r = u(e);
60
+ if (!r) return null;
61
+ let { matched: a, lastMatchEnd: o } = m(r, n.map(({ event: e }) => e.content ?? ""));
62
+ if (!a) return null;
63
+ let c = [...t], l = r.slice(o), d = n.at(-1)?.index, p = d === void 0 ? void 0 : c[d];
64
+ return l && d !== void 0 && p && i(p) && (c[d] = s(p, l)), c;
65
+ }, g = (e, t) => {
66
+ let n = l(e.thought);
67
+ if (!n) return null;
68
+ let r = p(t);
69
+ if (r.length === 0 || !m(n, r.map(({ event: e }) => e.content ?? "")).matched) return null;
70
+ let o = a(e).trim().length > 0, s = new Set(r.map(({ index: e }) => e)), c = [];
71
+ return t.forEach((e, t) => {
72
+ if (!s.has(t) || !i(e)) {
73
+ c.push(e);
74
+ return;
75
+ }
76
+ !o && e.reasoning_content && c.push({
77
+ ...e,
78
+ content: null
79
+ });
80
+ }), c;
81
+ }, _ = (a, s) => {
51
82
  let c = [...s];
52
- if (i(o)) {
53
- if (o.content === null && o.reasoning_content === null) return c;
83
+ if (i(a)) {
84
+ if (a.content === null && a.reasoning_content === null) return c;
54
85
  let e = c.length - 1, t = c[e];
55
- return t && i(t) ? (c[e] = a(o, t), c) : (c.push(o), c);
86
+ return t && i(t) ? (c[e] = o(a, t), c) : (c.push(a), c);
56
87
  }
57
- if (t(o) && o.action.kind === "FinishAction" || n(o) && o.source === "agent") {
58
- let e = d(o, c);
88
+ if (t(a) && a.action.kind === "FinishAction" || n(a) && a.source === "agent") {
89
+ let e = h(a, c);
59
90
  if (e) return e;
60
91
  }
61
- if (e(o)) {
62
- let t = c.findIndex((t) => e(t) && t.tool_call_id === o.tool_call_id);
63
- return t === -1 ? c.push(o) : c[t] = o, c;
92
+ if (t(a) && a.action.kind !== "FinishAction" && a.action.kind !== "ThinkAction") {
93
+ let e = g(a, c);
94
+ if (e) return e.push(a), e;
95
+ }
96
+ if (e(a)) {
97
+ let t = c.findIndex((t) => e(t) && t.tool_call_id === a.tool_call_id);
98
+ return t === -1 ? c.push(a) : c[t] = a, c;
64
99
  }
65
- if (r(o)) {
66
- if (o.observation.kind === "ThinkObservation" || o.observation.kind === "FinishObservation") return c;
67
- let e = c.findIndex((e) => e.id === o.action_id);
68
- e === -1 ? c.push(o) : c[e] = o;
69
- } else c.push(o);
100
+ if (r(a)) {
101
+ if (a.observation.kind === "ThinkObservation" || a.observation.kind === "FinishObservation") return c;
102
+ let e = c.findIndex((e) => e.id === a.action_id);
103
+ e === -1 ? c.push(a) : c[e] = a;
104
+ } else c.push(a);
70
105
  return c;
71
106
  };
72
107
  //#endregion
73
- export { f as handleEventForUI, a as mergeStreamingDeltaEvent };
108
+ export { _ as handleEventForUI, o as mergeStreamingDeltaEvent };
74
109
 
75
110
  //# sourceMappingURL=handle-event-for-ui.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handle-event-for-ui.js","names":[],"sources":["../../src/utils/handle-event-for-ui.ts"],"sourcesContent":["import { MessageEvent, OpenHandsEvent } from \"#/types/agent-server/core\";\nimport {\n isACPToolCallEvent,\n isActionEvent,\n isMessageEvent,\n isObservationEvent,\n isStreamingDeltaEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { StreamingDeltaEvent } from \"#/types/agent-server/core/events/streaming-delta-event\";\n\nexport const mergeStreamingDeltaEvent = (\n incoming: StreamingDeltaEvent,\n existing: StreamingDeltaEvent,\n): StreamingDeltaEvent => ({\n ...existing,\n content: `${existing.content ?? \"\"}${incoming.content ?? \"\"}` || null,\n reasoning_content:\n `${existing.reasoning_content ?? \"\"}${incoming.reasoning_content ?? \"\"}` ||\n null,\n});\n\nconst appendContentToStreamingDeltaEvent = (\n existing: StreamingDeltaEvent,\n content: string,\n): StreamingDeltaEvent => ({\n ...existing,\n content: `${existing.content ?? \"\"}${content}` || null,\n});\n\nconst findLastUserMessageIndex = (events: OpenHandsEvent[]): number => {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (isMessageEvent(event) && event.source === \"user\") {\n return index;\n }\n }\n return -1;\n};\n\n// Join text blocks WITHOUT a separator: streaming deltas concatenate content\n// tokens directly with no separator between LLM content blocks, so using \"\\n\"\n// here would cause startsWith/findTextSegmentsInOrder to miss when reconciling\n// a multi-block MessageEvent against the already-rendered streaming delta.\nconst getAgentMessageText = (event: MessageEvent): string =>\n event.llm_message.content\n .filter((content) => content.type === \"text\")\n .map((content) => content.text)\n .join(\"\");\n\nconst getFinalAgentText = (event: OpenHandsEvent): string | null => {\n if (isActionEvent(event) && event.action.kind === \"FinishAction\") {\n return event.action.message;\n }\n\n if (isMessageEvent(event) && event.source === \"agent\") {\n return getAgentMessageText(event);\n }\n\n return null;\n};\n\nconst findTextSegmentsInOrder = (\n text: string,\n segments: string[],\n): { matched: boolean; lastMatchEnd: number } => {\n let searchStart = 0;\n let lastMatchEnd = 0;\n\n for (const segment of segments) {\n const index = text.indexOf(segment, searchStart);\n if (index === -1) {\n return { matched: false, lastMatchEnd };\n }\n lastMatchEnd = index + segment.length;\n searchStart = lastMatchEnd;\n }\n\n return { matched: true, lastMatchEnd };\n};\n\nconst finalizeStreamingDeltasInPlace = (\n finalEvent: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n const lastUserMessageIndex = findLastUserMessageIndex(uiEvents);\n const currentTurnStreamingDeltaIndexes = uiEvents\n .map((uiEvent, index) => ({ uiEvent, index }))\n .filter(\n ({ uiEvent, index }) =>\n index > lastUserMessageIndex && isStreamingDeltaEvent(uiEvent),\n )\n .map(({ index }) => index);\n\n if (currentTurnStreamingDeltaIndexes.length === 0) {\n return null;\n }\n\n const finalText = getFinalAgentText(finalEvent);\n // Only the regular `content` field participates in reconciliation.\n // Reasoning-only deltas (those that carry only `reasoning_content`) produce\n // an empty streamingSegments list, causing the function to return null so\n // the finalEvent is appended normally. This is intentional: reasoning\n // content renders in its own collapsed bubble and never overlaps with the\n // assistant's regular message text in `FinishAction.message`.\n const contentStreamingDeltas = currentTurnStreamingDeltaIndexes\n .map((index) => ({ event: uiEvents[index], index }))\n .filter(\n (item): item is { event: StreamingDeltaEvent; index: number } =>\n isStreamingDeltaEvent(item.event) &&\n (item.event.content?.length ?? 0) > 0,\n );\n const streamingSegments = contentStreamingDeltas.map(\n ({ event }) => event.content ?? \"\",\n );\n\n if (!finalText || streamingSegments.length === 0) {\n return null;\n }\n\n const nextUiEvents = [...uiEvents];\n const streamedText = streamingSegments.join(\"\");\n let unstreamedSuffix = \"\";\n\n if (finalText.startsWith(streamedText)) {\n unstreamedSuffix = finalText.slice(streamedText.length);\n } else {\n const match = findTextSegmentsInOrder(finalText, streamingSegments);\n if (!match.matched) {\n return null;\n }\n unstreamedSuffix = finalText.slice(match.lastMatchEnd);\n }\n\n const lastDeltaIndex = contentStreamingDeltas.at(-1)?.index;\n const lastDelta =\n lastDeltaIndex === undefined ? undefined : nextUiEvents[lastDeltaIndex];\n if (\n unstreamedSuffix &&\n lastDeltaIndex !== undefined &&\n lastDelta &&\n isStreamingDeltaEvent(lastDelta)\n ) {\n nextUiEvents[lastDeltaIndex] = appendContentToStreamingDeltaEvent(\n lastDelta,\n unstreamedSuffix,\n );\n }\n\n // Intentionally return nextUiEvents WITHOUT appending finalEvent.\n // The last content-bearing streaming delta (possibly extended with\n // unstreamedSuffix above) becomes the canonical final rendered bubble for\n // this turn. Appending finalEvent here would display the assistant message\n // twice.\n return nextUiEvents;\n};\n\n/**\n * Handles adding an event to the UI events array\n * Replaces actions with observations when they arrive (so UI shows observation instead of action)\n * Exception: ThinkAction is NOT replaced because the thought content is in the action, not in the observation\n *\n * ACPToolCallEvent merge: the SDK emits two events per ``tool_call_id`` — an\n * early ``started`` event (``pending`` / ``in_progress``) and one terminal\n * (completed / failed) event, the action->observation pair for a tool call.\n * Replace the started entry in place with the terminal one so a single card\n * updates from running to its result, exactly like an observation superseding\n * its action below.\n */\nexport const handleEventForUI = (\n event: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] => {\n const newUiEvents = [...uiEvents];\n\n if (isStreamingDeltaEvent(event)) {\n if (event.content === null && event.reasoning_content === null) {\n return newUiEvents;\n }\n\n const lastIndex = newUiEvents.length - 1;\n const lastEvent = newUiEvents[lastIndex];\n if (lastEvent && isStreamingDeltaEvent(lastEvent)) {\n newUiEvents[lastIndex] = mergeStreamingDeltaEvent(event, lastEvent);\n return newUiEvents;\n }\n\n newUiEvents.push(event);\n return newUiEvents;\n }\n\n if (\n (isActionEvent(event) && event.action.kind === \"FinishAction\") ||\n (isMessageEvent(event) && event.source === \"agent\")\n ) {\n const finalizedUiEvents = finalizeStreamingDeltasInPlace(\n event,\n newUiEvents,\n );\n if (finalizedUiEvents) {\n // The reconciled streaming delta intentionally replaces this final event\n // for rendering. Today streamed agent responses only render text and\n // reasoning content; if final-event metadata such as activated\n // microagents becomes meaningful for streamed responses, add a rendered\n // wrapper that carries both the stable delta identity and that metadata.\n return finalizedUiEvents;\n }\n }\n\n if (isACPToolCallEvent(event)) {\n const existingIndex = newUiEvents.findIndex(\n (uiEvent) =>\n isACPToolCallEvent(uiEvent) &&\n uiEvent.tool_call_id === event.tool_call_id,\n );\n if (existingIndex !== -1) {\n newUiEvents[existingIndex] = event;\n } else {\n newUiEvents.push(event);\n }\n return newUiEvents;\n }\n\n if (isObservationEvent(event)) {\n // Don't add ThinkObservation at all - we keep the ThinkAction instead\n // The thought content is in the action, not the observation\n if (event.observation.kind === \"ThinkObservation\") {\n return newUiEvents;\n }\n\n // Don't add FinishObservation at all - we keep the FinishAction instead\n // Both contain the same message content, so we only need to display one\n // This also prevents duplicate messages when events arrive out of order due to React batching\n if (event.observation.kind === \"FinishObservation\") {\n return newUiEvents;\n }\n\n // Find and replace the corresponding action from uiEvents\n const actionIndex = newUiEvents.findIndex(\n (uiEvent) => uiEvent.id === event.action_id,\n );\n if (actionIndex !== -1) {\n newUiEvents[actionIndex] = event;\n } else {\n // Action not found in uiEvents, just add the observation\n newUiEvents.push(event);\n }\n } else {\n // For non-observation events, just add them to uiEvents\n newUiEvents.push(event);\n }\n\n return newUiEvents;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"handle-event-for-ui.js","names":[],"sources":["../../src/utils/handle-event-for-ui.ts"],"sourcesContent":["import {\n ActionEvent,\n ImageContent,\n OpenHandsEvent,\n TextContent,\n} from \"#/types/agent-server/core\";\nimport {\n isACPToolCallEvent,\n isActionEvent,\n isMessageEvent,\n isObservationEvent,\n isStreamingDeltaEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { StreamingDeltaEvent } from \"#/types/agent-server/core/events/streaming-delta-event\";\nimport { getReasoningContent } from \"#/components/conversation-events/chat/event-thought-helpers\";\n\nexport const mergeStreamingDeltaEvent = (\n incoming: StreamingDeltaEvent,\n existing: StreamingDeltaEvent,\n): StreamingDeltaEvent => ({\n ...existing,\n content: `${existing.content ?? \"\"}${incoming.content ?? \"\"}` || null,\n reasoning_content:\n `${existing.reasoning_content ?? \"\"}${incoming.reasoning_content ?? \"\"}` ||\n null,\n});\n\nconst appendContentToStreamingDeltaEvent = (\n existing: StreamingDeltaEvent,\n content: string,\n): StreamingDeltaEvent => ({\n ...existing,\n content: `${existing.content ?? \"\"}${content}` || null,\n});\n\nconst findLastUserMessageIndex = (events: OpenHandsEvent[]): number => {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (isMessageEvent(event) && event.source === \"user\") {\n return index;\n }\n }\n return -1;\n};\n\n// Join text blocks WITHOUT a separator: streaming deltas concatenate content\n// tokens directly with no separator between LLM content blocks, so using \"\\n\"\n// here would cause startsWith/findTextSegmentsInOrder to miss when reconciling\n// a multi-block message/thought against the already-rendered streaming delta.\nconst joinTextBlocks = (blocks: (TextContent | ImageContent)[]): string =>\n blocks\n .filter((block) => block.type === \"text\")\n .map((block) => block.text)\n .join(\"\");\n\nconst getFinalAgentText = (event: OpenHandsEvent): string | null => {\n if (isActionEvent(event) && event.action.kind === \"FinishAction\") {\n return event.action.message;\n }\n\n if (isMessageEvent(event) && event.source === \"agent\") {\n return joinTextBlocks(event.llm_message.content);\n }\n\n return null;\n};\n\nconst findTextSegmentsInOrder = (\n text: string,\n segments: string[],\n): { matched: boolean; lastMatchEnd: number } => {\n let searchStart = 0;\n let lastMatchEnd = 0;\n\n for (const segment of segments) {\n const index = text.indexOf(segment, searchStart);\n if (index === -1) {\n return { matched: false, lastMatchEnd };\n }\n lastMatchEnd = index + segment.length;\n searchStart = lastMatchEnd;\n }\n\n return { matched: true, lastMatchEnd };\n};\n\n// Content-bearing streaming deltas of the current turn (after the last user\n// message). Reasoning-only deltas are excluded: reasoning renders in its own\n// collapsed bubble and never overlaps the message text being reconciled.\nconst getCurrentTurnContentDeltas = (\n uiEvents: OpenHandsEvent[],\n): { event: StreamingDeltaEvent; index: number }[] => {\n const lastUserMessageIndex = findLastUserMessageIndex(uiEvents);\n return uiEvents\n .map((event, index) => ({ event, index }))\n .filter(\n (item): item is { event: StreamingDeltaEvent; index: number } =>\n item.index > lastUserMessageIndex &&\n isStreamingDeltaEvent(item.event) &&\n (item.event.content?.length ?? 0) > 0,\n );\n};\n\n// The current step's streaming delta(s): the trailing run at the end of\n// `uiEvents`. Earlier steps' deltas are separated by their observations, so\n// this never folds an earlier step's delta into the current one.\nconst getTrailingContentDeltas = (\n uiEvents: OpenHandsEvent[],\n): { event: StreamingDeltaEvent; index: number }[] => {\n const deltas: { event: StreamingDeltaEvent; index: number }[] = [];\n for (let index = uiEvents.length - 1; index >= 0; index -= 1) {\n const event = uiEvents[index];\n if (!isStreamingDeltaEvent(event)) {\n break;\n }\n if ((event.content?.length ?? 0) > 0) {\n deltas.unshift({ event, index });\n }\n }\n return deltas;\n};\n\n// Whether the streamed `segments` (in order) reconcile against `targetText`.\n// `lastMatchEnd` is the offset past the matched text, so callers can recover\n// any not-yet-streamed suffix. The SDK strips the finalized text, so it may\n// lack trailing whitespace the model streamed; the match tolerates that by\n// also trying the trailing-trimmed streamed text.\nconst matchStreamedSegments = (\n targetText: string,\n segments: string[],\n): { matched: boolean; lastMatchEnd: number } => {\n const streamedText = segments.join(\"\");\n for (const candidate of [streamedText, streamedText.trimEnd()]) {\n if (candidate && targetText.startsWith(candidate)) {\n return { matched: true, lastMatchEnd: candidate.length };\n }\n }\n // Segments may be interleaved with not-yet-streamed text; locate them in\n // order, trimming the last segment's trailing whitespace.\n const lastIndex = segments.length - 1;\n const searchSegments = segments.map((segment, index) =>\n index === lastIndex ? segment.trimEnd() : segment,\n );\n return findTextSegmentsInOrder(targetText, searchSegments);\n};\n\nconst finalizeStreamingDeltasInPlace = (\n finalEvent: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n const contentStreamingDeltas = getCurrentTurnContentDeltas(uiEvents);\n if (contentStreamingDeltas.length === 0) {\n return null;\n }\n\n const finalText = getFinalAgentText(finalEvent);\n if (!finalText) {\n return null;\n }\n\n const streamingSegments = contentStreamingDeltas.map(\n ({ event }) => event.content ?? \"\",\n );\n const { matched, lastMatchEnd } = matchStreamedSegments(\n finalText,\n streamingSegments,\n );\n if (!matched) {\n return null;\n }\n\n const nextUiEvents = [...uiEvents];\n const unstreamedSuffix = finalText.slice(lastMatchEnd);\n\n const lastDeltaIndex = contentStreamingDeltas.at(-1)?.index;\n const lastDelta =\n lastDeltaIndex === undefined ? undefined : nextUiEvents[lastDeltaIndex];\n if (\n unstreamedSuffix &&\n lastDeltaIndex !== undefined &&\n lastDelta &&\n isStreamingDeltaEvent(lastDelta)\n ) {\n nextUiEvents[lastDeltaIndex] = appendContentToStreamingDeltaEvent(\n lastDelta,\n unstreamedSuffix,\n );\n }\n\n // Intentionally return nextUiEvents WITHOUT appending finalEvent.\n // The last content-bearing streaming delta (possibly extended with\n // unstreamedSuffix above) becomes the canonical final rendered bubble for\n // this turn. Appending finalEvent here would display the assistant message\n // twice.\n return nextUiEvents;\n};\n\n/**\n * Reconcile the current turn's streaming delta when an intermediate\n * (tool-calling) `ActionEvent` arrives. With `stream=true` the step's\n * pre-tool-call text is streamed as delta `content`, then the action's\n * `thought` repeats it and the chat hoists that into its own message (see\n * `group-events.ts`), so the text would render twice (issue #1534).\n *\n * Unlike `finalizeStreamingDeltasInPlace` (which drops the final event and\n * keeps the delta), the action must stay — it owns the tool call. So the\n * streamed text is cleared from the delta instead, and the delta is kept only\n * to carry reasoning the action itself lacks (for many models the delta is the\n * sole reasoning carrier), otherwise dropped.\n *\n * Only the current step's trailing delta run is considered. Returns the updated\n * array, or `null` when there is nothing to reconcile.\n */\nconst supersedeStreamedThoughtWithAction = (\n action: ActionEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n const thoughtText = joinTextBlocks(action.thought);\n if (!thoughtText) {\n return null;\n }\n\n const contentDeltas = getTrailingContentDeltas(uiEvents);\n if (contentDeltas.length === 0) {\n return null;\n }\n\n const streamingSegments = contentDeltas.map(\n ({ event }) => event.content ?? \"\",\n );\n\n // Only strip when the streamed text is the action's rendered thought.\n if (!matchStreamedSegments(thoughtText, streamingSegments).matched) {\n return null;\n }\n\n // Keeping the delta's reasoning would duplicate the action's own \"Thinking\".\n const actionRendersReasoning = getReasoningContent(action).trim().length > 0;\n const indexesToStrip = new Set(contentDeltas.map(({ index }) => index));\n const nextUiEvents: OpenHandsEvent[] = [];\n uiEvents.forEach((event, index) => {\n if (!indexesToStrip.has(index) || !isStreamingDeltaEvent(event)) {\n nextUiEvents.push(event);\n return;\n }\n // Keep the delta only to render reasoning the action itself lacks.\n if (!actionRendersReasoning && event.reasoning_content) {\n nextUiEvents.push({ ...event, content: null });\n }\n });\n\n return nextUiEvents;\n};\n\n/**\n * Handles adding an event to the UI events array\n * Replaces actions with observations when they arrive (so UI shows observation instead of action)\n * Exception: ThinkAction is NOT replaced because the thought content is in the action, not in the observation\n *\n * ACPToolCallEvent merge: the SDK emits two events per ``tool_call_id`` — an\n * early ``started`` event (``pending`` / ``in_progress``) and one terminal\n * (completed / failed) event, the action->observation pair for a tool call.\n * Replace the started entry in place with the terminal one so a single card\n * updates from running to its result, exactly like an observation superseding\n * its action below.\n */\nexport const handleEventForUI = (\n event: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] => {\n const newUiEvents = [...uiEvents];\n\n if (isStreamingDeltaEvent(event)) {\n if (event.content === null && event.reasoning_content === null) {\n return newUiEvents;\n }\n\n const lastIndex = newUiEvents.length - 1;\n const lastEvent = newUiEvents[lastIndex];\n if (lastEvent && isStreamingDeltaEvent(lastEvent)) {\n newUiEvents[lastIndex] = mergeStreamingDeltaEvent(event, lastEvent);\n return newUiEvents;\n }\n\n newUiEvents.push(event);\n return newUiEvents;\n }\n\n if (\n (isActionEvent(event) && event.action.kind === \"FinishAction\") ||\n (isMessageEvent(event) && event.source === \"agent\")\n ) {\n const finalizedUiEvents = finalizeStreamingDeltasInPlace(\n event,\n newUiEvents,\n );\n if (finalizedUiEvents) {\n // The reconciled streaming delta intentionally replaces this final event\n // for rendering. Today streamed agent responses only render text and\n // reasoning content; if final-event metadata such as activated\n // microagents becomes meaningful for streamed responses, add a rendered\n // wrapper that carries both the stable delta identity and that metadata.\n return finalizedUiEvents;\n }\n }\n\n // Intermediate tool-calling action whose thought was streamed: clear the\n // duplicated text from the delta (issue #1534). ThinkAction is excluded — its\n // thought renders through its own collapsible, not a hoisted thought.\n if (\n isActionEvent(event) &&\n event.action.kind !== \"FinishAction\" &&\n event.action.kind !== \"ThinkAction\"\n ) {\n const reconciledUiEvents = supersedeStreamedThoughtWithAction(\n event,\n newUiEvents,\n );\n if (reconciledUiEvents) {\n reconciledUiEvents.push(event);\n return reconciledUiEvents;\n }\n }\n\n if (isACPToolCallEvent(event)) {\n const existingIndex = newUiEvents.findIndex(\n (uiEvent) =>\n isACPToolCallEvent(uiEvent) &&\n uiEvent.tool_call_id === event.tool_call_id,\n );\n if (existingIndex !== -1) {\n newUiEvents[existingIndex] = event;\n } else {\n newUiEvents.push(event);\n }\n return newUiEvents;\n }\n\n if (isObservationEvent(event)) {\n // Don't add ThinkObservation at all - we keep the ThinkAction instead\n // The thought content is in the action, not the observation\n if (event.observation.kind === \"ThinkObservation\") {\n return newUiEvents;\n }\n\n // Don't add FinishObservation at all - we keep the FinishAction instead\n // Both contain the same message content, so we only need to display one\n // This also prevents duplicate messages when events arrive out of order due to React batching\n if (event.observation.kind === \"FinishObservation\") {\n return newUiEvents;\n }\n\n // Find and replace the corresponding action from uiEvents\n const actionIndex = newUiEvents.findIndex(\n (uiEvent) => uiEvent.id === event.action_id,\n );\n if (actionIndex !== -1) {\n newUiEvents[actionIndex] = event;\n } else {\n // Action not found in uiEvents, just add the observation\n newUiEvents.push(event);\n }\n } else {\n // For non-observation events, just add them to uiEvents\n newUiEvents.push(event);\n }\n\n return newUiEvents;\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- require(`../_virtual/_rolldown/runtime.cjs`);var e={sse_servers:[],stdio_servers:[],shttp_servers:[]},t=`<redacted>`,n=`https://mcp.linear.app/sse`,r=`https://mcp.linear.app/mcp`;function i(e,t){return t===`sse`?e.split(`?`)[0].replace(/\/+$/,``)===n:!1}function a(e,t){return RegExp(`^${t}(_\\d+)?$`).test(e)?void 0:e}function o(e){if(Array.isArray(e))return e.map(o).find(e=>e!==void 0);if(typeof e!=`string`||e.length===0)return;let t=e.match(/^Bearer\s+(.+)$/i);return t?t[1]:e}function s(e){let t=e.headers,n=o(t&&typeof t==`object`?t.Authorization??t.authorization:void 0);if(n)return n;let r=e.auth;return typeof r==`string`&&r!==`oauth`?r:void 0}function c(e){return e?{headers:{Authorization:`Bearer ${e}`}}:{}}function l(e){return e.api_key&&e.api_key!==`<redacted>`?c(e.api_key):e.headers&&Object.keys(e.headers).length>0?{headers:e.headers}:{}}function u(t){if(!t||typeof t!=`object`)return{...e};let n=t;if(!(`mcpServers`in n)||!n.mcpServers||typeof n.mcpServers!=`object`)return{...e};let o=[],c=[],l=[],u=[],d=n.mcpServers;for(let[e,t]of Object.entries(d)){if(!t||typeof t!=`object`)continue;let n=t.url;if(n){let c=t.transport,d=s(t);if(i(n,c)){let e={url:r};d&&(e.api_key=d),u.push(e)}else if(c===`sse`){let t=a(e,`sse`),r={url:n};t&&(r.name=t),d&&(r.api_key=d),o.push(r)}else{let r=a(e,`shttp`),i={url:n};r&&(i.name=r),d&&(i.api_key=d),t.timeout!=null&&(i.timeout=t.timeout),l.push(i)}}else{let n={name:e,command:t.command};t.args&&(n.args=t.args),t.env&&(n.env=t.env),c.push(n)}}let f=e=>e.replace(/\/+$/,``);for(let e of u)l.some(t=>f(typeof t==`string`?t:t.url)===f(e.url))||l.push(e);return{sse_servers:o,stdio_servers:c,shttp_servers:l}}function d(e){let t={},n=e=>{if(!(e in t))return e;let n=1;for(;`${e}_${n}`in t;)n+=1;return`${e}_${n}`};for(let r of e.sse_servers){let e={},i;typeof r==`string`?e.url=r:(i=r.name,e.url=r.url,Object.assign(e,l(r))),e.transport=`sse`,t[n(i||`sse`)]=e}for(let r of e.shttp_servers){let e={},i;typeof r==`string`?e.url=r:(i=r.name,e.url=r.url,Object.assign(e,l(r)),r.timeout!=null&&(e.timeout=r.timeout)),t[n(i||`shttp`)]=e}for(let r of e.stdio_servers){let e={command:r.command};r.args&&(e.args=r.args),r.env&&(e.env=r.env),t[n(r.name||`stdio`)]=e}return Object.keys(t).length>0?{mcpServers:t}:null}exports.REDACTED_MCP_SECRET_VALUE=t,exports.parseMcpConfig=u,exports.toSdkMcpConfig=d;
1
+ require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./mcp-server-name.cjs`);var t={sse_servers:[],stdio_servers:[],shttp_servers:[]},n=`**********`;function r(e,t){return RegExp(`^${t}(_\\d+)?$`).test(e)?void 0:e}function i(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function a(e){if(!i(e))return null;let t=e.mcpServers;return i(t)&&!(`url`in t)&&!(`command`in t)?t:e}function o(e){if(!i(e))return;let t=Object.entries(e).filter(e=>typeof e[1]==`string`);return t.length>0?Object.fromEntries(t):void 0}function s(e){return e===`**********`?!0:Array.isArray(e)?e.some(s):i(e)?Object.values(e).some(s):!1}function c(e){if(!i(e))return;let t={};return i(e.tokens)&&(t.tokens=e.tokens),i(e.client_info)&&(t.client_info=e.client_info),(typeof e.token_expires_at==`number`||e.token_expires_at===null)&&(t.token_expires_at=e.token_expires_at),Object.keys(t).length>0?t:void 0}function l(e){if(i(e))switch(e.strategy){case`none`:return{strategy:`none`};case`api_key`:return typeof e.value==`string`?{strategy:`api_key`,value:e.value,...typeof e.header_name==`string`&&{header_name:e.header_name}}:void 0;case`bearer`:return typeof e.value==`string`?{strategy:`bearer`,value:e.value}:void 0;case`basic`:return typeof e.username!=`string`||typeof e.password!=`string`?void 0:{strategy:`basic`,username:e.username,password:e.password};case`header`:{let t=o(e.headers);return t?{strategy:`header`,headers:t}:void 0}case`oauth2`:{let t=g(e.authentication),n=c(e.state);return{strategy:`oauth2`,...t&&{authentication:t},...n&&{state:n}}}default:return}}function u(e){return l(e.auth)}function d(e){let t={};return e.auth&&!s(e.auth)&&(t.auth=e.auth),e.headers&&Object.keys(e.headers).length>0&&(t.headers=e.headers),t}function f(e){return{...e.name&&{name:e.name},url:e.url,...e.headers&&{headers:e.headers},...e.auth&&{auth:e.auth}}}function p(e){return f(e)}function m(e){return{...f(e),...e.timeout!==void 0&&{timeout:e.timeout}}}function h(e){return{name:e.name,command:e.command,...e.args&&{args:e.args},...e.env&&{env:e.env}}}function g(e){if(!e||typeof e!=`object`)return;let t=e;if(t.type!==`oauth`)return;let n={type:`oauth`};return(t.client_auth_method===`none`||t.client_auth_method===`client_secret_post`||t.client_auth_method===`client_secret_basic`||t.client_auth_method===`private_key_jwt`)&&(n.client_auth_method=t.client_auth_method),(typeof t.scopes==`string`||Array.isArray(t.scopes)&&t.scopes.every(e=>typeof e==`string`))&&(n.scopes=t.scopes),typeof t.client_name==`string`&&(n.client_name=t.client_name),typeof t.client_metadata_url==`string`&&(n.client_metadata_url=t.client_metadata_url),typeof t.client_id==`string`&&(n.client_id=t.client_id),typeof t.client_secret==`string`&&(n.client_secret=t.client_secret),t.additional_client_metadata&&typeof t.additional_client_metadata==`object`&&!Array.isArray(t.additional_client_metadata)&&(n.additional_client_metadata=t.additional_client_metadata),n}function _(e){let n=a(e);if(!n)return{...t};let s=[],c=[],l=[];for(let[e,t]of Object.entries(n)){if(!i(t))continue;let n=t.url;if(n){let i=t.transport,a=u(t),c=o(t.headers);if(i===`sse`){let t=r(e,`sse`),i={url:n};t&&(i.name=t),a&&(i.auth=a),c&&(i.headers=c),s.push(i)}else{let i=r(e,`shttp`),o={url:n};i&&(o.name=i),t.timeout!=null&&(o.timeout=t.timeout),a&&(o.auth=a),c&&(o.headers=c),l.push(o)}}else{if(typeof t.command!=`string`)continue;let n={name:e,command:t.command};t.args&&(n.args=t.args),t.env&&(n.env=t.env),c.push(n)}}return{sse_servers:s,stdio_servers:c,shttp_servers:l}}function v(t){let n={},r=t=>{let r=e.toMcpServerName(t);if(!(r in n))return r;let i=1;for(;`${r}_${i}`in n;)i+=1;return`${r}_${i}`};for(let e of t.sse_servers){let t={},i;typeof e==`string`?t.url=e:(i=e.name,t.url=e.url,Object.assign(t,d(e))),t.transport=`sse`,n[r(i||`sse`)]=t}for(let e of t.shttp_servers){let t={transport:`http`},i;typeof e==`string`?t.url=e:(i=e.name,t.url=e.url,Object.assign(t,d(e)),e.timeout!=null&&(t.timeout=e.timeout)),n[r(i||`shttp`)]=t}for(let e of t.stdio_servers){let t={command:e.command};e.args&&(t.args=e.args),e.env&&(t.env=e.env),n[r(e.name||`stdio`)]=t}return Object.keys(n).length>0?n:null}exports.REDACTED_MCP_SECRET_VALUE=n,exports.getSdkMcpServerMap=a,exports.hasRedactedMcpSecretLeaf=s,exports.parseMcpConfig=_,exports.stringRecord=o,exports.toMcpShttpServer=m,exports.toMcpSseServer=p,exports.toMcpStdioServer=h,exports.toSdkMcpConfig=v;
2
2
  //# sourceMappingURL=mcp-config.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-config.cjs","names":[],"sources":["../../src/utils/mcp-config.ts"],"sourcesContent":["import {\n MCPConfig,\n MCPSSEServer,\n MCPSHTTPServer,\n MCPStdioServer,\n SettingsValue,\n} from \"#/types/settings\";\n\nconst EMPTY_MCP_CONFIG: MCPConfig = {\n sse_servers: [],\n stdio_servers: [],\n shttp_servers: [],\n};\n\nexport const REDACTED_MCP_SECRET_VALUE = \"<redacted>\";\n\nconst LINEAR_DEPRECATED_SSE_URL = \"https://mcp.linear.app/sse\";\nconst LINEAR_SHTTP_URL = \"https://mcp.linear.app/mcp\";\n\n/**\n * Linear removed its MCP SSE transport (the /sse endpoint rejects every\n * call since 2026-04-08). Detect persisted configs that still point at\n * the dead endpoint so they can be migrated to streamable HTTP at the\n * /mcp replacement. Matches only the exact deprecated URL (tolerating a\n * trailing slash or query string) — nothing else is rewritten.\n */\nfunction isDeprecatedLinearSse(\n url: string,\n transport: string | undefined,\n): boolean {\n if (transport !== \"sse\") return false;\n const normalized = url.split(\"?\")[0].replace(/\\/+$/, \"\");\n return normalized === LINEAR_DEPRECATED_SSE_URL;\n}\n\ntype SdkMcpServerConfig = Record<string, SettingsValue>;\ntype SdkMcpConfig = { mcpServers: Record<string, SdkMcpServerConfig> };\n\n/**\n * The dict key for an SSE/SHTTP server doubles as its display name once a\n * user provides one. Keys that match the auto-generated fallback pattern\n * (``sse``, ``shttp``, ``shttp_1``, …) emitted by {@link toSdkMcpConfig}\n * carry no user intent, so we surface them as \"no name\" — re-serializing\n * regenerates the identical fallback key and existing configs are left\n * untouched.\n */\nfunction userGivenServerName(\n serverName: string,\n base: \"sse\" | \"shttp\",\n): string | undefined {\n const autoGenerated = new RegExp(`^${base}(_\\\\d+)?$`);\n return autoGenerated.test(serverName) ? undefined : serverName;\n}\n\nfunction apiKeyFromAuthorizationHeader(value: unknown): string | undefined {\n if (Array.isArray(value)) {\n return value\n .map(apiKeyFromAuthorizationHeader)\n .find((apiKey) => apiKey !== undefined);\n }\n\n if (typeof value !== \"string\" || value.length === 0) return undefined;\n const bearer = value.match(/^Bearer\\s+(.+)$/i);\n return bearer ? bearer[1] : value;\n}\n\nfunction apiKeyFromServerConfig(\n serverConfig: Record<string, unknown>,\n): string | undefined {\n const headers = serverConfig.headers;\n const authorization =\n headers && typeof headers === \"object\"\n ? ((headers as Record<string, unknown>).Authorization ??\n (headers as Record<string, unknown>).authorization)\n : undefined;\n const headerApiKey = apiKeyFromAuthorizationHeader(authorization);\n if (headerApiKey) return headerApiKey;\n\n const auth = serverConfig.auth;\n return typeof auth === \"string\" && auth !== \"oauth\" ? auth : undefined;\n}\n\nfunction getAuthorizationHeaders(apiKey: string | undefined) {\n if (!apiKey) return {};\n return {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n}\n\nfunction getRemoteCredentialFields(entry: {\n api_key?: string;\n headers?: Record<string, string>;\n}): Partial<SdkMcpServerConfig> {\n if (entry.api_key && entry.api_key !== REDACTED_MCP_SECRET_VALUE) {\n return getAuthorizationHeaders(entry.api_key);\n }\n if (entry.headers && Object.keys(entry.headers).length > 0) {\n return { headers: entry.headers };\n }\n return {};\n}\n\n/**\n * Parse an SDK mcp_config value ({ mcpServers: { ... } }) and convert it\n * to the frontend MCPConfig format used by UI components.\n */\nexport function parseMcpConfig(value: unknown): MCPConfig {\n if (!value || typeof value !== \"object\") {\n return { ...EMPTY_MCP_CONFIG };\n }\n\n const obj = value as Record<string, unknown>;\n\n if (\n !(\"mcpServers\" in obj) ||\n !obj.mcpServers ||\n typeof obj.mcpServers !== \"object\"\n ) {\n return { ...EMPTY_MCP_CONFIG };\n }\n\n const sseServers: (string | MCPSSEServer)[] = [];\n const stdioServers: MCPStdioServer[] = [];\n const shttpServers: (string | MCPSHTTPServer)[] = [];\n // Legacy Linear SSE entries rewritten to the /mcp endpoint. Collected\n // separately and merged after the loop so an existing hand-added /mcp\n // entry (with its own api_key/timeout) wins over the migrated one.\n const migratedShttpServers: MCPSHTTPServer[] = [];\n\n const mcpServers = obj.mcpServers as Record<string, Record<string, unknown>>;\n\n for (const [serverName, serverConfig] of Object.entries(mcpServers)) {\n if (!serverConfig || typeof serverConfig !== \"object\") continue;\n\n const url = serverConfig.url as string | undefined;\n\n if (url) {\n const transport = serverConfig.transport as string | undefined;\n const apiKey = apiKeyFromServerConfig(serverConfig);\n\n if (isDeprecatedLinearSse(url, transport)) {\n const server: MCPSHTTPServer = { url: LINEAR_SHTTP_URL };\n if (apiKey) server.api_key = apiKey;\n migratedShttpServers.push(server);\n } else if (transport === \"sse\") {\n const name = userGivenServerName(serverName, \"sse\");\n const server: MCPSSEServer = { url };\n if (name) server.name = name;\n if (apiKey) server.api_key = apiKey;\n sseServers.push(server);\n } else {\n const name = userGivenServerName(serverName, \"shttp\");\n const server: MCPSHTTPServer = { url };\n if (name) server.name = name;\n if (apiKey) server.api_key = apiKey;\n if (serverConfig.timeout != null) {\n server.timeout = serverConfig.timeout as number;\n }\n shttpServers.push(server);\n }\n } else {\n const stdioServer: MCPStdioServer = {\n name: serverName,\n command: serverConfig.command as string,\n };\n if (serverConfig.args) {\n stdioServer.args = serverConfig.args as string[];\n }\n if (serverConfig.env) {\n stdioServer.env = serverConfig.env as Record<string, string>;\n }\n stdioServers.push(stdioServer);\n }\n }\n\n const normalizeUrl = (u: string) => u.replace(/\\/+$/, \"\");\n for (const migrated of migratedShttpServers) {\n const alreadyPresent = shttpServers.some((entry) => {\n const entryUrl = typeof entry === \"string\" ? entry : entry.url;\n return normalizeUrl(entryUrl) === normalizeUrl(migrated.url);\n });\n if (!alreadyPresent) shttpServers.push(migrated);\n }\n\n return {\n sse_servers: sseServers,\n stdio_servers: stdioServers,\n shttp_servers: shttpServers,\n };\n}\n\n/**\n * Convert the frontend MCPConfig format back to the SDK { mcpServers: { ... } }\n * shape expected by agent_settings.mcp_config on the backend.\n *\n * Names are only suffixed (``_1``, ``_2``, …) when an earlier entry has\n * already claimed the bare base name. We intentionally do NOT use a single\n * monotonic counter across server types: that would, for example, rename a\n * stdio server \"myname\" to \"myname_1\" the moment any sse/shttp entry is\n * persisted ahead of it, and shift the suffix on every save as the count\n * of other server types changes. With per-base collision suffixing,\n * unrelated entries keep their human-meaningful names stable across edits.\n */\nexport function toSdkMcpConfig(config: MCPConfig): SdkMcpConfig | null {\n const mcpServers: Record<string, SdkMcpServerConfig> = {};\n\n const reserve = (base: string): string => {\n if (!(base in mcpServers)) return base;\n let i = 1;\n while (`${base}_${i}` in mcpServers) i += 1;\n return `${base}_${i}`;\n };\n\n for (const entry of config.sse_servers) {\n const server: SdkMcpServerConfig = {};\n let name: string | undefined;\n if (typeof entry === \"string\") {\n server.url = entry;\n } else {\n name = entry.name;\n server.url = entry.url;\n Object.assign(server, getRemoteCredentialFields(entry));\n }\n server.transport = \"sse\";\n mcpServers[reserve(name || \"sse\")] = server;\n }\n\n for (const entry of config.shttp_servers) {\n const server: SdkMcpServerConfig = {};\n let name: string | undefined;\n if (typeof entry === \"string\") {\n server.url = entry;\n } else {\n name = entry.name;\n server.url = entry.url;\n Object.assign(server, getRemoteCredentialFields(entry));\n if (entry.timeout != null) server.timeout = entry.timeout;\n }\n mcpServers[reserve(name || \"shttp\")] = server;\n }\n\n for (const entry of config.stdio_servers) {\n const server: SdkMcpServerConfig = {\n command: entry.command,\n };\n if (entry.args) server.args = entry.args;\n if (entry.env) server.env = entry.env;\n mcpServers[reserve(entry.name || \"stdio\")] = server;\n }\n\n return Object.keys(mcpServers).length > 0 ? { mcpServers } : null;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"mcp-config.cjs","names":[],"sources":["../../src/utils/mcp-config.ts"],"sourcesContent":["import {\n MCPConfig,\n MCPSSEServer,\n MCPSHTTPServer,\n MCPStdioServer,\n SettingsValue,\n} from \"#/types/settings\";\nimport type {\n MCPAuthCredential,\n MCPAuthenticationConfig,\n MCPJsonValue,\n MCPOAuthState,\n} from \"#/types/mcp-auth\";\nimport type { MCPServerConfig } from \"#/types/mcp-server\";\nimport { toMcpServerName } from \"#/utils/mcp-server-name\";\n\nconst EMPTY_MCP_CONFIG: MCPConfig = {\n sse_servers: [],\n stdio_servers: [],\n shttp_servers: [],\n};\n\nexport const REDACTED_MCP_SECRET_VALUE = \"**********\";\n\ntype SdkMcpServerConfig = Record<string, SettingsValue | MCPAuthCredential>;\ntype SdkMcpConfig = Record<string, SdkMcpServerConfig>;\n\n/**\n * The dict key for an SSE/SHTTP server doubles as its display name once a\n * user provides one. Keys that match the auto-generated fallback pattern\n * (``sse``, ``shttp``, ``shttp_1``, …) emitted by {@link toSdkMcpConfig}\n * carry no user intent, so we surface them as \"no name\" — re-serializing\n * regenerates the identical fallback key and existing configs are left\n * untouched.\n */\nfunction userGivenServerName(\n serverName: string,\n base: \"sse\" | \"shttp\",\n): string | undefined {\n const autoGenerated = new RegExp(`^${base}(_\\\\d+)?$`);\n return autoGenerated.test(serverName) ? undefined : serverName;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function getSdkMcpServerMap(\n value: unknown,\n): Record<string, unknown> | null {\n if (!isRecord(value)) return null;\n\n const mcpServers = value.mcpServers;\n if (\n isRecord(mcpServers) &&\n !(\"url\" in mcpServers) &&\n !(\"command\" in mcpServers)\n ) {\n return mcpServers;\n }\n\n return value;\n}\n\nexport function stringRecord(\n value: unknown,\n): Record<string, string> | undefined {\n if (!isRecord(value)) return undefined;\n const entries = Object.entries(value).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n );\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n}\n\nexport function hasRedactedMcpSecretLeaf(value: unknown): boolean {\n if (value === REDACTED_MCP_SECRET_VALUE) return true;\n if (Array.isArray(value)) return value.some(hasRedactedMcpSecretLeaf);\n if (isRecord(value))\n return Object.values(value).some(hasRedactedMcpSecretLeaf);\n return false;\n}\n\nfunction getOAuthState(value: unknown): MCPOAuthState | undefined {\n if (!isRecord(value)) return undefined;\n const state: MCPOAuthState = {};\n if (isRecord(value.tokens)) {\n state.tokens = value.tokens as NonNullable<MCPOAuthState[\"tokens\"]>;\n }\n if (isRecord(value.client_info)) {\n state.client_info = value.client_info as NonNullable<\n MCPOAuthState[\"client_info\"]\n >;\n }\n if (\n typeof value.token_expires_at === \"number\" ||\n value.token_expires_at === null\n ) {\n state.token_expires_at = value.token_expires_at;\n }\n return Object.keys(state).length > 0 ? state : undefined;\n}\n\nfunction normalizeTaggedAuthCredential(\n value: unknown,\n): MCPAuthCredential | undefined {\n if (!isRecord(value)) return undefined;\n switch (value.strategy) {\n case \"none\":\n return { strategy: \"none\" };\n case \"api_key\":\n if (typeof value.value !== \"string\") return undefined;\n return {\n strategy: \"api_key\",\n value: value.value,\n ...(typeof value.header_name === \"string\" && {\n header_name: value.header_name,\n }),\n };\n case \"bearer\":\n if (typeof value.value !== \"string\") return undefined;\n return { strategy: \"bearer\", value: value.value };\n case \"basic\":\n if (\n typeof value.username !== \"string\" ||\n typeof value.password !== \"string\"\n ) {\n return undefined;\n }\n return {\n strategy: \"basic\",\n username: value.username,\n password: value.password,\n };\n case \"header\": {\n const headers = stringRecord(value.headers);\n return headers ? { strategy: \"header\", headers } : undefined;\n }\n case \"oauth2\": {\n const authentication = getAuthenticationConfig(value.authentication);\n const state = getOAuthState(value.state);\n return {\n strategy: \"oauth2\",\n ...(authentication && { authentication }),\n ...(state && { state }),\n };\n }\n default:\n return undefined;\n }\n}\n\nfunction authCredentialFromServerConfig(\n serverConfig: Record<string, unknown>,\n): MCPAuthCredential | undefined {\n return normalizeTaggedAuthCredential(serverConfig.auth);\n}\n\nfunction getRemoteSecretFields(entry: {\n auth?: MCPAuthCredential;\n headers?: Record<string, string>;\n}): Partial<SdkMcpServerConfig> {\n const fields: Partial<SdkMcpServerConfig> = {};\n if (entry.auth && !hasRedactedMcpSecretLeaf(entry.auth)) {\n fields.auth = entry.auth;\n }\n if (entry.headers && Object.keys(entry.headers).length > 0) {\n fields.headers = entry.headers;\n }\n return fields;\n}\n\nfunction getRemoteServerFields(server: MCPServerConfig) {\n return {\n ...(server.name && { name: server.name }),\n url: server.url!,\n ...(server.headers && { headers: server.headers }),\n ...(server.auth && { auth: server.auth }),\n };\n}\n\nexport function toMcpSseServer(server: MCPServerConfig): MCPSSEServer {\n return getRemoteServerFields(server);\n}\n\nexport function toMcpShttpServer(server: MCPServerConfig): MCPSHTTPServer {\n return {\n ...getRemoteServerFields(server),\n ...(server.timeout !== undefined && { timeout: server.timeout }),\n };\n}\n\nexport function toMcpStdioServer(server: MCPServerConfig): MCPStdioServer {\n return {\n name: server.name!,\n command: server.command!,\n ...(server.args && { args: server.args }),\n ...(server.env && { env: server.env }),\n };\n}\n\nfunction getAuthenticationConfig(\n value: unknown,\n): MCPAuthenticationConfig | undefined {\n if (!value || typeof value !== \"object\") return undefined;\n const record = value as Record<string, unknown>;\n if (record.type !== \"oauth\") return undefined;\n const authentication: MCPAuthenticationConfig = { type: \"oauth\" };\n if (\n record.client_auth_method === \"none\" ||\n record.client_auth_method === \"client_secret_post\" ||\n record.client_auth_method === \"client_secret_basic\" ||\n record.client_auth_method === \"private_key_jwt\"\n ) {\n authentication.client_auth_method = record.client_auth_method;\n }\n if (typeof record.scopes === \"string\") {\n authentication.scopes = record.scopes;\n } else if (\n Array.isArray(record.scopes) &&\n record.scopes.every((scope) => typeof scope === \"string\")\n ) {\n authentication.scopes = record.scopes;\n }\n if (typeof record.client_name === \"string\") {\n authentication.client_name = record.client_name;\n }\n if (typeof record.client_metadata_url === \"string\") {\n authentication.client_metadata_url = record.client_metadata_url;\n }\n if (typeof record.client_id === \"string\") {\n authentication.client_id = record.client_id;\n }\n if (typeof record.client_secret === \"string\") {\n authentication.client_secret = record.client_secret;\n }\n if (\n record.additional_client_metadata &&\n typeof record.additional_client_metadata === \"object\" &&\n !Array.isArray(record.additional_client_metadata)\n ) {\n authentication.additional_client_metadata =\n record.additional_client_metadata as Record<string, MCPJsonValue>;\n }\n return authentication;\n}\n\n/**\n * Parse the SDK-native ``agent_settings.mcp_config`` value and convert it\n * to the frontend MCPConfig format used by UI components.\n */\nexport function parseMcpConfig(value: unknown): MCPConfig {\n const mcpConfig = getSdkMcpServerMap(value);\n if (!mcpConfig) {\n return { ...EMPTY_MCP_CONFIG };\n }\n\n const sseServers: (string | MCPSSEServer)[] = [];\n const stdioServers: MCPStdioServer[] = [];\n const shttpServers: (string | MCPSHTTPServer)[] = [];\n\n for (const [serverName, serverConfig] of Object.entries(mcpConfig)) {\n if (!isRecord(serverConfig)) continue;\n\n const url = serverConfig.url as string | undefined;\n\n if (url) {\n const transport = serverConfig.transport as string | undefined;\n const auth = authCredentialFromServerConfig(serverConfig);\n const headers = stringRecord(serverConfig.headers);\n\n if (transport === \"sse\") {\n const name = userGivenServerName(serverName, \"sse\");\n const server: MCPSSEServer = { url };\n if (name) server.name = name;\n if (auth) server.auth = auth;\n if (headers) server.headers = headers;\n sseServers.push(server);\n } else {\n const name = userGivenServerName(serverName, \"shttp\");\n const server: MCPSHTTPServer = { url };\n if (name) server.name = name;\n if (serverConfig.timeout != null) {\n server.timeout = serverConfig.timeout as number;\n }\n if (auth) server.auth = auth;\n if (headers) server.headers = headers;\n shttpServers.push(server);\n }\n } else {\n if (typeof serverConfig.command !== \"string\") continue;\n const stdioServer: MCPStdioServer = {\n name: serverName,\n command: serverConfig.command,\n };\n if (serverConfig.args) {\n stdioServer.args = serverConfig.args as string[];\n }\n if (serverConfig.env) {\n stdioServer.env = serverConfig.env as Record<string, string>;\n }\n stdioServers.push(stdioServer);\n }\n }\n\n return {\n sse_servers: sseServers,\n stdio_servers: stdioServers,\n shttp_servers: shttpServers,\n };\n}\n\n/**\n * Convert the frontend MCPConfig format back to the SDK-native server map\n * expected by agent_settings.mcp_config on the backend.\n *\n * Names are only suffixed (``_1``, ``_2``, …) when an earlier entry has\n * already claimed the bare base name. We intentionally do NOT use a single\n * monotonic counter across server types: that would, for example, rename a\n * stdio server \"myname\" to \"myname_1\" the moment any sse/shttp entry is\n * persisted ahead of it, and shift the suffix on every save as the count\n * of other server types changes. With per-base collision suffixing,\n * unrelated entries keep their human-meaningful names stable across edits.\n */\nexport function toSdkMcpConfig(config: MCPConfig): SdkMcpConfig | null {\n const mcpConfig: SdkMcpConfig = {};\n\n const reserve = (base: string): string => {\n const safeBase = toMcpServerName(base);\n if (!(safeBase in mcpConfig)) return safeBase;\n let i = 1;\n while (`${safeBase}_${i}` in mcpConfig) i += 1;\n return `${safeBase}_${i}`;\n };\n\n for (const entry of config.sse_servers) {\n const server: SdkMcpServerConfig = {};\n let name: string | undefined;\n if (typeof entry === \"string\") {\n server.url = entry;\n } else {\n name = entry.name;\n server.url = entry.url;\n Object.assign(server, getRemoteSecretFields(entry));\n }\n server.transport = \"sse\";\n mcpConfig[reserve(name || \"sse\")] = server;\n }\n\n for (const entry of config.shttp_servers) {\n const server: SdkMcpServerConfig = { transport: \"http\" };\n let name: string | undefined;\n if (typeof entry === \"string\") {\n server.url = entry;\n } else {\n name = entry.name;\n server.url = entry.url;\n Object.assign(server, getRemoteSecretFields(entry));\n if (entry.timeout != null) server.timeout = entry.timeout;\n }\n mcpConfig[reserve(name || \"shttp\")] = server;\n }\n\n for (const entry of config.stdio_servers) {\n const server: SdkMcpServerConfig = {\n command: entry.command,\n };\n if (entry.args) server.args = entry.args;\n if (entry.env) server.env = entry.env;\n mcpConfig[reserve(entry.name || \"stdio\")] = server;\n }\n\n return Object.keys(mcpConfig).length > 0 ? mcpConfig : null;\n}\n"],"mappings":"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"}
@@ -1,17 +1,23 @@
1
- import { MCPConfig, SettingsValue } from "#/types/settings";
2
- export declare const REDACTED_MCP_SECRET_VALUE = "<redacted>";
3
- type SdkMcpServerConfig = Record<string, SettingsValue>;
4
- type SdkMcpConfig = {
5
- mcpServers: Record<string, SdkMcpServerConfig>;
6
- };
1
+ import { MCPConfig, MCPSSEServer, MCPSHTTPServer, MCPStdioServer, SettingsValue } from "#/types/settings";
2
+ import type { MCPAuthCredential } from "#/types/mcp-auth";
3
+ import type { MCPServerConfig } from "#/types/mcp-server";
4
+ export declare const REDACTED_MCP_SECRET_VALUE = "**********";
5
+ type SdkMcpServerConfig = Record<string, SettingsValue | MCPAuthCredential>;
6
+ type SdkMcpConfig = Record<string, SdkMcpServerConfig>;
7
+ export declare function getSdkMcpServerMap(value: unknown): Record<string, unknown> | null;
8
+ export declare function stringRecord(value: unknown): Record<string, string> | undefined;
9
+ export declare function hasRedactedMcpSecretLeaf(value: unknown): boolean;
10
+ export declare function toMcpSseServer(server: MCPServerConfig): MCPSSEServer;
11
+ export declare function toMcpShttpServer(server: MCPServerConfig): MCPSHTTPServer;
12
+ export declare function toMcpStdioServer(server: MCPServerConfig): MCPStdioServer;
7
13
  /**
8
- * Parse an SDK mcp_config value ({ mcpServers: { ... } }) and convert it
14
+ * Parse the SDK-native ``agent_settings.mcp_config`` value and convert it
9
15
  * to the frontend MCPConfig format used by UI components.
10
16
  */
11
17
  export declare function parseMcpConfig(value: unknown): MCPConfig;
12
18
  /**
13
- * Convert the frontend MCPConfig format back to the SDK { mcpServers: { ... } }
14
- * shape expected by agent_settings.mcp_config on the backend.
19
+ * Convert the frontend MCPConfig format back to the SDK-native server map
20
+ * expected by agent_settings.mcp_config on the backend.
15
21
  *
16
22
  * Names are only suffixed (``_1``, ``_2``, …) when an earlier entry has
17
23
  * already claimed the bare base name. We intentionally do NOT use a single