@openhands/agent-canvas 1.9.0 → 1.11.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 (1386) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-C921BlYB.js → acp-providers-BkL3HWa3.js} +1 -1
  4. package/build/assets/active-backend-context-BBvP-bI2.js +2 -0
  5. package/build/assets/agent-context-settings-Bno1nwPL.js +1 -0
  6. package/build/assets/{agent-profiles-settings-BymJf3EP.js → agent-profiles-settings-DqoS7RL3.js} +1 -1
  7. package/build/assets/agent-server-conversation-service.api-0RztSdJJ.js +86 -0
  8. package/build/assets/agent-settings-BJHryp65.js +1 -0
  9. package/build/assets/{agent-settings-WzqXk6B4.js → agent-settings-h8hQz-IU.js} +2 -2
  10. package/build/assets/alert-banner-lrK-2_0Y.js +1 -0
  11. package/build/assets/{api-key-entry-screen-DI0I04O3.js → api-key-entry-screen-Qsb83VX1.js} +1 -1
  12. package/build/assets/{app-settings-DGistSFV.js → app-settings-r1RUbgGi.js} +1 -1
  13. package/build/assets/automation-detail-7LkL91j9.js +3 -0
  14. package/build/assets/automation-export-U2QNyNy6.js +2 -0
  15. package/build/assets/automation-setup-route-Bel9_Lue.js +1 -0
  16. package/build/assets/automation-templates-CRLDssaI.js +1 -0
  17. package/build/assets/automations-list-B2iV3ZKW.js +1 -0
  18. package/build/assets/{back-nav-button-D4ngzpSh.js → back-nav-button-B3pYwmUJ.js} +1 -1
  19. package/build/assets/backend-form-modal-OroTqnAv.js +1 -0
  20. package/build/assets/{backend-synced-settings-badge-BnzI8Ysj.js → backend-synced-settings-badge-DB4717Iu.js} +1 -1
  21. package/build/assets/{badge-1Mf1iPcX.js → badge-yR53enbU.js} +1 -1
  22. package/build/assets/{base-modal-BBuy0WQQ.js → base-modal-3NmIOKDm.js} +1 -1
  23. package/build/assets/bot-DuN83i3p.js +1 -0
  24. package/build/assets/{brand-button-DGN6Y9o6.js → brand-button-CJcwjnfb.js} +1 -1
  25. package/build/assets/{browser-D_ekTlTS.js → browser--eoQOo4M.js} +2 -2
  26. package/build/assets/{browser-tab-D4a4Ou_w.js → browser-tab-A94o33Vn.js} +1 -1
  27. package/build/assets/{chat-send-button-CgbcjD97.js → chat-send-button-B8n6-DQA.js} +1 -1
  28. package/build/assets/check-DLOKoFU9.js +1 -0
  29. package/build/assets/{checkmark-CxdXtM3b.js → checkmark-XZyokq_Y.js} +1 -1
  30. package/build/assets/chevron-down-CnIbtM6i.js +1 -0
  31. package/build/assets/circle-check-CxCYJrpZ.js +1 -0
  32. package/build/assets/{circle-plus-check-toggle-yTAS-nX3.js → circle-plus-check-toggle-BVzv5EkZ.js} +1 -1
  33. package/build/assets/{close-CDAVqnTn.js → close-ScPlnwyq.js} +1 -1
  34. package/build/assets/{cloud-funnel-analytics-CEOl5Gxr.js → cloud-funnel-analytics-CBQdPZl_.js} +1 -1
  35. package/build/assets/{combobox-caret-Bd2yySnF.js → combobox-caret-BlmRwiM8.js} +1 -1
  36. package/build/assets/command-menu-PsRXVBz2.js +1 -0
  37. package/build/assets/condenser-settings-w7L3EFvm.js +1 -0
  38. package/build/assets/{confirmation-modal-NCUPr2-O.js → confirmation-modal-DAH0XtOp.js} +1 -1
  39. package/build/assets/context-menu-list-item-BQhmFVEK.js +1 -0
  40. package/build/assets/{conversation-CUJ0Vo8g.js → conversation-BUzBZAc-.js} +7 -7
  41. package/build/assets/conversation-panel-pzAKsSDb.js +1 -0
  42. package/build/assets/conversation-pzAKsSDb.js +1 -0
  43. package/build/assets/{conversation-state-store-F62HvuI1.js → conversation-state-store-Bs8gA263.js} +1 -1
  44. package/build/assets/{conversation-store-C6hSXHw0.js → conversation-store-B8Eahyeg.js} +1 -1
  45. package/build/assets/{conversation-tab-empty-state-BCZ7rUMH.js → conversation-tab-empty-state-C9sfDOlt.js} +1 -1
  46. package/build/assets/{copy-z7idLzWO.js → copy-Drmhc2jD.js} +1 -1
  47. package/build/assets/{copy-to-clipboard-button-D_Lp6-Fl.js → copy-to-clipboard-button-DatoElj8.js} +1 -1
  48. package/build/assets/{device-verify-DLmolX8Q.js → device-verify-BIjXeW9N.js} +1 -1
  49. package/build/assets/{dist-hOnv1nn2.js → dist-Bl64nBZL.js} +1 -1
  50. package/build/assets/{dropdown-classes-BB8rzqXL.js → dropdown-classes-zFW7qPSK.js} +1 -1
  51. package/build/assets/entry.client-DzbDyLkV.js +2 -0
  52. package/build/assets/enum-filter-dropdown-CctILg5t.js +1 -0
  53. package/build/assets/{environment-switch-overlay-BepBBX66.js → environment-switch-overlay-Cvmo6clk.js} +1 -1
  54. package/build/assets/{extensions-hub-R3KNv-5V.js → extensions-hub-DOmHPGTA.js} +1 -1
  55. package/build/assets/{extensions-navigation-CfWFmI1I.js → extensions-navigation-6zU5M1pa.js} +1 -1
  56. package/build/assets/{external-link-BdBSg8rk.js → external-link-zWbg5KXS.js} +1 -1
  57. package/build/assets/file-text-RecuaId_.js +1 -0
  58. package/build/assets/files-tab-BzofBmF4.js +1 -0
  59. package/build/assets/{folder-C86qXV7M.js → folder-C1ou4_DT.js} +1 -1
  60. package/build/assets/{form-control-classes-DAfsCJTe.js → form-control-classes-DLN3Qgub.js} +1 -1
  61. package/build/assets/format-relative-time-DGPQlPx0.js +1 -0
  62. package/build/assets/format-time-delta-BIR5Os7T.js +1 -0
  63. package/build/assets/{git-provider-icon-BZqqUPlm.js → git-provider-icon-BLMlwy02.js} +1 -1
  64. package/build/assets/{git-repo-dropdown-DEpOwUez.js → git-repo-dropdown-B7RvO70z.js} +1 -1
  65. package/build/assets/git-repo-dropdown-B_PTq4ol.js +1 -0
  66. package/build/assets/{highlighted-source-view-CX9oIoVT.js → highlighted-source-view-CgJfD5VT.js} +1 -1
  67. package/build/assets/home-DEZaZqYv.js +1 -0
  68. package/build/assets/home-r89Vj2td.js +1 -0
  69. package/build/assets/{home-store-Ch1ErdBc.js → home-store-D7CjMN_-.js} +1 -1
  70. package/build/assets/{iconBase-B2rQun3J.js → iconBase-C2sR-uAp.js} +1 -1
  71. package/build/assets/index-home-r89Vj2td.js +1 -0
  72. package/build/assets/install-server-modal-BTwK5lbi.js +1 -0
  73. package/build/assets/kebab-menu-item-content-C4CkeiJO.js +1 -0
  74. package/build/assets/{launch-B1POpHuP.js → launch-DVlx4v9o.js} +1 -1
  75. package/build/assets/{link-external-BDBCz-_z.js → link-external-BNZzCM1I.js} +1 -1
  76. package/build/assets/{list-todo-DtiL3lTp.js → list-todo-CheUtB7F.js} +1 -1
  77. package/build/assets/llm-not-configured-banner-CwKu8C6g.js +27 -0
  78. package/build/assets/llm-settings-BJotLQND.js +1 -0
  79. package/build/assets/llm-settings-CDM-5H2A.js +1 -0
  80. package/build/assets/{llm-subscription-service-DBJbfd8Z.js → llm-subscription-service-7eVfDIE1.js} +1 -1
  81. package/build/assets/loader-circle-C5AnEN8r.js +1 -0
  82. package/build/assets/{loading-spinner-DfZ_bhV7.js → loading-spinner-CN3riY7k.js} +1 -1
  83. package/build/assets/{manage-backends-modal-CwyWsiag.js → manage-backends-modal-HNWKLYhq.js} +1 -1
  84. package/build/assets/manifest-2a36a8f8.js +1 -0
  85. package/build/assets/manifest-subpage-layout-D-m-h8_t.js +1 -0
  86. package/build/assets/map-provider-7Bp2aih5.js +1 -0
  87. package/build/assets/markdown-renderer-BiiiIznl.js +8 -0
  88. package/build/assets/mcp-gLgPP7AS.js +9 -0
  89. package/build/assets/mcp-marketplace-utils-Dr_HG_ol.js +1 -0
  90. package/build/assets/messages-D1cbVhRK.js +40 -0
  91. package/build/assets/{modal-backdrop-X-vKo61e.js → modal-backdrop-BSzNhM4r.js} +1 -1
  92. package/build/assets/{modal-body-CMsDpalT.js → modal-body-duRaxj_K.js} +1 -1
  93. package/build/assets/{modal-classes-B6PDrxXo.js → modal-classes-CLEXO6dj.js} +1 -1
  94. package/build/assets/{modal-close-button-DyxBZaAb.js → modal-close-button-D0aT02hs.js} +1 -1
  95. package/build/assets/mouse-pointer-click-Px-dXWcS.js +1 -0
  96. package/build/assets/{navigation-context-BOGzIng3.js → navigation-context-CQZwH_tC.js} +1 -1
  97. package/build/assets/navigation-link-Bxo3-4vo.js +1 -0
  98. package/build/assets/npm-DRzJF5Zn.js +1 -0
  99. package/build/assets/onboarding-DSr8hOpk.js +1 -0
  100. package/build/assets/onboarding-modal-C6Euf7N4.js +1 -0
  101. package/build/assets/{openhands-logo-CmYvJXBa.js → openhands-logo-BS-Epajy.js} +1 -1
  102. package/build/assets/{organization-service.api-UDy63-oC.js → organization-service.api-C4GYWwj9.js} +1 -1
  103. package/build/assets/{pencil-BjgtZmWp.js → pencil-Bl3GWhgq.js} +1 -1
  104. package/build/assets/{planner-tab-BWk8885v.js → planner-tab-CZcguxTK.js} +1 -1
  105. package/build/assets/{plugins-management-service-CjkgF2dd.js → plugins-management-service-BmDzOQsd.js} +1 -1
  106. package/build/assets/plus-CtzlyAoF.js +1 -0
  107. package/build/assets/{profiles-service.api-CukSFLzz.js → profiles-service.api-CoLTwjc1.js} +1 -1
  108. package/build/assets/{providers-CqUWC85T.js → providers-tBzTpz1w.js} +1 -1
  109. package/build/assets/{proxy-BBUG3sd2.js → proxy-DCI9S-LA.js} +1 -1
  110. package/build/assets/{puzzle-BoNc6zZ8.js → puzzle-B3v361yY.js} +1 -1
  111. package/build/assets/recommended-automations-launcher-BbJAJVED.js +1 -0
  112. package/build/assets/{refresh-cw-BrM5ZAZD.js → refresh-cw-B9GhC3QC.js} +1 -1
  113. package/build/assets/root-BfM_kC_d.css +1 -0
  114. package/build/assets/root-gstBEjty.js +2 -0
  115. package/build/assets/root-layout-BIAFLP9p.js +2 -0
  116. package/build/assets/{schema-field-nImDoY6-.js → schema-field-zhsVDllR.js} +1 -1
  117. package/build/assets/{sdk-section-page-BxMrtUNV.js → sdk-section-page-CS4GWn0y.js} +1 -1
  118. package/build/assets/{search-7DRiGm4Z.js → search-BatSpWed.js} +1 -1
  119. package/build/assets/search-CYaiKHRp.js +1 -0
  120. package/build/assets/{secrets-service-Dhjh3HhH.js → secrets-service-DjgGduXk.js} +1 -1
  121. package/build/assets/{secrets-settings-CPdxceT_.js → secrets-settings-f-qahfbi.js} +1 -1
  122. package/build/assets/{segmented-toggle-Do6oyepX.js → segmented-toggle-SmvsR3jW.js} +1 -1
  123. package/build/assets/settings-CWFxymAf.js +1 -0
  124. package/build/assets/settings-DQd0xLEw.js +1 -0
  125. package/build/assets/{settings-dropdown-input-DYCULKpp.js → settings-dropdown-input-TWIeiG02.js} +1 -1
  126. package/build/assets/{settings-gear-TYXnELES.js → settings-gear-DaJj6Pde.js} +1 -1
  127. package/build/assets/{settings-index-C9o2NBO0.js → settings-index-BVwy9JEp.js} +1 -1
  128. package/build/assets/{settings-input-B-q2gkVy.js → settings-input-D61Vzp9e.js} +1 -1
  129. package/build/assets/settings-like-page-layout-classes-Cw4Yzv_P.js +1 -0
  130. package/build/assets/{settings-list-classes-WpQi0q1L.js → settings-list-classes-sE0ASr1s.js} +1 -1
  131. package/build/assets/{settings-modal-CEK0AIx6.js → settings-modal-D6D5ngET.js} +1 -1
  132. package/build/assets/{settings-section-header-context-CnIIQAUn.js → settings-section-header-context-BOJ_Fbak.js} +1 -1
  133. package/build/assets/settings-service.api-DZp7E7A9.js +1 -0
  134. package/build/assets/{settings-switch-LqKdGxHL.js → settings-switch-Drt-rF5s.js} +1 -1
  135. package/build/assets/{settings-utils-BL_Z9uIe.js → settings-utils-gw2ppAvw.js} +1 -1
  136. package/build/assets/{shared-conversation-Bu-dQlgp.js → shared-conversation-DIxZjElr.js} +1 -1
  137. package/build/assets/shield-check-D2cpEpv3.js +1 -0
  138. package/build/assets/{sidebar-layout-oHBGQmLh.js → sidebar-layout-Dxg6zc2K.js} +1 -1
  139. package/build/assets/sidebar-mobile-menu-toggle-OoZBHxaT.js +1 -0
  140. package/build/assets/{sidebar-nav-link-CrujNA09.js → sidebar-nav-link-CxLoG-dG.js} +1 -1
  141. package/build/assets/sidebar-store-BJeYY-E9.js +1 -0
  142. package/build/assets/{skill-card-pill-row-CZBI7OqH.js → skill-card-pill-row-B_BYBONu.js} +1 -1
  143. package/build/assets/{skill-icon-badge-BOov_phZ.js → skill-icon-badge-CN41Hy9l.js} +1 -1
  144. package/build/assets/skill-scope-B1Per5XI.js +1 -0
  145. package/build/assets/{skills-CYFLsN5U.js → skills-B0IliMxw.js} +1 -1
  146. package/build/assets/{skills-plugins-D0PiHWAD.js → skills-plugins-B3AO6sMz.js} +1 -1
  147. package/build/assets/skills-settings-DmmgJ6CT.js +2 -0
  148. package/build/assets/sparkles-g7y3r-Ut.js +1 -0
  149. package/build/assets/{styled-tooltip-C7grwnOX.js → styled-tooltip-C5C07RQC.js} +1 -1
  150. package/build/assets/{switch-skeleton-BQoOhQTB.js → switch-skeleton-DwOoCqaL.js} +1 -1
  151. package/build/assets/{syntax-highlighter-B92AFGMy.js → syntax-highlighter-BGDg_7w9.js} +1 -1
  152. package/build/assets/{task-list-tab-R3ac6m7O.js → task-list-tab-C19Q_JNf.js} +1 -1
  153. package/build/assets/{terminal-cMS3RgVE.js → terminal-BUpID2wS.js} +1 -1
  154. package/build/assets/{terminal-yqkNdEAx.js → terminal-CbuMRYal.js} +1 -1
  155. package/build/assets/{toggle-switch-BeSrbgCg.js → toggle-switch-CIioisto.js} +1 -1
  156. package/build/assets/{trash-2-wW5TWcdN.js → trash-2-CzDVN-Iw.js} +1 -1
  157. package/build/assets/{typography-iYhzLlHO.js → typography-D9tiHct7.js} +1 -1
  158. package/build/assets/{u-check-circle-DBEvndTS.js → u-check-circle-BKn1spCL.js} +1 -1
  159. package/build/assets/{u-edit-809W9D9T.js → u-edit-DAkcF52u.js} +1 -1
  160. package/build/assets/{u-robot-CJtSzy5X.js → u-robot-BvAOA2ZD.js} +1 -1
  161. package/build/assets/{use-acp-credential-form-DUxbxmbq.js → use-acp-credential-form-DJmmJKMo.js} +1 -1
  162. package/build/assets/{use-activate-agent-profile-CDHA52tC.js → use-activate-agent-profile-CeFfYwu_.js} +1 -1
  163. package/build/assets/{use-agent-profiles-TsOdIyw5.js → use-agent-profiles-BHLkLbRR.js} +1 -1
  164. package/build/assets/{use-breakpoint-DA7JqsRN.js → use-breakpoint-DWtihr9g.js} +1 -1
  165. package/build/assets/{use-can-manage-org-profiles-Bt1M71u5.js → use-can-manage-org-profiles-Bu4y8gSx.js} +1 -1
  166. package/build/assets/{use-click-outside-element-DKqpqEEm.js → use-click-outside-element-W6Os4Nlb.js} +1 -1
  167. package/build/assets/{use-cloud-current-user-id-DWt7HCgf.js → use-cloud-current-user-id-QD9x3ySO.js} +1 -1
  168. package/build/assets/{use-config-CxlEdf_v.js → use-config-CPwqciXN.js} +1 -1
  169. package/build/assets/{use-create-conversation-nOJ6Um5h.js → use-create-conversation-DWaSVUOB.js} +1 -1
  170. package/build/assets/{use-create-secret-Dj5ang9x.js → use-create-secret-BsOfOLvg.js} +1 -1
  171. package/build/assets/use-is-authed-Bka89Xmm.js +1 -0
  172. package/build/assets/{use-is-creating-conversation-CAggrM75.js → use-is-creating-conversation-CVefC9Ns.js} +1 -1
  173. package/build/assets/{use-launch-skill-in-chat-DKzCTMt0.js → use-launch-skill-in-chat-BcKNjxxd.js} +1 -1
  174. package/build/assets/use-llm-profiles-CU8ah1pz.js +1 -0
  175. package/build/assets/use-manifest-capabilities-DBYPjyV6.js +1 -0
  176. package/build/assets/{use-onboarding-completion-gxQlcEy2.js → use-onboarding-completion-CtNJxkXG.js} +1 -1
  177. package/build/assets/{use-plugins-marketplace-CVO7sXYR.js → use-plugins-marketplace-ZEA-gyM9.js} +1 -1
  178. package/build/assets/use-save-agent-profile-DgI_Uz9a.js +1 -0
  179. package/build/assets/{use-save-settings-L3aMaDeS.js → use-save-settings-pSjRhD_m.js} +1 -1
  180. package/build/assets/{use-settings-8nt3DGxW.js → use-settings-BHWsOcIG.js} +1 -1
  181. package/build/assets/use-settings-nav-items-CQgkxUbV.js +16 -0
  182. package/build/assets/use-tracking-CGCsBWhg.js +3 -0
  183. package/build/assets/{use-user-conversation-BIIpGUgM.js → use-user-conversation-DRfEU8x0.js} +1 -1
  184. package/build/assets/{useInfiniteQuery-BLRVmVPU.js → useInfiniteQuery-DbCv0Jzd.js} +1 -1
  185. package/build/assets/{useMutation-CaSHLnX0.js → useMutation-ChpkYxI5.js} +1 -1
  186. package/build/assets/{useQueries--d_WWAzc.js → useQueries-Cjv3E8_1.js} +1 -1
  187. package/build/assets/useQuery-BCnzy4LX.js +1 -0
  188. package/build/assets/utils-DPQfkd-7.js +1 -0
  189. package/build/assets/{vendor-markdown-BML7QbqS.js → vendor-markdown-j0kYzV48.js} +1 -1
  190. package/build/assets/{vendor-styling-Bcgpimp9.js → vendor-styling-Ck5D_A2Q.js} +6 -6
  191. package/build/assets/{vendor~browser-jaN4ilxM.js → vendor~browser-C6uXH-dw.js} +2 -2
  192. package/build/assets/vendor~browser-DJ1pl_wn.js +47 -0
  193. package/build/assets/{vendor~browser-tab-_-VCXq8n.js → vendor~browser-tab-C5uuAxZX.js} +1 -1
  194. package/build/assets/vendor~entry.client-CgNUwtQL.js +1 -0
  195. package/build/assets/{vendor~entry.client-BcYIVQvB.js → vendor~entry.client-zSIea5EO.js} +2 -2
  196. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~cy4jtuc2-rfV8mQ9m.js +1 -0
  197. package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0bpqexo-CbTboogo.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-oGvLV0dO.js} +4 -4
  198. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~lq5hicxx-cHFhpUBq.js +26 -0
  199. package/build/assets/{vendor~files-tab-C7RmQJwN.js → vendor~files-tab-C87pjSpi.js} +1 -1
  200. package/build/assets/{vendor~index-home~home~conversation-panel~conversation-Bqp1ZqJM.js → vendor~index-home~home~conversation-panel~conversation-DiXf0dkj.js} +1 -1
  201. package/build/assets/{vendor~conversation-panel~conversation~alert-banner-BNzz5FuZ.js → vendor~index-home~home~conversation-panel~conversation~alert-banner-B3qC_oj8.js} +1 -1
  202. package/build/assets/{vendor~launch-ChXCOGw8.js → vendor~launch-CHwEQG6e.js} +1 -1
  203. package/build/assets/vendor~module-DyG7x7JT.js +2 -0
  204. package/build/assets/{vendor~root-layout~conversation-panel~conversation-BCn8lzeG.js → vendor~root-layout~conversation-panel~conversation-DEzjR4K7.js} +1 -1
  205. package/build/assets/{vendor~root-layout~conversation-panel~conversation~shared-conversation-DRblkyXD.js → vendor~root-layout~conversation-panel~conversation~shared-conversation-DOuig0C0.js} +1 -1
  206. package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-U-xdsAEx.js +1 -0
  207. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~automation-setup-route-B_L-gcOG.js → vendor~root-layout~index-home~home~conversation-panel~conversation~automation-setup-route-CjECvSl5.js} +1 -1
  208. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-sjx0x5ac.js → vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-CQR5Sa0H.js} +1 -1
  209. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gy8zbn65-CGt6bWRT.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-Cwhh3zLe.js} +1 -1
  210. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~dfc8ddxy-tTyxnjXT.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-CuQhkiS7.js} +1 -1
  211. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~9pstowjp-BOVIFA_g.js +73 -0
  212. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~dufan6ng-Dtdw8H0q.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~ht43enc2-C0JXQb_q.js} +162 -54
  213. package/build/assets/{verification-settings-DBsnSXC3.js → verification-settings-BItwt998.js} +1 -1
  214. package/build/assets/wrench-B1_H-tL1.js +1 -0
  215. package/build/assets/x-RYDBg-e2.js +1 -0
  216. package/build/assets/{x-mark-jcTkPiOB.js → x-mark-BopmFoBq.js} +1 -1
  217. package/build/assets/zap-tbKDzCe3.js +1 -0
  218. package/build/index.html +4 -4
  219. package/build/locales/ar/openhands.json +108 -5
  220. package/build/locales/ca/openhands.json +108 -5
  221. package/build/locales/de/openhands.json +108 -5
  222. package/build/locales/en/openhands.json +108 -5
  223. package/build/locales/es/openhands.json +108 -5
  224. package/build/locales/fr/openhands.json +108 -5
  225. package/build/locales/it/openhands.json +108 -5
  226. package/build/locales/ja/openhands.json +108 -5
  227. package/build/locales/ko-KR/openhands.json +108 -5
  228. package/build/locales/no/openhands.json +108 -5
  229. package/build/locales/pt/openhands.json +108 -5
  230. package/build/locales/tr/openhands.json +108 -5
  231. package/build/locales/uk/openhands.json +108 -5
  232. package/build/locales/zh-CN/openhands.json +108 -5
  233. package/build/locales/zh-TW/openhands.json +108 -5
  234. package/build/mockServiceWorker.js +21 -9
  235. package/config/defaults.json +3 -3
  236. package/dist/api/agent-server-adapter.cjs +3 -3
  237. package/dist/api/agent-server-adapter.cjs.map +1 -1
  238. package/dist/api/agent-server-adapter.d.ts +32 -5
  239. package/dist/api/agent-server-adapter.js +120 -91
  240. package/dist/api/agent-server-adapter.js.map +1 -1
  241. package/dist/api/automation-service/automation-service.api.cjs +1 -1
  242. package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
  243. package/dist/api/automation-service/automation-service.api.d.ts +5 -0
  244. package/dist/api/automation-service/automation-service.api.js +11 -0
  245. package/dist/api/automation-service/automation-service.api.js.map +1 -1
  246. package/dist/api/backend-registry/active-store.cjs +1 -1
  247. package/dist/api/backend-registry/active-store.cjs.map +1 -1
  248. package/dist/api/backend-registry/active-store.js +36 -31
  249. package/dist/api/backend-registry/active-store.js.map +1 -1
  250. package/dist/api/backend-registry/url-selection.cjs +2 -0
  251. package/dist/api/backend-registry/url-selection.cjs.map +1 -0
  252. package/dist/api/backend-registry/url-selection.d.ts +31 -0
  253. package/dist/api/backend-registry/url-selection.js +29 -0
  254. package/dist/api/backend-registry/url-selection.js.map +1 -0
  255. package/dist/api/cloud/conversation-service.api.cjs +1 -1
  256. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  257. package/dist/api/cloud/conversation-service.api.d.ts +19 -2
  258. package/dist/api/cloud/conversation-service.api.js +51 -47
  259. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  260. package/dist/api/conversation-file-upload.api.cjs +1 -1
  261. package/dist/api/conversation-file-upload.api.js +10 -10
  262. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  263. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  264. package/dist/api/conversation-service/agent-server-conversation-service.api.js +55 -61
  265. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  266. package/dist/api/event-service/event-service.api.cjs +1 -1
  267. package/dist/api/event-service/event-service.api.js +12 -12
  268. package/dist/api/launch-child-conversation-client-tool.cjs +47 -0
  269. package/dist/api/launch-child-conversation-client-tool.cjs.map +1 -0
  270. package/dist/api/launch-child-conversation-client-tool.d.ts +3 -0
  271. package/dist/api/launch-child-conversation-client-tool.js +93 -0
  272. package/dist/api/launch-child-conversation-client-tool.js.map +1 -0
  273. package/dist/api/mcp-service/mcp-redacted-credentials.cjs +1 -1
  274. package/dist/api/mcp-service/mcp-redacted-credentials.cjs.map +1 -1
  275. package/dist/api/mcp-service/mcp-redacted-credentials.d.ts +3 -2
  276. package/dist/api/mcp-service/mcp-redacted-credentials.js +32 -27
  277. package/dist/api/mcp-service/mcp-redacted-credentials.js.map +1 -1
  278. package/dist/api/mcp-service/mcp-service.api.cjs +1 -1
  279. package/dist/api/mcp-service/mcp-service.api.cjs.map +1 -1
  280. package/dist/api/mcp-service/mcp-service.api.js +19 -19
  281. package/dist/api/mcp-service/mcp-service.api.js.map +1 -1
  282. package/dist/api/open-hands.types.d.ts +1 -1
  283. package/dist/api/settings-service/settings-service.api.cjs +1 -1
  284. package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
  285. package/dist/api/settings-service/settings-service.api.d.ts +10 -0
  286. package/dist/api/settings-service/settings-service.api.js +90 -100
  287. package/dist/api/settings-service/settings-service.api.js.map +1 -1
  288. package/dist/api/skills-service.cjs +1 -1
  289. package/dist/api/skills-service.cjs.map +1 -1
  290. package/dist/api/skills-service.js +1 -0
  291. package/dist/api/skills-service.js.map +1 -1
  292. package/dist/api/workspace-upload-path.cjs +1 -1
  293. package/dist/api/workspace-upload-path.js +8 -8
  294. package/dist/assets/chevron-left.d.ts +1 -1
  295. package/dist/assets/chevron-right.d.ts +1 -1
  296. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs +1 -1
  297. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs.map +1 -1
  298. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js +24 -18
  299. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js.map +1 -1
  300. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  301. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  302. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +5 -0
  303. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  304. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs +2 -2
  305. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs.map +1 -1
  306. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js +11 -7
  307. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js.map +1 -1
  308. package/dist/components/conversation-events/chat/event-message-components/collapsible-thinking.d.ts +2 -1
  309. package/dist/components/conversation-events/chat/event-message-components/critic-result-display.d.ts +2 -1
  310. package/dist/components/conversation-events/chat/event-message-components/error-event-message.d.ts +2 -1
  311. package/dist/components/conversation-events/chat/event-message-components/event-group.d.ts +1 -1
  312. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.d.ts +1 -1
  313. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.d.ts +1 -1
  314. package/dist/components/conversation-events/chat/event-message-components/observation-pair-event-message.d.ts +2 -1
  315. package/dist/components/conversation-events/chat/event-message-components/skill-item-expanded.d.ts +1 -1
  316. package/dist/components/conversation-events/chat/event-message-components/skill-ready-content-list.d.ts +2 -1
  317. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.d.ts +1 -1
  318. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.d.ts +2 -1
  319. package/dist/components/conversation-events/chat/event-message.d.ts +2 -1
  320. package/dist/components/conversation-events/chat/task-tracking/task-item.d.ts +1 -1
  321. package/dist/components/conversation-events/chat/task-tracking/task-list-section.d.ts +1 -1
  322. package/dist/components/features/alerts/alert-banner.d.ts +1 -1
  323. package/dist/components/features/analytics/telemetry-consent-banner.d.ts +2 -1
  324. package/dist/components/features/automations/add-automation-modal.d.ts +1 -1
  325. package/dist/components/features/automations/automation-card-skeleton.d.ts +1 -1
  326. package/dist/components/features/automations/automation-card.d.ts +9 -1
  327. package/dist/components/features/automations/automation-group.d.ts +9 -1
  328. package/dist/components/features/automations/automation-health-badge.d.ts +8 -0
  329. package/dist/components/features/automations/automation-list-row.d.ts +3 -1
  330. package/dist/components/features/automations/automation-run-insights.d.ts +17 -0
  331. package/dist/components/features/automations/automation-view-toggle.d.ts +1 -1
  332. package/dist/components/features/automations/backend-not-configured.d.ts +1 -1
  333. package/dist/components/features/automations/create-instructions.d.ts +2 -2
  334. package/dist/components/features/automations/dashboard/automations-dashboard-controls.d.ts +18 -0
  335. package/dist/components/features/automations/dashboard/automations-filtered-empty-state.d.ts +9 -0
  336. package/dist/components/features/automations/dashboard/use-automation-sub-page-nav.d.ts +12 -0
  337. package/dist/components/features/automations/delete-confirmation-modal.d.ts +1 -1
  338. package/dist/components/features/automations/detail/active-status-badge.d.ts +1 -1
  339. package/dist/components/features/automations/detail/activity-log-item.d.ts +1 -1
  340. package/dist/components/features/automations/detail/activity-log-section.d.ts +3 -1
  341. package/dist/components/features/automations/detail/activity-section.d.ts +1 -1
  342. package/dist/components/features/automations/detail/back-link.d.ts +1 -1
  343. package/dist/components/features/automations/detail/branch-badge.d.ts +1 -1
  344. package/dist/components/features/automations/detail/config-field.d.ts +1 -1
  345. package/dist/components/features/automations/detail/configuration-section.d.ts +1 -1
  346. package/dist/components/features/automations/detail/debug-automation-button.d.ts +1 -1
  347. package/dist/components/features/automations/detail/detail-header.d.ts +1 -1
  348. package/dist/components/features/automations/detail/detail-skeleton.d.ts +1 -1
  349. package/dist/components/features/automations/detail/edit-automation-modal.d.ts +1 -1
  350. package/dist/components/features/automations/detail/not-found-state.d.ts +1 -1
  351. package/dist/components/features/automations/detail/plugin-chip.d.ts +1 -1
  352. package/dist/components/features/automations/detail/plugins-section.d.ts +1 -1
  353. package/dist/components/features/automations/detail/prompt-section.d.ts +2 -1
  354. package/dist/components/features/automations/detail/run-logs-modal.d.ts +1 -1
  355. package/dist/components/features/automations/detail/run-status-badge.d.ts +10 -1
  356. package/dist/components/features/automations/detail/section-card.d.ts +1 -1
  357. package/dist/components/features/automations/empty-state.d.ts +1 -1
  358. package/dist/components/features/automations/error-state.d.ts +1 -1
  359. package/dist/components/features/automations/import-automation-modal.d.ts +1 -1
  360. package/dist/components/features/automations/kebab-menu-item-content.d.ts +1 -1
  361. package/dist/components/features/automations/kebab-menu.d.ts +1 -1
  362. package/dist/components/features/automations/metadata-chip.d.ts +1 -1
  363. package/dist/components/features/automations/recommended-automations-launcher.d.ts +1 -1
  364. package/dist/components/features/automations/recommended-automations-section.d.ts +1 -1
  365. package/dist/components/features/automations/responder-deployment-modal.d.ts +1 -1
  366. package/dist/components/features/automations/search-input.d.ts +1 -1
  367. package/dist/components/features/automations/status-badge.d.ts +1 -1
  368. package/dist/components/features/automations/turn-off-confirmation-modal.d.ts +8 -0
  369. package/dist/components/features/automations/view-menu-item-content.d.ts +1 -1
  370. package/dist/components/features/backends/add-backend-modal.d.ts +1 -1
  371. package/dist/components/features/backends/api-key-entry-screen.d.ts +2 -1
  372. package/dist/components/features/backends/backend-form-modal.d.ts +3 -3
  373. package/dist/components/features/backends/backend-row.d.ts +1 -1
  374. package/dist/components/features/backends/backend-selector.d.ts +2 -1
  375. package/dist/components/features/backends/backend-status-dot.d.ts +2 -1
  376. package/dist/components/features/backends/backend-version.d.ts +1 -1
  377. package/dist/components/features/backends/device-flow-auth.d.ts +1 -1
  378. package/dist/components/features/backends/manage-backends-modal.d.ts +2 -1
  379. package/dist/components/features/browser/browser-chrome-bar.d.ts +1 -1
  380. package/dist/components/features/browser/browser-snapshot.d.ts +1 -1
  381. package/dist/components/features/browser/browser.d.ts +1 -1
  382. package/dist/components/features/browser/empty-browser-message.d.ts +1 -1
  383. package/dist/components/features/chat/btw-messages.d.ts +1 -1
  384. package/dist/components/features/chat/change-agent-button.d.ts +2 -1
  385. package/dist/components/features/chat/change-agent-context-menu.d.ts +1 -1
  386. package/dist/components/features/chat/chat-action-tooltip.d.ts +1 -1
  387. package/dist/components/features/chat/chat-add-file-button.d.ts +2 -1
  388. package/dist/components/features/chat/chat-interface.d.ts +2 -1
  389. package/dist/components/features/chat/chat-message.d.ts +1 -1
  390. package/dist/components/features/chat/chat-messages-skeleton.d.ts +2 -1
  391. package/dist/components/features/chat/chat-play-button.d.ts +1 -1
  392. package/dist/components/features/chat/chat-send-button.d.ts +1 -1
  393. package/dist/components/features/chat/chat-status-indicator.d.ts +1 -1
  394. package/dist/components/features/chat/chat-stop-button.d.ts +1 -1
  395. package/dist/components/features/chat/chat-suggestions.d.ts +1 -1
  396. package/dist/components/features/chat/components/chat-input-actions.d.ts +2 -1
  397. package/dist/components/features/chat/components/chat-input-container.d.ts +1 -1
  398. package/dist/components/features/chat/components/chat-input-field.d.ts +1 -1
  399. package/dist/components/features/chat/components/chat-input-grip.d.ts +1 -1
  400. package/dist/components/features/chat/components/chat-input-llm-profile-picker.d.ts +3 -2
  401. package/dist/components/features/chat/components/chat-input-model.d.ts +3 -2
  402. package/dist/components/features/chat/components/chat-input-profile-picker.d.ts +1 -1
  403. package/dist/components/features/chat/components/chat-input-row.d.ts +1 -1
  404. package/dist/components/features/chat/components/hidden-file-input.d.ts +1 -1
  405. package/dist/components/features/chat/components/slash-command-menu.d.ts +2 -1
  406. package/dist/components/features/chat/confirmation-mode-enabled.d.ts +1 -1
  407. package/dist/components/features/chat/custom-chat-input.d.ts +1 -1
  408. package/dist/components/features/chat/drag-over.d.ts +1 -1
  409. package/dist/components/features/chat/error-message-banner.d.ts +2 -1
  410. package/dist/components/features/chat/error-message.d.ts +2 -1
  411. package/dist/components/features/chat/generic-event-message.d.ts +1 -1
  412. package/dist/components/features/chat/git-control-bar-branch-button.d.ts +1 -1
  413. package/dist/components/features/chat/git-control-bar-pr-button.d.ts +1 -1
  414. package/dist/components/features/chat/git-control-bar-pull-button.d.ts +1 -1
  415. package/dist/components/features/chat/git-control-bar-push-button.d.ts +1 -1
  416. package/dist/components/features/chat/git-control-bar-repo-button.d.ts +1 -1
  417. package/dist/components/features/chat/git-control-bar-tooltip-wrapper.d.ts +1 -1
  418. package/dist/components/features/chat/git-control-bar.d.ts +1 -1
  419. package/dist/components/features/chat/git-external-link-icon.d.ts +1 -1
  420. package/dist/components/features/chat/goal-status-banner.d.ts +1 -1
  421. package/dist/components/features/chat/goal-status-content.d.ts +1 -1
  422. package/dist/components/features/chat/got-it-button.d.ts +1 -1
  423. package/dist/components/features/chat/interactive-chat-box.d.ts +1 -1
  424. package/dist/components/features/chat/model-messages.d.ts +2 -1
  425. package/dist/components/features/chat/mono-component.d.ts +1 -1
  426. package/dist/components/features/chat/open-repository-modal.d.ts +2 -1
  427. package/dist/components/features/chat/pasted-image-upload-as-file-button.d.ts +1 -1
  428. package/dist/components/features/chat/path-component.d.ts +1 -1
  429. package/dist/components/features/chat/pending-stop-icon.d.ts +1 -1
  430. package/dist/components/features/chat/pending-user-messages.d.ts +2 -1
  431. package/dist/components/features/chat/plan-preview.d.ts +1 -1
  432. package/dist/components/features/chat/remove-file-button.d.ts +1 -1
  433. package/dist/components/features/chat/skill-install-restart-banner.d.ts +1 -1
  434. package/dist/components/features/chat/success-indicator.d.ts +1 -1
  435. package/dist/components/features/chat/task-tracking/status-badge.d.ts +1 -1
  436. package/dist/components/features/chat/task-tracking/status-icon.d.ts +1 -1
  437. package/dist/components/features/chat/task-tracking/task-item.d.ts +1 -1
  438. package/dist/components/features/chat/task-tracking/task-list-section.d.ts +1 -1
  439. package/dist/components/features/chat/tool-visualizers/primitives/code-block.d.ts +2 -1
  440. package/dist/components/features/chat/tool-visualizers/primitives/diff-view.d.ts +2 -1
  441. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.d.ts +2 -1
  442. package/dist/components/features/chat/tool-visualizers/primitives/key-value-grid.d.ts +1 -1
  443. package/dist/components/features/chat/tool-visualizers/primitives/output-pane.d.ts +2 -1
  444. package/dist/components/features/chat/typing-indicator.d.ts +1 -1
  445. package/dist/components/features/chat/uploaded-file.d.ts +1 -1
  446. package/dist/components/features/chat/uploaded-files.d.ts +1 -1
  447. package/dist/components/features/chat/uploaded-image.d.ts +2 -1
  448. package/dist/components/features/chat/user-message-body.d.ts +2 -2
  449. package/dist/components/features/chat/waiting-for-runtime-message.d.ts +1 -1
  450. package/dist/components/features/chat/workspace-mode-icon.d.ts +1 -1
  451. package/dist/components/features/chat/workspace-mode-selector.d.ts +1 -1
  452. package/dist/components/features/command-menu/command-menu-trigger.d.ts +2 -1
  453. package/dist/components/features/context-menu/archived-disabled-tooltip.d.ts +1 -1
  454. package/dist/components/features/context-menu/context-menu-icon-text-with-description.d.ts +1 -1
  455. package/dist/components/features/context-menu/context-menu-icon-text.d.ts +1 -1
  456. package/dist/components/features/context-menu/context-menu-list-item.cjs +1 -1
  457. package/dist/components/features/context-menu/context-menu-list-item.cjs.map +1 -1
  458. package/dist/components/features/context-menu/context-menu-list-item.d.ts +2 -1
  459. package/dist/components/features/context-menu/context-menu-list-item.js +2 -1
  460. package/dist/components/features/context-menu/context-menu-list-item.js.map +1 -1
  461. package/dist/components/features/controls/agent-loading.d.ts +1 -1
  462. package/dist/components/features/controls/agent-status.d.ts +1 -1
  463. package/dist/components/features/controls/git-tools-submenu.d.ts +1 -1
  464. package/dist/components/features/controls/macros-submenu.d.ts +1 -1
  465. package/dist/components/features/controls/server-status-context-menu-icon-text.d.ts +1 -1
  466. package/dist/components/features/controls/server-status-context-menu.d.ts +1 -1
  467. package/dist/components/features/controls/server-status.d.ts +1 -1
  468. package/dist/components/features/controls/tools-context-menu-icon-text.d.ts +1 -1
  469. package/dist/components/features/controls/tools-context-menu.d.ts +1 -1
  470. package/dist/components/features/controls/tools.d.ts +2 -1
  471. package/dist/components/features/conversation/conversation-loading.d.ts +1 -1
  472. package/dist/components/features/conversation/conversation-main/chat-interface-wrapper.d.ts +1 -1
  473. package/dist/components/features/conversation/conversation-main/conversation-main.d.ts +1 -1
  474. package/dist/components/features/conversation/conversation-main/conversation-mobile-panel-page.d.ts +2 -1
  475. package/dist/components/features/conversation/conversation-name-context-menu-icon-text.d.ts +1 -1
  476. package/dist/components/features/conversation/conversation-name-context-menu.d.ts +1 -1
  477. package/dist/components/features/conversation/conversation-name-with-status.d.ts +2 -1
  478. package/dist/components/features/conversation/conversation-name.d.ts +2 -1
  479. package/dist/components/features/conversation/conversation-tab-empty-state.d.ts +1 -1
  480. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content-crossfade.d.ts +1 -1
  481. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.d.ts +1 -1
  482. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/suspense-pending-fallback.d.ts +1 -1
  483. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/tab-container.d.ts +1 -1
  484. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/tab-content-area.d.ts +1 -1
  485. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/tab-wrapper.d.ts +1 -1
  486. package/dist/components/features/conversation/conversation-tabs/conversation-tab-nav.d.ts +1 -1
  487. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.d.ts +1 -1
  488. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.d.ts +1 -1
  489. package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.d.ts +1 -1
  490. package/dist/components/features/conversation/metrics-modal/context-window-section.d.ts +1 -1
  491. package/dist/components/features/conversation/metrics-modal/cost-section.d.ts +1 -1
  492. package/dist/components/features/conversation/metrics-modal/empty-state.d.ts +1 -1
  493. package/dist/components/features/conversation/metrics-modal/metric-row.d.ts +1 -1
  494. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.d.ts +1 -1
  495. package/dist/components/features/conversation/metrics-modal/metrics-modal.d.ts +1 -1
  496. package/dist/components/features/conversation/metrics-modal/usage-section.d.ts +1 -1
  497. package/dist/components/features/conversation/right-panel-toggle.d.ts +1 -1
  498. package/dist/components/features/conversation/transcript-export-modal.d.ts +2 -1
  499. package/dist/components/features/conversation-panel/budget-display.d.ts +2 -1
  500. package/dist/components/features/conversation-panel/budget-progress-bar.d.ts +1 -1
  501. package/dist/components/features/conversation-panel/budget-usage-text.d.ts +2 -1
  502. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.d.ts +1 -1
  503. package/dist/components/features/conversation-panel/compact-conversation-row.cjs +1 -1
  504. package/dist/components/features/conversation-panel/compact-conversation-row.cjs.map +1 -1
  505. package/dist/components/features/conversation-panel/compact-conversation-row.d.ts +2 -1
  506. package/dist/components/features/conversation-panel/compact-conversation-row.js +38 -37
  507. package/dist/components/features/conversation-panel/compact-conversation-row.js.map +1 -1
  508. package/dist/components/features/conversation-panel/confirm-delete-modal.d.ts +1 -1
  509. package/dist/components/features/conversation-panel/confirm-stop-modal.d.ts +1 -1
  510. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +1 -1
  511. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.d.ts +1 -1
  512. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -2
  513. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  514. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +3 -9
  515. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +48 -51
  516. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  517. package/dist/components/features/conversation-panel/conversation-card/conversation-card-header.d.ts +1 -1
  518. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.cjs +2 -0
  519. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.cjs.map +1 -0
  520. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.d.ts +12 -0
  521. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.js +6 -0
  522. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.js.map +1 -0
  523. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs +1 -1
  524. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs.map +1 -1
  525. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.d.ts +16 -1
  526. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js +95 -78
  527. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js.map +1 -1
  528. package/dist/components/features/conversation-panel/conversation-card/conversation-card-skeleton.d.ts +1 -1
  529. package/dist/components/features/conversation-panel/conversation-card/conversation-card-title.d.ts +1 -1
  530. package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +2 -1
  531. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.cjs +1 -1
  532. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.cjs.map +1 -1
  533. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.d.ts +1 -1
  534. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.js +40 -38
  535. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.js.map +1 -1
  536. package/dist/components/features/conversation-panel/conversation-card/conversation-status-badges.d.ts +1 -1
  537. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs +2 -0
  538. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs.map +1 -0
  539. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.d.ts +14 -0
  540. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js +167 -0
  541. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js.map +1 -0
  542. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs +2 -0
  543. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs.map +1 -0
  544. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.d.ts +63 -0
  545. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js +66 -0
  546. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js.map +1 -0
  547. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.cjs +2 -0
  548. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.cjs.map +1 -0
  549. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.d.ts +15 -0
  550. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.js +117 -0
  551. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.js.map +1 -0
  552. package/dist/components/features/conversation-panel/conversation-card/no-repository.cjs +1 -1
  553. package/dist/components/features/conversation-panel/conversation-card/no-repository.cjs.map +1 -1
  554. package/dist/components/features/conversation-panel/conversation-card/no-repository.d.ts +1 -1
  555. package/dist/components/features/conversation-panel/conversation-card/no-repository.js +30 -19
  556. package/dist/components/features/conversation-panel/conversation-card/no-repository.js.map +1 -1
  557. package/dist/components/features/conversation-panel/conversation-group-folder-list.d.ts +1 -1
  558. package/dist/components/features/conversation-panel/conversation-group-folder-row.d.ts +1 -1
  559. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
  560. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
  561. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +7 -2
  562. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +146 -104
  563. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
  564. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  565. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  566. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +20 -0
  567. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +53 -27
  568. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  569. package/dist/components/features/conversation-panel/conversation-panel-new-thread-picker.d.ts +1 -1
  570. package/dist/components/features/conversation-panel/conversation-panel-pinned-section.d.ts +1 -1
  571. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  572. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  573. package/dist/components/features/conversation-panel/conversation-panel.d.ts +2 -1
  574. package/dist/components/features/conversation-panel/conversation-panel.js +169 -155
  575. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  576. package/dist/components/features/conversation-panel/conversation-status-dot.d.ts +1 -1
  577. package/dist/components/features/conversation-panel/exit-conversation-modal.d.ts +1 -1
  578. package/dist/components/features/conversation-panel/hook-event-item.d.ts +1 -1
  579. package/dist/components/features/conversation-panel/hook-matcher-content.d.ts +1 -1
  580. package/dist/components/features/conversation-panel/hooks-empty-state.d.ts +1 -1
  581. package/dist/components/features/conversation-panel/hooks-loading-state.d.ts +1 -1
  582. package/dist/components/features/conversation-panel/hooks-modal-header.d.ts +1 -1
  583. package/dist/components/features/conversation-panel/hooks-modal.d.ts +1 -1
  584. package/dist/components/features/conversation-panel/local-new-conversation-menu.d.ts +1 -1
  585. package/dist/components/features/conversation-panel/menu-heading.d.ts +1 -1
  586. package/dist/components/features/conversation-panel/menu-row.d.ts +1 -1
  587. package/dist/components/features/conversation-panel/menu-separator.d.ts +1 -1
  588. package/dist/components/features/conversation-panel/new-conversation-button.d.ts +2 -1
  589. package/dist/components/features/conversation-panel/plugins-modal.d.ts +1 -1
  590. package/dist/components/features/conversation-panel/runtime-waiting-state.d.ts +1 -1
  591. package/dist/components/features/conversation-panel/skill-content.d.ts +1 -1
  592. package/dist/components/features/conversation-panel/skill-item.d.ts +1 -1
  593. package/dist/components/features/conversation-panel/skill-triggers.d.ts +1 -1
  594. package/dist/components/features/conversation-panel/skills-empty-state.d.ts +1 -1
  595. package/dist/components/features/conversation-panel/skills-loading-state.d.ts +1 -1
  596. package/dist/components/features/conversation-panel/skills-modal-header.d.ts +1 -1
  597. package/dist/components/features/conversation-panel/skills-modal-section.d.ts +1 -1
  598. package/dist/components/features/conversation-panel/skills-modal.d.ts +1 -1
  599. package/dist/components/features/conversation-panel/start-task-card/start-task-card-footer.d.ts +1 -1
  600. package/dist/components/features/conversation-panel/start-task-card/start-task-card-header.d.ts +1 -1
  601. package/dist/components/features/conversation-panel/start-task-card/start-task-card.d.ts +1 -1
  602. package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.d.ts +1 -1
  603. package/dist/components/features/conversation-panel/start-task-card/start-task-status-indicator.d.ts +1 -1
  604. package/dist/components/features/conversation-panel/system-message-modal/empty-tools-state.d.ts +1 -1
  605. package/dist/components/features/conversation-panel/system-message-modal/system-message-content.d.ts +1 -1
  606. package/dist/components/features/conversation-panel/system-message-modal/system-message-header.d.ts +1 -1
  607. package/dist/components/features/conversation-panel/system-message-modal/tab-button.d.ts +1 -1
  608. package/dist/components/features/conversation-panel/system-message-modal/tab-content.d.ts +1 -1
  609. package/dist/components/features/conversation-panel/system-message-modal/tab-navigation.d.ts +1 -1
  610. package/dist/components/features/conversation-panel/system-message-modal/toggle-button.d.ts +1 -1
  611. package/dist/components/features/conversation-panel/system-message-modal/tool-item.d.ts +1 -1
  612. package/dist/components/features/conversation-panel/system-message-modal/tool-parameters.d.ts +1 -1
  613. package/dist/components/features/conversation-panel/system-message-modal/tools-list.d.ts +1 -1
  614. package/dist/components/features/conversation-panel/system-message-modal.d.ts +1 -1
  615. package/dist/components/features/diff-viewer/commit-list.d.ts +2 -1
  616. package/dist/components/features/diff-viewer/commit-row.d.ts +2 -1
  617. package/dist/components/features/diff-viewer/diff-drawer-icon.d.ts +1 -1
  618. package/dist/components/features/diff-viewer/editor-container.d.ts +1 -1
  619. package/dist/components/features/diff-viewer/empty-changes-message.d.ts +1 -1
  620. package/dist/components/features/diff-viewer/file-diff-viewer.d.ts +2 -1
  621. package/dist/components/features/diff-viewer/loading-spinner.d.ts +1 -1
  622. package/dist/components/features/files/file-item.d.ts +1 -1
  623. package/dist/components/features/files/file-list.d.ts +2 -1
  624. package/dist/components/features/files-tab/file-content-viewer.d.ts +1 -1
  625. package/dist/components/features/files-tab/file-quick-row.d.ts +1 -1
  626. package/dist/components/features/files-tab/file-tree-view.d.ts +1 -1
  627. package/dist/components/features/files-tab/highlighted-source-view.d.ts +1 -1
  628. package/dist/components/features/files-tab/no-file-selected-message.d.ts +1 -1
  629. package/dist/components/features/files-tab/segmented-toggle.d.ts +1 -1
  630. package/dist/components/features/files-tab/tree-node.d.ts +1 -1
  631. package/dist/components/features/home/featured-automations/automation-health-indicator.d.ts +11 -0
  632. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.d.ts +18 -0
  633. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.d.ts +14 -0
  634. package/dist/components/features/home/featured-automations/automation-run-health.d.ts +25 -0
  635. package/dist/components/features/home/featured-automations/build-home-automation-menu-items.d.ts +39 -0
  636. package/dist/components/features/home/featured-automations/build-pinned-automation-menu-items.d.ts +22 -0
  637. package/dist/components/features/home/featured-automations/home-automation-activity.d.ts +23 -0
  638. package/dist/components/features/home/featured-automations/home-automation-menu.d.ts +13 -0
  639. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.d.ts +12 -0
  640. package/dist/components/features/home/featured-automations/pinned-automation-card.d.ts +21 -0
  641. package/dist/components/features/home/featured-automations/pinned-automations-dashboard.d.ts +6 -0
  642. package/dist/components/features/home/featured-automations/running-automations-list.d.ts +6 -0
  643. package/dist/components/features/home/git-branch-dropdown/branch-dropdown-menu.d.ts +1 -1
  644. package/dist/components/features/home/git-branch-dropdown/git-branch-dropdown.d.ts +2 -1
  645. package/dist/components/features/home/git-provider-dropdown/git-provider-dropdown.d.ts +2 -1
  646. package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.d.ts +2 -1
  647. package/dist/components/features/home/home-chat-launcher.d.ts +1 -1
  648. package/dist/components/features/home/home-git-control-bar-preview.d.ts +1 -1
  649. package/dist/components/features/home/home-header/guide-message.d.ts +1 -1
  650. package/dist/components/features/home/home-header/home-header-title.d.ts +1 -1
  651. package/dist/components/features/home/home-header/home-header.d.ts +1 -1
  652. package/dist/components/features/home/llm-not-configured-banner.d.ts +1 -1
  653. package/dist/components/features/home/new-conversation/create-conversation-button.d.ts +1 -1
  654. package/dist/components/features/home/new-conversation/new-conversation.d.ts +1 -1
  655. package/dist/components/features/home/new-conversation.d.ts +1 -1
  656. package/dist/components/features/home/open-launcher-button.d.ts +1 -1
  657. package/dist/components/features/home/open-repository-dialog.d.ts +1 -1
  658. package/dist/components/features/home/open-workspace-dialog.d.ts +1 -1
  659. package/dist/components/features/home/repo-selection-form.d.ts +2 -1
  660. package/dist/components/features/home/shared/clear-button.d.ts +2 -1
  661. package/dist/components/features/home/shared/dropdown-item.d.ts +1 -1
  662. package/dist/components/features/home/shared/empty-state.d.ts +2 -1
  663. package/dist/components/features/home/shared/error-message.d.ts +2 -1
  664. package/dist/components/features/home/shared/generic-dropdown-menu.d.ts +1 -1
  665. package/dist/components/features/home/shared/loading-spinner.d.ts +2 -1
  666. package/dist/components/features/home/shared/toggle-button.d.ts +1 -1
  667. package/dist/components/features/home/tasks/task-card.d.ts +1 -1
  668. package/dist/components/features/home/tasks/task-group.d.ts +1 -1
  669. package/dist/components/features/home/tasks/task-issue-number.d.ts +1 -1
  670. package/dist/components/features/home/tasks/task-item-title.d.ts +1 -1
  671. package/dist/components/features/home/tasks/task-suggestions-skeleton.d.ts +1 -1
  672. package/dist/components/features/home/tasks/task-suggestions.d.ts +1 -1
  673. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.d.ts +2 -1
  674. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.d.ts +2 -1
  675. package/dist/components/features/home/workspace-dropdown/workspace-dropdown.d.ts +2 -1
  676. package/dist/components/features/home/workspace-selection-form.d.ts +2 -1
  677. package/dist/components/features/images/image-carousel.d.ts +2 -1
  678. package/dist/components/features/images/image-preview.d.ts +1 -1
  679. package/dist/components/features/images/thumbnail.d.ts +1 -1
  680. package/dist/components/features/launch/plugin-launch-modal.d.ts +2 -1
  681. package/dist/components/features/launch/plugin-launch-parameter-input.d.ts +1 -1
  682. package/dist/components/features/launch/plugin-launch-plugin-section.d.ts +1 -1
  683. package/dist/components/features/manifest/manifest-form-field.d.ts +1 -1
  684. package/dist/components/features/manifest/manifest-icons.d.ts +13 -0
  685. package/dist/components/features/manifest/manifest-overview-tiles.d.ts +19 -0
  686. package/dist/components/features/manifest/manifest-prerequisites-step.d.ts +1 -1
  687. package/dist/components/features/manifest/manifest-review-step.d.ts +1 -1
  688. package/dist/components/features/manifest/manifest-setup-dialog.d.ts +1 -1
  689. package/dist/components/features/manifest/manifest-subpage-layout.d.ts +23 -0
  690. package/dist/components/features/markdown/anchor.d.ts +1 -1
  691. package/dist/components/features/markdown/blockquote.d.ts +1 -1
  692. package/dist/components/features/markdown/code.d.ts +1 -1
  693. package/dist/components/features/markdown/headings.d.ts +6 -6
  694. package/dist/components/features/markdown/horizontal-rule.d.ts +1 -1
  695. package/dist/components/features/markdown/list.d.ts +3 -3
  696. package/dist/components/features/markdown/markdown-renderer.d.ts +1 -1
  697. package/dist/components/features/markdown/markdown-table-scroll.d.ts +1 -1
  698. package/dist/components/features/markdown/paragraph.d.ts +1 -1
  699. package/dist/components/features/markdown/plan-components.d.ts +36 -36
  700. package/dist/components/features/markdown/table.d.ts +3 -3
  701. package/dist/components/features/mcp-logo-badge.d.ts +1 -1
  702. package/dist/components/features/mcp-page/custom-server-editor.cjs +1 -1
  703. package/dist/components/features/mcp-page/custom-server-editor.cjs.map +1 -1
  704. package/dist/components/features/mcp-page/custom-server-editor.d.ts +2 -1
  705. package/dist/components/features/mcp-page/custom-server-editor.js +5 -0
  706. package/dist/components/features/mcp-page/custom-server-editor.js.map +1 -1
  707. package/dist/components/features/mcp-page/install-server-modal.cjs +1 -1
  708. package/dist/components/features/mcp-page/install-server-modal.cjs.map +1 -1
  709. package/dist/components/features/mcp-page/install-server-modal.d.ts +2 -1
  710. package/dist/components/features/mcp-page/install-server-modal.js +117 -118
  711. package/dist/components/features/mcp-page/install-server-modal.js.map +1 -1
  712. package/dist/components/features/mcp-page/installed-server-card.d.ts +2 -1
  713. package/dist/components/features/mcp-page/installed-servers-section.d.ts +1 -1
  714. package/dist/components/features/mcp-page/marketplace-card.d.ts +1 -1
  715. package/dist/components/features/mcp-page/marketplace-section.d.ts +1 -1
  716. package/dist/components/features/mcp-page/mcp-logo-stack-badge.d.ts +1 -1
  717. package/dist/components/features/mcp-page/mcp-section-filter-dropdown.d.ts +1 -1
  718. package/dist/components/features/mcp-page/mcp-server-health.d.ts +2 -1
  719. package/dist/components/features/mcp-page/mcp-toolbar.d.ts +1 -1
  720. package/dist/components/features/mcp-page/save-as-secret-toggle.d.ts +1 -1
  721. package/dist/components/features/onboarding/onboarding-host.d.ts +1 -1
  722. package/dist/components/features/onboarding/onboarding-modal.d.ts +2 -1
  723. package/dist/components/features/onboarding/onboarding-progress-bar.d.ts +1 -1
  724. package/dist/components/features/onboarding/steps/check-backend-step.d.ts +2 -1
  725. package/dist/components/features/onboarding/steps/choose-agent-step.d.ts +3 -2
  726. package/dist/components/features/onboarding/steps/say-hello-step.d.ts +2 -1
  727. package/dist/components/features/onboarding/steps/setup-acp-secrets-step.d.ts +2 -1
  728. package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +2 -1
  729. package/dist/components/features/plugins/add-plugin-modal.d.ts +2 -1
  730. package/dist/components/features/plugins/plugin-card.d.ts +2 -1
  731. package/dist/components/features/plugins/plugin-detail-modal.d.ts +1 -1
  732. package/dist/components/features/plugins/plugin-files-section.d.ts +2 -1
  733. package/dist/components/features/plugins/plugin-picker-card.d.ts +1 -1
  734. package/dist/components/features/plugins/plugin-picker-modal.d.ts +1 -1
  735. package/dist/components/features/plugins/plugin-picker-trigger.d.ts +1 -1
  736. package/dist/components/features/plugins/plugin-picker.d.ts +1 -1
  737. package/dist/components/features/plugins/plugins-toolbar.d.ts +1 -1
  738. package/dist/components/features/settings/acp-auth-status-banner.d.ts +1 -1
  739. package/dist/components/features/settings/acp-conflict-warnings.d.ts +2 -1
  740. package/dist/components/features/settings/acp-credentials-section.d.ts +1 -1
  741. package/dist/components/features/settings/acp-secret-field.d.ts +2 -1
  742. package/dist/components/features/settings/agent-canvas-update-card.cjs +1 -1
  743. package/dist/components/features/settings/agent-canvas-update-card.cjs.map +1 -1
  744. package/dist/components/features/settings/agent-canvas-update-card.d.ts +10 -5
  745. package/dist/components/features/settings/agent-canvas-update-card.js +223 -149
  746. package/dist/components/features/settings/agent-canvas-update-card.js.map +1 -1
  747. package/dist/components/features/settings/agent-canvas-version-modal.cjs +2 -0
  748. package/dist/components/features/settings/agent-canvas-version-modal.cjs.map +1 -0
  749. package/dist/components/features/settings/agent-canvas-version-modal.d.ts +11 -0
  750. package/dist/components/features/settings/agent-canvas-version-modal.js +166 -0
  751. package/dist/components/features/settings/agent-canvas-version-modal.js.map +1 -0
  752. package/dist/components/features/settings/agent-canvas-version-tile.cjs +2 -0
  753. package/dist/components/features/settings/agent-canvas-version-tile.cjs.map +1 -0
  754. package/dist/components/features/settings/agent-canvas-version-tile.d.ts +13 -0
  755. package/dist/components/features/settings/agent-canvas-version-tile.js +60 -0
  756. package/dist/components/features/settings/agent-canvas-version-tile.js.map +1 -0
  757. package/dist/components/features/settings/agent-profiles/agent-profile-actions-menu.d.ts +1 -1
  758. package/dist/components/features/settings/agent-profiles/agent-profile-row.d.ts +1 -1
  759. package/dist/components/features/settings/agent-profiles/agent-profiles-body.d.ts +1 -1
  760. package/dist/components/features/settings/agent-profiles/agent-profiles-local-view.d.ts +1 -1
  761. package/dist/components/features/settings/agent-profiles/agent-profiles-manager.d.ts +1 -1
  762. package/dist/components/features/settings/agent-profiles/delete-agent-profile-modal.d.ts +1 -1
  763. package/dist/components/features/settings/agent-server-onboarding.d.ts +2 -1
  764. package/dist/components/features/settings/api-key-modal-base.d.ts +1 -1
  765. package/dist/components/features/settings/app-settings/app-settings-inputs-skeleton.d.ts +1 -1
  766. package/dist/components/features/settings/app-settings/language-input.d.ts +1 -1
  767. package/dist/components/features/settings/app-settings/theme-input.d.ts +2 -1
  768. package/dist/components/features/settings/backend-synced-settings-badge.d.ts +1 -1
  769. package/dist/components/features/settings/banner-message.d.ts +1 -1
  770. package/dist/components/features/settings/cloud-settings-link.d.ts +1 -1
  771. package/dist/components/features/settings/input-skeleton.d.ts +1 -1
  772. package/dist/components/features/settings/integrations-settings-link.d.ts +1 -1
  773. package/dist/components/features/settings/key-status-icon.d.ts +1 -1
  774. package/dist/components/features/settings/llm-profiles/delete-profile-modal.d.ts +1 -1
  775. package/dist/components/features/settings/llm-profiles/llm-profiles-manager.d.ts +1 -1
  776. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.d.ts +2 -1
  777. package/dist/components/features/settings/llm-profiles/profile-actions-menu-item.d.ts +1 -1
  778. package/dist/components/features/settings/llm-profiles/profile-actions-menu.d.ts +1 -1
  779. package/dist/components/features/settings/llm-profiles/profile-row.d.ts +1 -1
  780. package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +1 -1
  781. package/dist/components/features/settings/llm-profiles/rename-profile-modal.d.ts +1 -1
  782. package/dist/components/features/settings/llm-settings/llm-settings-inputs-skeleton.d.ts +1 -1
  783. package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.d.ts +2 -1
  784. package/dist/components/features/settings/mcp-settings/mcp-server-form.cjs +1 -1
  785. package/dist/components/features/settings/mcp-settings/mcp-server-form.cjs.map +1 -1
  786. package/dist/components/features/settings/mcp-settings/mcp-server-form.d.ts +2 -1
  787. package/dist/components/features/settings/mcp-settings/mcp-server-form.js +2 -1
  788. package/dist/components/features/settings/mcp-settings/mcp-server-form.js.map +1 -1
  789. package/dist/components/features/settings/mcp-settings/mcp-server-list-item.d.ts +1 -1
  790. package/dist/components/features/settings/mcp-settings/mcp-server-list.d.ts +1 -1
  791. package/dist/components/features/settings/mobile-header.d.ts +1 -1
  792. package/dist/components/features/settings/optional-tag.d.ts +1 -1
  793. package/dist/components/features/settings/sdk-settings/field-help.d.ts +1 -1
  794. package/dist/components/features/settings/sdk-settings/schema-field.d.ts +2 -1
  795. package/dist/components/features/settings/sdk-settings/sdk-section-page.d.ts +1 -1
  796. package/dist/components/features/settings/sdk-settings/view-toggle.d.ts +1 -1
  797. package/dist/components/features/settings/secrets-settings/secret-form.d.ts +2 -1
  798. package/dist/components/features/settings/secrets-settings/secret-list-item.d.ts +2 -2
  799. package/dist/components/features/settings/settings-desktop-sidebar.cjs +1 -1
  800. package/dist/components/features/settings/settings-desktop-sidebar.cjs.map +1 -1
  801. package/dist/components/features/settings/settings-desktop-sidebar.d.ts +1 -1
  802. package/dist/components/features/settings/settings-desktop-sidebar.js +1 -1
  803. package/dist/components/features/settings/settings-desktop-sidebar.js.map +1 -1
  804. package/dist/components/features/settings/settings-dropdown-input.d.ts +1 -1
  805. package/dist/components/features/settings/settings-layout.d.ts +1 -1
  806. package/dist/components/features/settings/settings-mobile-drawer.cjs +1 -1
  807. package/dist/components/features/settings/settings-mobile-drawer.cjs.map +1 -1
  808. package/dist/components/features/settings/settings-mobile-drawer.d.ts +1 -1
  809. package/dist/components/features/settings/settings-mobile-drawer.js +1 -1
  810. package/dist/components/features/settings/settings-mobile-drawer.js.map +1 -1
  811. package/dist/components/features/settings/settings-mobile-hub.d.ts +1 -1
  812. package/dist/components/features/settings/settings-nav-divider.d.ts +1 -1
  813. package/dist/components/features/settings/settings-nav-header.d.ts +1 -1
  814. package/dist/components/features/settings/settings-nav-link.d.ts +1 -1
  815. package/dist/components/features/settings/settings-navigation.d.ts +1 -1
  816. package/dist/components/features/settings/settings-switch.d.ts +1 -1
  817. package/dist/components/features/settings/subtext-skeleton.d.ts +1 -1
  818. package/dist/components/features/settings/switch-skeleton.d.ts +1 -1
  819. package/dist/components/features/settings/upgrade-banner.d.ts +1 -1
  820. package/dist/components/features/settings/upgrade-button.d.ts +1 -1
  821. package/dist/components/features/sidebar/avatar.d.ts +1 -1
  822. package/dist/components/features/sidebar/sidebar-collapsed-icon-slot.d.ts +1 -1
  823. package/dist/components/features/sidebar/sidebar-conversation-list.d.ts +1 -1
  824. package/dist/components/features/sidebar/sidebar-mobile-menu-bar.d.ts +1 -1
  825. package/dist/components/features/sidebar/sidebar-mobile-menu-toggle.d.ts +1 -1
  826. package/dist/components/features/sidebar/sidebar-mobile-nav-context.d.ts +1 -1
  827. package/dist/components/features/sidebar/sidebar-nav-link.d.ts +1 -1
  828. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  829. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  830. package/dist/components/features/sidebar/sidebar-rail-body.d.ts +1 -1
  831. package/dist/components/features/sidebar/sidebar-rail-body.js +109 -108
  832. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  833. package/dist/components/features/sidebar/sidebar.d.ts +2 -1
  834. package/dist/components/features/sidebar/user-avatar.d.ts +1 -1
  835. package/dist/components/features/skills/add-skill-modal.d.ts +2 -1
  836. package/dist/components/features/skills/extensions-mobile-hub.d.ts +1 -1
  837. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  838. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  839. package/dist/components/features/skills/extensions-navigation.d.ts +1 -1
  840. package/dist/components/features/skills/extensions-navigation.js +9 -9
  841. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  842. package/dist/components/features/skills/skill-card-pill-row.d.ts +1 -1
  843. package/dist/components/features/skills/skill-card.d.ts +2 -1
  844. package/dist/components/features/skills/skill-detail-modal.d.ts +2 -1
  845. package/dist/components/features/skills/skill-facet-rail.d.ts +8 -0
  846. package/dist/components/features/skills/skill-facet-row.d.ts +13 -0
  847. package/dist/components/features/skills/skill-filter.d.ts +34 -0
  848. package/dist/components/features/skills/skill-filters-modal.d.ts +10 -0
  849. package/dist/components/features/skills/skill-icon-badge.d.ts +1 -1
  850. package/dist/components/features/skills/skill-type-badge.d.ts +1 -1
  851. package/dist/components/features/skills/skills-toolbar.d.ts +3 -4
  852. package/dist/components/features/suggestions/suggestion-item.d.ts +1 -1
  853. package/dist/components/features/suggestions/suggestions.d.ts +1 -1
  854. package/dist/components/features/terminal/empty-terminal-message.d.ts +1 -1
  855. package/dist/components/features/terminal/terminal.d.ts +1 -1
  856. package/dist/components/features/tips/random-tip.d.ts +2 -1
  857. package/dist/components/providers/agent-server-ui-providers.d.ts +1 -1
  858. package/dist/components/providers/agent-server-ui-root.d.ts +1 -1
  859. package/dist/components/providers/telemetry-provider.d.ts +1 -1
  860. package/dist/components/shared/action-tooltip.d.ts +1 -1
  861. package/dist/components/shared/agent-brand-icon.d.ts +1 -1
  862. package/dist/components/shared/badge.d.ts +1 -1
  863. package/dist/components/shared/buttons/back-nav-button-content.d.ts +1 -1
  864. package/dist/components/shared/buttons/circle-plus-check-toggle.d.ts +3 -2
  865. package/dist/components/shared/buttons/conversation-confirmation-buttons.d.ts +1 -1
  866. package/dist/components/shared/buttons/copy-to-clipboard-button.d.ts +1 -1
  867. package/dist/components/shared/buttons/copyable-content-wrapper.d.ts +1 -1
  868. package/dist/components/shared/buttons/modal-button.d.ts +1 -1
  869. package/dist/components/shared/buttons/openhands-logo-button.d.ts +1 -1
  870. package/dist/components/shared/buttons/remove-button.d.ts +1 -1
  871. package/dist/components/shared/buttons/scroll-to-bottom-button.d.ts +1 -1
  872. package/dist/components/shared/buttons/styled-tooltip.d.ts +1 -1
  873. package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
  874. package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
  875. package/dist/components/shared/filters/enum-filter-dropdown.d.ts +6 -2
  876. package/dist/components/shared/filters/enum-filter-dropdown.js +13 -13
  877. package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
  878. package/dist/components/shared/git-provider-icon.d.ts +1 -1
  879. package/dist/components/shared/hook-execution-event-message.d.ts +2 -1
  880. package/dist/components/shared/loading-spinner.d.ts +1 -1
  881. package/dist/components/shared/modals/confirmation-modal.d.ts +1 -1
  882. package/dist/components/shared/modals/confirmation-modals/base-modal.d.ts +3 -3
  883. package/dist/components/shared/modals/confirmation-modals/danger-modal.d.ts +1 -1
  884. package/dist/components/shared/modals/modal-body.d.ts +1 -1
  885. package/dist/components/shared/modals/modal-close-button.d.ts +1 -1
  886. package/dist/components/shared/modals/settings/model-selector.d.ts +2 -1
  887. package/dist/components/shared/modals/settings/settings-form.d.ts +2 -1
  888. package/dist/components/shared/modals/settings/settings-modal.d.ts +1 -1
  889. package/dist/components/shared/navigation-link.cjs +1 -1
  890. package/dist/components/shared/navigation-link.cjs.map +1 -1
  891. package/dist/components/shared/navigation-link.js +11 -7
  892. package/dist/components/shared/navigation-link.js.map +1 -1
  893. package/dist/components/shared/risk-alert.d.ts +1 -1
  894. package/dist/components/shared/text-shimmer.d.ts +1 -1
  895. package/dist/components/ui/resize-handle.d.ts +1 -1
  896. package/dist/config/defaults.cjs +1 -1
  897. package/dist/config/defaults.cjs.map +1 -1
  898. package/dist/config/defaults.js +3 -3
  899. package/dist/config/defaults.js.map +1 -1
  900. package/dist/constants/child-conversation.cjs +2 -0
  901. package/dist/constants/child-conversation.cjs.map +1 -0
  902. package/dist/constants/child-conversation.d.ts +29 -0
  903. package/dist/constants/child-conversation.js +6 -0
  904. package/dist/constants/child-conversation.js.map +1 -0
  905. package/dist/context/navigation-context.d.ts +1 -1
  906. package/dist/context/scroll-context.d.ts +1 -1
  907. package/dist/contexts/active-backend-context.d.ts +1 -1
  908. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  909. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  910. package/dist/contexts/conversation-websocket-context.d.ts +1 -1
  911. package/dist/contexts/conversation-websocket-context.js +189 -188
  912. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  913. package/dist/contexts/settings-section-header-context.d.ts +1 -1
  914. package/dist/contexts/websocket-provider-wrapper.d.ts +1 -1
  915. package/dist/fixtures/home-automations-demo.d.ts +19 -0
  916. package/dist/hooks/chat/use-model-interceptor.cjs +1 -1
  917. package/dist/hooks/chat/use-model-interceptor.js +6 -6
  918. package/dist/hooks/mutation/use-add-mcp-server.cjs +1 -1
  919. package/dist/hooks/mutation/use-add-mcp-server.cjs.map +1 -1
  920. package/dist/hooks/mutation/use-add-mcp-server.js +10 -14
  921. package/dist/hooks/mutation/use-add-mcp-server.js.map +1 -1
  922. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  923. package/dist/hooks/mutation/use-create-conversation.js +6 -6
  924. package/dist/hooks/mutation/use-delete-mcp-server.cjs +1 -1
  925. package/dist/hooks/mutation/use-delete-mcp-server.cjs.map +1 -1
  926. package/dist/hooks/mutation/use-delete-mcp-server.d.ts +2 -7
  927. package/dist/hooks/mutation/use-delete-mcp-server.js +8 -34
  928. package/dist/hooks/mutation/use-delete-mcp-server.js.map +1 -1
  929. package/dist/hooks/mutation/use-save-settings.cjs +1 -1
  930. package/dist/hooks/mutation/use-save-settings.cjs.map +1 -1
  931. package/dist/hooks/mutation/use-save-settings.js +8 -4
  932. package/dist/hooks/mutation/use-save-settings.js.map +1 -1
  933. package/dist/hooks/mutation/use-update-mcp-server.cjs +1 -1
  934. package/dist/hooks/mutation/use-update-mcp-server.cjs.map +1 -1
  935. package/dist/hooks/mutation/use-update-mcp-server.d.ts +1 -1
  936. package/dist/hooks/mutation/use-update-mcp-server.js +31 -16
  937. package/dist/hooks/mutation/use-update-mcp-server.js.map +1 -1
  938. package/dist/hooks/query/use-active-conversation.d.ts +1 -1
  939. package/dist/hooks/query/use-agent-profiles.d.ts +1 -1
  940. package/dist/hooks/query/use-app-installations.d.ts +1 -1
  941. package/dist/hooks/query/use-automation-detail.d.ts +2 -2
  942. package/dist/hooks/query/use-automation-health.d.ts +2 -0
  943. package/dist/hooks/query/use-automations.d.ts +5 -1
  944. package/dist/hooks/query/use-bash-command-logs.d.ts +1 -1
  945. package/dist/hooks/query/use-cloud-sandbox.d.ts +1 -1
  946. package/dist/hooks/query/use-commit-changes.d.ts +1 -1
  947. package/dist/hooks/query/use-config.d.ts +1 -1
  948. package/dist/hooks/query/use-conversation-history.d.ts +1 -1
  949. package/dist/hooks/query/use-conversation-hooks.d.ts +1 -1
  950. package/dist/hooks/query/use-conversation-skills.d.ts +1 -1
  951. package/dist/hooks/query/use-get-secrets.d.ts +1 -1
  952. package/dist/hooks/query/use-home-automations.d.ts +20 -0
  953. package/dist/hooks/query/use-latest-automation-runs.d.ts +19 -0
  954. package/dist/hooks/query/use-llm-profiles.d.ts +1 -1
  955. package/dist/hooks/query/use-llm-subscription-models.d.ts +1 -1
  956. package/dist/hooks/query/use-llm-subscription-status.d.ts +1 -1
  957. package/dist/hooks/query/use-local-git-info.d.ts +1 -1
  958. package/dist/hooks/query/use-local-workspaces.d.ts +1 -1
  959. package/dist/hooks/query/use-manifest-capabilities.d.ts +2 -0
  960. package/dist/hooks/query/use-plugin-file-content.d.ts +1 -1
  961. package/dist/hooks/query/use-plugins-marketplace.d.ts +1 -1
  962. package/dist/hooks/query/use-provider-models.d.ts +1 -1
  963. package/dist/hooks/query/use-search-branches.d.ts +1 -1
  964. package/dist/hooks/query/use-search-providers.d.ts +1 -1
  965. package/dist/hooks/query/use-search-repositories.d.ts +1 -1
  966. package/dist/hooks/query/use-search-subdirs.d.ts +2 -2
  967. package/dist/hooks/query/use-settings.d.ts +2 -2
  968. package/dist/hooks/query/use-skills.d.ts +1 -1
  969. package/dist/hooks/query/use-start-tasks.d.ts +1 -1
  970. package/dist/hooks/query/use-sub-conversation-task-polling.d.ts +1 -1
  971. package/dist/hooks/query/use-sub-conversations.d.ts +1 -1
  972. package/dist/hooks/query/use-suggested-tasks.d.ts +1 -1
  973. package/dist/hooks/query/use-task-polling.d.ts +2 -2
  974. package/dist/hooks/query/use-unified-get-git-changes.d.ts +1 -1
  975. package/dist/hooks/query/use-unified-git-diff.d.ts +1 -1
  976. package/dist/hooks/query/use-user-conversation.d.ts +1 -1
  977. package/dist/hooks/query/use-workspace-file-content.d.ts +1 -1
  978. package/dist/hooks/use-backend-scoped-path.cjs +2 -0
  979. package/dist/hooks/use-backend-scoped-path.cjs.map +1 -0
  980. package/dist/hooks/use-backend-scoped-path.d.ts +10 -0
  981. package/dist/hooks/use-backend-scoped-path.js +13 -0
  982. package/dist/hooks/use-backend-scoped-path.js.map +1 -0
  983. package/dist/hooks/use-home-automation-actions.d.ts +23 -0
  984. package/dist/hooks/use-home-pinned-automations.d.ts +26 -0
  985. package/dist/hooks/use-tracking.cjs +1 -1
  986. package/dist/hooks/use-tracking.cjs.map +1 -1
  987. package/dist/hooks/use-tracking.d.ts +4 -0
  988. package/dist/hooks/use-tracking.js +6 -0
  989. package/dist/hooks/use-tracking.js.map +1 -1
  990. package/dist/i18n/declaration.cjs +1 -1
  991. package/dist/i18n/declaration.cjs.map +1 -1
  992. package/dist/i18n/declaration.d.ts +105 -2
  993. package/dist/i18n/declaration.js +1 -1
  994. package/dist/i18n/declaration.js.map +1 -1
  995. package/dist/i18n/translation.cjs +2 -2
  996. package/dist/i18n/translation.cjs.map +1 -1
  997. package/dist/i18n/translation.js +1813 -62
  998. package/dist/i18n/translation.js.map +1 -1
  999. package/dist/icons/code-pill.d.ts +1 -1
  1000. package/dist/icons/docker.cjs +2 -0
  1001. package/dist/icons/docker.cjs.map +1 -0
  1002. package/dist/icons/docker.js +19 -0
  1003. package/dist/icons/docker.js.map +1 -0
  1004. package/dist/icons/npm.cjs +2 -0
  1005. package/dist/icons/npm.cjs.map +1 -0
  1006. package/dist/icons/npm.js +19 -0
  1007. package/dist/icons/npm.js.map +1 -0
  1008. package/dist/locales/ar/openhands.json +108 -5
  1009. package/dist/locales/ca/openhands.json +108 -5
  1010. package/dist/locales/de/openhands.json +108 -5
  1011. package/dist/locales/en/openhands.json +108 -5
  1012. package/dist/locales/es/openhands.json +108 -5
  1013. package/dist/locales/fr/openhands.json +108 -5
  1014. package/dist/locales/it/openhands.json +108 -5
  1015. package/dist/locales/ja/openhands.json +108 -5
  1016. package/dist/locales/ko-KR/openhands.json +108 -5
  1017. package/dist/locales/no/openhands.json +108 -5
  1018. package/dist/locales/pt/openhands.json +108 -5
  1019. package/dist/locales/tr/openhands.json +108 -5
  1020. package/dist/locales/uk/openhands.json +108 -5
  1021. package/dist/locales/zh-CN/openhands.json +108 -5
  1022. package/dist/locales/zh-TW/openhands.json +108 -5
  1023. package/dist/manifests/automation-insights.d.ts +64 -0
  1024. package/dist/manifests/automation-interface.cjs +1 -1
  1025. package/dist/manifests/automation-interface.cjs.map +1 -1
  1026. package/dist/manifests/automation-interface.d.ts +33 -1
  1027. package/dist/manifests/automation-interface.js +2 -1
  1028. package/dist/manifests/automation-interface.js.map +1 -1
  1029. package/dist/manifests/interface-validation.cjs +1 -1
  1030. package/dist/manifests/interface-validation.cjs.map +1 -1
  1031. package/dist/manifests/interface-validation.js +228 -50
  1032. package/dist/manifests/interface-validation.js.map +1 -1
  1033. package/dist/manifests/manifest-template.d.ts +2 -0
  1034. package/dist/manifests/manifest-validation.cjs.map +1 -1
  1035. package/dist/manifests/manifest-validation.js.map +1 -1
  1036. package/dist/manifests/types.cjs +1 -1
  1037. package/dist/manifests/types.cjs.map +1 -1
  1038. package/dist/manifests/types.d.ts +128 -0
  1039. package/dist/manifests/types.js +35 -2
  1040. package/dist/manifests/types.js.map +1 -1
  1041. package/dist/mockServiceWorker.js +21 -9
  1042. package/dist/node_modules/@openhands/extensions/automations/catalog/upstream-fork-sync/manifest.cjs +9 -0
  1043. package/dist/node_modules/@openhands/extensions/automations/catalog/upstream-fork-sync/manifest.cjs.map +1 -0
  1044. package/dist/node_modules/@openhands/extensions/automations/catalog/upstream-fork-sync/manifest.js +74 -0
  1045. package/dist/node_modules/@openhands/extensions/automations/catalog/upstream-fork-sync/manifest.js.map +1 -0
  1046. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +1 -1
  1047. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -1
  1048. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +6 -4
  1049. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -1
  1050. package/dist/node_modules/@openhands/extensions/automations/interface.cjs +1 -1
  1051. package/dist/node_modules/@openhands/extensions/automations/interface.cjs.map +1 -1
  1052. package/dist/node_modules/@openhands/extensions/automations/interface.js +126 -5
  1053. package/dist/node_modules/@openhands/extensions/automations/interface.js.map +1 -1
  1054. package/dist/node_modules/@openhands/extensions/skills/index.cjs +161 -53
  1055. package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
  1056. package/dist/node_modules/@openhands/extensions/skills/index.js +112 -50
  1057. package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
  1058. package/dist/node_modules/@openhands/typescript-client/dist/index.cjs +1 -1
  1059. package/dist/node_modules/@openhands/typescript-client/dist/index.js +1 -1
  1060. package/dist/node_modules/@tanstack/query-core/build/modern/utils.cjs +1 -1
  1061. package/dist/node_modules/@tanstack/query-core/build/modern/utils.cjs.map +1 -1
  1062. package/dist/node_modules/@tanstack/query-core/build/modern/utils.js +12 -1
  1063. package/dist/node_modules/@tanstack/query-core/build/modern/utils.js.map +1 -1
  1064. package/dist/node_modules/@tanstack/react-query/build/modern/useBaseQuery.cjs +1 -1
  1065. package/dist/node_modules/@tanstack/react-query/build/modern/useBaseQuery.cjs.map +1 -1
  1066. package/dist/node_modules/@tanstack/react-query/build/modern/useBaseQuery.js +14 -12
  1067. package/dist/node_modules/@tanstack/react-query/build/modern/useBaseQuery.js.map +1 -1
  1068. package/dist/node_modules/html-parse-stringify/dist/esm/html-parse-stringify.cjs +2 -0
  1069. package/dist/node_modules/html-parse-stringify/dist/esm/html-parse-stringify.cjs.map +1 -0
  1070. package/dist/node_modules/html-parse-stringify/dist/esm/html-parse-stringify.js +177 -0
  1071. package/dist/node_modules/html-parse-stringify/dist/esm/html-parse-stringify.js.map +1 -0
  1072. package/dist/node_modules/i18next/dist/esm/i18next.cjs +1 -1
  1073. package/dist/node_modules/i18next/dist/esm/i18next.cjs.map +1 -1
  1074. package/dist/node_modules/i18next/dist/esm/i18next.js +31 -24
  1075. package/dist/node_modules/i18next/dist/esm/i18next.js.map +1 -1
  1076. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.cjs +2 -0
  1077. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.cjs.map +1 -0
  1078. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.js +16 -0
  1079. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.js.map +1 -0
  1080. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.cjs +2 -0
  1081. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.cjs.map +1 -0
  1082. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.js +27 -0
  1083. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.js.map +1 -0
  1084. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.cjs +2 -0
  1085. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.cjs.map +1 -0
  1086. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.js +21 -0
  1087. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.js.map +1 -0
  1088. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.cjs +2 -0
  1089. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.cjs.map +1 -0
  1090. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.js +23 -0
  1091. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.js.map +1 -0
  1092. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.cjs +2 -0
  1093. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.cjs.map +1 -0
  1094. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.js +43 -0
  1095. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.js.map +1 -0
  1096. package/dist/node_modules/lucide-react/dist/esm/icons/earth.cjs +2 -0
  1097. package/dist/node_modules/lucide-react/dist/esm/icons/earth.cjs.map +1 -0
  1098. package/dist/node_modules/lucide-react/dist/esm/icons/earth.js +25 -0
  1099. package/dist/node_modules/lucide-react/dist/esm/icons/earth.js.map +1 -0
  1100. package/dist/node_modules/lucide-react/dist/esm/icons/flag.cjs +2 -0
  1101. package/dist/node_modules/lucide-react/dist/esm/icons/flag.cjs.map +1 -0
  1102. package/dist/node_modules/lucide-react/dist/esm/icons/flag.js +9 -0
  1103. package/dist/node_modules/lucide-react/dist/esm/icons/flag.js.map +1 -0
  1104. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.cjs +2 -0
  1105. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.cjs.map +1 -0
  1106. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.js +27 -0
  1107. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.js.map +1 -0
  1108. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.cjs +2 -0
  1109. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.cjs.map +1 -0
  1110. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.js +25 -0
  1111. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.js.map +1 -0
  1112. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.cjs +2 -0
  1113. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.cjs.map +1 -0
  1114. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.js +30 -0
  1115. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.js.map +1 -0
  1116. package/dist/node_modules/lucide-react/dist/esm/icons/hash.cjs +2 -0
  1117. package/dist/node_modules/lucide-react/dist/esm/icons/hash.cjs.map +1 -0
  1118. package/dist/node_modules/lucide-react/dist/esm/icons/hash.js +35 -0
  1119. package/dist/node_modules/lucide-react/dist/esm/icons/hash.js.map +1 -0
  1120. package/dist/node_modules/lucide-react/dist/esm/icons/house.cjs +2 -0
  1121. package/dist/node_modules/lucide-react/dist/esm/icons/house.cjs.map +1 -0
  1122. package/dist/node_modules/lucide-react/dist/esm/icons/house.js +12 -0
  1123. package/dist/node_modules/lucide-react/dist/esm/icons/house.js.map +1 -0
  1124. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.cjs +2 -0
  1125. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.cjs.map +1 -0
  1126. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.js +33 -0
  1127. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.js.map +1 -0
  1128. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.cjs +2 -0
  1129. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.cjs.map +1 -0
  1130. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.js +15 -0
  1131. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.js.map +1 -0
  1132. package/dist/node_modules/lucide-react/dist/esm/icons/layers.cjs +2 -0
  1133. package/dist/node_modules/lucide-react/dist/esm/icons/layers.cjs.map +1 -0
  1134. package/dist/node_modules/lucide-react/dist/esm/icons/layers.js +19 -0
  1135. package/dist/node_modules/lucide-react/dist/esm/icons/layers.js.map +1 -0
  1136. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.cjs +2 -0
  1137. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.cjs.map +1 -0
  1138. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.js +22 -0
  1139. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.js.map +1 -0
  1140. package/dist/node_modules/lucide-react/dist/esm/icons/mails.cjs +2 -0
  1141. package/dist/node_modules/lucide-react/dist/esm/icons/mails.cjs.map +1 -0
  1142. package/dist/node_modules/lucide-react/dist/esm/icons/mails.js +23 -0
  1143. package/dist/node_modules/lucide-react/dist/esm/icons/mails.js.map +1 -0
  1144. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.cjs +2 -0
  1145. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.cjs.map +1 -0
  1146. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.js +12 -0
  1147. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.js.map +1 -0
  1148. package/dist/node_modules/lucide-react/dist/esm/icons/plug.cjs +2 -0
  1149. package/dist/node_modules/lucide-react/dist/esm/icons/plug.cjs.map +1 -0
  1150. package/dist/node_modules/lucide-react/dist/esm/icons/plug.js +23 -0
  1151. package/dist/node_modules/lucide-react/dist/esm/icons/plug.js.map +1 -0
  1152. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.cjs +2 -0
  1153. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.cjs.map +1 -0
  1154. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.js +27 -0
  1155. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.js.map +1 -0
  1156. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.cjs +2 -0
  1157. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.cjs.map +1 -0
  1158. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.js +23 -0
  1159. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.js.map +1 -0
  1160. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.cjs +2 -0
  1161. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.cjs.map +1 -0
  1162. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.js +21 -0
  1163. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.js.map +1 -0
  1164. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.cjs +2 -0
  1165. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.cjs.map +1 -0
  1166. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.js +43 -0
  1167. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.js.map +1 -0
  1168. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.cjs +2 -0
  1169. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.cjs.map +1 -0
  1170. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.js +19 -0
  1171. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.js.map +1 -0
  1172. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.cjs +2 -0
  1173. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.cjs.map +1 -0
  1174. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.js +27 -0
  1175. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.js.map +1 -0
  1176. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.cjs +2 -0
  1177. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.cjs.map +1 -0
  1178. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.js +9 -0
  1179. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.js.map +1 -0
  1180. package/dist/node_modules/lucide-react/dist/esm/icons/zap.cjs +2 -0
  1181. package/dist/node_modules/lucide-react/dist/esm/icons/zap.cjs.map +1 -0
  1182. package/dist/node_modules/lucide-react/dist/esm/icons/zap.js +9 -0
  1183. package/dist/node_modules/lucide-react/dist/esm/icons/zap.js.map +1 -0
  1184. package/dist/node_modules/posthog-js/dist/module.cjs +2 -2
  1185. package/dist/node_modules/posthog-js/dist/module.cjs.map +1 -1
  1186. package/dist/node_modules/posthog-js/dist/module.js +2055 -1929
  1187. package/dist/node_modules/posthog-js/dist/module.js.map +1 -1
  1188. package/dist/node_modules/react-i18next/dist/es/TransWithoutContext.cjs +1 -1
  1189. package/dist/node_modules/react-i18next/dist/es/TransWithoutContext.cjs.map +1 -1
  1190. package/dist/node_modules/react-i18next/dist/es/TransWithoutContext.js +43 -62
  1191. package/dist/node_modules/react-i18next/dist/es/TransWithoutContext.js.map +1 -1
  1192. package/dist/node_modules/react-i18next/dist/es/useTranslation.cjs +1 -1
  1193. package/dist/node_modules/react-i18next/dist/es/useTranslation.cjs.map +1 -1
  1194. package/dist/node_modules/react-i18next/dist/es/useTranslation.js +12 -6
  1195. package/dist/node_modules/react-i18next/dist/es/useTranslation.js.map +1 -1
  1196. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.cjs +1 -1
  1197. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.cjs.map +1 -1
  1198. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +352 -310
  1199. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -1
  1200. package/dist/package.cjs +1 -1
  1201. package/dist/package.cjs.map +1 -1
  1202. package/dist/package.js +39 -35
  1203. package/dist/package.js.map +1 -1
  1204. package/dist/routes/agent-settings.d.ts +3 -2
  1205. package/dist/routes/app-settings.d.ts +2 -1
  1206. package/dist/routes/browser-tab.d.ts +1 -1
  1207. package/dist/routes/changes-tab.d.ts +2 -1
  1208. package/dist/routes/commits-tab.d.ts +1 -1
  1209. package/dist/routes/conversation.d.ts +2 -1
  1210. package/dist/routes/files-tab.d.ts +1 -1
  1211. package/dist/routes/llm-settings.d.ts +3 -2
  1212. package/dist/routes/mcp.cjs +1 -1
  1213. package/dist/routes/mcp.cjs.map +1 -1
  1214. package/dist/routes/mcp.d.ts +2 -1
  1215. package/dist/routes/mcp.js +1 -1
  1216. package/dist/routes/mcp.js.map +1 -1
  1217. package/dist/routes/planner-tab.d.ts +2 -1
  1218. package/dist/routes/secrets-settings.d.ts +2 -1
  1219. package/dist/routes/task-list-tab.d.ts +1 -1
  1220. package/dist/services/child-conversation-launch.cjs +2 -0
  1221. package/dist/services/child-conversation-launch.cjs.map +1 -0
  1222. package/dist/services/child-conversation-launch.d.ts +41 -0
  1223. package/dist/services/child-conversation-launch.js +182 -0
  1224. package/dist/services/child-conversation-launch.js.map +1 -0
  1225. package/dist/services/settings.cjs +1 -1
  1226. package/dist/services/settings.cjs.map +1 -1
  1227. package/dist/services/settings.js +3 -7
  1228. package/dist/services/settings.js.map +1 -1
  1229. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  1230. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  1231. package/dist/stores/conversation-panel-preferences-store.d.ts +5 -1
  1232. package/dist/stores/conversation-panel-preferences-store.js +8 -2
  1233. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  1234. package/dist/types/agent-server/core/base/action.d.ts +17 -1
  1235. package/dist/types/agent-server/core/base/base.d.ts +2 -1
  1236. package/dist/types/agent-server/type-guards.cjs +1 -1
  1237. package/dist/types/agent-server/type-guards.cjs.map +1 -1
  1238. package/dist/types/agent-server/type-guards.d.ts +8 -1
  1239. package/dist/types/agent-server/type-guards.js +4 -3
  1240. package/dist/types/agent-server/type-guards.js.map +1 -1
  1241. package/dist/types/automation.d.ts +30 -1
  1242. package/dist/types/mcp-auth.cjs.map +1 -1
  1243. package/dist/types/mcp-auth.d.ts +5 -41
  1244. package/dist/types/mcp-auth.js.map +1 -1
  1245. package/dist/types/mcp-server.d.ts +17 -32
  1246. package/dist/types/settings.d.ts +8 -28
  1247. package/dist/ui/card-title.d.ts +1 -1
  1248. package/dist/ui/card.d.ts +1 -1
  1249. package/dist/ui/combobox-caret.d.ts +3 -3
  1250. package/dist/ui/context-menu.cjs +1 -1
  1251. package/dist/ui/context-menu.cjs.map +1 -1
  1252. package/dist/ui/context-menu.d.ts +3 -2
  1253. package/dist/ui/context-menu.js +10 -9
  1254. package/dist/ui/context-menu.js.map +1 -1
  1255. package/dist/ui/divider.d.ts +1 -1
  1256. package/dist/ui/dropdown/clear-button.d.ts +1 -1
  1257. package/dist/ui/dropdown/dropdown-input.d.ts +1 -1
  1258. package/dist/ui/dropdown/dropdown-menu.d.ts +1 -1
  1259. package/dist/ui/dropdown/dropdown.d.ts +1 -1
  1260. package/dist/ui/dropdown/loading-spinner.d.ts +1 -1
  1261. package/dist/ui/dropdown/toggle-button.d.ts +1 -1
  1262. package/dist/ui/help-link.d.ts +1 -1
  1263. package/dist/ui/pre.d.ts +1 -1
  1264. package/dist/ui/toggle-switch.d.ts +2 -2
  1265. package/dist/ui/typography.d.ts +7 -7
  1266. package/dist/utils/automation-activity-log-export.d.ts +17 -0
  1267. package/dist/utils/automation-timeout.d.ts +4 -6
  1268. package/dist/utils/custom-toast-handlers.cjs +1 -1
  1269. package/dist/utils/custom-toast-handlers.cjs.map +1 -1
  1270. package/dist/utils/custom-toast-handlers.d.ts +2 -2
  1271. package/dist/utils/custom-toast-handlers.js +18 -1
  1272. package/dist/utils/custom-toast-handlers.js.map +1 -1
  1273. package/dist/utils/format-relative-time.d.ts +3 -0
  1274. package/dist/utils/mcp-config.cjs +1 -1
  1275. package/dist/utils/mcp-config.cjs.map +1 -1
  1276. package/dist/utils/mcp-config.d.ts +12 -29
  1277. package/dist/utils/mcp-config.js +161 -143
  1278. package/dist/utils/mcp-config.js.map +1 -1
  1279. package/dist/utils/mcp-installed-servers.cjs +1 -1
  1280. package/dist/utils/mcp-installed-servers.cjs.map +1 -1
  1281. package/dist/utils/mcp-installed-servers.d.ts +2 -2
  1282. package/dist/utils/mcp-installed-servers.js +21 -32
  1283. package/dist/utils/mcp-installed-servers.js.map +1 -1
  1284. package/dist/utils/mcp-server-health-key.cjs.map +1 -1
  1285. package/dist/utils/mcp-server-health-key.d.ts +2 -4
  1286. package/dist/utils/mcp-server-health-key.js.map +1 -1
  1287. package/dist/utils/settings-like-page-layout-classes.cjs +1 -1
  1288. package/dist/utils/settings-like-page-layout-classes.cjs.map +1 -1
  1289. package/dist/utils/settings-like-page-layout-classes.d.ts +6 -2
  1290. package/dist/utils/settings-like-page-layout-classes.js +1 -1
  1291. package/dist/utils/settings-like-page-layout-classes.js.map +1 -1
  1292. package/dist/utils/skill-category.d.ts +12 -0
  1293. package/package.json +41 -35
  1294. package/scripts/brand-dev-electron.mjs +244 -0
  1295. package/scripts/check-sdk-version-sync.mjs +6 -6
  1296. package/scripts/check-translation-completeness.cjs +4 -0
  1297. package/scripts/dev-safe.mjs +2 -2
  1298. package/scripts/dev-with-automation.mjs +3 -2
  1299. package/scripts/generate-icons.mjs +109 -0
  1300. package/build/assets/Trans-Bwpzk1wT.js +0 -1
  1301. package/build/assets/active-backend-context-BiwzkzDy.js +0 -2
  1302. package/build/assets/agent-context-settings-DXNT_dcw.js +0 -1
  1303. package/build/assets/agent-server-conversation-service.api-CYSWw-2g.js +0 -41
  1304. package/build/assets/agent-settings-BjgQQe-_.js +0 -1
  1305. package/build/assets/alert-banner-DR8EVyZM.js +0 -1
  1306. package/build/assets/api-error-message-e16L1kwH.js +0 -1
  1307. package/build/assets/automation-detail-DY6x2FW1.js +0 -2
  1308. package/build/assets/automation-export-C09f-Lua.js +0 -2
  1309. package/build/assets/automation-setup-route-CqKp0717.js +0 -1
  1310. package/build/assets/automations-list-CqWJ7qXW.js +0 -1
  1311. package/build/assets/backend-form-modal-B8D5hBzK.js +0 -1
  1312. package/build/assets/check-CPLXgluF.js +0 -1
  1313. package/build/assets/chevron-down-CP4QHvyc.js +0 -1
  1314. package/build/assets/circle-check-Dpy2_xSI.js +0 -1
  1315. package/build/assets/command-menu-Bj6X4ckE.js +0 -1
  1316. package/build/assets/condenser-settings-EAXQNR2E.js +0 -1
  1317. package/build/assets/context-menu-list-item-CrCrYuPF.js +0 -1
  1318. package/build/assets/conversation-BzyIcSwr.js +0 -1
  1319. package/build/assets/conversation-panel-BzyIcSwr.js +0 -1
  1320. package/build/assets/copy-DCmZtz6n.js +0 -1
  1321. package/build/assets/entry.client-BbIYOsIg.js +0 -2
  1322. package/build/assets/enum-filter-dropdown-C08-srev.js +0 -1
  1323. package/build/assets/files-tab-DEq8MbHu.js +0 -1
  1324. package/build/assets/format-time-delta-CxfPJpzC.js +0 -1
  1325. package/build/assets/git-repo-dropdown-9WKINV6J.js +0 -1
  1326. package/build/assets/home-CY0JaxiY.js +0 -1
  1327. package/build/assets/home-CaNWlVvB.js +0 -1
  1328. package/build/assets/index-home-CaNWlVvB.js +0 -1
  1329. package/build/assets/info-CmWQXtRQ.js +0 -1
  1330. package/build/assets/install-server-modal-BWrudmZU.js +0 -1
  1331. package/build/assets/llm-not-configured-banner-3tMsM4K6.js +0 -27
  1332. package/build/assets/llm-settings-CXo8iPNW.js +0 -1
  1333. package/build/assets/llm-settings-D0W8mJDk.js +0 -1
  1334. package/build/assets/loader-circle-B4QDBARx.js +0 -1
  1335. package/build/assets/manifest-39f4789d.js +0 -1
  1336. package/build/assets/map-provider-CXU6issd.js +0 -1
  1337. package/build/assets/markdown-renderer-DgiLLhW6.js +0 -8
  1338. package/build/assets/mcp-DXG9LWrI.js +0 -9
  1339. package/build/assets/mcp-marketplace-utils-DFmhKc5s.js +0 -1
  1340. package/build/assets/messages-kBjKaAeA.js +0 -40
  1341. package/build/assets/navigation-link-Bxmn-pCs.js +0 -1
  1342. package/build/assets/onboarding-47hh2IHA.js +0 -1
  1343. package/build/assets/onboarding-modal-9BuvvROo.js +0 -1
  1344. package/build/assets/plus-DrKuuvMe.js +0 -1
  1345. package/build/assets/recommended-automations-launcher-ejxy1P27.js +0 -1
  1346. package/build/assets/root-5S-M8SYa.js +0 -2
  1347. package/build/assets/root-DZ39lS5f.css +0 -1
  1348. package/build/assets/root-layout-BPqoa0gv.js +0 -3
  1349. package/build/assets/search-Dc2qR4O2.js +0 -1
  1350. package/build/assets/settings-BRbnfKEm.js +0 -1
  1351. package/build/assets/settings-Chfn5xTD.js +0 -1
  1352. package/build/assets/settings-like-page-layout-classes-DyxyJ0k4.js +0 -1
  1353. package/build/assets/settings-service.api-CZiPD8__.js +0 -1
  1354. package/build/assets/sidebar-mobile-menu-toggle-ND-hgygu.js +0 -1
  1355. package/build/assets/sidebar-store-Bui-WNEr.js +0 -1
  1356. package/build/assets/skills-settings-B43KArIz.js +0 -2
  1357. package/build/assets/use-is-authed-BT7Iud4U.js +0 -1
  1358. package/build/assets/use-llm-profiles-2Wc2db8u.js +0 -1
  1359. package/build/assets/use-save-agent-profile-D0wC5ExW.js +0 -1
  1360. package/build/assets/use-settings-nav-items-DHAAD-zk.js +0 -16
  1361. package/build/assets/use-skills-CE6miQ3r.js +0 -1
  1362. package/build/assets/use-tracking-BGboadaZ.js +0 -68
  1363. package/build/assets/useQuery-DiPh8LRJ.js +0 -1
  1364. package/build/assets/utils-BgGG1znF.js +0 -1
  1365. package/build/assets/v4-DDdyfk2q.js +0 -1
  1366. package/build/assets/vendor~browser-IVYgIgG1.js +0 -47
  1367. package/build/assets/vendor~entry.client-CXM9oiAk.js +0 -1
  1368. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~d4by102p-C2f0ZhS-.js +0 -26
  1369. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~emdr2jt4-BrmgjeOw.js +0 -1
  1370. package/build/assets/vendor~module-BZXjBMvd.js +0 -2
  1371. package/build/assets/x-omAzpXkl.js +0 -1
  1372. package/dist/components/features/skills/skill-type-filter.d.ts +0 -3
  1373. package/dist/components/features/skills/skills-type-filter-dropdown.d.ts +0 -7
  1374. package/dist/node_modules/html-parse-stringify/dist/html-parse-stringify.module.cjs +0 -2
  1375. package/dist/node_modules/html-parse-stringify/dist/html-parse-stringify.module.cjs.map +0 -1
  1376. package/dist/node_modules/html-parse-stringify/dist/html-parse-stringify.module.js +0 -81
  1377. package/dist/node_modules/html-parse-stringify/dist/html-parse-stringify.module.js.map +0 -1
  1378. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.cjs +0 -2
  1379. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.cjs.map +0 -1
  1380. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js +0 -9
  1381. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js.map +0 -1
  1382. package/dist/node_modules/void-elements/index.cjs +0 -2
  1383. package/dist/node_modules/void-elements/index.cjs.map +0 -1
  1384. package/dist/node_modules/void-elements/index.js +0 -25
  1385. package/dist/node_modules/void-elements/index.js.map +0 -1
  1386. /package/build/assets/{vendor~root-layout~index-home~home~mcp~automations-list~automation-setup-route~onboarding-modal-D7IDevqN.js → vendor~root-layout~index-home~home~mcp~automations-list~automation-templates~automation-set~bxsimjx0-D7IDevqN.js} +0 -0
