@openhands/agent-canvas 1.8.0 → 1.10.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 (1282) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-WUD4tfSq.js → acp-providers-DLe_gVDY.js} +1 -1
  4. package/build/assets/active-backend-context-B0wI7OzM.js +2 -0
  5. package/build/assets/agent-context-settings-CaQtdNA-.js +1 -0
  6. package/build/assets/agent-profiles-settings-CvuErjp6.js +1 -0
  7. package/build/assets/agent-server-conversation-service.api-km_8sOVf.js +41 -0
  8. package/build/assets/{agent-settings-BGTyoT6X.js → agent-settings-UE-U4Xii.js} +2 -2
  9. package/build/assets/agent-settings-nmO-KSXr.js +1 -0
  10. package/build/assets/alert-banner-BMaOtTCG.js +1 -0
  11. package/build/assets/{api-key-entry-screen-JOx3SH1-.js → api-key-entry-screen-Cy66vT4D.js} +1 -1
  12. package/build/assets/{app-settings-D53QZy5p.js → app-settings-9ok42bV6.js} +1 -1
  13. package/build/assets/automation-C_eCrGyP.js +1 -0
  14. package/build/assets/automation-detail-fuITm6i3.js +3 -0
  15. package/build/assets/automation-export-CRq40mux.js +2 -0
  16. package/build/assets/automation-setup-route-EXDazOHW.js +1 -0
  17. package/build/assets/automation-templates-BArZsaxP.js +1 -0
  18. package/build/assets/automations-list-CG4HKOTn.js +1 -0
  19. package/build/assets/{back-nav-button-C02hGa8t.js → back-nav-button-BZB6H7xz.js} +1 -1
  20. package/build/assets/backend-form-modal-B_lXjOGa.js +1 -0
  21. package/build/assets/{backend-synced-settings-badge-CQ9xtNWm.js → backend-synced-settings-badge-B_NXJ3u1.js} +1 -1
  22. package/build/assets/{badge-CzXbf7tR.js → badge-C64c-7PO.js} +1 -1
  23. package/build/assets/{base-modal-DkVyzFMt.js → base-modal-C0RQPug5.js} +1 -1
  24. package/build/assets/bot-DuN83i3p.js +1 -0
  25. package/build/assets/{brand-button-BUlDL-mz.js → brand-button-DJmFCyMK.js} +1 -1
  26. package/build/assets/browser-D3gd2n83.js +6 -0
  27. package/build/assets/{browser-tab-BijpUbdt.js → browser-tab-BicAWuJ1.js} +1 -1
  28. package/build/assets/{chat-send-button-BKsVjhtA.js → chat-send-button-CCrH1E8u.js} +1 -1
  29. package/build/assets/check-DLOKoFU9.js +1 -0
  30. package/build/assets/{checkmark-CxdXtM3b.js → checkmark-XZyokq_Y.js} +1 -1
  31. package/build/assets/chevron-down-CnIbtM6i.js +1 -0
  32. package/build/assets/circle-check-CxCYJrpZ.js +1 -0
  33. package/build/assets/{circle-plus-check-toggle-DdjUiOo1.js → circle-plus-check-toggle-CB_sNERY.js} +1 -1
  34. package/build/assets/{close-CDAVqnTn.js → close-ScPlnwyq.js} +1 -1
  35. package/build/assets/cloud-funnel-analytics-XynamQGU.js +1 -0
  36. package/build/assets/{combobox-caret-Dl9UtvD6.js → combobox-caret-Bwiifgjs.js} +1 -1
  37. package/build/assets/command-menu-CA3IjGNc.js +1 -0
  38. package/build/assets/condenser-settings-cNGy75gq.js +1 -0
  39. package/build/assets/{confirmation-modal-CRBJSllP.js → confirmation-modal-BATFmFyP.js} +1 -1
  40. package/build/assets/context-menu-list-item-DhJCcBA0.js +1 -0
  41. package/build/assets/conversation-B6t6EiVp.js +1 -0
  42. package/build/assets/conversation-Csdxh9Xt.js +90 -0
  43. package/build/assets/conversation-panel-B6t6EiVp.js +1 -0
  44. package/build/assets/conversation-state-store-C2QzhPaK.js +1 -0
  45. package/build/assets/{conversation-store-C6hSXHw0.js → conversation-store-B8Eahyeg.js} +1 -1
  46. package/build/assets/{conversation-tab-empty-state-CDjvNgpG.js → conversation-tab-empty-state-D3fb5xIA.js} +1 -1
  47. package/build/assets/{copy-Drwu97Gx.js → copy-DaHuDtG4.js} +1 -1
  48. package/build/assets/{copy-z7idLzWO.js → copy-Drmhc2jD.js} +1 -1
  49. package/build/assets/{copy-to-clipboard-button-NbN1clVr.js → copy-to-clipboard-button-c4MQwKGj.js} +1 -1
  50. package/build/assets/{device-verify-CDm_WrVu.js → device-verify-oFpQoLgm.js} +1 -1
  51. package/build/assets/{dist-hOnv1nn2.js → dist-Bl64nBZL.js} +1 -1
  52. package/build/assets/{dropdown-classes-CqA2BTCL.js → dropdown-classes-f91ARMV1.js} +1 -1
  53. package/build/assets/entry.client-BCzY2Bf3.js +2 -0
  54. package/build/assets/enum-filter-dropdown-HG3q3rkV.js +1 -0
  55. package/build/assets/{environment-switch-overlay-mGl2pqqx.js → environment-switch-overlay-CquZXolz.js} +1 -1
  56. package/build/assets/{extensions-hub-Br3Lgynp.js → extensions-hub-BeweE0PW.js} +1 -1
  57. package/build/assets/{extensions-navigation-BQmstKDZ.js → extensions-navigation-Dd58NlUF.js} +1 -1
  58. package/build/assets/{external-link-D9B2QMPf.js → external-link-zWbg5KXS.js} +1 -1
  59. package/build/assets/file-text-RecuaId_.js +1 -0
  60. package/build/assets/files-tab-CLLG55-q.js +1 -0
  61. package/build/assets/{folder-C86qXV7M.js → folder-C1ou4_DT.js} +1 -1
  62. package/build/assets/{form-control-classes-CtVAktAy.js → form-control-classes-pHtZUI6K.js} +1 -1
  63. package/build/assets/format-relative-time-6-3uvOXe.js +1 -0
  64. package/build/assets/format-time-delta-BIR5Os7T.js +1 -0
  65. package/build/assets/git-provider-icon-wg7ShB98.js +1 -0
  66. package/build/assets/git-repo-dropdown-CWnaUyxL.js +1 -0
  67. package/build/assets/git-repo-dropdown-TzOuG5Ef.js +1 -0
  68. package/build/assets/{highlighted-source-view-KMsA9c4a.js → highlighted-source-view-DBtI3por.js} +1 -1
  69. package/build/assets/home-BpZQkDWM.js +1 -0
  70. package/build/assets/home-OEx0XtfP.js +1 -0
  71. package/build/assets/home-store-DM4qw1lF.js +1 -0
  72. package/build/assets/{iconBase-B2rQun3J.js → iconBase-C2sR-uAp.js} +1 -1
  73. package/build/assets/index-home-OEx0XtfP.js +1 -0
  74. package/build/assets/info-C9lpK5pw.js +1 -0
  75. package/build/assets/install-server-modal-DnjZrJUy.js +1 -0
  76. package/build/assets/kebab-menu-item-content-By16Tm_0.js +1 -0
  77. package/build/assets/{launch-DjkKw55l.js → launch-C9uijypN.js} +1 -1
  78. package/build/assets/{link-external-BDBCz-_z.js → link-external-BNZzCM1I.js} +1 -1
  79. package/build/assets/list-filter-C86CBRDE.js +1 -0
  80. package/build/assets/{list-todo-BpAf7aOT.js → list-todo-CheUtB7F.js} +1 -1
  81. package/build/assets/llm-not-configured-banner-DrBrhfN0.js +27 -0
  82. package/build/assets/{llm-settings-D8zNkIlP.js → llm-settings-CRsLqxgu.js} +1 -1
  83. package/build/assets/llm-settings-RBm_3kNm.js +1 -0
  84. package/build/assets/{llm-subscription-service-COTgZc1C.js → llm-subscription-service-DwjJ8-_X.js} +1 -1
  85. package/build/assets/loader-circle-C5AnEN8r.js +1 -0
  86. package/build/assets/{loading-spinner-DRFyh6Iy.js → loading-spinner-6Yj-YyoS.js} +1 -1
  87. package/build/assets/{manage-backends-modal-DiRWE3tJ.js → manage-backends-modal-DrwErS0N.js} +1 -1
  88. package/build/assets/manifest-c352d453.js +1 -0
  89. package/build/assets/manifest-subpage-layout-CtqVwIvJ.js +1 -0
  90. package/build/assets/markdown-renderer-lsvsp7jn.js +8 -0
  91. package/build/assets/mcp-DD4hPTRE.js +9 -0
  92. package/build/assets/mcp-marketplace-utils-BMnYz0Gc.js +1 -0
  93. package/build/assets/messages-Dt77e0qi.js +40 -0
  94. package/build/assets/{modal-backdrop-X-vKo61e.js → modal-backdrop-BSzNhM4r.js} +1 -1
  95. package/build/assets/{modal-body-C3bGicn4.js → modal-body-BHGCSAtj.js} +1 -1
  96. package/build/assets/{modal-classes-DFFO6BMU.js → modal-classes-DSTLuxkA.js} +1 -1
  97. package/build/assets/{modal-close-button-vxkAIRyZ.js → modal-close-button-dheWZ2ys.js} +1 -1
  98. package/build/assets/mouse-pointer-click-Px-dXWcS.js +1 -0
  99. package/build/assets/{navigation-context-BOGzIng3.js → navigation-context-CQZwH_tC.js} +1 -1
  100. package/build/assets/navigation-link-Bxo3-4vo.js +1 -0
  101. package/build/assets/onboarding-5CZvRBbh.js +1 -0
  102. package/build/assets/onboarding-modal-CD2ehuxt.js +1 -0
  103. package/build/assets/{openhands-logo-CmYvJXBa.js → openhands-logo-BS-Epajy.js} +1 -1
  104. package/build/assets/{organization-service.api-CQ73CB-S.js → organization-service.api-Dsuoep0g.js} +1 -1
  105. package/build/assets/{pencil-DzW2GB2M.js → pencil-Bl3GWhgq.js} +1 -1
  106. package/build/assets/{planner-tab-YG0bGxDY.js → planner-tab-DeO7Thb0.js} +1 -1
  107. package/build/assets/{plugins-management-service-ijhH8OSh.js → plugins-management-service-C9f75R6X.js} +1 -1
  108. package/build/assets/plus-CtzlyAoF.js +1 -0
  109. package/build/assets/{profiles-service.api-C32pPm70.js → profiles-service.api-Dl20_2IM.js} +1 -1
  110. package/build/assets/{providers-DuSn9s2i.js → providers-CeuhK46N.js} +1 -1
  111. package/build/assets/{proxy-BiyDhMBd.js → proxy-CIGI9zQC.js} +1 -1
  112. package/build/assets/{puzzle-DlqT0yvr.js → puzzle-B3v361yY.js} +1 -1
  113. package/build/assets/recommended-automations-launcher-6xmbf7lh.js +1 -0
  114. package/build/assets/{refresh-cw-Br5254f4.js → refresh-cw-B9GhC3QC.js} +1 -1
  115. package/build/assets/root-BQPNqNvD.js +2 -0
  116. package/build/assets/root-BeuHFY2s.css +1 -0
  117. package/build/assets/root-layout-Dl_2CDoq.js +3 -0
  118. package/build/assets/{schema-field-htfNouTG.js → schema-field-z2vSLuLo.js} +1 -1
  119. package/build/assets/{sdk-section-page-D0K1dBQY.js → sdk-section-page-BnCXAytf.js} +1 -1
  120. package/build/assets/{search-7DRiGm4Z.js → search-BatSpWed.js} +1 -1
  121. package/build/assets/search-CYaiKHRp.js +1 -0
  122. package/build/assets/{secrets-service-Dbv5Zb8G.js → secrets-service-DGUNlwQd.js} +1 -1
  123. package/build/assets/{secrets-settings-Da4SSaX9.js → secrets-settings-DUmML_dK.js} +1 -1
  124. package/build/assets/segmented-toggle-eSofF7gn.js +1 -0
  125. package/build/assets/settings-CWFxymAf.js +1 -0
  126. package/build/assets/{settings-F4a09IxY.js → settings-Co-M5bK9.js} +1 -1
  127. package/build/assets/{settings-dropdown-input-jOiv5Yrk.js → settings-dropdown-input-Cx4g7Xfl.js} +1 -1
  128. package/build/assets/{settings-gear-TYXnELES.js → settings-gear-DaJj6Pde.js} +1 -1
  129. package/build/assets/{settings-index-CyJBf5NA.js → settings-index-BECdgecg.js} +1 -1
  130. package/build/assets/settings-input-BQY115xH.js +1 -0
  131. package/build/assets/settings-like-page-layout-classes-Cw4Yzv_P.js +1 -0
  132. package/build/assets/{settings-list-classes-VqMzkYYt.js → settings-list-classes-C9cLrrcc.js} +1 -1
  133. package/build/assets/{settings-modal-C-S1NpbC.js → settings-modal-ChBJNTdd.js} +1 -1
  134. package/build/assets/{settings-section-header-context-CnIIQAUn.js → settings-section-header-context-BOJ_Fbak.js} +1 -1
  135. package/build/assets/settings-service.api-Dz9cZyvx.js +1 -0
  136. package/build/assets/{settings-switch-B405oU_v.js → settings-switch-BIodMVz9.js} +1 -1
  137. package/build/assets/shared-conversation-CSF0aTuE.js +1 -0
  138. package/build/assets/{sidebar-layout-BGMuyC86.js → sidebar-layout-DEycoFd_.js} +1 -1
  139. package/build/assets/sidebar-mobile-menu-toggle-DeRvTupV.js +1 -0
  140. package/build/assets/{sidebar-nav-link-DA4_ct9G.js → sidebar-nav-link-BjpQ-NVc.js} +1 -1
  141. package/build/assets/{sidebar-store-FRJ3rADB.js → sidebar-store-B04sX8aP.js} +1 -1
  142. package/build/assets/{skill-card-pill-row-BMdhr_sd.js → skill-card-pill-row-BH6fPGba.js} +1 -1
  143. package/build/assets/{skill-icon-badge-CGUkgcVH.js → skill-icon-badge-D4uznfjU.js} +1 -1
  144. package/build/assets/skill-scope-DH_AUUUP.js +1 -0
  145. package/build/assets/{skills-CYFLsN5U.js → skills-B0IliMxw.js} +1 -1
  146. package/build/assets/{skills-plugins-C5eJnyft.js → skills-plugins-vfvOk34h.js} +1 -1
  147. package/build/assets/skills-settings-DnbIu2eO.js +2 -0
  148. package/build/assets/sparkles-g7y3r-Ut.js +1 -0
  149. package/build/assets/{styled-tooltip-B3kIdVyH.js → styled-tooltip-CQ9JEFiO.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-B3k4W1cK.js → task-list-tab-DeF_uXdw.js} +1 -1
  153. package/build/assets/{terminal-cMS3RgVE.js → terminal-BUpID2wS.js} +1 -1
  154. package/build/assets/{terminal-CBI_41Zc.js → terminal-DRc4rup7.js} +1 -1
  155. package/build/assets/{toggle-switch-DYRr9CAR.js → toggle-switch--8n8NeV_.js} +1 -1
  156. package/build/assets/{trash-2-gZPlx23R.js → trash-2-CzDVN-Iw.js} +1 -1
  157. package/build/assets/{typography-B1UxuuEC.js → typography-BSbUhJPn.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-CjSvKWFH.js → use-acp-credential-form-BGKFi1VL.js} +1 -1
  162. package/build/assets/{use-activate-agent-profile-DCRf47e-.js → use-activate-agent-profile-2nvALjC-.js} +1 -1
  163. package/build/assets/use-agent-profiles-BlQA67MW.js +1 -0
  164. package/build/assets/{use-breakpoint-DA7JqsRN.js → use-breakpoint-DWtihr9g.js} +1 -1
  165. package/build/assets/{use-can-manage-org-profiles-vBiP7rHF.js → use-can-manage-org-profiles-Clw5Dh1s.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-BMq9gw93.js → use-cloud-current-user-id-B8AQSQFM.js} +1 -1
  168. package/build/assets/use-config-C3zGuUQI.js +1 -0
  169. package/build/assets/{use-create-conversation-CakhLF0X.js → use-create-conversation-FaP0kUpg.js} +1 -1
  170. package/build/assets/{use-create-secret-RT4QtSS9.js → use-create-secret-CgQ3pXd6.js} +1 -1
  171. package/build/assets/use-is-authed-Bka89Xmm.js +1 -0
  172. package/build/assets/{use-is-creating-conversation-CIAcnd8M.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-C-tDO6UB.js +1 -0
  175. package/build/assets/use-manifest-capabilities-DLP5wCxp.js +1 -0
  176. package/build/assets/{use-onboarding-completion-CJU4MNAY.js → use-onboarding-completion-BiCdXvlU.js} +1 -1
  177. package/build/assets/{use-plugins-marketplace-D-93nqtJ.js → use-plugins-marketplace-DRFNLBlr.js} +1 -1
  178. package/build/assets/use-save-agent-profile-CaGVAudI.js +1 -0
  179. package/build/assets/{use-save-settings--C6LZXfI.js → use-save-settings-C9B8Y-h3.js} +1 -1
  180. package/build/assets/{use-settings-DIAo5KFk.js → use-settings-3RcgdUuZ.js} +1 -1
  181. package/build/assets/use-settings-nav-items-y-Oyc93G.js +16 -0
  182. package/build/assets/use-tracking-CTtkLAmx.js +3 -0
  183. package/build/assets/{use-user-conversation-DhcAEyJX.js → use-user-conversation-Bei82QsZ.js} +1 -1
  184. package/build/assets/useInfiniteQuery-DbCv0Jzd.js +1 -0
  185. package/build/assets/{useMutation-DHLpZ6J0.js → useMutation-ChpkYxI5.js} +1 -1
  186. package/build/assets/{useQueries-B3T1a7qt.js → useQueries-Cjv3E8_1.js} +1 -1
  187. package/build/assets/useQuery-BCnzy4LX.js +1 -0
  188. package/build/assets/utils-BX9XJ0IE.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-Di4qO77Y.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~g4xrpilz-CYPMCkX1.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-atebg0iG.js → vendor~files-tab-C87pjSpi.js} +1 -1
  200. package/build/assets/{vendor~index-home~home~conversation-panel~conversation-G9DMrR7m.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-DEhW1h3I.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-CjECvSl5.js +1 -0
  208. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-CQR5Sa0H.js +1 -0
  209. package/build/assets/vendor~root-layout~index-home~home~mcp~automations-list~automation-templates~automation-set~bxsimjx0-D7IDevqN.js +1 -0
  210. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hakxo2tj-ClV0p9g3.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-Cwhh3zLe.js} +1 -1
  211. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~bi2r7bko-VFnwct3q.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-CuQhkiS7.js} +1 -1
  212. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~9pstowjp-BOVIFA_g.js +73 -0
  213. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~launch~skills-settings~a~eywn6ulz-BKxxr74w.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~ht43enc2-C0JXQb_q.js} +175 -54
  214. package/build/assets/{verification-settings-Vr5cN4md.js → verification-settings-nD61Ijph.js} +1 -1
  215. package/build/assets/wrench-DRitTfwe.js +1 -0
  216. package/build/assets/x-RYDBg-e2.js +1 -0
  217. package/build/assets/{x-mark-jcTkPiOB.js → x-mark-BopmFoBq.js} +1 -1
  218. package/build/assets/zap-tbKDzCe3.js +1 -0
  219. package/build/index.html +4 -4
  220. package/build/locales/ar/openhands.json +106 -5
  221. package/build/locales/ca/openhands.json +106 -5
  222. package/build/locales/de/openhands.json +106 -5
  223. package/build/locales/en/openhands.json +107 -6
  224. package/build/locales/es/openhands.json +106 -5
  225. package/build/locales/fr/openhands.json +106 -5
  226. package/build/locales/it/openhands.json +106 -5
  227. package/build/locales/ja/openhands.json +106 -5
  228. package/build/locales/ko-KR/openhands.json +106 -5
  229. package/build/locales/no/openhands.json +106 -5
  230. package/build/locales/pt/openhands.json +106 -5
  231. package/build/locales/tr/openhands.json +106 -5
  232. package/build/locales/uk/openhands.json +106 -5
  233. package/build/locales/zh-CN/openhands.json +106 -5
  234. package/build/locales/zh-TW/openhands.json +106 -5
  235. package/build/mockServiceWorker.js +21 -9
  236. package/config/defaults.json +3 -3
  237. package/dist/api/agent-server-adapter.cjs +3 -3
  238. package/dist/api/agent-server-adapter.cjs.map +1 -1
  239. package/dist/api/agent-server-adapter.d.ts +46 -6
  240. package/dist/api/agent-server-adapter.js +187 -168
  241. package/dist/api/agent-server-adapter.js.map +1 -1
  242. package/dist/api/agent-server-compatibility.cjs +1 -1
  243. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  244. package/dist/api/agent-server-compatibility.d.ts +4 -0
  245. package/dist/api/agent-server-compatibility.js +41 -38
  246. package/dist/api/agent-server-compatibility.js.map +1 -1
  247. package/dist/api/automation-service/automation-service.api.cjs +1 -1
  248. package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
  249. package/dist/api/automation-service/automation-service.api.d.ts +25 -0
  250. package/dist/api/automation-service/automation-service.api.js +110 -62
  251. package/dist/api/automation-service/automation-service.api.js.map +1 -1
  252. package/dist/api/backend-registry/active-store.cjs +1 -1
  253. package/dist/api/backend-registry/active-store.cjs.map +1 -1
  254. package/dist/api/backend-registry/active-store.js +36 -31
  255. package/dist/api/backend-registry/active-store.js.map +1 -1
  256. package/dist/api/backend-registry/url-selection.cjs +2 -0
  257. package/dist/api/backend-registry/url-selection.cjs.map +1 -0
  258. package/dist/api/backend-registry/url-selection.d.ts +31 -0
  259. package/dist/api/backend-registry/url-selection.js +29 -0
  260. package/dist/api/backend-registry/url-selection.js.map +1 -0
  261. package/dist/api/mcp-service/mcp-redacted-credentials.cjs +1 -1
  262. package/dist/api/mcp-service/mcp-redacted-credentials.cjs.map +1 -1
  263. package/dist/api/mcp-service/mcp-redacted-credentials.d.ts +3 -2
  264. package/dist/api/mcp-service/mcp-redacted-credentials.js +32 -27
  265. package/dist/api/mcp-service/mcp-redacted-credentials.js.map +1 -1
  266. package/dist/api/mcp-service/mcp-service.api.cjs +1 -1
  267. package/dist/api/mcp-service/mcp-service.api.cjs.map +1 -1
  268. package/dist/api/mcp-service/mcp-service.api.js +19 -19
  269. package/dist/api/mcp-service/mcp-service.api.js.map +1 -1
  270. package/dist/api/settings-service/settings-service.api.cjs +1 -1
  271. package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
  272. package/dist/api/settings-service/settings-service.api.d.ts +10 -0
  273. package/dist/api/settings-service/settings-service.api.js +90 -100
  274. package/dist/api/settings-service/settings-service.api.js.map +1 -1
  275. package/dist/api/skills-service.cjs +1 -1
  276. package/dist/api/skills-service.cjs.map +1 -1
  277. package/dist/api/skills-service.js +1 -0
  278. package/dist/api/skills-service.js.map +1 -1
  279. package/dist/assets/chevron-left.d.ts +1 -1
  280. package/dist/assets/chevron-right.d.ts +1 -1
  281. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs +2 -0
  282. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs.map +1 -0
  283. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.d.ts +12 -0
  284. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js +94 -0
  285. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js.map +1 -0
  286. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  287. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  288. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +31 -90
  289. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  290. package/dist/components/conversation-events/chat/event-message-components/collapsible-thinking.d.ts +2 -1
  291. package/dist/components/conversation-events/chat/event-message-components/critic-result-display.d.ts +2 -1
  292. package/dist/components/conversation-events/chat/event-message-components/error-event-message.d.ts +2 -1
  293. package/dist/components/conversation-events/chat/event-message-components/event-group.d.ts +1 -1
  294. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.d.ts +1 -1
  295. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.d.ts +1 -1
  296. package/dist/components/conversation-events/chat/event-message-components/observation-pair-event-message.d.ts +2 -1
  297. package/dist/components/conversation-events/chat/event-message-components/skill-item-expanded.d.ts +1 -1
  298. package/dist/components/conversation-events/chat/event-message-components/skill-ready-content-list.d.ts +2 -1
  299. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.d.ts +1 -1
  300. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.d.ts +2 -1
  301. package/dist/components/conversation-events/chat/event-message.d.ts +2 -1
  302. package/dist/components/conversation-events/chat/task-tracking/task-item.d.ts +1 -1
  303. package/dist/components/conversation-events/chat/task-tracking/task-list-section.d.ts +1 -1
  304. package/dist/components/features/alerts/alert-banner.d.ts +1 -1
  305. package/dist/components/features/analytics/telemetry-consent-banner.d.ts +2 -1
  306. package/dist/components/features/automations/add-automation-modal.d.ts +1 -1
  307. package/dist/components/features/automations/automation-card-skeleton.d.ts +1 -1
  308. package/dist/components/features/automations/automation-card.d.ts +9 -1
  309. package/dist/components/features/automations/automation-group.d.ts +9 -1
  310. package/dist/components/features/automations/automation-health-badge.d.ts +8 -0
  311. package/dist/components/features/automations/automation-list-row.d.ts +3 -1
  312. package/dist/components/features/automations/automation-run-insights.d.ts +17 -0
  313. package/dist/components/features/automations/automation-view-toggle.d.ts +1 -1
  314. package/dist/components/features/automations/backend-not-configured.d.ts +1 -1
  315. package/dist/components/features/automations/create-instructions.d.ts +2 -2
  316. package/dist/components/features/automations/dashboard/automations-dashboard-controls.d.ts +18 -0
  317. package/dist/components/features/automations/dashboard/automations-filtered-empty-state.d.ts +9 -0
  318. package/dist/components/features/automations/dashboard/use-automation-sub-page-nav.d.ts +12 -0
  319. package/dist/components/features/automations/delete-confirmation-modal.d.ts +1 -1
  320. package/dist/components/features/automations/detail/active-status-badge.d.ts +1 -1
  321. package/dist/components/features/automations/detail/activity-log-item.d.ts +1 -1
  322. package/dist/components/features/automations/detail/activity-log-section.d.ts +3 -1
  323. package/dist/components/features/automations/detail/activity-section.d.ts +1 -1
  324. package/dist/components/features/automations/detail/back-link.d.ts +1 -1
  325. package/dist/components/features/automations/detail/branch-badge.d.ts +1 -1
  326. package/dist/components/features/automations/detail/config-field.d.ts +1 -1
  327. package/dist/components/features/automations/detail/configuration-section.d.ts +1 -1
  328. package/dist/components/features/automations/detail/debug-automation-button.d.ts +1 -1
  329. package/dist/components/features/automations/detail/detail-header.d.ts +1 -1
  330. package/dist/components/features/automations/detail/detail-skeleton.d.ts +1 -1
  331. package/dist/components/features/automations/detail/edit-automation-modal.d.ts +1 -1
  332. package/dist/components/features/automations/detail/not-found-state.d.ts +1 -1
  333. package/dist/components/features/automations/detail/plugin-chip.d.ts +1 -1
  334. package/dist/components/features/automations/detail/plugins-section.d.ts +1 -1
  335. package/dist/components/features/automations/detail/prompt-section.d.ts +2 -1
  336. package/dist/components/features/automations/detail/run-logs-modal.d.ts +1 -1
  337. package/dist/components/features/automations/detail/run-status-badge.d.ts +10 -1
  338. package/dist/components/features/automations/detail/section-card.d.ts +1 -1
  339. package/dist/components/features/automations/empty-state.d.ts +1 -1
  340. package/dist/components/features/automations/error-state.d.ts +1 -1
  341. package/dist/components/features/automations/import-automation-modal.d.ts +1 -1
  342. package/dist/components/features/automations/kebab-menu-item-content.d.ts +1 -1
  343. package/dist/components/features/automations/kebab-menu.d.ts +1 -1
  344. package/dist/components/features/automations/metadata-chip.d.ts +1 -1
  345. package/dist/components/features/automations/recommended-automations-launcher.d.ts +1 -8
  346. package/dist/components/features/automations/recommended-automations-section.d.ts +1 -7
  347. package/dist/components/features/automations/responder-deployment-modal.d.ts +1 -1
  348. package/dist/components/features/automations/search-input.d.ts +1 -1
  349. package/dist/components/features/automations/status-badge.d.ts +1 -1
  350. package/dist/components/features/automations/turn-off-confirmation-modal.d.ts +8 -0
  351. package/dist/components/features/automations/view-menu-item-content.d.ts +1 -1
  352. package/dist/components/features/backends/add-backend-modal.d.ts +1 -1
  353. package/dist/components/features/backends/api-key-entry-screen.d.ts +2 -1
  354. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  355. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  356. package/dist/components/features/backends/backend-form-modal.d.ts +3 -3
  357. package/dist/components/features/backends/backend-form-modal.js +568 -358
  358. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  359. package/dist/components/features/backends/backend-row.d.ts +1 -1
  360. package/dist/components/features/backends/backend-selector.d.ts +2 -1
  361. package/dist/components/features/backends/backend-status-dot.d.ts +2 -1
  362. package/dist/components/features/backends/backend-version.d.ts +1 -1
  363. package/dist/components/features/backends/device-flow-auth.cjs +1 -1
  364. package/dist/components/features/backends/device-flow-auth.cjs.map +1 -1
  365. package/dist/components/features/backends/device-flow-auth.d.ts +9 -1
  366. package/dist/components/features/backends/device-flow-auth.js +56 -55
  367. package/dist/components/features/backends/device-flow-auth.js.map +1 -1
  368. package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
  369. package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
  370. package/dist/components/features/backends/manage-backends-modal.d.ts +2 -1
  371. package/dist/components/features/backends/manage-backends-modal.js +1 -1
  372. package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
  373. package/dist/components/features/browser/browser-chrome-bar.d.ts +1 -1
  374. package/dist/components/features/browser/browser-snapshot.d.ts +1 -1
  375. package/dist/components/features/browser/browser.d.ts +1 -1
  376. package/dist/components/features/browser/empty-browser-message.d.ts +1 -1
  377. package/dist/components/features/chat/btw-messages.d.ts +1 -1
  378. package/dist/components/features/chat/change-agent-button.d.ts +2 -1
  379. package/dist/components/features/chat/change-agent-context-menu.d.ts +1 -1
  380. package/dist/components/features/chat/chat-action-tooltip.d.ts +1 -1
  381. package/dist/components/features/chat/chat-add-file-button.d.ts +2 -1
  382. package/dist/components/features/chat/chat-interface.cjs +1 -1
  383. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  384. package/dist/components/features/chat/chat-interface.d.ts +2 -1
  385. package/dist/components/features/chat/chat-interface.js +105 -105
  386. package/dist/components/features/chat/chat-interface.js.map +1 -1
  387. package/dist/components/features/chat/chat-message.cjs +1 -1
  388. package/dist/components/features/chat/chat-message.cjs.map +1 -1
  389. package/dist/components/features/chat/chat-message.d.ts +2 -1
  390. package/dist/components/features/chat/chat-message.js +59 -49
  391. package/dist/components/features/chat/chat-message.js.map +1 -1
  392. package/dist/components/features/chat/chat-messages-skeleton.d.ts +2 -1
  393. package/dist/components/features/chat/chat-play-button.d.ts +1 -1
  394. package/dist/components/features/chat/chat-send-button.d.ts +1 -1
  395. package/dist/components/features/chat/chat-status-indicator.d.ts +1 -1
  396. package/dist/components/features/chat/chat-stop-button.d.ts +1 -1
  397. package/dist/components/features/chat/chat-suggestions.d.ts +1 -1
  398. package/dist/components/features/chat/components/chat-input-actions.d.ts +2 -1
  399. package/dist/components/features/chat/components/chat-input-container.d.ts +1 -1
  400. package/dist/components/features/chat/components/chat-input-field.d.ts +1 -1
  401. package/dist/components/features/chat/components/chat-input-grip.d.ts +1 -1
  402. package/dist/components/features/chat/components/chat-input-llm-profile-picker.d.ts +3 -2
  403. package/dist/components/features/chat/components/chat-input-model.d.ts +3 -2
  404. package/dist/components/features/chat/components/chat-input-profile-picker.d.ts +1 -1
  405. package/dist/components/features/chat/components/chat-input-row.d.ts +1 -1
  406. package/dist/components/features/chat/components/hidden-file-input.d.ts +1 -1
  407. package/dist/components/features/chat/components/slash-command-menu.d.ts +2 -1
  408. package/dist/components/features/chat/confirmation-mode-enabled.d.ts +1 -1
  409. package/dist/components/features/chat/custom-chat-input.d.ts +1 -1
  410. package/dist/components/features/chat/drag-over.d.ts +1 -1
  411. package/dist/components/features/chat/error-message-banner.d.ts +2 -1
  412. package/dist/components/features/chat/error-message.d.ts +2 -1
  413. package/dist/components/features/chat/generic-event-message.d.ts +1 -1
  414. package/dist/components/features/chat/git-control-bar-branch-button.d.ts +1 -1
  415. package/dist/components/features/chat/git-control-bar-pr-button.d.ts +1 -1
  416. package/dist/components/features/chat/git-control-bar-pull-button.d.ts +1 -1
  417. package/dist/components/features/chat/git-control-bar-push-button.d.ts +1 -1
  418. package/dist/components/features/chat/git-control-bar-repo-button.d.ts +1 -1
  419. package/dist/components/features/chat/git-control-bar-tooltip-wrapper.d.ts +1 -1
  420. package/dist/components/features/chat/git-control-bar.d.ts +1 -1
  421. package/dist/components/features/chat/git-external-link-icon.d.ts +1 -1
  422. package/dist/components/features/chat/goal-status-banner.d.ts +1 -1
  423. package/dist/components/features/chat/goal-status-content.d.ts +1 -1
  424. package/dist/components/features/chat/got-it-button.d.ts +1 -1
  425. package/dist/components/features/chat/interactive-chat-box.d.ts +1 -1
  426. package/dist/components/features/chat/model-messages.d.ts +2 -1
  427. package/dist/components/features/chat/mono-component.d.ts +1 -1
  428. package/dist/components/features/chat/open-repository-modal.d.ts +2 -1
  429. package/dist/components/features/chat/pasted-image-upload-as-file-button.d.ts +1 -1
  430. package/dist/components/features/chat/path-component.d.ts +1 -1
  431. package/dist/components/features/chat/pending-stop-icon.d.ts +1 -1
  432. package/dist/components/features/chat/pending-user-messages.cjs +1 -1
  433. package/dist/components/features/chat/pending-user-messages.cjs.map +1 -1
  434. package/dist/components/features/chat/pending-user-messages.d.ts +2 -1
  435. package/dist/components/features/chat/pending-user-messages.js +4 -1
  436. package/dist/components/features/chat/pending-user-messages.js.map +1 -1
  437. package/dist/components/features/chat/plan-preview.d.ts +1 -1
  438. package/dist/components/features/chat/remove-file-button.d.ts +1 -1
  439. package/dist/components/features/chat/skill-install-restart-banner.d.ts +1 -1
  440. package/dist/components/features/chat/success-indicator.d.ts +1 -1
  441. package/dist/components/features/chat/task-tracking/status-badge.d.ts +1 -1
  442. package/dist/components/features/chat/task-tracking/status-icon.d.ts +1 -1
  443. package/dist/components/features/chat/task-tracking/task-item.d.ts +1 -1
  444. package/dist/components/features/chat/task-tracking/task-list-section.d.ts +1 -1
  445. package/dist/components/features/chat/tool-visualizers/primitives/code-block.d.ts +2 -1
  446. package/dist/components/features/chat/tool-visualizers/primitives/diff-view.d.ts +2 -1
  447. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.d.ts +2 -1
  448. package/dist/components/features/chat/tool-visualizers/primitives/key-value-grid.d.ts +1 -1
  449. package/dist/components/features/chat/tool-visualizers/primitives/output-pane.d.ts +2 -1
  450. package/dist/components/features/chat/typing-indicator.cjs +1 -1
  451. package/dist/components/features/chat/typing-indicator.cjs.map +1 -1
  452. package/dist/components/features/chat/typing-indicator.d.ts +8 -1
  453. package/dist/components/features/chat/typing-indicator.js +94 -10
  454. package/dist/components/features/chat/typing-indicator.js.map +1 -1
  455. package/dist/components/features/chat/uploaded-file.d.ts +1 -1
  456. package/dist/components/features/chat/uploaded-files.d.ts +1 -1
  457. package/dist/components/features/chat/uploaded-image.d.ts +2 -1
  458. package/dist/components/features/chat/user-message-body.d.ts +2 -2
  459. package/dist/components/features/chat/waiting-for-runtime-message.d.ts +1 -1
  460. package/dist/components/features/chat/workspace-mode-icon.d.ts +1 -1
  461. package/dist/components/features/chat/workspace-mode-selector.d.ts +1 -1
  462. package/dist/components/features/command-menu/command-menu-items.d.ts +5 -1
  463. package/dist/components/features/command-menu/command-menu-trigger.d.ts +2 -1
  464. package/dist/components/features/context-menu/archived-disabled-tooltip.d.ts +1 -1
  465. package/dist/components/features/context-menu/context-menu-icon-text-with-description.d.ts +1 -1
  466. package/dist/components/features/context-menu/context-menu-icon-text.d.ts +1 -1
  467. package/dist/components/features/context-menu/context-menu-list-item.cjs +1 -1
  468. package/dist/components/features/context-menu/context-menu-list-item.cjs.map +1 -1
  469. package/dist/components/features/context-menu/context-menu-list-item.d.ts +2 -1
  470. package/dist/components/features/context-menu/context-menu-list-item.js +2 -1
  471. package/dist/components/features/context-menu/context-menu-list-item.js.map +1 -1
  472. package/dist/components/features/controls/agent-loading.d.ts +1 -1
  473. package/dist/components/features/controls/agent-status.d.ts +1 -1
  474. package/dist/components/features/controls/git-tools-submenu.d.ts +1 -1
  475. package/dist/components/features/controls/macros-submenu.d.ts +1 -1
  476. package/dist/components/features/controls/server-status-context-menu-icon-text.d.ts +1 -1
  477. package/dist/components/features/controls/server-status-context-menu.d.ts +1 -1
  478. package/dist/components/features/controls/server-status.d.ts +1 -1
  479. package/dist/components/features/controls/tools-context-menu-icon-text.d.ts +1 -1
  480. package/dist/components/features/controls/tools-context-menu.d.ts +1 -1
  481. package/dist/components/features/controls/tools.d.ts +2 -1
  482. package/dist/components/features/conversation/conversation-loading.d.ts +1 -1
  483. package/dist/components/features/conversation/conversation-main/chat-interface-wrapper.d.ts +1 -1
  484. package/dist/components/features/conversation/conversation-main/conversation-main.d.ts +1 -1
  485. package/dist/components/features/conversation/conversation-main/conversation-mobile-panel-page.d.ts +2 -1
  486. package/dist/components/features/conversation/conversation-name-context-menu-icon-text.d.ts +1 -1
  487. package/dist/components/features/conversation/conversation-name-context-menu.d.ts +1 -1
  488. package/dist/components/features/conversation/conversation-name-with-status.d.ts +2 -1
  489. package/dist/components/features/conversation/conversation-name.d.ts +2 -1
  490. package/dist/components/features/conversation/conversation-tab-empty-state.d.ts +1 -1
  491. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content-crossfade.d.ts +1 -1
  492. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.d.ts +1 -1
  493. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/suspense-pending-fallback.d.ts +1 -1
  494. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/tab-container.d.ts +1 -1
  495. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/tab-content-area.d.ts +1 -1
  496. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/tab-wrapper.d.ts +1 -1
  497. package/dist/components/features/conversation/conversation-tabs/conversation-tab-nav.d.ts +1 -1
  498. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.d.ts +1 -1
  499. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.d.ts +1 -1
  500. package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.d.ts +1 -1
  501. package/dist/components/features/conversation/metrics-modal/context-window-section.d.ts +1 -1
  502. package/dist/components/features/conversation/metrics-modal/cost-section.d.ts +1 -1
  503. package/dist/components/features/conversation/metrics-modal/empty-state.d.ts +1 -1
  504. package/dist/components/features/conversation/metrics-modal/metric-row.d.ts +1 -1
  505. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.d.ts +1 -1
  506. package/dist/components/features/conversation/metrics-modal/metrics-modal.d.ts +1 -1
  507. package/dist/components/features/conversation/metrics-modal/usage-section.d.ts +1 -1
  508. package/dist/components/features/conversation/right-panel-toggle.d.ts +1 -1
  509. package/dist/components/features/conversation/transcript-export-modal.d.ts +2 -1
  510. package/dist/components/features/conversation-panel/budget-display.d.ts +2 -1
  511. package/dist/components/features/conversation-panel/budget-progress-bar.d.ts +1 -1
  512. package/dist/components/features/conversation-panel/budget-usage-text.d.ts +2 -1
  513. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.d.ts +1 -1
  514. package/dist/components/features/conversation-panel/compact-conversation-row.cjs +1 -1
  515. package/dist/components/features/conversation-panel/compact-conversation-row.cjs.map +1 -1
  516. package/dist/components/features/conversation-panel/compact-conversation-row.d.ts +2 -1
  517. package/dist/components/features/conversation-panel/compact-conversation-row.js +38 -37
  518. package/dist/components/features/conversation-panel/compact-conversation-row.js.map +1 -1
  519. package/dist/components/features/conversation-panel/confirm-delete-modal.d.ts +1 -1
  520. package/dist/components/features/conversation-panel/confirm-stop-modal.d.ts +1 -1
  521. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +1 -1
  522. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.d.ts +1 -1
  523. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +1 -1
  524. package/dist/components/features/conversation-panel/conversation-card/conversation-card-header.d.ts +1 -1
  525. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.d.ts +1 -1
  526. package/dist/components/features/conversation-panel/conversation-card/conversation-card-skeleton.d.ts +1 -1
  527. package/dist/components/features/conversation-panel/conversation-card/conversation-card-title.d.ts +1 -1
  528. package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +2 -1
  529. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.d.ts +1 -1
  530. package/dist/components/features/conversation-panel/conversation-card/conversation-status-badges.d.ts +1 -1
  531. package/dist/components/features/conversation-panel/conversation-card/no-repository.d.ts +1 -1
  532. package/dist/components/features/conversation-panel/conversation-group-folder-list.d.ts +1 -1
  533. package/dist/components/features/conversation-panel/conversation-group-folder-row.d.ts +1 -1
  534. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +1 -1
  535. package/dist/components/features/conversation-panel/conversation-panel-new-thread-picker.d.ts +1 -1
  536. package/dist/components/features/conversation-panel/conversation-panel-pinned-section.d.ts +1 -1
  537. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  538. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  539. package/dist/components/features/conversation-panel/conversation-panel.d.ts +2 -1
  540. package/dist/components/features/conversation-panel/conversation-panel.js +221 -220
  541. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  542. package/dist/components/features/conversation-panel/conversation-status-dot.d.ts +1 -1
  543. package/dist/components/features/conversation-panel/exit-conversation-modal.d.ts +1 -1
  544. package/dist/components/features/conversation-panel/hook-event-item.d.ts +1 -1
  545. package/dist/components/features/conversation-panel/hook-matcher-content.d.ts +1 -1
  546. package/dist/components/features/conversation-panel/hooks-empty-state.d.ts +1 -1
  547. package/dist/components/features/conversation-panel/hooks-loading-state.d.ts +1 -1
  548. package/dist/components/features/conversation-panel/hooks-modal-header.d.ts +1 -1
  549. package/dist/components/features/conversation-panel/hooks-modal.d.ts +1 -1
  550. package/dist/components/features/conversation-panel/local-new-conversation-menu.d.ts +1 -1
  551. package/dist/components/features/conversation-panel/menu-heading.d.ts +1 -1
  552. package/dist/components/features/conversation-panel/menu-row.d.ts +1 -1
  553. package/dist/components/features/conversation-panel/menu-separator.d.ts +1 -1
  554. package/dist/components/features/conversation-panel/new-conversation-button.d.ts +2 -1
  555. package/dist/components/features/conversation-panel/plugins-modal.d.ts +1 -1
  556. package/dist/components/features/conversation-panel/runtime-waiting-state.d.ts +1 -1
  557. package/dist/components/features/conversation-panel/skill-content.d.ts +1 -1
  558. package/dist/components/features/conversation-panel/skill-item.d.ts +1 -1
  559. package/dist/components/features/conversation-panel/skill-triggers.d.ts +1 -1
  560. package/dist/components/features/conversation-panel/skills-empty-state.d.ts +1 -1
  561. package/dist/components/features/conversation-panel/skills-loading-state.d.ts +1 -1
  562. package/dist/components/features/conversation-panel/skills-modal-header.d.ts +1 -1
  563. package/dist/components/features/conversation-panel/skills-modal-section.d.ts +1 -1
  564. package/dist/components/features/conversation-panel/skills-modal.d.ts +1 -1
  565. package/dist/components/features/conversation-panel/start-task-card/start-task-card-footer.d.ts +1 -1
  566. package/dist/components/features/conversation-panel/start-task-card/start-task-card-header.d.ts +1 -1
  567. package/dist/components/features/conversation-panel/start-task-card/start-task-card.d.ts +1 -1
  568. package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.d.ts +1 -1
  569. package/dist/components/features/conversation-panel/start-task-card/start-task-status-indicator.d.ts +1 -1
  570. package/dist/components/features/conversation-panel/system-message-modal/empty-tools-state.d.ts +1 -1
  571. package/dist/components/features/conversation-panel/system-message-modal/system-message-content.d.ts +1 -1
  572. package/dist/components/features/conversation-panel/system-message-modal/system-message-header.d.ts +1 -1
  573. package/dist/components/features/conversation-panel/system-message-modal/tab-button.d.ts +1 -1
  574. package/dist/components/features/conversation-panel/system-message-modal/tab-content.d.ts +1 -1
  575. package/dist/components/features/conversation-panel/system-message-modal/tab-navigation.d.ts +1 -1
  576. package/dist/components/features/conversation-panel/system-message-modal/toggle-button.d.ts +1 -1
  577. package/dist/components/features/conversation-panel/system-message-modal/tool-item.d.ts +1 -1
  578. package/dist/components/features/conversation-panel/system-message-modal/tool-parameters.d.ts +1 -1
  579. package/dist/components/features/conversation-panel/system-message-modal/tools-list.d.ts +1 -1
  580. package/dist/components/features/conversation-panel/system-message-modal.d.ts +1 -1
  581. package/dist/components/features/diff-viewer/commit-list.d.ts +2 -1
  582. package/dist/components/features/diff-viewer/commit-row.d.ts +2 -1
  583. package/dist/components/features/diff-viewer/diff-drawer-icon.d.ts +1 -1
  584. package/dist/components/features/diff-viewer/editor-container.d.ts +1 -1
  585. package/dist/components/features/diff-viewer/empty-changes-message.d.ts +1 -1
  586. package/dist/components/features/diff-viewer/file-diff-viewer.d.ts +2 -1
  587. package/dist/components/features/diff-viewer/loading-spinner.d.ts +1 -1
  588. package/dist/components/features/files/file-item.d.ts +1 -1
  589. package/dist/components/features/files/file-list.d.ts +2 -1
  590. package/dist/components/features/files-tab/file-content-viewer.d.ts +1 -1
  591. package/dist/components/features/files-tab/file-quick-row.d.ts +1 -1
  592. package/dist/components/features/files-tab/file-tree-view.d.ts +1 -1
  593. package/dist/components/features/files-tab/highlighted-source-view.d.ts +1 -1
  594. package/dist/components/features/files-tab/no-file-selected-message.d.ts +1 -1
  595. package/dist/components/features/files-tab/segmented-toggle.cjs +1 -1
  596. package/dist/components/features/files-tab/segmented-toggle.cjs.map +1 -1
  597. package/dist/components/features/files-tab/segmented-toggle.d.ts +3 -1
  598. package/dist/components/features/files-tab/segmented-toggle.js +17 -14
  599. package/dist/components/features/files-tab/segmented-toggle.js.map +1 -1
  600. package/dist/components/features/files-tab/tree-node.d.ts +1 -1
  601. package/dist/components/features/home/featured-automations/automation-health-indicator.d.ts +11 -0
  602. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.d.ts +18 -0
  603. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.d.ts +14 -0
  604. package/dist/components/features/home/featured-automations/automation-run-health.d.ts +25 -0
  605. package/dist/components/features/home/featured-automations/build-home-automation-menu-items.d.ts +39 -0
  606. package/dist/components/features/home/featured-automations/build-pinned-automation-menu-items.d.ts +22 -0
  607. package/dist/components/features/home/featured-automations/home-automation-activity.d.ts +23 -0
  608. package/dist/components/features/home/featured-automations/home-automation-menu.d.ts +13 -0
  609. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.d.ts +12 -0
  610. package/dist/components/features/home/featured-automations/pinned-automation-card.d.ts +21 -0
  611. package/dist/components/features/home/featured-automations/pinned-automations-dashboard.d.ts +6 -0
  612. package/dist/components/features/home/featured-automations/running-automations-list.d.ts +6 -0
  613. package/dist/components/features/home/git-branch-dropdown/branch-dropdown-menu.d.ts +1 -1
  614. package/dist/components/features/home/git-branch-dropdown/git-branch-dropdown.d.ts +2 -1
  615. package/dist/components/features/home/git-provider-dropdown/git-provider-dropdown.d.ts +2 -1
  616. package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.d.ts +2 -1
  617. package/dist/components/features/home/home-chat-launcher.d.ts +1 -1
  618. package/dist/components/features/home/home-git-control-bar-preview.d.ts +1 -1
  619. package/dist/components/features/home/home-header/guide-message.d.ts +1 -1
  620. package/dist/components/features/home/home-header/home-header-title.d.ts +1 -1
  621. package/dist/components/features/home/home-header/home-header.d.ts +1 -1
  622. package/dist/components/features/home/llm-not-configured-banner.d.ts +1 -1
  623. package/dist/components/features/home/new-conversation/create-conversation-button.d.ts +1 -1
  624. package/dist/components/features/home/new-conversation/new-conversation.d.ts +1 -1
  625. package/dist/components/features/home/new-conversation.d.ts +1 -1
  626. package/dist/components/features/home/open-launcher-button.d.ts +1 -1
  627. package/dist/components/features/home/open-repository-dialog.d.ts +1 -1
  628. package/dist/components/features/home/open-workspace-dialog.d.ts +1 -1
  629. package/dist/components/features/home/repo-selection-form.d.ts +2 -1
  630. package/dist/components/features/home/shared/clear-button.d.ts +2 -1
  631. package/dist/components/features/home/shared/dropdown-item.d.ts +1 -1
  632. package/dist/components/features/home/shared/empty-state.d.ts +2 -1
  633. package/dist/components/features/home/shared/error-message.d.ts +2 -1
  634. package/dist/components/features/home/shared/generic-dropdown-menu.d.ts +1 -1
  635. package/dist/components/features/home/shared/loading-spinner.d.ts +2 -1
  636. package/dist/components/features/home/shared/toggle-button.d.ts +1 -1
  637. package/dist/components/features/home/tasks/task-card.d.ts +1 -1
  638. package/dist/components/features/home/tasks/task-group.d.ts +1 -1
  639. package/dist/components/features/home/tasks/task-issue-number.d.ts +1 -1
  640. package/dist/components/features/home/tasks/task-item-title.d.ts +1 -1
  641. package/dist/components/features/home/tasks/task-suggestions-skeleton.d.ts +1 -1
  642. package/dist/components/features/home/tasks/task-suggestions.d.ts +1 -1
  643. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.d.ts +2 -1
  644. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.d.ts +2 -1
  645. package/dist/components/features/home/workspace-dropdown/workspace-dropdown.d.ts +2 -1
  646. package/dist/components/features/home/workspace-selection-form.d.ts +2 -1
  647. package/dist/components/features/images/image-carousel.d.ts +2 -1
  648. package/dist/components/features/images/image-preview.d.ts +1 -1
  649. package/dist/components/features/images/thumbnail.d.ts +1 -1
  650. package/dist/components/features/launch/plugin-launch-modal.d.ts +2 -1
  651. package/dist/components/features/launch/plugin-launch-parameter-input.d.ts +1 -1
  652. package/dist/components/features/launch/plugin-launch-plugin-section.d.ts +1 -1
  653. package/dist/components/features/manifest/manifest-form-field.d.ts +27 -0
  654. package/dist/components/features/manifest/manifest-icons.d.ts +13 -0
  655. package/dist/components/features/manifest/manifest-overview-tiles.d.ts +19 -0
  656. package/dist/components/features/manifest/manifest-prerequisites-step.d.ts +11 -0
  657. package/dist/components/features/manifest/manifest-review-step.d.ts +14 -0
  658. package/dist/components/features/manifest/manifest-setup-dialog.d.ts +14 -0
  659. package/dist/components/features/manifest/manifest-subpage-layout.d.ts +23 -0
  660. package/dist/components/features/markdown/anchor.d.ts +1 -1
  661. package/dist/components/features/markdown/blockquote.d.ts +1 -1
  662. package/dist/components/features/markdown/code.d.ts +1 -1
  663. package/dist/components/features/markdown/headings.d.ts +6 -6
  664. package/dist/components/features/markdown/horizontal-rule.d.ts +1 -1
  665. package/dist/components/features/markdown/list.d.ts +3 -3
  666. package/dist/components/features/markdown/markdown-renderer.d.ts +1 -1
  667. package/dist/components/features/markdown/markdown-table-scroll.d.ts +1 -1
  668. package/dist/components/features/markdown/paragraph.d.ts +1 -1
  669. package/dist/components/features/markdown/plan-components.d.ts +36 -36
  670. package/dist/components/features/markdown/table.d.ts +3 -3
  671. package/dist/components/features/mcp-logo-badge.d.ts +1 -1
  672. package/dist/components/features/mcp-page/custom-server-editor.cjs +1 -1
  673. package/dist/components/features/mcp-page/custom-server-editor.cjs.map +1 -1
  674. package/dist/components/features/mcp-page/custom-server-editor.d.ts +2 -1
  675. package/dist/components/features/mcp-page/custom-server-editor.js +5 -0
  676. package/dist/components/features/mcp-page/custom-server-editor.js.map +1 -1
  677. package/dist/components/features/mcp-page/install-server-modal.cjs +1 -1
  678. package/dist/components/features/mcp-page/install-server-modal.cjs.map +1 -1
  679. package/dist/components/features/mcp-page/install-server-modal.d.ts +2 -1
  680. package/dist/components/features/mcp-page/install-server-modal.js +117 -118
  681. package/dist/components/features/mcp-page/install-server-modal.js.map +1 -1
  682. package/dist/components/features/mcp-page/installed-server-card.d.ts +2 -1
  683. package/dist/components/features/mcp-page/installed-servers-section.d.ts +1 -1
  684. package/dist/components/features/mcp-page/marketplace-card.d.ts +1 -1
  685. package/dist/components/features/mcp-page/marketplace-section.d.ts +1 -1
  686. package/dist/components/features/mcp-page/mcp-logo-stack-badge.d.ts +1 -1
  687. package/dist/components/features/mcp-page/mcp-section-filter-dropdown.d.ts +1 -1
  688. package/dist/components/features/mcp-page/mcp-server-health.d.ts +2 -1
  689. package/dist/components/features/mcp-page/mcp-toolbar.d.ts +1 -1
  690. package/dist/components/features/mcp-page/save-as-secret-toggle.d.ts +1 -1
  691. package/dist/components/features/onboarding/onboarding-host.d.ts +1 -1
  692. package/dist/components/features/onboarding/onboarding-modal.d.ts +2 -1
  693. package/dist/components/features/onboarding/onboarding-progress-bar.d.ts +1 -1
  694. package/dist/components/features/onboarding/steps/check-backend-step.d.ts +2 -1
  695. package/dist/components/features/onboarding/steps/choose-agent-step.d.ts +3 -2
  696. package/dist/components/features/onboarding/steps/say-hello-step.d.ts +2 -1
  697. package/dist/components/features/onboarding/steps/setup-acp-secrets-step.d.ts +2 -1
  698. package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +2 -1
  699. package/dist/components/features/plugins/add-plugin-modal.d.ts +2 -1
  700. package/dist/components/features/plugins/plugin-card.d.ts +2 -1
  701. package/dist/components/features/plugins/plugin-detail-modal.d.ts +1 -1
  702. package/dist/components/features/plugins/plugin-files-section.d.ts +2 -1
  703. package/dist/components/features/plugins/plugin-picker-card.d.ts +1 -1
  704. package/dist/components/features/plugins/plugin-picker-modal.d.ts +1 -1
  705. package/dist/components/features/plugins/plugin-picker-trigger.d.ts +1 -1
  706. package/dist/components/features/plugins/plugin-picker.d.ts +1 -1
  707. package/dist/components/features/plugins/plugins-toolbar.d.ts +1 -1
  708. package/dist/components/features/settings/acp-auth-status-banner.d.ts +1 -1
  709. package/dist/components/features/settings/acp-conflict-warnings.d.ts +2 -1
  710. package/dist/components/features/settings/acp-credentials-section.d.ts +1 -1
  711. package/dist/components/features/settings/acp-secret-field.d.ts +2 -1
  712. package/dist/components/features/settings/agent-canvas-update-card.d.ts +1 -1
  713. package/dist/components/features/settings/agent-profiles/agent-profile-actions-menu.d.ts +1 -1
  714. package/dist/components/features/settings/agent-profiles/agent-profile-row.d.ts +1 -1
  715. package/dist/components/features/settings/agent-profiles/agent-profiles-body.d.ts +1 -1
  716. package/dist/components/features/settings/agent-profiles/agent-profiles-local-view.d.ts +1 -1
  717. package/dist/components/features/settings/agent-profiles/agent-profiles-manager.d.ts +1 -1
  718. package/dist/components/features/settings/agent-profiles/delete-agent-profile-modal.d.ts +1 -1
  719. package/dist/components/features/settings/agent-server-onboarding.d.ts +2 -1
  720. package/dist/components/features/settings/api-key-modal-base.d.ts +1 -1
  721. package/dist/components/features/settings/app-settings/app-settings-inputs-skeleton.d.ts +1 -1
  722. package/dist/components/features/settings/app-settings/language-input.d.ts +1 -1
  723. package/dist/components/features/settings/app-settings/theme-input.d.ts +2 -1
  724. package/dist/components/features/settings/backend-synced-settings-badge.d.ts +1 -1
  725. package/dist/components/features/settings/banner-message.d.ts +1 -1
  726. package/dist/components/features/settings/cloud-settings-link.d.ts +1 -1
  727. package/dist/components/features/settings/input-skeleton.d.ts +1 -1
  728. package/dist/components/features/settings/integrations-settings-link.d.ts +1 -1
  729. package/dist/components/features/settings/key-status-icon.d.ts +1 -1
  730. package/dist/components/features/settings/llm-profiles/delete-profile-modal.d.ts +1 -1
  731. package/dist/components/features/settings/llm-profiles/llm-profiles-manager.d.ts +1 -1
  732. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.d.ts +2 -1
  733. package/dist/components/features/settings/llm-profiles/profile-actions-menu-item.d.ts +1 -1
  734. package/dist/components/features/settings/llm-profiles/profile-actions-menu.d.ts +1 -1
  735. package/dist/components/features/settings/llm-profiles/profile-row.d.ts +1 -1
  736. package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +1 -1
  737. package/dist/components/features/settings/llm-profiles/rename-profile-modal.d.ts +1 -1
  738. package/dist/components/features/settings/llm-settings/llm-settings-inputs-skeleton.d.ts +1 -1
  739. package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.d.ts +2 -1
  740. package/dist/components/features/settings/mcp-settings/mcp-server-form.cjs +1 -1
  741. package/dist/components/features/settings/mcp-settings/mcp-server-form.cjs.map +1 -1
  742. package/dist/components/features/settings/mcp-settings/mcp-server-form.d.ts +2 -1
  743. package/dist/components/features/settings/mcp-settings/mcp-server-form.js +2 -1
  744. package/dist/components/features/settings/mcp-settings/mcp-server-form.js.map +1 -1
  745. package/dist/components/features/settings/mcp-settings/mcp-server-list-item.d.ts +1 -1
  746. package/dist/components/features/settings/mcp-settings/mcp-server-list.d.ts +1 -1
  747. package/dist/components/features/settings/mobile-header.d.ts +1 -1
  748. package/dist/components/features/settings/optional-tag.d.ts +1 -1
  749. package/dist/components/features/settings/sdk-settings/field-help.d.ts +1 -1
  750. package/dist/components/features/settings/sdk-settings/schema-field.d.ts +2 -1
  751. package/dist/components/features/settings/sdk-settings/sdk-section-page.d.ts +1 -1
  752. package/dist/components/features/settings/sdk-settings/view-toggle.d.ts +1 -1
  753. package/dist/components/features/settings/secrets-settings/secret-form.d.ts +2 -1
  754. package/dist/components/features/settings/secrets-settings/secret-list-item.d.ts +2 -2
  755. package/dist/components/features/settings/settings-desktop-sidebar.d.ts +1 -1
  756. package/dist/components/features/settings/settings-dropdown-input.d.ts +1 -1
  757. package/dist/components/features/settings/settings-input.cjs +1 -1
  758. package/dist/components/features/settings/settings-input.cjs.map +1 -1
  759. package/dist/components/features/settings/settings-input.d.ts +6 -0
  760. package/dist/components/features/settings/settings-input.js +13 -8
  761. package/dist/components/features/settings/settings-input.js.map +1 -1
  762. package/dist/components/features/settings/settings-layout.d.ts +1 -1
  763. package/dist/components/features/settings/settings-mobile-drawer.d.ts +1 -1
  764. package/dist/components/features/settings/settings-mobile-hub.d.ts +1 -1
  765. package/dist/components/features/settings/settings-nav-divider.d.ts +1 -1
  766. package/dist/components/features/settings/settings-nav-header.d.ts +1 -1
  767. package/dist/components/features/settings/settings-nav-link.d.ts +1 -1
  768. package/dist/components/features/settings/settings-navigation.d.ts +1 -1
  769. package/dist/components/features/settings/settings-switch.d.ts +1 -1
  770. package/dist/components/features/settings/subtext-skeleton.d.ts +1 -1
  771. package/dist/components/features/settings/switch-skeleton.d.ts +1 -1
  772. package/dist/components/features/settings/upgrade-banner.d.ts +1 -1
  773. package/dist/components/features/settings/upgrade-button.d.ts +1 -1
  774. package/dist/components/features/sidebar/avatar.d.ts +1 -1
  775. package/dist/components/features/sidebar/sidebar-collapsed-icon-slot.d.ts +1 -1
  776. package/dist/components/features/sidebar/sidebar-conversation-list.d.ts +1 -1
  777. package/dist/components/features/sidebar/sidebar-mobile-menu-bar.d.ts +1 -1
  778. package/dist/components/features/sidebar/sidebar-mobile-menu-toggle.d.ts +1 -1
  779. package/dist/components/features/sidebar/sidebar-mobile-nav-context.d.ts +1 -1
  780. package/dist/components/features/sidebar/sidebar-nav-link.d.ts +1 -1
  781. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  782. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  783. package/dist/components/features/sidebar/sidebar-rail-body.d.ts +1 -1
  784. package/dist/components/features/sidebar/sidebar-rail-body.js +124 -123
  785. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  786. package/dist/components/features/sidebar/sidebar.d.ts +2 -1
  787. package/dist/components/features/sidebar/user-avatar.d.ts +1 -1
  788. package/dist/components/features/skills/add-skill-modal.d.ts +2 -1
  789. package/dist/components/features/skills/extensions-mobile-hub.d.ts +1 -1
  790. package/dist/components/features/skills/extensions-navigation.d.ts +1 -1
  791. package/dist/components/features/skills/skill-card-pill-row.d.ts +1 -1
  792. package/dist/components/features/skills/skill-card.d.ts +2 -1
  793. package/dist/components/features/skills/skill-detail-modal.d.ts +2 -1
  794. package/dist/components/features/skills/skill-facet-rail.d.ts +8 -0
  795. package/dist/components/features/skills/skill-facet-row.d.ts +13 -0
  796. package/dist/components/features/skills/skill-filter.d.ts +34 -0
  797. package/dist/components/features/skills/skill-filters-modal.d.ts +10 -0
  798. package/dist/components/features/skills/skill-icon-badge.d.ts +1 -1
  799. package/dist/components/features/skills/skill-type-badge.d.ts +1 -1
  800. package/dist/components/features/skills/skills-toolbar.d.ts +3 -4
  801. package/dist/components/features/suggestions/suggestion-item.d.ts +1 -1
  802. package/dist/components/features/suggestions/suggestions.d.ts +1 -1
  803. package/dist/components/features/terminal/empty-terminal-message.d.ts +1 -1
  804. package/dist/components/features/terminal/terminal.d.ts +1 -1
  805. package/dist/components/features/tips/random-tip.d.ts +2 -1
  806. package/dist/components/providers/agent-server-ui-providers.d.ts +1 -1
  807. package/dist/components/providers/agent-server-ui-root.d.ts +1 -1
  808. package/dist/components/providers/telemetry-provider.d.ts +1 -1
  809. package/dist/components/shared/action-tooltip.d.ts +1 -1
  810. package/dist/components/shared/agent-brand-icon.d.ts +1 -1
  811. package/dist/components/shared/badge.d.ts +1 -1
  812. package/dist/components/shared/buttons/back-nav-button-content.d.ts +1 -1
  813. package/dist/components/shared/buttons/circle-plus-check-toggle.d.ts +3 -2
  814. package/dist/components/shared/buttons/conversation-confirmation-buttons.d.ts +1 -1
  815. package/dist/components/shared/buttons/copy-to-clipboard-button.d.ts +1 -1
  816. package/dist/components/shared/buttons/copyable-content-wrapper.d.ts +1 -1
  817. package/dist/components/shared/buttons/modal-button.d.ts +1 -1
  818. package/dist/components/shared/buttons/openhands-logo-button.d.ts +1 -1
  819. package/dist/components/shared/buttons/remove-button.d.ts +1 -1
  820. package/dist/components/shared/buttons/scroll-to-bottom-button.d.ts +1 -1
  821. package/dist/components/shared/buttons/styled-tooltip.d.ts +1 -1
  822. package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
  823. package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
  824. package/dist/components/shared/filters/enum-filter-dropdown.d.ts +6 -2
  825. package/dist/components/shared/filters/enum-filter-dropdown.js +13 -13
  826. package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
  827. package/dist/components/shared/git-provider-icon.d.ts +1 -1
  828. package/dist/components/shared/hook-execution-event-message.d.ts +2 -1
  829. package/dist/components/shared/loading-spinner.d.ts +1 -1
  830. package/dist/components/shared/modals/confirmation-modal.d.ts +1 -1
  831. package/dist/components/shared/modals/confirmation-modals/base-modal.d.ts +3 -3
  832. package/dist/components/shared/modals/confirmation-modals/danger-modal.d.ts +1 -1
  833. package/dist/components/shared/modals/modal-body.d.ts +1 -1
  834. package/dist/components/shared/modals/modal-close-button.d.ts +1 -1
  835. package/dist/components/shared/modals/settings/model-selector.d.ts +2 -1
  836. package/dist/components/shared/modals/settings/settings-form.d.ts +2 -1
  837. package/dist/components/shared/modals/settings/settings-modal.d.ts +1 -1
  838. package/dist/components/shared/navigation-link.cjs +1 -1
  839. package/dist/components/shared/navigation-link.cjs.map +1 -1
  840. package/dist/components/shared/navigation-link.js +11 -7
  841. package/dist/components/shared/navigation-link.js.map +1 -1
  842. package/dist/components/shared/risk-alert.d.ts +1 -1
  843. package/dist/components/shared/text-shimmer.d.ts +1 -1
  844. package/dist/components/ui/resize-handle.d.ts +1 -1
  845. package/dist/config/defaults.cjs +1 -1
  846. package/dist/config/defaults.cjs.map +1 -1
  847. package/dist/config/defaults.js +3 -3
  848. package/dist/config/defaults.js.map +1 -1
  849. package/dist/context/navigation-context.d.ts +1 -1
  850. package/dist/context/scroll-context.d.ts +1 -1
  851. package/dist/contexts/active-backend-context.d.ts +1 -1
  852. package/dist/contexts/conversation-websocket-context.d.ts +1 -1
  853. package/dist/contexts/settings-section-header-context.d.ts +1 -1
  854. package/dist/contexts/websocket-provider-wrapper.d.ts +1 -1
  855. package/dist/fixtures/home-automations-demo.d.ts +19 -0
  856. package/dist/hooks/mutation/use-add-mcp-server.cjs +1 -1
  857. package/dist/hooks/mutation/use-add-mcp-server.cjs.map +1 -1
  858. package/dist/hooks/mutation/use-add-mcp-server.js +10 -14
  859. package/dist/hooks/mutation/use-add-mcp-server.js.map +1 -1
  860. package/dist/hooks/mutation/use-delete-mcp-server.cjs +1 -1
  861. package/dist/hooks/mutation/use-delete-mcp-server.cjs.map +1 -1
  862. package/dist/hooks/mutation/use-delete-mcp-server.d.ts +2 -7
  863. package/dist/hooks/mutation/use-delete-mcp-server.js +8 -34
  864. package/dist/hooks/mutation/use-delete-mcp-server.js.map +1 -1
  865. package/dist/hooks/mutation/use-save-settings.cjs +1 -1
  866. package/dist/hooks/mutation/use-save-settings.cjs.map +1 -1
  867. package/dist/hooks/mutation/use-save-settings.js +8 -4
  868. package/dist/hooks/mutation/use-save-settings.js.map +1 -1
  869. package/dist/hooks/mutation/use-update-mcp-server.cjs +1 -1
  870. package/dist/hooks/mutation/use-update-mcp-server.cjs.map +1 -1
  871. package/dist/hooks/mutation/use-update-mcp-server.d.ts +1 -1
  872. package/dist/hooks/mutation/use-update-mcp-server.js +31 -16
  873. package/dist/hooks/mutation/use-update-mcp-server.js.map +1 -1
  874. package/dist/hooks/query/query-keys.cjs.map +1 -1
  875. package/dist/hooks/query/query-keys.d.ts +4 -0
  876. package/dist/hooks/query/query-keys.js.map +1 -1
  877. package/dist/hooks/query/use-active-conversation.d.ts +1 -1
  878. package/dist/hooks/query/use-agent-profiles.d.ts +1 -1
  879. package/dist/hooks/query/use-app-installations.d.ts +1 -1
  880. package/dist/hooks/query/use-automation-detail.d.ts +2 -2
  881. package/dist/hooks/query/use-automation-health.d.ts +2 -0
  882. package/dist/hooks/query/use-automations.d.ts +5 -1
  883. package/dist/hooks/query/use-bash-command-logs.d.ts +1 -1
  884. package/dist/hooks/query/use-cloud-sandbox.d.ts +1 -1
  885. package/dist/hooks/query/use-commit-changes.d.ts +1 -1
  886. package/dist/hooks/query/use-config.d.ts +1 -1
  887. package/dist/hooks/query/use-conversation-history.d.ts +1 -1
  888. package/dist/hooks/query/use-conversation-hooks.d.ts +1 -1
  889. package/dist/hooks/query/use-conversation-skills.d.ts +1 -1
  890. package/dist/hooks/query/use-get-secrets.d.ts +1 -1
  891. package/dist/hooks/query/use-home-automations.d.ts +20 -0
  892. package/dist/hooks/query/use-latest-automation-runs.d.ts +19 -0
  893. package/dist/hooks/query/use-llm-profiles.d.ts +1 -1
  894. package/dist/hooks/query/use-llm-subscription-models.d.ts +1 -1
  895. package/dist/hooks/query/use-llm-subscription-status.d.ts +1 -1
  896. package/dist/hooks/query/use-local-git-info.d.ts +1 -1
  897. package/dist/hooks/query/use-local-workspaces.d.ts +1 -1
  898. package/dist/hooks/query/use-manifest-capabilities.d.ts +23 -0
  899. package/dist/hooks/query/use-manifest-prerequisites.d.ts +24 -0
  900. package/dist/hooks/query/use-plugin-file-content.d.ts +1 -1
  901. package/dist/hooks/query/use-plugins-marketplace.d.ts +1 -1
  902. package/dist/hooks/query/use-provider-models.d.ts +1 -1
  903. package/dist/hooks/query/use-search-branches.d.ts +1 -1
  904. package/dist/hooks/query/use-search-providers.d.ts +1 -1
  905. package/dist/hooks/query/use-search-repositories.d.ts +1 -1
  906. package/dist/hooks/query/use-search-subdirs.d.ts +2 -2
  907. package/dist/hooks/query/use-settings.d.ts +2 -2
  908. package/dist/hooks/query/use-skills.d.ts +1 -1
  909. package/dist/hooks/query/use-start-tasks.d.ts +1 -1
  910. package/dist/hooks/query/use-sub-conversation-task-polling.d.ts +1 -1
  911. package/dist/hooks/query/use-sub-conversations.d.ts +1 -1
  912. package/dist/hooks/query/use-suggested-tasks.d.ts +1 -1
  913. package/dist/hooks/query/use-task-polling.d.ts +2 -2
  914. package/dist/hooks/query/use-unified-get-git-changes.d.ts +1 -1
  915. package/dist/hooks/query/use-unified-git-diff.d.ts +1 -1
  916. package/dist/hooks/query/use-user-conversation.d.ts +1 -1
  917. package/dist/hooks/query/use-workspace-file-content.d.ts +1 -1
  918. package/dist/hooks/use-backend-scoped-path.cjs +2 -0
  919. package/dist/hooks/use-backend-scoped-path.cjs.map +1 -0
  920. package/dist/hooks/use-backend-scoped-path.d.ts +10 -0
  921. package/dist/hooks/use-backend-scoped-path.js +13 -0
  922. package/dist/hooks/use-backend-scoped-path.js.map +1 -0
  923. package/dist/hooks/use-home-automation-actions.d.ts +23 -0
  924. package/dist/hooks/use-home-pinned-automations.d.ts +26 -0
  925. package/dist/hooks/use-llm-configured.cjs +1 -1
  926. package/dist/hooks/use-llm-configured.cjs.map +1 -1
  927. package/dist/hooks/use-llm-configured.js +2 -1
  928. package/dist/hooks/use-llm-configured.js.map +1 -1
  929. package/dist/hooks/use-manifest-preflight.d.ts +18 -0
  930. package/dist/hooks/use-tracking.cjs +1 -1
  931. package/dist/hooks/use-tracking.cjs.map +1 -1
  932. package/dist/hooks/use-tracking.d.ts +18 -0
  933. package/dist/hooks/use-tracking.js +25 -1
  934. package/dist/hooks/use-tracking.js.map +1 -1
  935. package/dist/i18n/declaration.cjs +1 -1
  936. package/dist/i18n/declaration.cjs.map +1 -1
  937. package/dist/i18n/declaration.d.ts +103 -2
  938. package/dist/i18n/declaration.js +1 -1
  939. package/dist/i18n/declaration.js.map +1 -1
  940. package/dist/i18n/translation.cjs +2 -2
  941. package/dist/i18n/translation.cjs.map +1 -1
  942. package/dist/i18n/translation.js +1780 -63
  943. package/dist/i18n/translation.js.map +1 -1
  944. package/dist/icons/code-pill.d.ts +1 -1
  945. package/dist/icons/external-link.cjs +2 -0
  946. package/dist/icons/external-link.cjs.map +1 -0
  947. package/dist/icons/external-link.js +22 -0
  948. package/dist/icons/external-link.js.map +1 -0
  949. package/dist/icons/server.cjs +2 -0
  950. package/dist/icons/server.cjs.map +1 -0
  951. package/dist/icons/server.js +17 -0
  952. package/dist/icons/server.js.map +1 -0
  953. package/dist/locales/ar/openhands.json +106 -5
  954. package/dist/locales/ca/openhands.json +106 -5
  955. package/dist/locales/de/openhands.json +106 -5
  956. package/dist/locales/en/openhands.json +107 -6
  957. package/dist/locales/es/openhands.json +106 -5
  958. package/dist/locales/fr/openhands.json +106 -5
  959. package/dist/locales/it/openhands.json +106 -5
  960. package/dist/locales/ja/openhands.json +106 -5
  961. package/dist/locales/ko-KR/openhands.json +106 -5
  962. package/dist/locales/no/openhands.json +106 -5
  963. package/dist/locales/pt/openhands.json +106 -5
  964. package/dist/locales/tr/openhands.json +106 -5
  965. package/dist/locales/uk/openhands.json +106 -5
  966. package/dist/locales/zh-CN/openhands.json +106 -5
  967. package/dist/locales/zh-TW/openhands.json +106 -5
  968. package/dist/manifests/automation-insights.d.ts +64 -0
  969. package/dist/manifests/automation-interface.cjs +2 -0
  970. package/dist/manifests/automation-interface.cjs.map +1 -0
  971. package/dist/manifests/automation-interface.d.ts +76 -0
  972. package/dist/manifests/automation-interface.js +82 -0
  973. package/dist/manifests/automation-interface.js.map +1 -0
  974. package/dist/manifests/automation-setup.cjs +2 -0
  975. package/dist/manifests/automation-setup.cjs.map +1 -0
  976. package/dist/manifests/automation-setup.d.ts +52 -0
  977. package/dist/manifests/automation-setup.js +8 -0
  978. package/dist/manifests/automation-setup.js.map +1 -0
  979. package/dist/manifests/interface-validation.cjs +2 -0
  980. package/dist/manifests/interface-validation.cjs.map +1 -0
  981. package/dist/manifests/interface-validation.d.ts +27 -0
  982. package/dist/manifests/interface-validation.js +360 -0
  983. package/dist/manifests/interface-validation.js.map +1 -0
  984. package/dist/manifests/manifest-actions.d.ts +15 -0
  985. package/dist/manifests/manifest-capabilities.d.ts +25 -0
  986. package/dist/manifests/manifest-error-map.d.ts +40 -0
  987. package/dist/manifests/manifest-local-validation.d.ts +56 -0
  988. package/dist/manifests/manifest-registry.cjs +2 -0
  989. package/dist/manifests/manifest-registry.cjs.map +1 -0
  990. package/dist/manifests/manifest-registry.d.ts +15 -0
  991. package/dist/manifests/manifest-registry.js +26 -0
  992. package/dist/manifests/manifest-registry.js.map +1 -0
  993. package/dist/manifests/manifest-sources.cjs +2 -0
  994. package/dist/manifests/manifest-sources.cjs.map +1 -0
  995. package/dist/manifests/manifest-sources.d.ts +15 -0
  996. package/dist/manifests/manifest-sources.js +8 -0
  997. package/dist/manifests/manifest-sources.js.map +1 -0
  998. package/dist/manifests/manifest-template.d.ts +20 -0
  999. package/dist/manifests/manifest-validation.cjs +2 -0
  1000. package/dist/manifests/manifest-validation.cjs.map +1 -0
  1001. package/dist/manifests/manifest-validation.d.ts +30 -0
  1002. package/dist/manifests/manifest-validation.js +145 -0
  1003. package/dist/manifests/manifest-validation.js.map +1 -0
  1004. package/dist/manifests/types.cjs +2 -0
  1005. package/dist/manifests/types.cjs.map +1 -0
  1006. package/dist/manifests/types.d.ts +355 -0
  1007. package/dist/manifests/types.js +39 -0
  1008. package/dist/manifests/types.js.map +1 -0
  1009. package/dist/mockServiceWorker.js +21 -9
  1010. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +9 -0
  1011. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs.map +1 -0
  1012. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js +75 -0
  1013. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -0
  1014. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs +9 -0
  1015. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs.map +1 -0
  1016. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js +78 -0
  1017. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js.map +1 -0
  1018. package/dist/node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.cjs +17 -0
  1019. package/dist/node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.cjs.map +1 -0
  1020. package/dist/node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.js +89 -0
  1021. package/dist/node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.js.map +1 -0
  1022. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.cjs +10 -0
  1023. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.cjs.map +1 -0
  1024. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.js +17 -0
  1025. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.js.map +1 -0
  1026. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-triage-assistant/manifest.cjs +9 -0
  1027. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-triage-assistant/manifest.cjs.map +1 -0
  1028. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-triage-assistant/manifest.js +15 -0
  1029. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-triage-assistant/manifest.js.map +1 -0
  1030. package/dist/node_modules/@openhands/extensions/automations/catalog/research-brief-writer/manifest.cjs +9 -0
  1031. package/dist/node_modules/@openhands/extensions/automations/catalog/research-brief-writer/manifest.cjs.map +1 -0
  1032. package/dist/node_modules/@openhands/extensions/automations/catalog/research-brief-writer/manifest.js +18 -0
  1033. package/dist/node_modules/@openhands/extensions/automations/catalog/research-brief-writer/manifest.js.map +1 -0
  1034. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-channel-monitor/manifest.cjs +9 -0
  1035. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-channel-monitor/manifest.cjs.map +1 -0
  1036. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-channel-monitor/manifest.js +14 -0
  1037. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-channel-monitor/manifest.js.map +1 -0
  1038. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-standup-digest/manifest.cjs +9 -0
  1039. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-standup-digest/manifest.cjs.map +1 -0
  1040. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-standup-digest/manifest.js +14 -0
  1041. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-standup-digest/manifest.js.map +1 -0
  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 +2 -0
  1047. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -0
  1048. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +25 -0
  1049. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -0
  1050. package/dist/node_modules/@openhands/extensions/automations/index.cjs +2 -0
  1051. package/dist/node_modules/@openhands/extensions/automations/index.cjs.map +1 -0
  1052. package/dist/node_modules/@openhands/extensions/automations/index.js +18 -0
  1053. package/dist/node_modules/@openhands/extensions/automations/index.js.map +1 -0
  1054. package/dist/node_modules/@openhands/extensions/automations/interface.cjs +2 -0
  1055. package/dist/node_modules/@openhands/extensions/automations/interface.cjs.map +1 -0
  1056. package/dist/node_modules/@openhands/extensions/automations/interface.js +210 -0
  1057. package/dist/node_modules/@openhands/extensions/automations/interface.js.map +1 -0
  1058. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs +1 -1
  1059. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs.map +1 -1
  1060. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js +3 -3
  1061. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js.map +1 -1
  1062. package/dist/node_modules/@openhands/extensions/skills/index.cjs +174 -53
  1063. package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
  1064. package/dist/node_modules/@openhands/extensions/skills/index.js +115 -53
  1065. package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
  1066. package/dist/node_modules/@tanstack/query-core/build/modern/utils.cjs +1 -1
  1067. package/dist/node_modules/@tanstack/query-core/build/modern/utils.cjs.map +1 -1
  1068. package/dist/node_modules/@tanstack/query-core/build/modern/utils.js +12 -1
  1069. package/dist/node_modules/@tanstack/query-core/build/modern/utils.js.map +1 -1
  1070. package/dist/node_modules/@tanstack/react-query/build/modern/useBaseQuery.cjs +1 -1
  1071. package/dist/node_modules/@tanstack/react-query/build/modern/useBaseQuery.cjs.map +1 -1
  1072. package/dist/node_modules/@tanstack/react-query/build/modern/useBaseQuery.js +14 -12
  1073. package/dist/node_modules/@tanstack/react-query/build/modern/useBaseQuery.js.map +1 -1
  1074. package/dist/node_modules/html-parse-stringify/dist/esm/html-parse-stringify.cjs +2 -0
  1075. package/dist/node_modules/html-parse-stringify/dist/esm/html-parse-stringify.cjs.map +1 -0
  1076. package/dist/node_modules/html-parse-stringify/dist/esm/html-parse-stringify.js +177 -0
  1077. package/dist/node_modules/html-parse-stringify/dist/esm/html-parse-stringify.js.map +1 -0
  1078. package/dist/node_modules/i18next/dist/esm/i18next.cjs +1 -1
  1079. package/dist/node_modules/i18next/dist/esm/i18next.cjs.map +1 -1
  1080. package/dist/node_modules/i18next/dist/esm/i18next.js +31 -24
  1081. package/dist/node_modules/i18next/dist/esm/i18next.js.map +1 -1
  1082. package/dist/node_modules/lucide-react/dist/esm/icons/monitor.cjs +2 -0
  1083. package/dist/node_modules/lucide-react/dist/esm/icons/monitor.cjs.map +1 -0
  1084. package/dist/node_modules/lucide-react/dist/esm/icons/monitor.js +29 -0
  1085. package/dist/node_modules/lucide-react/dist/esm/icons/monitor.js.map +1 -0
  1086. package/dist/node_modules/posthog-js/dist/module.cjs +2 -2
  1087. package/dist/node_modules/posthog-js/dist/module.cjs.map +1 -1
  1088. package/dist/node_modules/posthog-js/dist/module.js +2055 -1929
  1089. package/dist/node_modules/posthog-js/dist/module.js.map +1 -1
  1090. package/dist/node_modules/react-i18next/dist/es/TransWithoutContext.cjs +1 -1
  1091. package/dist/node_modules/react-i18next/dist/es/TransWithoutContext.cjs.map +1 -1
  1092. package/dist/node_modules/react-i18next/dist/es/TransWithoutContext.js +43 -62
  1093. package/dist/node_modules/react-i18next/dist/es/TransWithoutContext.js.map +1 -1
  1094. package/dist/node_modules/react-i18next/dist/es/useTranslation.cjs +1 -1
  1095. package/dist/node_modules/react-i18next/dist/es/useTranslation.cjs.map +1 -1
  1096. package/dist/node_modules/react-i18next/dist/es/useTranslation.js +12 -6
  1097. package/dist/node_modules/react-i18next/dist/es/useTranslation.js.map +1 -1
  1098. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.cjs +1 -1
  1099. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.cjs.map +1 -1
  1100. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +352 -310
  1101. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -1
  1102. package/dist/package.cjs +1 -1
  1103. package/dist/package.cjs.map +1 -1
  1104. package/dist/package.js +34 -33
  1105. package/dist/package.js.map +1 -1
  1106. package/dist/routes/agent-settings.d.ts +3 -2
  1107. package/dist/routes/app-settings.d.ts +2 -1
  1108. package/dist/routes/browser-tab.d.ts +1 -1
  1109. package/dist/routes/changes-tab.d.ts +2 -1
  1110. package/dist/routes/commits-tab.d.ts +1 -1
  1111. package/dist/routes/conversation.d.ts +2 -1
  1112. package/dist/routes/files-tab.d.ts +1 -1
  1113. package/dist/routes/llm-settings.d.ts +3 -2
  1114. package/dist/routes/mcp.cjs +1 -1
  1115. package/dist/routes/mcp.cjs.map +1 -1
  1116. package/dist/routes/mcp.d.ts +2 -1
  1117. package/dist/routes/mcp.js +1 -1
  1118. package/dist/routes/mcp.js.map +1 -1
  1119. package/dist/routes/planner-tab.d.ts +2 -1
  1120. package/dist/routes/secrets-settings.d.ts +2 -1
  1121. package/dist/routes/task-list-tab.d.ts +1 -1
  1122. package/dist/services/settings.cjs +1 -1
  1123. package/dist/services/settings.cjs.map +1 -1
  1124. package/dist/services/settings.js +3 -7
  1125. package/dist/services/settings.js.map +1 -1
  1126. package/dist/types/agent-server/core/events/conversation-state-event.d.ts +2 -19
  1127. package/dist/types/agent-server/core/events/observation-event.d.ts +2 -18
  1128. package/dist/types/automation.d.ts +23 -4
  1129. package/dist/types/mcp-auth.cjs.map +1 -1
  1130. package/dist/types/mcp-auth.d.ts +5 -41
  1131. package/dist/types/mcp-auth.js.map +1 -1
  1132. package/dist/types/mcp-server.d.ts +17 -32
  1133. package/dist/types/settings.d.ts +8 -28
  1134. package/dist/ui/card-title.d.ts +1 -1
  1135. package/dist/ui/card.d.ts +1 -1
  1136. package/dist/ui/combobox-caret.d.ts +3 -3
  1137. package/dist/ui/context-menu.cjs +1 -1
  1138. package/dist/ui/context-menu.cjs.map +1 -1
  1139. package/dist/ui/context-menu.d.ts +3 -2
  1140. package/dist/ui/context-menu.js +10 -9
  1141. package/dist/ui/context-menu.js.map +1 -1
  1142. package/dist/ui/divider.d.ts +1 -1
  1143. package/dist/ui/dropdown/clear-button.d.ts +1 -1
  1144. package/dist/ui/dropdown/dropdown-input.d.ts +1 -1
  1145. package/dist/ui/dropdown/dropdown-menu.d.ts +1 -1
  1146. package/dist/ui/dropdown/dropdown.d.ts +1 -1
  1147. package/dist/ui/dropdown/loading-spinner.d.ts +1 -1
  1148. package/dist/ui/dropdown/toggle-button.d.ts +1 -1
  1149. package/dist/ui/help-link.d.ts +1 -1
  1150. package/dist/ui/pre.d.ts +1 -1
  1151. package/dist/ui/toggle-switch.d.ts +2 -2
  1152. package/dist/ui/typography.d.ts +7 -7
  1153. package/dist/utils/api-error-message.d.ts +6 -2
  1154. package/dist/utils/automation-activity-log-export.d.ts +17 -0
  1155. package/dist/utils/automation-catalog.cjs +2 -0
  1156. package/dist/utils/automation-catalog.cjs.map +1 -0
  1157. package/dist/utils/automation-catalog.d.ts +28 -0
  1158. package/dist/utils/automation-catalog.js +5 -0
  1159. package/dist/utils/automation-catalog.js.map +1 -0
  1160. package/dist/utils/automation-timeout.d.ts +5 -6
  1161. package/dist/utils/custom-toast-handlers.d.ts +2 -2
  1162. package/dist/utils/format-relative-time.d.ts +3 -0
  1163. package/dist/utils/mcp-config.cjs +1 -1
  1164. package/dist/utils/mcp-config.cjs.map +1 -1
  1165. package/dist/utils/mcp-config.d.ts +12 -29
  1166. package/dist/utils/mcp-config.js +161 -143
  1167. package/dist/utils/mcp-config.js.map +1 -1
  1168. package/dist/utils/mcp-installed-servers.cjs +1 -1
  1169. package/dist/utils/mcp-installed-servers.cjs.map +1 -1
  1170. package/dist/utils/mcp-installed-servers.d.ts +2 -2
  1171. package/dist/utils/mcp-installed-servers.js +21 -32
  1172. package/dist/utils/mcp-installed-servers.js.map +1 -1
  1173. package/dist/utils/mcp-server-health-key.cjs.map +1 -1
  1174. package/dist/utils/mcp-server-health-key.d.ts +2 -4
  1175. package/dist/utils/mcp-server-health-key.js.map +1 -1
  1176. package/dist/utils/responder-deployment.d.ts +5 -1
  1177. package/dist/utils/settings-like-page-layout-classes.cjs +1 -1
  1178. package/dist/utils/settings-like-page-layout-classes.cjs.map +1 -1
  1179. package/dist/utils/settings-like-page-layout-classes.d.ts +6 -2
  1180. package/dist/utils/settings-like-page-layout-classes.js +1 -1
  1181. package/dist/utils/settings-like-page-layout-classes.js.map +1 -1
  1182. package/dist/utils/skill-category.d.ts +12 -0
  1183. package/dist/utils/transcript-export/index.cjs +5 -5
  1184. package/dist/utils/transcript-export/index.js +12 -12
  1185. package/package.json +36 -33
  1186. package/scripts/check-sdk-version-sync.mjs +6 -6
  1187. package/scripts/check-translation-completeness.cjs +1 -0
  1188. package/scripts/dev-safe.mjs +17 -12
  1189. package/scripts/dev-static.mjs +17 -0
  1190. package/scripts/dev-with-automation.mjs +15 -16
  1191. package/scripts/ingress.mjs +22 -0
  1192. package/scripts/proxy-utils.mjs +157 -2
  1193. package/scripts/runtime-services-info.mjs +6 -6
  1194. package/scripts/static-build.mjs +0 -7
  1195. package/scripts/static-server.mjs +10 -0
  1196. package/build/assets/Trans-B7lYw4uD.js +0 -1
  1197. package/build/assets/active-backend-context-mY7Gff5c.js +0 -2
  1198. package/build/assets/agent-context-settings-BTUmWEzL.js +0 -1
  1199. package/build/assets/agent-profiles-settings-Ilqid_R5.js +0 -1
  1200. package/build/assets/agent-server-conversation-service.api-C_7YnjzP.js +0 -41
  1201. package/build/assets/agent-settings-CxfT4ksO.js +0 -1
  1202. package/build/assets/alert-banner-eRyIwDyU.js +0 -1
  1203. package/build/assets/automation-BGP_I1RR.js +0 -1
  1204. package/build/assets/automation-detail-nEflClmc.js +0 -2
  1205. package/build/assets/automation-export-BO_kfqC8.js +0 -2
  1206. package/build/assets/automations-list-BYncC7gv.js +0 -1
  1207. package/build/assets/backend-form-modal-CKrBF80P.js +0 -1
  1208. package/build/assets/browser-3QjrEr1D.js +0 -6
  1209. package/build/assets/check-CrxQfJZ2.js +0 -1
  1210. package/build/assets/chevron-down-D_LsyTA7.js +0 -1
  1211. package/build/assets/circle-check-DZn9HkLE.js +0 -1
  1212. package/build/assets/cloud-funnel-analytics-NlmDoeo2.js +0 -1
  1213. package/build/assets/command-menu-CvLPs7dg.js +0 -1
  1214. package/build/assets/condenser-settings-C4Y9CzQV.js +0 -1
  1215. package/build/assets/context-menu-list-item-FGaafXGh.js +0 -1
  1216. package/build/assets/conversation-D_ORtpKC.js +0 -1
  1217. package/build/assets/conversation-Dpc5nmGi.js +0 -90
  1218. package/build/assets/conversation-panel-D_ORtpKC.js +0 -1
  1219. package/build/assets/conversation-state-store-CGRQemtx.js +0 -1
  1220. package/build/assets/entry.client-BO2KQj0y.js +0 -2
  1221. package/build/assets/enum-filter-dropdown-DSqPZnsD.js +0 -1
  1222. package/build/assets/files-tab-4c9HFSLo.js +0 -1
  1223. package/build/assets/format-time-delta-DICE64sz.js +0 -1
  1224. package/build/assets/git-provider-icon-0PqmIS_S.js +0 -1
  1225. package/build/assets/home-D9JsyEmE.js +0 -1
  1226. package/build/assets/home-TFhnmZLx.js +0 -1
  1227. package/build/assets/index-home-D9JsyEmE.js +0 -1
  1228. package/build/assets/install-server-modal-BgGRnqA0.js +0 -1
  1229. package/build/assets/llm-not-configured-banner-Y4W9-sar.js +0 -27
  1230. package/build/assets/llm-settings-nPwv7hKu.js +0 -1
  1231. package/build/assets/loader-circle-CGD6-Vak.js +0 -1
  1232. package/build/assets/manifest-1cf33a7b.js +0 -1
  1233. package/build/assets/markdown-renderer-U40HF0Ak.js +0 -8
  1234. package/build/assets/mcp-xDMaHzOw.js +0 -9
  1235. package/build/assets/messages-CdNfZPgd.js +0 -40
  1236. package/build/assets/navigation-link-Bxmn-pCs.js +0 -1
  1237. package/build/assets/onboarding-DWuFieEA.js +0 -1
  1238. package/build/assets/onboarding-modal-C8m72Dpb.js +0 -1
  1239. package/build/assets/plus-CTGLo3aa.js +0 -1
  1240. package/build/assets/recommended-automations-launcher-Dru1yN46.js +0 -58
  1241. package/build/assets/root-B5JXKp1P.css +0 -1
  1242. package/build/assets/root-DOLLQteU.js +0 -2
  1243. package/build/assets/root-layout-xmylWoew.js +0 -3
  1244. package/build/assets/search-BrpWXWUi.js +0 -1
  1245. package/build/assets/segmented-toggle-CZKOdIly.js +0 -1
  1246. package/build/assets/settings-Chfn5xTD.js +0 -1
  1247. package/build/assets/settings-input-BEaTCem1.js +0 -1
  1248. package/build/assets/settings-like-page-layout-classes-DyxyJ0k4.js +0 -1
  1249. package/build/assets/settings-service.api-CTJRrvMu.js +0 -1
  1250. package/build/assets/shared-conversation-BvWtTwES.js +0 -1
  1251. package/build/assets/sidebar-mobile-menu-toggle-xiKoUfGa.js +0 -1
  1252. package/build/assets/skills-settings-pUxMr6WZ.js +0 -2
  1253. package/build/assets/use-agent-profiles-DmT9zxAN.js +0 -1
  1254. package/build/assets/use-config-C959QcRC.js +0 -1
  1255. package/build/assets/use-is-authed-BsS4XwSL.js +0 -1
  1256. package/build/assets/use-llm-profiles-CdaxVpyY.js +0 -1
  1257. package/build/assets/use-save-agent-profile-DGJ3-u0M.js +0 -1
  1258. package/build/assets/use-settings-nav-items-DPK5sxvR.js +0 -16
  1259. package/build/assets/use-skills-D_mLhYNa.js +0 -1
  1260. package/build/assets/use-tracking-COqZLobY.js +0 -1
  1261. package/build/assets/useQuery-B38jBavx.js +0 -1
  1262. package/build/assets/utils-DsWhWn2F.js +0 -1
  1263. package/build/assets/v4-DDdyfk2q.js +0 -1
  1264. package/build/assets/vendor~browser-CIoZCqGs.js +0 -47
  1265. package/build/assets/vendor~entry.client-BfviqoVc.js +0 -1
  1266. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~f1hl7voa-BrmgjeOw.js +0 -1
  1267. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~f9xdmd0z-DLMP7bZx.js +0 -26
  1268. package/build/assets/vendor~module-BZXjBMvd.js +0 -2
  1269. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation-Acmf1sKj.js +0 -1
  1270. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-CmzCY1BT.js +0 -1
  1271. package/build/assets/vendor~root-layout~index-home~home~mcp~automations-list~onboarding-modal-C7Yh77RT.js +0 -1
  1272. package/build/assets/x-Dx_JbpHA.js +0 -1
  1273. package/dist/components/features/skills/skill-type-filter.d.ts +0 -3
  1274. package/dist/components/features/skills/skills-type-filter-dropdown.d.ts +0 -7
  1275. package/dist/node_modules/html-parse-stringify/dist/html-parse-stringify.module.cjs +0 -2
  1276. package/dist/node_modules/html-parse-stringify/dist/html-parse-stringify.module.cjs.map +0 -1
  1277. package/dist/node_modules/html-parse-stringify/dist/html-parse-stringify.module.js +0 -81
  1278. package/dist/node_modules/html-parse-stringify/dist/html-parse-stringify.module.js.map +0 -1
  1279. package/dist/node_modules/void-elements/index.cjs +0 -2
  1280. package/dist/node_modules/void-elements/index.cjs.map +0 -1
  1281. package/dist/node_modules/void-elements/index.js +0 -25
  1282. package/dist/node_modules/void-elements/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"active-store.js","names":[],"sources":["../../../src/api/backend-registry/active-store.ts"],"sourcesContent":["import { getBackendHealthEntry } from \"./health-store\";\nimport {\n readStoredActiveBackend,\n readStoredBackends,\n writeStoredActiveBackend,\n writeStoredBackends,\n} from \"./storage\";\nimport type { Backend, BackendSelection, ResolvedActiveBackend } from \"./types\";\n\ntype Listener = () => void;\n\ninterface Snapshot {\n backends: Backend[];\n selection: BackendSelection | null;\n active: ResolvedActiveBackend;\n}\n\nexport const NO_BACKEND_ID = \"no-backend\";\n\n/**\n * Sentinel returned when the registry has no usable backend. It must never be\n * persisted, and callers must check `isNoBackend()` before interpreting fields\n * like `kind`, `host`, or `apiKey`.\n */\nexport const NO_BACKEND: Backend = {\n id: NO_BACKEND_ID,\n name: \"No Backend Available\",\n host: \"\",\n apiKey: \"\",\n kind: \"local\",\n};\n\nexport function isNoBackend(backend: Backend): boolean {\n return backend.id === NO_BACKEND_ID;\n}\n\n/**\n * Choose an active backend when there is no valid explicit selection (fresh\n * start, or the selected backend was removed). Most of the GUI speaks the\n * local agent-server protocol, so a cloud or dead-local backend at index 0\n * would leave `getEffectiveLocalBackend()` null and make every local-protocol\n * call throw \"No backend is configured\" even when a healthy local backend is\n * registered further down the list. Consult the synchronous, persisted health\n * store and prefer a healthy local backend; fall back to any local backend so\n * the effective-local resolver still resolves, then to the prior deterministic\n * `backends[0]` behavior for the registry-has-no-local case.\n */\nfunction pickFallbackBackend(backends: Backend[]): Backend {\n const healthyLocalBackend = backends.find(\n (backend) =>\n backend.kind === \"local\" &&\n getBackendHealthEntry(backend.id)?.disabled !== true,\n );\n if (healthyLocalBackend) return healthyLocalBackend;\n\n const localBackend = backends.find((backend) => backend.kind === \"local\");\n return localBackend ?? backends[0] ?? NO_BACKEND;\n}\n\nfunction computeSnapshot(\n backends: Backend[],\n selection: BackendSelection | null,\n): Snapshot {\n let activeBackend: Backend | null = null;\n let activeOrgId: string | null = null;\n\n if (selection) {\n const found = backends.find((b) => b.id === selection.backendId);\n if (found) {\n activeBackend = found;\n activeOrgId = selection.orgId ?? null;\n }\n // If the selection points at a removed backend, fall through to\n // the unselected case below; we also drop the orgId since it only\n // makes sense in the context of a specific cloud backend.\n }\n\n // @spec BM-003 — Fallback on active backend removal\n if (!activeBackend) {\n activeBackend = pickFallbackBackend(backends);\n activeOrgId = null;\n }\n\n return {\n backends,\n selection,\n active: { backend: activeBackend, orgId: activeOrgId },\n };\n}\n\nlet snapshot: Snapshot = computeSnapshot(\n readStoredBackends(),\n readStoredActiveBackend(),\n);\n\nconst listeners = new Set<Listener>();\n\nfunction notify(): void {\n listeners.forEach((listener) => listener());\n}\n\nexport function getActiveBackend(): ResolvedActiveBackend {\n return snapshot.active;\n}\n\n/**\n * Pick the backend to use for *local agent-server protocol* calls.\n *\n * Most of the GUI's services (settings reads/writes, conversation CRUD,\n * skills/MCP/secrets, etc.) speak the local agent-server's protocol —\n * they would fail against a cloud host. Only the active backend is eligible:\n * a cloud selection must not borrow another registered local backend.\n */\nexport function getEffectiveLocalBackend(): Backend | null {\n const active = snapshot.active.backend;\n if (active.kind === \"local\" && !isNoBackend(active)) return active;\n return null;\n}\n\nexport function getRegisteredBackends(): Backend[] {\n return snapshot.backends;\n}\n\nexport function getActiveSelection(): BackendSelection | null {\n return snapshot.selection;\n}\n\nexport function getSnapshot(): Snapshot {\n return snapshot;\n}\n\nexport function setActiveSelection(selection: BackendSelection | null): void {\n writeStoredActiveBackend(selection);\n snapshot = computeSnapshot(snapshot.backends, selection);\n notify();\n}\n\nexport function setRegisteredBackends(backends: Backend[]): void {\n writeStoredBackends(backends);\n\n let nextSelection = snapshot.selection;\n if (\n nextSelection &&\n !backends.some((b) => b.id === nextSelection!.backendId)\n ) {\n nextSelection = null;\n writeStoredActiveBackend(null);\n }\n\n snapshot = computeSnapshot(backends, nextSelection);\n notify();\n}\n\nexport function subscribeActiveBackend(listener: Listener): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\n/** Test-only: re-read storage and clear listeners. */\n\nexport function __resetActiveStoreForTests(): void {\n snapshot = computeSnapshot(readStoredBackends(), readStoredActiveBackend());\n listeners.clear();\n}\n"],"mappings":";;;AAiBA,IAAa,IAAgB,cAOhB,IAAsB;CACjC,IAAI;CACJ,MAAM;CACN,MAAM;CACN,QAAQ;CACR,MAAM;AACR;AAEA,SAAgB,EAAY,GAA2B;CACrD,OAAO,EAAQ,OAAO;AACxB;AAaA,SAAS,EAAoB,GAA8B;CASzD,OAR4B,EAAS,MAClC,MACC,EAAQ,SAAS,WACjB,EAAsB,EAAQ,EAAE,GAAG,aAAa,EAEhD,MAEiB,EAAS,MAAM,MAAY,EAAQ,SAAS,OAC1D,KAAgB,EAAS,MAAM;AACxC;AAEA,SAAS,EACP,GACA,GACU;CACV,IAAI,IAAgC,MAChC,IAA6B;CAEjC,IAAI,GAAW;EACb,IAAM,IAAQ,EAAS,MAAM,MAAM,EAAE,OAAO,EAAU,SAAS;EAC/D,AAAI,MACF,IAAgB,GAChB,IAAc,EAAU,SAAS;CAKrC;CAQA,OALK,MACH,IAAgB,EAAoB,CAAQ,GAC5C,IAAc,OAGT;EACL;EACA;EACA,QAAQ;GAAE,SAAS;GAAe,OAAO;EAAY;CACvD;AACF;AAEA,IAAI,IAAqB,EACvB,EAAmB,GACnB,EAAwB,CAC1B,GAEM,oBAAY,IAAI,IAAc;AAEpC,SAAS,IAAe;CACtB,EAAU,SAAS,MAAa,EAAS,CAAC;AAC5C;AAEA,SAAgB,IAA0C;CACxD,OAAO,EAAS;AAClB;AAUA,SAAgB,IAA2C;CACzD,IAAM,IAAS,EAAS,OAAO;CAE/B,OADI,EAAO,SAAS,WAAW,CAAC,EAAY,CAAM,IAAU,IACrD;AACT;AAEA,SAAgB,IAAmC;CACjD,OAAO,EAAS;AAClB;AAEA,SAAgB,IAA8C;CAC5D,OAAO,EAAS;AAClB;AAEA,SAAgB,IAAwB;CACtC,OAAO;AACT;AAEA,SAAgB,EAAmB,GAA0C;CAG3E,AAFA,EAAyB,CAAS,GAClC,IAAW,EAAgB,EAAS,UAAU,CAAS,GACvD,EAAO;AACT;AAEA,SAAgB,EAAsB,GAA2B;CAC/D,EAAoB,CAAQ;CAE5B,IAAI,IAAgB,EAAS;CAU7B,AARE,KACA,CAAC,EAAS,MAAM,MAAM,EAAE,OAAO,EAAe,SAAS,MAEvD,IAAgB,MAChB,EAAyB,IAAI,IAG/B,IAAW,EAAgB,GAAU,CAAa,GAClD,EAAO;AACT;AAEA,SAAgB,EAAuB,GAAgC;CAErE,OADA,EAAU,IAAI,CAAQ,SACT;EACX,EAAU,OAAO,CAAQ;CAC3B;AACF"}
