@openhands/agent-canvas 1.13.0 → 1.15.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 (1688) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/acp-providers-BKvmTf82.js +1 -0
  4. package/build/assets/active-backend-context-DKFSMbn3.js +2 -0
  5. package/build/assets/agent-context-settings-D3PjSTU1.js +1 -0
  6. package/build/assets/agent-profiles-settings-D4cY5U2T.js +1 -0
  7. package/build/assets/agent-server-conversation-service.api-DozDKIW_.js +86 -0
  8. package/build/assets/agent-settings-351vXWc9.js +2 -0
  9. package/build/assets/agent-settings-Ce7BDZ6I.js +1 -0
  10. package/build/assets/alert-banner-Kyy1YWZU.js +1 -0
  11. package/build/assets/api-error-message-BJyfWp6p.js +1 -0
  12. package/build/assets/api-key-entry-screen-INIxqAMs.js +1 -0
  13. package/build/assets/app-settings-CbHqzQus.js +1 -0
  14. package/build/assets/automation-detail-DXDhUwPq.js +3 -0
  15. package/build/assets/automation-export-BRopEHMu.js +2 -0
  16. package/build/assets/automation-git-sync-CzyS4cn1.js +1 -0
  17. package/build/assets/automation-setup-route-FRr05f_g.js +1 -0
  18. package/build/assets/automation-templates-C_0FZgLG.js +1 -0
  19. package/build/assets/automations-list-CERuQWE6.js +1 -0
  20. package/build/assets/back-nav-button-Dm9tIjVf.js +1 -0
  21. package/build/assets/backend-form-modal-DK78-jn1.js +1 -0
  22. package/build/assets/backend-synced-settings-badge-3fOwg6Bd.js +1 -0
  23. package/build/assets/badge-D4SqUCsR.js +1 -0
  24. package/build/assets/base-modal-C7_BDl_U.js +1 -0
  25. package/build/assets/bot-C-0Wu7vQ.js +1 -0
  26. package/build/assets/brand-button-Dxv6PDeN.js +1 -0
  27. package/build/assets/browser-11etCQ04.js +7 -0
  28. package/build/assets/browser-tab-BAl4ckJE.js +1 -0
  29. package/build/assets/chat-send-button-DWwR2cgI.js +1 -0
  30. package/build/assets/check-Cf2YoT90.js +1 -0
  31. package/build/assets/chevron-down-C3OQ-ehx.js +1 -0
  32. package/build/assets/chevron-right-CN1uUiJ1.js +1 -0
  33. package/build/assets/circle-check-g5yeGMd-.js +1 -0
  34. package/build/assets/circle-plus-check-toggle-CBh_qomE.js +1 -0
  35. package/build/assets/cloud-funnel-analytics-287iIERo.js +1 -0
  36. package/build/assets/cog-C4rrw-ZK.js +1 -0
  37. package/build/assets/command-menu-BZQ8S3Ke.js +1 -0
  38. package/build/assets/commits-tab-DZtJgaDM.js +1 -0
  39. package/build/assets/condenser-settings-BcNmYR4s.js +1 -0
  40. package/build/assets/confirmation-modal-Bk4JRcCM.js +1 -0
  41. package/build/assets/context-menu-list-item-lVYETtY5.js +1 -0
  42. package/build/assets/conversation-CchMzpGl.js +1 -0
  43. package/build/assets/conversation-Dpzftz57.js +93 -0
  44. package/build/assets/conversation-panel-CchMzpGl.js +1 -0
  45. package/build/assets/conversation-state-store-a9d2fxRc.js +1 -0
  46. package/build/assets/conversation-store-Ca3ghXap.js +6 -0
  47. package/build/assets/conversation-tab-empty-state-HJtkmHZj.js +1 -0
  48. package/build/assets/copy-to-clipboard-button-Cjkswvnj.js +1 -0
  49. package/build/assets/device-verify-EZhHhBT7.js +1 -0
  50. package/build/assets/dropdown-classes-DJe-E6MC.js +1 -0
  51. package/build/assets/edit-automation-modal-D-urtv8n.js +1 -0
  52. package/build/assets/empty-state-CvaVahVr.js +1 -0
  53. package/build/assets/entry.client-C7Bi2tkU.js +2 -0
  54. package/build/assets/enum-filter-dropdown-DliX_Lo0.js +1 -0
  55. package/build/assets/environment-switch-overlay-CEKrFiMw.js +1 -0
  56. package/build/assets/error-state-BALXiBNy.js +1 -0
  57. package/build/assets/extension-module-card-classes-DpeaYhYo.js +1 -0
  58. package/build/assets/extensions-hub-CFduxBnk.js +1 -0
  59. package/build/assets/extensions-navigation-BeC224yX.js +1 -0
  60. package/build/assets/external-link-DFpYunfj.js +1 -0
  61. package/build/assets/files-tab-CL3J9b3p.js +1 -0
  62. package/build/assets/form-control-classes-CGw40z5h.js +1 -0
  63. package/build/assets/format-model-name-BNPKVsIq.js +1 -0
  64. package/build/assets/get-git-path-DlAJa_i6.js +1 -0
  65. package/build/assets/git-repo-dropdown-DGMEhz7d.js +1 -0
  66. package/build/assets/git-repo-dropdown-ai8qaNkD.js +1 -0
  67. package/build/assets/highlighted-source-view-C3sxykQi.js +1 -0
  68. package/build/assets/home-BCGlNJCA.js +1 -0
  69. package/build/assets/home-DB1pRqTC.js +1 -0
  70. package/build/assets/home-automation-run-tooltip-CooFQRIG.js +1 -0
  71. package/build/assets/home-store-Dl1dPE58.js +1 -0
  72. package/build/assets/index-home-DB1pRqTC.js +1 -0
  73. package/build/assets/info-uYSVzX86.js +1 -0
  74. package/build/assets/install-server-modal-BbJdhzet.js +1 -0
  75. package/build/assets/kebab-menu-item-content-BYokkRHi.js +1 -0
  76. package/build/assets/key-Cn5za3rg.js +1 -0
  77. package/build/assets/launch-C1ieiOGe.js +1 -0
  78. package/build/assets/list-filter-OFkpRrmi.js +1 -0
  79. package/build/assets/list-todo-Cuu-STFc.js +1 -0
  80. package/build/assets/llm-not-configured-banner-BqqYnJ1t.js +27 -0
  81. package/build/assets/llm-settings-CnDbbmVW.js +1 -0
  82. package/build/assets/llm-settings-S8Yjg__1.js +1 -0
  83. package/build/assets/llm-subscription-service-BpPfzW4x.js +1 -0
  84. package/build/assets/loader-circle-nvrwthvj.js +1 -0
  85. package/build/assets/loading-spinner-0L3ZTToZ.js +1 -0
  86. package/build/assets/manage-backends-modal-BCUPswyl.js +1 -0
  87. package/build/assets/manifest-58597dde.js +1 -0
  88. package/build/assets/manifest-subpage-layout-BGhiUQbA.js +1 -0
  89. package/build/assets/map-provider-B9LTm23I.js +1 -0
  90. package/build/assets/markdown-renderer-Cb2sBWtV.js +8 -0
  91. package/build/assets/mcp-CKbR4Vft.js +1 -0
  92. package/build/assets/mcp-marketplace-utils-C13fFccR.js +1 -0
  93. package/build/assets/mcp-page-Bm4K2NQq.js +9 -0
  94. package/build/assets/messages-BTN5thLe.js +40 -0
  95. package/build/assets/modal-body-CMOc2tLl.js +1 -0
  96. package/build/assets/modal-classes-BAb4Y_BG.js +1 -0
  97. package/build/assets/modal-close-button-CkJ0Ktjj.js +1 -0
  98. package/build/assets/mouse-pointer-click-CsgRs_-r.js +1 -0
  99. package/build/assets/onboarding-Cx_kaiD1.js +1 -0
  100. package/build/assets/onboarding-modal-vMwn7ihv.js +1 -0
  101. package/build/assets/organization-service.api-C8XpQ0pM.js +1 -0
  102. package/build/assets/parse-git-remote-url-DpDM9bK6.js +1 -0
  103. package/build/assets/pencil-Clh1Wjvh.js +1 -0
  104. package/build/assets/planner-tab-DQvDU3ap.js +1 -0
  105. package/build/assets/plug-BuQhHSSG.js +1 -0
  106. package/build/assets/plugins-management-service-BjYeF0b0.js +1 -0
  107. package/build/assets/plus-CEKne-Yp.js +1 -0
  108. package/build/assets/profiles-service.api-QB-T_u-g.js +1 -0
  109. package/build/assets/providers-FfSZ5TXP.js +1 -0
  110. package/build/assets/proxy-tcFL2yTQ.js +1 -0
  111. package/build/assets/puzzle-A9pGxxai.js +1 -0
  112. package/build/assets/recommended-automations-launcher-Bw8uC4V6.js +1 -0
  113. package/build/assets/refresh-cw-Bh69DyYO.js +1 -0
  114. package/build/assets/root-BLeQfBEq.css +1 -0
  115. package/build/assets/root-ZKKYPR1Z.js +2 -0
  116. package/build/assets/root-layout-luJoE9IG.js +2 -0
  117. package/build/assets/schema-field-Csw5fhtN.js +1 -0
  118. package/build/assets/scroll-fade-state-Dw-i4SGq.js +1 -0
  119. package/build/assets/sdk-section-page-HTffvm7Q.js +1 -0
  120. package/build/assets/secret-form-HTUbYw5o.js +1 -0
  121. package/build/assets/secrets-service-BTor9uAU.js +1 -0
  122. package/build/assets/secrets-settings-BizaTEr1.js +1 -0
  123. package/build/assets/server-process-C9RKzd1x.js +1 -0
  124. package/build/assets/settings-BlmrkwRi.js +1 -0
  125. package/build/assets/settings-DcNPxz0v.js +1 -0
  126. package/build/assets/settings-dropdown-input-tM0A0ipy.js +1 -0
  127. package/build/assets/settings-index-CKq0b0Vg.js +1 -0
  128. package/build/assets/settings-input-C03KUoSC.js +1 -0
  129. package/build/assets/settings-list-classes-BJ0g8rWj.js +1 -0
  130. package/build/assets/settings-modal-AzEF1QPP.js +1 -0
  131. package/build/assets/settings-service.api-B2agVfjL.js +1 -0
  132. package/build/assets/settings-switch-CQE0EGC-.js +1 -0
  133. package/build/assets/settings-utils-ClYOkbbI.js +1 -0
  134. package/build/assets/shared-conversation-B55pCyBG.js +1 -0
  135. package/build/assets/shield-check-CFDViW82.js +1 -0
  136. package/build/assets/sidebar-layout-D3hE08wK.js +1 -0
  137. package/build/assets/sidebar-mobile-menu-toggle-BOtyJHwE.js +1 -0
  138. package/build/assets/sidebar-nav-link-CPzhyHQg.js +1 -0
  139. package/build/assets/sidebar-onboarding-checklist-storage-3qYflszY.js +1 -0
  140. package/build/assets/sidebar-store-DtpU7zaI.js +1 -0
  141. package/build/assets/skill-card-pill-row-CFxjoqxn.js +1 -0
  142. package/build/assets/skill-filter-CWZ5kjcg.js +2 -0
  143. package/build/assets/skill-icon-badge-CPQJ6A-I.js +1 -0
  144. package/build/assets/skill-scope-CV1dkAbW.js +1 -0
  145. package/build/assets/skills-plugins-DGHULTq6.js +1 -0
  146. package/build/assets/skills-settings-CM1lFv3e.js +1 -0
  147. package/build/assets/styled-tooltip-Dl06rkpY.js +1 -0
  148. package/build/assets/task-list-tab-04GNQuii.js +1 -0
  149. package/build/assets/terminal-Cj0iHIW7.js +3 -0
  150. package/build/assets/toggle-switch-Fd_QGz0r.js +1 -0
  151. package/build/assets/trash-2-Dl8_RGz0.js +1 -0
  152. package/build/assets/trash-_RMt7Ayc.js +1 -0
  153. package/build/assets/triangle-alert-SM-q4NU_.js +1 -0
  154. package/build/assets/typography-SgFy466J.js +1 -0
  155. package/build/assets/usage-tab-BcfWV6db.js +1 -0
  156. package/build/assets/use-acp-credential-form-BsSW5NHG.js +1 -0
  157. package/build/assets/use-activate-agent-profile-B2NS8nA5.js +1 -0
  158. package/build/assets/use-agent-profiles-DWBPC0Si.js +1 -0
  159. package/build/assets/use-automation-health-BxXdzZMP.js +1 -0
  160. package/build/assets/use-automations-zYb0dUny.js +1 -0
  161. package/build/assets/use-can-manage-org-profiles-BWMahtUh.js +1 -0
  162. package/build/assets/use-cloud-current-user-id-CPHMDG-C.js +1 -0
  163. package/build/assets/use-config-Bft35DOK.js +1 -0
  164. package/build/assets/use-create-conversation-DwN5vv2f.js +1 -0
  165. package/build/assets/use-create-secret-BSxJMxHp.js +1 -0
  166. package/build/assets/use-get-secrets-BT4ihRwj.js +1 -0
  167. package/build/assets/use-has-permission-B3C8rQmR.js +1 -0
  168. package/build/assets/use-is-authed-CFGkY3-Z.js +1 -0
  169. package/build/assets/use-launch-skill-in-chat-BYjYihBP.js +1 -0
  170. package/build/assets/use-llm-configured-BI6obxsc.js +1 -0
  171. package/build/assets/use-llm-profiles-djGAhTWL.js +1 -0
  172. package/build/assets/use-manifest-capabilities-3z0-1G59.js +1 -0
  173. package/build/assets/use-onboarding-completion-BXpyUSsJ.js +1 -0
  174. package/build/assets/use-plugins-marketplace-DI4_pK56.js +1 -0
  175. package/build/assets/use-save-agent-profile-DdBSTdpN.js +1 -0
  176. package/build/assets/use-save-settings-CUZW6yXP.js +1 -0
  177. package/build/assets/use-settings-C5VhGpqd.js +1 -0
  178. package/build/assets/use-settings-nav-items-DHaUu1Dg.js +16 -0
  179. package/build/assets/use-tracking-D5t9otIF.js +3 -0
  180. package/build/assets/use-user-conversation-DT0_QCnL.js +1 -0
  181. package/build/assets/useInfiniteQuery-CgeUQPfs.js +1 -0
  182. package/build/assets/useMutation-DFnzkf6f.js +1 -0
  183. package/build/assets/useQueries-BhbrGEf1.js +1 -0
  184. package/build/assets/useQuery-BXWbZBZl.js +1 -0
  185. package/build/assets/utils-DaCIEEQP.js +1 -0
  186. package/build/assets/vendor~browser-hbU4u2Ag.js +47 -0
  187. package/build/assets/vendor~commits-tab-BaO2Ce3e.js +11 -0
  188. package/build/assets/vendor~conversation-panel~conversation-CTvDDiXg.js +1 -0
  189. package/build/assets/vendor~entry.client-BFE7Llz9.js +1 -0
  190. package/build/assets/vendor~entry.client-BaKt_PIp.js +9 -0
  191. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kepq2zme-ZixYGy6E.js +186 -0
  192. package/build/assets/vendor~index-home~home~conversation-panel~conversation-BTyukeM-.js +13 -0
  193. package/build/assets/vendor~root-layout-BlUaZ18v.js +1 -0
  194. package/build/assets/vendor~root-layout~conversation-panel~conversation-BYAWJwQX.js +1 -0
  195. package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-CHaLEBVR.js +1 -0
  196. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-B2OLKL7N.js +1 -0
  197. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-DXqM7vqB.js +1 -0
  198. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-Dtu7BpYk.js +48 -0
  199. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iw7io29p-Dz-MAyNb.js +1 -0
  200. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-DonTKfQD.js +4949 -0
  201. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-BgxDvUcf.js +8420 -0
  202. package/build/assets/verification-settings-Bj6bo097.js +1 -0
  203. package/build/assets/wrench-hi7Q13dF.js +1 -0
  204. package/build/assets/x-DkgltWa0.js +1 -0
  205. package/build/index.html +4 -4
  206. package/build/locales/ar/openhands.json +183 -44
  207. package/build/locales/ca/openhands.json +183 -44
  208. package/build/locales/de/openhands.json +183 -44
  209. package/build/locales/en/openhands.json +183 -44
  210. package/build/locales/es/openhands.json +183 -44
  211. package/build/locales/fr/openhands.json +183 -44
  212. package/build/locales/it/openhands.json +183 -44
  213. package/build/locales/ja/openhands.json +183 -44
  214. package/build/locales/ko-KR/openhands.json +183 -44
  215. package/build/locales/no/openhands.json +183 -44
  216. package/build/locales/pt/openhands.json +183 -44
  217. package/build/locales/tr/openhands.json +183 -44
  218. package/build/locales/uk/openhands.json +183 -44
  219. package/build/locales/zh-CN/openhands.json +183 -44
  220. package/build/locales/zh-TW/openhands.json +183 -44
  221. package/config/defaults.json +2 -2
  222. package/dist/api/agent-server-adapter.cjs +3 -3
  223. package/dist/api/agent-server-adapter.cjs.map +1 -1
  224. package/dist/api/agent-server-adapter.d.ts +10 -1
  225. package/dist/api/agent-server-adapter.js +115 -110
  226. package/dist/api/agent-server-adapter.js.map +1 -1
  227. package/dist/api/automation-service/automation-service.api.cjs +1 -1
  228. package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
  229. package/dist/api/automation-service/automation-service.api.d.ts +23 -2
  230. package/dist/api/automation-service/automation-service.api.js +130 -73
  231. package/dist/api/automation-service/automation-service.api.js.map +1 -1
  232. package/dist/api/backend-registry/url-selection.cjs +1 -1
  233. package/dist/api/backend-registry/url-selection.cjs.map +1 -1
  234. package/dist/api/backend-registry/url-selection.d.ts +2 -1
  235. package/dist/api/backend-registry/url-selection.js +2 -2
  236. package/dist/api/backend-registry/url-selection.js.map +1 -1
  237. package/dist/api/cloud/conversation-service.api.cjs +1 -1
  238. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  239. package/dist/api/cloud/conversation-service.api.d.ts +9 -0
  240. package/dist/api/cloud/conversation-service.api.js +11 -1
  241. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  242. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  243. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  244. package/dist/api/conversation-service/agent-server-conversation-service.api.js +29 -24
  245. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  246. package/dist/api/git-provider-items-service.cjs +2 -0
  247. package/dist/api/git-provider-items-service.cjs.map +1 -0
  248. package/dist/api/git-provider-items-service.d.ts +25 -0
  249. package/dist/api/git-provider-items-service.js +127 -0
  250. package/dist/api/git-provider-items-service.js.map +1 -0
  251. package/dist/api/mcp-health/probe-mcp-server-health.cjs +1 -1
  252. package/dist/api/mcp-health/probe-mcp-server-health.js +31 -31
  253. package/dist/api/open-hands.types.d.ts +0 -19
  254. package/dist/api/profiles-service/profiles-service.api.cjs +1 -1
  255. package/dist/api/profiles-service/profiles-service.api.cjs.map +1 -1
  256. package/dist/api/profiles-service/profiles-service.api.d.ts +29 -2
  257. package/dist/api/profiles-service/profiles-service.api.js +25 -2
  258. package/dist/api/profiles-service/profiles-service.api.js.map +1 -1
  259. package/dist/api/provider-connections-service/provider-connections-service.api.cjs +2 -0
  260. package/dist/api/provider-connections-service/provider-connections-service.api.cjs.map +1 -0
  261. package/dist/api/provider-connections-service/provider-connections-service.api.d.ts +34 -0
  262. package/dist/api/provider-connections-service/provider-connections-service.api.js +50 -0
  263. package/dist/api/provider-connections-service/provider-connections-service.api.js.map +1 -0
  264. package/dist/api/secrets-service.cjs +1 -1
  265. package/dist/api/secrets-service.cjs.map +1 -1
  266. package/dist/api/secrets-service.d.ts +5 -0
  267. package/dist/api/secrets-service.js +12 -6
  268. package/dist/api/secrets-service.js.map +1 -1
  269. package/dist/components/conversation-events/chat/event-content-helpers/create-skill-ready-event.cjs +1 -1
  270. package/dist/components/conversation-events/chat/event-content-helpers/create-skill-ready-event.cjs.map +1 -1
  271. package/dist/components/conversation-events/chat/event-content-helpers/create-skill-ready-event.js +1 -1
  272. package/dist/components/conversation-events/chat/event-content-helpers/create-skill-ready-event.js.map +1 -1
  273. package/dist/components/conversation-events/chat/event-message-components/index.d.ts +0 -1
  274. package/dist/components/conversation-events/chat/event-message.cjs +1 -1
  275. package/dist/components/conversation-events/chat/event-message.cjs.map +1 -1
  276. package/dist/components/conversation-events/chat/event-message.js +1 -1
  277. package/dist/components/conversation-events/chat/event-message.js.map +1 -1
  278. package/dist/components/conversation-events/chat/messages.cjs.map +1 -1
  279. package/dist/components/conversation-events/chat/messages.js.map +1 -1
  280. package/dist/components/features/automations/add-automation-menu.d.ts +7 -0
  281. package/dist/components/features/automations/add-automation-modal.cjs +2 -0
  282. package/dist/components/features/automations/add-automation-modal.cjs.map +1 -0
  283. package/dist/components/features/automations/add-automation-modal.js +42 -0
  284. package/dist/components/features/automations/add-automation-modal.js.map +1 -0
  285. package/dist/components/features/automations/automation-action-button-classes.cjs +2 -0
  286. package/dist/components/features/automations/automation-action-button-classes.cjs.map +1 -0
  287. package/dist/components/features/automations/automation-action-button-classes.d.ts +0 -2
  288. package/dist/components/features/automations/automation-action-button-classes.js +8 -0
  289. package/dist/components/features/automations/automation-action-button-classes.js.map +1 -0
  290. package/dist/components/features/automations/automation-card-skeleton.cjs +2 -0
  291. package/dist/components/features/automations/automation-card-skeleton.cjs.map +1 -0
  292. package/dist/components/features/automations/automation-card-skeleton.js +33 -0
  293. package/dist/components/features/automations/automation-card-skeleton.js.map +1 -0
  294. package/dist/components/features/automations/automation-card.cjs +2 -0
  295. package/dist/components/features/automations/automation-card.cjs.map +1 -0
  296. package/dist/components/features/automations/automation-card.d.ts +1 -1
  297. package/dist/components/features/automations/automation-card.js +160 -0
  298. package/dist/components/features/automations/automation-card.js.map +1 -0
  299. package/dist/components/features/automations/automation-group.cjs +2 -0
  300. package/dist/components/features/automations/automation-group.cjs.map +1 -0
  301. package/dist/components/features/automations/automation-group.js +54 -0
  302. package/dist/components/features/automations/automation-group.js.map +1 -0
  303. package/dist/components/features/automations/automation-list-row.cjs +2 -0
  304. package/dist/components/features/automations/automation-list-row.cjs.map +1 -0
  305. package/dist/components/features/automations/automation-list-row.js +152 -0
  306. package/dist/components/features/automations/automation-list-row.js.map +1 -0
  307. package/dist/components/features/automations/automation-run-insights.cjs +2 -0
  308. package/dist/components/features/automations/automation-run-insights.cjs.map +1 -0
  309. package/dist/components/features/automations/automation-run-insights.js +46 -0
  310. package/dist/components/features/automations/automation-run-insights.js.map +1 -0
  311. package/dist/components/features/automations/automation-view-mode.cjs +2 -0
  312. package/dist/components/features/automations/automation-view-mode.cjs.map +1 -0
  313. package/dist/components/features/automations/automation-view-mode.d.ts +5 -1
  314. package/dist/components/features/automations/automation-view-mode.js +6 -0
  315. package/dist/components/features/automations/automation-view-mode.js.map +1 -0
  316. package/dist/components/features/automations/backend-not-configured.cjs +2 -0
  317. package/dist/components/features/automations/backend-not-configured.cjs.map +1 -0
  318. package/dist/components/features/automations/backend-not-configured.js +34 -0
  319. package/dist/components/features/automations/backend-not-configured.js.map +1 -0
  320. package/dist/components/features/automations/build-automation-menu-items.cjs +2 -0
  321. package/dist/components/features/automations/build-automation-menu-items.cjs.map +1 -0
  322. package/dist/components/features/automations/build-automation-menu-items.js +53 -0
  323. package/dist/components/features/automations/build-automation-menu-items.js.map +1 -0
  324. package/dist/components/features/automations/build-automation-pills.cjs +2 -0
  325. package/dist/components/features/automations/build-automation-pills.cjs.map +1 -0
  326. package/dist/components/features/automations/build-automation-pills.js +71 -0
  327. package/dist/components/features/automations/build-automation-pills.js.map +1 -0
  328. package/dist/components/features/automations/create-instructions.cjs +2 -0
  329. package/dist/components/features/automations/create-instructions.cjs.map +1 -0
  330. package/dist/components/features/automations/create-instructions.js +102 -0
  331. package/dist/components/features/automations/create-instructions.js.map +1 -0
  332. package/dist/components/features/automations/dashboard/automations-dashboard-controls.d.ts +4 -3
  333. package/dist/components/features/automations/detail/run-status-badge.cjs +2 -0
  334. package/dist/components/features/automations/detail/run-status-badge.cjs.map +1 -0
  335. package/dist/components/features/automations/detail/run-status-badge.js +102 -0
  336. package/dist/components/features/automations/detail/run-status-badge.js.map +1 -0
  337. package/dist/components/features/automations/empty-state.cjs +2 -0
  338. package/dist/components/features/automations/empty-state.cjs.map +1 -0
  339. package/dist/components/features/automations/empty-state.js +35 -0
  340. package/dist/components/features/automations/empty-state.js.map +1 -0
  341. package/dist/components/features/automations/error-state.cjs +2 -0
  342. package/dist/components/features/automations/error-state.cjs.map +1 -0
  343. package/dist/components/features/automations/error-state.js +28 -0
  344. package/dist/components/features/automations/error-state.js.map +1 -0
  345. package/dist/components/features/automations/git-sync/git-sync-activity-row.d.ts +15 -0
  346. package/dist/components/features/automations/git-sync/git-sync-config-form.d.ts +13 -0
  347. package/dist/components/features/automations/git-sync/git-sync-error-banner.d.ts +6 -0
  348. package/dist/components/features/automations/git-sync/git-sync-not-local-state.d.ts +1 -0
  349. package/dist/components/features/automations/git-sync/git-sync-overview-section.d.ts +12 -0
  350. package/dist/components/features/automations/git-sync/git-sync-skeleton.d.ts +1 -0
  351. package/dist/components/features/automations/git-sync/git-sync-status-pill.d.ts +7 -0
  352. package/dist/components/features/automations/git-sync/git-sync-unsupported-state.d.ts +7 -0
  353. package/dist/components/features/automations/import-automation-modal.d.ts +2 -1
  354. package/dist/components/features/automations/kebab-menu-item-content.cjs +2 -0
  355. package/dist/components/features/automations/kebab-menu-item-content.cjs.map +1 -0
  356. package/dist/components/features/automations/kebab-menu-item-content.js +21 -0
  357. package/dist/components/features/automations/kebab-menu-item-content.js.map +1 -0
  358. package/dist/components/features/automations/kebab-menu.cjs +2 -0
  359. package/dist/components/features/automations/kebab-menu.cjs.map +1 -0
  360. package/dist/components/features/automations/kebab-menu.d.ts +2 -1
  361. package/dist/components/features/automations/kebab-menu.js +76 -0
  362. package/dist/components/features/automations/kebab-menu.js.map +1 -0
  363. package/dist/components/features/automations/recommended-automations-launcher.cjs +2 -0
  364. package/dist/components/features/automations/recommended-automations-launcher.cjs.map +1 -0
  365. package/dist/components/features/automations/recommended-automations-launcher.d.ts +7 -1
  366. package/dist/components/features/automations/recommended-automations-launcher.js +134 -0
  367. package/dist/components/features/automations/recommended-automations-launcher.js.map +1 -0
  368. package/dist/components/features/automations/recommended-automations-rail.cjs +2 -0
  369. package/dist/components/features/automations/recommended-automations-rail.cjs.map +1 -0
  370. package/dist/components/features/automations/recommended-automations-rail.d.ts +9 -0
  371. package/dist/components/features/automations/recommended-automations-rail.js +127 -0
  372. package/dist/components/features/automations/recommended-automations-rail.js.map +1 -0
  373. package/dist/components/features/automations/recommended-automations-section.cjs +2 -0
  374. package/dist/components/features/automations/recommended-automations-section.cjs.map +1 -0
  375. package/dist/components/features/automations/recommended-automations-section.d.ts +2 -2
  376. package/dist/components/features/automations/recommended-automations-section.js +198 -0
  377. package/dist/components/features/automations/recommended-automations-section.js.map +1 -0
  378. package/dist/components/features/automations/responder-deployment-modal.cjs +2 -0
  379. package/dist/components/features/automations/responder-deployment-modal.cjs.map +1 -0
  380. package/dist/components/features/automations/responder-deployment-modal.d.ts +2 -1
  381. package/dist/components/features/automations/responder-deployment-modal.js +75 -0
  382. package/dist/components/features/automations/responder-deployment-modal.js.map +1 -0
  383. package/dist/components/features/automations/status-badge.cjs +2 -0
  384. package/dist/components/features/automations/status-badge.cjs.map +1 -0
  385. package/dist/components/features/automations/status-badge.js +12 -0
  386. package/dist/components/features/automations/status-badge.js.map +1 -0
  387. package/dist/components/features/automations/to-latest-run-state.cjs +2 -0
  388. package/dist/components/features/automations/to-latest-run-state.cjs.map +1 -0
  389. package/dist/components/features/automations/to-latest-run-state.d.ts +6 -0
  390. package/dist/components/features/automations/to-latest-run-state.js +21 -0
  391. package/dist/components/features/automations/to-latest-run-state.js.map +1 -0
  392. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  393. package/dist/components/features/backends/backend-form-modal.js +10 -10
  394. package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
  395. package/dist/components/features/backends/manage-backends-modal.js +5 -5
  396. package/dist/components/features/chat/chat-interface.cjs +2 -2
  397. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  398. package/dist/components/features/chat/chat-interface.js +151 -148
  399. package/dist/components/features/chat/chat-interface.js.map +1 -1
  400. package/dist/components/features/chat/error-message-banner.cjs +1 -1
  401. package/dist/components/features/chat/error-message-banner.cjs.map +1 -1
  402. package/dist/components/features/chat/error-message-banner.d.ts +3 -1
  403. package/dist/components/features/chat/error-message-banner.js +64 -58
  404. package/dist/components/features/chat/error-message-banner.js.map +1 -1
  405. package/dist/components/features/command-menu/command-menu-items.d.ts +10 -4
  406. package/dist/components/features/conversation/conversation-git-actions-menu.cjs +2 -0
  407. package/dist/components/features/conversation/conversation-git-actions-menu.cjs.map +1 -0
  408. package/dist/components/features/conversation/conversation-git-actions-menu.d.ts +15 -0
  409. package/dist/components/features/conversation/conversation-git-actions-menu.js +123 -0
  410. package/dist/components/features/conversation/conversation-git-actions-menu.js.map +1 -0
  411. package/dist/components/features/conversation/conversation-git-actions-toggle.cjs +2 -0
  412. package/dist/components/features/conversation/conversation-git-actions-toggle.cjs.map +1 -0
  413. package/dist/components/features/conversation/conversation-git-actions-toggle.d.ts +10 -0
  414. package/dist/components/features/conversation/conversation-git-actions-toggle.js +60 -0
  415. package/dist/components/features/conversation/conversation-git-actions-toggle.js.map +1 -0
  416. package/dist/components/features/conversation/conversation-main/chat-interface-wrapper.cjs +1 -1
  417. package/dist/components/features/conversation/conversation-main/chat-interface-wrapper.cjs.map +1 -1
  418. package/dist/components/features/conversation/conversation-main/chat-interface-wrapper.js +46 -10
  419. package/dist/components/features/conversation/conversation-main/chat-interface-wrapper.js.map +1 -1
  420. package/dist/components/features/conversation/conversation-main/conversation-main.cjs +1 -1
  421. package/dist/components/features/conversation/conversation-main/conversation-main.cjs.map +1 -1
  422. package/dist/components/features/conversation/conversation-main/conversation-main.js +49 -43
  423. package/dist/components/features/conversation/conversation-main/conversation-main.js.map +1 -1
  424. package/dist/components/features/conversation/conversation-name-with-status.cjs +1 -1
  425. package/dist/components/features/conversation/conversation-name-with-status.cjs.map +1 -1
  426. package/dist/components/features/conversation/conversation-name-with-status.js +49 -40
  427. package/dist/components/features/conversation/conversation-name-with-status.js.map +1 -1
  428. package/dist/components/features/conversation/conversation-name.cjs +1 -1
  429. package/dist/components/features/conversation/conversation-name.js +4 -4
  430. package/dist/components/features/conversation/conversation-overview-automations-panel.cjs +2 -0
  431. package/dist/components/features/conversation/conversation-overview-automations-panel.cjs.map +1 -0
  432. package/dist/components/features/conversation/conversation-overview-automations-panel.d.ts +6 -0
  433. package/dist/components/features/conversation/conversation-overview-automations-panel.js +48 -0
  434. package/dist/components/features/conversation/conversation-overview-automations-panel.js.map +1 -0
  435. package/dist/components/features/conversation/conversation-overview-context-menu.cjs +2 -0
  436. package/dist/components/features/conversation/conversation-overview-context-menu.cjs.map +1 -0
  437. package/dist/components/features/conversation/conversation-overview-context-menu.d.ts +10 -0
  438. package/dist/components/features/conversation/conversation-overview-context-menu.js +221 -0
  439. package/dist/components/features/conversation/conversation-overview-context-menu.js.map +1 -0
  440. package/dist/components/features/conversation/conversation-overview-diffs-row.cjs +2 -0
  441. package/dist/components/features/conversation/conversation-overview-diffs-row.cjs.map +1 -0
  442. package/dist/components/features/conversation/conversation-overview-diffs-row.d.ts +2 -0
  443. package/dist/components/features/conversation/conversation-overview-diffs-row.js +88 -0
  444. package/dist/components/features/conversation/conversation-overview-diffs-row.js.map +1 -0
  445. package/dist/components/features/conversation/conversation-overview-drawer-content.cjs +2 -0
  446. package/dist/components/features/conversation/conversation-overview-drawer-content.cjs.map +1 -0
  447. package/dist/components/features/conversation/conversation-overview-drawer-content.d.ts +6 -0
  448. package/dist/components/features/conversation/conversation-overview-drawer-content.js +138 -0
  449. package/dist/components/features/conversation/conversation-overview-drawer-content.js.map +1 -0
  450. package/dist/components/features/conversation/conversation-overview-drawer-context.cjs +2 -0
  451. package/dist/components/features/conversation/conversation-overview-drawer-context.cjs.map +1 -0
  452. package/dist/components/features/conversation/conversation-overview-drawer-context.d.ts +17 -0
  453. package/dist/components/features/conversation/conversation-overview-drawer-context.js +43 -0
  454. package/dist/components/features/conversation/conversation-overview-drawer-context.js.map +1 -0
  455. package/dist/components/features/conversation/conversation-overview-drawer.cjs +2 -0
  456. package/dist/components/features/conversation/conversation-overview-drawer.cjs.map +1 -0
  457. package/dist/components/features/conversation/conversation-overview-drawer.constants.cjs +2 -0
  458. package/dist/components/features/conversation/conversation-overview-drawer.constants.cjs.map +1 -0
  459. package/dist/components/features/conversation/conversation-overview-drawer.constants.d.ts +6 -0
  460. package/dist/components/features/conversation/conversation-overview-drawer.constants.js +6 -0
  461. package/dist/components/features/conversation/conversation-overview-drawer.constants.js.map +1 -0
  462. package/dist/components/features/conversation/conversation-overview-drawer.d.ts +7 -0
  463. package/dist/components/features/conversation/conversation-overview-drawer.js +45 -0
  464. package/dist/components/features/conversation/conversation-overview-drawer.js.map +1 -0
  465. package/dist/components/features/conversation/conversation-overview-drawer.types.cjs +2 -0
  466. package/dist/components/features/conversation/conversation-overview-drawer.types.cjs.map +1 -0
  467. package/dist/components/features/conversation/conversation-overview-drawer.types.d.ts +12 -0
  468. package/dist/components/features/conversation/conversation-overview-drawer.types.js +13 -0
  469. package/dist/components/features/conversation/conversation-overview-drawer.types.js.map +1 -0
  470. package/dist/components/features/conversation/conversation-overview-git-items-panel.cjs +2 -0
  471. package/dist/components/features/conversation/conversation-overview-git-items-panel.cjs.map +1 -0
  472. package/dist/components/features/conversation/conversation-overview-git-items-panel.d.ts +7 -0
  473. package/dist/components/features/conversation/conversation-overview-git-items-panel.js +81 -0
  474. package/dist/components/features/conversation/conversation-overview-git-items-panel.js.map +1 -0
  475. package/dist/components/features/conversation/conversation-overview-git-section.cjs +2 -0
  476. package/dist/components/features/conversation/conversation-overview-git-section.cjs.map +1 -0
  477. package/dist/components/features/conversation/conversation-overview-git-section.d.ts +6 -0
  478. package/dist/components/features/conversation/conversation-overview-git-section.js +143 -0
  479. package/dist/components/features/conversation/conversation-overview-git-section.js.map +1 -0
  480. package/dist/components/features/conversation/conversation-overview-mcp-panel.cjs +2 -0
  481. package/dist/components/features/conversation/conversation-overview-mcp-panel.cjs.map +1 -0
  482. package/dist/components/features/conversation/conversation-overview-mcp-panel.d.ts +6 -0
  483. package/dist/components/features/conversation/conversation-overview-mcp-panel.js +108 -0
  484. package/dist/components/features/conversation/conversation-overview-mcp-panel.js.map +1 -0
  485. package/dist/components/features/conversation/conversation-overview-panel.cjs +2 -0
  486. package/dist/components/features/conversation/conversation-overview-panel.cjs.map +1 -0
  487. package/dist/components/features/conversation/conversation-overview-panel.constants.cjs +2 -0
  488. package/dist/components/features/conversation/conversation-overview-panel.constants.cjs.map +1 -0
  489. package/dist/components/features/conversation/conversation-overview-panel.constants.d.ts +24 -0
  490. package/dist/components/features/conversation/conversation-overview-panel.constants.js +12 -0
  491. package/dist/components/features/conversation/conversation-overview-panel.constants.js.map +1 -0
  492. package/dist/components/features/conversation/conversation-overview-panel.d.ts +2 -0
  493. package/dist/components/features/conversation/conversation-overview-panel.js +102 -0
  494. package/dist/components/features/conversation/conversation-overview-panel.js.map +1 -0
  495. package/dist/components/features/conversation/conversation-overview-project-scope-toggle.cjs +2 -0
  496. package/dist/components/features/conversation/conversation-overview-project-scope-toggle.cjs.map +1 -0
  497. package/dist/components/features/conversation/conversation-overview-project-scope-toggle.d.ts +8 -0
  498. package/dist/components/features/conversation/conversation-overview-project-scope-toggle.js +29 -0
  499. package/dist/components/features/conversation/conversation-overview-project-scope-toggle.js.map +1 -0
  500. package/dist/components/features/conversation/conversation-overview-secrets-panel.cjs +2 -0
  501. package/dist/components/features/conversation/conversation-overview-secrets-panel.cjs.map +1 -0
  502. package/dist/components/features/conversation/conversation-overview-secrets-panel.d.ts +6 -0
  503. package/dist/components/features/conversation/conversation-overview-secrets-panel.js +89 -0
  504. package/dist/components/features/conversation/conversation-overview-secrets-panel.js.map +1 -0
  505. package/dist/components/features/conversation/conversation-overview-sections.cjs +2 -0
  506. package/dist/components/features/conversation/conversation-overview-sections.cjs.map +1 -0
  507. package/dist/components/features/conversation/conversation-overview-sections.d.ts +43 -0
  508. package/dist/components/features/conversation/conversation-overview-sections.js +27 -0
  509. package/dist/components/features/conversation/conversation-overview-sections.js.map +1 -0
  510. package/dist/components/features/conversation/conversation-overview-skills-panel.cjs +2 -0
  511. package/dist/components/features/conversation/conversation-overview-skills-panel.cjs.map +1 -0
  512. package/dist/components/features/conversation/conversation-overview-skills-panel.d.ts +6 -0
  513. package/dist/components/features/conversation/conversation-overview-skills-panel.js +138 -0
  514. package/dist/components/features/conversation/conversation-overview-skills-panel.js.map +1 -0
  515. package/dist/components/features/conversation/conversation-overview-toggle.cjs +2 -0
  516. package/dist/components/features/conversation/conversation-overview-toggle.cjs.map +1 -0
  517. package/dist/components/features/conversation/conversation-overview-toggle.d.ts +11 -0
  518. package/dist/components/features/conversation/conversation-overview-toggle.js +99 -0
  519. package/dist/components/features/conversation/conversation-overview-toggle.js.map +1 -0
  520. package/dist/components/features/conversation/conversation-secondary-drawer.classes.cjs +2 -0
  521. package/dist/components/features/conversation/conversation-secondary-drawer.classes.cjs.map +1 -0
  522. package/dist/components/features/conversation/conversation-secondary-drawer.classes.d.ts +4 -0
  523. package/dist/components/features/conversation/conversation-secondary-drawer.classes.js +7 -0
  524. package/dist/components/features/conversation/conversation-secondary-drawer.classes.js.map +1 -0
  525. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs +1 -1
  526. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs.map +1 -1
  527. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js +10 -9
  528. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js.map +1 -1
  529. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
  530. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
  531. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +68 -62
  532. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
  533. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
  534. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
  535. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +98 -88
  536. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
  537. package/dist/components/features/conversation/right-panel-toggle.cjs +1 -1
  538. package/dist/components/features/conversation/right-panel-toggle.cjs.map +1 -1
  539. package/dist/components/features/conversation/right-panel-toggle.d.ts +3 -2
  540. package/dist/components/features/conversation/right-panel-toggle.js +34 -33
  541. package/dist/components/features/conversation/right-panel-toggle.js.map +1 -1
  542. package/dist/components/features/conversation-panel/compact-conversation-row.cjs +1 -1
  543. package/dist/components/features/conversation-panel/compact-conversation-row.js +6 -6
  544. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  545. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  546. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +2 -1
  547. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +14 -7
  548. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  549. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  550. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  551. package/dist/components/features/conversation-panel/conversation-panel.js +263 -236
  552. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  553. package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs +1 -1
  554. package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs.map +1 -1
  555. package/dist/components/features/conversation-panel/local-new-conversation-menu.js +4 -4
  556. package/dist/components/features/conversation-panel/local-new-conversation-menu.js.map +1 -1
  557. package/dist/components/features/diff-viewer/accordion-panel.cjs +2 -0
  558. package/dist/components/features/diff-viewer/accordion-panel.cjs.map +1 -0
  559. package/dist/components/features/diff-viewer/accordion-panel.d.ts +13 -0
  560. package/dist/components/features/diff-viewer/accordion-panel.js +41 -0
  561. package/dist/components/features/diff-viewer/accordion-panel.js.map +1 -0
  562. package/dist/components/features/diff-viewer/commit-list.cjs +1 -1
  563. package/dist/components/features/diff-viewer/commit-list.cjs.map +1 -1
  564. package/dist/components/features/diff-viewer/commit-list.d.ts +5 -1
  565. package/dist/components/features/diff-viewer/commit-list.js +30 -16
  566. package/dist/components/features/diff-viewer/commit-list.js.map +1 -1
  567. package/dist/components/features/diff-viewer/commit-row.cjs +1 -1
  568. package/dist/components/features/diff-viewer/commit-row.cjs.map +1 -1
  569. package/dist/components/features/diff-viewer/commit-row.d.ts +1 -2
  570. package/dist/components/features/diff-viewer/commit-row.js +38 -34
  571. package/dist/components/features/diff-viewer/commit-row.js.map +1 -1
  572. package/dist/components/features/diff-viewer/diff-change-list.cjs +2 -0
  573. package/dist/components/features/diff-viewer/diff-change-list.cjs.map +1 -0
  574. package/dist/components/features/diff-viewer/diff-change-list.d.ts +18 -0
  575. package/dist/components/features/diff-viewer/diff-change-list.js +22 -0
  576. package/dist/components/features/diff-viewer/diff-change-list.js.map +1 -0
  577. package/dist/components/features/diff-viewer/editor-container.cjs +1 -1
  578. package/dist/components/features/diff-viewer/editor-container.cjs.map +1 -1
  579. package/dist/components/features/diff-viewer/editor-container.d.ts +2 -1
  580. package/dist/components/features/diff-viewer/editor-container.js +8 -7
  581. package/dist/components/features/diff-viewer/editor-container.js.map +1 -1
  582. package/dist/components/features/diff-viewer/file-diff-viewer.cjs +1 -1
  583. package/dist/components/features/diff-viewer/file-diff-viewer.cjs.map +1 -1
  584. package/dist/components/features/diff-viewer/file-diff-viewer.d.ts +10 -1
  585. package/dist/components/features/diff-viewer/file-diff-viewer.js +138 -112
  586. package/dist/components/features/diff-viewer/file-diff-viewer.js.map +1 -1
  587. package/dist/components/features/diff-viewer/uncommitted-changes-row.cjs +2 -0
  588. package/dist/components/features/diff-viewer/uncommitted-changes-row.cjs.map +1 -0
  589. package/dist/components/features/diff-viewer/uncommitted-changes-row.d.ts +12 -0
  590. package/dist/components/features/diff-viewer/uncommitted-changes-row.js +51 -0
  591. package/dist/components/features/diff-viewer/uncommitted-changes-row.js.map +1 -0
  592. package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
  593. package/dist/components/features/files-tab/file-content-viewer.cjs.map +1 -1
  594. package/dist/components/features/files-tab/file-content-viewer.js +0 -1
  595. package/dist/components/features/files-tab/file-content-viewer.js.map +1 -1
  596. package/dist/components/features/files-tab/file-quick-row.cjs +1 -1
  597. package/dist/components/features/files-tab/file-quick-row.cjs.map +1 -1
  598. package/dist/components/features/files-tab/file-quick-row.d.ts +9 -7
  599. package/dist/components/features/files-tab/file-quick-row.js +63 -34
  600. package/dist/components/features/files-tab/file-quick-row.js.map +1 -1
  601. package/dist/components/features/files-tab/files-tab-tree.constants.cjs +2 -0
  602. package/dist/components/features/files-tab/files-tab-tree.constants.cjs.map +1 -0
  603. package/dist/components/features/files-tab/files-tab-tree.constants.d.ts +7 -0
  604. package/dist/components/features/files-tab/files-tab-tree.constants.js +6 -0
  605. package/dist/components/features/files-tab/files-tab-tree.constants.js.map +1 -0
  606. package/dist/components/features/files-tab/segmented-toggle.cjs +1 -1
  607. package/dist/components/features/files-tab/segmented-toggle.cjs.map +1 -1
  608. package/dist/components/features/files-tab/segmented-toggle.d.ts +5 -3
  609. package/dist/components/features/files-tab/segmented-toggle.js +10 -13
  610. package/dist/components/features/files-tab/segmented-toggle.js.map +1 -1
  611. package/dist/components/features/files-tab/tree-node.cjs +1 -1
  612. package/dist/components/features/files-tab/tree-node.cjs.map +1 -1
  613. package/dist/components/features/files-tab/tree-node.js +34 -32
  614. package/dist/components/features/files-tab/tree-node.js.map +1 -1
  615. package/dist/components/features/files-tab/workspace-path.cjs +2 -0
  616. package/dist/components/features/files-tab/workspace-path.cjs.map +1 -0
  617. package/dist/components/features/files-tab/workspace-path.d.ts +6 -0
  618. package/dist/components/features/files-tab/workspace-path.js +41 -0
  619. package/dist/components/features/files-tab/workspace-path.js.map +1 -0
  620. package/dist/components/features/home/featured-automations/automation-health-indicator.cjs +2 -0
  621. package/dist/components/features/home/featured-automations/automation-health-indicator.cjs.map +1 -0
  622. package/dist/components/features/home/featured-automations/automation-health-indicator.js +22 -0
  623. package/dist/components/features/home/featured-automations/automation-health-indicator.js.map +1 -0
  624. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs +2 -0
  625. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs.map +1 -0
  626. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js +45 -0
  627. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js.map +1 -0
  628. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs +2 -0
  629. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs.map +1 -0
  630. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js +108 -0
  631. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js.map +1 -0
  632. package/dist/components/features/home/featured-automations/automation-run-health.cjs +2 -0
  633. package/dist/components/features/home/featured-automations/automation-run-health.cjs.map +1 -0
  634. package/dist/components/features/home/featured-automations/automation-run-health.js +75 -0
  635. package/dist/components/features/home/featured-automations/automation-run-health.js.map +1 -0
  636. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs +2 -0
  637. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs.map +1 -0
  638. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js +74 -0
  639. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js.map +1 -0
  640. package/dist/components/features/home/featured-automations/pinned-automation-card.d.ts +3 -3
  641. package/dist/components/features/home/git-repo-dropdown/use-url-search.cjs +1 -1
  642. package/dist/components/features/home/git-repo-dropdown/use-url-search.cjs.map +1 -1
  643. package/dist/components/features/home/git-repo-dropdown/use-url-search.js +1 -1
  644. package/dist/components/features/home/git-repo-dropdown/use-url-search.js.map +1 -1
  645. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.cjs +1 -1
  646. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.js +6 -6
  647. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.cjs +1 -1
  648. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.js +6 -6
  649. package/dist/components/features/manifest/manifest-form-field.d.ts +4 -3
  650. package/dist/components/features/manifest/manifest-icons.cjs +2 -0
  651. package/dist/components/features/manifest/manifest-icons.cjs.map +1 -0
  652. package/dist/components/features/manifest/manifest-icons.d.ts +1 -0
  653. package/dist/components/features/manifest/manifest-icons.js +21 -0
  654. package/dist/components/features/manifest/manifest-icons.js.map +1 -0
  655. package/dist/components/features/manifest/manifest-repository-list.d.ts +25 -0
  656. package/dist/components/features/markdown/markdown-table-scroll.cjs +1 -1
  657. package/dist/components/features/markdown/markdown-table-scroll.cjs.map +1 -1
  658. package/dist/components/features/markdown/markdown-table-scroll.d.ts +2 -6
  659. package/dist/components/features/markdown/markdown-table-scroll.js +15 -21
  660. package/dist/components/features/markdown/markdown-table-scroll.js.map +1 -1
  661. package/dist/components/features/mcp-logo-badge.cjs +1 -1
  662. package/dist/components/features/mcp-logo-badge.cjs.map +1 -1
  663. package/dist/components/features/mcp-logo-badge.d.ts +1 -1
  664. package/dist/components/features/mcp-logo-badge.js +1 -0
  665. package/dist/components/features/mcp-logo-badge.js.map +1 -1
  666. package/dist/components/features/mcp-page/custom-server-editor.cjs +1 -1
  667. package/dist/components/features/mcp-page/custom-server-editor.js +16 -16
  668. package/dist/components/features/mcp-page/index.cjs +1 -1
  669. package/dist/components/features/mcp-page/index.js +2 -2
  670. package/dist/components/features/mcp-page/install-server-modal.cjs +1 -1
  671. package/dist/components/features/mcp-page/install-server-modal.cjs.map +1 -1
  672. package/dist/components/features/mcp-page/install-server-modal.js +25 -25
  673. package/dist/components/features/mcp-page/install-server-modal.js.map +1 -1
  674. package/dist/components/features/mcp-page/installed-server-card.cjs +1 -1
  675. package/dist/components/features/mcp-page/installed-server-card.js +5 -5
  676. package/dist/components/features/mcp-page/marketplace-card.cjs +1 -1
  677. package/dist/components/features/mcp-page/marketplace-card.js +4 -4
  678. package/dist/components/features/mcp-page/marketplace-section.cjs +1 -1
  679. package/dist/components/features/mcp-page/marketplace-section.js +3 -3
  680. package/dist/components/features/mcp-page/mcp-logo-stack-badge.cjs +2 -0
  681. package/dist/components/features/mcp-page/mcp-logo-stack-badge.cjs.map +1 -0
  682. package/dist/components/features/mcp-page/mcp-logo-stack-badge.js +60 -0
  683. package/dist/components/features/mcp-page/mcp-logo-stack-badge.js.map +1 -0
  684. package/dist/components/features/mcp-page/mcp-server-health.cjs +1 -1
  685. package/dist/components/features/mcp-page/mcp-server-health.js +18 -18
  686. package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +10 -7
  687. package/dist/components/features/onboarding/use-onboarding-completion.cjs +2 -0
  688. package/dist/components/features/onboarding/use-onboarding-completion.cjs.map +1 -0
  689. package/dist/components/features/onboarding/use-onboarding-completion.js +32 -0
  690. package/dist/components/features/onboarding/use-onboarding-completion.js.map +1 -0
  691. package/dist/components/features/settings/app-settings/getting-started-checklist-switch.cjs +2 -0
  692. package/dist/components/features/settings/app-settings/getting-started-checklist-switch.cjs.map +1 -0
  693. package/dist/components/features/settings/app-settings/getting-started-checklist-switch.d.ts +1 -0
  694. package/dist/components/features/settings/app-settings/getting-started-checklist-switch.js +22 -0
  695. package/dist/components/features/settings/app-settings/getting-started-checklist-switch.js.map +1 -0
  696. package/dist/components/features/settings/brand-button.cjs +1 -1
  697. package/dist/components/features/settings/brand-button.cjs.map +1 -1
  698. package/dist/components/features/settings/brand-button.d.ts +2 -0
  699. package/dist/components/features/settings/brand-button.js +4 -2
  700. package/dist/components/features/settings/brand-button.js.map +1 -1
  701. package/dist/components/features/settings/llm-profiles/delete-provider-connection-modal.cjs +1 -0
  702. package/dist/components/features/settings/llm-profiles/delete-provider-connection-modal.d.ts +7 -0
  703. package/dist/components/features/settings/llm-profiles/delete-provider-connection-modal.js +7 -0
  704. package/dist/components/features/settings/llm-profiles/llm-profiles-manager.cjs +1 -1
  705. package/dist/components/features/settings/llm-profiles/llm-profiles-manager.js +3 -0
  706. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  707. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +1 -0
  708. package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +20 -1
  709. package/dist/components/features/settings/llm-profiles/provider-connection-modal.cjs +1 -0
  710. package/dist/components/features/settings/llm-profiles/provider-connection-modal.d.ts +19 -0
  711. package/dist/components/features/settings/llm-profiles/provider-connection-modal.js +10 -0
  712. package/dist/components/features/settings/llm-profiles/provider-connection-row.cjs +1 -0
  713. package/dist/components/features/settings/llm-profiles/provider-connection-row.d.ts +10 -0
  714. package/dist/components/features/settings/llm-profiles/provider-connection-row.js +6 -0
  715. package/dist/components/features/settings/llm-profiles/provider-connections-manager.cjs +1 -0
  716. package/dist/components/features/settings/llm-profiles/provider-connections-manager.d.ts +15 -0
  717. package/dist/components/features/settings/llm-profiles/provider-connections-manager.js +8 -0
  718. package/dist/components/features/settings/sdk-settings/schema-field.cjs +1 -1
  719. package/dist/components/features/settings/sdk-settings/schema-field.js +6 -6
  720. package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs +1 -1
  721. package/dist/components/features/settings/sdk-settings/sdk-section-page.js +7 -7
  722. package/dist/components/features/settings/sdk-settings/sdk-section-page.js.map +1 -1
  723. package/dist/components/features/settings/secrets-settings/secret-form.cjs +1 -1
  724. package/dist/components/features/settings/secrets-settings/secret-form.js +7 -7
  725. package/dist/components/features/settings/settings-input.cjs +1 -1
  726. package/dist/components/features/settings/settings-input.cjs.map +1 -1
  727. package/dist/components/features/settings/settings-input.d.ts +6 -0
  728. package/dist/components/features/settings/settings-input.js +14 -13
  729. package/dist/components/features/settings/settings-input.js.map +1 -1
  730. package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-icon.cjs +2 -0
  731. package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-icon.cjs.map +1 -0
  732. package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-icon.d.ts +7 -0
  733. package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-icon.js +102 -0
  734. package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-icon.js.map +1 -0
  735. package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-preview.cjs +2 -0
  736. package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-preview.cjs.map +1 -0
  737. package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-preview.d.ts +8 -0
  738. package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-preview.js +66 -0
  739. package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-preview.js.map +1 -0
  740. package/dist/components/features/sidebar/sidebar-onboarding-checklist-llm-complete.cjs +2 -0
  741. package/dist/components/features/sidebar/sidebar-onboarding-checklist-llm-complete.cjs.map +1 -0
  742. package/dist/components/features/sidebar/sidebar-onboarding-checklist-llm-complete.d.ts +3 -0
  743. package/dist/components/features/sidebar/sidebar-onboarding-checklist-llm-complete.js +15 -0
  744. package/dist/components/features/sidebar/sidebar-onboarding-checklist-llm-complete.js.map +1 -0
  745. package/dist/components/features/sidebar/sidebar-onboarding-checklist-storage.cjs +2 -0
  746. package/dist/components/features/sidebar/sidebar-onboarding-checklist-storage.cjs.map +1 -0
  747. package/dist/components/features/sidebar/sidebar-onboarding-checklist-storage.d.ts +10 -0
  748. package/dist/components/features/sidebar/sidebar-onboarding-checklist-storage.js +39 -0
  749. package/dist/components/features/sidebar/sidebar-onboarding-checklist-storage.js.map +1 -0
  750. package/dist/components/features/sidebar/sidebar-onboarding-checklist.cjs +2 -0
  751. package/dist/components/features/sidebar/sidebar-onboarding-checklist.cjs.map +1 -0
  752. package/dist/components/features/sidebar/sidebar-onboarding-checklist.constants.cjs +2 -0
  753. package/dist/components/features/sidebar/sidebar-onboarding-checklist.constants.cjs.map +1 -0
  754. package/dist/components/features/sidebar/sidebar-onboarding-checklist.constants.d.ts +26 -0
  755. package/dist/components/features/sidebar/sidebar-onboarding-checklist.constants.js +78 -0
  756. package/dist/components/features/sidebar/sidebar-onboarding-checklist.constants.js.map +1 -0
  757. package/dist/components/features/sidebar/sidebar-onboarding-checklist.d.ts +5 -0
  758. package/dist/components/features/sidebar/sidebar-onboarding-checklist.js +127 -0
  759. package/dist/components/features/sidebar/sidebar-onboarding-checklist.js.map +1 -0
  760. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  761. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  762. package/dist/components/features/sidebar/sidebar-rail-body.js +115 -111
  763. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  764. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist-dismissed.cjs +2 -0
  765. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist-dismissed.cjs.map +1 -0
  766. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist-dismissed.d.ts +1 -0
  767. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist-dismissed.js +10 -0
  768. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist-dismissed.js.map +1 -0
  769. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.cjs +2 -0
  770. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.cjs.map +1 -0
  771. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.d.ts +15 -0
  772. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.js +75 -0
  773. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.js.map +1 -0
  774. package/dist/components/features/skills/add-skill-modal.cjs +2 -0
  775. package/dist/components/features/skills/add-skill-modal.cjs.map +1 -0
  776. package/dist/components/features/skills/add-skill-modal.js +164 -0
  777. package/dist/components/features/skills/add-skill-modal.js.map +1 -0
  778. package/dist/components/features/skills/build-skill-pills.cjs +2 -0
  779. package/dist/components/features/skills/build-skill-pills.cjs.map +1 -0
  780. package/dist/components/features/skills/build-skill-pills.js +88 -0
  781. package/dist/components/features/skills/build-skill-pills.js.map +1 -0
  782. package/dist/components/features/skills/get-skill-card-description.cjs +2 -0
  783. package/dist/components/features/skills/get-skill-card-description.cjs.map +1 -0
  784. package/dist/components/features/skills/get-skill-card-description.js +34 -0
  785. package/dist/components/features/skills/get-skill-card-description.js.map +1 -0
  786. package/dist/components/features/skills/get-skill-chat-launch-message.cjs +2 -0
  787. package/dist/components/features/skills/get-skill-chat-launch-message.cjs.map +1 -0
  788. package/dist/components/features/skills/get-skill-chat-launch-message.js +9 -0
  789. package/dist/components/features/skills/get-skill-chat-launch-message.js.map +1 -0
  790. package/dist/components/features/skills/is-copyable-skill-source.cjs +2 -0
  791. package/dist/components/features/skills/is-copyable-skill-source.cjs.map +1 -0
  792. package/dist/components/features/skills/is-copyable-skill-source.js +9 -0
  793. package/dist/components/features/skills/is-copyable-skill-source.js.map +1 -0
  794. package/dist/components/features/skills/skill-card-pill-row.cjs +2 -0
  795. package/dist/components/features/skills/skill-card-pill-row.cjs.map +1 -0
  796. package/dist/components/features/skills/skill-card-pill-row.d.ts +1 -1
  797. package/dist/components/features/skills/skill-card-pill-row.js +137 -0
  798. package/dist/components/features/skills/skill-card-pill-row.js.map +1 -0
  799. package/dist/components/features/skills/skill-card.cjs +2 -0
  800. package/dist/components/features/skills/skill-card.cjs.map +1 -0
  801. package/dist/components/features/skills/skill-card.js +93 -0
  802. package/dist/components/features/skills/skill-card.js.map +1 -0
  803. package/dist/components/features/skills/skill-detail-modal.cjs +3 -0
  804. package/dist/components/features/skills/skill-detail-modal.cjs.map +1 -0
  805. package/dist/components/features/skills/skill-detail-modal.js +150 -0
  806. package/dist/components/features/skills/skill-detail-modal.js.map +1 -0
  807. package/dist/components/features/skills/skill-facet-rail.cjs +2 -0
  808. package/dist/components/features/skills/skill-facet-rail.cjs.map +1 -0
  809. package/dist/components/features/skills/skill-facet-rail.js +42 -0
  810. package/dist/components/features/skills/skill-facet-rail.js.map +1 -0
  811. package/dist/components/features/skills/skill-facet-row.cjs +2 -0
  812. package/dist/components/features/skills/skill-facet-row.cjs.map +1 -0
  813. package/dist/components/features/skills/skill-facet-row.js +44 -0
  814. package/dist/components/features/skills/skill-facet-row.js.map +1 -0
  815. package/dist/components/features/skills/skill-filter.cjs +2 -0
  816. package/dist/components/features/skills/skill-filter.cjs.map +1 -0
  817. package/dist/components/features/skills/skill-filter.js +166 -0
  818. package/dist/components/features/skills/skill-filter.js.map +1 -0
  819. package/dist/components/features/skills/skill-filters-modal.cjs +2 -0
  820. package/dist/components/features/skills/skill-filters-modal.cjs.map +1 -0
  821. package/dist/components/features/skills/skill-filters-modal.js +53 -0
  822. package/dist/components/features/skills/skill-filters-modal.js.map +1 -0
  823. package/dist/components/features/skills/skill-icon-badge.cjs +2 -0
  824. package/dist/components/features/skills/skill-icon-badge.cjs.map +1 -0
  825. package/dist/components/features/skills/skill-icon-badge.js +17 -0
  826. package/dist/components/features/skills/skill-icon-badge.js.map +1 -0
  827. package/dist/components/features/skills/skill-type-badge.cjs +2 -0
  828. package/dist/components/features/skills/skill-type-badge.cjs.map +1 -0
  829. package/dist/components/features/skills/skill-type-badge.js +21 -0
  830. package/dist/components/features/skills/skill-type-badge.js.map +1 -0
  831. package/dist/components/features/skills/skills-toolbar.cjs +2 -0
  832. package/dist/components/features/skills/skills-toolbar.cjs.map +1 -0
  833. package/dist/components/features/skills/skills-toolbar.js +63 -0
  834. package/dist/components/features/skills/skills-toolbar.js.map +1 -0
  835. package/dist/components/shared/buttons/circle-plus-check-toggle.cjs +1 -1
  836. package/dist/components/shared/buttons/circle-plus-check-toggle.cjs.map +1 -1
  837. package/dist/components/shared/buttons/circle-plus-check-toggle.js +19 -6
  838. package/dist/components/shared/buttons/circle-plus-check-toggle.js.map +1 -1
  839. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs +1 -1
  840. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs.map +1 -1
  841. package/dist/components/shared/buttons/conversation-confirmation-buttons.js +1 -1
  842. package/dist/components/shared/buttons/conversation-confirmation-buttons.js.map +1 -1
  843. package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
  844. package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
  845. package/dist/components/shared/filters/enum-filter-dropdown.d.ts +4 -1
  846. package/dist/components/shared/filters/enum-filter-dropdown.js +14 -14
  847. package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
  848. package/dist/components/shared/modals/settings/settings-form.cjs +1 -1
  849. package/dist/components/shared/modals/settings/settings-form.js +4 -4
  850. package/dist/components/ui/resize-handle.cjs +1 -1
  851. package/dist/components/ui/resize-handle.cjs.map +1 -1
  852. package/dist/components/ui/resize-handle.d.ts +2 -1
  853. package/dist/components/ui/resize-handle.js +6 -5
  854. package/dist/components/ui/resize-handle.js.map +1 -1
  855. package/dist/config/defaults.cjs +1 -1
  856. package/dist/config/defaults.cjs.map +1 -1
  857. package/dist/config/defaults.js +2 -2
  858. package/dist/config/defaults.js.map +1 -1
  859. package/dist/constants/skills-docs.cjs +2 -0
  860. package/dist/constants/skills-docs.cjs.map +1 -0
  861. package/dist/constants/skills-docs.js +6 -0
  862. package/dist/constants/skills-docs.js.map +1 -0
  863. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  864. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  865. package/dist/contexts/conversation-websocket-context.js +184 -159
  866. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  867. package/dist/fixtures/home-automations-demo.cjs +2 -0
  868. package/dist/fixtures/home-automations-demo.cjs.map +1 -0
  869. package/dist/fixtures/home-automations-demo.d.ts +1 -3
  870. package/dist/fixtures/home-automations-demo.js +384 -0
  871. package/dist/fixtures/home-automations-demo.js.map +1 -0
  872. package/dist/hooks/chat/use-slash-command.cjs +1 -1
  873. package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
  874. package/dist/hooks/chat/use-slash-command.d.ts +1 -2
  875. package/dist/hooks/chat/use-slash-command.js +1 -0
  876. package/dist/hooks/chat/use-slash-command.js.map +1 -1
  877. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  878. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  879. package/dist/hooks/mutation/use-create-conversation.js +27 -30
  880. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  881. package/dist/hooks/mutation/use-create-provider-connection.cjs +1 -0
  882. package/dist/hooks/mutation/use-create-provider-connection.d.ts +2 -0
  883. package/dist/hooks/mutation/use-create-provider-connection.js +1 -0
  884. package/dist/hooks/mutation/use-delete-mcp-server.cjs +1 -1
  885. package/dist/hooks/mutation/use-delete-mcp-server.js +3 -3
  886. package/dist/hooks/mutation/use-delete-provider-connection.cjs +1 -0
  887. package/dist/hooks/mutation/use-delete-provider-connection.d.ts +1 -0
  888. package/dist/hooks/mutation/use-delete-provider-connection.js +1 -0
  889. package/dist/hooks/mutation/use-switch-acp-model.cjs +1 -1
  890. package/dist/hooks/mutation/use-switch-acp-model.cjs.map +1 -1
  891. package/dist/hooks/mutation/use-switch-acp-model.d.ts +5 -3
  892. package/dist/hooks/mutation/use-switch-acp-model.js +9 -13
  893. package/dist/hooks/mutation/use-switch-acp-model.js.map +1 -1
  894. package/dist/hooks/mutation/use-update-mcp-server.cjs +1 -1
  895. package/dist/hooks/mutation/use-update-mcp-server.js +6 -6
  896. package/dist/hooks/mutation/use-update-provider-connection.cjs +1 -0
  897. package/dist/hooks/mutation/use-update-provider-connection.d.ts +7 -0
  898. package/dist/hooks/mutation/use-update-provider-connection.js +1 -0
  899. package/dist/hooks/query/query-keys.cjs +1 -1
  900. package/dist/hooks/query/query-keys.cjs.map +1 -1
  901. package/dist/hooks/query/query-keys.d.ts +3 -0
  902. package/dist/hooks/query/query-keys.js +4 -4
  903. package/dist/hooks/query/query-keys.js.map +1 -1
  904. package/dist/hooks/query/use-automation-detail.cjs +1 -0
  905. package/dist/hooks/query/use-automation-detail.js +2 -0
  906. package/dist/hooks/query/use-automation-health.cjs +2 -0
  907. package/dist/hooks/query/use-automation-health.cjs.map +1 -0
  908. package/dist/hooks/query/use-automation-health.js +22 -0
  909. package/dist/hooks/query/use-automation-health.js.map +1 -0
  910. package/dist/hooks/query/use-automations.cjs +2 -0
  911. package/dist/hooks/query/use-automations.cjs.map +1 -0
  912. package/dist/hooks/query/use-automations.js +28 -0
  913. package/dist/hooks/query/use-automations.js.map +1 -0
  914. package/dist/hooks/query/use-backends-health.cjs +1 -1
  915. package/dist/hooks/query/use-backends-health.cjs.map +1 -1
  916. package/dist/hooks/query/use-backends-health.js +1 -1
  917. package/dist/hooks/query/use-backends-health.js.map +1 -1
  918. package/dist/hooks/query/use-conversation-history.cjs +1 -1
  919. package/dist/hooks/query/use-conversation-history.cjs.map +1 -1
  920. package/dist/hooks/query/use-conversation-history.js +3 -1
  921. package/dist/hooks/query/use-conversation-history.js.map +1 -1
  922. package/dist/hooks/query/use-conversation-metrics.cjs +1 -1
  923. package/dist/hooks/query/use-conversation-metrics.js +3 -3
  924. package/dist/hooks/query/use-git-sync.d.ts +19 -0
  925. package/dist/hooks/query/use-latest-automation-runs.cjs +1 -0
  926. package/dist/hooks/query/use-latest-automation-runs.d.ts +2 -0
  927. package/dist/hooks/query/use-latest-automation-runs.js +3 -0
  928. package/dist/hooks/query/use-llm-profiles.d.ts +1 -1
  929. package/dist/hooks/query/use-paginated-conversations.cjs +1 -1
  930. package/dist/hooks/query/use-paginated-conversations.cjs.map +1 -1
  931. package/dist/hooks/query/use-paginated-conversations.js +1 -1
  932. package/dist/hooks/query/use-paginated-conversations.js.map +1 -1
  933. package/dist/hooks/query/use-provider-connections.cjs +2 -0
  934. package/dist/hooks/query/use-provider-connections.cjs.map +1 -0
  935. package/dist/hooks/query/use-provider-connections.d.ts +8 -0
  936. package/dist/hooks/query/use-provider-connections.js +19 -0
  937. package/dist/hooks/query/use-provider-connections.js.map +1 -0
  938. package/dist/hooks/query/use-repository-git-items.cjs +2 -0
  939. package/dist/hooks/query/use-repository-git-items.cjs.map +1 -0
  940. package/dist/hooks/query/use-repository-git-items.d.ts +3 -0
  941. package/dist/hooks/query/use-repository-git-items.js +33 -0
  942. package/dist/hooks/query/use-repository-git-items.js.map +1 -0
  943. package/dist/hooks/query/use-task-polling.cjs +1 -1
  944. package/dist/hooks/query/use-task-polling.cjs.map +1 -1
  945. package/dist/hooks/query/use-task-polling.js +12 -10
  946. package/dist/hooks/query/use-task-polling.js.map +1 -1
  947. package/dist/hooks/query/use-workspace-files.cjs +1 -1
  948. package/dist/hooks/query/use-workspace-files.cjs.map +1 -1
  949. package/dist/hooks/query/use-workspace-files.d.ts +14 -4
  950. package/dist/hooks/query/use-workspace-files.js +46 -33
  951. package/dist/hooks/query/use-workspace-files.js.map +1 -1
  952. package/dist/hooks/use-bash-command-runner.cjs +1 -1
  953. package/dist/hooks/use-bash-command-runner.cjs.map +1 -1
  954. package/dist/hooks/use-bash-command-runner.js +45 -42
  955. package/dist/hooks/use-bash-command-runner.js.map +1 -1
  956. package/dist/hooks/use-conversation-overview-column-space.cjs +2 -0
  957. package/dist/hooks/use-conversation-overview-column-space.cjs.map +1 -0
  958. package/dist/hooks/use-conversation-overview-column-space.d.ts +2 -0
  959. package/dist/hooks/use-conversation-overview-column-space.js +25 -0
  960. package/dist/hooks/use-conversation-overview-column-space.js.map +1 -0
  961. package/dist/hooks/use-conversation-overview-git-diff-stats.cjs +2 -0
  962. package/dist/hooks/use-conversation-overview-git-diff-stats.cjs.map +1 -0
  963. package/dist/hooks/use-conversation-overview-git-diff-stats.d.ts +7 -0
  964. package/dist/hooks/use-conversation-overview-git-diff-stats.js +37 -0
  965. package/dist/hooks/use-conversation-overview-git-diff-stats.js.map +1 -0
  966. package/dist/hooks/use-conversation-overview-panel-peek.cjs +2 -0
  967. package/dist/hooks/use-conversation-overview-panel-peek.cjs.map +1 -0
  968. package/dist/hooks/use-conversation-overview-panel-peek.d.ts +9 -0
  969. package/dist/hooks/use-conversation-overview-panel-peek.js +32 -0
  970. package/dist/hooks/use-conversation-overview-panel-peek.js.map +1 -0
  971. package/dist/hooks/use-conversation-overview-stats.cjs +2 -0
  972. package/dist/hooks/use-conversation-overview-stats.cjs.map +1 -0
  973. package/dist/hooks/use-conversation-overview-stats.d.ts +4 -0
  974. package/dist/hooks/use-conversation-overview-stats.js +15 -0
  975. package/dist/hooks/use-conversation-overview-stats.js.map +1 -0
  976. package/dist/hooks/use-conversation-primary-repository.cjs +2 -0
  977. package/dist/hooks/use-conversation-primary-repository.cjs.map +1 -0
  978. package/dist/hooks/use-conversation-primary-repository.d.ts +11 -0
  979. package/dist/hooks/use-conversation-primary-repository.js +17 -0
  980. package/dist/hooks/use-conversation-primary-repository.js.map +1 -0
  981. package/dist/hooks/use-drag-scroll.cjs +2 -0
  982. package/dist/hooks/use-drag-scroll.cjs.map +1 -0
  983. package/dist/hooks/use-drag-scroll.d.ts +12 -0
  984. package/dist/hooks/use-drag-scroll.js +41 -0
  985. package/dist/hooks/use-drag-scroll.js.map +1 -0
  986. package/dist/hooks/use-has-permission.cjs +2 -0
  987. package/dist/hooks/use-has-permission.cjs.map +1 -0
  988. package/dist/hooks/use-has-permission.js +8 -0
  989. package/dist/hooks/use-has-permission.js.map +1 -0
  990. package/dist/hooks/use-home-automation-actions.cjs +2 -0
  991. package/dist/hooks/use-home-automation-actions.cjs.map +1 -0
  992. package/dist/hooks/use-home-automation-actions.js +15 -0
  993. package/dist/hooks/use-home-automation-actions.js.map +1 -0
  994. package/dist/hooks/use-launch-skill-in-chat.cjs +2 -0
  995. package/dist/hooks/use-launch-skill-in-chat.cjs.map +1 -0
  996. package/dist/hooks/use-launch-skill-in-chat.js +16 -0
  997. package/dist/hooks/use-launch-skill-in-chat.js.map +1 -0
  998. package/dist/hooks/use-mcp-server-health.cjs +1 -1
  999. package/dist/hooks/use-mcp-server-health.js +3 -3
  1000. package/dist/hooks/use-resizable-drawer-width.cjs +2 -0
  1001. package/dist/hooks/use-resizable-drawer-width.cjs.map +1 -0
  1002. package/dist/hooks/use-resizable-drawer-width.d.ts +22 -0
  1003. package/dist/hooks/use-resizable-drawer-width.js +46 -0
  1004. package/dist/hooks/use-resizable-drawer-width.js.map +1 -0
  1005. package/dist/hooks/use-responder-url-secret.cjs +2 -0
  1006. package/dist/hooks/use-responder-url-secret.cjs.map +1 -0
  1007. package/dist/hooks/use-responder-url-secret.d.ts +5 -0
  1008. package/dist/hooks/use-responder-url-secret.js +51 -0
  1009. package/dist/hooks/use-responder-url-secret.js.map +1 -0
  1010. package/dist/hooks/use-select-conversation-tab.cjs +1 -1
  1011. package/dist/hooks/use-select-conversation-tab.cjs.map +1 -1
  1012. package/dist/hooks/use-select-conversation-tab.d.ts +2 -0
  1013. package/dist/hooks/use-select-conversation-tab.js +15 -7
  1014. package/dist/hooks/use-select-conversation-tab.js.map +1 -1
  1015. package/dist/hooks/use-tracking.cjs +1 -1
  1016. package/dist/hooks/use-tracking.cjs.map +1 -1
  1017. package/dist/hooks/use-tracking.d.ts +23 -0
  1018. package/dist/hooks/use-tracking.js +16 -0
  1019. package/dist/hooks/use-tracking.js.map +1 -1
  1020. package/dist/hooks/use-websocket.cjs +1 -1
  1021. package/dist/hooks/use-websocket.cjs.map +1 -1
  1022. package/dist/hooks/use-websocket.d.ts +1 -2
  1023. package/dist/hooks/use-websocket.js +58 -51
  1024. package/dist/hooks/use-websocket.js.map +1 -1
  1025. package/dist/i18n/declaration.cjs +1 -1
  1026. package/dist/i18n/declaration.cjs.map +1 -1
  1027. package/dist/i18n/declaration.d.ts +182 -43
  1028. package/dist/i18n/declaration.js +1 -1
  1029. package/dist/i18n/declaration.js.map +1 -1
  1030. package/dist/i18n/translation.cjs +3 -3
  1031. package/dist/i18n/translation.cjs.map +1 -1
  1032. package/dist/i18n/translation.js +3092 -729
  1033. package/dist/i18n/translation.js.map +1 -1
  1034. package/dist/icons/check-circle.cjs +2 -0
  1035. package/dist/icons/check-circle.cjs.map +1 -0
  1036. package/dist/icons/check-circle.js +20 -0
  1037. package/dist/icons/check-circle.js.map +1 -0
  1038. package/dist/icons/chevron-down.cjs +2 -0
  1039. package/dist/icons/chevron-down.cjs.map +1 -0
  1040. package/dist/icons/chevron-down.js +20 -0
  1041. package/dist/icons/chevron-down.js.map +1 -0
  1042. package/dist/icons/clock.cjs +2 -0
  1043. package/dist/icons/clock.cjs.map +1 -0
  1044. package/dist/icons/clock.js +20 -0
  1045. package/dist/icons/clock.js.map +1 -0
  1046. package/dist/icons/exclamation-circle.cjs +2 -0
  1047. package/dist/icons/exclamation-circle.cjs.map +1 -0
  1048. package/dist/icons/exclamation-circle.js +20 -0
  1049. package/dist/icons/exclamation-circle.js.map +1 -0
  1050. package/dist/icons/kebab-vertical.cjs +2 -0
  1051. package/dist/icons/kebab-vertical.cjs.map +1 -0
  1052. package/dist/icons/kebab-vertical.js +14 -0
  1053. package/dist/icons/kebab-vertical.js.map +1 -0
  1054. package/dist/icons/key.cjs +2 -0
  1055. package/dist/icons/key.cjs.map +1 -0
  1056. package/dist/icons/key.js +21 -0
  1057. package/dist/icons/key.js.map +1 -0
  1058. package/dist/icons/message-square-share.cjs +2 -0
  1059. package/dist/icons/message-square-share.cjs.map +1 -0
  1060. package/dist/icons/message-square-share.js +22 -0
  1061. package/dist/icons/message-square-share.js.map +1 -0
  1062. package/dist/icons/play.cjs +2 -0
  1063. package/dist/icons/play.cjs.map +1 -0
  1064. package/dist/icons/play.js +19 -0
  1065. package/dist/icons/play.js.map +1 -0
  1066. package/dist/icons/power.cjs +2 -0
  1067. package/dist/icons/power.cjs.map +1 -0
  1068. package/dist/icons/power.js +20 -0
  1069. package/dist/icons/power.js.map +1 -0
  1070. package/dist/icons/sparkle.cjs +2 -0
  1071. package/dist/icons/sparkle.cjs.map +1 -0
  1072. package/dist/icons/sparkle.js +20 -0
  1073. package/dist/icons/sparkle.js.map +1 -0
  1074. package/dist/icons/trash.cjs +2 -0
  1075. package/dist/icons/trash.cjs.map +1 -0
  1076. package/dist/icons/trash.js +20 -0
  1077. package/dist/icons/trash.js.map +1 -0
  1078. package/dist/icons/x-circle.cjs +2 -0
  1079. package/dist/icons/x-circle.cjs.map +1 -0
  1080. package/dist/icons/x-circle.js +20 -0
  1081. package/dist/icons/x-circle.js.map +1 -0
  1082. package/dist/locales/ar/openhands.json +183 -44
  1083. package/dist/locales/ca/openhands.json +183 -44
  1084. package/dist/locales/de/openhands.json +183 -44
  1085. package/dist/locales/en/openhands.json +183 -44
  1086. package/dist/locales/es/openhands.json +183 -44
  1087. package/dist/locales/fr/openhands.json +183 -44
  1088. package/dist/locales/it/openhands.json +183 -44
  1089. package/dist/locales/ja/openhands.json +183 -44
  1090. package/dist/locales/ko-KR/openhands.json +183 -44
  1091. package/dist/locales/no/openhands.json +183 -44
  1092. package/dist/locales/pt/openhands.json +183 -44
  1093. package/dist/locales/tr/openhands.json +183 -44
  1094. package/dist/locales/uk/openhands.json +183 -44
  1095. package/dist/locales/zh-CN/openhands.json +183 -44
  1096. package/dist/locales/zh-TW/openhands.json +183 -44
  1097. package/dist/manifests/automation-insights.cjs +2 -0
  1098. package/dist/manifests/automation-insights.cjs.map +1 -0
  1099. package/dist/manifests/automation-insights.d.ts +2 -0
  1100. package/dist/manifests/automation-insights.js +9 -0
  1101. package/dist/manifests/automation-insights.js.map +1 -0
  1102. package/dist/manifests/automation-interface.cjs +1 -1
  1103. package/dist/manifests/automation-interface.cjs.map +1 -1
  1104. package/dist/manifests/automation-interface.d.ts +47 -31
  1105. package/dist/manifests/automation-interface.js +48 -54
  1106. package/dist/manifests/automation-interface.js.map +1 -1
  1107. package/dist/manifests/automation-setup.cjs +1 -1
  1108. package/dist/manifests/automation-setup.cjs.map +1 -1
  1109. package/dist/manifests/automation-setup.d.ts +37 -3
  1110. package/dist/manifests/automation-setup.js +16 -2
  1111. package/dist/manifests/automation-setup.js.map +1 -1
  1112. package/dist/manifests/interface-validation.cjs +1 -1
  1113. package/dist/manifests/interface-validation.cjs.map +1 -1
  1114. package/dist/manifests/interface-validation.js +56 -52
  1115. package/dist/manifests/interface-validation.js.map +1 -1
  1116. package/dist/manifests/manifest-actions.d.ts +5 -0
  1117. package/dist/manifests/manifest-bundle.d.ts +30 -0
  1118. package/dist/manifests/manifest-local-validation.d.ts +10 -1
  1119. package/dist/manifests/manifest-sources.cjs +1 -1
  1120. package/dist/manifests/manifest-sources.cjs.map +1 -1
  1121. package/dist/manifests/manifest-sources.js +3 -3
  1122. package/dist/manifests/manifest-sources.js.map +1 -1
  1123. package/dist/manifests/manifest-template.d.ts +14 -0
  1124. package/dist/manifests/manifest-validation.cjs +1 -1
  1125. package/dist/manifests/manifest-validation.cjs.map +1 -1
  1126. package/dist/manifests/manifest-validation.js +78 -45
  1127. package/dist/manifests/manifest-validation.js.map +1 -1
  1128. package/dist/manifests/types.cjs +1 -1
  1129. package/dist/manifests/types.cjs.map +1 -1
  1130. package/dist/manifests/types.d.ts +64 -3
  1131. package/dist/manifests/types.js +7 -6
  1132. package/dist/manifests/types.js.map +1 -1
  1133. package/dist/node_modules/@heroui/popover/dist/chunk-NW7HJLND.cjs +1 -1
  1134. package/dist/node_modules/@heroui/popover/dist/chunk-NW7HJLND.js +10 -10
  1135. package/dist/node_modules/@heroui/ripple/dist/chunk-UIQI3AYJ.cjs +1 -1
  1136. package/dist/node_modules/@heroui/ripple/dist/chunk-UIQI3AYJ.js +8 -8
  1137. package/dist/node_modules/@heroui/tooltip/dist/chunk-AUA5GDXN.cjs +1 -1
  1138. package/dist/node_modules/@heroui/tooltip/dist/chunk-AUA5GDXN.js +9 -9
  1139. package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs +4843 -0
  1140. package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs.map +1 -0
  1141. package/dist/node_modules/@openhands/extensions/automations/bundle-index.js +11 -0
  1142. package/dist/node_modules/@openhands/extensions/automations/bundle-index.js.map +1 -0
  1143. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs +13 -0
  1144. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs.map +1 -0
  1145. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js +87 -0
  1146. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js.map +1 -0
  1147. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs +12 -0
  1148. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs.map +1 -0
  1149. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js +98 -0
  1150. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js.map +1 -0
  1151. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +9 -7
  1152. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs.map +1 -1
  1153. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js +32 -13
  1154. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -1
  1155. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs +2 -2
  1156. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs.map +1 -1
  1157. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js +29 -34
  1158. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js.map +1 -1
  1159. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.cjs +3 -3
  1160. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.cjs.map +1 -1
  1161. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.js +2 -2
  1162. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.js.map +1 -1
  1163. package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.cjs +14 -0
  1164. package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.cjs.map +1 -0
  1165. package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.js +72 -0
  1166. package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.js.map +1 -0
  1167. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +1 -1
  1168. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -1
  1169. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +16 -10
  1170. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -1
  1171. package/dist/node_modules/@openhands/extensions/automations/index.cjs +1 -1
  1172. package/dist/node_modules/@openhands/extensions/automations/index.cjs.map +1 -1
  1173. package/dist/node_modules/@openhands/extensions/automations/index.js +18 -13
  1174. package/dist/node_modules/@openhands/extensions/automations/index.js.map +1 -1
  1175. package/dist/node_modules/@openhands/extensions/automations/interface.cjs +1 -1
  1176. package/dist/node_modules/@openhands/extensions/automations/interface.cjs.map +1 -1
  1177. package/dist/node_modules/@openhands/extensions/automations/interface.js +6 -2
  1178. package/dist/node_modules/@openhands/extensions/automations/interface.js.map +1 -1
  1179. package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.cjs +1 -1
  1180. package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.cjs.map +1 -1
  1181. package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.js +36 -3
  1182. package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.js.map +1 -1
  1183. package/dist/node_modules/@openhands/extensions/integrations/catalog/sonarqube.cjs +2 -0
  1184. package/dist/node_modules/@openhands/extensions/integrations/catalog/sonarqube.cjs.map +1 -0
  1185. package/dist/node_modules/@openhands/extensions/integrations/catalog/sonarqube.js +75 -0
  1186. package/dist/node_modules/@openhands/extensions/integrations/catalog/sonarqube.js.map +1 -0
  1187. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs +1 -1
  1188. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs.map +1 -1
  1189. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js +68 -66
  1190. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js.map +1 -1
  1191. package/dist/node_modules/@openhands/extensions/skills/index.cjs +1002 -47
  1192. package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
  1193. package/dist/node_modules/@openhands/extensions/skills/index.js +59 -17
  1194. package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
  1195. package/dist/node_modules/lucide-react/dist/esm/icons/activity.cjs +2 -0
  1196. package/dist/node_modules/lucide-react/dist/esm/icons/activity.cjs.map +1 -0
  1197. package/dist/node_modules/lucide-react/dist/esm/icons/activity.js +9 -0
  1198. package/dist/node_modules/lucide-react/dist/esm/icons/activity.js.map +1 -0
  1199. package/dist/node_modules/lucide-react/dist/esm/icons/book-open.cjs +2 -0
  1200. package/dist/node_modules/lucide-react/dist/esm/icons/book-open.cjs.map +1 -0
  1201. package/dist/node_modules/lucide-react/dist/esm/icons/book-open.js +12 -0
  1202. package/dist/node_modules/lucide-react/dist/esm/icons/book-open.js.map +1 -0
  1203. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.cjs +2 -0
  1204. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.cjs.map +1 -0
  1205. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.js +27 -0
  1206. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.js.map +1 -0
  1207. package/dist/node_modules/lucide-react/dist/esm/icons/download.cjs +2 -0
  1208. package/dist/node_modules/lucide-react/dist/esm/icons/download.cjs.map +1 -0
  1209. package/dist/node_modules/lucide-react/dist/esm/icons/download.js +19 -0
  1210. package/dist/node_modules/lucide-react/dist/esm/icons/download.js.map +1 -0
  1211. package/dist/node_modules/lucide-react/dist/esm/icons/file-text.cjs +2 -0
  1212. package/dist/node_modules/lucide-react/dist/esm/icons/file-text.cjs.map +1 -0
  1213. package/dist/node_modules/lucide-react/dist/esm/icons/file-text.js +27 -0
  1214. package/dist/node_modules/lucide-react/dist/esm/icons/file-text.js.map +1 -0
  1215. package/dist/node_modules/lucide-react/dist/esm/icons/git-commit-horizontal.cjs +2 -0
  1216. package/dist/node_modules/lucide-react/dist/esm/icons/git-commit-horizontal.cjs.map +1 -0
  1217. package/dist/node_modules/lucide-react/dist/esm/icons/git-commit-horizontal.js +27 -0
  1218. package/dist/node_modules/lucide-react/dist/esm/icons/git-commit-horizontal.js.map +1 -0
  1219. package/dist/node_modules/lucide-react/dist/esm/icons/laptop.cjs +2 -0
  1220. package/dist/node_modules/lucide-react/dist/esm/icons/laptop.cjs.map +1 -0
  1221. package/dist/node_modules/lucide-react/dist/esm/icons/laptop.js +12 -0
  1222. package/dist/node_modules/lucide-react/dist/esm/icons/laptop.js.map +1 -0
  1223. package/dist/node_modules/lucide-react/dist/esm/icons/layout-dashboard.cjs +2 -0
  1224. package/dist/node_modules/lucide-react/dist/esm/icons/layout-dashboard.cjs.map +1 -0
  1225. package/dist/node_modules/lucide-react/dist/esm/icons/layout-dashboard.js +39 -0
  1226. package/dist/node_modules/lucide-react/dist/esm/icons/layout-dashboard.js.map +1 -0
  1227. package/dist/node_modules/lucide-react/dist/esm/icons/library.cjs +2 -0
  1228. package/dist/node_modules/lucide-react/dist/esm/icons/library.cjs.map +1 -0
  1229. package/dist/node_modules/lucide-react/dist/esm/icons/library.js +23 -0
  1230. package/dist/node_modules/lucide-react/dist/esm/icons/library.js.map +1 -0
  1231. package/dist/node_modules/lucide-react/dist/esm/icons/package.cjs +2 -0
  1232. package/dist/node_modules/lucide-react/dist/esm/icons/package.cjs.map +1 -0
  1233. package/dist/node_modules/lucide-react/dist/esm/icons/package.js +23 -0
  1234. package/dist/node_modules/lucide-react/dist/esm/icons/package.js.map +1 -0
  1235. package/dist/node_modules/lucide-react/dist/esm/icons/palette.cjs +2 -0
  1236. package/dist/node_modules/lucide-react/dist/esm/icons/palette.cjs.map +1 -0
  1237. package/dist/node_modules/lucide-react/dist/esm/icons/palette.js +39 -0
  1238. package/dist/node_modules/lucide-react/dist/esm/icons/palette.js.map +1 -0
  1239. package/dist/node_modules/lucide-react/dist/esm/icons/pen-line.cjs +2 -0
  1240. package/dist/node_modules/lucide-react/dist/esm/icons/pen-line.cjs.map +1 -0
  1241. package/dist/node_modules/lucide-react/dist/esm/icons/pen-line.js +12 -0
  1242. package/dist/node_modules/lucide-react/dist/esm/icons/pen-line.js.map +1 -0
  1243. package/dist/node_modules/lucide-react/dist/esm/icons/shield-check.cjs +2 -0
  1244. package/dist/node_modules/lucide-react/dist/esm/icons/shield-check.cjs.map +1 -0
  1245. package/dist/node_modules/lucide-react/dist/esm/icons/shield-check.js +12 -0
  1246. package/dist/node_modules/lucide-react/dist/esm/icons/shield-check.js.map +1 -0
  1247. package/dist/node_modules/lucide-react/dist/esm/icons/sparkles.cjs +2 -0
  1248. package/dist/node_modules/lucide-react/dist/esm/icons/sparkles.cjs.map +1 -0
  1249. package/dist/node_modules/lucide-react/dist/esm/icons/sparkles.js +25 -0
  1250. package/dist/node_modules/lucide-react/dist/esm/icons/sparkles.js.map +1 -0
  1251. package/dist/node_modules/lucide-react/dist/esm/icons/timer.cjs +2 -0
  1252. package/dist/node_modules/lucide-react/dist/esm/icons/timer.cjs.map +1 -0
  1253. package/dist/node_modules/lucide-react/dist/esm/icons/timer.js +27 -0
  1254. package/dist/node_modules/lucide-react/dist/esm/icons/timer.js.map +1 -0
  1255. package/dist/package.cjs +1 -1
  1256. package/dist/package.cjs.map +1 -1
  1257. package/dist/package.js +3 -3
  1258. package/dist/package.js.map +1 -1
  1259. package/dist/routes/app-settings.cjs +1 -1
  1260. package/dist/routes/app-settings.cjs.map +1 -1
  1261. package/dist/routes/app-settings.js +87 -85
  1262. package/dist/routes/app-settings.js.map +1 -1
  1263. package/dist/routes/commits-tab.cjs +1 -1
  1264. package/dist/routes/commits-tab.cjs.map +1 -1
  1265. package/dist/routes/commits-tab.js +27 -21
  1266. package/dist/routes/commits-tab.js.map +1 -1
  1267. package/dist/routes/conversation.cjs +1 -1
  1268. package/dist/routes/conversation.cjs.map +1 -1
  1269. package/dist/routes/conversation.js +56 -55
  1270. package/dist/routes/conversation.js.map +1 -1
  1271. package/dist/routes/files-tab.cjs +1 -1
  1272. package/dist/routes/files-tab.cjs.map +1 -1
  1273. package/dist/routes/files-tab.d.ts +4 -0
  1274. package/dist/routes/files-tab.js +121 -151
  1275. package/dist/routes/files-tab.js.map +1 -1
  1276. package/dist/routes/llm-settings.cjs +1 -1
  1277. package/dist/routes/llm-settings.cjs.map +1 -1
  1278. package/dist/routes/llm-settings.d.ts +9 -1
  1279. package/dist/routes/llm-settings.js +137 -107
  1280. package/dist/routes/llm-settings.js.map +1 -1
  1281. package/dist/routes/mcp.cjs +1 -1
  1282. package/dist/routes/mcp.cjs.map +1 -1
  1283. package/dist/routes/mcp.js +20 -20
  1284. package/dist/routes/secrets-settings.cjs +1 -1
  1285. package/dist/routes/secrets-settings.js +15 -15
  1286. package/dist/services/settings.cjs +1 -1
  1287. package/dist/services/settings.cjs.map +1 -1
  1288. package/dist/services/settings.js +2 -2
  1289. package/dist/services/settings.js.map +1 -1
  1290. package/dist/services/telemetry.cjs +1 -1
  1291. package/dist/services/telemetry.cjs.map +1 -1
  1292. package/dist/services/telemetry.js +47 -51
  1293. package/dist/services/telemetry.js.map +1 -1
  1294. package/dist/stores/conversation-store.cjs +1 -1
  1295. package/dist/stores/conversation-store.cjs.map +1 -1
  1296. package/dist/stores/conversation-store.d.ts +8 -1
  1297. package/dist/stores/conversation-store.js +9 -0
  1298. package/dist/stores/conversation-store.js.map +1 -1
  1299. package/dist/stores/error-message-store.cjs +1 -1
  1300. package/dist/stores/error-message-store.cjs.map +1 -1
  1301. package/dist/stores/error-message-store.d.ts +3 -1
  1302. package/dist/stores/error-message-store.js +5 -3
  1303. package/dist/stores/error-message-store.js.map +1 -1
  1304. package/dist/stores/files-tab-store.cjs +1 -1
  1305. package/dist/stores/files-tab-store.cjs.map +1 -1
  1306. package/dist/stores/files-tab-store.d.ts +13 -0
  1307. package/dist/stores/files-tab-store.js +49 -5
  1308. package/dist/stores/files-tab-store.js.map +1 -1
  1309. package/dist/stores/use-event-store.cjs +1 -1
  1310. package/dist/stores/use-event-store.cjs.map +1 -1
  1311. package/dist/stores/use-event-store.js +11 -11
  1312. package/dist/stores/use-event-store.js.map +1 -1
  1313. package/dist/types/agent-server/core/events/message-event.d.ts +2 -2
  1314. package/dist/types/automation.cjs +2 -0
  1315. package/dist/types/automation.cjs.map +1 -0
  1316. package/dist/types/automation.js +8 -0
  1317. package/dist/types/automation.js.map +1 -0
  1318. package/dist/types/git-sync.d.ts +51 -0
  1319. package/dist/utils/automation-catalog.cjs +1 -1
  1320. package/dist/utils/automation-catalog.cjs.map +1 -1
  1321. package/dist/utils/automation-catalog.d.ts +12 -0
  1322. package/dist/utils/automation-catalog.js +20 -1
  1323. package/dist/utils/automation-catalog.js.map +1 -1
  1324. package/dist/utils/automation-schedule.cjs +2 -0
  1325. package/dist/utils/automation-schedule.cjs.map +1 -0
  1326. package/dist/utils/automation-schedule.js +8 -0
  1327. package/dist/utils/automation-schedule.js.map +1 -0
  1328. package/dist/utils/automation-stack-section.cjs +2 -0
  1329. package/dist/utils/automation-stack-section.cjs.map +1 -0
  1330. package/dist/utils/automation-stack-section.d.ts +2 -0
  1331. package/dist/utils/automation-stack-section.js +6 -0
  1332. package/dist/utils/automation-stack-section.js.map +1 -0
  1333. package/dist/utils/constants.cjs +1 -1
  1334. package/dist/utils/constants.cjs.map +1 -1
  1335. package/dist/utils/constants.js +4 -0
  1336. package/dist/utils/constants.js.map +1 -1
  1337. package/dist/utils/conversation-local-storage.cjs +1 -1
  1338. package/dist/utils/conversation-local-storage.cjs.map +1 -1
  1339. package/dist/utils/conversation-local-storage.d.ts +17 -4
  1340. package/dist/utils/conversation-local-storage.js +111 -63
  1341. package/dist/utils/conversation-local-storage.js.map +1 -1
  1342. package/dist/utils/conversation-metrics.cjs +1 -1
  1343. package/dist/utils/conversation-metrics.cjs.map +1 -1
  1344. package/dist/utils/conversation-metrics.d.ts +3 -2
  1345. package/dist/utils/conversation-metrics.js +16 -14
  1346. package/dist/utils/conversation-metrics.js.map +1 -1
  1347. package/dist/utils/conversation-overview-project-scope.cjs +2 -0
  1348. package/dist/utils/conversation-overview-project-scope.cjs.map +1 -0
  1349. package/dist/utils/conversation-overview-project-scope.d.ts +16 -0
  1350. package/dist/utils/conversation-overview-project-scope.js +22 -0
  1351. package/dist/utils/conversation-overview-project-scope.js.map +1 -0
  1352. package/dist/utils/error-handler.cjs +1 -1
  1353. package/dist/utils/error-handler.cjs.map +1 -1
  1354. package/dist/utils/error-handler.d.ts +3 -2
  1355. package/dist/utils/error-handler.js +18 -5
  1356. package/dist/utils/error-handler.js.map +1 -1
  1357. package/dist/utils/extension-module-card-classes.cjs +1 -1
  1358. package/dist/utils/extension-module-card-classes.cjs.map +1 -1
  1359. package/dist/utils/extension-module-card-classes.d.ts +1 -1
  1360. package/dist/utils/extension-module-card-classes.js +2 -2
  1361. package/dist/utils/extension-module-card-classes.js.map +1 -1
  1362. package/dist/utils/format-model-name.cjs +1 -1
  1363. package/dist/utils/format-model-name.cjs.map +1 -1
  1364. package/dist/utils/format-model-name.d.ts +1 -0
  1365. package/dist/utils/format-model-name.js +1 -0
  1366. package/dist/utils/format-model-name.js.map +1 -1
  1367. package/dist/utils/format-relative-time.cjs +2 -0
  1368. package/dist/utils/format-relative-time.cjs.map +1 -0
  1369. package/dist/utils/format-relative-time.js +17 -0
  1370. package/dist/utils/format-relative-time.js.map +1 -0
  1371. package/dist/utils/git-diff-stats.cjs +5 -0
  1372. package/dist/utils/git-diff-stats.cjs.map +1 -0
  1373. package/dist/utils/git-diff-stats.d.ts +9 -0
  1374. package/dist/utils/git-diff-stats.js +53 -0
  1375. package/dist/utils/git-diff-stats.js.map +1 -0
  1376. package/dist/utils/handle-event-for-ui.cjs +1 -1
  1377. package/dist/utils/handle-event-for-ui.cjs.map +1 -1
  1378. package/dist/utils/handle-event-for-ui.js +13 -11
  1379. package/dist/utils/handle-event-for-ui.js.map +1 -1
  1380. package/dist/utils/mcp-credential-validation.cjs +1 -1
  1381. package/dist/utils/mcp-credential-validation.js +3 -3
  1382. package/dist/utils/mcp-marketplace-utils.cjs +1 -1
  1383. package/dist/utils/mcp-marketplace-utils.cjs.map +1 -1
  1384. package/dist/utils/mcp-marketplace-utils.js +22 -9
  1385. package/dist/utils/mcp-marketplace-utils.js.map +1 -1
  1386. package/dist/utils/parse-git-remote-url.cjs +1 -1
  1387. package/dist/utils/parse-git-remote-url.cjs.map +1 -1
  1388. package/dist/utils/parse-git-remote-url.js +6 -7
  1389. package/dist/utils/parse-git-remote-url.js.map +1 -1
  1390. package/dist/utils/recommended-automation-rail.cjs +2 -0
  1391. package/dist/utils/recommended-automation-rail.cjs.map +1 -0
  1392. package/dist/utils/recommended-automation-rail.d.ts +22 -0
  1393. package/dist/utils/recommended-automation-rail.js +44 -0
  1394. package/dist/utils/recommended-automation-rail.js.map +1 -0
  1395. package/dist/utils/responder-deployment.cjs +2 -0
  1396. package/dist/utils/responder-deployment.cjs.map +1 -0
  1397. package/dist/utils/responder-deployment.js +42 -0
  1398. package/dist/utils/responder-deployment.js.map +1 -0
  1399. package/dist/utils/scroll-fade-state.cjs +2 -0
  1400. package/dist/utils/scroll-fade-state.cjs.map +1 -0
  1401. package/dist/utils/scroll-fade-state.d.ts +6 -0
  1402. package/dist/utils/scroll-fade-state.js +13 -0
  1403. package/dist/utils/scroll-fade-state.js.map +1 -0
  1404. package/dist/utils/skill-category.cjs +2 -0
  1405. package/dist/utils/skill-category.cjs.map +1 -0
  1406. package/dist/utils/skill-category.js +51 -0
  1407. package/dist/utils/skill-category.js.map +1 -0
  1408. package/dist/utils/skill-scope.cjs +1 -1
  1409. package/dist/utils/skill-scope.cjs.map +1 -1
  1410. package/dist/utils/skill-scope.js +1 -1
  1411. package/dist/utils/skill-scope.js.map +1 -1
  1412. package/dist/utils/streaming-delta-batcher.cjs +2 -0
  1413. package/dist/utils/streaming-delta-batcher.cjs.map +1 -0
  1414. package/dist/utils/streaming-delta-batcher.d.ts +21 -0
  1415. package/dist/utils/streaming-delta-batcher.js +31 -0
  1416. package/dist/utils/streaming-delta-batcher.js.map +1 -0
  1417. package/dist/utils/tar-gzip.d.ts +26 -0
  1418. package/dist/utils/transcript-export/load-complete-events.cjs +1 -1
  1419. package/dist/utils/transcript-export/load-complete-events.cjs.map +1 -1
  1420. package/dist/utils/transcript-export/load-complete-events.js +24 -16
  1421. package/dist/utils/transcript-export/load-complete-events.js.map +1 -1
  1422. package/dist/utils/utils.cjs +1 -1
  1423. package/dist/utils/utils.cjs.map +1 -1
  1424. package/dist/utils/utils.d.ts +1 -41
  1425. package/dist/utils/utils.js +27 -6
  1426. package/dist/utils/utils.js.map +1 -1
  1427. package/dist/utils/websocket-handshake.cjs +2 -0
  1428. package/dist/utils/websocket-handshake.cjs.map +1 -0
  1429. package/dist/utils/websocket-handshake.d.ts +11 -0
  1430. package/dist/utils/websocket-handshake.js +12 -0
  1431. package/dist/utils/websocket-handshake.js.map +1 -0
  1432. package/package.json +3 -3
  1433. package/scripts/check-translation-completeness.cjs +7 -0
  1434. package/scripts/dev-static.mjs +49 -43
  1435. package/scripts/dev-with-automation.mjs +111 -14
  1436. package/scripts/seed-automation-ux-data.mjs +810 -0
  1437. package/build/assets/acp-providers-D1PORKc0.js +0 -1
  1438. package/build/assets/active-backend-context-IqOjobNK.js +0 -2
  1439. package/build/assets/agent-context-settings-DMrObcIS.js +0 -1
  1440. package/build/assets/agent-profiles-settings-DororXN5.js +0 -1
  1441. package/build/assets/agent-server-conversation-service.api-DWBe0rbX.js +0 -86
  1442. package/build/assets/agent-settings-BJVk92PU.js +0 -2
  1443. package/build/assets/agent-settings-COfJsQ1d.js +0 -1
  1444. package/build/assets/alert-banner-CzZsm7ms.js +0 -1
  1445. package/build/assets/api-key-entry-screen-D8Fade_-.js +0 -1
  1446. package/build/assets/app-settings-CpyGB3AT.js +0 -1
  1447. package/build/assets/automation-detail-B-jQ39Mm.js +0 -3
  1448. package/build/assets/automation-export-B1dywoqk.js +0 -2
  1449. package/build/assets/automation-setup-route-C-bWUZBi.js +0 -1
  1450. package/build/assets/automation-templates-DgpCGOJV.js +0 -1
  1451. package/build/assets/automations-list-DnMxlxsL.js +0 -1
  1452. package/build/assets/back-nav-button-HHEneWMw.js +0 -1
  1453. package/build/assets/backend-form-modal-DiVrD4Cm.js +0 -1
  1454. package/build/assets/backend-synced-settings-badge-7MIjpr8M.js +0 -1
  1455. package/build/assets/badge-CpYmcVZV.js +0 -1
  1456. package/build/assets/base-modal-Fnh6Uln9.js +0 -1
  1457. package/build/assets/bot-BQZx8e2i.js +0 -1
  1458. package/build/assets/brand-button-swT1RyO0.js +0 -1
  1459. package/build/assets/browser-B9AbV6kG.js +0 -7
  1460. package/build/assets/browser-tab-zAY12m_i.js +0 -1
  1461. package/build/assets/chat-send-button-DsJtivmL.js +0 -1
  1462. package/build/assets/check-WAFXrrs_.js +0 -1
  1463. package/build/assets/chevron-down-CifNWzme.js +0 -1
  1464. package/build/assets/circle-check-CtnimJa8.js +0 -1
  1465. package/build/assets/circle-plus-check-toggle-Cuzx55bo.js +0 -1
  1466. package/build/assets/cloud-funnel-analytics-86CwNdSh.js +0 -1
  1467. package/build/assets/combobox-caret-D0fRotFi.js +0 -1
  1468. package/build/assets/command-menu-BXy03FBl.js +0 -1
  1469. package/build/assets/condenser-settings-BmZa0ui_.js +0 -1
  1470. package/build/assets/confirmation-modal-BgoN6lbN.js +0 -1
  1471. package/build/assets/context-menu-list-item-Bq02tc-P.js +0 -1
  1472. package/build/assets/conversation-BPo8SvLN.js +0 -1
  1473. package/build/assets/conversation-CPCVsCUY.js +0 -90
  1474. package/build/assets/conversation-panel-BPo8SvLN.js +0 -1
  1475. package/build/assets/conversation-state-store-C5YpjMNy.js +0 -1
  1476. package/build/assets/conversation-store-Blc5xysY.js +0 -6
  1477. package/build/assets/conversation-tab-empty-state-CMqo_0Bd.js +0 -1
  1478. package/build/assets/copy-to-clipboard-button-Cg1pF0xn.js +0 -1
  1479. package/build/assets/device-verify-BfQLgNyq.js +0 -1
  1480. package/build/assets/dropdown-classes-BIqQr5mx.js +0 -1
  1481. package/build/assets/entry.client-CxFjRYqH.js +0 -2
  1482. package/build/assets/enum-filter-dropdown-C_yV4_bo.js +0 -1
  1483. package/build/assets/environment-switch-overlay-Bi4qbh2g.js +0 -1
  1484. package/build/assets/extension-module-card-classes-Bo43vY5V.js +0 -1
  1485. package/build/assets/extensions-hub-BqUINAhp.js +0 -1
  1486. package/build/assets/extensions-navigation-lraj88Wk.js +0 -1
  1487. package/build/assets/external-link-CgtpA_a1.js +0 -1
  1488. package/build/assets/file-text-DEK4LSVw.js +0 -1
  1489. package/build/assets/files-tab-DV0L-lFE.js +0 -1
  1490. package/build/assets/form-control-classes-7yFSQJq_.js +0 -1
  1491. package/build/assets/format-model-name-BN_rx1Y3.js +0 -1
  1492. package/build/assets/format-relative-time-DSErAuVr.js +0 -1
  1493. package/build/assets/git-provider-icon-BvlLAche.js +0 -1
  1494. package/build/assets/git-repo-dropdown-ByMzpNko.js +0 -1
  1495. package/build/assets/git-repo-dropdown-C6R7hgM8.js +0 -1
  1496. package/build/assets/highlighted-source-view-C_sfncLZ.js +0 -1
  1497. package/build/assets/home-BOrlwLqG.js +0 -1
  1498. package/build/assets/home-BvMNC6E-.js +0 -1
  1499. package/build/assets/home-store-CxqsY9Fi.js +0 -1
  1500. package/build/assets/index-home-BvMNC6E-.js +0 -1
  1501. package/build/assets/info-BRVcJAUg.js +0 -1
  1502. package/build/assets/install-server-modal-Bl4G1zF4.js +0 -1
  1503. package/build/assets/kebab-menu-item-content-BGoGFEAg.js +0 -1
  1504. package/build/assets/launch-CkqiSCqi.js +0 -1
  1505. package/build/assets/list-todo-DNWlzfaM.js +0 -1
  1506. package/build/assets/llm-not-configured-banner-DLw_tu-G.js +0 -27
  1507. package/build/assets/llm-settings-B-pkVCrt.js +0 -1
  1508. package/build/assets/llm-settings-DSC0-IQ7.js +0 -1
  1509. package/build/assets/llm-subscription-service-BAdOl5Xx.js +0 -1
  1510. package/build/assets/loader-circle-B47W9XqT.js +0 -1
  1511. package/build/assets/loading-spinner-xhnrGP4Y.js +0 -1
  1512. package/build/assets/manage-backends-modal-DhGk5mJt.js +0 -1
  1513. package/build/assets/manifest-653b89aa.js +0 -1
  1514. package/build/assets/manifest-subpage-layout-CKWvL2ig.js +0 -1
  1515. package/build/assets/map-provider-Mx8mZuE-.js +0 -1
  1516. package/build/assets/markdown-renderer-DUmk7pFc.js +0 -8
  1517. package/build/assets/mcp-DCkvl6K0.js +0 -9
  1518. package/build/assets/mcp-marketplace-utils-DEbMXlQr.js +0 -1
  1519. package/build/assets/messages-DSXvyc21.js +0 -40
  1520. package/build/assets/modal-body-gIe21fDv.js +0 -1
  1521. package/build/assets/modal-classes-D66dlgZ7.js +0 -1
  1522. package/build/assets/modal-close-button-B6iOGYpI.js +0 -1
  1523. package/build/assets/mouse-pointer-click-BYX1Pw5W.js +0 -1
  1524. package/build/assets/npm-DLckoeJc.js +0 -1
  1525. package/build/assets/onboarding-D7WDG66N.js +0 -1
  1526. package/build/assets/onboarding-modal-C_xVrFNv.js +0 -1
  1527. package/build/assets/organization-service.api-D-s9z18a.js +0 -1
  1528. package/build/assets/pencil-BGOCPRyu.js +0 -1
  1529. package/build/assets/planner-tab-AKaXIIfg.js +0 -1
  1530. package/build/assets/plugins-management-service-wtmY4QQw.js +0 -1
  1531. package/build/assets/plus-zNEL8rcX.js +0 -1
  1532. package/build/assets/profiles-service.api-DCMYxHMi.js +0 -1
  1533. package/build/assets/providers-BjrtjX4L.js +0 -1
  1534. package/build/assets/proxy-9Z_WZggZ.js +0 -1
  1535. package/build/assets/puzzle-BWLmN8z4.js +0 -1
  1536. package/build/assets/recommended-automations-launcher-CFlzhu1o.js +0 -1
  1537. package/build/assets/refresh-cw-CXtFWpwv.js +0 -1
  1538. package/build/assets/root-CanxKlNV.css +0 -1
  1539. package/build/assets/root-DkfG_UWR.js +0 -2
  1540. package/build/assets/root-layout-D75LHYhh.js +0 -2
  1541. package/build/assets/schema-field-OnM5Uob_.js +0 -1
  1542. package/build/assets/sdk-section-page-m5WQm2sy.js +0 -1
  1543. package/build/assets/search-CycosyjN.js +0 -1
  1544. package/build/assets/secrets-service-B26R61C1.js +0 -1
  1545. package/build/assets/secrets-settings-CbLYCKOX.js +0 -1
  1546. package/build/assets/segmented-toggle-DCspm2U5.js +0 -1
  1547. package/build/assets/settings-BJQI_iBM.js +0 -1
  1548. package/build/assets/settings-CWFxymAf.js +0 -1
  1549. package/build/assets/settings-dropdown-input-BI8V_Nov.js +0 -1
  1550. package/build/assets/settings-index-BiTqJoH7.js +0 -1
  1551. package/build/assets/settings-input-Cz62hWVW.js +0 -1
  1552. package/build/assets/settings-list-classes-z_3FW5H3.js +0 -1
  1553. package/build/assets/settings-modal-BIrIVn97.js +0 -1
  1554. package/build/assets/settings-service.api--rJmnuLa.js +0 -1
  1555. package/build/assets/settings-switch-BRsSI8Vs.js +0 -1
  1556. package/build/assets/settings-utils-Ba7vel6T.js +0 -1
  1557. package/build/assets/shared-conversation-CQK_PqHx.js +0 -1
  1558. package/build/assets/shield-check-T3JsDJiM.js +0 -1
  1559. package/build/assets/sidebar-layout-Bhi3hVcu.js +0 -1
  1560. package/build/assets/sidebar-mobile-menu-toggle-YWJNRN4p.js +0 -1
  1561. package/build/assets/sidebar-nav-link-BSUlY5Ml.js +0 -1
  1562. package/build/assets/sidebar-store-Cl1cUv_F.js +0 -1
  1563. package/build/assets/skill-card-pill-row-BXz8L8Rn.js +0 -1
  1564. package/build/assets/skill-icon-badge-QgfKv31M.js +0 -1
  1565. package/build/assets/skill-scope-Dc3JPW-8.js +0 -1
  1566. package/build/assets/skills-plugins-CpTV27n3.js +0 -1
  1567. package/build/assets/skills-settings-CSW__IW4.js +0 -2
  1568. package/build/assets/sparkles-TJ0mdECe.js +0 -1
  1569. package/build/assets/styled-tooltip-BUMSbgrF.js +0 -1
  1570. package/build/assets/task-list-tab-mAHMOkUz.js +0 -1
  1571. package/build/assets/terminal-BzxBaHx2.js +0 -3
  1572. package/build/assets/toggle-switch-O5v1FgxW.js +0 -1
  1573. package/build/assets/trash-2-C0xNVp9c.js +0 -1
  1574. package/build/assets/typography-NOKSk9_R.js +0 -1
  1575. package/build/assets/usage-tab-tEmVN0KD.js +0 -1
  1576. package/build/assets/use-acp-credential-form-BPNi0Zbm.js +0 -1
  1577. package/build/assets/use-activate-agent-profile-D9YRQPTF.js +0 -1
  1578. package/build/assets/use-agent-profiles-Cb2zUW3l.js +0 -1
  1579. package/build/assets/use-can-manage-org-profiles-Dxzq2AEd.js +0 -1
  1580. package/build/assets/use-cloud-current-user-id-Co2eJk2A.js +0 -1
  1581. package/build/assets/use-config-DKAMiI5R.js +0 -1
  1582. package/build/assets/use-create-conversation-CoHTiCbI.js +0 -1
  1583. package/build/assets/use-create-secret-2zBlCDsF.js +0 -1
  1584. package/build/assets/use-is-authed-C52-ivnB.js +0 -1
  1585. package/build/assets/use-is-creating-conversation-DdaAE6jV.js +0 -1
  1586. package/build/assets/use-launch-skill-in-chat-COnDpxCQ.js +0 -1
  1587. package/build/assets/use-llm-profiles-C_BHue65.js +0 -1
  1588. package/build/assets/use-manifest-capabilities-DPrQsaPP.js +0 -1
  1589. package/build/assets/use-onboarding-completion-CCE8OQgV.js +0 -1
  1590. package/build/assets/use-plugins-marketplace-CEiak69h.js +0 -1
  1591. package/build/assets/use-save-agent-profile-DK9idD6a.js +0 -1
  1592. package/build/assets/use-save-settings-DNmnbG6f.js +0 -1
  1593. package/build/assets/use-settings-nav-items-BlFL7YhM.js +0 -16
  1594. package/build/assets/use-settings-wCwPaSIv.js +0 -1
  1595. package/build/assets/use-tracking-CVwPmhlX.js +0 -3
  1596. package/build/assets/use-user-conversation-DVtfg0B_.js +0 -1
  1597. package/build/assets/useInfiniteQuery-p1xq35r2.js +0 -1
  1598. package/build/assets/useMutation-BFDQmgk9.js +0 -1
  1599. package/build/assets/useQueries-DF1NAAeC.js +0 -1
  1600. package/build/assets/useQuery-DRv--6bK.js +0 -1
  1601. package/build/assets/utils-zxEjKE70.js +0 -1
  1602. package/build/assets/vendor~browser-B-fae1JU.js +0 -47
  1603. package/build/assets/vendor~entry.client-CgNUwtQL.js +0 -1
  1604. package/build/assets/vendor~entry.client-zSIea5EO.js +0 -9
  1605. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-B8i84bh4.js +0 -186
  1606. package/build/assets/vendor~files-tab-D9wR9yM2.js +0 -11
  1607. package/build/assets/vendor~index-home~home~conversation-panel~conversation-Ipoe6hvY.js +0 -13
  1608. package/build/assets/vendor~root-layout-C-IgVx6e.js +0 -1
  1609. package/build/assets/vendor~root-layout~conversation-panel~conversation-Dhd_I4H4.js +0 -1
  1610. package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-Cc0f9kPP.js +0 -1
  1611. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-d7svw-BB.js +0 -1
  1612. package/build/assets/vendor~root-layout~index-home~home~mcp~automations-list~automation-templates~automation-set~bxsimjx0-D7IDevqN.js +0 -1
  1613. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-D5DWZVc7.js +0 -1
  1614. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-4WsUP-tz.js +0 -48
  1615. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~9pstowjp-BOVIFA_g.js +0 -73
  1616. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~ht43enc2-C0JXQb_q.js +0 -7465
  1617. package/build/assets/verification-settings-B8UMQ7MG.js +0 -1
  1618. package/build/assets/wrench-DIka3hCq.js +0 -1
  1619. package/build/assets/x-BWKA2Ver.js +0 -1
  1620. package/build/assets/zap-DHddTPc0.js +0 -1
  1621. package/dist/api/cloud/suggestions-service.api.d.ts +0 -8
  1622. package/dist/api/suggestions-service/suggestions-service.api.d.ts +0 -11
  1623. package/dist/components/conversation-events/chat/event-message-components/observation-pair-event-message.d.ts +0 -7
  1624. package/dist/components/conversation-events/index.d.ts +0 -1
  1625. package/dist/components/features/automations/metadata-chip.d.ts +0 -6
  1626. package/dist/components/features/chat/task-tracking/status-badge.d.ts +0 -5
  1627. package/dist/components/features/chat/task-tracking/status-icon.d.ts +0 -5
  1628. package/dist/components/features/chat/task-tracking/task-list-section.d.ts +0 -10
  1629. package/dist/components/features/controls/tools.d.ts +0 -2
  1630. package/dist/components/features/conversation-panel/new-conversation-button.d.ts +0 -23
  1631. package/dist/components/features/diff-viewer/empty-changes-message.cjs +0 -2
  1632. package/dist/components/features/diff-viewer/empty-changes-message.cjs.map +0 -1
  1633. package/dist/components/features/diff-viewer/empty-changes-message.js +0 -17
  1634. package/dist/components/features/diff-viewer/empty-changes-message.js.map +0 -1
  1635. package/dist/components/features/home/home-header/guide-message.d.ts +0 -1
  1636. package/dist/components/features/home/home-header/home-header.d.ts +0 -1
  1637. package/dist/components/features/home/new-conversation/create-conversation-button.d.ts +0 -1
  1638. package/dist/components/features/home/new-conversation/new-conversation.d.ts +0 -1
  1639. package/dist/components/features/home/new-conversation.d.ts +0 -1
  1640. package/dist/components/features/home/tasks/task-card.d.ts +0 -6
  1641. package/dist/components/features/home/tasks/task-group.d.ts +0 -7
  1642. package/dist/components/features/home/tasks/task-issue-number.d.ts +0 -6
  1643. package/dist/components/features/home/tasks/task-item-title.d.ts +0 -1
  1644. package/dist/components/features/home/tasks/task-suggestions-skeleton.d.ts +0 -1
  1645. package/dist/components/features/home/tasks/task-suggestions.d.ts +0 -6
  1646. package/dist/components/features/settings/agent-server-onboarding.d.ts +0 -10
  1647. package/dist/components/features/settings/mcp-settings/mcp-server-list-item.d.ts +0 -6
  1648. package/dist/components/features/settings/mcp-settings/mcp-server-list.d.ts +0 -8
  1649. package/dist/components/features/tips/random-tip.cjs +0 -2
  1650. package/dist/components/features/tips/random-tip.cjs.map +0 -1
  1651. package/dist/components/features/tips/random-tip.js +0 -41
  1652. package/dist/components/features/tips/random-tip.js.map +0 -1
  1653. package/dist/hooks/query/use-has-git-commits.cjs +0 -2
  1654. package/dist/hooks/query/use-has-git-commits.cjs.map +0 -1
  1655. package/dist/hooks/query/use-has-git-commits.d.ts +0 -25
  1656. package/dist/hooks/query/use-has-git-commits.js +0 -31
  1657. package/dist/hooks/query/use-has-git-commits.js.map +0 -1
  1658. package/dist/hooks/query/use-suggested-tasks.d.ts +0 -1
  1659. package/dist/hooks/use-has-attached-source.cjs +0 -2
  1660. package/dist/hooks/use-has-attached-source.cjs.map +0 -1
  1661. package/dist/hooks/use-has-attached-source.d.ts +0 -18
  1662. package/dist/hooks/use-has-attached-source.js +0 -14
  1663. package/dist/hooks/use-has-attached-source.js.map +0 -1
  1664. package/dist/hooks/use-should-show-user-features.d.ts +0 -1
  1665. package/dist/icons/chveron-up.cjs +0 -2
  1666. package/dist/icons/chveron-up.cjs.map +0 -1
  1667. package/dist/icons/chveron-up.js +0 -21
  1668. package/dist/icons/chveron-up.js.map +0 -1
  1669. package/dist/routes/changes-tab.cjs +0 -2
  1670. package/dist/routes/changes-tab.cjs.map +0 -1
  1671. package/dist/routes/changes-tab.d.ts +0 -3
  1672. package/dist/routes/changes-tab.js +0 -64
  1673. package/dist/routes/changes-tab.js.map +0 -1
  1674. package/dist/ui/card-title.d.ts +0 -16
  1675. package/dist/ui/card.d.ts +0 -14
  1676. package/dist/utils/file-priority.cjs +0 -2
  1677. package/dist/utils/file-priority.cjs.map +0 -1
  1678. package/dist/utils/file-priority.d.ts +0 -27
  1679. package/dist/utils/file-priority.js +0 -61
  1680. package/dist/utils/file-priority.js.map +0 -1
  1681. package/dist/utils/group-suggested-tasks.d.ts +0 -7
  1682. package/dist/utils/table-row-classes.d.ts +0 -9
  1683. package/dist/utils/tips.cjs +0 -2
  1684. package/dist/utils/tips.cjs.map +0 -1
  1685. package/dist/utils/tips.js +0 -45
  1686. package/dist/utils/tips.js.map +0 -1
  1687. /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~dh9v73sa-rfV8mQ9m.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew3u153i-rfV8mQ9m.js} +0 -0
  1688. /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~lq5hicxx-cHFhpUBq.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ox0jfsa0-cHFhpUBq.js} +0 -0