@@ -0,0 +1,93 @@
1
+ import { CHILD_CONVERSATION_ISOLATIONS as e, CHILD_CONVERSATION_RESULT_PREFIX as t, CHILD_CONVERSATION_TARGETS as n, LAUNCH_CHILD_CONVERSATION_TOOL_NAME as r } from "../constants/child-conversation.js";
2
+ var i = {
3
+ name: r,
4
+ description: `Start a NEW, independent conversation to work on a well-scoped task in parallel with this one, without the user having to run any CLI command. The new conversation is recorded as a child of this one.
5
+
6
+ The child runs on its own. It does not block you, you do not see its output,
7
+ and it cannot see this conversation's history — everything it needs must be in
8
+ the task brief.
9
+
10
+ Choosing target:
11
+
12
+ * target="local" — runs on the same machine, in this conversation's workspace.
13
+ Fast, no repository clone, no sandbox provisioning. Use this by default when
14
+ the work is on code that is already checked out here.
15
+
16
+ * target="cloud" — runs on OpenHands Cloud in its own isolated sandbox, from a
17
+ git repository. Use this when the work should not touch the user's machine or
18
+ when it needs a repository that is not checked out locally. Requires the user
19
+ to have an OpenHands Cloud backend connected in Agent Canvas; if none is
20
+ connected you will be told so and should fall back to target="local".
21
+
22
+ Writing the task brief:
23
+
24
+ * Put everything the child needs in "task": the goal, the relevant file paths,
25
+ the constraints, the expected deliverable, and how it should report back.
26
+ * Keep each child's scope independent of its siblings so parallel children do
27
+ not fight over the same files.
28
+ * One call per delegated task. Do NOT call this tool twice for the same task.
29
+
30
+ Parameter rules (a call that breaks one of these launches nothing and comes
31
+ back with corrective guidance):
32
+
33
+ * "repository" and "branch" apply to target="cloud" only. A local child always
34
+ inherits this conversation's workspace, so do not pass them with
35
+ target="local".
36
+ * "isolation" applies to target="local" only. Cloud sandboxes are always
37
+ isolated, so do not pass it with target="cloud".
38
+ * isolation="worktree" (the default) gives the child its own git worktree and
39
+ branch, cut from the repository's default branch — it will NOT see this
40
+ conversation's uncommitted or committed work. isolation="shared" puts the
41
+ child in this conversation's exact directory; only choose it when the child
42
+ genuinely must see work in progress, and expect the two agents to conflict.
43
+
44
+ What comes back: this tool is acknowledged immediately, before the conversation
45
+ exists. The real outcome arrives moments later as a follow-up message starting
46
+ with "${t.trim()}" that carries the child's
47
+ conversation id, URL, target and initial status — or an error with guidance.
48
+ Wait for it, then tell the user what you launched and give them the URL. If it
49
+ reports an error, fix the parameters and call this tool again.`,
50
+ parameters: {
51
+ type: "object",
52
+ additionalProperties: !1,
53
+ properties: {
54
+ target: {
55
+ type: "string",
56
+ enum: [...n],
57
+ description: "Where the child runs. 'local' reuses this machine and this conversation's workspace; 'cloud' runs in an isolated OpenHands Cloud sandbox."
58
+ },
59
+ task: {
60
+ type: "string",
61
+ description: "Self-contained task brief, sent as the child's first message. The child cannot see this conversation, so state the goal, constraints, expected output and handoff criteria."
62
+ },
63
+ title: {
64
+ type: "string",
65
+ description: "Optional short title for the child conversation. Omit to let it title itself from the task."
66
+ },
67
+ repository: {
68
+ type: "string",
69
+ description: "target='cloud' only. Repository to clone into the sandbox, as 'owner/repo'. Defaults to this conversation's repository when it has one."
70
+ },
71
+ branch: {
72
+ type: "string",
73
+ description: "target='cloud' only, and only together with 'repository'. Defaults to the repository's default branch."
74
+ },
75
+ isolation: {
76
+ type: "string",
77
+ enum: [...e],
78
+ description: "target='local' only. 'worktree' (default) gives the child its own git worktree and branch; 'shared' runs it in this conversation's exact directory."
79
+ }
80
+ },
81
+ required: ["target", "task"]
82
+ },
83
+ annotations: {
84
+ readOnlyHint: !1,
85
+ destructiveHint: !1,
86
+ idempotentHint: !1,
87
+ openWorldHint: !0
88
+ }
89
+ };
90
+ //#endregion
91
+ export { i as LAUNCH_CHILD_CONVERSATION_CLIENT_TOOL };
92
+
93
+ //# sourceMappingURL=launch-child-conversation-client-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-child-conversation-client-tool.js","names":[],"sources":["../../src/api/launch-child-conversation-client-tool.ts"],"sourcesContent":["import {\n CHILD_CONVERSATION_ISOLATIONS,\n CHILD_CONVERSATION_RESULT_PREFIX,\n CHILD_CONVERSATION_TARGETS,\n LAUNCH_CHILD_CONVERSATION_TOOL_NAME,\n} from \"#/constants/child-conversation\";\nimport type { ClientToolSpec } from \"./canvas-ui-client-tool\";\n\nexport {\n LAUNCH_CHILD_CONVERSATION_ACTION_KIND,\n LAUNCH_CHILD_CONVERSATION_TOOL_NAME,\n} from \"#/constants/child-conversation\";\n\nconst LAUNCH_CHILD_CONVERSATION_DESCRIPTION = `Start a NEW, independent conversation to work on a well-scoped task in parallel with this one, without the user having to run any CLI command. The new conversation is recorded as a child of this one.\n\nThe child runs on its own. It does not block you, you do not see its output,\nand it cannot see this conversation's history — everything it needs must be in\nthe task brief.\n\nChoosing target:\n\n* target=\"local\" — runs on the same machine, in this conversation's workspace.\n Fast, no repository clone, no sandbox provisioning. Use this by default when\n the work is on code that is already checked out here.\n\n* target=\"cloud\" — runs on OpenHands Cloud in its own isolated sandbox, from a\n git repository. Use this when the work should not touch the user's machine or\n when it needs a repository that is not checked out locally. Requires the user\n to have an OpenHands Cloud backend connected in Agent Canvas; if none is\n connected you will be told so and should fall back to target=\"local\".\n\nWriting the task brief:\n\n* Put everything the child needs in \"task\": the goal, the relevant file paths,\n the constraints, the expected deliverable, and how it should report back.\n* Keep each child's scope independent of its siblings so parallel children do\n not fight over the same files.\n* One call per delegated task. Do NOT call this tool twice for the same task.\n\nParameter rules (a call that breaks one of these launches nothing and comes\nback with corrective guidance):\n\n* \"repository\" and \"branch\" apply to target=\"cloud\" only. A local child always\n inherits this conversation's workspace, so do not pass them with\n target=\"local\".\n* \"isolation\" applies to target=\"local\" only. Cloud sandboxes are always\n isolated, so do not pass it with target=\"cloud\".\n* isolation=\"worktree\" (the default) gives the child its own git worktree and\n branch, cut from the repository's default branch — it will NOT see this\n conversation's uncommitted or committed work. isolation=\"shared\" puts the\n child in this conversation's exact directory; only choose it when the child\n genuinely must see work in progress, and expect the two agents to conflict.\n\nWhat comes back: this tool is acknowledged immediately, before the conversation\nexists. The real outcome arrives moments later as a follow-up message starting\nwith \"${CHILD_CONVERSATION_RESULT_PREFIX.trim()}\" that carries the child's\nconversation id, URL, target and initial status — or an error with guidance.\nWait for it, then tell the user what you launched and give them the URL. If it\nreports an error, fix the parameters and call this tool again.`;\n\nexport const LAUNCH_CHILD_CONVERSATION_CLIENT_TOOL: ClientToolSpec = {\n name: LAUNCH_CHILD_CONVERSATION_TOOL_NAME,\n description: LAUNCH_CHILD_CONVERSATION_DESCRIPTION,\n parameters: {\n type: \"object\",\n additionalProperties: false,\n properties: {\n target: {\n type: \"string\",\n enum: [...CHILD_CONVERSATION_TARGETS],\n description:\n \"Where the child runs. 'local' reuses this machine and this conversation's workspace; 'cloud' runs in an isolated OpenHands Cloud sandbox.\",\n },\n task: {\n type: \"string\",\n description:\n \"Self-contained task brief, sent as the child's first message. The child cannot see this conversation, so state the goal, constraints, expected output and handoff criteria.\",\n },\n title: {\n type: \"string\",\n description:\n \"Optional short title for the child conversation. Omit to let it title itself from the task.\",\n },\n repository: {\n type: \"string\",\n description:\n \"target='cloud' only. Repository to clone into the sandbox, as 'owner/repo'. Defaults to this conversation's repository when it has one.\",\n },\n branch: {\n type: \"string\",\n description:\n \"target='cloud' only, and only together with 'repository'. Defaults to the repository's default branch.\",\n },\n isolation: {\n type: \"string\",\n enum: [...CHILD_CONVERSATION_ISOLATIONS],\n description:\n \"target='local' only. 'worktree' (default) gives the child its own git worktree and branch; 'shared' runs it in this conversation's exact directory.\",\n },\n },\n required: [\"target\", \"task\"],\n },\n annotations: {\n // Launching a conversation writes real state and is not repeatable, so the\n // agent is asked to predict a security risk before every call.\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n // The cloud target reaches OpenHands Cloud.\n openWorldHint: true,\n },\n};\n"],"mappings":";AA4DA,IAAa,IAAwD;CACnE,MAAM;CACN,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAPP,EAAiC,KAAK,EAAE;;;;CAQ9C,YAAY;EACV,MAAM;EACN,sBAAsB;EACtB,YAAY;GACV,QAAQ;IACN,MAAM;IACN,MAAM,CAAC,GAAG,CAA0B;IACpC,aACE;GACJ;GACA,MAAM;IACJ,MAAM;IACN,aACE;GACJ;GACA,OAAO;IACL,MAAM;IACN,aACE;GACJ;GACA,YAAY;IACV,MAAM;IACN,aACE;GACJ;GACA,QAAQ;IACN,MAAM;IACN,aACE;GACJ;GACA,WAAW;IACT,MAAM;IACN,MAAM,CAAC,GAAG,CAA6B;IACvC,aACE;GACJ;EACF;EACA,UAAU,CAAC,UAAU,MAAM;CAC7B;CACA,aAAa;EAGX,cAAc;EACd,iBAAiB;EACjB,gBAAgB;EAEhB,eAAe;CACjB;AACF"}
@@ -1,2 +1,2 @@
1
- require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../utils/mcp-config.cjs"),t=require("../settings-service/settings-service.api.cjs"),n=require("../../types/mcp-auth.cjs");var r=e=>!!e&&typeof e==`object`&&!Array.isArray(e),i=e=>{if(!r(e))return;let t=Object.entries(e).filter(e=>typeof e[1]==`string`);return t.length>0?Object.fromEntries(t):void 0},a=e=>!!e&&Object.values(e).some(e=>e===`**********`),o=(e,t)=>e===`sse`?t===`sse`:e===`shttp`?t===void 0||t===`http`||t===`shttp`||t===`streamable-http`:!1,s=e=>{if(!e)return;let t=/^stdio-(\d+)$/.exec(e);return t?Number.parseInt(t[1],10):void 0},c=(e,t)=>{let n=s(e);if(n!==void 0)return Object.entries(t).filter(([,e])=>!e.url)[n]?.[1]},l=(e,t)=>e.type===`stdio`?c(e.id,t)??(e.name?t[e.name]:void 0):e.name&&t[e.name]?t[e.name]:Object.values(t).find(t=>t.url===e.url&&o(e.type,t.transport));async function u(e){let n=(await t.default.fetchSettingsFromApi(`encrypted`)).agent_settings?.mcp_config;if(r(n))return l(e,n)}async function d(t){let r=t.type===`stdio`&&a(t.env),o=(t.type===`sse`||t.type===`shttp`)&&e.hasRedactedMcpSecretLeaf(t.auth);if(!r&&!o)return t;try{let e=await u(t);if(!e)return t;if(r){let n=i(e.env)??{},r=Object.fromEntries(Object.entries(t.env??{}).map(([e,t])=>[e,t===`**********`&&typeof n[e]==`string`?n[e]:t]));return{...t,env:r}}return o&&n.isMcpAuthCredential(e.auth)?{...t,auth:e.auth}:t}catch{return t}}exports.substituteRedactedMcpCredentials=d;
1
+ require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../types/mcp-auth.cjs"),t=require("../../utils/mcp-config.cjs"),n=require("../settings-service/settings-service.api.cjs");var r=e=>!!e&&typeof e==`object`&&!Array.isArray(e),i=e=>{if(!r(e))return;let t=Object.entries(e).filter(e=>typeof e[1]==`string`);return t.length>0?Object.fromEntries(t):void 0},a=e=>!!e&&Object.values(e).some(e=>e===`**********`);function o(e,t){if(!r(e))return e;let n=r(t)?t:{},i={...e};for(let[t,a]of Object.entries(e))if(a===`**********`){let e=n[t];typeof e==`string`&&e!==`**********`&&(i[t]=e)}else r(a)&&(i[t]=o(a,n[t]));return i}var s=(e,t)=>t[e.id];async function c(e){let t=(await n.default.fetchSettingsFromApi(`encrypted`)).agent_settings?.mcp_config;if(r(t))return s(e,t)}async function l(n){let r=n.type===`stdio`&&a(n.env),s=(n.type===`sse`||n.type===`shttp`)&&t.hasRedactedMcpSecretLeaf(n.auth),l=(n.type===`sse`||n.type===`shttp`)&&a(n.headers);if(!r&&!s&&!l)return n;try{let t=await c(n);if(!t)return n;if(r){let e=i(t.env)??{},r=Object.fromEntries(Object.entries(n.env??{}).map(([t,n])=>[t,n===`**********`&&typeof e[t]==`string`?e[t]:n]));return{...n,env:r}}let a={...n};if(s&&e.isMcpAuthCredential(t.auth)&&(a.auth=o(n.auth,t.auth)),l){let e=i(t.headers)??{};a.headers=Object.fromEntries(Object.entries(n.headers??{}).map(([t,n])=>[t,n===`**********`&&typeof e[t]==`string`?e[t]:n]))}return a}catch{return n}}exports.substituteRedactedMcpCredentials=l;
2
2
  //# sourceMappingURL=mcp-redacted-credentials.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-redacted-credentials.cjs","names":[],"sources":["../../../src/api/mcp-service/mcp-redacted-credentials.ts"],"sourcesContent":["import SettingsService from \"#/api/settings-service/settings-service.api\";\nimport { isMcpAuthCredential } from \"#/types/mcp-auth\";\nimport type { MCPServerConfig } from \"#/types/mcp-server\";\nimport {\n hasRedactedMcpSecretLeaf,\n REDACTED_MCP_SECRET_VALUE,\n} from \"#/utils/mcp-config\";\n\ntype StoredMcpServer = {\n url?: unknown;\n transport?: unknown;\n env?: unknown;\n auth?: unknown;\n headers?: unknown;\n};\n\ntype StoredMcpConfig = Record<string, StoredMcpServer>;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === \"object\" && !Array.isArray(value);\n\nconst stringRecord = (value: unknown): Record<string, string> | undefined => {\n if (!isRecord(value)) return undefined;\n const entries = Object.entries(value).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n );\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n};\n\nconst hasRedactedValue = (values: Record<string, string> | undefined) =>\n !!values &&\n Object.values(values).some((value) => value === REDACTED_MCP_SECRET_VALUE);\n\nconst remoteTransportMatches = (\n type: MCPServerConfig[\"type\"],\n transport: unknown,\n) => {\n if (type === \"sse\") return transport === \"sse\";\n if (type === \"shttp\") {\n return (\n transport === undefined ||\n transport === \"http\" ||\n transport === \"shttp\" ||\n transport === \"streamable-http\"\n );\n }\n return false;\n};\n\n// The editor assigns each stdio server an id of the form ``stdio-<i>`` matching\n// its position in ``parseMcpConfig``'s stdio array. That position is stable\n// across a rename because ``parseMcpConfig`` collects stdio entries (those\n// without a ``url``) in ``Object.entries`` order, identical for the redacted\n// and encrypted settings. Resolve the original stored entry by position so a\n// renamed stdio server still finds its stored encrypted env, instead of\n// looking it up by the new (no-longer-matching) display name.\nconst stdioIndexFromId = (id: string | undefined): number | undefined => {\n if (!id) return undefined;\n const match = /^stdio-(\\d+)$/.exec(id);\n return match ? Number.parseInt(match[1], 10) : undefined;\n};\n\nconst findStoredStdioByIndex = (\n id: string | undefined,\n storedServers: StoredMcpConfig,\n): StoredMcpServer | undefined => {\n const index = stdioIndexFromId(id);\n if (index === undefined) return undefined;\n const stdioEntries = Object.entries(storedServers).filter(\n ([, stored]) => !stored.url,\n );\n return stdioEntries[index]?.[1];\n};\n\nconst findStoredServer = (\n server: MCPServerConfig,\n storedServers: StoredMcpConfig,\n): StoredMcpServer | undefined => {\n if (server.type === \"stdio\") {\n // Prefer the positional id: a rename changes the display name (the stored\n // dict key), and a rename onto an existing name would otherwise restore the\n // wrong server's secrets. Fall back to a name match only when no id-based\n // position is available (e.g. configs built without an editor-assigned id).\n return (\n findStoredStdioByIndex(server.id, storedServers) ??\n (server.name ? storedServers[server.name] : undefined)\n );\n }\n\n if (server.name && storedServers[server.name]) {\n return storedServers[server.name];\n }\n\n return Object.values(storedServers).find(\n (stored) =>\n stored.url === server.url &&\n remoteTransportMatches(server.type, stored.transport),\n );\n};\n\nasync function fetchEncryptedStoredServer(\n server: MCPServerConfig,\n): Promise<StoredMcpServer | undefined> {\n const response = await SettingsService.fetchSettingsFromApi(\"encrypted\");\n const mcpConfig = response.agent_settings?.mcp_config;\n if (!isRecord(mcpConfig)) {\n return undefined;\n }\n return findStoredServer(server, mcpConfig as StoredMcpConfig);\n}\n\n/**\n * The MCP editor sees redacted settings (`**********`). When the user leaves\n * a secret unchanged, replace that placeholder with the stored encrypted\n * env/header/OAuth state value so tests and saves round-trip the real\n * credential without exposing plaintext in the browser.\n */\nexport async function substituteRedactedMcpCredentials(\n server: MCPServerConfig,\n): Promise<MCPServerConfig> {\n const redactedStdioEnv =\n server.type === \"stdio\" && hasRedactedValue(server.env);\n const redactedRemoteAuth =\n (server.type === \"sse\" || server.type === \"shttp\") &&\n hasRedactedMcpSecretLeaf(server.auth);\n\n if (!redactedStdioEnv && !redactedRemoteAuth) {\n return server;\n }\n\n try {\n const stored = await fetchEncryptedStoredServer(server);\n if (!stored) return server;\n\n if (redactedStdioEnv) {\n const storedEnv = stringRecord(stored.env) ?? {};\n const env = Object.fromEntries(\n Object.entries(server.env ?? {}).map(([key, value]) => [\n key,\n value === REDACTED_MCP_SECRET_VALUE &&\n typeof storedEnv[key] === \"string\"\n ? storedEnv[key]\n : value,\n ]),\n );\n return { ...server, env };\n }\n\n if (!redactedRemoteAuth) return server;\n if (isMcpAuthCredential(stored.auth)) {\n return { ...server, auth: stored.auth };\n }\n return server;\n } catch {\n return server;\n }\n}\n"],"mappings":"8LAkBA,IAAM,EAAY,GAChB,CAAC,CAAC,GAAS,OAAO,GAAU,UAAY,CAAC,MAAM,QAAQ,CAAK,EAExD,EAAgB,GAAuD,CAC3E,GAAI,CAAC,EAAS,CAAK,EAAG,OACtB,IAAM,EAAU,OAAO,QAAQ,CAAK,EAAE,OACnC,GAAqC,OAAO,EAAM,IAAO,QAC5D,EACA,OAAO,EAAQ,OAAS,EAAI,OAAO,YAAY,CAAO,EAAI,IAAA,EAC5D,EAEM,EAAoB,GACxB,CAAC,CAAC,GACF,OAAO,OAAO,CAAM,EAAE,KAAM,GAAU,IAAA,YAAmC,EAErE,GACJ,EACA,IAEI,IAAS,MAAc,IAAc,MACrC,IAAS,QAET,IAAc,IAAA,IACd,IAAc,QACd,IAAc,SACd,IAAc,kBAGX,GAUH,EAAoB,GAA+C,CACvE,GAAI,CAAC,EAAI,OACT,IAAM,EAAQ,gBAAgB,KAAK,CAAE,EACrC,OAAO,EAAQ,OAAO,SAAS,EAAM,GAAI,EAAE,EAAI,IAAA,EACjD,EAEM,GACJ,EACA,IACgC,CAChC,IAAM,EAAQ,EAAiB,CAAE,EAC7B,OAAU,IAAA,GAId,OAHqB,OAAO,QAAQ,CAAa,EAAE,QAChD,EAAG,KAAY,CAAC,EAAO,GAEnB,EAAa,KAAS,EAC/B,EAEM,GACJ,EACA,IAEI,EAAO,OAAS,QAMhB,EAAuB,EAAO,GAAI,CAAa,IAC9C,EAAO,KAAO,EAAc,EAAO,MAAQ,IAAA,IAI5C,EAAO,MAAQ,EAAc,EAAO,MAC/B,EAAc,EAAO,MAGvB,OAAO,OAAO,CAAa,EAAE,KACjC,GACC,EAAO,MAAQ,EAAO,KACtB,EAAuB,EAAO,KAAM,EAAO,SAAS,CACxD,EAGF,eAAe,EACb,EACsC,CAEtC,IAAM,GAAY,MADK,EAAA,QAAgB,qBAAqB,WAAW,GAC5C,gBAAgB,WACtC,KAAS,CAAS,EAGvB,OAAO,EAAiB,EAAQ,CAA4B,CAC9D,CAQA,eAAsB,EACpB,EAC0B,CAC1B,IAAM,EACJ,EAAO,OAAS,SAAW,EAAiB,EAAO,GAAG,EAClD,GACH,EAAO,OAAS,OAAS,EAAO,OAAS,UAC1C,EAAA,yBAAyB,EAAO,IAAI,EAEtC,GAAI,CAAC,GAAoB,CAAC,EACxB,OAAO,EAGT,GAAI,CACF,IAAM,EAAS,MAAM,EAA2B,CAAM,EACtD,GAAI,CAAC,EAAQ,OAAO,EAEpB,GAAI,EAAkB,CACpB,IAAM,EAAY,EAAa,EAAO,GAAG,GAAK,CAAC,EACzC,EAAM,OAAO,YACjB,OAAO,QAAQ,EAAO,KAAO,CAAC,CAAC,EAAE,KAAK,CAAC,EAAK,KAAW,CACrD,EACA,IAAA,cACA,OAAO,EAAU,IAAS,SACtB,EAAU,GACV,CACN,CAAC,CACH,EACA,MAAO,CAAE,GAAG,EAAQ,KAAI,CAC1B,CAMA,OAJK,GACD,EAAA,oBAAoB,EAAO,IAAI,EAC1B,CAAE,GAAG,EAAQ,KAAM,EAAO,IAAK,EAEjC,CACT,MAAQ,CACN,OAAO,CACT,CACF"}