1
+ {"version":3,"file":"active-store.js","names":[],"sources":["../../../src/api/backend-registry/active-store.ts"],"sourcesContent":["import { getBackendHealthEntry } from \"./health-store\";\nimport {\n readStoredActiveBackend,\n readStoredBackends,\n writeStoredActiveBackend,\n writeStoredBackends,\n} from \"./storage\";\nimport type { Backend, BackendSelection, ResolvedActiveBackend } from \"./types\";\nimport {\n currentLocationSearch,\n readBackendSelectionFromUrl,\n} from \"./url-selection\";\n\ntype Listener = () => void;\n\ninterface Snapshot {\n backends: Backend[];\n selection: BackendSelection | null;\n active: ResolvedActiveBackend;\n}\n\nexport const NO_BACKEND_ID = \"no-backend\";\n\n/**\n * Sentinel returned when the registry has no usable backend. It must never be\n * persisted, and callers must check `isNoBackend()` before interpreting fields\n * like `kind`, `host`, or `apiKey`.\n */\nexport const NO_BACKEND: Backend = {\n id: NO_BACKEND_ID,\n name: \"No Backend Available\",\n host: \"\",\n apiKey: \"\",\n kind: \"local\",\n};\n\nexport function isNoBackend(backend: Backend): boolean {\n return backend.id === NO_BACKEND_ID;\n}\n\n/**\n * Choose an active backend when there is no valid explicit selection (fresh\n * start, or the selected backend was removed). Most of the GUI speaks the\n * local agent-server protocol, so a cloud or dead-local backend at index 0\n * would leave `getEffectiveLocalBackend()` null and make every local-protocol\n * call throw \"No backend is configured\" even when a healthy local backend is\n * registered further down the list. Consult the synchronous, persisted health\n * store and prefer a healthy local backend; fall back to any local backend so\n * the effective-local resolver still resolves, then to the prior deterministic\n * `backends[0]` behavior for the registry-has-no-local case.\n */\nfunction pickFallbackBackend(backends: Backend[]): Backend {\n const healthyLocalBackend = backends.find(\n (backend) =>\n backend.kind === \"local\" &&\n getBackendHealthEntry(backend.id)?.disabled !== true,\n );\n if (healthyLocalBackend) return healthyLocalBackend;\n\n const localBackend = backends.find((backend) => backend.kind === \"local\");\n return localBackend ?? backends[0] ?? NO_BACKEND;\n}\n\nfunction computeSnapshot(\n backends: Backend[],\n selection: BackendSelection | null,\n): Snapshot {\n let activeBackend: Backend | null = null;\n let activeOrgId: string | null = null;\n\n if (selection) {\n const found = backends.find((b) => b.id === selection.backendId);\n if (found) {\n activeBackend = found;\n activeOrgId = selection.orgId ?? null;\n }\n // If the selection points at a removed backend, fall through to\n // the unselected case below; we also drop the orgId since it only\n // makes sense in the context of a specific cloud backend.\n }\n\n // @spec BM-003 — Fallback on active backend removal\n if (!activeBackend) {\n activeBackend = pickFallbackBackend(backends);\n activeOrgId = null;\n }\n\n return {\n backends,\n selection,\n active: { backend: activeBackend, orgId: activeOrgId },\n };\n}\n\n/**\n * Resolve the selection this tab boots with. A backend pinned in the URL wins\n * over stored state so a link opened in a new tab (cmd/ctrl-click, middle\n * click, \"Open in new tab\") lands on the backend that owns the linked\n * conversation, even when the new tab starts with an empty `sessionStorage`\n * and would otherwise adopt the `localStorage` fallback. The honoured\n * selection is persisted so later in-tab navigation — which drops the query\n * parameters — keeps the same backend.\n */\nfunction readInitialSelection(backends: Backend[]): BackendSelection | null {\n const fromUrl = readBackendSelectionFromUrl(\n backends,\n currentLocationSearch(),\n );\n if (fromUrl) {\n writeStoredActiveBackend(fromUrl);\n return fromUrl;\n }\n return readStoredActiveBackend();\n}\n\nconst initialBackends = readStoredBackends();\nlet snapshot: Snapshot = computeSnapshot(\n initialBackends,\n readInitialSelection(initialBackends),\n);\n\nconst listeners = new Set<Listener>();\n\nfunction notify(): void {\n listeners.forEach((listener) => listener());\n}\n\nexport function getActiveBackend(): ResolvedActiveBackend {\n return snapshot.active;\n}\n\n/**\n * Pick the backend to use for *local agent-server protocol* calls.\n *\n * Most of the GUI's services (settings reads/writes, conversation CRUD,\n * skills/MCP/secrets, etc.) speak the local agent-server's protocol —\n * they would fail against a cloud host. Only the active backend is eligible:\n * a cloud selection must not borrow another registered local backend.\n */\nexport function getEffectiveLocalBackend(): Backend | null {\n const active = snapshot.active.backend;\n if (active.kind === \"local\" && !isNoBackend(active)) return active;\n return null;\n}\n\nexport function getRegisteredBackends(): Backend[] {\n return snapshot.backends;\n}\n\nexport function getActiveSelection(): BackendSelection | null {\n return snapshot.selection;\n}\n\nexport function getSnapshot(): Snapshot {\n return snapshot;\n}\n\nexport function setActiveSelection(selection: BackendSelection | null): void {\n writeStoredActiveBackend(selection);\n snapshot = computeSnapshot(snapshot.backends, selection);\n notify();\n}\n\nexport function setRegisteredBackends(backends: Backend[]): void {\n writeStoredBackends(backends);\n\n let nextSelection = snapshot.selection;\n if (\n nextSelection &&\n !backends.some((b) => b.id === nextSelection!.backendId)\n ) {\n nextSelection = null;\n writeStoredActiveBackend(null);\n }\n\n snapshot = computeSnapshot(backends, nextSelection);\n notify();\n}\n\nexport function subscribeActiveBackend(listener: Listener): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\n/** Test-only: re-read storage and clear listeners. */\n\nexport function __resetActiveStoreForTests(): void {\n const backends = readStoredBackends();\n snapshot = computeSnapshot(backends, readInitialSelection(backends));\n listeners.clear();\n}\n"],"mappings":";;;;AAqBA,IAAa,IAAgB,cAOhB,IAAsB;CACjC,IAAI;CACJ,MAAM;CACN,MAAM;CACN,QAAQ;CACR,MAAM;AACR;AAEA,SAAgB,EAAY,GAA2B;CACrD,OAAO,EAAQ,OAAO;AACxB;AAaA,SAAS,EAAoB,GAA8B;CASzD,OAR4B,EAAS,MAClC,MACC,EAAQ,SAAS,WACjB,EAAsB,EAAQ,EAAE,GAAG,aAAa,EAEhD,MAEiB,EAAS,MAAM,MAAY,EAAQ,SAAS,OAC1D,KAAgB,EAAS,MAAM;AACxC;AAEA,SAAS,EACP,GACA,GACU;CACV,IAAI,IAAgC,MAChC,IAA6B;CAEjC,IAAI,GAAW;EACb,IAAM,IAAQ,EAAS,MAAM,MAAM,EAAE,OAAO,EAAU,SAAS;EAC/D,AAAI,MACF,IAAgB,GAChB,IAAc,EAAU,SAAS;CAKrC;CAQA,OALK,MACH,IAAgB,EAAoB,CAAQ,GAC5C,IAAc,OAGT;EACL;EACA;EACA,QAAQ;GAAE,SAAS;GAAe,OAAO;EAAY;CACvD;AACF;AAWA,SAAS,EAAqB,GAA8C;CAC1E,IAAM,IAAU,EACd,GACA,EAAsB,CACxB;CAKA,OAJI,KACF,EAAyB,CAAO,GACzB,KAEF,EAAwB;AACjC;AAEA,IAAM,IAAkB,EAAmB,GACvC,IAAqB,EACvB,GACA,EAAqB,CAAe,CACtC,GAEM,oBAAY,IAAI,IAAc;AAEpC,SAAS,IAAe;CACtB,EAAU,SAAS,MAAa,EAAS,CAAC;AAC5C;AAEA,SAAgB,IAA0C;CACxD,OAAO,EAAS;AAClB;AAUA,SAAgB,IAA2C;CACzD,IAAM,IAAS,EAAS,OAAO;CAE/B,OADI,EAAO,SAAS,WAAW,CAAC,EAAY,CAAM,IAAU,IACrD;AACT;AAEA,SAAgB,IAAmC;CACjD,OAAO,EAAS;AAClB;AAEA,SAAgB,IAA8C;CAC5D,OAAO,EAAS;AAClB;AAEA,SAAgB,IAAwB;CACtC,OAAO;AACT;AAEA,SAAgB,EAAmB,GAA0C;CAG3E,AAFA,EAAyB,CAAS,GAClC,IAAW,EAAgB,EAAS,UAAU,CAAS,GACvD,EAAO;AACT;AAEA,SAAgB,EAAsB,GAA2B;CAC/D,EAAoB,CAAQ;CAE5B,IAAI,IAAgB,EAAS;CAU7B,AARE,KACA,CAAC,EAAS,MAAM,MAAM,EAAE,OAAO,EAAe,SAAS,MAEvD,IAAgB,MAChB,EAAyB,IAAI,IAG/B,IAAW,EAAgB,GAAU,CAAa,GAClD,EAAO;AACT;AAEA,SAAgB,EAAuB,GAAgC;CAErE,OADA,EAAU,IAAI,CAAQ,SACT;EACX,EAAU,OAAO,CAAQ;CAC3B;AACF"}
@@ -0,0 +1,2 @@
1
+ require("../../_virtual/_rolldown/runtime.cjs");var e=`backend`;function t(t,n){let{backend:r,orgId:i}=n;if(!r.id)return t;let[a,o=``]=t.split(`?`),s=new URLSearchParams(o);return s.set(e,r.id),i&&s.set(`org`,i),`${a}?${s.toString()}`}function n(t,n){if(!n)return null;let r;try{r=new URLSearchParams(n)}catch{return null}let i=r.get(e);return!i||!t.some(e=>e.id===i)?null:{backendId:i,orgId:r.get(`org`)||null}}function r(){return typeof window>`u`?``:window.location.search}exports.currentLocationSearch=r,exports.readBackendSelectionFromUrl=n,exports.withBackendSelectionParams=t;
2
+ //# sourceMappingURL=url-selection.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-selection.cjs","names":[],"sources":["../../../src/api/backend-registry/url-selection.ts"],"sourcesContent":["import type { Backend, BackendSelection, ResolvedActiveBackend } from \"./types\";\n\n/**\n * Query parameters that pin a link to the backend (and cloud org) that owns\n * the linked resource.\n *\n * The active backend is tab-scoped: `readStoredActiveBackend()` prefers\n * `sessionStorage` and only falls back to `localStorage`. A tab opened with\n * cmd/ctrl-click or middle-click does not reliably inherit the opener's\n * `sessionStorage`, so it can boot from the `localStorage` fallback — which\n * holds whichever backend was selected *last in any tab*, not the one the\n * sidebar we were just looking at belongs to. The new tab then resolves the\n * conversation id against the wrong backend and shows \"conversation not\n * found\". Carrying the identity in the URL makes the link self-describing so\n * the new tab pins to the right backend regardless of what storage holds.\n */\nexport const BACKEND_QUERY_PARAM = \"backend\";\nexport const ORG_QUERY_PARAM = \"org\";\n\n/**\n * Append the active backend identity to an in-app path so opening it in a new\n * browsing context resolves against the same backend.\n */\nexport function withBackendSelectionParams(\n path: string,\n active: ResolvedActiveBackend,\n): string {\n const { backend, orgId } = active;\n if (!backend.id) return path;\n\n const [pathname, existingSearch = \"\"] = path.split(\"?\");\n const params = new URLSearchParams(existingSearch);\n params.set(BACKEND_QUERY_PARAM, backend.id);\n if (orgId) params.set(ORG_QUERY_PARAM, orgId);\n\n return `${pathname}?${params.toString()}`;\n}\n\n/**\n * Read a backend selection off the current URL, keeping it only when it names\n * a registered backend. An unknown id (a link from another machine, or a\n * backend that has since been removed) is ignored so the caller falls back to\n * the stored selection.\n */\nexport function readBackendSelectionFromUrl(\n backends: Backend[],\n search: string,\n): BackendSelection | null {\n if (!search) return null;\n\n let params: URLSearchParams;\n try {\n params = new URLSearchParams(search);\n } catch {\n return null;\n }\n\n const backendId = params.get(BACKEND_QUERY_PARAM);\n if (!backendId) return null;\n if (!backends.some((backend) => backend.id === backendId)) return null;\n\n const orgId = params.get(ORG_QUERY_PARAM);\n return { backendId, orgId: orgId || null };\n}\n\n/** The current tab's query string, or \"\" outside a browser. */\nexport function currentLocationSearch(): string {\n if (typeof window === \"undefined\") return \"\";\n return window.location.search;\n}\n"],"mappings":"gDAgBA,IAAa,EAAsB,UAOnC,SAAgB,EACd,EACA,EACQ,CACR,GAAM,CAAE,UAAS,SAAU,EAC3B,GAAI,CAAC,EAAQ,GAAI,OAAO,EAExB,GAAM,CAAC,EAAU,EAAiB,IAAM,EAAK,MAAM,GAAG,EAChD,EAAS,IAAI,gBAAgB,CAAc,EAIjD,OAHA,EAAO,IAAI,EAAqB,EAAQ,EAAE,EACtC,GAAO,EAAO,IAAA,MAAqB,CAAK,EAErC,GAAG,EAAS,GAAG,EAAO,SAAS,GACxC,CAQA,SAAgB,EACd,EACA,EACyB,CACzB,GAAI,CAAC,EAAQ,OAAO,KAEpB,IAAI,EACJ,GAAI,CACF,EAAS,IAAI,gBAAgB,CAAM,CACrC,MAAQ,CACN,OAAO,IACT,CAEA,IAAM,EAAY,EAAO,IAAI,CAAmB,EAKhD,MAJI,CAAC,GACD,CAAC,EAAS,KAAM,GAAY,EAAQ,KAAO,CAAS,EAAU,KAG3D,CAAE,YAAW,MADN,EAAO,IAAA,KACM,GAAS,IAAK,CAC3C,CAGA,SAAgB,GAAgC,CAE9C,OADI,OAAO,OAAW,IAAoB,GACnC,OAAO,SAAS,MACzB"}
@@ -0,0 +1,31 @@
1
+ import type { Backend, BackendSelection, ResolvedActiveBackend } from "./types";
2
+ /**
3
+ * Query parameters that pin a link to the backend (and cloud org) that owns
4
+ * the linked resource.
5
+ *
6
+ * The active backend is tab-scoped: `readStoredActiveBackend()` prefers
7
+ * `sessionStorage` and only falls back to `localStorage`. A tab opened with
8
+ * cmd/ctrl-click or middle-click does not reliably inherit the opener's
9
+ * `sessionStorage`, so it can boot from the `localStorage` fallback — which
10
+ * holds whichever backend was selected *last in any tab*, not the one the
11
+ * sidebar we were just looking at belongs to. The new tab then resolves the
12
+ * conversation id against the wrong backend and shows "conversation not
13
+ * found". Carrying the identity in the URL makes the link self-describing so
14
+ * the new tab pins to the right backend regardless of what storage holds.
15
+ */
16
+ export declare const BACKEND_QUERY_PARAM = "backend";
17
+ export declare const ORG_QUERY_PARAM = "org";
18
+ /**
19
+ * Append the active backend identity to an in-app path so opening it in a new
20
+ * browsing context resolves against the same backend.
21
+ */
22
+ export declare function withBackendSelectionParams(path: string, active: ResolvedActiveBackend): string;
23
+ /**
24
+ * Read a backend selection off the current URL, keeping it only when it names
25
+ * a registered backend. An unknown id (a link from another machine, or a
26
+ * backend that has since been removed) is ignored so the caller falls back to
27
+ * the stored selection.
28
+ */
29
+ export declare function readBackendSelectionFromUrl(backends: Backend[], search: string): BackendSelection | null;
30
+ /** The current tab's query string, or "" outside a browser. */
31
+ export declare function currentLocationSearch(): string;
@@ -0,0 +1,29 @@
1
+ //#region src/api/backend-registry/url-selection.ts
2
+ var e = "backend";
3
+ function t(t, n) {
4
+ let { backend: r, orgId: i } = n;
5
+ if (!r.id) return t;
6
+ let [a, o = ""] = t.split("?"), s = new URLSearchParams(o);
7
+ return s.set(e, r.id), i && s.set("org", i), `${a}?${s.toString()}`;
8
+ }
9
+ function n(t, n) {
10
+ if (!n) return null;
11
+ let r;
12
+ try {
13
+ r = new URLSearchParams(n);
14
+ } catch {
15
+ return null;
16
+ }
17
+ let i = r.get(e);
18
+ return !i || !t.some((e) => e.id === i) ? null : {
19
+ backendId: i,
20
+ orgId: r.get("org") || null
21
+ };
22
+ }
23
+ function r() {
24
+ return typeof window > "u" ? "" : window.location.search;
25
+ }
26
+ //#endregion
27
+ export { r as currentLocationSearch, n as readBackendSelectionFromUrl, t as withBackendSelectionParams };
28
+
29
+ //# sourceMappingURL=url-selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-selection.js","names":[],"sources":["../../../src/api/backend-registry/url-selection.ts"],"sourcesContent":["import type { Backend, BackendSelection, ResolvedActiveBackend } from \"./types\";\n\n/**\n * Query parameters that pin a link to the backend (and cloud org) that owns\n * the linked resource.\n *\n * The active backend is tab-scoped: `readStoredActiveBackend()` prefers\n * `sessionStorage` and only falls back to `localStorage`. A tab opened with\n * cmd/ctrl-click or middle-click does not reliably inherit the opener's\n * `sessionStorage`, so it can boot from the `localStorage` fallback — which\n * holds whichever backend was selected *last in any tab*, not the one the\n * sidebar we were just looking at belongs to. The new tab then resolves the\n * conversation id against the wrong backend and shows \"conversation not\n * found\". Carrying the identity in the URL makes the link self-describing so\n * the new tab pins to the right backend regardless of what storage holds.\n */\nexport const BACKEND_QUERY_PARAM = \"backend\";\nexport const ORG_QUERY_PARAM = \"org\";\n\n/**\n * Append the active backend identity to an in-app path so opening it in a new\n * browsing context resolves against the same backend.\n */\nexport function withBackendSelectionParams(\n path: string,\n active: ResolvedActiveBackend,\n): string {\n const { backend, orgId } = active;\n if (!backend.id) return path;\n\n const [pathname, existingSearch = \"\"] = path.split(\"?\");\n const params = new URLSearchParams(existingSearch);\n params.set(BACKEND_QUERY_PARAM, backend.id);\n if (orgId) params.set(ORG_QUERY_PARAM, orgId);\n\n return `${pathname}?${params.toString()}`;\n}\n\n/**\n * Read a backend selection off the current URL, keeping it only when it names\n * a registered backend. An unknown id (a link from another machine, or a\n * backend that has since been removed) is ignored so the caller falls back to\n * the stored selection.\n */\nexport function readBackendSelectionFromUrl(\n backends: Backend[],\n search: string,\n): BackendSelection | null {\n if (!search) return null;\n\n let params: URLSearchParams;\n try {\n params = new URLSearchParams(search);\n } catch {\n return null;\n }\n\n const backendId = params.get(BACKEND_QUERY_PARAM);\n if (!backendId) return null;\n if (!backends.some((backend) => backend.id === backendId)) return null;\n\n const orgId = params.get(ORG_QUERY_PARAM);\n return { backendId, orgId: orgId || null };\n}\n\n/** The current tab's query string, or \"\" outside a browser. */\nexport function currentLocationSearch(): string {\n if (typeof window === \"undefined\") return \"\";\n return window.location.search;\n}\n"],"mappings":";AAgBA,IAAa,IAAsB;AAOnC,SAAgB,EACd,GACA,GACQ;CACR,IAAM,EAAE,YAAS,aAAU;CAC3B,IAAI,CAAC,EAAQ,IAAI,OAAO;CAExB,IAAM,CAAC,GAAU,IAAiB,MAAM,EAAK,MAAM,GAAG,GAChD,IAAS,IAAI,gBAAgB,CAAc;CAIjD,OAHA,EAAO,IAAI,GAAqB,EAAQ,EAAE,GACtC,KAAO,EAAO,IAAA,OAAqB,CAAK,GAErC,GAAG,EAAS,GAAG,EAAO,SAAS;AACxC;AAQA,SAAgB,EACd,GACA,GACyB;CACzB,IAAI,CAAC,GAAQ,OAAO;CAEpB,IAAI;CACJ,IAAI;EACF,IAAS,IAAI,gBAAgB,CAAM;CACrC,QAAQ;EACN,OAAO;CACT;CAEA,IAAM,IAAY,EAAO,IAAI,CAAmB;CAKhD,OAJI,CAAC,KACD,CAAC,EAAS,MAAM,MAAY,EAAQ,OAAO,CAAS,IAAU,OAG3D;EAAE;EAAW,OADN,EAAO,IAAA,KACM,KAAS;CAAK;AAC3C;AAGA,SAAgB,IAAgC;CAE9C,OADI,OAAO,SAAW,MAAoB,KACnC,OAAO,SAAS;AACzB"}
@@ -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":"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"}
@@ -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",