@@ -1,6 +1,6 @@
1
1
  //#region src/utils/extension-module-card-classes.ts
2
- var e = "rounded-xl bg-base-secondary", t = "extension-module-card-interactive", n = "@container min-w-0 w-full", r = "grid min-w-0 grid-cols-1 gap-3 @min-[600px]:grid-cols-2", i = "rounded-xl border border-[var(--oh-border)] p-8 text-center";
2
+ var e = "rounded-xl bg-base-secondary", t = "extension-module-card-interactive", n = "inline-flex max-w-full shrink-0 items-center whitespace-nowrap rounded-full bg-[rgba(255,255,255,0.04)] px-2 py-0.5 text-[11px] leading-4 text-tertiary-light", r = "@container min-w-0 w-full", i = "grid min-w-0 grid-cols-1 gap-3 @min-[600px]:grid-cols-2", a = "rounded-xl border border-[var(--oh-border)] p-8 text-center";
3
3
  //#endregion
4
- export { r as extensionModuleCardGridClassName, n as extensionModuleCardGridContainerClassName, t as extensionModuleCardInteractiveClassName, e as extensionModuleCardSurfaceClassName, i as extensionModuleEmptyStateClassName };
4
+ export { i as extensionModuleCardGridClassName, r as extensionModuleCardGridContainerClassName, t as extensionModuleCardInteractiveClassName, n as extensionModuleCardPillClassName, e as extensionModuleCardSurfaceClassName, a as extensionModuleEmptyStateClassName };
5
5
 