1
+ {"version":3,"file":"mcp-redacted-credentials.cjs","names":[],"sources":["../../../src/api/mcp-service/mcp-redacted-credentials.ts"],"sourcesContent":["import SettingsService from \"#/api/settings-service/settings-service.api\";\nimport { isMcpAuthCredential } from \"#/types/mcp-auth\";\nimport type { MCPServerConfig } from \"#/types/mcp-server\";\nimport {\n hasRedactedMcpSecretLeaf,\n REDACTED_MCP_SECRET_VALUE,\n} from \"#/utils/mcp-config\";\n\ntype StoredMcpServer = {\n url?: unknown;\n transport?: unknown;\n env?: unknown;\n auth?: unknown;\n headers?: unknown;\n};\n\ntype StoredMcpConfig = Record<string, StoredMcpServer>;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === \"object\" && !Array.isArray(value);\n\nconst stringRecord = (value: unknown): Record<string, string> | undefined => {\n if (!isRecord(value)) return undefined;\n const entries = Object.entries(value).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n );\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n};\n\nconst hasRedactedValue = (values: Record<string, string> | undefined) =>\n !!values &&\n Object.values(values).some((value) => value === REDACTED_MCP_SECRET_VALUE);\n\n/**\n * Recursively replace only the redacted display placeholders inside\n * ``submitted`` with the corresponding stored (encrypted) leaf. Fresh\n * non-redacted edits and untouched structure are preserved verbatim, so a\n * probe request exercises the server exactly as it will be persisted.\n */\nfunction substituteRedactedLeaves<T>(submitted: T, stored: unknown): T {\n if (!isRecord(submitted)) return submitted;\n\n const storedRecord = isRecord(stored) ? stored : {};\n const merged: Record<string, unknown> = { ...submitted };\n for (const [key, value] of Object.entries(submitted)) {\n if (value === REDACTED_MCP_SECRET_VALUE) {\n const storedValue = storedRecord[key];\n if (\n typeof storedValue === \"string\" &&\n storedValue !== REDACTED_MCP_SECRET_VALUE\n ) {\n merged[key] = storedValue;\n }\n } else if (isRecord(value)) {\n merged[key] = substituteRedactedLeaves(value, storedRecord[key]);\n }\n }\n return merged as T;\n}\n\nconst findStoredServer = (\n server: MCPServerConfig,\n storedServers: StoredMcpConfig,\n): StoredMcpServer | undefined => storedServers[server.id];\n\nasync function fetchEncryptedStoredServer(\n server: MCPServerConfig,\n): Promise<StoredMcpServer | undefined> {\n const response = await SettingsService.fetchSettingsFromApi(\"encrypted\");\n const mcpConfig = response.agent_settings?.mcp_config;\n if (!isRecord(mcpConfig)) {\n return undefined;\n }\n return findStoredServer(server, mcpConfig as StoredMcpConfig);\n}\n\n/**\n * The MCP editor sees redacted settings (`**********`). When the user leaves\n * a secret unchanged, replace that placeholder with the stored encrypted\n * env/header/OAuth state value so a connectivity test can exercise the real\n * credential without exposing plaintext in the browser. Persistence never\n * calls this helper; sparse settings patches omit unchanged secrets.\n */\nexport async function substituteRedactedMcpCredentials(\n server: MCPServerConfig,\n): Promise<MCPServerConfig> {\n const redactedStdioEnv =\n server.type === \"stdio\" && hasRedactedValue(server.env);\n const redactedRemoteAuth =\n (server.type === \"sse\" || server.type === \"shttp\") &&\n hasRedactedMcpSecretLeaf(server.auth);\n const redactedRemoteHeaders =\n (server.type === \"sse\" || server.type === \"shttp\") &&\n hasRedactedValue(server.headers);\n\n if (!redactedStdioEnv && !redactedRemoteAuth && !redactedRemoteHeaders) {\n return server;\n }\n\n try {\n const stored = await fetchEncryptedStoredServer(server);\n if (!stored) return server;\n\n if (redactedStdioEnv) {\n const storedEnv = stringRecord(stored.env) ?? {};\n const env = Object.fromEntries(\n Object.entries(server.env ?? {}).map(([key, value]) => [\n key,\n value === REDACTED_MCP_SECRET_VALUE &&\n typeof storedEnv[key] === \"string\"\n ? storedEnv[key]\n : value,\n ]),\n );\n return { ...server, env };\n }\n\n const nextServer = { ...server };\n if (redactedRemoteAuth && isMcpAuthCredential(stored.auth)) {\n nextServer.auth = substituteRedactedLeaves(server.auth, stored.auth);\n }\n if (redactedRemoteHeaders) {\n const storedHeaders = stringRecord(stored.headers) ?? {};\n nextServer.headers = Object.fromEntries(\n Object.entries(server.headers ?? {}).map(([key, value]) => [\n key,\n value === REDACTED_MCP_SECRET_VALUE &&\n typeof storedHeaders[key] === \"string\"\n ? storedHeaders[key]\n : value,\n ]),\n );\n }\n return nextServer;\n } catch {\n return server;\n }\n}\n"],"mappings":"8LAkBA,IAAM,EAAY,GAChB,CAAC,CAAC,GAAS,OAAO,GAAU,UAAY,CAAC,MAAM,QAAQ,CAAK,EAExD,EAAgB,GAAuD,CAC3E,GAAI,CAAC,EAAS,CAAK,EAAG,OACtB,IAAM,EAAU,OAAO,QAAQ,CAAK,EAAE,OACnC,GAAqC,OAAO,EAAM,IAAO,QAC5D,EACA,OAAO,EAAQ,OAAS,EAAI,OAAO,YAAY,CAAO,EAAI,IAAA,EAC5D,EAEM,EAAoB,GACxB,CAAC,CAAC,GACF,OAAO,OAAO,CAAM,EAAE,KAAM,GAAU,IAAA,YAAmC,EAQ3E,SAAS,EAA4B,EAAc,EAAoB,CACrE,GAAI,CAAC,EAAS,CAAS,EAAG,OAAO,EAEjC,IAAM,EAAe,EAAS,CAAM,EAAI,EAAS,CAAC,EAC5C,EAAkC,CAAE,GAAG,CAAU,EACvD,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,CAAS,EACjD,GAAI,IAAA,aAAqC,CACvC,IAAM,EAAc,EAAa,GAE/B,OAAO,GAAgB,UACvB,IAAA,eAEA,EAAO,GAAO,EAElB,MAAW,EAAS,CAAK,IACvB,EAAO,GAAO,EAAyB,EAAO,EAAa,EAAI,GAGnE,OAAO,CACT,CAEA,IAAM,GACJ,EACA,IACgC,EAAc,EAAO,IAEvD,eAAe,EACb,EACsC,CAEtC,IAAM,GAAY,MADK,EAAA,QAAgB,qBAAqB,WAAW,GAC5C,gBAAgB,WACtC,KAAS,CAAS,EAGvB,OAAO,EAAiB,EAAQ,CAA4B,CAC9D,CASA,eAAsB,EACpB,EAC0B,CAC1B,IAAM,EACJ,EAAO,OAAS,SAAW,EAAiB,EAAO,GAAG,EAClD,GACH,EAAO,OAAS,OAAS,EAAO,OAAS,UAC1C,EAAA,yBAAyB,EAAO,IAAI,EAChC,GACH,EAAO,OAAS,OAAS,EAAO,OAAS,UAC1C,EAAiB,EAAO,OAAO,EAEjC,GAAI,CAAC,GAAoB,CAAC,GAAsB,CAAC,EAC/C,OAAO,EAGT,GAAI,CACF,IAAM,EAAS,MAAM,EAA2B,CAAM,EACtD,GAAI,CAAC,EAAQ,OAAO,EAEpB,GAAI,EAAkB,CACpB,IAAM,EAAY,EAAa,EAAO,GAAG,GAAK,CAAC,EACzC,EAAM,OAAO,YACjB,OAAO,QAAQ,EAAO,KAAO,CAAC,CAAC,EAAE,KAAK,CAAC,EAAK,KAAW,CACrD,EACA,IAAA,cACA,OAAO,EAAU,IAAS,SACtB,EAAU,GACV,CACN,CAAC,CACH,EACA,MAAO,CAAE,GAAG,EAAQ,KAAI,CAC1B,CAEA,IAAM,EAAa,CAAE,GAAG,CAAO,EAI/B,GAHI,GAAsB,EAAA,oBAAoB,EAAO,IAAI,IACvD,EAAW,KAAO,EAAyB,EAAO,KAAM,EAAO,IAAI,GAEjE,EAAuB,CACzB,IAAM,EAAgB,EAAa,EAAO,OAAO,GAAK,CAAC,EACvD,EAAW,QAAU,OAAO,YAC1B,OAAO,QAAQ,EAAO,SAAW,CAAC,CAAC,EAAE,KAAK,CAAC,EAAK,KAAW,CACzD,EACA,IAAA,cACA,OAAO,EAAc,IAAS,SAC1B,EAAc,GACd,CACN,CAAC,CACH,CACF,CACA,OAAO,CACT,MAAQ,CACN,OAAO,CACT,CACF"}
@@ -2,7 +2,8 @@ import type { MCPServerConfig } from "#/types/mcp-server";
2
2
  /**
3
3
  * The MCP editor sees redacted settings (`**********`). When the user leaves
4
4
  * a secret unchanged, replace that placeholder with the stored encrypted
5
- * env/header/OAuth state value so tests and saves round-trip the real
6
- * credential without exposing plaintext in the browser.
5
+ * env/header/OAuth state value so a connectivity test can exercise the real
6
+ * credential without exposing plaintext in the browser. Persistence never
7
+ * calls this helper; sparse settings patches omit unchanged secrets.
7
8
  */
8
9
  export declare function substituteRedactedMcpCredentials(server: MCPServerConfig): Promise<MCPServerConfig>;
@@ -1,45 +1,50 @@
1
- import { hasRedactedMcpSecretLeaf as e } from "../../utils/mcp-config.js";
2
- import t from "../settings-service/settings-service.api.js";
3
- import { isMcpAuthCredential as n } from "../../types/mcp-auth.js";
1
+ import { isMcpAuthCredential as e } from "../../types/mcp-auth.js";
2
+ import { hasRedactedMcpSecretLeaf as t } from "../../utils/mcp-config.js";
3
+ import n from "../settings-service/settings-service.api.js";
4
4
  //#region src/api/mcp-service/mcp-redacted-credentials.ts
5
5
  var r = (e) => !!e && typeof e == "object" && !Array.isArray(e), i = (e) => {
6
6
  if (!r(e)) return;
7
7
  let t = Object.entries(e).filter((e) => typeof e[1] == "string");
8
8
  return t.length > 0 ? Object.fromEntries(t) : void 0;
9
- }, a = (e) => !!e && Object.values(e).some((e) => e === "**********"), o = (e, t) => e === "sse" ? t === "sse" : e === "shttp" ? t === void 0 || t === "http" || t === "shttp" || t === "streamable-http" : !1, s = (e) => {
10
- if (!e) return;
11
- let t = /^stdio-(\d+)$/.exec(e);
12
- return t ? Number.parseInt(t[1], 10) : void 0;
13
- }, c = (e, t) => {
14
- let n = s(e);
15
- if (n !== void 0) return Object.entries(t).filter(([, e]) => !e.url)[n]?.[1];
16
- }, l = (e, t) => e.type === "stdio" ? c(e.id, t) ?? (e.name ? t[e.name] : void 0) : e.name && t[e.name] ? t[e.name] : Object.values(t).find((t) => t.url === e.url && o(e.type, t.transport));
17
- async function u(e) {
18
- let n = (await t.fetchSettingsFromApi("encrypted")).agent_settings?.mcp_config;
19
- if (r(n)) return l(e, n);
9
+ }, a = (e) => !!e && Object.values(e).some((e) => e === "**********");
10
+ function o(e, t) {
11
+ if (!r(e)) return e;
12
+ let n = r(t) ? t : {}, i = { ...e };
13
+ for (let [t, a] of Object.entries(e)) if (a === "**********") {
14
+ let e = n[t];
15
+ typeof e == "string" && e !== "**********" && (i[t] = e);
16
+ } else r(a) && (i[t] = o(a, n[t]));
17
+ return i;
20
18
  }