6
6
  //# sourceMappingURL=extension-module-card-classes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"extension-module-card-classes.js","names":[],"sources":["../../src/utils/extension-module-card-classes.ts"],"sourcesContent":["/** Shared card chrome for Skills / MCP / Automations tiles (border on hover only). */\nexport const extensionModuleCardSurfaceClassName =\n \"rounded-xl bg-base-secondary\";\n\n/** See `.extension-module-card-interactive` in `src/tailwind.css`. */\nexport const EXTENSION_MODULE_CARD_INTERACTIVE_CLASS =\n \"extension-module-card-interactive\";\n\nexport const extensionModuleCardInteractiveClassName =\n EXTENSION_MODULE_CARD_INTERACTIVE_CLASS;\n\n/** Shared pill chrome for Skills, automation cards, and related modals. */\nexport const extensionModuleCardPillClassName =\n \"inline-flex max-w-full shrink-0 items-center whitespace-nowrap rounded-full border border-[var(--oh-border)] bg-[rgba(255,255,255,0.04)] px-2 py-0.5 text-[11px] leading-4 text-tertiary-light\";\n\n/** Two-column card grids switch back to one column at or below this width (px). */\nexport const EXTENSION_MODULE_CARD_GRID_SINGLE_COLUMN_MAX_PX = 599;\n\n/** Establishes the inline-size container queried by {@link extensionModuleCardGridClassName}. */\nexport const extensionModuleCardGridContainerClassName =\n \"@container min-w-0 w-full\";\n\n/** Single column in narrow content columns; two columns from 600px container width up. */\nexport const extensionModuleCardGridClassName =\n \"grid min-w-0 grid-cols-1 gap-3 @min-[600px]:grid-cols-2\";\n\n/** Bordered empty-state panel used on MCP Installed and Automations list pages. */\nexport const extensionModuleEmptyStateClassName =\n \"rounded-xl border border-[var(--oh-border)] p-8 text-center\";\n"],"mappings":";AACA,IAAa,IACX,gCAMW,IACX,qCAUW,IACX,6BAGW,IACX,2DAGW,IACX"}
1
+ {"version":3,"file":"extension-module-card-classes.js","names":[],"sources":["../../src/utils/extension-module-card-classes.ts"],"sourcesContent":["/** Shared card chrome for Skills / MCP / Automations tiles (border on hover only). */\nexport const extensionModuleCardSurfaceClassName =\n \"rounded-xl bg-base-secondary\";\n\n/** See `.extension-module-card-interactive` in `src/tailwind.css`. */\nexport const EXTENSION_MODULE_CARD_INTERACTIVE_CLASS =\n \"extension-module-card-interactive\";\n\nexport const extensionModuleCardInteractiveClassName =\n EXTENSION_MODULE_CARD_INTERACTIVE_CLASS;\n\n/** Shared pill chrome for Skills, automation cards, and related modals. */\nexport const extensionModuleCardPillClassName =\n \"inline-flex max-w-full shrink-0 items-center whitespace-nowrap rounded-full bg-[rgba(255,255,255,0.04)] px-2 py-0.5 text-[11px] leading-4 text-tertiary-light\";\n\n/** Two-column card grids switch back to one column at or below this width (px). */\nexport const EXTENSION_MODULE_CARD_GRID_SINGLE_COLUMN_MAX_PX = 599;\n\n/** Establishes the inline-size container queried by {@link extensionModuleCardGridClassName}. */\nexport const extensionModuleCardGridContainerClassName =\n \"@container min-w-0 w-full\";\n\n/** Single column in narrow content columns; two columns from 600px container width up. */\nexport const extensionModuleCardGridClassName =\n \"grid min-w-0 grid-cols-1 gap-3 @min-[600px]:grid-cols-2\";\n\n/** Bordered empty-state panel used on MCP Installed and Automations list pages. */\nexport const extensionModuleEmptyStateClassName =\n \"rounded-xl border border-[var(--oh-border)] p-8 text-center\";\n"],"mappings":";AACA,IAAa,IACX,gCAMW,IACX,qCAGW,IACX,iKAMW,IACX,6BAGW,IACX,2DAGW,IACX"}
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");var e=`Free`,t={"openhands/glm-5.2":`OpenHands GLM-5.2 (free)`,"openhands/deepseek-v4-flash":`OpenHands DeepSeek V4 Flash (free)`,"openhands/minimax-m2.7":`OpenHands MiniMax M2.7 (free)`},n=`Free OpenHands models: ${Object.keys(t).join(`, `)}. Other provider endpoints with similar model names may require separate billing.`,r=e=>!!(e&&e in t);function i(e){return e?r(e)?t[e]:e:null}function a(e){return e?r(e)?t[e]:e.split(`/`).pop()||e:null}exports.FREE_MODEL_BADGE_LABEL=e,exports.FREE_OPENHANDS_MODEL_NOTE=n,exports.formatModelNameForDisplay=i,exports.formatNativeModelName=a,exports.isFreeOpenHandsModel=r;
1
+ require("../_virtual/_rolldown/runtime.cjs");var e=`Free`,t={"openhands/kimi-k3":`OpenHands Kimi K3 (free)`,"openhands/glm-5.2":`OpenHands GLM-5.2 (free)`,"openhands/deepseek-v4-flash":`OpenHands DeepSeek V4 Flash (free)`,"openhands/minimax-m2.7":`OpenHands MiniMax M2.7 (free)`},n=`Free OpenHands models: ${Object.keys(t).join(`, `)}. Other provider endpoints with similar model names may require separate billing.`,r=e=>!!(e&&e in t);function i(e){return e?r(e)?t[e]:e:null}function a(e){return e?r(e)?t[e]:e.split(`/`).pop()||e:null}exports.FREE_MODEL_BADGE_LABEL=e,exports.FREE_OPENHANDS_MODEL_NOTE=n,exports.formatModelNameForDisplay=i,exports.formatNativeModelName=a,exports.isFreeOpenHandsModel=r;
2
2
  //# sourceMappingURL=format-model-name.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"format-model-name.cjs","names":[],"sources":["../../src/utils/format-model-name.ts"],"sourcesContent":["export const FREE_MODEL_BADGE_LABEL = \"Free\";\n\nexport const FREE_OPENHANDS_MODELS = {\n \"openhands/glm-5.2\": \"OpenHands GLM-5.2 (free)\",\n \"openhands/deepseek-v4-flash\": \"OpenHands DeepSeek V4 Flash (free)\",\n \"openhands/minimax-m2.7\": \"OpenHands MiniMax M2.7 (free)\",\n} as const;\n\nexport const FREE_OPENHANDS_MODEL_IDS = Object.keys(FREE_OPENHANDS_MODELS);\nexport const FREE_OPENHANDS_MODEL_NOTE = `Free OpenHands models: ${FREE_OPENHANDS_MODEL_IDS.join(\n \", \",\n)}. Other provider endpoints with similar model names may require separate billing.`;\n\nexport const isFreeOpenHandsModel = (\n model: string | null | undefined,\n): model is keyof typeof FREE_OPENHANDS_MODELS =>\n Boolean(model && model in FREE_OPENHANDS_MODELS);\n\nexport function formatModelNameForDisplay(\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n return isFreeOpenHandsModel(model) ? FREE_OPENHANDS_MODELS[model] : model;\n}\n\nexport function formatProviderModelNameForDisplay(\n provider: string | null | undefined,\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n const fullModel = provider ? `${provider}/${model}` : model;\n return isFreeOpenHandsModel(fullModel)\n ? FREE_OPENHANDS_MODELS[fullModel]\n : model;\n}\n\n/**\n * Format a native (OpenHands-kind) routing model string for display, stripping\n * the provider route prefix (e.g. ``\"anthropic/claude-sonnet-4-5-20250929\"`` →\n * ``\"claude-sonnet-4-5-20250929\"``, ``\"litellm_proxy/openai/gpt-4o\"`` →\n * ``\"gpt-4o\"``) so a conversation chip shows a meaningful model name rather than\n * the full routing path.\n *\n * Returns ``null`` for an empty/nullish input, and falls back to the original\n * string when stripping the prefix would leave nothing (e.g. a trailing slash)\n * — never an empty string, which would collapse the chip text.\n *\n * Display-only: unlike {@link deriveProfileNameFromModel} this does not sanitize\n * to an identifier, so it keeps the real model id intact for the chip.\n */\nexport function formatNativeModelName(\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n if (isFreeOpenHandsModel(model)) return FREE_OPENHANDS_MODELS[model];\n const lastSegment = model.split(\"/\").pop();\n return lastSegment || model;\n}\n"],"mappings":"6CAAA,IAAa,EAAyB,OAEzB,EAAwB,CACnC,oBAAqB,2BACrB,8BAA+B,qCAC/B,yBAA0B,+BAC5B,EAGa,EAA4B,0BADD,OAAO,KAAK,CACe,EAAyB,KAC1F,IACF,EAAE,mFAEW,EACX,GAEA,GAAQ,GAAS,KAAS,GAE5B,SAAgB,EACd,EACe,CAEf,OADK,EACE,EAAqB,CAAK,EAAI,EAAsB,GAAS,EADjD,IAErB,CA2BA,SAAgB,EACd,EACe,CAIf,OAHK,EACD,EAAqB,CAAK,EAAU,EAAsB,GAC1C,EAAM,MAAM,GAAG,EAAE,IAC9B,GAAe,EAHH,IAIrB"}