21
- async function d(t) {
22
- let r = t.type === "stdio" && a(t.env), o = (t.type === "sse" || t.type === "shttp") && e(t.auth);
23
- if (!r && !o) return t;
19
+ var s = (e, t) => t[e.id];
20
+ async function c(e) {
21
+ let t = (await n.fetchSettingsFromApi("encrypted")).agent_settings?.mcp_config;
22
+ if (r(t)) return s(e, t);
23
+ }
24
+ async function l(n) {
25
+ let r = n.type === "stdio" && a(n.env), s = (n.type === "sse" || n.type === "shttp") && t(n.auth), l = (n.type === "sse" || n.type === "shttp") && a(n.headers);
26
+ if (!r && !s && !l) return n;
24
27
  try {
25
- let e = await u(t);
26
- if (!e) return t;
28
+ let t = await c(n);
29
+ if (!t) return n;
27
30
  if (r) {
28
- let n = i(e.env) ?? {}, r = Object.fromEntries(Object.entries(t.env ?? {}).map(([e, t]) => [e, t === "**********" && typeof n[e] == "string" ? n[e] : t]));
31
+ let e = i(t.env) ?? {}, r = Object.fromEntries(Object.entries(n.env ?? {}).map(([t, n]) => [t, n === "**********" && typeof e[t] == "string" ? e[t] : n]));
29
32
  return {
30
- ...t,
33
+ ...n,
31
34
  env: r
32
35
  };
33
36
  }
34
- return o && n(e.auth) ? {
35
- ...t,
36
- auth: e.auth
37
- } : t;
37
+ let a = { ...n };
38
+ if (s && e(t.auth) && (a.auth = o(n.auth, t.auth)), l) {
39
+ let e = i(t.headers) ?? {};
40
+ a.headers = Object.fromEntries(Object.entries(n.headers ?? {}).map(([t, n]) => [t, n === "**********" && typeof e[t] == "string" ? e[t] : n]));
41
+ }
42
+ return a;
38
43
  } catch {
39
- return t;
44
+ return n;
40
45
  }
41
46
  }
42
47
  //#endregion
43
- export { d as substituteRedactedMcpCredentials };
48
+ export { l as substituteRedactedMcpCredentials };
44
49
 
45
50
  //# sourceMappingURL=mcp-redacted-credentials.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-redacted-credentials.js","names":[],"sources":["../../../src/api/mcp-service/mcp-redacted-credentials.ts"],"sourcesContent":["import SettingsService from \"#/api/settings-service/settings-service.api\";\nimport { isMcpAuthCredential } from \"#/types/mcp-auth\";\nimport type { MCPServerConfig } from \"#/types/mcp-server\";\nimport {\n hasRedactedMcpSecretLeaf,\n REDACTED_MCP_SECRET_VALUE,\n} from \"#/utils/mcp-config\";\n\ntype StoredMcpServer = {\n url?: unknown;\n transport?: unknown;\n env?: unknown;\n auth?: unknown;\n headers?: unknown;\n};\n\ntype StoredMcpConfig = Record<string, StoredMcpServer>;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === \"object\" && !Array.isArray(value);\n\nconst stringRecord = (value: unknown): Record<string, string> | undefined => {\n if (!isRecord(value)) return undefined;\n const entries = Object.entries(value).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n );\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n};\n\nconst hasRedactedValue = (values: Record<string, string> | undefined) =>\n !!values &&\n Object.values(values).some((value) => value === REDACTED_MCP_SECRET_VALUE);\n\nconst remoteTransportMatches = (\n type: MCPServerConfig[\"type\"],\n transport: unknown,\n) => {\n if (type === \"sse\") return transport === \"sse\";\n if (type === \"shttp\") {\n return (\n transport === undefined ||\n transport === \"http\" ||\n transport === \"shttp\" ||\n transport === \"streamable-http\"\n );\n }\n return false;\n};\n\n// The editor assigns each stdio server an id of the form ``stdio-<i>`` matching\n// its position in ``parseMcpConfig``'s stdio array. That position is stable\n// across a rename because ``parseMcpConfig`` collects stdio entries (those\n// without a ``url``) in ``Object.entries`` order, identical for the redacted\n// and encrypted settings. Resolve the original stored entry by position so a\n// renamed stdio server still finds its stored encrypted env, instead of\n// looking it up by the new (no-longer-matching) display name.\nconst stdioIndexFromId = (id: string | undefined): number | undefined => {\n if (!id) return undefined;\n const match = /^stdio-(\\d+)$/.exec(id);\n return match ? Number.parseInt(match[1], 10) : undefined;\n};\n\nconst findStoredStdioByIndex = (\n id: string | undefined,\n storedServers: StoredMcpConfig,\n): StoredMcpServer | undefined => {\n const index = stdioIndexFromId(id);\n if (index === undefined) return undefined;\n const stdioEntries = Object.entries(storedServers).filter(\n ([, stored]) => !stored.url,\n );\n return stdioEntries[index]?.[1];\n};\n\nconst findStoredServer = (\n server: MCPServerConfig,\n storedServers: StoredMcpConfig,\n): StoredMcpServer | undefined => {\n if (server.type === \"stdio\") {\n // Prefer the positional id: a rename changes the display name (the stored\n // dict key), and a rename onto an existing name would otherwise restore the\n // wrong server's secrets. Fall back to a name match only when no id-based\n // position is available (e.g. configs built without an editor-assigned id).\n return (\n findStoredStdioByIndex(server.id, storedServers) ??\n (server.name ? storedServers[server.name] : undefined)\n );\n }\n\n if (server.name && storedServers[server.name]) {\n return storedServers[server.name];\n }\n\n return Object.values(storedServers).find(\n (stored) =>\n stored.url === server.url &&\n remoteTransportMatches(server.type, stored.transport),\n );\n};\n\nasync function fetchEncryptedStoredServer(\n server: MCPServerConfig,\n): Promise<StoredMcpServer | undefined> {\n const response = await SettingsService.fetchSettingsFromApi(\"encrypted\");\n const mcpConfig = response.agent_settings?.mcp_config;\n if (!isRecord(mcpConfig)) {\n return undefined;\n }\n return findStoredServer(server, mcpConfig as StoredMcpConfig);\n}\n\n/**\n * The MCP editor sees redacted settings (`**********`). When the user leaves\n * a secret unchanged, replace that placeholder with the stored encrypted\n * env/header/OAuth state value so tests and saves round-trip the real\n * credential without exposing plaintext in the browser.\n */\nexport async function substituteRedactedMcpCredentials(\n server: MCPServerConfig,\n): Promise<MCPServerConfig> {\n const redactedStdioEnv =\n server.type === \"stdio\" && hasRedactedValue(server.env);\n const redactedRemoteAuth =\n (server.type === \"sse\" || server.type === \"shttp\") &&\n hasRedactedMcpSecretLeaf(server.auth);\n\n if (!redactedStdioEnv && !redactedRemoteAuth) {\n return server;\n }\n\n try {\n const stored = await fetchEncryptedStoredServer(server);\n if (!stored) return server;\n\n if (redactedStdioEnv) {\n const storedEnv = stringRecord(stored.env) ?? {};\n const env = Object.fromEntries(\n Object.entries(server.env ?? {}).map(([key, value]) => [\n key,\n value === REDACTED_MCP_SECRET_VALUE &&\n typeof storedEnv[key] === \"string\"\n ? storedEnv[key]\n : value,\n ]),\n );\n return { ...server, env };\n }\n\n if (!redactedRemoteAuth) return server;\n if (isMcpAuthCredential(stored.auth)) {\n return { ...server, auth: stored.auth };\n }\n return server;\n } catch {\n return server;\n }\n}\n"],"mappings":";;;;AAkBA,IAAM,KAAY,MAChB,CAAC,CAAC,KAAS,OAAO,KAAU,YAAY,CAAC,MAAM,QAAQ,CAAK,GAExD,KAAgB,MAAuD;CAC3E,IAAI,CAAC,EAAS,CAAK,GAAG;CACtB,IAAM,IAAU,OAAO,QAAQ,CAAK,EAAE,QACnC,MAAqC,OAAO,EAAM,MAAO,QAC5D;CACA,OAAO,EAAQ,SAAS,IAAI,OAAO,YAAY,CAAO,IAAI,KAAA;AAC5D,GAEM,KAAoB,MACxB,CAAC,CAAC,KACF,OAAO,OAAO,CAAM,EAAE,MAAM,MAAU,MAAA,YAAmC,GAErE,KACJ,GACA,MAEI,MAAS,QAAc,MAAc,QACrC,MAAS,UAET,MAAc,KAAA,KACd,MAAc,UACd,MAAc,WACd,MAAc,oBAGX,IAUH,KAAoB,MAA+C;CACvE,IAAI,CAAC,GAAI;CACT,IAAM,IAAQ,gBAAgB,KAAK,CAAE;CACrC,OAAO,IAAQ,OAAO,SAAS,EAAM,IAAI,EAAE,IAAI,KAAA;AACjD,GAEM,KACJ,GACA,MACgC;CAChC,IAAM,IAAQ,EAAiB,CAAE;CAC7B,UAAU,KAAA,GAId,OAHqB,OAAO,QAAQ,CAAa,EAAE,QAChD,GAAG,OAAY,CAAC,EAAO,GAEnB,EAAa,KAAS;AAC/B,GAEM,KACJ,GACA,MAEI,EAAO,SAAS,UAMhB,EAAuB,EAAO,IAAI,CAAa,MAC9C,EAAO,OAAO,EAAc,EAAO,QAAQ,KAAA,KAI5C,EAAO,QAAQ,EAAc,EAAO,QAC/B,EAAc,EAAO,QAGvB,OAAO,OAAO,CAAa,EAAE,MACjC,MACC,EAAO,QAAQ,EAAO,OACtB,EAAuB,EAAO,MAAM,EAAO,SAAS,CACxD;AAGF,eAAe,EACb,GACsC;CAEtC,IAAM,KAAY,MADK,EAAgB,qBAAqB,WAAW,GAC5C,gBAAgB;CACtC,MAAS,CAAS,GAGvB,OAAO,EAAiB,GAAQ,CAA4B;AAC9D;AAQA,eAAsB,EACpB,GAC0B;CAC1B,IAAM,IACJ,EAAO,SAAS,WAAW,EAAiB,EAAO,GAAG,GAClD,KACH,EAAO,SAAS,SAAS,EAAO,SAAS,YAC1C,EAAyB,EAAO,IAAI;CAEtC,IAAI,CAAC,KAAoB,CAAC,GACxB,OAAO;CAGT,IAAI;EACF,IAAM,IAAS,MAAM,EAA2B,CAAM;EACtD,IAAI,CAAC,GAAQ,OAAO;EAEpB,IAAI,GAAkB;GACpB,IAAM,IAAY,EAAa,EAAO,GAAG,KAAK,CAAC,GACzC,IAAM,OAAO,YACjB,OAAO,QAAQ,EAAO,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,GAAK,OAAW,CACrD,GACA,MAAA,gBACA,OAAO,EAAU,MAAS,WACtB,EAAU,KACV,CACN,CAAC,CACH;GACA,OAAO;IAAE,GAAG;IAAQ;GAAI;EAC1B;EAMA,OAJK,KACD,EAAoB,EAAO,IAAI,IAC1B;GAAE,GAAG;GAAQ,MAAM,EAAO;EAAK,IAEjC;CACT,QAAQ;EACN,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"mcp-redacted-credentials.js","names":[],"sources":["../../../src/api/mcp-service/mcp-redacted-credentials.ts"],"sourcesContent":["import SettingsService from \"#/api/settings-service/settings-service.api\";\nimport { isMcpAuthCredential } from \"#/types/mcp-auth\";\nimport type { MCPServerConfig } from \"#/types/mcp-server\";\nimport {\n hasRedactedMcpSecretLeaf,\n REDACTED_MCP_SECRET_VALUE,\n} from \"#/utils/mcp-config\";\n\ntype StoredMcpServer = {\n url?: unknown;\n transport?: unknown;\n env?: unknown;\n auth?: unknown;\n headers?: unknown;\n};\n\ntype StoredMcpConfig = Record<string, StoredMcpServer>;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === \"object\" && !Array.isArray(value);\n\nconst stringRecord = (value: unknown): Record<string, string> | undefined => {\n if (!isRecord(value)) return undefined;\n const entries = Object.entries(value).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n );\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n};\n\nconst hasRedactedValue = (values: Record<string, string> | undefined) =>\n !!values &&\n Object.values(values).some((value) => value === REDACTED_MCP_SECRET_VALUE);\n\n/**\n * Recursively replace only the redacted display placeholders inside\n * ``submitted`` with the corresponding stored (encrypted) leaf. Fresh\n * non-redacted edits and untouched structure are preserved verbatim, so a\n * probe request exercises the server exactly as it will be persisted.\n */\nfunction substituteRedactedLeaves<T>(submitted: T, stored: unknown): T {\n if (!isRecord(submitted)) return submitted;\n\n const storedRecord = isRecord(stored) ? stored : {};\n const merged: Record<string, unknown> = { ...submitted };\n for (const [key, value] of Object.entries(submitted)) {\n if (value === REDACTED_MCP_SECRET_VALUE) {\n const storedValue = storedRecord[key];\n if (\n typeof storedValue === \"string\" &&\n storedValue !== REDACTED_MCP_SECRET_VALUE\n ) {\n merged[key] = storedValue;\n }\n } else if (isRecord(value)) {\n merged[key] = substituteRedactedLeaves(value, storedRecord[key]);\n }\n }\n return merged as T;\n}\n\nconst findStoredServer = (\n server: MCPServerConfig,\n storedServers: StoredMcpConfig,\n): StoredMcpServer | undefined => storedServers[server.id];\n\nasync function fetchEncryptedStoredServer(\n server: MCPServerConfig,\n): Promise<StoredMcpServer | undefined> {\n const response = await SettingsService.fetchSettingsFromApi(\"encrypted\");\n const mcpConfig = response.agent_settings?.mcp_config;\n if (!isRecord(mcpConfig)) {\n return undefined;\n }\n return findStoredServer(server, mcpConfig as StoredMcpConfig);\n}\n\n/**\n * The MCP editor sees redacted settings (`**********`). When the user leaves\n * a secret unchanged, replace that placeholder with the stored encrypted\n * env/header/OAuth state value so a connectivity test can exercise the real\n * credential without exposing plaintext in the browser. Persistence never\n * calls this helper; sparse settings patches omit unchanged secrets.\n */\nexport async function substituteRedactedMcpCredentials(\n server: MCPServerConfig,\n): Promise<MCPServerConfig> {\n const redactedStdioEnv =\n server.type === \"stdio\" && hasRedactedValue(server.env);\n const redactedRemoteAuth =\n (server.type === \"sse\" || server.type === \"shttp\") &&\n hasRedactedMcpSecretLeaf(server.auth);\n const redactedRemoteHeaders =\n (server.type === \"sse\" || server.type === \"shttp\") &&\n hasRedactedValue(server.headers);\n\n if (!redactedStdioEnv && !redactedRemoteAuth && !redactedRemoteHeaders) {\n return server;\n }\n\n try {\n const stored = await fetchEncryptedStoredServer(server);\n if (!stored) return server;\n\n if (redactedStdioEnv) {\n const storedEnv = stringRecord(stored.env) ?? {};\n const env = Object.fromEntries(\n Object.entries(server.env ?? {}).map(([key, value]) => [\n key,\n value === REDACTED_MCP_SECRET_VALUE &&\n typeof storedEnv[key] === \"string\"\n ? storedEnv[key]\n : value,\n ]),\n );\n return { ...server, env };\n }\n\n const nextServer = { ...server };\n if (redactedRemoteAuth && isMcpAuthCredential(stored.auth)) {\n nextServer.auth = substituteRedactedLeaves(server.auth, stored.auth);\n }\n if (redactedRemoteHeaders) {\n const storedHeaders = stringRecord(stored.headers) ?? {};\n nextServer.headers = Object.fromEntries(\n Object.entries(server.headers ?? {}).map(([key, value]) => [\n key,\n value === REDACTED_MCP_SECRET_VALUE &&\n typeof storedHeaders[key] === \"string\"\n ? storedHeaders[key]\n : value,\n ]),\n );\n }\n return nextServer;\n } catch {\n return server;\n }\n}\n"],"mappings":";;;;AAkBA,IAAM,KAAY,MAChB,CAAC,CAAC,KAAS,OAAO,KAAU,YAAY,CAAC,MAAM,QAAQ,CAAK,GAExD,KAAgB,MAAuD;CAC3E,IAAI,CAAC,EAAS,CAAK,GAAG;CACtB,IAAM,IAAU,OAAO,QAAQ,CAAK,EAAE,QACnC,MAAqC,OAAO,EAAM,MAAO,QAC5D;CACA,OAAO,EAAQ,SAAS,IAAI,OAAO,YAAY,CAAO,IAAI,KAAA;AAC5D,GAEM,KAAoB,MACxB,CAAC,CAAC,KACF,OAAO,OAAO,CAAM,EAAE,MAAM,MAAU,MAAA,YAAmC;AAQ3E,SAAS,EAA4B,GAAc,GAAoB;CACrE,IAAI,CAAC,EAAS,CAAS,GAAG,OAAO;CAEjC,IAAM,IAAe,EAAS,CAAM,IAAI,IAAS,CAAC,GAC5C,IAAkC,EAAE,GAAG,EAAU;CACvD,KAAK,IAAM,CAAC,GAAK,MAAU,OAAO,QAAQ,CAAS,GACjD,IAAI,MAAA,cAAqC;EACvC,IAAM,IAAc,EAAa;EACjC,AACE,OAAO,KAAgB,YACvB,MAAA,iBAEA,EAAO,KAAO;CAElB,OAAO,AAAI,EAAS,CAAK,MACvB,EAAO,KAAO,EAAyB,GAAO,EAAa,EAAI;CAGnE,OAAO;AACT;AAEA,IAAM,KACJ,GACA,MACgC,EAAc,EAAO;AAEvD,eAAe,EACb,GACsC;CAEtC,IAAM,KAAY,MADK,EAAgB,qBAAqB,WAAW,GAC5C,gBAAgB;CACtC,MAAS,CAAS,GAGvB,OAAO,EAAiB,GAAQ,CAA4B;AAC9D;AASA,eAAsB,EACpB,GAC0B;CAC1B,IAAM,IACJ,EAAO,SAAS,WAAW,EAAiB,EAAO,GAAG,GAClD,KACH,EAAO,SAAS,SAAS,EAAO,SAAS,YAC1C,EAAyB,EAAO,IAAI,GAChC,KACH,EAAO,SAAS,SAAS,EAAO,SAAS,YAC1C,EAAiB,EAAO,OAAO;CAEjC,IAAI,CAAC,KAAoB,CAAC,KAAsB,CAAC,GAC/C,OAAO;CAGT,IAAI;EACF,IAAM,IAAS,MAAM,EAA2B,CAAM;EACtD,IAAI,CAAC,GAAQ,OAAO;EAEpB,IAAI,GAAkB;GACpB,IAAM,IAAY,EAAa,EAAO,GAAG,KAAK,CAAC,GACzC,IAAM,OAAO,YACjB,OAAO,QAAQ,EAAO,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,GAAK,OAAW,CACrD,GACA,MAAA,gBACA,OAAO,EAAU,MAAS,WACtB,EAAU,KACV,CACN,CAAC,CACH;GACA,OAAO;IAAE,GAAG;IAAQ;GAAI;EAC1B;EAEA,IAAM,IAAa,EAAE,GAAG,EAAO;EAI/B,IAHI,KAAsB,EAAoB,EAAO,IAAI,MACvD,EAAW,OAAO,EAAyB,EAAO,MAAM,EAAO,IAAI,IAEjE,GAAuB;GACzB,IAAM,IAAgB,EAAa,EAAO,OAAO,KAAK,CAAC;GACvD,EAAW,UAAU,OAAO,YAC1B,OAAO,QAAQ,EAAO,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,GAAK,OAAW,CACzD,GACA,MAAA,gBACA,OAAO,EAAc,MAAS,WAC1B,EAAc,KACd,CACN,CAAC,CACH;EACF;EACA,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF"}
@@ -1,2 +1,2 @@
1
- require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../node_modules/@openhands/typescript-client/dist/client/mcp-client.cjs");require("../../node_modules/@openhands/typescript-client/dist/clients.cjs");const t=require("../backend-registry/active-store.cjs"),n=require("../agent-server-client-options.cjs"),r=require("./mcp-redacted-credentials.cjs"),i=require("../../utils/mcp-credential-validation.cjs"),a=require("../../utils/redact-mcp-secrets.cjs");var o=120;function s(e){return e.type===`stdio`?{transport:`stdio`,command:e.command,...e.args?.length&&{args:e.args},...e.env&&Object.keys(e.env).length>0&&{env:e.env}}:{transport:e.type===`sse`?`sse`:`http`,url:e.url,...e.headers&&Object.keys(e.headers).length>0&&{headers:e.headers},...e.auth?{auth:e.auth}:{}}}function c(e){return e.auth?.strategy===`oauth2`?o:e.timeout}async function l(e){let t=i.getCredentialValidationForServer(e),n=await r.substituteRedactedMcpCredentials(e),a=s(n),o=c(e);return{request:{server:a,...e.name?{name:e.name}:{},...o===void 0?{}:{timeout:o},...t?{tool_call:t.toolCall}:{}},substituted:n}}function u(e,t){return e.ok?e.tool_result?{...e,tool_result:{...e.tool_result,text:a.redactMcpSecrets(e.tool_result.text,...t)}}:e:{...e,error:a.redactMcpSecrets(e.error,...t)}}function d(e,t,n){let r=u(e,n);if(r.ok&&t&&r.tool_result&&r.tools.includes(t.toolCall.name)){let e=t.interpret(r.tool_result);if(e)return{ok:!1,error:e,error_kind:`credentials`}}return r}function f(){if(t.getActiveBackend().backend.kind===`local`){let{host:e,apiKey:t}=n.getAgentServerClientOptions();return{host:e,...t?{apiKey:t}:{}}}let e=t.getRegisteredBackends().find(e=>e.kind===`local`&&e.host);if(e)return{host:e.host.replace(/\/+$/,``),...e.apiKey?{apiKey:e.apiKey}:{}};throw Error(`OAuth authorization requires a reachable local backend.`)}function p(){let{host:t,apiKey:n}=f();return new e.MCPClient({host:t,...n?{apiKey:n}:{},timeout:125e3})}function m(e){return e.status===`succeeded`?{ok:!0,tools:e.tools??[],...e.tool_result!==void 0&&{tool_result:e.tool_result},...e.oauth_state!==void 0&&{oauth_state:e.oauth_state}}:{ok:!1,error:e.error||`OAuth authorization did not complete`,error_kind:e.error_kind||`unknown`}}var h=e=>new Promise(t=>{window.setTimeout(t,e)}),g=class r{static async testServer(r){if(t.getActiveBackend().backend.kind===`cloud`)return{ok:!0,tools:[]};let a=i.getCredentialValidationForServer(r),{host:o,apiKey:s}=n.getAgentServerClientOptions(),c=new e.MCPClient({host:o,...s?{apiKey:s}:{}});try{let{request:e,substituted:t}=await l(r);return d(await c.testServer(e),a,[t,r])}finally{c.close()}}static async startOAuth(e){let t=p();try{return await r.startOAuthWithClient(t,e)}finally{t.close()}}static async getOAuthStatus(e){let t=p();try{return await r.getOAuthStatusWithClient(t,e)}finally{t.close()}}static async submitOAuthCallback(e,t){let n=p();try{return await r.submitOAuthCallbackWithClient(n,e,t)}finally{n.close()}}static async authorizeOAuth(e){let t=i.getCredentialValidationForServer(e),n=n=>d(n,t,[e]),a=window.open(`about:blank`,`_blank`),s=p();try{let t=await r.startOAuthWithClient(s,e);if(!t.ok||!t.job_id||!t.authorization_url)return a?.close(),n({ok:!1,error:t.error||`Could not start OAuth authorization`,error_kind:t.error_kind||`unknown`});let i=await r.getOAuthStatusWithClient(s,t.job_id);for(let e=0;e<20;e+=1){if(i.status===`succeeded`||i.status===`failed`)return a?.close(),n(m(i));if(i.callback_ready)break;await h(250),i=await r.getOAuthStatusWithClient(s,t.job_id)}a&&(a.location.href=t.authorization_url);for(let e=0;e<o;e+=1)if(await h(1e3),i=await r.getOAuthStatusWithClient(s,t.job_id),i.status===`succeeded`||i.status===`failed`)return a?.close(),n(m(i));return{ok:!1,error:`OAuth authorization timed out`,error_kind:`timeout`}}finally{s.close()}}static async startOAuthWithClient(e,t){let{request:n}=await l(t);return e.startOAuth(n)}static async getOAuthStatusWithClient(e,t){return await e.getOAuthStatus(t)}static async submitOAuthCallbackWithClient(e,t,n){return await e.submitOAuthCallback(t,{callback_url:n})}};exports.default=g;
1
+ require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../node_modules/@openhands/typescript-client/dist/client/mcp-client.cjs");require("../../node_modules/@openhands/typescript-client/dist/clients.cjs");const t=require("../backend-registry/active-store.cjs"),n=require("../agent-server-client-options.cjs"),r=require("../../utils/mcp-credential-validation.cjs"),i=require("../../utils/redact-mcp-secrets.cjs"),a=require("./mcp-redacted-credentials.cjs");var o=120;function s(e){return e.type===`stdio`?{type:`stdio`,command:e.command,...e.args?.length&&{args:e.args},...e.env&&Object.keys(e.env).length>0&&{env:e.env}}:{type:e.type===`sse`?`sse`:`http`,url:e.url,...e.headers&&Object.keys(e.headers).length>0&&{headers:e.headers},...e.auth?{auth:e.auth}:{}}}function c(e){return e.auth?.strategy===`oauth2`?o:e.timeout}async function l(e){let t=r.getCredentialValidationForServer(e),n=await a.substituteRedactedMcpCredentials(e),i=s(n),o=c(e);return{request:{server:i,...e.name?{name:e.name}:{},...o===void 0?{}:{timeout:o},...t?{tool_call:t.toolCall}:{}},substituted:n}}function u(e,t){return e.ok?e.tool_result?{...e,tool_result:{...e.tool_result,text:i.redactMcpSecrets(e.tool_result.text,...t)}}:e:{...e,error:i.redactMcpSecrets(e.error,...t)}}function d(e,t,n){let r=u(e,n);if(r.ok&&t&&r.tool_result&&r.tools.includes(t.toolCall.name)){let e=t.interpret(r.tool_result);if(e)return{ok:!1,error:e,error_kind:`credentials`}}return r}function f(){if(t.getActiveBackend().backend.kind===`local`){let{host:e,apiKey:t}=n.getAgentServerClientOptions();return{host:e,...t?{apiKey:t}:{}}}let e=t.getRegisteredBackends().find(e=>e.kind===`local`&&e.host);if(e)return{host:e.host.replace(/\/+$/,``),...e.apiKey?{apiKey:e.apiKey}:{}};throw Error(`OAuth authorization requires a reachable local backend.`)}function p(){let{host:t,apiKey:n}=f();return new e.MCPClient({host:t,...n?{apiKey:n}:{},timeout:125e3})}function m(e){return e.status===`succeeded`?{ok:!0,tools:e.tools??[],...e.tool_result!==void 0&&{tool_result:e.tool_result},...e.oauth_state!==void 0&&{oauth_state:e.oauth_state}}:{ok:!1,error:e.error||`OAuth authorization did not complete`,error_kind:e.error_kind||`unknown`}}var h=e=>new Promise(t=>{window.setTimeout(t,e)}),g=class i{static async testServer(i){if(t.getActiveBackend().backend.kind===`cloud`)return{ok:!0,tools:[]};let a=r.getCredentialValidationForServer(i),{host:o,apiKey:s}=n.getAgentServerClientOptions(),c=new e.MCPClient({host:o,...s?{apiKey:s}:{}});try{let{request:e,substituted:t}=await l(i);return d(await c.testServer(e),a,[t,i])}finally{c.close()}}static async startOAuth(e){let t=p();try{return await i.startOAuthWithClient(t,e)}finally{t.close()}}static async getOAuthStatus(e){let t=p();try{return await i.getOAuthStatusWithClient(t,e)}finally{t.close()}}static async submitOAuthCallback(e,t){let n=p();try{return await i.submitOAuthCallbackWithClient(n,e,t)}finally{n.close()}}static async authorizeOAuth(e){let t=r.getCredentialValidationForServer(e),n=n=>d(n,t,[e]),a=window.open(`about:blank`,`_blank`),s=p();try{let t=await i.startOAuthWithClient(s,e);if(!t.ok||!t.job_id||!t.authorization_url)return a?.close(),n({ok:!1,error:t.error||`Could not start OAuth authorization`,error_kind:t.error_kind||`unknown`});let r=await i.getOAuthStatusWithClient(s,t.job_id);for(let e=0;e<20;e+=1){if(r.status===`succeeded`||r.status===`failed`)return a?.close(),n(m(r));if(r.callback_ready)break;await h(250),r=await i.getOAuthStatusWithClient(s,t.job_id)}a&&(a.location.href=t.authorization_url);for(let e=0;e<o;e+=1)if(await h(1e3),r=await i.getOAuthStatusWithClient(s,t.job_id),r.status===`succeeded`||r.status===`failed`)return a?.close(),n(m(r));return{ok:!1,error:`OAuth authorization timed out`,error_kind:`timeout`}}finally{s.close()}}static async startOAuthWithClient(e,t){let{request:n}=await l(t);return e.startOAuth(n)}static async getOAuthStatusWithClient(e,t){return await e.getOAuthStatus(t)}static async submitOAuthCallbackWithClient(e,t,n){return await e.submitOAuthCallback(t,{callback_url:n})}};exports.default=g;
2
2
  //# sourceMappingURL=mcp-service.api.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-service.api.cjs","names":[],"sources":["../../../src/api/mcp-service/mcp-service.api.ts"],"sourcesContent":["import { MCPClient } from \"@openhands/typescript-client/clients\";\nimport type { MCPTestRequest } from \"@openhands/typescript-client\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\nimport {\n getActiveBackend,\n getRegisteredBackends,\n} from \"../backend-registry/active-store\";\nimport {\n getCredentialValidationForServer,\n type CredentialValidation,\n} from \"#/utils/mcp-credential-validation\";\nimport type { MCPAuthCredential } from \"#/types/mcp-auth\";\nimport type {\n ExtendedMCPTestResponse,\n MCPOAuthStartResponse,\n MCPOAuthStatusResponse,\n MCPServerConfig,\n} from \"#/types/mcp-server\";\nimport { redactMcpSecrets } from \"#/utils/redact-mcp-secrets\";\nimport { substituteRedactedMcpCredentials } from \"./mcp-redacted-credentials\";\n\nconst OAUTH_MCP_TEST_TIMEOUT_SECONDS = 120;\n\ntype MCPTestServer = {\n transport?: \"stdio\" | \"http\" | \"sse\";\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n url?: string;\n headers?: Record<string, string>;\n auth?: MCPAuthCredential;\n};\n\ninterface ExtendedMCPTestRequest {\n server: MCPTestServer;\n name?: string;\n timeout?: number;\n tool_call?: {\n name: string;\n arguments: Record<string, unknown>;\n };\n}\n\nfunction toMcpServer(server: MCPServerConfig): MCPTestServer {\n if (server.type === \"stdio\") {\n return {\n transport: \"stdio\",\n command: server.command!,\n ...(server.args?.length && { args: server.args }),\n ...(server.env &&\n Object.keys(server.env).length > 0 && { env: server.env }),\n };\n }\n return {\n transport: server.type === \"sse\" ? \"sse\" : \"http\",\n url: server.url!,\n ...(server.headers &&\n Object.keys(server.headers).length > 0 && { headers: server.headers }),\n ...(server.auth ? { auth: server.auth } : {}),\n };\n}\n\nfunction getMcpTestTimeout(server: MCPServerConfig): number | undefined {\n if (server.auth?.strategy !== \"oauth2\") return server.timeout;\n return OAUTH_MCP_TEST_TIMEOUT_SECONDS;\n}\n\nasync function buildMcpTestRequest(server: MCPServerConfig): Promise<{\n request: ExtendedMCPTestRequest;\n substituted: MCPServerConfig;\n}> {\n const validation = getCredentialValidationForServer(server);\n const substituted = await substituteRedactedMcpCredentials(server);\n const serverSpec = toMcpServer(substituted);\n const timeout = getMcpTestTimeout(server);\n return {\n request: {\n server: serverSpec,\n ...(server.name ? { name: server.name } : {}),\n ...(timeout !== undefined ? { timeout } : {}),\n ...(validation ? { tool_call: validation.toolCall } : {}),\n },\n substituted,\n };\n}\n\nfunction redactMcpTestResponse(\n result: ExtendedMCPTestResponse,\n redactionSources: (MCPServerConfig | undefined)[],\n): ExtendedMCPTestResponse {\n if (!result.ok) {\n return {\n ...result,\n error: redactMcpSecrets(result.error, ...redactionSources),\n };\n }\n if (result.tool_result) {\n return {\n ...result,\n tool_result: {\n ...result.tool_result,\n text: redactMcpSecrets(result.tool_result.text, ...redactionSources),\n },\n };\n }\n return result;\n}\n\n/**\n * Display-boundary post-processing shared by the test and OAuth probes:\n * scrub secrets from error/tool-result text, then let the catalog entry's\n * credential validation turn a failed read-only tool call into a\n * `credentials` failure. The interpretation only runs when the probe tool\n * is actually advertised in `tools` — a server variant that doesn't expose\n * the tool (e.g. a hosted alternative to the stdio server the spec was\n * written for) must degrade to a connectivity-only success, not be\n * misreported as bad credentials.\n */\nfunction finalizeMcpTestResponse(\n result: ExtendedMCPTestResponse,\n validation: CredentialValidation | undefined,\n redactionSources: (MCPServerConfig | undefined)[],\n): ExtendedMCPTestResponse {\n const redacted = redactMcpTestResponse(result, redactionSources);\n if (\n redacted.ok &&\n validation &&\n redacted.tool_result &&\n redacted.tools.includes(validation.toolCall.name)\n ) {\n const credentialError = validation.interpret(redacted.tool_result);\n if (credentialError) {\n return {\n ok: false,\n error: credentialError,\n error_kind: \"credentials\",\n };\n }\n }\n return redacted;\n}\n\nfunction getMcpProbeOptions(): { host: string; apiKey?: string } {\n const active = getActiveBackend().backend;\n if (active.kind === \"local\") {\n const { host, apiKey } = getAgentServerClientOptions();\n return { host, ...(apiKey ? { apiKey } : {}) };\n }\n\n const localBackend = getRegisteredBackends().find(\n (backend) => backend.kind === \"local\" && backend.host,\n );\n if (localBackend) {\n return {\n host: localBackend.host.replace(/\\/+$/, \"\"),\n ...(localBackend.apiKey ? { apiKey: localBackend.apiKey } : {}),\n };\n }\n throw new Error(\"OAuth authorization requires a reachable local backend.\");\n}\n\nfunction createMcpProbeClient(): MCPClient {\n const { host, apiKey } = getMcpProbeOptions();\n return new MCPClient({\n host,\n ...(apiKey ? { apiKey } : {}),\n timeout: OAUTH_MCP_TEST_TIMEOUT_SECONDS * 1000 + 5000,\n });\n}\n\nfunction oauthStatusToTestResponse(\n status: MCPOAuthStatusResponse,\n): ExtendedMCPTestResponse {\n if (status.status === \"succeeded\") {\n return {\n ok: true,\n tools: status.tools ?? [],\n ...(status.tool_result !== undefined && {\n tool_result: status.tool_result,\n }),\n ...(status.oauth_state !== undefined && {\n oauth_state: status.oauth_state,\n }),\n };\n }\n return {\n ok: false,\n error: status.error || \"OAuth authorization did not complete\",\n error_kind: status.error_kind || \"unknown\",\n };\n}\n\nconst sleep = (ms: number) =>\n new Promise<void>((resolve) => {\n window.setTimeout(resolve, ms);\n });\n\nclass McpService {\n static async testServer(\n server: MCPServerConfig,\n ): Promise<ExtendedMCPTestResponse> {\n // The MCP connectivity-test endpoint lives on the local agent-server. It\n // spawns the configured stdio command / opens an SSE-or-SHTTP connection\n // from that process's environment. Cloud backends don't expose this\n // endpoint to the frontend — the MCP server would actually run inside the\n // cloud sandbox, which isn't reachable from the browser before the user\n // starts a conversation. Calling `getAgentServerClientOptions()` here for\n // a cloud-active session would throw `NoBackendAvailableError(\"No backend\n // is configured.\")` and block the install flow entirely. Short-circuit\n // with a synthetic success so saving proceeds; any real connection\n // failure surfaces inside the conversation runtime instead.\n if (getActiveBackend().backend.kind === \"cloud\") {\n return { ok: true, tools: [] };\n }\n const validation = getCredentialValidationForServer(server);\n const { host, apiKey } = getAgentServerClientOptions();\n const client = new MCPClient({ host, ...(apiKey ? { apiKey } : {}) });\n try {\n const { request, substituted } = await buildMcpTestRequest(server);\n const result = (await client.testServer(\n request as MCPTestRequest,\n )) as ExtendedMCPTestResponse;\n // Redact against both config forms: `server` may hold fresh plaintext\n // input, `substituted` the stored (encrypted) round-trip values.\n return finalizeMcpTestResponse(result, validation, [substituted, server]);\n } finally {\n client.close();\n }\n }\n\n static async startOAuth(\n server: MCPServerConfig,\n ): Promise<MCPOAuthStartResponse> {\n const client = createMcpProbeClient();\n try {\n return await McpService.startOAuthWithClient(client, server);\n } finally {\n client.close();\n }\n }\n\n static async getOAuthStatus(jobId: string): Promise<MCPOAuthStatusResponse> {\n const client = createMcpProbeClient();\n try {\n return await McpService.getOAuthStatusWithClient(client, jobId);\n } finally {\n client.close();\n }\n }\n\n static async submitOAuthCallback(\n jobId: string,\n callbackUrl: string,\n ): Promise<MCPOAuthStatusResponse> {\n const client = createMcpProbeClient();\n try {\n return await McpService.submitOAuthCallbackWithClient(\n client,\n jobId,\n callbackUrl,\n );\n } finally {\n client.close();\n }\n }\n\n static async authorizeOAuth(\n server: MCPServerConfig,\n ): Promise<ExtendedMCPTestResponse> {\n const validation = getCredentialValidationForServer(server);\n const finalize = (result: ExtendedMCPTestResponse) =>\n finalizeMcpTestResponse(result, validation, [server]);\n const popup = window.open(\"about:blank\", \"_blank\");\n const client = createMcpProbeClient();\n try {\n const start = await McpService.startOAuthWithClient(client, server);\n if (!start.ok || !start.job_id || !start.authorization_url) {\n popup?.close();\n return finalize({\n ok: false,\n error: start.error || \"Could not start OAuth authorization\",\n error_kind: start.error_kind || \"unknown\",\n });\n }\n\n let status = await McpService.getOAuthStatusWithClient(\n client,\n start.job_id,\n );\n for (let attempt = 0; attempt < 20; attempt += 1) {\n if (status.status === \"succeeded\" || status.status === \"failed\") {\n popup?.close();\n return finalize(oauthStatusToTestResponse(status));\n }\n if (status.callback_ready) break;\n await sleep(250);\n status = await McpService.getOAuthStatusWithClient(\n client,\n start.job_id,\n );\n }\n\n if (popup) {\n popup.location.href = start.authorization_url;\n }\n\n for (\n let attempt = 0;\n attempt < OAUTH_MCP_TEST_TIMEOUT_SECONDS;\n attempt += 1\n ) {\n await sleep(1000);\n status = await McpService.getOAuthStatusWithClient(\n client,\n start.job_id,\n );\n if (status.status === \"succeeded\" || status.status === \"failed\") {\n popup?.close();\n return finalize(oauthStatusToTestResponse(status));\n }\n }\n\n return {\n ok: false,\n error: \"OAuth authorization timed out\",\n error_kind: \"timeout\",\n };\n } finally {\n client.close();\n }\n }\n\n private static async startOAuthWithClient(\n client: MCPClient,\n server: MCPServerConfig,\n ): Promise<MCPOAuthStartResponse> {\n const { request } = await buildMcpTestRequest(server);\n return client.startOAuth(request as MCPTestRequest);\n }\n\n // typescript-client 1.36 types the OAuth probes with the generated\n // agent-server models, which describe the opaque `oauth_state` JSON blobs as\n // `unknown` rather than the recursive `MCPJsonValue` the local types use. The\n // wire shape is unchanged, so narrow back to the app's boundary type.\n private static async getOAuthStatusWithClient(\n client: MCPClient,\n jobId: string,\n ): Promise<MCPOAuthStatusResponse> {\n return (await client.getOAuthStatus(jobId)) as MCPOAuthStatusResponse;\n }\n\n private static async submitOAuthCallbackWithClient(\n client: MCPClient,\n jobId: string,\n callbackUrl: string,\n ): Promise<MCPOAuthStatusResponse> {\n return (await client.submitOAuthCallback(jobId, {\n callback_url: callbackUrl,\n })) as MCPOAuthStatusResponse;\n }\n}\n\nexport default McpService;\n"],"mappings":"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"}
1
+ {"version":3,"file":"mcp-service.api.cjs","names":[],"sources":["../../../src/api/mcp-service/mcp-service.api.ts"],"sourcesContent":["import { MCPClient } from \"@openhands/typescript-client/clients\";\nimport type { AgentServerMCPTestRequest } from \"@openhands/typescript-client\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\nimport {\n getActiveBackend,\n getRegisteredBackends,\n} from \"../backend-registry/active-store\";\nimport {\n getCredentialValidationForServer,\n type CredentialValidation,\n} from \"#/utils/mcp-credential-validation\";\nimport type {\n ExtendedMCPTestResponse,\n MCPOAuthStartResponse,\n MCPOAuthStatusResponse,\n MCPServerConfig,\n} from \"#/types/mcp-server\";\nimport { redactMcpSecrets } from \"#/utils/redact-mcp-secrets\";\nimport { substituteRedactedMcpCredentials } from \"./mcp-redacted-credentials\";\n\nconst OAUTH_MCP_TEST_TIMEOUT_SECONDS = 120;\n\nfunction toMcpServer(\n server: MCPServerConfig,\n): AgentServerMCPTestRequest[\"server\"] {\n if (server.type === \"stdio\") {\n return {\n type: \"stdio\",\n command: server.command!,\n ...(server.args?.length && { args: server.args }),\n ...(server.env &&\n Object.keys(server.env).length > 0 && { env: server.env }),\n };\n }\n return {\n type: server.type === \"sse\" ? \"sse\" : \"http\",\n url: server.url!,\n ...(server.headers &&\n Object.keys(server.headers).length > 0 && { headers: server.headers }),\n ...(server.auth ? { auth: server.auth } : {}),\n };\n}\n\nfunction getMcpTestTimeout(server: MCPServerConfig): number | undefined {\n if (server.auth?.strategy !== \"oauth2\") return server.timeout;\n return OAUTH_MCP_TEST_TIMEOUT_SECONDS;\n}\n\nasync function buildMcpTestRequest(server: MCPServerConfig): Promise<{\n request: AgentServerMCPTestRequest;\n substituted: MCPServerConfig;\n}> {\n const validation = getCredentialValidationForServer(server);\n const substituted = await substituteRedactedMcpCredentials(server);\n const serverSpec = toMcpServer(substituted);\n const timeout = getMcpTestTimeout(server);\n return {\n request: {\n server: serverSpec,\n ...(server.name ? { name: server.name } : {}),\n ...(timeout !== undefined ? { timeout } : {}),\n ...(validation ? { tool_call: validation.toolCall } : {}),\n },\n substituted,\n };\n}\n\nfunction redactMcpTestResponse(\n result: ExtendedMCPTestResponse,\n redactionSources: (MCPServerConfig | undefined)[],\n): ExtendedMCPTestResponse {\n if (!result.ok) {\n return {\n ...result,\n error: redactMcpSecrets(result.error, ...redactionSources),\n };\n }\n if (result.tool_result) {\n return {\n ...result,\n tool_result: {\n ...result.tool_result,\n text: redactMcpSecrets(result.tool_result.text, ...redactionSources),\n },\n };\n }\n return result;\n}\n\n/**\n * Display-boundary post-processing shared by the test and OAuth probes:\n * scrub secrets from error/tool-result text, then let the catalog entry's\n * credential validation turn a failed read-only tool call into a\n * `credentials` failure. The interpretation only runs when the probe tool\n * is actually advertised in `tools` — a server variant that doesn't expose\n * the tool (e.g. a hosted alternative to the stdio server the spec was\n * written for) must degrade to a connectivity-only success, not be\n * misreported as bad credentials.\n */\nfunction finalizeMcpTestResponse(\n result: ExtendedMCPTestResponse,\n validation: CredentialValidation | undefined,\n redactionSources: (MCPServerConfig | undefined)[],\n): ExtendedMCPTestResponse {\n const redacted = redactMcpTestResponse(result, redactionSources);\n if (\n redacted.ok &&\n validation &&\n redacted.tool_result &&\n redacted.tools.includes(validation.toolCall.name)\n ) {\n const credentialError = validation.interpret(redacted.tool_result);\n if (credentialError) {\n return {\n ok: false,\n error: credentialError,\n error_kind: \"credentials\",\n };\n }\n }\n return redacted;\n}\n\nfunction getMcpProbeOptions(): { host: string; apiKey?: string } {\n const active = getActiveBackend().backend;\n if (active.kind === \"local\") {\n const { host, apiKey } = getAgentServerClientOptions();\n return { host, ...(apiKey ? { apiKey } : {}) };\n }\n\n const localBackend = getRegisteredBackends().find(\n (backend) => backend.kind === \"local\" && backend.host,\n );\n if (localBackend) {\n return {\n host: localBackend.host.replace(/\\/+$/, \"\"),\n ...(localBackend.apiKey ? { apiKey: localBackend.apiKey } : {}),\n };\n }\n throw new Error(\"OAuth authorization requires a reachable local backend.\");\n}\n\nfunction createMcpProbeClient(): MCPClient {\n const { host, apiKey } = getMcpProbeOptions();\n return new MCPClient({\n host,\n ...(apiKey ? { apiKey } : {}),\n timeout: OAUTH_MCP_TEST_TIMEOUT_SECONDS * 1000 + 5000,\n });\n}\n\nfunction oauthStatusToTestResponse(\n status: MCPOAuthStatusResponse,\n): ExtendedMCPTestResponse {\n if (status.status === \"succeeded\") {\n return {\n ok: true,\n tools: status.tools ?? [],\n ...(status.tool_result !== undefined && {\n tool_result: status.tool_result,\n }),\n ...(status.oauth_state !== undefined && {\n oauth_state: status.oauth_state,\n }),\n };\n }\n return {\n ok: false,\n error: status.error || \"OAuth authorization did not complete\",\n error_kind: status.error_kind || \"unknown\",\n };\n}\n\nconst sleep = (ms: number) =>\n new Promise<void>((resolve) => {\n window.setTimeout(resolve, ms);\n });\n\nclass McpService {\n static async testServer(\n server: MCPServerConfig,\n ): Promise<ExtendedMCPTestResponse> {\n // The MCP connectivity-test endpoint lives on the local agent-server. It\n // spawns the configured stdio command / opens an SSE-or-SHTTP connection\n // from that process's environment. Cloud backends don't expose this\n // endpoint to the frontend — the MCP server would actually run inside the\n // cloud sandbox, which isn't reachable from the browser before the user\n // starts a conversation. Calling `getAgentServerClientOptions()` here for\n // a cloud-active session would throw `NoBackendAvailableError(\"No backend\n // is configured.\")` and block the install flow entirely. Short-circuit\n // with a synthetic success so saving proceeds; any real connection\n // failure surfaces inside the conversation runtime instead.\n if (getActiveBackend().backend.kind === \"cloud\") {\n return { ok: true, tools: [] };\n }\n const validation = getCredentialValidationForServer(server);\n const { host, apiKey } = getAgentServerClientOptions();\n const client = new MCPClient({ host, ...(apiKey ? { apiKey } : {}) });\n try {\n const { request, substituted } = await buildMcpTestRequest(server);\n const result = (await client.testServer(\n request,\n )) as ExtendedMCPTestResponse;\n // Redact against both config forms: `server` may hold fresh plaintext\n // input, `substituted` the stored (encrypted) round-trip values.\n return finalizeMcpTestResponse(result, validation, [substituted, server]);\n } finally {\n client.close();\n }\n }\n\n static async startOAuth(\n server: MCPServerConfig,\n ): Promise<MCPOAuthStartResponse> {\n const client = createMcpProbeClient();\n try {\n return await McpService.startOAuthWithClient(client, server);\n } finally {\n client.close();\n }\n }\n\n static async getOAuthStatus(jobId: string): Promise<MCPOAuthStatusResponse> {\n const client = createMcpProbeClient();\n try {\n return await McpService.getOAuthStatusWithClient(client, jobId);\n } finally {\n client.close();\n }\n }\n\n static async submitOAuthCallback(\n jobId: string,\n callbackUrl: string,\n ): Promise<MCPOAuthStatusResponse> {\n const client = createMcpProbeClient();\n try {\n return await McpService.submitOAuthCallbackWithClient(\n client,\n jobId,\n callbackUrl,\n );\n } finally {\n client.close();\n }\n }\n\n static async authorizeOAuth(\n server: MCPServerConfig,\n ): Promise<ExtendedMCPTestResponse> {\n const validation = getCredentialValidationForServer(server);\n const finalize = (result: ExtendedMCPTestResponse) =>\n finalizeMcpTestResponse(result, validation, [server]);\n const popup = window.open(\"about:blank\", \"_blank\");\n const client = createMcpProbeClient();\n try {\n const start = await McpService.startOAuthWithClient(client, server);\n if (!start.ok || !start.job_id || !start.authorization_url) {\n popup?.close();\n return finalize({\n ok: false,\n error: start.error || \"Could not start OAuth authorization\",\n error_kind: start.error_kind || \"unknown\",\n });\n }\n\n let status = await McpService.getOAuthStatusWithClient(\n client,\n start.job_id,\n );\n for (let attempt = 0; attempt < 20; attempt += 1) {\n if (status.status === \"succeeded\" || status.status === \"failed\") {\n popup?.close();\n return finalize(oauthStatusToTestResponse(status));\n }\n if (status.callback_ready) break;\n await sleep(250);\n status = await McpService.getOAuthStatusWithClient(\n client,\n start.job_id,\n );\n }\n\n if (popup) {\n popup.location.href = start.authorization_url;\n }\n\n for (\n let attempt = 0;\n attempt < OAUTH_MCP_TEST_TIMEOUT_SECONDS;\n attempt += 1\n ) {\n await sleep(1000);\n status = await McpService.getOAuthStatusWithClient(\n client,\n start.job_id,\n );\n if (status.status === \"succeeded\" || status.status === \"failed\") {\n popup?.close();\n return finalize(oauthStatusToTestResponse(status));\n }\n }\n\n return {\n ok: false,\n error: \"OAuth authorization timed out\",\n error_kind: \"timeout\",\n };\n } finally {\n client.close();\n }\n }\n\n private static async startOAuthWithClient(\n client: MCPClient,\n server: MCPServerConfig,\n ): Promise<MCPOAuthStartResponse> {\n const { request } = await buildMcpTestRequest(server);\n return client.startOAuth(request);\n }\n\n // typescript-client 1.36 types the OAuth probes with the generated\n // agent-server models, which describe the opaque `oauth_state` JSON blobs as\n // `unknown` rather than the recursive `MCPJsonValue` the local types use. The\n // wire shape is unchanged, so narrow back to the app's boundary type.\n private static async getOAuthStatusWithClient(\n client: MCPClient,\n jobId: string,\n ): Promise<MCPOAuthStatusResponse> {\n return (await client.getOAuthStatus(jobId)) as MCPOAuthStatusResponse;\n }\n\n private static async submitOAuthCallbackWithClient(\n client: MCPClient,\n jobId: string,\n callbackUrl: string,\n ): Promise<MCPOAuthStatusResponse> {\n return (await client.submitOAuthCallback(jobId, {\n callback_url: callbackUrl,\n })) as MCPOAuthStatusResponse;\n }\n}\n\nexport default McpService;\n"],"mappings":"qdAoBA,IAAM,EAAiC,IAEvC,SAAS,EACP,EACqC,CAUrC,OATI,EAAO,OAAS,QACX,CACL,KAAM,QACN,QAAS,EAAO,QAChB,GAAI,EAAO,MAAM,QAAU,CAAE,KAAM,EAAO,IAAK,EAC/C,GAAI,EAAO,KACT,OAAO,KAAK,EAAO,GAAG,EAAE,OAAS,GAAK,CAAE,IAAK,EAAO,GAAI,CAC5D,EAEK,CACL,KAAM,EAAO,OAAS,MAAQ,MAAQ,OACtC,IAAK,EAAO,IACZ,GAAI,EAAO,SACT,OAAO,KAAK,EAAO,OAAO,EAAE,OAAS,GAAK,CAAE,QAAS,EAAO,OAAQ,EACtE,GAAI,EAAO,KAAO,CAAE,KAAM,EAAO,IAAK,EAAI,CAAC,CAC7C,CACF,CAEA,SAAS,EAAkB,EAA6C,CAEtE,OADI,EAAO,MAAM,WAAa,SACvB,EADwC,EAAO,OAExD,CAEA,eAAe,EAAoB,EAGhC,CACD,IAAM,EAAa,EAAA,iCAAiC,CAAM,EACpD,EAAc,MAAM,EAAA,iCAAiC,CAAM,EAC3D,EAAa,EAAY,CAAW,EACpC,EAAU,EAAkB,CAAM,EACxC,MAAO,CACL,QAAS,CACP,OAAQ,EACR,GAAI,EAAO,KAAO,CAAE,KAAM,EAAO,IAAK,EAAI,CAAC,EAC3C,GAAI,IAAY,IAAA,GAA0B,CAAC,EAAf,CAAE,SAAQ,EACtC,GAAI,EAAa,CAAE,UAAW,EAAW,QAAS,EAAI,CAAC,CACzD,EACA,aACF,CACF,CAEA,SAAS,EACP,EACA,EACyB,CAgBzB,OAfK,EAAO,GAMR,EAAO,YACF,CACL,GAAG,EACH,YAAa,CACX,GAAG,EAAO,YACV,KAAM,EAAA,iBAAiB,EAAO,YAAY,KAAM,GAAG,CAAgB,CACrE,CACF,EAEK,EAdE,CACL,GAAG,EACH,MAAO,EAAA,iBAAiB,EAAO,MAAO,GAAG,CAAgB,CAC3D,CAYJ,CAYA,SAAS,EACP,EACA,EACA,EACyB,CACzB,IAAM,EAAW,EAAsB,EAAQ,CAAgB,EAC/D,GACE,EAAS,IACT,GACA,EAAS,aACT,EAAS,MAAM,SAAS,EAAW,SAAS,IAAI,EAChD,CACA,IAAM,EAAkB,EAAW,UAAU,EAAS,WAAW,EACjE,GAAI,EACF,MAAO,CACL,GAAI,GACJ,MAAO,EACP,WAAY,aACd,CAEJ,CACA,OAAO,CACT,CAEA,SAAS,GAAwD,CAE/D,GADe,EAAA,iBAAiB,EAAE,QACvB,OAAS,QAAS,CAC3B,GAAM,CAAE,OAAM,UAAW,EAAA,4BAA4B,EACrD,MAAO,CAAE,OAAM,GAAI,EAAS,CAAE,QAAO,EAAI,CAAC,CAAG,CAC/C,CAEA,IAAM,EAAe,EAAA,sBAAsB,EAAE,KAC1C,GAAY,EAAQ,OAAS,SAAW,EAAQ,IACnD,EACA,GAAI,EACF,MAAO,CACL,KAAM,EAAa,KAAK,QAAQ,OAAQ,EAAE,EAC1C,GAAI,EAAa,OAAS,CAAE,OAAQ,EAAa,MAAO,EAAI,CAAC,CAC/D,EAEF,MAAU,MAAM,yDAAyD,CAC3E,CAEA,SAAS,GAAkC,CACzC,GAAM,CAAE,OAAM,UAAW,EAAmB,EAC5C,OAAO,IAAI,EAAA,UAAU,CACnB,OACA,GAAI,EAAS,CAAE,QAAO,EAAI,CAAC,EAC3B,QAAS,KACX,CAAC,CACH,CAEA,SAAS,EACP,EACyB,CAazB,OAZI,EAAO,SAAW,YACb,CACL,GAAI,GACJ,MAAO,EAAO,OAAS,CAAC,EACxB,GAAI,EAAO,cAAgB,IAAA,IAAa,CACtC,YAAa,EAAO,WACtB,EACA,GAAI,EAAO,cAAgB,IAAA,IAAa,CACtC,YAAa,EAAO,WACtB,CACF,EAEK,CACL,GAAI,GACJ,MAAO,EAAO,OAAS,uCACvB,WAAY,EAAO,YAAc,SACnC,CACF,CAEA,IAAM,EAAS,GACb,IAAI,QAAe,GAAY,CAC7B,OAAO,WAAW,EAAS,CAAE,CAC/B,CAAC,EAEG,EAAN,MAAM,CAAW,CACf,aAAa,WACX,EACkC,CAWlC,GAAI,EAAA,iBAAiB,EAAE,QAAQ,OAAS,QACtC,MAAO,CAAE,GAAI,GAAM,MAAO,CAAC,CAAE,EAE/B,IAAM,EAAa,EAAA,iCAAiC,CAAM,EACpD,CAAE,OAAM,UAAW,EAAA,4BAA4B,EAC/C,EAAS,IAAI,EAAA,UAAU,CAAE,OAAM,GAAI,EAAS,CAAE,QAAO,EAAI,CAAC,CAAG,CAAC,EACpE,GAAI,CACF,GAAM,CAAE,UAAS,eAAgB,MAAM,EAAoB,CAAM,EAMjE,OAAO,EAAwB,MALT,EAAO,WAC3B,CACF,EAGuC,EAAY,CAAC,EAAa,CAAM,CAAC,CAC1E,QAAU,CACR,EAAO,MAAM,CACf,CACF,CAEA,aAAa,WACX,EACgC,CAChC,IAAM,EAAS,EAAqB,EACpC,GAAI,CACF,OAAO,MAAM,EAAW,qBAAqB,EAAQ,CAAM,CAC7D,QAAU,CACR,EAAO,MAAM,CACf,CACF,CAEA,aAAa,eAAe,EAAgD,CAC1E,IAAM,EAAS,EAAqB,EACpC,GAAI,CACF,OAAO,MAAM,EAAW,yBAAyB,EAAQ,CAAK,CAChE,QAAU,CACR,EAAO,MAAM,CACf,CACF,CAEA,aAAa,oBACX,EACA,EACiC,CACjC,IAAM,EAAS,EAAqB,EACpC,GAAI,CACF,OAAO,MAAM,EAAW,8BACtB,EACA,EACA,CACF,CACF,QAAU,CACR,EAAO,MAAM,CACf,CACF,CAEA,aAAa,eACX,EACkC,CAClC,IAAM,EAAa,EAAA,iCAAiC,CAAM,EACpD,EAAY,GAChB,EAAwB,EAAQ,EAAY,CAAC,CAAM,CAAC,EAChD,EAAQ,OAAO,KAAK,cAAe,QAAQ,EAC3C,EAAS,EAAqB,EACpC,GAAI,CACF,IAAM,EAAQ,MAAM,EAAW,qBAAqB,EAAQ,CAAM,EAClE,GAAI,CAAC,EAAM,IAAM,CAAC,EAAM,QAAU,CAAC,EAAM,kBAEvC,OADA,GAAO,MAAM,EACN,EAAS,CACd,GAAI,GACJ,MAAO,EAAM,OAAS,sCACtB,WAAY,EAAM,YAAc,SAClC,CAAC,EAGH,IAAI,EAAS,MAAM,EAAW,yBAC5B,EACA,EAAM,MACR,EACA,IAAK,IAAI,EAAU,EAAG,EAAU,GAAI,GAAW,EAAG,CAChD,GAAI,EAAO,SAAW,aAAe,EAAO,SAAW,SAErD,OADA,GAAO,MAAM,EACN,EAAS,EAA0B,CAAM,CAAC,EAEnD,GAAI,EAAO,eAAgB,MAC3B,MAAM,EAAM,GAAG,EACf,EAAS,MAAM,EAAW,yBACxB,EACA,EAAM,MACR,CACF,CAEI,IACF,EAAM,SAAS,KAAO,EAAM,mBAG9B,IACE,IAAI,EAAU,EACd,EAAU,EACV,GAAW,EAOX,GALA,MAAM,EAAM,GAAI,EAChB,EAAS,MAAM,EAAW,yBACxB,EACA,EAAM,MACR,EACI,EAAO,SAAW,aAAe,EAAO,SAAW,SAErD,OADA,GAAO,MAAM,EACN,EAAS,EAA0B,CAAM,CAAC,EAIrD,MAAO,CACL,GAAI,GACJ,MAAO,gCACP,WAAY,SACd,CACF,QAAU,CACR,EAAO,MAAM,CACf,CACF,CAEA,aAAqB,qBACnB,EACA,EACgC,CAChC,GAAM,CAAE,WAAY,MAAM,EAAoB,CAAM,EACpD,OAAO,EAAO,WAAW,CAAO,CAClC,CAMA,aAAqB,yBACnB,EACA,EACiC,CACjC,OAAQ,MAAM,EAAO,eAAe,CAAK,CAC3C,CAEA,aAAqB,8BACnB,EACA,EACA,EACiC,CACjC,OAAQ,MAAM,EAAO,oBAAoB,EAAO,CAC9C,aAAc,CAChB,CAAC,CACH,CACF"}
@@ -2,19 +2,19 @@ import { MCPClient as e } from "../../node_modules/@openhands/typescript-client/
2
2
  import "../../node_modules/@openhands/typescript-client/dist/clients.js";
3
3
  import { getActiveBackend as t, getRegisteredBackends as n } from "../backend-registry/active-store.js";
4
4
  import { getAgentServerClientOptions as r } from "../agent-server-client-options.js";
5
- import { substituteRedactedMcpCredentials as i } from "./mcp-redacted-credentials.js";
6
- import { getCredentialValidationForServer as a } from "../../utils/mcp-credential-validation.js";
7
- import { redactMcpSecrets as o } from "../../utils/redact-mcp-secrets.js";
5
+ import { getCredentialValidationForServer as i } from "../../utils/mcp-credential-validation.js";
6
+ import { redactMcpSecrets as a } from "../../utils/redact-mcp-secrets.js";
7
+ import { substituteRedactedMcpCredentials as o } from "./mcp-redacted-credentials.js";
8
8
  //#region src/api/mcp-service/mcp-service.api.ts
9
9
  var s = 120;
10
10
  function c(e) {
11
11
  return e.type === "stdio" ? {
12
- transport: "stdio",
12
+ type: "stdio",
13
13
  command: e.command,
14
14
  ...e.args?.length && { args: e.args },
15
15
  ...e.env && Object.keys(e.env).length > 0 && { env: e.env }
16
16
  } : {
17
- transport: e.type === "sse" ? "sse" : "http",
17
+ type: e.type === "sse" ? "sse" : "http",
18
18
  url: e.url,
19
19
  ...e.headers && Object.keys(e.headers).length > 0 && { headers: e.headers },
20
20
  ...e.auth ? { auth: e.auth } : {}
@@ -24,12 +24,12 @@ function l(e) {
24
24
  return e.auth?.strategy === "oauth2" ? s : e.timeout;
25
25
  }
26
26
  async function u(e) {
27
- let t = a(e), n = await i(e), r = c(n), o = l(e);
27
+ let t = i(e), n = await o(e), r = c(n), a = l(e);
28
28
  return {
29
29
  request: {
30
30
  server: r,
31
31
  ...e.name ? { name: e.name } : {},
32
- ...o === void 0 ? {} : { timeout: o },
32
+ ...a === void 0 ? {} : { timeout: a },
33
33
  ...t ? { tool_call: t.toolCall } : {}
34
34
  },
35
35
  substituted: n
@@ -40,11 +40,11 @@ function d(e, t) {
40
40
  ...e,
41
41
  tool_result: {
42
42
  ...e.tool_result,
43
- text: o(e.tool_result.text, ...t)
43
+ text: a(e.tool_result.text, ...t)
44
44
  }
45
45
  } : e : {
46
46
  ...e,
47
- error: o(e.error, ...t)
47
+ error: a(e.error, ...t)
48
48
  };
49
49
  }
50
50
  function f(e, t, n) {
@@ -102,13 +102,13 @@ var g = (e) => new Promise((t) => {
102
102
  ok: !0,
103
103
  tools: []
104
104
  };
105
- let i = a(n), { host: o, apiKey: s } = r(), c = new e({
105
+ let a = i(n), { host: o, apiKey: s } = r(), c = new e({
106
106
  host: o,
107
107
  ...s ? { apiKey: s } : {}
108
108
  });
109
109
  try {
110
110
  let { request: e, substituted: t } = await u(n);
111
- return f(await c.testServer(e), i, [t, n]);
111
+ return f(await c.testServer(e), a, [t, n]);
112
112
  } finally {
113
113
  c.close();
114
114
  }
@@ -138,22 +138,22 @@ var g = (e) => new Promise((t) => {
138
138
  }
139
139
  }
140
140
  static async authorizeOAuth(e) {
141
- let t = a(e), r = (n) => f(n, t, [e]), i = window.open("about:blank", "_blank"), o = m();
141
+ let t = i(e), r = (n) => f(n, t, [e]), a = window.open("about:blank", "_blank"), o = m();
142
142
  try {
143
143
  let t = await n.startOAuthWithClient(o, e);
144
- if (!t.ok || !t.job_id || !t.authorization_url) return i?.close(), r({
144
+ if (!t.ok || !t.job_id || !t.authorization_url) return a?.close(), r({
145
145
  ok: !1,
146
146
  error: t.error || "Could not start OAuth authorization",
147
147
  error_kind: t.error_kind || "unknown"
148
148
  });
149
- let a = await n.getOAuthStatusWithClient(o, t.job_id);
149
+ let i = await n.getOAuthStatusWithClient(o, t.job_id);
150
150
  for (let e = 0; e < 20; e += 1) {
151
- if (a.status === "succeeded" || a.status === "failed") return i?.close(), r(h(a));
152
- if (a.callback_ready) break;
153
- await g(250), a = await n.getOAuthStatusWithClient(o, t.job_id);
151
+ if (i.status === "succeeded" || i.status === "failed") return a?.close(), r(h(i));
152
+ if (i.callback_ready) break;
153
+ await g(250), i = await n.getOAuthStatusWithClient(o, t.job_id);
154
154
  }
155
- i && (i.location.href = t.authorization_url);
156
- for (let e = 0; e < s; e += 1) if (await g(1e3), a = await n.getOAuthStatusWithClient(o, t.job_id), a.status === "succeeded" || a.status === "failed") return i?.close(), r(h(a));
155
+ a && (a.location.href = t.authorization_url);
156
+ for (let e = 0; e < s; e += 1) if (await g(1e3), i = await n.getOAuthStatusWithClient(o, t.job_id), i.status === "succeeded" || i.status === "failed") return a?.close(), r(h(i));
157
157
  return {
158
158
  ok: !1,
159
159
  error: "OAuth authorization timed out",
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-service.api.js","names":[],"sources":["../../../src/api/mcp-service/mcp-service.api.ts"],"sourcesContent":["import { MCPClient } from \"@openhands/typescript-client/clients\";\nimport type { MCPTestRequest } from \"@openhands/typescript-client\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\nimport {\n getActiveBackend,\n getRegisteredBackends,\n} from \"../backend-registry/active-store\";\nimport {\n getCredentialValidationForServer,\n type CredentialValidation,\n} from \"#/utils/mcp-credential-validation\";\nimport type { MCPAuthCredential } from \"#/types/mcp-auth\";\nimport type {\n ExtendedMCPTestResponse,\n MCPOAuthStartResponse,\n MCPOAuthStatusResponse,\n MCPServerConfig,\n} from \"#/types/mcp-server\";\nimport { redactMcpSecrets } from \"#/utils/redact-mcp-secrets\";\nimport { substituteRedactedMcpCredentials } from \"./mcp-redacted-credentials\";\n\nconst OAUTH_MCP_TEST_TIMEOUT_SECONDS = 120;\n\ntype MCPTestServer = {\n transport?: \"stdio\" | \"http\" | \"sse\";\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n url?: string;\n headers?: Record<string, string>;\n auth?: MCPAuthCredential;\n};\n\ninterface ExtendedMCPTestRequest {\n server: MCPTestServer;\n name?: string;\n timeout?: number;\n tool_call?: {\n name: string;\n arguments: Record<string, unknown>;\n };\n}\n\nfunction toMcpServer(server: MCPServerConfig): MCPTestServer {\n if (server.type === \"stdio\") {\n return {\n transport: \"stdio\",\n command: server.command!,\n ...(server.args?.length && { args: server.args }),\n ...(server.env &&\n Object.keys(server.env).length > 0 && { env: server.env }),\n };\n }\n return {\n transport: server.type === \"sse\" ? \"sse\" : \"http\",\n url: server.url!,\n ...(server.headers &&\n Object.keys(server.headers).length > 0 && { headers: server.headers }),\n ...(server.auth ? { auth: server.auth } : {}),\n };\n}\n\nfunction getMcpTestTimeout(server: MCPServerConfig): number | undefined {\n if (server.auth?.strategy !== \"oauth2\") return server.timeout;\n return OAUTH_MCP_TEST_TIMEOUT_SECONDS;\n}\n\nasync function buildMcpTestRequest(server: MCPServerConfig): Promise<{\n request: ExtendedMCPTestRequest;\n substituted: MCPServerConfig;\n}> {\n const validation = getCredentialValidationForServer(server);\n const substituted = await substituteRedactedMcpCredentials(server);\n const serverSpec = toMcpServer(substituted);\n const timeout = getMcpTestTimeout(server);\n return {\n request: {\n server: serverSpec,\n ...(server.name ? { name: server.name } : {}),\n ...(timeout !== undefined ? { timeout } : {}),\n ...(validation ? { tool_call: validation.toolCall } : {}),\n },\n substituted,\n };\n}\n\nfunction redactMcpTestResponse(\n result: ExtendedMCPTestResponse,\n redactionSources: (MCPServerConfig | undefined)[],\n): ExtendedMCPTestResponse {\n if (!result.ok) {\n return {\n ...result,\n error: redactMcpSecrets(result.error, ...redactionSources),\n };\n }\n if (result.tool_result) {\n return {\n ...result,\n tool_result: {\n ...result.tool_result,\n text: redactMcpSecrets(result.tool_result.text, ...redactionSources),\n },\n };\n }\n return result;\n}\n\n/**\n * Display-boundary post-processing shared by the test and OAuth probes:\n * scrub secrets from error/tool-result text, then let the catalog entry's\n * credential validation turn a failed read-only tool call into a\n * `credentials` failure. The interpretation only runs when the probe tool\n * is actually advertised in `tools` — a server variant that doesn't expose\n * the tool (e.g. a hosted alternative to the stdio server the spec was\n * written for) must degrade to a connectivity-only success, not be\n * misreported as bad credentials.\n */\nfunction finalizeMcpTestResponse(\n result: ExtendedMCPTestResponse,\n validation: CredentialValidation | undefined,\n redactionSources: (MCPServerConfig | undefined)[],\n): ExtendedMCPTestResponse {\n const redacted = redactMcpTestResponse(result, redactionSources);\n if (\n redacted.ok &&\n validation &&\n redacted.tool_result &&\n redacted.tools.includes(validation.toolCall.name)\n ) {\n const credentialError = validation.interpret(redacted.tool_result);\n if (credentialError) {\n return {\n ok: false,\n error: credentialError,\n error_kind: \"credentials\",\n };\n }\n }\n return redacted;\n}\n\nfunction getMcpProbeOptions(): { host: string; apiKey?: string } {\n const active = getActiveBackend().backend;\n if (active.kind === \"local\") {\n const { host, apiKey } = getAgentServerClientOptions();\n return { host, ...(apiKey ? { apiKey } : {}) };\n }\n\n const localBackend = getRegisteredBackends().find(\n (backend) => backend.kind === \"local\" && backend.host,\n );\n if (localBackend) {\n return {\n host: localBackend.host.replace(/\\/+$/, \"\"),\n ...(localBackend.apiKey ? { apiKey: localBackend.apiKey } : {}),\n };\n }\n throw new Error(\"OAuth authorization requires a reachable local backend.\");\n}\n\nfunction createMcpProbeClient(): MCPClient {\n const { host, apiKey } = getMcpProbeOptions();\n return new MCPClient({\n host,\n ...(apiKey ? { apiKey } : {}),\n timeout: OAUTH_MCP_TEST_TIMEOUT_SECONDS * 1000 + 5000,\n });\n}\n\nfunction oauthStatusToTestResponse(\n status: MCPOAuthStatusResponse,\n): ExtendedMCPTestResponse {\n if (status.status === \"succeeded\") {\n return {\n ok: true,\n tools: status.tools ?? [],\n ...(status.tool_result !== undefined && {\n tool_result: status.tool_result,\n }),\n ...(status.oauth_state !== undefined && {\n oauth_state: status.oauth_state,\n }),\n };\n }\n return {\n ok: false,\n error: status.error || \"OAuth authorization did not complete\",\n error_kind: status.error_kind || \"unknown\",\n };\n}\n\nconst sleep = (ms: number) =>\n new Promise<void>((resolve) => {\n window.setTimeout(resolve, ms);\n });\n\nclass McpService {\n static async testServer(\n server: MCPServerConfig,\n ): Promise<ExtendedMCPTestResponse> {\n // The MCP connectivity-test endpoint lives on the local agent-server. It\n // spawns the configured stdio command / opens an SSE-or-SHTTP connection\n // from that process's environment. Cloud backends don't expose this\n // endpoint to the frontend — the MCP server would actually run inside the\n // cloud sandbox, which isn't reachable from the browser before the user\n // starts a conversation. Calling `getAgentServerClientOptions()` here for\n // a cloud-active session would throw `NoBackendAvailableError(\"No backend\n // is configured.\")` and block the install flow entirely. Short-circuit\n // with a synthetic success so saving proceeds; any real connection\n // failure surfaces inside the conversation runtime instead.\n if (getActiveBackend().backend.kind === \"cloud\") {\n return { ok: true, tools: [] };\n }\n const validation = getCredentialValidationForServer(server);\n const { host, apiKey } = getAgentServerClientOptions();\n const client = new MCPClient({ host, ...(apiKey ? { apiKey } : {}) });\n try {\n const { request, substituted } = await buildMcpTestRequest(server);\n const result = (await client.testServer(\n request as MCPTestRequest,\n )) as ExtendedMCPTestResponse;\n // Redact against both config forms: `server` may hold fresh plaintext\n // input, `substituted` the stored (encrypted) round-trip values.\n return finalizeMcpTestResponse(result, validation, [substituted, server]);\n } finally {\n client.close();\n }\n }\n\n static async startOAuth(\n server: MCPServerConfig,\n ): Promise<MCPOAuthStartResponse> {\n const client = createMcpProbeClient();\n try {\n return await McpService.startOAuthWithClient(client, server);\n } finally {\n client.close();\n }\n }\n\n static async getOAuthStatus(jobId: string): Promise<MCPOAuthStatusResponse> {\n const client = createMcpProbeClient();\n try {\n return await McpService.getOAuthStatusWithClient(client, jobId);\n } finally {\n client.close();\n }\n }\n\n static async submitOAuthCallback(\n jobId: string,\n callbackUrl: string,\n ): Promise<MCPOAuthStatusResponse> {\n const client = createMcpProbeClient();\n try {\n return await McpService.submitOAuthCallbackWithClient(\n client,\n jobId,\n callbackUrl,\n );\n } finally {\n client.close();\n }\n }\n\n static async authorizeOAuth(\n server: MCPServerConfig,\n ): Promise<ExtendedMCPTestResponse> {\n const validation = getCredentialValidationForServer(server);\n const finalize = (result: ExtendedMCPTestResponse) =>\n finalizeMcpTestResponse(result, validation, [server]);\n const popup = window.open(\"about:blank\", \"_blank\");\n const client = createMcpProbeClient();\n try {\n const start = await McpService.startOAuthWithClient(client, server);\n if (!start.ok || !start.job_id || !start.authorization_url) {\n popup?.close();\n return finalize({\n ok: false,\n error: start.error || \"Could not start OAuth authorization\",\n error_kind: start.error_kind || \"unknown\",\n });\n }\n\n let status = await McpService.getOAuthStatusWithClient(\n client,\n start.job_id,\n );\n for (let attempt = 0; attempt < 20; attempt += 1) {\n if (status.status === \"succeeded\" || status.status === \"failed\") {\n popup?.close();\n return finalize(oauthStatusToTestResponse(status));\n }\n if (status.callback_ready) break;\n await sleep(250);\n status = await McpService.getOAuthStatusWithClient(\n client,\n start.job_id,\n );\n }\n\n if (popup) {\n popup.location.href = start.authorization_url;\n }\n\n for (\n let attempt = 0;\n attempt < OAUTH_MCP_TEST_TIMEOUT_SECONDS;\n attempt += 1\n ) {\n await sleep(1000);\n status = await McpService.getOAuthStatusWithClient(\n client,\n start.job_id,\n );\n if (status.status === \"succeeded\" || status.status === \"failed\") {\n popup?.close();\n return finalize(oauthStatusToTestResponse(status));\n }\n }\n\n return {\n ok: false,\n error: \"OAuth authorization timed out\",\n error_kind: \"timeout\",\n };\n } finally {\n client.close();\n }\n }\n\n private static async startOAuthWithClient(\n client: MCPClient,\n server: MCPServerConfig,\n ): Promise<MCPOAuthStartResponse> {\n const { request } = await buildMcpTestRequest(server);\n return client.startOAuth(request as MCPTestRequest);\n }\n\n // typescript-client 1.36 types the OAuth probes with the generated\n // agent-server models, which describe the opaque `oauth_state` JSON blobs as\n // `unknown` rather than the recursive `MCPJsonValue` the local types use. The\n // wire shape is unchanged, so narrow back to the app's boundary type.\n private static async getOAuthStatusWithClient(\n client: MCPClient,\n jobId: string,\n ): Promise<MCPOAuthStatusResponse> {\n return (await client.getOAuthStatus(jobId)) as MCPOAuthStatusResponse;\n }\n\n private static async submitOAuthCallbackWithClient(\n client: MCPClient,\n jobId: string,\n callbackUrl: string,\n ): Promise<MCPOAuthStatusResponse> {\n return (await client.submitOAuthCallback(jobId, {\n callback_url: callbackUrl,\n })) as MCPOAuthStatusResponse;\n }\n}\n\nexport default McpService;\n"],"mappings":"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"}
1
+ {"version":3,"file":"mcp-service.api.js","names":[],"sources":["../../../src/api/mcp-service/mcp-service.api.ts"],"sourcesContent":["import { MCPClient } from \"@openhands/typescript-client/clients\";\nimport type { AgentServerMCPTestRequest } from \"@openhands/typescript-client\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\nimport {\n getActiveBackend,\n getRegisteredBackends,\n} from \"../backend-registry/active-store\";\nimport {\n getCredentialValidationForServer,\n type CredentialValidation,\n} from \"#/utils/mcp-credential-validation\";\nimport type {\n ExtendedMCPTestResponse,\n MCPOAuthStartResponse,\n MCPOAuthStatusResponse,\n MCPServerConfig,\n} from \"#/types/mcp-server\";\nimport { redactMcpSecrets } from \"#/utils/redact-mcp-secrets\";\nimport { substituteRedactedMcpCredentials } from \"./mcp-redacted-credentials\";\n\nconst OAUTH_MCP_TEST_TIMEOUT_SECONDS = 120;\n\nfunction toMcpServer(\n server: MCPServerConfig,\n): AgentServerMCPTestRequest[\"server\"] {\n if (server.type === \"stdio\") {\n return {\n type: \"stdio\",\n command: server.command!,\n ...(server.args?.length && { args: server.args }),\n ...(server.env &&\n Object.keys(server.env).length > 0 && { env: server.env }),\n };\n }\n return {\n type: server.type === \"sse\" ? \"sse\" : \"http\",\n url: server.url!,\n ...(server.headers &&\n Object.keys(server.headers).length > 0 && { headers: server.headers }),\n ...(server.auth ? { auth: server.auth } : {}),\n };\n}\n\nfunction getMcpTestTimeout(server: MCPServerConfig): number | undefined {\n if (server.auth?.strategy !== \"oauth2\") return server.timeout;\n return OAUTH_MCP_TEST_TIMEOUT_SECONDS;\n}\n\nasync function buildMcpTestRequest(server: MCPServerConfig): Promise<{\n request: AgentServerMCPTestRequest;\n substituted: MCPServerConfig;\n}> {\n const validation = getCredentialValidationForServer(server);\n const substituted = await substituteRedactedMcpCredentials(server);\n const serverSpec = toMcpServer(substituted);\n const timeout = getMcpTestTimeout(server);\n return {\n request: {\n server: serverSpec,\n ...(server.name ? { name: server.name } : {}),\n ...(timeout !== undefined ? { timeout } : {}),\n ...(validation ? { tool_call: validation.toolCall } : {}),\n },\n substituted,\n };\n}\n\nfunction redactMcpTestResponse(\n result: ExtendedMCPTestResponse,\n redactionSources: (MCPServerConfig | undefined)[],\n): ExtendedMCPTestResponse {\n if (!result.ok) {\n return {\n ...result,\n error: redactMcpSecrets(result.error, ...redactionSources),\n };\n }\n if (result.tool_result) {\n return {\n ...result,\n tool_result: {\n ...result.tool_result,\n text: redactMcpSecrets(result.tool_result.text, ...redactionSources),\n },\n };\n }\n return result;\n}\n\n/**\n * Display-boundary post-processing shared by the test and OAuth probes:\n * scrub secrets from error/tool-result text, then let the catalog entry's\n * credential validation turn a failed read-only tool call into a\n * `credentials` failure. The interpretation only runs when the probe tool\n * is actually advertised in `tools` — a server variant that doesn't expose\n * the tool (e.g. a hosted alternative to the stdio server the spec was\n * written for) must degrade to a connectivity-only success, not be\n * misreported as bad credentials.\n */\nfunction finalizeMcpTestResponse(\n result: ExtendedMCPTestResponse,\n validation: CredentialValidation | undefined,\n redactionSources: (MCPServerConfig | undefined)[],\n): ExtendedMCPTestResponse {\n const redacted = redactMcpTestResponse(result, redactionSources);\n if (\n redacted.ok &&\n validation &&\n redacted.tool_result &&\n redacted.tools.includes(validation.toolCall.name)\n ) {\n const credentialError = validation.interpret(redacted.tool_result);\n if (credentialError) {\n return {\n ok: false,\n error: credentialError,\n error_kind: \"credentials\",\n };\n }\n }\n return redacted;\n}\n\nfunction getMcpProbeOptions(): { host: string; apiKey?: string } {\n const active = getActiveBackend().backend;\n if (active.kind === \"local\") {\n const { host, apiKey } = getAgentServerClientOptions();\n return { host, ...(apiKey ? { apiKey } : {}) };\n }\n\n const localBackend = getRegisteredBackends().find(\n (backend) => backend.kind === \"local\" && backend.host,\n );\n if (localBackend) {\n return {\n host: localBackend.host.replace(/\\/+$/, \"\"),\n ...(localBackend.apiKey ? { apiKey: localBackend.apiKey } : {}),\n };\n }\n throw new Error(\"OAuth authorization requires a reachable local backend.\");\n}\n\nfunction createMcpProbeClient(): MCPClient {\n const { host, apiKey } = getMcpProbeOptions();\n return new MCPClient({\n host,\n ...(apiKey ? { apiKey } : {}),\n timeout: OAUTH_MCP_TEST_TIMEOUT_SECONDS * 1000 + 5000,\n });\n}\n\nfunction oauthStatusToTestResponse(\n status: MCPOAuthStatusResponse,\n): ExtendedMCPTestResponse {\n if (status.status === \"succeeded\") {\n return {\n ok: true,\n tools: status.tools ?? [],\n ...(status.tool_result !== undefined && {\n tool_result: status.tool_result,\n }),\n ...(status.oauth_state !== undefined && {\n oauth_state: status.oauth_state,\n }),\n };\n }\n return {\n ok: false,\n error: status.error || \"OAuth authorization did not complete\",\n error_kind: status.error_kind || \"unknown\",\n };\n}\n\nconst sleep = (ms: number) =>\n new Promise<void>((resolve) => {\n window.setTimeout(resolve, ms);\n });\n\nclass McpService {\n static async testServer(\n server: MCPServerConfig,\n ): Promise<ExtendedMCPTestResponse> {\n // The MCP connectivity-test endpoint lives on the local agent-server. It\n // spawns the configured stdio command / opens an SSE-or-SHTTP connection\n // from that process's environment. Cloud backends don't expose this\n // endpoint to the frontend — the MCP server would actually run inside the\n // cloud sandbox, which isn't reachable from the browser before the user\n // starts a conversation. Calling `getAgentServerClientOptions()` here for\n // a cloud-active session would throw `NoBackendAvailableError(\"No backend\n // is configured.\")` and block the install flow entirely. Short-circuit\n // with a synthetic success so saving proceeds; any real connection\n // failure surfaces inside the conversation runtime instead.\n if (getActiveBackend().backend.kind === \"cloud\") {\n return { ok: true, tools: [] };\n }\n const validation = getCredentialValidationForServer(server);\n const { host, apiKey } = getAgentServerClientOptions();\n const client = new MCPClient({ host, ...(apiKey ? { apiKey } : {}) });\n try {\n const { request, substituted } = await buildMcpTestRequest(server);\n const result = (await client.testServer(\n request,\n )) as ExtendedMCPTestResponse;\n // Redact against both config forms: `server` may hold fresh plaintext\n // input, `substituted` the stored (encrypted) round-trip values.\n return finalizeMcpTestResponse(result, validation, [substituted, server]);\n } finally {\n client.close();\n }\n }\n\n static async startOAuth(\n server: MCPServerConfig,\n ): Promise<MCPOAuthStartResponse> {\n const client = createMcpProbeClient();\n try {\n return await McpService.startOAuthWithClient(client, server);\n } finally {\n client.close();\n }\n }\n\n static async getOAuthStatus(jobId: string): Promise<MCPOAuthStatusResponse> {\n const client = createMcpProbeClient();\n try {\n return await McpService.getOAuthStatusWithClient(client, jobId);\n } finally {\n client.close();\n }\n }\n\n static async submitOAuthCallback(\n jobId: string,\n callbackUrl: string,\n ): Promise<MCPOAuthStatusResponse> {\n const client = createMcpProbeClient();\n try {\n return await McpService.submitOAuthCallbackWithClient(\n client,\n jobId,\n callbackUrl,\n );\n } finally {\n client.close();\n }\n }\n\n static async authorizeOAuth(\n server: MCPServerConfig,\n ): Promise<ExtendedMCPTestResponse> {\n const validation = getCredentialValidationForServer(server);\n const finalize = (result: ExtendedMCPTestResponse) =>\n finalizeMcpTestResponse(result, validation, [server]);\n const popup = window.open(\"about:blank\", \"_blank\");\n const client = createMcpProbeClient();\n try {\n const start = await McpService.startOAuthWithClient(client, server);\n if (!start.ok || !start.job_id || !start.authorization_url) {\n popup?.close();\n return finalize({\n ok: false,\n error: start.error || \"Could not start OAuth authorization\",\n error_kind: start.error_kind || \"unknown\",\n });\n }\n\n let status = await McpService.getOAuthStatusWithClient(\n client,\n start.job_id,\n );\n for (let attempt = 0; attempt < 20; attempt += 1) {\n if (status.status === \"succeeded\" || status.status === \"failed\") {\n popup?.close();\n return finalize(oauthStatusToTestResponse(status));\n }\n if (status.callback_ready) break;\n await sleep(250);\n status = await McpService.getOAuthStatusWithClient(\n client,\n start.job_id,\n );\n }\n\n if (popup) {\n popup.location.href = start.authorization_url;\n }\n\n for (\n let attempt = 0;\n attempt < OAUTH_MCP_TEST_TIMEOUT_SECONDS;\n attempt += 1\n ) {\n await sleep(1000);\n status = await McpService.getOAuthStatusWithClient(\n client,\n start.job_id,\n );\n if (status.status === \"succeeded\" || status.status === \"failed\") {\n popup?.close();\n return finalize(oauthStatusToTestResponse(status));\n }\n }\n\n return {\n ok: false,\n error: \"OAuth authorization timed out\",\n error_kind: \"timeout\",\n };\n } finally {\n client.close();\n }\n }\n\n private static async startOAuthWithClient(\n client: MCPClient,\n server: MCPServerConfig,\n ): Promise<MCPOAuthStartResponse> {\n const { request } = await buildMcpTestRequest(server);\n return client.startOAuth(request);\n }\n\n // typescript-client 1.36 types the OAuth probes with the generated\n // agent-server models, which describe the opaque `oauth_state` JSON blobs as\n // `unknown` rather than the recursive `MCPJsonValue` the local types use. The\n // wire shape is unchanged, so narrow back to the app's boundary type.\n private static async getOAuthStatusWithClient(\n client: MCPClient,\n jobId: string,\n ): Promise<MCPOAuthStatusResponse> {\n return (await client.getOAuthStatus(jobId)) as MCPOAuthStatusResponse;\n }\n\n private static async submitOAuthCallbackWithClient(\n client: MCPClient,\n jobId: string,\n callbackUrl: string,\n ): Promise<MCPOAuthStatusResponse> {\n return (await client.submitOAuthCallback(jobId, {\n callback_url: callbackUrl,\n })) as MCPOAuthStatusResponse;\n }\n}\n\nexport default McpService;\n"],"mappings":"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"}