1
+ {"version":3,"file":"format-model-name.cjs","names":[],"sources":["../../src/utils/format-model-name.ts"],"sourcesContent":["export const FREE_MODEL_BADGE_LABEL = \"Free\";\n\nexport const FREE_OPENHANDS_MODELS = {\n \"openhands/kimi-k3\": \"OpenHands Kimi K3 (free)\",\n \"openhands/glm-5.2\": \"OpenHands GLM-5.2 (free)\",\n \"openhands/deepseek-v4-flash\": \"OpenHands DeepSeek V4 Flash (free)\",\n \"openhands/minimax-m2.7\": \"OpenHands MiniMax M2.7 (free)\",\n} as const;\n\nexport const FREE_OPENHANDS_MODEL_IDS = Object.keys(FREE_OPENHANDS_MODELS);\nexport const FREE_OPENHANDS_MODEL_NOTE = `Free OpenHands models: ${FREE_OPENHANDS_MODEL_IDS.join(\n \", \",\n)}. Other provider endpoints with similar model names may require separate billing.`;\n\nexport const isFreeOpenHandsModel = (\n model: string | null | undefined,\n): model is keyof typeof FREE_OPENHANDS_MODELS =>\n Boolean(model && model in FREE_OPENHANDS_MODELS);\n\nexport function formatModelNameForDisplay(\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n return isFreeOpenHandsModel(model) ? FREE_OPENHANDS_MODELS[model] : model;\n}\n\nexport function formatProviderModelNameForDisplay(\n provider: string | null | undefined,\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n const fullModel = provider ? `${provider}/${model}` : model;\n return isFreeOpenHandsModel(fullModel)\n ? FREE_OPENHANDS_MODELS[fullModel]\n : model;\n}\n\n/**\n * Format a native (OpenHands-kind) routing model string for display, stripping\n * the provider route prefix (e.g. ``\"anthropic/claude-sonnet-4-5-20250929\"`` →\n * ``\"claude-sonnet-4-5-20250929\"``, ``\"litellm_proxy/openai/gpt-4o\"`` →\n * ``\"gpt-4o\"``) so a conversation chip shows a meaningful model name rather than\n * the full routing path.\n *\n * Returns ``null`` for an empty/nullish input, and falls back to the original\n * string when stripping the prefix would leave nothing (e.g. a trailing slash)\n * — never an empty string, which would collapse the chip text.\n *\n * Display-only: unlike {@link deriveProfileNameFromModel} this does not sanitize\n * to an identifier, so it keeps the real model id intact for the chip.\n */\nexport function formatNativeModelName(\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n if (isFreeOpenHandsModel(model)) return FREE_OPENHANDS_MODELS[model];\n const lastSegment = model.split(\"/\").pop();\n return lastSegment || model;\n}\n"],"mappings":"6CAAA,IAAa,EAAyB,OAEzB,EAAwB,CACnC,oBAAqB,2BACrB,oBAAqB,2BACrB,8BAA+B,qCAC/B,yBAA0B,+BAC5B,EAGa,EAA4B,0BADD,OAAO,KAAK,CACe,EAAyB,KAC1F,IACF,EAAE,mFAEW,EACX,GAEA,GAAQ,GAAS,KAAS,GAE5B,SAAgB,EACd,EACe,CAEf,OADK,EACE,EAAqB,CAAK,EAAI,EAAsB,GAAS,EADjD,IAErB,CA2BA,SAAgB,EACd,EACe,CAIf,OAHK,EACD,EAAqB,CAAK,EAAU,EAAsB,GAC1C,EAAM,MAAM,GAAG,EAAE,IAC9B,GAAe,EAHH,IAIrB"}
@@ -1,5 +1,6 @@
1
1
  export declare const FREE_MODEL_BADGE_LABEL = "Free";
2
2
  export declare const FREE_OPENHANDS_MODELS: {
3
+ readonly "openhands/kimi-k3": "OpenHands Kimi K3 (free)";
3
4
  readonly "openhands/glm-5.2": "OpenHands GLM-5.2 (free)";
4
5
  readonly "openhands/deepseek-v4-flash": "OpenHands DeepSeek V4 Flash (free)";
5
6
  readonly "openhands/minimax-m2.7": "OpenHands MiniMax M2.7 (free)";
@@ -1,5 +1,6 @@
1
1
  //#region src/utils/format-model-name.ts
2
2
  var e = "Free", t = {
3
+ "openhands/kimi-k3": "OpenHands Kimi K3 (free)",
3
4
  "openhands/glm-5.2": "OpenHands GLM-5.2 (free)",
4
5
  "openhands/deepseek-v4-flash": "OpenHands DeepSeek V4 Flash (free)",
5
6
  "openhands/minimax-m2.7": "OpenHands MiniMax M2.7 (free)"
@@ -1 +1 @@
1
- {"version":3,"file":"format-model-name.js","names":[],"sources":["../../src/utils/format-model-name.ts"],"sourcesContent":["export const FREE_MODEL_BADGE_LABEL = \"Free\";\n\nexport const FREE_OPENHANDS_MODELS = {\n \"openhands/glm-5.2\": \"OpenHands GLM-5.2 (free)\",\n \"openhands/deepseek-v4-flash\": \"OpenHands DeepSeek V4 Flash (free)\",\n \"openhands/minimax-m2.7\": \"OpenHands MiniMax M2.7 (free)\",\n} as const;\n\nexport const FREE_OPENHANDS_MODEL_IDS = Object.keys(FREE_OPENHANDS_MODELS);\nexport const FREE_OPENHANDS_MODEL_NOTE = `Free OpenHands models: ${FREE_OPENHANDS_MODEL_IDS.join(\n \", \",\n)}. Other provider endpoints with similar model names may require separate billing.`;\n\nexport const isFreeOpenHandsModel = (\n model: string | null | undefined,\n): model is keyof typeof FREE_OPENHANDS_MODELS =>\n Boolean(model && model in FREE_OPENHANDS_MODELS);\n\nexport function formatModelNameForDisplay(\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n return isFreeOpenHandsModel(model) ? FREE_OPENHANDS_MODELS[model] : model;\n}\n\nexport function formatProviderModelNameForDisplay(\n provider: string | null | undefined,\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n const fullModel = provider ? `${provider}/${model}` : model;\n return isFreeOpenHandsModel(fullModel)\n ? FREE_OPENHANDS_MODELS[fullModel]\n : model;\n}\n\n/**\n * Format a native (OpenHands-kind) routing model string for display, stripping\n * the provider route prefix (e.g. ``\"anthropic/claude-sonnet-4-5-20250929\"`` →\n * ``\"claude-sonnet-4-5-20250929\"``, ``\"litellm_proxy/openai/gpt-4o\"`` →\n * ``\"gpt-4o\"``) so a conversation chip shows a meaningful model name rather than\n * the full routing path.\n *\n * Returns ``null`` for an empty/nullish input, and falls back to the original\n * string when stripping the prefix would leave nothing (e.g. a trailing slash)\n * — never an empty string, which would collapse the chip text.\n *\n * Display-only: unlike {@link deriveProfileNameFromModel} this does not sanitize\n * to an identifier, so it keeps the real model id intact for the chip.\n */\nexport function formatNativeModelName(\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n if (isFreeOpenHandsModel(model)) return FREE_OPENHANDS_MODELS[model];\n const lastSegment = model.split(\"/\").pop();\n return lastSegment || model;\n}\n"],"mappings":";AAAA,IAAa,IAAyB,QAEzB,IAAwB;CACnC,qBAAqB;CACrB,+BAA+B;CAC/B,0BAA0B;AAC5B,GAGa,IAA4B,0BADD,OAAO,KAAK,CACe,EAAyB,KAC1F,IACF,EAAE,oFAEW,KACX,MAEA,GAAQ,KAAS,KAAS;AAE5B,SAAgB,EACd,GACe;CAEf,OADK,IACE,EAAqB,CAAK,IAAI,EAAsB,KAAS,IADjD;AAErB;AA2BA,SAAgB,EACd,GACe;CAIf,OAHK,IACD,EAAqB,CAAK,IAAU,EAAsB,KAC1C,EAAM,MAAM,GAAG,EAAE,IAC9B,KAAe,IAHH;AAIrB"}
1
+ {"version":3,"file":"format-model-name.js","names":[],"sources":["../../src/utils/format-model-name.ts"],"sourcesContent":["export const FREE_MODEL_BADGE_LABEL = \"Free\";\n\nexport const FREE_OPENHANDS_MODELS = {\n \"openhands/kimi-k3\": \"OpenHands Kimi K3 (free)\",\n \"openhands/glm-5.2\": \"OpenHands GLM-5.2 (free)\",\n \"openhands/deepseek-v4-flash\": \"OpenHands DeepSeek V4 Flash (free)\",\n \"openhands/minimax-m2.7\": \"OpenHands MiniMax M2.7 (free)\",\n} as const;\n\nexport const FREE_OPENHANDS_MODEL_IDS = Object.keys(FREE_OPENHANDS_MODELS);\nexport const FREE_OPENHANDS_MODEL_NOTE = `Free OpenHands models: ${FREE_OPENHANDS_MODEL_IDS.join(\n \", \",\n)}. Other provider endpoints with similar model names may require separate billing.`;\n\nexport const isFreeOpenHandsModel = (\n model: string | null | undefined,\n): model is keyof typeof FREE_OPENHANDS_MODELS =>\n Boolean(model && model in FREE_OPENHANDS_MODELS);\n\nexport function formatModelNameForDisplay(\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n return isFreeOpenHandsModel(model) ? FREE_OPENHANDS_MODELS[model] : model;\n}\n\nexport function formatProviderModelNameForDisplay(\n provider: string | null | undefined,\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n const fullModel = provider ? `${provider}/${model}` : model;\n return isFreeOpenHandsModel(fullModel)\n ? FREE_OPENHANDS_MODELS[fullModel]\n : model;\n}\n\n/**\n * Format a native (OpenHands-kind) routing model string for display, stripping\n * the provider route prefix (e.g. ``\"anthropic/claude-sonnet-4-5-20250929\"`` →\n * ``\"claude-sonnet-4-5-20250929\"``, ``\"litellm_proxy/openai/gpt-4o\"`` →\n * ``\"gpt-4o\"``) so a conversation chip shows a meaningful model name rather than\n * the full routing path.\n *\n * Returns ``null`` for an empty/nullish input, and falls back to the original\n * string when stripping the prefix would leave nothing (e.g. a trailing slash)\n * — never an empty string, which would collapse the chip text.\n *\n * Display-only: unlike {@link deriveProfileNameFromModel} this does not sanitize\n * to an identifier, so it keeps the real model id intact for the chip.\n */\nexport function formatNativeModelName(\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n if (isFreeOpenHandsModel(model)) return FREE_OPENHANDS_MODELS[model];\n const lastSegment = model.split(\"/\").pop();\n return lastSegment || model;\n}\n"],"mappings":";AAAA,IAAa,IAAyB,QAEzB,IAAwB;CACnC,qBAAqB;CACrB,qBAAqB;CACrB,+BAA+B;CAC/B,0BAA0B;AAC5B,GAGa,IAA4B,0BADD,OAAO,KAAK,CACe,EAAyB,KAC1F,IACF,EAAE,oFAEW,KACX,MAEA,GAAQ,KAAS,KAAS;AAE5B,SAAgB,EACd,GACe;CAEf,OADK,IACE,EAAqB,CAAK,IAAI,EAAsB,KAAS,IADjD;AAErB;AA2BA,SAAgB,EACd,GACe;CAIf,OAHK,IACD,EAAqB,CAAK,IAAU,EAAsB,KAC1C,EAAM,MAAM,GAAG,EAAE,IAC9B,KAAe,IAHH;AAIrB"}
@@ -0,0 +1,2 @@
1
+ require("../_virtual/_rolldown/runtime.cjs");const e=require("../i18n/declaration.cjs");function t(e,t){return new Date(e).toLocaleDateString(t,{year:`numeric`,month:`short`,day:`numeric`})}function n(n,r,i){let a=Date.now()-new Date(n).getTime(),o=Math.floor(a/6e4),s=Math.floor(a/36e5),c=Math.floor(a/864e5);return o<1?i(e.I18nKey.AUTOMATIONS$DETAIL$TIME_JUST_NOW):o<60?i(e.I18nKey.AUTOMATIONS$DETAIL$TIME_MINUTES_AGO,{count:o}):s<24?i(e.I18nKey.AUTOMATIONS$DETAIL$TIME_HOURS_AGO,{count:s}):c===1?i(e.I18nKey.AUTOMATIONS$DETAIL$TIME_YESTERDAY):c<7?i(e.I18nKey.AUTOMATIONS$DETAIL$TIME_DAYS_AGO,{count:c}):t(n,r)}exports.formatRelativeTime=n;
2
+ //# sourceMappingURL=format-relative-time.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-relative-time.cjs","names":[],"sources":["../../src/utils/format-relative-time.ts"],"sourcesContent":["import { I18nKey } from \"#/i18n/declaration\";\n\nexport function formatDate(dateStr: string, locale: string): string {\n const date = new Date(dateStr);\n return date.toLocaleDateString(locale, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n\nexport function formatRelativeTime(\n dateStr: string,\n locale: string,\n t: (key: I18nKey, options?: Record<string, unknown>) => string,\n): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diffMs = now - then;\n const diffMins = Math.floor(diffMs / 60_000);\n const diffHours = Math.floor(diffMs / 3_600_000);\n const diffDays = Math.floor(diffMs / 86_400_000);\n\n if (diffMins < 1) return t(I18nKey.AUTOMATIONS$DETAIL$TIME_JUST_NOW);\n if (diffMins < 60)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_MINUTES_AGO, { count: diffMins });\n if (diffHours < 24)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_HOURS_AGO, { count: diffHours });\n if (diffDays === 1) return t(I18nKey.AUTOMATIONS$DETAIL$TIME_YESTERDAY);\n if (diffDays < 7)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_DAYS_AGO, { count: diffDays });\n return formatDate(dateStr, locale);\n}\n"],"mappings":"wFAEA,SAAgB,EAAW,EAAiB,EAAwB,CAElE,OAAO,IADU,KAAK,CACf,EAAK,mBAAmB,EAAQ,CACrC,KAAM,UACN,MAAO,QACP,IAAK,SACP,CAAC,CACH,CAEA,SAAgB,EACd,EACA,EACA,EACQ,CAGR,IAAM,EAFM,KAAK,IAEF,EADF,IAAI,KAAK,CAAO,EAAE,QACV,EACf,EAAW,KAAK,MAAM,EAAS,GAAM,EACrC,EAAY,KAAK,MAAM,EAAS,IAAS,EACzC,EAAW,KAAK,MAAM,EAAS,KAAU,EAU/C,OARI,EAAW,EAAU,EAAE,EAAA,QAAQ,gCAAgC,EAC/D,EAAW,GACN,EAAE,EAAA,QAAQ,oCAAqC,CAAE,MAAO,CAAS,CAAC,EACvE,EAAY,GACP,EAAE,EAAA,QAAQ,kCAAmC,CAAE,MAAO,CAAU,CAAC,EACtE,IAAa,EAAU,EAAE,EAAA,QAAQ,iCAAiC,EAClE,EAAW,EACN,EAAE,EAAA,QAAQ,iCAAkC,CAAE,MAAO,CAAS,CAAC,EACjE,EAAW,EAAS,CAAM,CACnC"}
@@ -0,0 +1,17 @@
1
+ import { I18nKey as e } from "../i18n/declaration.js";
2
+ //#region src/utils/format-relative-time.ts
3
+ function t(e, t) {
4
+ return new Date(e).toLocaleDateString(t, {
5
+ year: "numeric",
6
+ month: "short",
7
+ day: "numeric"
8
+ });
9
+ }
10
+ function n(n, r, i) {
11
+ let a = Date.now() - new Date(n).getTime(), o = Math.floor(a / 6e4), s = Math.floor(a / 36e5), c = Math.floor(a / 864e5);
12
+ return o < 1 ? i(e.AUTOMATIONS$DETAIL$TIME_JUST_NOW) : o < 60 ? i(e.AUTOMATIONS$DETAIL$TIME_MINUTES_AGO, { count: o }) : s < 24 ? i(e.AUTOMATIONS$DETAIL$TIME_HOURS_AGO, { count: s }) : c === 1 ? i(e.AUTOMATIONS$DETAIL$TIME_YESTERDAY) : c < 7 ? i(e.AUTOMATIONS$DETAIL$TIME_DAYS_AGO, { count: c }) : t(n, r);
13
+ }
14
+ //#endregion
15
+ export { n as formatRelativeTime };
16
+
17
+ //# sourceMappingURL=format-relative-time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-relative-time.js","names":[],"sources":["../../src/utils/format-relative-time.ts"],"sourcesContent":["import { I18nKey } from \"#/i18n/declaration\";\n\nexport function formatDate(dateStr: string, locale: string): string {\n const date = new Date(dateStr);\n return date.toLocaleDateString(locale, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n\nexport function formatRelativeTime(\n dateStr: string,\n locale: string,\n t: (key: I18nKey, options?: Record<string, unknown>) => string,\n): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diffMs = now - then;\n const diffMins = Math.floor(diffMs / 60_000);\n const diffHours = Math.floor(diffMs / 3_600_000);\n const diffDays = Math.floor(diffMs / 86_400_000);\n\n if (diffMins < 1) return t(I18nKey.AUTOMATIONS$DETAIL$TIME_JUST_NOW);\n if (diffMins < 60)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_MINUTES_AGO, { count: diffMins });\n if (diffHours < 24)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_HOURS_AGO, { count: diffHours });\n if (diffDays === 1) return t(I18nKey.AUTOMATIONS$DETAIL$TIME_YESTERDAY);\n if (diffDays < 7)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_DAYS_AGO, { count: diffDays });\n return formatDate(dateStr, locale);\n}\n"],"mappings":";;AAEA,SAAgB,EAAW,GAAiB,GAAwB;CAElE,OAAO,IADU,KAAK,CACf,EAAK,mBAAmB,GAAQ;EACrC,MAAM;EACN,OAAO;EACP,KAAK;CACP,CAAC;AACH;AAEA,SAAgB,EACd,GACA,GACA,GACQ;CAGR,IAAM,IAFM,KAAK,IAEF,IADF,IAAI,KAAK,CAAO,EAAE,QACV,GACf,IAAW,KAAK,MAAM,IAAS,GAAM,GACrC,IAAY,KAAK,MAAM,IAAS,IAAS,GACzC,IAAW,KAAK,MAAM,IAAS,KAAU;CAU/C,OARI,IAAW,IAAU,EAAE,EAAQ,gCAAgC,IAC/D,IAAW,KACN,EAAE,EAAQ,qCAAqC,EAAE,OAAO,EAAS,CAAC,IACvE,IAAY,KACP,EAAE,EAAQ,mCAAmC,EAAE,OAAO,EAAU,CAAC,IACtE,MAAa,IAAU,EAAE,EAAQ,iCAAiC,IAClE,IAAW,IACN,EAAE,EAAQ,kCAAkC,EAAE,OAAO,EAAS,CAAC,IACjE,EAAW,GAAS,CAAM;AACnC"}
@@ -0,0 +1,5 @@
1
+ require("../_virtual/_rolldown/runtime.cjs");function e(e){let t=0,n=0;for(let r of e.split(`
2
+ `))r.startsWith(`+++`)||r.startsWith(`---`)||r.startsWith(`@@`)||(r.startsWith(`+`)?t+=1:r.startsWith(`-`)&&(n+=1));return{additions:t,deletions:n}}function t(e,t){let n=e.length===0?[]:e.split(`
3
+ `),r=t.length===0?[]:t.split(`
4
+ `);if(n.length===0)return{additions:r.length,deletions:0};if(r.length===0)return{additions:0,deletions:n.length};let i=0,a=0,o=0,s=0;for(;o<n.length||s<r.length;){let e=n[o],t=r[s];if(o<n.length&&s<r.length&&e===t){o+=1,s+=1;continue}if(s<r.length&&(o>=n.length||!n.slice(o).includes(t))){i+=1,s+=1;continue}o<n.length&&(a+=1,o+=1)}return{additions:i,deletions:a}}function n(n){return typeof n.diff==`string`&&n.diff.length>0?e(n.diff):t(n.original??``,n.modified??``)}function r(e){return e.reduce((e,t)=>({additions:e.additions+t.additions,deletions:e.deletions+t.deletions}),{additions:0,deletions:0})}exports.countGitChangeDiffStats=n,exports.sumGitDiffLineStats=r;
5
+ //# sourceMappingURL=git-diff-stats.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-diff-stats.cjs","names":[],"sources":["../../src/utils/git-diff-stats.ts"],"sourcesContent":["import type { GitChangeDiff } from \"#/api/open-hands.types\";\n\nexport interface GitDiffLineStats {\n additions: number;\n deletions: number;\n}\n\nfunction countUnifiedDiffStats(diff: string): GitDiffLineStats {\n let additions = 0;\n let deletions = 0;\n\n for (const line of diff.split(\"\\n\")) {\n if (\n line.startsWith(\"+++\") ||\n line.startsWith(\"---\") ||\n line.startsWith(\"@@\")\n ) {\n continue;\n }\n if (line.startsWith(\"+\")) {\n additions += 1;\n } else if (line.startsWith(\"-\")) {\n deletions += 1;\n }\n }\n\n return { additions, deletions };\n}\n\nfunction countTextDiffStats(\n original: string,\n modified: string,\n): GitDiffLineStats {\n const originalLines = original.length === 0 ? [] : original.split(\"\\n\");\n const modifiedLines = modified.length === 0 ? [] : modified.split(\"\\n\");\n\n if (originalLines.length === 0) {\n return { additions: modifiedLines.length, deletions: 0 };\n }\n\n if (modifiedLines.length === 0) {\n return { additions: 0, deletions: originalLines.length };\n }\n\n let additions = 0;\n let deletions = 0;\n let originalIndex = 0;\n let modifiedIndex = 0;\n\n while (\n originalIndex < originalLines.length ||\n modifiedIndex < modifiedLines.length\n ) {\n const originalLine = originalLines[originalIndex];\n const modifiedLine = modifiedLines[modifiedIndex];\n\n if (\n originalIndex < originalLines.length &&\n modifiedIndex < modifiedLines.length &&\n originalLine === modifiedLine\n ) {\n originalIndex += 1;\n modifiedIndex += 1;\n continue;\n }\n\n if (\n modifiedIndex < modifiedLines.length &&\n (originalIndex >= originalLines.length ||\n !originalLines.slice(originalIndex).includes(modifiedLine))\n ) {\n additions += 1;\n modifiedIndex += 1;\n continue;\n }\n\n if (originalIndex < originalLines.length) {\n deletions += 1;\n originalIndex += 1;\n }\n }\n\n return { additions, deletions };\n}\n\nexport function countGitChangeDiffStats(\n diff: GitChangeDiff & { diff?: string },\n): GitDiffLineStats {\n if (typeof diff.diff === \"string\" && diff.diff.length > 0) {\n return countUnifiedDiffStats(diff.diff);\n }\n\n return countTextDiffStats(diff.original ?? \"\", diff.modified ?? \"\");\n}\n\nexport function sumGitDiffLineStats(\n stats: GitDiffLineStats[],\n): GitDiffLineStats {\n return stats.reduce(\n (totals, stat) => ({\n additions: totals.additions + stat.additions,\n deletions: totals.deletions + stat.deletions,\n }),\n { additions: 0, deletions: 0 },\n );\n}\n"],"mappings":"6CAOA,SAAS,EAAsB,EAAgC,CAC7D,IAAI,EAAY,EACZ,EAAY,EAEhB,IAAK,IAAM,KAAQ,EAAK,MAAM;CAAI,EAE9B,EAAK,WAAW,KAAK,GACrB,EAAK,WAAW,KAAK,GACrB,EAAK,WAAW,IAAI,IAIlB,EAAK,WAAW,GAAG,EACrB,GAAa,EACJ,EAAK,WAAW,GAAG,IAC5B,GAAa,IAIjB,MAAO,CAAE,YAAW,WAAU,CAChC,CAEA,SAAS,EACP,EACA,EACkB,CAClB,IAAM,EAAgB,EAAS,SAAW,EAAI,CAAC,EAAI,EAAS,MAAM;CAAI,EAChE,EAAgB,EAAS,SAAW,EAAI,CAAC,EAAI,EAAS,MAAM;CAAI,EAEtE,GAAI,EAAc,SAAW,EAC3B,MAAO,CAAE,UAAW,EAAc,OAAQ,UAAW,CAAE,EAGzD,GAAI,EAAc,SAAW,EAC3B,MAAO,CAAE,UAAW,EAAG,UAAW,EAAc,MAAO,EAGzD,IAAI,EAAY,EACZ,EAAY,EACZ,EAAgB,EAChB,EAAgB,EAEpB,KACE,EAAgB,EAAc,QAC9B,EAAgB,EAAc,QAC9B,CACA,IAAM,EAAe,EAAc,GAC7B,EAAe,EAAc,GAEnC,GACE,EAAgB,EAAc,QAC9B,EAAgB,EAAc,QAC9B,IAAiB,EACjB,CACA,GAAiB,EACjB,GAAiB,EACjB,QACF,CAEA,GACE,EAAgB,EAAc,SAC7B,GAAiB,EAAc,QAC9B,CAAC,EAAc,MAAM,CAAa,EAAE,SAAS,CAAY,GAC3D,CACA,GAAa,EACb,GAAiB,EACjB,QACF,CAEI,EAAgB,EAAc,SAChC,GAAa,EACb,GAAiB,EAErB,CAEA,MAAO,CAAE,YAAW,WAAU,CAChC,CAEA,SAAgB,EACd,EACkB,CAKlB,OAJI,OAAO,EAAK,MAAS,UAAY,EAAK,KAAK,OAAS,EAC/C,EAAsB,EAAK,IAAI,EAGjC,EAAmB,EAAK,UAAY,GAAI,EAAK,UAAY,EAAE,CACpE,CAEA,SAAgB,EACd,EACkB,CAClB,OAAO,EAAM,QACV,EAAQ,KAAU,CACjB,UAAW,EAAO,UAAY,EAAK,UACnC,UAAW,EAAO,UAAY,EAAK,SACrC,GACA,CAAE,UAAW,EAAG,UAAW,CAAE,CAC/B,CACF"}
@@ -0,0 +1,9 @@
1
+ import type { GitChangeDiff } from "#/api/open-hands.types";
2
+ export interface GitDiffLineStats {
3
+ additions: number;
4
+ deletions: number;
5
+ }
6
+ export declare function countGitChangeDiffStats(diff: GitChangeDiff & {
7
+ diff?: string;
8
+ }): GitDiffLineStats;
9
+ export declare function sumGitDiffLineStats(stats: GitDiffLineStats[]): GitDiffLineStats;
@@ -0,0 +1,53 @@
1
+ //#region src/utils/git-diff-stats.ts
2
+ function e(e) {
3
+ let t = 0, n = 0;
4
+ for (let r of e.split("\n")) r.startsWith("+++") || r.startsWith("---") || r.startsWith("@@") || (r.startsWith("+") ? t += 1 : r.startsWith("-") && (n += 1));
5
+ return {
6
+ additions: t,
7
+ deletions: n
8
+ };
9
+ }
10
+ function t(e, t) {
11
+ let n = e.length === 0 ? [] : e.split("\n"), r = t.length === 0 ? [] : t.split("\n");
12
+ if (n.length === 0) return {
13
+ additions: r.length,
14
+ deletions: 0
15
+ };
16
+ if (r.length === 0) return {
17
+ additions: 0,
18
+ deletions: n.length
19
+ };
20
+ let i = 0, a = 0, o = 0, s = 0;
21
+ for (; o < n.length || s < r.length;) {
22
+ let e = n[o], t = r[s];
23
+ if (o < n.length && s < r.length && e === t) {
24
+ o += 1, s += 1;
25
+ continue;
26
+ }
27
+ if (s < r.length && (o >= n.length || !n.slice(o).includes(t))) {
28
+ i += 1, s += 1;
29
+ continue;
30
+ }
31
+ o < n.length && (a += 1, o += 1);
32
+ }
33
+ return {
34
+ additions: i,
35
+ deletions: a
36
+ };
37
+ }
38
+ function n(n) {
39
+ return typeof n.diff == "string" && n.diff.length > 0 ? e(n.diff) : t(n.original ?? "", n.modified ?? "");
40
+ }
41
+ function r(e) {
42
+ return e.reduce((e, t) => ({
43
+ additions: e.additions + t.additions,
44
+ deletions: e.deletions + t.deletions
45
+ }), {
46
+ additions: 0,
47
+ deletions: 0
48
+ });
49
+ }
50
+ //#endregion
51
+ export { n as countGitChangeDiffStats, r as sumGitDiffLineStats };
52
+
53
+ //# sourceMappingURL=git-diff-stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-diff-stats.js","names":[],"sources":["../../src/utils/git-diff-stats.ts"],"sourcesContent":["import type { GitChangeDiff } from \"#/api/open-hands.types\";\n\nexport interface GitDiffLineStats {\n additions: number;\n deletions: number;\n}\n\nfunction countUnifiedDiffStats(diff: string): GitDiffLineStats {\n let additions = 0;\n let deletions = 0;\n\n for (const line of diff.split(\"\\n\")) {\n if (\n line.startsWith(\"+++\") ||\n line.startsWith(\"---\") ||\n line.startsWith(\"@@\")\n ) {\n continue;\n }\n if (line.startsWith(\"+\")) {\n additions += 1;\n } else if (line.startsWith(\"-\")) {\n deletions += 1;\n }\n }\n\n return { additions, deletions };\n}\n\nfunction countTextDiffStats(\n original: string,\n modified: string,\n): GitDiffLineStats {\n const originalLines = original.length === 0 ? [] : original.split(\"\\n\");\n const modifiedLines = modified.length === 0 ? [] : modified.split(\"\\n\");\n\n if (originalLines.length === 0) {\n return { additions: modifiedLines.length, deletions: 0 };\n }\n\n if (modifiedLines.length === 0) {\n return { additions: 0, deletions: originalLines.length };\n }\n\n let additions = 0;\n let deletions = 0;\n let originalIndex = 0;\n let modifiedIndex = 0;\n\n while (\n originalIndex < originalLines.length ||\n modifiedIndex < modifiedLines.length\n ) {\n const originalLine = originalLines[originalIndex];\n const modifiedLine = modifiedLines[modifiedIndex];\n\n if (\n originalIndex < originalLines.length &&\n modifiedIndex < modifiedLines.length &&\n originalLine === modifiedLine\n ) {\n originalIndex += 1;\n modifiedIndex += 1;\n continue;\n }\n\n if (\n modifiedIndex < modifiedLines.length &&\n (originalIndex >= originalLines.length ||\n !originalLines.slice(originalIndex).includes(modifiedLine))\n ) {\n additions += 1;\n modifiedIndex += 1;\n continue;\n }\n\n if (originalIndex < originalLines.length) {\n deletions += 1;\n originalIndex += 1;\n }\n }\n\n return { additions, deletions };\n}\n\nexport function countGitChangeDiffStats(\n diff: GitChangeDiff & { diff?: string },\n): GitDiffLineStats {\n if (typeof diff.diff === \"string\" && diff.diff.length > 0) {\n return countUnifiedDiffStats(diff.diff);\n }\n\n return countTextDiffStats(diff.original ?? \"\", diff.modified ?? \"\");\n}\n\nexport function sumGitDiffLineStats(\n stats: GitDiffLineStats[],\n): GitDiffLineStats {\n return stats.reduce(\n (totals, stat) => ({\n additions: totals.additions + stat.additions,\n deletions: totals.deletions + stat.deletions,\n }),\n { additions: 0, deletions: 0 },\n );\n}\n"],"mappings":";AAOA,SAAS,EAAsB,GAAgC;CAC7D,IAAI,IAAY,GACZ,IAAY;CAEhB,KAAK,IAAM,KAAQ,EAAK,MAAM,IAAI,GAE9B,EAAK,WAAW,KAAK,KACrB,EAAK,WAAW,KAAK,KACrB,EAAK,WAAW,IAAI,MAIlB,EAAK,WAAW,GAAG,IACrB,KAAa,IACJ,EAAK,WAAW,GAAG,MAC5B,KAAa;CAIjB,OAAO;EAAE;EAAW;CAAU;AAChC;AAEA,SAAS,EACP,GACA,GACkB;CAClB,IAAM,IAAgB,EAAS,WAAW,IAAI,CAAC,IAAI,EAAS,MAAM,IAAI,GAChE,IAAgB,EAAS,WAAW,IAAI,CAAC,IAAI,EAAS,MAAM,IAAI;CAEtE,IAAI,EAAc,WAAW,GAC3B,OAAO;EAAE,WAAW,EAAc;EAAQ,WAAW;CAAE;CAGzD,IAAI,EAAc,WAAW,GAC3B,OAAO;EAAE,WAAW;EAAG,WAAW,EAAc;CAAO;CAGzD,IAAI,IAAY,GACZ,IAAY,GACZ,IAAgB,GAChB,IAAgB;CAEpB,OACE,IAAgB,EAAc,UAC9B,IAAgB,EAAc,SAC9B;EACA,IAAM,IAAe,EAAc,IAC7B,IAAe,EAAc;EAEnC,IACE,IAAgB,EAAc,UAC9B,IAAgB,EAAc,UAC9B,MAAiB,GACjB;GAEA,AADA,KAAiB,GACjB,KAAiB;GACjB;EACF;EAEA,IACE,IAAgB,EAAc,WAC7B,KAAiB,EAAc,UAC9B,CAAC,EAAc,MAAM,CAAa,EAAE,SAAS,CAAY,IAC3D;GAEA,AADA,KAAa,GACb,KAAiB;GACjB;EACF;EAEA,AAAI,IAAgB,EAAc,WAChC,KAAa,GACb,KAAiB;CAErB;CAEA,OAAO;EAAE;EAAW;CAAU;AAChC;AAEA,SAAgB,EACd,GACkB;CAKlB,OAJI,OAAO,EAAK,QAAS,YAAY,EAAK,KAAK,SAAS,IAC/C,EAAsB,EAAK,IAAI,IAGjC,EAAmB,EAAK,YAAY,IAAI,EAAK,YAAY,EAAE;AACpE;AAEA,SAAgB,EACd,GACkB;CAClB,OAAO,EAAM,QACV,GAAQ,OAAU;EACjB,WAAW,EAAO,YAAY,EAAK;EACnC,WAAW,EAAO,YAAY,EAAK;CACrC,IACA;EAAE,WAAW;EAAG,WAAW;CAAE,CAC/B;AACF"}
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");const e=require("../types/agent-server/type-guards.cjs"),t=require("../components/conversation-events/chat/event-thought-helpers.cjs");var n=(e,t)=>({...t,content:`${t.content??``}${e.content??``}`||null,reasoning_content:`${t.reasoning_content??``}${e.reasoning_content??``}`||null}),r=(e,t)=>!!e.isFromPlanningAgent==!!t.isFromPlanningAgent,i=t=>{for(let n=t.length-1;n>=0;--n){let r=t[n];if(e.isMessageEvent(r)&&r.source===`user`)return n}return-1},a=e=>e.filter(e=>e.type===`text`).map(e=>e.text).join(``),o=(e,t)=>{let n=0,r=0;for(let i of t){let t=e.indexOf(i,n);if(t===-1)return{matched:!1,lastMatchEnd:r};r=t+i.length,n=r}return{matched:!0,lastMatchEnd:r}},s=(t,n)=>{let a=i(t);return t.map((e,t)=>({event:e,index:t})).filter(t=>t.index>a&&e.isStreamingDeltaEvent(t.event)&&(t.event.content?.length??0)>0&&r(n,t.event))},c=(t,n)=>{let r=[];for(let i=t.length-1;i>=0;--i){let a=t[i];if(!e.isStreamingDeltaEvent(a))break;n(a)&&r.unshift({event:a,index:i})}return r},l=e=>c(e,e=>(e.content?.length??0)>0),u=(e,t)=>c(e,e=>!!e.reasoning_content&&r(t,e)),d=(t,n,r)=>{let i=new Set(n.map(({index:e})=>e)),a=[];return t.forEach((t,n)=>{if(!i.has(n)||!e.isStreamingDeltaEvent(t)){a.push(t);return}!r&&t.reasoning_content&&a.push({...t,content:null})}),a},f=(e,t)=>{let n=t.join(``),r=new Set([n,n.trimEnd(),n.trimStart(),n.trim()]);for(let t of r)if(t&&e.startsWith(t))return{matched:!0,lastMatchEnd:t.length};let i=t.length-1;return o(e,t.map((e,t)=>t===i?e.trimEnd():e))},p=n=>e.isActionEvent(n)?t.getReasoningContent(n).trim().length>0:e.isMessageEvent(n)&&n.source===`agent`?t.splitInlineThink(a(n.llm_message.content)).reasoning.length>0:!1,m=(e,t)=>{let n=s(t,e);if(n.length===0)return null;let r=d(t,n,p(e));return r.push(e),r},h=(e,n)=>{let r=a(e.thought);if(!r)return null;let i=l(n);return i.length===0||!f(r,i.map(({event:e})=>e.content??``)).matched?null:d(n,i,t.getReasoningContent(e).trim().length>0)},g=(n,r)=>{if(t.getReasoningContent(n).trim().length===0)return null;let i=u(r,n);if(i.length===0)return null;let a=new Set(i.map(({index:e})=>e)),o=[];return r.forEach((t,n)=>{if(!a.has(n)||!e.isStreamingDeltaEvent(t)){o.push(t);return}t.content&&o.push({...t,reasoning_content:null})}),o},_=(t,i)=>{let a=[...i];if(e.isStreamingDeltaEvent(t)){if(t.content===null&&t.reasoning_content===null)return a;let i=a.length-1,o=a[i];return o&&e.isStreamingDeltaEvent(o)&&r(t,o)?(a[i]=n(t,o),a):(a.push(t),a)}if(e.isActionEvent(t)&&t.action.kind===`FinishAction`||e.isMessageEvent(t)&&t.source===`agent`){let e=m(t,a);if(e)return e}if(e.isActionEvent(t)&&t.action.kind!==`FinishAction`&&t.action.kind!==`ThinkAction`){let e=h(t,a)??g(t,a);if(e)return e.push(t),e}if(e.isACPToolCallEvent(t)){let n=a.findIndex(n=>e.isACPToolCallEvent(n)&&n.tool_call_id===t.tool_call_id);return n===-1?a.push(t):a[n]=t,a}if(e.isObservationEvent(t)){if(t.observation.kind===`ThinkObservation`||t.observation.kind===`FinishObservation`)return a;let e=a.findIndex(e=>e.id===t.action_id);e===-1?a.push(t):a[e]=t}else a.push(t);return a};exports.handleEventForUI=_,exports.isSameStreamingSender=r,exports.mergeStreamingDeltaEvent=n;
1
+ require("../_virtual/_rolldown/runtime.cjs");const e=require("../types/agent-server/type-guards.cjs"),t=require("../components/conversation-events/chat/event-thought-helpers.cjs");var n=(e,t)=>({...t,content:`${t.content??``}${e.content??``}`||null,reasoning_content:`${t.reasoning_content??``}${e.reasoning_content??``}`||null}),r=(e,t)=>!!e.isFromPlanningAgent==!!t.isFromPlanningAgent,i=t=>{for(let n=t.length-1;n>=0;--n){let r=t[n];if(e.isMessageEvent(r)&&r.source===`user`)return n}return-1},a=e=>e.filter(e=>e.type===`text`).map(e=>e.text).join(``),o=(e,t)=>{let n=0,r=0;for(let i of t){let t=e.indexOf(i,n);if(t===-1)return{matched:!1,lastMatchEnd:r};r=t+i.length,n=r}return{matched:!0,lastMatchEnd:r}},s=(t,n)=>{let a=i(t);return t.map((e,t)=>({event:e,index:t})).filter(t=>t.index>a&&e.isStreamingDeltaEvent(t.event)&&(t.event.content?.length??0)>0&&r(n,t.event))},c=(t,n)=>{let r=[];for(let i=t.length-1;i>=0;--i){let a=t[i];if(!e.isStreamingDeltaEvent(a))break;n(a)&&r.unshift({event:a,index:i})}return r},l=(e,t)=>c(e,e=>(e.content?.length??0)>0&&r(t,e)),u=(e,t)=>c(e,e=>!!e.reasoning_content&&r(t,e)),d=(t,n,r)=>{let i=new Set(n.map(({index:e})=>e)),a=[];return t.forEach((t,n)=>{if(!i.has(n)||!e.isStreamingDeltaEvent(t)){a.push(t);return}!r&&t.reasoning_content&&a.push({...t,content:null})}),a},f=(e,t)=>{let n=t.join(``),r=new Set([n,n.trimEnd(),n.trimStart(),n.trim()]);for(let t of r)if(t&&e.startsWith(t))return{matched:!0,lastMatchEnd:t.length};let i=t.length-1;return o(e,t.map((e,t)=>t===i?e.trimEnd():e))},p=e=>e.some(e=>e.includes(`<function=`)),m=n=>e.isActionEvent(n)?t.getReasoningContent(n).trim().length>0:e.isMessageEvent(n)&&n.source===`agent`?t.splitInlineThink(a(n.llm_message.content)).reasoning.length>0:!1,h=(e,t)=>{let n=s(t,e);if(n.length===0)return null;let r=d(t,n,m(e));return r.push(e),r},g=(e,n)=>{let r=a(e.thought);if(!r)return null;let i=l(n,e);if(i.length===0)return null;let o=i.map(({event:e})=>e.content??``);return!f(r,o).matched&&!p(o)?null:d(n,i,t.getReasoningContent(e).trim().length>0)},_=(n,r)=>{if(t.getReasoningContent(n).trim().length===0)return null;let i=u(r,n);if(i.length===0)return null;let a=new Set(i.map(({index:e})=>e)),o=[];return r.forEach((t,n)=>{if(!a.has(n)||!e.isStreamingDeltaEvent(t)){o.push(t);return}t.content&&o.push({...t,reasoning_content:null})}),o},v=(t,i)=>{let a=[...i];if(e.isStreamingDeltaEvent(t)){if(t.content===null&&t.reasoning_content===null)return a;let i=a.length-1,o=a[i];return o&&e.isStreamingDeltaEvent(o)&&r(t,o)?(a[i]=n(t,o),a):(a.push(t),a)}if(e.isActionEvent(t)&&t.action.kind===`FinishAction`||e.isMessageEvent(t)&&t.source===`agent`){let e=h(t,a);if(e)return e}if(e.isActionEvent(t)&&t.action.kind!==`FinishAction`&&t.action.kind!==`ThinkAction`){let e=g(t,a)??_(t,a);if(e)return e.push(t),e}if(e.isACPToolCallEvent(t)){let n=a.findIndex(n=>e.isACPToolCallEvent(n)&&n.tool_call_id===t.tool_call_id);return n===-1?a.push(t):a[n]=t,a}if(e.isObservationEvent(t)){if(t.observation.kind===`ThinkObservation`||t.observation.kind===`FinishObservation`)return a;let e=a.findIndex(e=>e.id===t.action_id);e===-1?a.push(t):a[e]=t}else a.push(t);return a};exports.handleEventForUI=v,exports.isSameStreamingSender=r,exports.mergeStreamingDeltaEvent=n;
2
2
  //# sourceMappingURL=handle-event-for-ui.cjs.map
@@ -1 +1 @@
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 {\n getReasoningContent,\n splitInlineThink,\n} 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\n// Deltas only merge into one bubble when they share a sender; the planning flag\n// is the only discriminator (every delta has `source: \"agent\"`). Prevents a\n// planning-agent delta concatenating onto a main-agent one, misattributed (#1656).\nexport const isSameStreamingSender = (\n a: OpenHandsEvent & { isFromPlanningAgent?: boolean },\n b: OpenHandsEvent & { isFromPlanningAgent?: boolean },\n): boolean => Boolean(a.isFromPlanningAgent) === Boolean(b.isFromPlanningAgent);\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 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) that share the final event's sender. Reasoning-only deltas are\n// excluded: reasoning renders in its own collapsed bubble and never overlaps\n// the message text being reconciled. Sender scoping matters because the main\n// and planning sockets share this event store — without it, one agent's final\n// event would strip the other agent's still-live streamed deltas (#1656).\nconst getCurrentTurnContentDeltas = (\n uiEvents: OpenHandsEvent[],\n finalEvent: 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 isSameStreamingSender(finalEvent, item.event),\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 getTrailingDeltas = (\n uiEvents: OpenHandsEvent[],\n selects: (event: StreamingDeltaEvent) => boolean,\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 (selects(event)) {\n deltas.unshift({ event, index });\n }\n }\n return deltas;\n};\n\nconst getTrailingContentDeltas = (uiEvents: OpenHandsEvent[]) =>\n getTrailingDeltas(uiEvents, (event) => (event.content?.length ?? 0) > 0);\n\n// Sender-scoped: the main and planning sockets share this event store, so a\n// main-agent action must not strip the planning agent's live reasoning (#1656).\nconst getTrailingReasoningDeltas = (\n uiEvents: OpenHandsEvent[],\n finalEvent: OpenHandsEvent,\n) =>\n getTrailingDeltas(\n uiEvents,\n (event) =>\n Boolean(event.reasoning_content) &&\n isSameStreamingSender(finalEvent, event),\n );\n\n// Strip the streamed content deltas, keeping a delta only when it carries\n// reasoning the replacement itself won't render (many models stream reasoning\n// solely through the delta). Shared by the finalize and intermediate-action\n// reconciliation paths.\nconst supersedeStreamingContent = (\n uiEvents: OpenHandsEvent[],\n contentDeltas: { event: StreamingDeltaEvent; index: number }[],\n replacementRendersReasoning: boolean,\n): OpenHandsEvent[] => {\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\n // Keep the delta only to render reasoning the replacement itself lacks.\n if (!replacementRendersReasoning && event.reasoning_content) {\n nextUiEvents.push({ ...event, content: null });\n }\n });\n return nextUiEvents;\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 tolerate\n// leading and trailing whitespace that appeared only in the stream.\nconst matchStreamedSegments = (\n targetText: string,\n segments: string[],\n): { matched: boolean; lastMatchEnd: number } => {\n const streamedText = segments.join(\"\");\n const candidates = new Set([\n streamedText,\n streamedText.trimEnd(),\n streamedText.trimStart(),\n streamedText.trim(),\n ]);\n for (const candidate of candidates) {\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\n// Whether the finalized event renders its own reasoning: an ActionEvent via\n// reasoning_content/thinking_blocks, an agent MessageEvent via an inline\n// <think> block in its content. Decides if a replaced delta's reasoning must\n// be preserved separately.\nconst eventRendersReasoning = (event: OpenHandsEvent): boolean => {\n if (isActionEvent(event)) {\n return getReasoningContent(event).trim().length > 0;\n }\n\n if (isMessageEvent(event) && event.source === \"agent\") {\n return (\n splitInlineThink(joinTextBlocks(event.llm_message.content)).reasoning\n .length > 0\n );\n }\n\n return false;\n};\n\n// The final MessageEvent/FinishAction is authoritative for the turn's text. Drop\n// the provisional streamed deltas and render the canonical final event instead,\n// so the message is rendered exactly once (never holey or duplicated) and its\n// metadata — critic_result, activated_microagents — renders too. Stream-only\n// reasoning is preserved. Returns null when there is no streamed content to\n// reconcile, leaving the caller to append the final event normally.\nconst finalizeStreamingDeltasInPlace = (\n finalEvent: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n const contentStreamingDeltas = getCurrentTurnContentDeltas(\n uiEvents,\n finalEvent,\n );\n if (contentStreamingDeltas.length === 0) {\n return null;\n }\n\n const nextUiEvents = supersedeStreamingContent(\n uiEvents,\n contentStreamingDeltas,\n eventRendersReasoning(finalEvent),\n );\n nextUiEvents.push(finalEvent);\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 * The action must stay because it owns the tool call. The streamed text is\n * cleared from the delta, and the delta is kept only to carry reasoning the\n * action itself lacks (for many models the delta is the sole reasoning\n * 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 return supersedeStreamingContent(\n uiEvents,\n contentDeltas,\n getReasoningContent(action).trim().length > 0,\n );\n};\n\n// Drop the current step's streamed reasoning when the action renders that\n// reasoning itself, so \"Thinking\" renders once. Unlike\n// `supersedeStreamedThoughtWithAction` this does not require the streamed text\n// to match the thought, which models streaming reasoning-only deltas never do.\nconst supersedeStreamedReasoningWithAction = (\n action: ActionEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n if (getReasoningContent(action).trim().length === 0) {\n return null;\n }\n\n const reasoningDeltas = getTrailingReasoningDeltas(uiEvents, action);\n if (reasoningDeltas.length === 0) {\n return null;\n }\n\n const indexesToStrip = new Set(reasoningDeltas.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\n // Keep the delta only for streamed text the action itself lacks.\n if (event.content) {\n nextUiEvents.push({ ...event, reasoning_content: null });\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 (\n lastEvent &&\n isStreamingDeltaEvent(lastEvent) &&\n isSameStreamingSender(event, lastEvent)\n ) {\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 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 =\n supersedeStreamedThoughtWithAction(event, newUiEvents) ??\n supersedeStreamedReasoningWithAction(event, newUiEvents);\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
+ {"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 {\n getReasoningContent,\n splitInlineThink,\n} 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\n// Deltas only merge into one bubble when they share a sender; the planning flag\n// is the only discriminator (every delta has `source: \"agent\"`). Prevents a\n// planning-agent delta concatenating onto a main-agent one, misattributed (#1656).\nexport const isSameStreamingSender = (\n a: OpenHandsEvent & { isFromPlanningAgent?: boolean },\n b: OpenHandsEvent & { isFromPlanningAgent?: boolean },\n): boolean => Boolean(a.isFromPlanningAgent) === Boolean(b.isFromPlanningAgent);\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 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) that share the final event's sender. Reasoning-only deltas are\n// excluded: reasoning renders in its own collapsed bubble and never overlaps\n// the message text being reconciled. Sender scoping matters because the main\n// and planning sockets share this event store — without it, one agent's final\n// event would strip the other agent's still-live streamed deltas (#1656).\nconst getCurrentTurnContentDeltas = (\n uiEvents: OpenHandsEvent[],\n finalEvent: 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 isSameStreamingSender(finalEvent, item.event),\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 getTrailingDeltas = (\n uiEvents: OpenHandsEvent[],\n selects: (event: StreamingDeltaEvent) => boolean,\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 (selects(event)) {\n deltas.unshift({ event, index });\n }\n }\n return deltas;\n};\n\n// Sender-scoped for the same reason as `getTrailingReasoningDeltas` (#1656):\n// a main-agent action must not strip the planning agent's live content.\nconst getTrailingContentDeltas = (\n uiEvents: OpenHandsEvent[],\n finalEvent: OpenHandsEvent,\n) =>\n getTrailingDeltas(\n uiEvents,\n (event) =>\n (event.content?.length ?? 0) > 0 &&\n isSameStreamingSender(finalEvent, event),\n );\n\n// Sender-scoped: the main and planning sockets share this event store, so a\n// main-agent action must not strip the planning agent's live reasoning (#1656).\nconst getTrailingReasoningDeltas = (\n uiEvents: OpenHandsEvent[],\n finalEvent: OpenHandsEvent,\n) =>\n getTrailingDeltas(\n uiEvents,\n (event) =>\n Boolean(event.reasoning_content) &&\n isSameStreamingSender(finalEvent, event),\n );\n\n// Strip the streamed content deltas, keeping a delta only when it carries\n// reasoning the replacement itself won't render (many models stream reasoning\n// solely through the delta). Shared by the finalize and intermediate-action\n// reconciliation paths.\nconst supersedeStreamingContent = (\n uiEvents: OpenHandsEvent[],\n contentDeltas: { event: StreamingDeltaEvent; index: number }[],\n replacementRendersReasoning: boolean,\n): OpenHandsEvent[] => {\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\n // Keep the delta only to render reasoning the replacement itself lacks.\n if (!replacementRendersReasoning && event.reasoning_content) {\n nextUiEvents.push({ ...event, content: null });\n }\n });\n return nextUiEvents;\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 tolerate\n// leading and trailing whitespace that appeared only in the stream.\nconst matchStreamedSegments = (\n targetText: string,\n segments: string[],\n): { matched: boolean; lastMatchEnd: number } => {\n const streamedText = segments.join(\"\");\n const candidates = new Set([\n streamedText,\n streamedText.trimEnd(),\n streamedText.trimStart(),\n streamedText.trim(),\n ]);\n for (const candidate of candidates) {\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\n// A `<function=` marker means the delta still holds the raw prompted-tool-call\n// XML the SDK strips only after the response completes, so the streamed text is\n// a superset of the action's `thought` that `matchStreamedSegments` can't match.\nconst hasUnstrippedFunctionCallMarker = (segments: string[]): boolean =>\n segments.some((segment) => segment.includes(\"<function=\"));\n\n// Whether the finalized event renders its own reasoning: an ActionEvent via\n// reasoning_content/thinking_blocks, an agent MessageEvent via an inline\n// <think> block in its content. Decides if a replaced delta's reasoning must\n// be preserved separately.\nconst eventRendersReasoning = (event: OpenHandsEvent): boolean => {\n if (isActionEvent(event)) {\n return getReasoningContent(event).trim().length > 0;\n }\n\n if (isMessageEvent(event) && event.source === \"agent\") {\n return (\n splitInlineThink(joinTextBlocks(event.llm_message.content)).reasoning\n .length > 0\n );\n }\n\n return false;\n};\n\n// The final MessageEvent/FinishAction is authoritative for the turn's text. Drop\n// the provisional streamed deltas and render the canonical final event instead,\n// so the message is rendered exactly once (never holey or duplicated) and its\n// metadata — critic_result, activated_skills — renders too. Stream-only\n// reasoning is preserved. Returns null when there is no streamed content to\n// reconcile, leaving the caller to append the final event normally.\nconst finalizeStreamingDeltasInPlace = (\n finalEvent: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n const contentStreamingDeltas = getCurrentTurnContentDeltas(\n uiEvents,\n finalEvent,\n );\n if (contentStreamingDeltas.length === 0) {\n return null;\n }\n\n const nextUiEvents = supersedeStreamingContent(\n uiEvents,\n contentStreamingDeltas,\n eventRendersReasoning(finalEvent),\n );\n nextUiEvents.push(finalEvent);\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 * The action must stay because it owns the tool call. The streamed text is\n * cleared from the delta, and the delta is kept only to carry reasoning the\n * action itself lacks (for many models the delta is the sole reasoning\n * 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, action);\n if (contentDeltas.length === 0) {\n return null;\n }\n\n const streamingSegments = contentDeltas.map(\n ({ event }) => event.content ?? \"\",\n );\n\n // Strip on a thought match, or on an unstripped `<function=...>` marker whose\n // streamed text is a superset of `thought` that the match can't reconcile.\n const matchedThought = matchStreamedSegments(\n thoughtText,\n streamingSegments,\n ).matched;\n if (!matchedThought && !hasUnstrippedFunctionCallMarker(streamingSegments)) {\n return null;\n }\n\n // Keeping the delta's reasoning would duplicate the action's own \"Thinking\".\n return supersedeStreamingContent(\n uiEvents,\n contentDeltas,\n getReasoningContent(action).trim().length > 0,\n );\n};\n\n// Drop the current step's streamed reasoning when the action renders that\n// reasoning itself, so \"Thinking\" renders once. Unlike\n// `supersedeStreamedThoughtWithAction` this does not require the streamed text\n// to match the thought, which models streaming reasoning-only deltas never do.\nconst supersedeStreamedReasoningWithAction = (\n action: ActionEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n if (getReasoningContent(action).trim().length === 0) {\n return null;\n }\n\n const reasoningDeltas = getTrailingReasoningDeltas(uiEvents, action);\n if (reasoningDeltas.length === 0) {\n return null;\n }\n\n const indexesToStrip = new Set(reasoningDeltas.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\n // Keep the delta only for streamed text the action itself lacks.\n if (event.content) {\n nextUiEvents.push({ ...event, reasoning_content: null });\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 (\n lastEvent &&\n isStreamingDeltaEvent(lastEvent) &&\n isSameStreamingSender(event, lastEvent)\n ) {\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 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 =\n supersedeStreamedThoughtWithAction(event, newUiEvents) ??\n supersedeStreamedReasoningWithAction(event, newUiEvents);\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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"}
@@ -42,7 +42,7 @@ var s = (e, t) => ({
42
42
  });
43
43
  }
44
44
  return n;
45
- }, m = (e) => p(e, (e) => (e.content?.length ?? 0) > 0), h = (e, t) => p(e, (e) => !!e.reasoning_content && c(t, e)), g = (e, t, n) => {
45
+ }, m = (e, t) => p(e, (e) => (e.content?.length ?? 0) > 0 && c(t, e)), h = (e, t) => p(e, (e) => !!e.reasoning_content && c(t, e)), g = (e, t, n) => {
46
46
  let r = new Set(t.map(({ index: e }) => e)), a = [];
47
47
  return e.forEach((e, t) => {
48
48
  if (!r.has(t) || !i(e)) {
@@ -67,17 +67,19 @@ var s = (e, t) => ({
67
67
  };
68
68
  let i = t.length - 1;
69
69
  return d(e, t.map((e, t) => t === i ? e.trimEnd() : e));
70
- }, v = (e) => t(e) ? a(e).trim().length > 0 : n(e) && e.source === "agent" ? o(u(e.llm_message.content)).reasoning.length > 0 : !1, y = (e, t) => {
70
+ }, v = (e) => e.some((e) => e.includes("<function=")), y = (e) => t(e) ? a(e).trim().length > 0 : n(e) && e.source === "agent" ? o(u(e.llm_message.content)).reasoning.length > 0 : !1, b = (e, t) => {
71
71
  let n = f(t, e);
72
72
  if (n.length === 0) return null;
73
- let r = g(t, n, v(e));
73
+ let r = g(t, n, y(e));
74
74
  return r.push(e), r;
75
- }, b = (e, t) => {
75
+ }, x = (e, t) => {
76
76
  let n = u(e.thought);
77
77
  if (!n) return null;
78
- let r = m(t);
79
- return r.length === 0 || !_(n, r.map(({ event: e }) => e.content ?? "")).matched ? null : g(t, r, a(e).trim().length > 0);
80
- }, x = (e, t) => {
78
+ let r = m(t, e);
79
+ if (r.length === 0) return null;
80
+ let i = r.map(({ event: e }) => e.content ?? "");
81
+ return !_(n, i).matched && !v(i) ? null : g(t, r, a(e).trim().length > 0);
82
+ }, S = (e, t) => {
81
83
  if (a(e).trim().length === 0) return null;
82
84
  let n = h(t, e);
83
85
  if (n.length === 0) return null;
@@ -92,7 +94,7 @@ var s = (e, t) => ({
92
94
  reasoning_content: null
93
95
  });
94
96
  }), o;
95
- }, S = (a, o) => {
97
+ }, C = (a, o) => {
96
98
  let l = [...o];
97
99
  if (i(a)) {
98
100
  if (a.content === null && a.reasoning_content === null) return l;
@@ -100,11 +102,11 @@ var s = (e, t) => ({
100
102
  return t && i(t) && c(a, t) ? (l[e] = s(a, t), l) : (l.push(a), l);
101
103
  }
102
104
  if (t(a) && a.action.kind === "FinishAction" || n(a) && a.source === "agent") {
103
- let e = y(a, l);
105
+ let e = b(a, l);
104
106
  if (e) return e;
105
107
  }
106
108
  if (t(a) && a.action.kind !== "FinishAction" && a.action.kind !== "ThinkAction") {
107
- let e = b(a, l) ?? x(a, l);
109
+ let e = x(a, l) ?? S(a, l);
108
110
  if (e) return e.push(a), e;
109
111
  }
110
112
  if (e(a)) {
@@ -119,6 +121,6 @@ var s = (e, t) => ({
119
121
  return l;
120
122
  };
121
123
  //#endregion
122
- export { S as handleEventForUI, c as isSameStreamingSender, s as mergeStreamingDeltaEvent };
124
+ export { C as handleEventForUI, c as isSameStreamingSender, s as mergeStreamingDeltaEvent };
123
125
 
124
126
  //# 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 {\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 {\n getReasoningContent,\n splitInlineThink,\n} 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\n// Deltas only merge into one bubble when they share a sender; the planning flag\n// is the only discriminator (every delta has `source: \"agent\"`). Prevents a\n// planning-agent delta concatenating onto a main-agent one, misattributed (#1656).\nexport const isSameStreamingSender = (\n a: OpenHandsEvent & { isFromPlanningAgent?: boolean },\n b: OpenHandsEvent & { isFromPlanningAgent?: boolean },\n): boolean => Boolean(a.isFromPlanningAgent) === Boolean(b.isFromPlanningAgent);\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 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) that share the final event's sender. Reasoning-only deltas are\n// excluded: reasoning renders in its own collapsed bubble and never overlaps\n// the message text being reconciled. Sender scoping matters because the main\n// and planning sockets share this event store — without it, one agent's final\n// event would strip the other agent's still-live streamed deltas (#1656).\nconst getCurrentTurnContentDeltas = (\n uiEvents: OpenHandsEvent[],\n finalEvent: 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 isSameStreamingSender(finalEvent, item.event),\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 getTrailingDeltas = (\n uiEvents: OpenHandsEvent[],\n selects: (event: StreamingDeltaEvent) => boolean,\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 (selects(event)) {\n deltas.unshift({ event, index });\n }\n }\n return deltas;\n};\n\nconst getTrailingContentDeltas = (uiEvents: OpenHandsEvent[]) =>\n getTrailingDeltas(uiEvents, (event) => (event.content?.length ?? 0) > 0);\n\n// Sender-scoped: the main and planning sockets share this event store, so a\n// main-agent action must not strip the planning agent's live reasoning (#1656).\nconst getTrailingReasoningDeltas = (\n uiEvents: OpenHandsEvent[],\n finalEvent: OpenHandsEvent,\n) =>\n getTrailingDeltas(\n uiEvents,\n (event) =>\n Boolean(event.reasoning_content) &&\n isSameStreamingSender(finalEvent, event),\n );\n\n// Strip the streamed content deltas, keeping a delta only when it carries\n// reasoning the replacement itself won't render (many models stream reasoning\n// solely through the delta). Shared by the finalize and intermediate-action\n// reconciliation paths.\nconst supersedeStreamingContent = (\n uiEvents: OpenHandsEvent[],\n contentDeltas: { event: StreamingDeltaEvent; index: number }[],\n replacementRendersReasoning: boolean,\n): OpenHandsEvent[] => {\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\n // Keep the delta only to render reasoning the replacement itself lacks.\n if (!replacementRendersReasoning && event.reasoning_content) {\n nextUiEvents.push({ ...event, content: null });\n }\n });\n return nextUiEvents;\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 tolerate\n// leading and trailing whitespace that appeared only in the stream.\nconst matchStreamedSegments = (\n targetText: string,\n segments: string[],\n): { matched: boolean; lastMatchEnd: number } => {\n const streamedText = segments.join(\"\");\n const candidates = new Set([\n streamedText,\n streamedText.trimEnd(),\n streamedText.trimStart(),\n streamedText.trim(),\n ]);\n for (const candidate of candidates) {\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\n// Whether the finalized event renders its own reasoning: an ActionEvent via\n// reasoning_content/thinking_blocks, an agent MessageEvent via an inline\n// <think> block in its content. Decides if a replaced delta's reasoning must\n// be preserved separately.\nconst eventRendersReasoning = (event: OpenHandsEvent): boolean => {\n if (isActionEvent(event)) {\n return getReasoningContent(event).trim().length > 0;\n }\n\n if (isMessageEvent(event) && event.source === \"agent\") {\n return (\n splitInlineThink(joinTextBlocks(event.llm_message.content)).reasoning\n .length > 0\n );\n }\n\n return false;\n};\n\n// The final MessageEvent/FinishAction is authoritative for the turn's text. Drop\n// the provisional streamed deltas and render the canonical final event instead,\n// so the message is rendered exactly once (never holey or duplicated) and its\n// metadata — critic_result, activated_microagents — renders too. Stream-only\n// reasoning is preserved. Returns null when there is no streamed content to\n// reconcile, leaving the caller to append the final event normally.\nconst finalizeStreamingDeltasInPlace = (\n finalEvent: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n const contentStreamingDeltas = getCurrentTurnContentDeltas(\n uiEvents,\n finalEvent,\n );\n if (contentStreamingDeltas.length === 0) {\n return null;\n }\n\n const nextUiEvents = supersedeStreamingContent(\n uiEvents,\n contentStreamingDeltas,\n eventRendersReasoning(finalEvent),\n );\n nextUiEvents.push(finalEvent);\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 * The action must stay because it owns the tool call. The streamed text is\n * cleared from the delta, and the delta is kept only to carry reasoning the\n * action itself lacks (for many models the delta is the sole reasoning\n * 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 return supersedeStreamingContent(\n uiEvents,\n contentDeltas,\n getReasoningContent(action).trim().length > 0,\n );\n};\n\n// Drop the current step's streamed reasoning when the action renders that\n// reasoning itself, so \"Thinking\" renders once. Unlike\n// `supersedeStreamedThoughtWithAction` this does not require the streamed text\n// to match the thought, which models streaming reasoning-only deltas never do.\nconst supersedeStreamedReasoningWithAction = (\n action: ActionEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n if (getReasoningContent(action).trim().length === 0) {\n return null;\n }\n\n const reasoningDeltas = getTrailingReasoningDeltas(uiEvents, action);\n if (reasoningDeltas.length === 0) {\n return null;\n }\n\n const indexesToStrip = new Set(reasoningDeltas.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\n // Keep the delta only for streamed text the action itself lacks.\n if (event.content) {\n nextUiEvents.push({ ...event, reasoning_content: null });\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 (\n lastEvent &&\n isStreamingDeltaEvent(lastEvent) &&\n isSameStreamingSender(event, lastEvent)\n ) {\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 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 =\n supersedeStreamedThoughtWithAction(event, newUiEvents) ??\n supersedeStreamedReasoningWithAction(event, newUiEvents);\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
+ {"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 {\n getReasoningContent,\n splitInlineThink,\n} 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\n// Deltas only merge into one bubble when they share a sender; the planning flag\n// is the only discriminator (every delta has `source: \"agent\"`). Prevents a\n// planning-agent delta concatenating onto a main-agent one, misattributed (#1656).\nexport const isSameStreamingSender = (\n a: OpenHandsEvent & { isFromPlanningAgent?: boolean },\n b: OpenHandsEvent & { isFromPlanningAgent?: boolean },\n): boolean => Boolean(a.isFromPlanningAgent) === Boolean(b.isFromPlanningAgent);\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 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) that share the final event's sender. Reasoning-only deltas are\n// excluded: reasoning renders in its own collapsed bubble and never overlaps\n// the message text being reconciled. Sender scoping matters because the main\n// and planning sockets share this event store — without it, one agent's final\n// event would strip the other agent's still-live streamed deltas (#1656).\nconst getCurrentTurnContentDeltas = (\n uiEvents: OpenHandsEvent[],\n finalEvent: 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 isSameStreamingSender(finalEvent, item.event),\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 getTrailingDeltas = (\n uiEvents: OpenHandsEvent[],\n selects: (event: StreamingDeltaEvent) => boolean,\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 (selects(event)) {\n deltas.unshift({ event, index });\n }\n }\n return deltas;\n};\n\n// Sender-scoped for the same reason as `getTrailingReasoningDeltas` (#1656):\n// a main-agent action must not strip the planning agent's live content.\nconst getTrailingContentDeltas = (\n uiEvents: OpenHandsEvent[],\n finalEvent: OpenHandsEvent,\n) =>\n getTrailingDeltas(\n uiEvents,\n (event) =>\n (event.content?.length ?? 0) > 0 &&\n isSameStreamingSender(finalEvent, event),\n );\n\n// Sender-scoped: the main and planning sockets share this event store, so a\n// main-agent action must not strip the planning agent's live reasoning (#1656).\nconst getTrailingReasoningDeltas = (\n uiEvents: OpenHandsEvent[],\n finalEvent: OpenHandsEvent,\n) =>\n getTrailingDeltas(\n uiEvents,\n (event) =>\n Boolean(event.reasoning_content) &&\n isSameStreamingSender(finalEvent, event),\n );\n\n// Strip the streamed content deltas, keeping a delta only when it carries\n// reasoning the replacement itself won't render (many models stream reasoning\n// solely through the delta). Shared by the finalize and intermediate-action\n// reconciliation paths.\nconst supersedeStreamingContent = (\n uiEvents: OpenHandsEvent[],\n contentDeltas: { event: StreamingDeltaEvent; index: number }[],\n replacementRendersReasoning: boolean,\n): OpenHandsEvent[] => {\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\n // Keep the delta only to render reasoning the replacement itself lacks.\n if (!replacementRendersReasoning && event.reasoning_content) {\n nextUiEvents.push({ ...event, content: null });\n }\n });\n return nextUiEvents;\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 tolerate\n// leading and trailing whitespace that appeared only in the stream.\nconst matchStreamedSegments = (\n targetText: string,\n segments: string[],\n): { matched: boolean; lastMatchEnd: number } => {\n const streamedText = segments.join(\"\");\n const candidates = new Set([\n streamedText,\n streamedText.trimEnd(),\n streamedText.trimStart(),\n streamedText.trim(),\n ]);\n for (const candidate of candidates) {\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\n// A `<function=` marker means the delta still holds the raw prompted-tool-call\n// XML the SDK strips only after the response completes, so the streamed text is\n// a superset of the action's `thought` that `matchStreamedSegments` can't match.\nconst hasUnstrippedFunctionCallMarker = (segments: string[]): boolean =>\n segments.some((segment) => segment.includes(\"<function=\"));\n\n// Whether the finalized event renders its own reasoning: an ActionEvent via\n// reasoning_content/thinking_blocks, an agent MessageEvent via an inline\n// <think> block in its content. Decides if a replaced delta's reasoning must\n// be preserved separately.\nconst eventRendersReasoning = (event: OpenHandsEvent): boolean => {\n if (isActionEvent(event)) {\n return getReasoningContent(event).trim().length > 0;\n }\n\n if (isMessageEvent(event) && event.source === \"agent\") {\n return (\n splitInlineThink(joinTextBlocks(event.llm_message.content)).reasoning\n .length > 0\n );\n }\n\n return false;\n};\n\n// The final MessageEvent/FinishAction is authoritative for the turn's text. Drop\n// the provisional streamed deltas and render the canonical final event instead,\n// so the message is rendered exactly once (never holey or duplicated) and its\n// metadata — critic_result, activated_skills — renders too. Stream-only\n// reasoning is preserved. Returns null when there is no streamed content to\n// reconcile, leaving the caller to append the final event normally.\nconst finalizeStreamingDeltasInPlace = (\n finalEvent: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n const contentStreamingDeltas = getCurrentTurnContentDeltas(\n uiEvents,\n finalEvent,\n );\n if (contentStreamingDeltas.length === 0) {\n return null;\n }\n\n const nextUiEvents = supersedeStreamingContent(\n uiEvents,\n contentStreamingDeltas,\n eventRendersReasoning(finalEvent),\n );\n nextUiEvents.push(finalEvent);\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 * The action must stay because it owns the tool call. The streamed text is\n * cleared from the delta, and the delta is kept only to carry reasoning the\n * action itself lacks (for many models the delta is the sole reasoning\n * 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, action);\n if (contentDeltas.length === 0) {\n return null;\n }\n\n const streamingSegments = contentDeltas.map(\n ({ event }) => event.content ?? \"\",\n );\n\n // Strip on a thought match, or on an unstripped `<function=...>` marker whose\n // streamed text is a superset of `thought` that the match can't reconcile.\n const matchedThought = matchStreamedSegments(\n thoughtText,\n streamingSegments,\n ).matched;\n if (!matchedThought && !hasUnstrippedFunctionCallMarker(streamingSegments)) {\n return null;\n }\n\n // Keeping the delta's reasoning would duplicate the action's own \"Thinking\".\n return supersedeStreamingContent(\n uiEvents,\n contentDeltas,\n getReasoningContent(action).trim().length > 0,\n );\n};\n\n// Drop the current step's streamed reasoning when the action renders that\n// reasoning itself, so \"Thinking\" renders once. Unlike\n// `supersedeStreamedThoughtWithAction` this does not require the streamed text\n// to match the thought, which models streaming reasoning-only deltas never do.\nconst supersedeStreamedReasoningWithAction = (\n action: ActionEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n if (getReasoningContent(action).trim().length === 0) {\n return null;\n }\n\n const reasoningDeltas = getTrailingReasoningDeltas(uiEvents, action);\n if (reasoningDeltas.length === 0) {\n return null;\n }\n\n const indexesToStrip = new Set(reasoningDeltas.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\n // Keep the delta only for streamed text the action itself lacks.\n if (event.content) {\n nextUiEvents.push({ ...event, reasoning_content: null });\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 (\n lastEvent &&\n isStreamingDeltaEvent(lastEvent) &&\n isSameStreamingSender(event, lastEvent)\n ) {\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 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 =\n supersedeStreamedThoughtWithAction(event, newUiEvents) ??\n supersedeStreamedReasoningWithAction(event, newUiEvents);\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");const e=require("./mcp-marketplace-utils.cjs"),t=require("../node_modules/@openhands/extensions/integrations/index.cjs");var n=new Set([`invalid_auth`,`not_authed`,`account_inactive`,`token_revoked`,`token_expired`]),r=e=>e.is_error?e.text||`tool call failed`:null,i={github:{toolCall:{name:`get_me`,arguments:{}},interpret:r},linear:{toolCall:{name:`list_teams`,arguments:{}},interpret:r},slack:{toolCall:{name:`slack_list_channels`,arguments:{limit:1}},interpret:e=>{if(e.is_error)return e.text||`tool call failed`;try{let t=JSON.parse(e.text);if(t?.ok===!1&&n.has(t.error))return String(t.error)}catch{}return null}}};function a(n){let r=e.findCatalogEntryForServer(n,e.getMcpMarketplaceCatalog(t.default));return r?i[r.id]:void 0}exports.getCredentialValidationForServer=a;
1
+ require("../_virtual/_rolldown/runtime.cjs");const e=require("../node_modules/@openhands/extensions/integrations/index.cjs"),t=require("./mcp-marketplace-utils.cjs");var n=new Set([`invalid_auth`,`not_authed`,`account_inactive`,`token_revoked`,`token_expired`]),r=e=>e.is_error?e.text||`tool call failed`:null,i={github:{toolCall:{name:`get_me`,arguments:{}},interpret:r},linear:{toolCall:{name:`list_teams`,arguments:{}},interpret:r},slack:{toolCall:{name:`slack_list_channels`,arguments:{limit:1}},interpret:e=>{if(e.is_error)return e.text||`tool call failed`;try{let t=JSON.parse(e.text);if(t?.ok===!1&&n.has(t.error))return String(t.error)}catch{}return null}}};function a(n){let r=t.findCatalogEntryForServer(n,t.getMcpMarketplaceCatalog(e.default));return r?i[r.id]:void 0}exports.getCredentialValidationForServer=a;
2
2
  //# sourceMappingURL=mcp-credential-validation.cjs.map
@@ -1,5 +1,5 @@
1
- import { findCatalogEntryForServer as e, getMcpMarketplaceCatalog as t } from "./mcp-marketplace-utils.js";
2
- import n from "../node_modules/@openhands/extensions/integrations/index.js";
1
+ import e from "../node_modules/@openhands/extensions/integrations/index.js";
2
+ import { findCatalogEntryForServer as t, getMcpMarketplaceCatalog as n } from "./mcp-marketplace-utils.js";
3
3
  //#region src/utils/mcp-credential-validation.ts
4
4
  var r = new Set([
5
5
  "invalid_auth",
@@ -38,7 +38,7 @@ var r = new Set([
38
38
  }
39
39
  };
40
40
  function o(r) {
41
- let i = e(r, t(n));
41
+ let i = t(r, n(e));
42
42
  return i ? a[i.id] : void 0;
43
43
  }
44
44
  //#endregion
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");function e(e){return e.connectionOptions.filter(e=>e.provider===`mcp`&&!!e.transport)}function t(t){return e(t)[0]}function n(e){if(e.auth.strategy!==`oauth2`)return!0;let t=e.auth.oauth;return t?!t.authorizationUrl&&!t.tokenUrl&&!t.registrationUrl&&!t.additionalAuthorizationParams&&!t.additionalTokenParams:!1}function r(t){return e(t).find(n)}function i(e){return t(e)?.transport}function a(e){switch(e){case`none`:return`none`;case`body`:return`client_secret_post`;case`basic`:return`client_secret_basic`;default:return}}function o(e){if(e.auth.strategy!==`oauth2`)return;let t={type:`oauth`},n=a(e.auth.oauth?.clientAuthentication);return n&&(t.client_auth_method=n),e.auth.oauth?.scopes?.length&&(t.scopes=e.auth.oauth.scopes),Object.keys(t).length>1?t:void 0}function s(e){return e.filter(c)}function c(e){return!!t(e)}var l=e=>{try{return new URL(e)}catch{return null}};function u(e,t){let n=typeof e==`string`?e:``,r=typeof t==`string`?t:``;if(!n||!r)return!1;let i=l(n),a=l(r);return!i||!a?n.replace(/\/+$/,``)===r.replace(/\/+$/,``):i.protocol===a.protocol&&i.host===a.host&&i.pathname.replace(/\/+$/,``)===a.pathname.replace(/\/+$/,``)}function d(e,t){if(e.kind===`shttp`){let n=e.url;return t.type===`shttp`&&!!t.url&&u(t.url,n)}if(e.kind===`sse`){let n=e.url;return t.type===`sse`&&!!t.url&&u(t.url,n)}return t.type===`stdio`&&t.name===e.serverName}function f(e){return e.trim().toLowerCase()}function p(e){return e.map((e,t)=>({entry:e,index:t})).sort((e,t)=>(t.entry.popularityRank??0)-(e.entry.popularityRank??0)||e.index-t.index).map(({entry:e})=>e)}function m(e,t){let n=f(t);return n?[e.name,e.description,e.id,...e.keywords??[]].join(` `).toLowerCase().includes(n):!0}function h(e,t,n){let r=f(n);return r?[e.type,`name`in e?e.name:void 0,`command`in e?e.command:void 0,`args`in e?e.args?.join(` `):void 0,`url`in e?e.url:void 0,t?.name,t?.description,t?.id,...t?.keywords??[]].filter(Boolean).join(` `).toLowerCase().includes(r):!0}function g(t,n){return n.find(n=>e(n).some(e=>d(e.transport,t)))}exports.findCatalogEntryForServer=g,exports.getDefaultMcpTransport=i,exports.getInstallableMcpConnectionOption=r,exports.getMarketplaceEntriesByPopularity=p,exports.getMcpMarketplaceCatalog=s,exports.getMcpOAuthAuthenticationConfig=o,exports.installedServerMatchesQuery=h,exports.marketplaceEntryMatchesQuery=m;
1
+ require("../_virtual/_rolldown/runtime.cjs");function e(e){return e.connectionOptions.filter(e=>e.provider===`mcp`&&!!e.transport)}function t(t){return e(t)[0]}function n(e){if(e.auth.strategy!==`oauth2`)return!0;let t=e.auth.oauth;return t?!t.authorizationUrl&&!t.tokenUrl&&!t.registrationUrl&&!t.additionalAuthorizationParams&&!t.additionalTokenParams:!1}function r(t){return e(t).find(n)}function i(e){return t(e)?.transport}function a(e){switch(e){case`none`:return`none`;case`body`:return`client_secret_post`;case`basic`:return`client_secret_basic`;default:return}}function o(e){if(e.auth.strategy!==`oauth2`)return;let t={type:`oauth`},n=a(e.auth.oauth?.clientAuthentication);return n&&(t.client_auth_method=n),e.auth.oauth?.scopes?.length&&(t.scopes=e.auth.oauth.scopes),Object.keys(t).length>1?t:void 0}function s(e){return e.filter(c)}function c(e){return!!t(e)}var l=e=>{try{return new URL(e)}catch{return null}};function u(e,t){let n=typeof e==`string`?e:``,r=typeof t==`string`?t:``;if(!n||!r)return!1;let i=l(n),a=l(r);return!i||!a?n.replace(/\/+$/,``)===r.replace(/\/+$/,``):i.protocol===a.protocol&&i.host===a.host&&i.pathname.replace(/\/+$/,``)===a.pathname.replace(/\/+$/,``)}function d(e,t){return t.find(t=>p(e,t))??null}function f(t,n){for(let r of e(t)){let e=d(r.transport,n);if(e)return e}return null}function p(e,t){if(e.kind===`shttp`){let n=e.url;return t.type===`shttp`&&!!t.url&&u(t.url,n)}if(e.kind===`sse`){let n=e.url;return t.type===`sse`&&!!t.url&&u(t.url,n)}return t.type===`stdio`&&t.name===e.serverName}function m(e){return e.trim().toLowerCase()}function h(e){return e.map((e,t)=>({entry:e,index:t})).sort((e,t)=>(t.entry.popularityRank??0)-(e.entry.popularityRank??0)||e.index-t.index).map(({entry:e})=>e)}function g(e,t){return t.find(t=>t.id===e)}function _(e,t){let n=m(t);return n?[e.name,e.description,e.id,...e.keywords??[]].join(` `).toLowerCase().includes(n):!0}function v(e,t,n){let r=m(n);return r?[e.type,`name`in e?e.name:void 0,`command`in e?e.command:void 0,`args`in e?e.args?.join(` `):void 0,`url`in e?e.url:void 0,t?.name,t?.description,t?.id,...t?.keywords??[]].filter(Boolean).join(` `).toLowerCase().includes(r):!0}function y(t,n){return n.find(n=>e(n).some(e=>p(e.transport,t)))}exports.findCatalogEntryForServer=y,exports.findInstalledEntryMatch=f,exports.getDefaultMcpTransport=i,exports.getInstallableMcpConnectionOption=r,exports.getMarketplaceEntriesByPopularity=h,exports.getMarketplaceEntryById=g,exports.getMcpMarketplaceCatalog=s,exports.getMcpOAuthAuthenticationConfig=o,exports.installedServerMatchesQuery=v,exports.isMcpInstallableEntry=c,exports.marketplaceEntryMatchesQuery=_;
2
2
  //# sourceMappingURL=mcp-marketplace-utils.cjs.map