@openhands/agent-canvas 1.0.0-alpha.7 → 1.0.0-alpha.8
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.
- package/README.md +9 -18
- package/bin/agent-canvas.mjs +27 -1
- package/build/assets/{QueryClientProvider-DITRCGAK.js → QueryClientProvider-B7kl84Kj.js} +1 -1
- package/build/assets/{Trans-D43bd3yR.js → Trans-1j65oy9O.js} +1 -1
- package/build/assets/{acp-providers-SCPK1BIU.js → acp-providers-DauuOsW9.js} +1 -1
- package/build/assets/{acp-route-guard-IWlFmS6x.js → acp-route-guard-CQTmeJwM.js} +1 -1
- package/build/assets/{active-backend-context-CkP3ZEJs.js → active-backend-context-TVbjnvmP.js} +1 -1
- package/build/assets/add-backend-modal-KMmPQNZU.js +1 -0
- package/build/assets/{agent-server-client-options-8OJSXbm8.js → agent-server-client-options-DT2GP6VJ.js} +1 -1
- package/build/assets/{agent-server-compatibility-DvKtnXHw.js → agent-server-compatibility-2aOx5iWd.js} +1 -1
- package/build/assets/{agent-server-conversation-service.api-BdEre_71.js → agent-server-conversation-service.api-DSl9G5UR.js} +3 -3
- package/build/assets/{agent-settings-DdisD2Xx.js → agent-settings-B247S9G3.js} +2 -2
- package/build/assets/{alert-banner-CvTYN73l.js → alert-banner-BWoqueRw.js} +1 -1
- package/build/assets/{analytics-consent-form-modal-BKgT9i2w.js → analytics-consent-form-modal-C7sXfxRh.js} +1 -1
- package/build/assets/{app-settings-DcYXtxGP.js → app-settings-BVeSaty9.js} +1 -1
- package/build/assets/{automation-detail-D7GEU0vR.js → automation-detail-g5-RZ0da.js} +1 -1
- package/build/assets/{automations-list-CkVNsgzm.js → automations-list-DHoq_0MM.js} +1 -1
- package/build/assets/{backend-form-modal-KudhWUX8.js → backend-form-modal-K6IMCr3p.js} +1 -1
- package/build/assets/{backend-synced-settings-badge-BFy2HylT.js → backend-synced-settings-badge-nAfiUWvM.js} +1 -1
- package/build/assets/{base-modal-B4HvlFHE.js → base-modal-CQRvRHu1.js} +1 -1
- package/build/assets/{brand-button-8fVVei4i.js → brand-button-C2nEKopC.js} +1 -1
- package/build/assets/{browser-vYpdU3CR.js → browser-DKG63inJ.js} +1 -1
- package/build/assets/{browser-tab-DTM6RyoV.js → browser-tab-B_BuTvrO.js} +1 -1
- package/build/assets/{checkmark-BcvXE9bf.js → checkmark-BJJrZUF8.js} +1 -1
- package/build/assets/{chevron-left-small-BqSkXTeq.js → chevron-left-small-CSh-sE9L.js} +1 -1
- package/build/assets/{circle-plus-check-toggle-DRvuu-RD.js → circle-plus-check-toggle-qs8Va1cC.js} +1 -1
- package/build/assets/{clock-DfoVUZVq.js → clock-ZR4Kn-_Y.js} +1 -1
- package/build/assets/{close-SnIy2eLD.js → close-BdmyeRqS.js} +1 -1
- package/build/assets/{combobox-caret-BMsz5mQX.js → combobox-caret-B53O9Hsq.js} +1 -1
- package/build/assets/{condenser-settings-DduLQcpV.js → condenser-settings-A35V3yng.js} +1 -1
- package/build/assets/{confirmation-modal-B-DOYMUH.js → confirmation-modal-C9-La0h3.js} +1 -1
- package/build/assets/{context-menu-list-item-DzjPB8aC.js → context-menu-list-item-Buu9nc0q.js} +1 -1
- package/build/assets/conversation-BD5WemJI.js +19 -0
- package/build/assets/conversation-C47K62n8.js +1 -0
- package/build/assets/conversation-panel-Dn-S56Gk.js +1 -0
- package/build/assets/{conversation-service.api-YTGTw0pz.js → conversation-service.api-C8pYCyV6.js} +1 -1
- package/build/assets/{conversation-tab-empty-state-BtFDbyTe.js → conversation-tab-empty-state-D8dNvo-V.js} +1 -1
- package/build/assets/{conversation-websocket-context-DulnrIHh.js → conversation-websocket-context-Ywrxd_9p.js} +1 -1
- package/build/assets/{copy-BxgbrjDT.js → copy-C7Ti2d8C.js} +1 -1
- package/build/assets/{custom-toast-handlers-BYxhSr3t.js → custom-toast-handlers-BOc3qeQ7.js} +1 -1
- package/build/assets/declaration-D378OjpZ.js +1 -0
- package/build/assets/{device-verify-CTbXX9CQ.js → device-verify-CMusn8nX.js} +1 -1
- package/build/assets/edit-automation-modal-Dnjxbjn7.js +1 -0
- package/build/assets/{ellipsis-button-BoU2-xlG.js → ellipsis-button-ugUATsNo.js} +1 -1
- package/build/assets/{entry.client-DU7-q4ZU.js → entry.client-D9uR9Blz.js} +2 -2
- package/build/assets/{enum-filter-dropdown-BJt-NplD.js → enum-filter-dropdown-1vpOGySB.js} +1 -1
- package/build/assets/{environment-switch-overlay-DQ1n6Iu6.js → environment-switch-overlay-CTCTQikP.js} +1 -1
- package/build/assets/{extensions-hub-BW1FAKFJ.js → extensions-hub-BSUseHVF.js} +1 -1
- package/build/assets/{extensions-navigation-CbPMhSML.js → extensions-navigation-CT1kc1u_.js} +1 -1
- package/build/assets/{files-tab-CbJ4s7Ik.js → files-tab-B3A1NDlZ.js} +1 -1
- package/build/assets/{folder-CerIk8uG.js → folder-0WSMImNX.js} +1 -1
- package/build/assets/git-control-bar-branch-button-CcIpmyfM.js +27 -0
- package/build/assets/{git-provider-icon-D8RE4unY.js → git-provider-icon-DYE9n7fs.js} +1 -1
- package/build/assets/{home-DR11ejqB.js → home-dIzxi5Dd.js} +1 -1
- package/build/assets/{i18n-DkYgs32x.js → i18n-DjAGhTis.js} +1 -1
- package/build/assets/install-server-modal-z5VaHeXd.js +1 -0
- package/build/assets/{launch-DKCU9uJH.js → launch-hZ0ifhcV.js} +1 -1
- package/build/assets/{lesson-plan-CmkRbe6Z.js → lesson-plan-DRYG5SLI.js} +1 -1
- package/build/assets/{link-external-CvxB0BmI.js → link-external-Df8J52xI.js} +1 -1
- package/build/assets/{llm-client-BpIfxETv.js → llm-client-ChQzg4wX.js} +1 -1
- package/build/assets/llm-settings-2036m7Wt.js +1 -0
- package/build/assets/{llm-settings-BOJC4vD-.js → llm-settings-CcHqGOYL.js} +1 -1
- package/build/assets/{loading-spinner-91b5FiMQ.js → loading-spinner-C04FGh14.js} +1 -1
- package/build/assets/{manage-backends-modal-DqpzcxdI.js → manage-backends-modal-rYeyGx7j.js} +1 -1
- package/build/assets/{manage-workspaces-modal-eG6XgAvw.js → manage-workspaces-modal-C5EuW8m1.js} +1 -1
- package/build/assets/manifest-97e839da.js +1 -0
- package/build/assets/{markdown-renderer-wZnLDbA1.js → markdown-renderer-CEX4Becj.js} +1 -1
- package/build/assets/mcp-C06YssEI.js +9 -0
- package/build/assets/messages-T2ewVkbp.js +36 -0
- package/build/assets/{modal-backdrop-B04pVYAD.js → modal-backdrop-DTYGVmOR.js} +1 -1
- package/build/assets/{modal-body-CgUoFQA1.js → modal-body-YElmM1dV.js} +1 -1
- package/build/assets/{modal-close-button-SM_WXzDY.js → modal-close-button-C_GpQt9F.js} +1 -1
- package/build/assets/{model-selector-7id-Uirf.js → model-selector-DeMmw-Xa.js} +1 -1
- package/build/assets/{navigation-context-BFjstyH6.js → navigation-context-DeIPtGPp.js} +1 -1
- package/build/assets/{navigation-link-DFQ7YcWq.js → navigation-link-C9JD4PYD.js} +1 -1
- package/build/assets/{openhands-logo-DkDp75rC.js → openhands-logo-CI5Fhn1W.js} +1 -1
- package/build/assets/{option-service.api-DN0ZcGjw.js → option-service.api-DsI1UW7N.js} +1 -1
- package/build/assets/{organization-service.api-Ct2dZF8M.js → organization-service.api-COwMPFg5.js} +1 -1
- package/build/assets/{path-utils-D1ZtqFC7.js → path-utils-CqJboYxo.js} +1 -1
- package/build/assets/{plan-components-gOm-daR3.js → plan-components-DEjMuDDG.js} +1 -1
- package/build/assets/{planner-tab-yubfN-6U.js → planner-tab-BrntFmb1.js} +1 -1
- package/build/assets/{profiles-client-D4twHRVf.js → profiles-client-BGkKEV9j.js} +1 -1
- package/build/assets/{providers-C2T07PM3.js → providers-DXvCAN_u.js} +1 -1
- package/build/assets/{proxy-BMZyC45G.js → proxy-CurRmrqf.js} +1 -1
- package/build/assets/{query-client-config-CiK0GJJO.js → query-client-config-Ba7qAAoO.js} +1 -1
- package/build/assets/recommended-automations-launcher-BI9NhG8Y.js +52 -0
- package/build/assets/root-BS1Td78t.js +2 -0
- package/build/assets/root-DHeCXo9N.css +1 -0
- package/build/assets/{root-layout-B4QioBS6.js → root-layout-BLjAEgle.js} +2 -2
- package/build/assets/{sdk-section-page-03k88tIR.js → sdk-section-page-CJW0G04-.js} +1 -1
- package/build/assets/{sdk-settings-schema-BY8dOy3a.js → sdk-settings-schema-QBYH-ONX.js} +1 -1
- package/build/assets/{search-BCAF9EDS.js → search-Cq_cFrDt.js} +1 -1
- package/build/assets/{secrets-service-Z3qtRb_G.js → secrets-service-Bwd5DeUs.js} +1 -1
- package/build/assets/{secrets-settings-BnlByuMZ.js → secrets-settings-MLXqOtX2.js} +1 -1
- package/build/assets/{server-client-CG1zHqph.js → server-client-C3mC8Hl3.js} +1 -1
- package/build/assets/{settings-DyzGLF_d.js → settings-D7E2U5tK.js} +1 -1
- package/build/assets/{settings-client-CkXDJwIY.js → settings-client-CwjfwoiB.js} +1 -1
- package/build/assets/{settings-dropdown-input-CAQWQgx-.js → settings-dropdown-input-VwAXNrOb.js} +1 -1
- package/build/assets/{settings-gear-D4ZkEDGb.js → settings-gear-BJwWR1ej.js} +1 -1
- package/build/assets/{settings-index-KtTw49xL.js → settings-index-J-3BNR0W.js} +1 -1
- package/build/assets/{settings-input-BWCZt9g2.js → settings-input-DBywAnA7.js} +1 -1
- package/build/assets/{settings-list-classes-xMleGkTC.js → settings-list-classes-BOS092DR.js} +1 -1
- package/build/assets/{settings-modal-Cv2YWSUY.js → settings-modal-B8vgWDTe.js} +1 -1
- package/build/assets/{settings-section-header-context-1wfkgjZZ.js → settings-section-header-context-32x6WTyL.js} +1 -1
- package/build/assets/settings-service.api-FvJGK45W.js +1 -0
- package/build/assets/{settings-switch-CGap2LtG.js → settings-switch-DTKmHC8F.js} +1 -1
- package/build/assets/{settings-utils-BBozxqqi.js → settings-utils-BsvSU3OM.js} +1 -1
- package/build/assets/{shared-conversation-DQlzwdpo.js → shared-conversation-a0QV8o99.js} +1 -1
- package/build/assets/{sidebar-mobile-menu-toggle-DXplko7u.js → sidebar-mobile-menu-toggle-DTUNI1WQ.js} +1 -1
- package/build/assets/{sidebar-nav-link-B4h8naZ7.js → sidebar-nav-link-CnWoZcwc.js} +1 -1
- package/build/assets/{skill-card-pill-row-D0oTWx-a.js → skill-card-pill-row-tZ599jli.js} +1 -1
- package/build/assets/{skills-BN8atjgW.js → skills-ZyAO5dyK.js} +1 -1
- package/build/assets/{skills-plugins-BTnp7QcQ.js → skills-plugins-BSRz041I.js} +1 -1
- package/build/assets/{skills-settings-CbOQvzkR.js → skills-settings-DOnMn9q1.js} +2 -2
- package/build/assets/{status-DDL-ipIP.js → status-CsatcFbK.js} +1 -1
- package/build/assets/{styled-tooltip-Awq4HMw3.js → styled-tooltip-CS3mB_1X.js} +1 -1
- package/build/assets/{switch-skeleton-Bv21RGWd.js → switch-skeleton-C-CfhYYV.js} +1 -1
- package/build/assets/{task-list-tab-B45ktzHM.js → task-list-tab-Day9nhRT.js} +1 -1
- package/build/assets/{terminal-DGuR4559.js → terminal-LNa-iU5c.js} +1 -1
- package/build/assets/{terminal-D5pzR9Ru.js → terminal-ro4SNjUU.js} +1 -1
- package/build/assets/{toggle-switch-gj6T-wsU.js → toggle-switch-k-IZCDbt.js} +1 -1
- package/build/assets/{typography-BbaUAC4V.js → typography-vVUMoNUg.js} +1 -1
- package/build/assets/{u-check-circle-DHGiAi-w.js → u-check-circle-DplbarS5.js} +1 -1
- package/build/assets/{u-check-circle-half-BPcWtWwv.js → u-check-circle-half-yDuiSZHC.js} +1 -1
- package/build/assets/{u-circuit-B_nK9hOu.js → u-circuit-C9tYkpeK.js} +1 -1
- package/build/assets/{u-edit-BPFJBd34.js → u-edit-KAUlufD8.js} +1 -1
- package/build/assets/{use-active-conversation-Bu5J9iLy.js → use-active-conversation-D15D9GgR.js} +1 -1
- package/build/assets/{use-agent-settings-schema-BbtOsR7P.js → use-agent-settings-schema-Bvp5UzV8.js} +1 -1
- package/build/assets/{use-agent-state-DN9Nc5pP.js → use-agent-state-DE5dlEXJ.js} +1 -1
- package/build/assets/{use-cloud-current-user-id-B_rMUiu8.js → use-cloud-current-user-id-DWVar4st.js} +1 -1
- package/build/assets/{use-config-Bcz2JL2t.js → use-config-BSu_53GL.js} +1 -1
- package/build/assets/{use-conversation-id-BOaaZahn.js → use-conversation-id-DajhCn2A.js} +1 -1
- package/build/assets/{use-create-conversation-BWFA_FId.js → use-create-conversation-DW7AGgLA.js} +1 -1
- package/build/assets/{use-handle-plan-click-CgrCGmT1.js → use-handle-plan-click-DpgEQDAV.js} +1 -1
- package/build/assets/use-is-authed-hXC8vxgT.js +1 -0
- package/build/assets/{use-is-creating-conversation-DhoM7UAB.js → use-is-creating-conversation-DhDeeWfA.js} +1 -1
- package/build/assets/{use-launch-skill-in-chat-DOyQsXFO.js → use-launch-skill-in-chat-DVGPFrbI.js} +1 -1
- package/build/assets/{use-llm-profiles-CAIzHJDX.js → use-llm-profiles-D3-KXwQ0.js} +1 -1
- package/build/assets/use-runtime-is-ready-XFbT16BD.js +1 -0
- package/build/assets/{use-save-settings-5m3w89Ph.js → use-save-settings-CEEKSTWG.js} +1 -1
- package/build/assets/{use-settings-DzG0C3vO.js → use-settings-DQ7Oo1Hj.js} +1 -1
- package/build/assets/{use-settings-nav-items-BIsKeX52.js → use-settings-nav-items-YmrXrjn9.js} +2 -2
- package/build/assets/{use-skills-Cn-78xP1.js → use-skills-Xe0vjPMt.js} +1 -1
- package/build/assets/{use-unified-vscode-url-C5iI-Z5A.js → use-unified-vscode-url-BOsIOd-b.js} +1 -1
- package/build/assets/use-user-conversation-Mc0mQgkl.js +1 -0
- package/build/assets/{useMutation-CRJwk4cR.js → useMutation-B4OUESdw.js} +1 -1
- package/build/assets/{useTranslation-01pF7z10.js → useTranslation-CpIcQBq6.js} +1 -1
- package/build/assets/{utils-Czcl6buL.js → utils-D-HX7JCe.js} +1 -1
- package/build/assets/{vendor~conversation-panel~conversation-CbjvWBSu.js → vendor~conversation-panel~conversation-BlCIz9XQ.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CofhIDpd.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-Ds9quNZ9.js} +1 -1
- package/build/assets/vendor~home~mcp~automations-list-C5PoHCy6.js +1 -0
- package/build/assets/{vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-BQPOygpY.js → vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-CGlZoBKa.js} +1 -1
- package/build/assets/{vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-CyYIBiBk.js → vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-DE11mPxp.js} +1 -1
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-CuGq_cxH.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-8b8V5bfO.js} +1 -1
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-CFpDeb9o.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-Dy7L6fMG.js} +1 -1
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~k776hupu-C1p8-pMr.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~k776hupu-D40EXhZx.js} +1 -1
- package/build/assets/vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~dp08i1qy-CHrEOFl6.js +48 -0
- package/build/assets/{vendor~root~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-s~kyz9p27j-DlKA6SoO.js → vendor~root~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-s~kyz9p27j-CyUbhpbm.js} +1 -1
- package/build/assets/{verification-settings-DbziMp4K.js → verification-settings-BtlTiHP8.js} +1 -1
- package/build/assets/{vscode-tab-BVhQR2rt.js → vscode-tab-C0ShhiSU.js} +1 -1
- package/build/assets/{waiting-for-runtime-message-JotSOBdC.js → waiting-for-runtime-message-DWPl_Yby.js} +1 -1
- package/build/assets/{x-mark-CZ57VvRX.js → x-mark-CWI0f9yI.js} +1 -1
- package/build/favicon.svg +1 -0
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +8 -0
- package/build/locales/ca/openhands.json +8 -0
- package/build/locales/de/openhands.json +8 -0
- package/build/locales/en/openhands.json +8 -0
- package/build/locales/es/openhands.json +8 -0
- package/build/locales/fr/openhands.json +8 -0
- package/build/locales/it/openhands.json +8 -0
- package/build/locales/ja/openhands.json +8 -0
- package/build/locales/ko-KR/openhands.json +8 -0
- package/build/locales/no/openhands.json +8 -0
- package/build/locales/pt/openhands.json +8 -0
- package/build/locales/tr/openhands.json +8 -0
- package/build/locales/uk/openhands.json +8 -0
- package/build/locales/zh-CN/openhands.json +8 -0
- package/build/locales/zh-TW/openhands.json +8 -0
- package/config/defaults.json +1 -1
- package/dist/api/agent-server-config.cjs +1 -1
- package/dist/api/agent-server-config.cjs.map +1 -1
- package/dist/api/agent-server-config.d.ts +1 -1
- package/dist/api/agent-server-config.js +1 -1
- package/dist/api/agent-server-config.js.map +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +12 -0
- package/dist/api/conversation-service/agent-server-conversation-service.api.js +4 -0
- package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
- package/dist/api/mcp-service/mcp-service.api.cjs +2 -0
- package/dist/api/mcp-service/mcp-service.api.cjs.map +1 -0
- package/dist/api/mcp-service/mcp-service.api.d.ts +6 -0
- package/dist/api/mcp-service/mcp-service.api.js +36 -0
- package/dist/api/mcp-service/mcp-service.api.js.map +1 -0
- package/dist/api/settings-service/settings-service.api.cjs +1 -1
- package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
- package/dist/api/settings-service/settings-service.api.d.ts +1 -0
- package/dist/api/settings-service/settings-service.api.js +59 -41
- package/dist/api/settings-service/settings-service.api.js.map +1 -1
- package/dist/components/features/automations/detail/activity-log-item.d.ts +1 -1
- package/dist/components/features/automations/recommended-automations-launcher.d.ts +1 -1
- package/dist/components/features/chat/change-agent-button.cjs +1 -1
- package/dist/components/features/chat/change-agent-button.cjs.map +1 -1
- package/dist/components/features/chat/change-agent-button.js +65 -59
- package/dist/components/features/chat/change-agent-button.js.map +1 -1
- package/dist/components/features/chat/chat-interface.cjs +2 -2
- package/dist/components/features/chat/chat-interface.cjs.map +1 -1
- package/dist/components/features/chat/chat-interface.js +15 -14
- package/dist/components/features/chat/chat-interface.js.map +1 -1
- package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
- package/dist/components/features/chat/components/chat-input-actions.js +127 -149
- package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
- package/dist/components/features/chat/components/chat-input-model.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-model.cjs.map +1 -1
- package/dist/components/features/chat/components/chat-input-model.d.ts +10 -0
- package/dist/components/features/chat/components/chat-input-model.js +95 -60
- package/dist/components/features/chat/components/chat-input-model.js.map +1 -1
- package/dist/components/features/chat/git-control-bar.cjs +1 -1
- package/dist/components/features/chat/git-control-bar.cjs.map +1 -1
- package/dist/components/features/chat/git-control-bar.js +60 -59
- package/dist/components/features/chat/git-control-bar.js.map +1 -1
- package/dist/components/features/conversation/conversation-name-with-status.cjs +1 -1
- package/dist/components/features/conversation/conversation-name-with-status.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-name-with-status.js +2 -2
- package/dist/components/features/conversation/conversation-name-with-status.js.map +1 -1
- package/dist/components/features/conversation/conversation-name.cjs +1 -1
- package/dist/components/features/conversation/conversation-name.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-name.js +3 -3
- package/dist/components/features/conversation/conversation-name.js.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +16 -16
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
- package/dist/components/features/mcp-logo-badge.cjs +1 -1
- package/dist/components/features/mcp-logo-badge.cjs.map +1 -1
- package/dist/components/features/mcp-logo-badge.d.ts +2 -2
- package/dist/components/features/mcp-logo-badge.js +1 -1
- package/dist/components/features/mcp-logo-badge.js.map +1 -1
- package/dist/components/features/mcp-page/custom-server-editor.cjs +1 -1
- package/dist/components/features/mcp-page/custom-server-editor.cjs.map +1 -1
- package/dist/components/features/mcp-page/custom-server-editor.js +64 -41
- package/dist/components/features/mcp-page/custom-server-editor.js.map +1 -1
- package/dist/components/features/mcp-page/install-server-modal.cjs +1 -1
- package/dist/components/features/mcp-page/install-server-modal.cjs.map +1 -1
- package/dist/components/features/mcp-page/install-server-modal.d.ts +1 -1
- package/dist/components/features/mcp-page/install-server-modal.js +126 -102
- package/dist/components/features/mcp-page/install-server-modal.js.map +1 -1
- package/dist/components/features/mcp-page/installed-server-card.cjs +1 -1
- package/dist/components/features/mcp-page/installed-server-card.cjs.map +1 -1
- package/dist/components/features/mcp-page/installed-server-card.js +1 -1
- package/dist/components/features/mcp-page/installed-server-card.js.map +1 -1
- package/dist/components/features/mcp-page/marketplace-card.cjs +1 -1
- package/dist/components/features/mcp-page/marketplace-card.cjs.map +1 -1
- package/dist/components/features/mcp-page/marketplace-card.d.ts +1 -1
- package/dist/components/features/mcp-page/marketplace-card.js +27 -25
- package/dist/components/features/mcp-page/marketplace-card.js.map +1 -1
- package/dist/components/features/mcp-page/marketplace-section.cjs +1 -1
- package/dist/components/features/mcp-page/marketplace-section.cjs.map +1 -1
- package/dist/components/features/mcp-page/marketplace-section.d.ts +1 -1
- package/dist/components/features/mcp-page/marketplace-section.js +1 -1
- package/dist/components/features/mcp-page/marketplace-section.js.map +1 -1
- package/dist/components/features/mcp-page/mcp-logo-stack-badge.d.ts +2 -2
- package/dist/components/features/settings/mcp-settings/mcp-server-form.cjs +7 -7
- package/dist/components/features/settings/mcp-settings/mcp-server-form.cjs.map +1 -1
- package/dist/components/features/settings/mcp-settings/mcp-server-form.d.ts +8 -12
- package/dist/components/features/settings/mcp-settings/mcp-server-form.js +114 -87
- package/dist/components/features/settings/mcp-settings/mcp-server-form.js.map +1 -1
- package/dist/context/scroll-context.cjs +1 -1
- package/dist/context/scroll-context.cjs.map +1 -1
- package/dist/context/scroll-context.d.ts +1 -0
- package/dist/context/scroll-context.js +4 -1
- package/dist/context/scroll-context.js.map +1 -1
- package/dist/favicon.svg +1 -0
- package/dist/hooks/mutation/use-switch-acp-model.cjs +2 -0
- package/dist/hooks/mutation/use-switch-acp-model.cjs.map +1 -0
- package/dist/hooks/mutation/use-switch-acp-model.d.ts +23 -0
- package/dist/hooks/mutation/use-switch-acp-model.js +26 -0
- package/dist/hooks/mutation/use-switch-acp-model.js.map +1 -0
- package/dist/hooks/mutation/use-test-mcp-server.cjs +2 -0
- package/dist/hooks/mutation/use-test-mcp-server.cjs.map +1 -0
- package/dist/hooks/mutation/use-test-mcp-server.d.ts +2 -0
- package/dist/hooks/mutation/use-test-mcp-server.js +10 -0
- package/dist/hooks/mutation/use-test-mcp-server.js.map +1 -0
- package/dist/hooks/query/use-automation-detail.d.ts +3 -2
- package/dist/hooks/use-acp-model-context.cjs.map +1 -1
- package/dist/hooks/use-acp-model-context.d.ts +3 -4
- package/dist/hooks/use-acp-model-context.js.map +1 -1
- package/dist/hooks/use-chat-input-model-state.cjs +2 -0
- package/dist/hooks/use-chat-input-model-state.cjs.map +1 -0
- package/dist/hooks/use-chat-input-model-state.d.ts +12 -0
- package/dist/hooks/use-chat-input-model-state.js +29 -0
- package/dist/hooks/use-chat-input-model-state.js.map +1 -0
- package/dist/i18n/declaration.cjs +1 -1
- package/dist/i18n/declaration.cjs.map +1 -1
- package/dist/i18n/declaration.d.ts +8 -0
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/translation.cjs +2 -2
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +136 -0
- package/dist/i18n/translation.js.map +1 -1
- package/dist/locales/ar/openhands.json +8 -0
- package/dist/locales/ca/openhands.json +8 -0
- package/dist/locales/de/openhands.json +8 -0
- package/dist/locales/en/openhands.json +8 -0
- package/dist/locales/es/openhands.json +8 -0
- package/dist/locales/fr/openhands.json +8 -0
- package/dist/locales/it/openhands.json +8 -0
- package/dist/locales/ja/openhands.json +8 -0
- package/dist/locales/ko-KR/openhands.json +8 -0
- package/dist/locales/no/openhands.json +8 -0
- package/dist/locales/pt/openhands.json +8 -0
- package/dist/locales/tr/openhands.json +8 -0
- package/dist/locales/uk/openhands.json +8 -0
- package/dist/locales/zh-CN/openhands.json +8 -0
- package/dist/locales/zh-TW/openhands.json +8 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.js +37 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/apify.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/apify.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/apify.js +36 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/apify.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/atlassian.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/atlassian.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/atlassian.js +15 -5
- package/dist/node_modules/@openhands/extensions/integrations/catalog/atlassian.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/brave-search.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/brave-search.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/brave-search.js +36 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/brave-search.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/browser-mcp.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/browser-mcp.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/browser-mcp.js +31 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/browser-mcp.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/clickhouse.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/clickhouse.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/clickhouse.js +52 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/clickhouse.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/cloudflare-bindings.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/cloudflare-bindings.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/cloudflare-bindings.js +15 -5
- package/dist/node_modules/@openhands/extensions/integrations/catalog/cloudflare-bindings.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/cloudflare-browser-rendering.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/cloudflare-browser-rendering.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/cloudflare-browser-rendering.js +15 -5
- package/dist/node_modules/@openhands/extensions/integrations/catalog/cloudflare-browser-rendering.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/cloudflare-builds.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/cloudflare-builds.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/cloudflare-builds.js +15 -5
- package/dist/node_modules/@openhands/extensions/integrations/catalog/cloudflare-builds.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/cloudflare-docs.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/cloudflare-docs.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/cloudflare-docs.js +15 -5
- package/dist/node_modules/@openhands/extensions/integrations/catalog/cloudflare-docs.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/cloudflare-observability.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/cloudflare-observability.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/cloudflare-observability.js +15 -5
- package/dist/node_modules/@openhands/extensions/integrations/catalog/cloudflare-observability.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/deepwiki.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/deepwiki.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/deepwiki.js +15 -5
- package/dist/node_modules/@openhands/extensions/integrations/catalog/deepwiki.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/elevenlabs.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/elevenlabs.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/elevenlabs.js +36 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/elevenlabs.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/everything.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/everything.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/everything.js +13 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/everything.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/exa.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/exa.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/exa.js +36 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/exa.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/fetch.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/fetch.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/fetch.js +13 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/fetch.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.js +40 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/filesystem.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/filesystem.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/filesystem.js +39 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/filesystem.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/firecrawl.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/firecrawl.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/firecrawl.js +36 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/firecrawl.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/git.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/git.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/git.js +40 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/git.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/github.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/github.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/github.js +47 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/github.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/huggingface.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/huggingface.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/huggingface.js +15 -5
- package/dist/node_modules/@openhands/extensions/integrations/catalog/huggingface.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/kagi.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/kagi.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/kagi.js +36 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/kagi.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/linear.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/linear.js +15 -5
- package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/memory.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/memory.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/memory.js +13 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/memory.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/mongodb.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/mongodb.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/mongodb.js +36 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/mongodb.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/neon.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/neon.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/neon.js +40 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/neon.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js +39 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/obsidian.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/obsidian.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/obsidian.js +38 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/obsidian.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/paypal.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/paypal.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/paypal.js +15 -5
- package/dist/node_modules/@openhands/extensions/integrations/catalog/paypal.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/playwright.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/playwright.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/playwright.js +13 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/playwright.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/redis.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/redis.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/redis.js +43 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/redis.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/resend.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/resend.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/resend.js +41 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/resend.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sentry.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sentry.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/sentry.js +15 -5
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sentry.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sequential-thinking.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sequential-thinking.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/sequential-thinking.js +13 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sequential-thinking.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.js +45 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/stripe.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/stripe.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/stripe.js +15 -5
- package/dist/node_modules/@openhands/extensions/integrations/catalog/stripe.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.js +37 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/tavily.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/tavily.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/tavily.js +39 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/tavily.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/time.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/time.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/catalog/time.js +13 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/time.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/index.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/index.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/index.js +175 -0
- package/dist/node_modules/@openhands/extensions/integrations/index.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/logos.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/logos.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/{mcps → integrations}/logos.js +2 -2
- package/dist/node_modules/@openhands/extensions/integrations/logos.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/oauth-provider-catalog.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/oauth-provider-catalog.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/oauth-provider-catalog.js +548 -0
- package/dist/node_modules/@openhands/extensions/integrations/oauth-provider-catalog.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/oauth-provider-registration-defaults.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/oauth-provider-registration-defaults.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/oauth-provider-registration-defaults.js +482 -0
- package/dist/node_modules/@openhands/extensions/integrations/oauth-provider-registration-defaults.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.js +3 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/mcp-client.cjs +2 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/mcp-client.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/mcp-client.js +22 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/mcp-client.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/index.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/index.js +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js +3 -0
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js.map +1 -1
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +6 -4
- package/dist/package.js.map +1 -1
- package/dist/routes/mcp.cjs +1 -1
- package/dist/routes/mcp.cjs.map +1 -1
- package/dist/routes/mcp.js +1 -1
- package/dist/routes/mcp.js.map +1 -1
- package/dist/utils/mcp-marketplace-utils.cjs +1 -1
- package/dist/utils/mcp-marketplace-utils.cjs.map +1 -1
- package/dist/utils/mcp-marketplace-utils.d.ts +21 -1
- package/dist/utils/mcp-marketplace-utils.js +23 -13
- package/dist/utils/mcp-marketplace-utils.js.map +1 -1
- package/dist/utils/settings-utils.cjs.map +1 -1
- package/dist/utils/settings-utils.js.map +1 -1
- package/package.json +6 -4
- package/scripts/check-sdk-version-sync.mjs +6 -6
- package/scripts/dev-safe.mjs +25 -7
- package/scripts/dev-with-automation.mjs +6 -1
- package/tools/canvas_ui_tool.py +129 -0
- package/build/assets/add-backend-modal-CqjNjGqY.js +0 -1
- package/build/assets/conversation-COZAKz_K.js +0 -1
- package/build/assets/conversation-DWcvnmds.js +0 -19
- package/build/assets/conversation-panel-CZDStT0b.js +0 -1
- package/build/assets/declaration-C9nuq2Dj.js +0 -1
- package/build/assets/edit-automation-modal-C3bFxS2f.js +0 -1
- package/build/assets/git-control-bar-branch-button-Bm6rzSpo.js +0 -27
- package/build/assets/install-server-modal-VB5hOBpW.js +0 -1
- package/build/assets/llm-settings-CIdxmimN.js +0 -1
- package/build/assets/manifest-f041e61a.js +0 -1
- package/build/assets/mcp-BdfyCW1l.js +0 -9
- package/build/assets/messages-v-q35ObG.js +0 -36
- package/build/assets/recommended-automations-launcher-Cx7svuGE.js +0 -52
- package/build/assets/root-D2PVd51i.js +0 -2
- package/build/assets/root-DEotKI6b.css +0 -1
- package/build/assets/settings-service.api-Z6x0l0GU.js +0 -1
- package/build/assets/use-is-authed-BFoh8Ogh.js +0 -1
- package/build/assets/use-runtime-is-ready-BQWLEyqa.js +0 -1
- package/build/assets/use-user-conversation-BCYpbPT1.js +0 -1
- package/build/assets/vendor~home~mcp~automations-list-DRfWZRnF.js +0 -1
- package/build/assets/vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~dp08i1qy-BJm2mGIp.js +0 -48
- package/dist/node_modules/@openhands/extensions/mcps/catalog/airtable.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/airtable.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/airtable.js +0 -30
- package/dist/node_modules/@openhands/extensions/mcps/catalog/airtable.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/apify.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/apify.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/apify.js +0 -29
- package/dist/node_modules/@openhands/extensions/mcps/catalog/apify.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/atlassian.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/atlassian.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/brave-search.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/brave-search.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/brave-search.js +0 -29
- package/dist/node_modules/@openhands/extensions/mcps/catalog/brave-search.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/browser-mcp.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/browser-mcp.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/browser-mcp.js +0 -24
- package/dist/node_modules/@openhands/extensions/mcps/catalog/browser-mcp.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/clickhouse.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/clickhouse.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/clickhouse.js +0 -45
- package/dist/node_modules/@openhands/extensions/mcps/catalog/clickhouse.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/cloudflare-bindings.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/cloudflare-bindings.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/cloudflare-browser-rendering.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/cloudflare-browser-rendering.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/cloudflare-browser-rendering.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/cloudflare-builds.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/cloudflare-builds.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/cloudflare-docs.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/cloudflare-docs.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/cloudflare-observability.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/cloudflare-observability.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/cloudflare-observability.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/deepwiki.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/deepwiki.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/elevenlabs.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/elevenlabs.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/elevenlabs.js +0 -29
- package/dist/node_modules/@openhands/extensions/mcps/catalog/elevenlabs.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/everything.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/everything.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/exa.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/exa.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/exa.js +0 -29
- package/dist/node_modules/@openhands/extensions/mcps/catalog/exa.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/fetch.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/fetch.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/figma.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/figma.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/figma.js +0 -33
- package/dist/node_modules/@openhands/extensions/mcps/catalog/figma.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/filesystem.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/filesystem.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/filesystem.js +0 -32
- package/dist/node_modules/@openhands/extensions/mcps/catalog/filesystem.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/firecrawl.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/firecrawl.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/firecrawl.js +0 -29
- package/dist/node_modules/@openhands/extensions/mcps/catalog/firecrawl.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/git.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/git.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/git.js +0 -33
- package/dist/node_modules/@openhands/extensions/mcps/catalog/git.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/github.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/github.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/github.js +0 -40
- package/dist/node_modules/@openhands/extensions/mcps/catalog/github.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/huggingface.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/huggingface.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/kagi.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/kagi.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/kagi.js +0 -29
- package/dist/node_modules/@openhands/extensions/mcps/catalog/kagi.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/linear.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/linear.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/memory.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/memory.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/memory.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/mongodb.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/mongodb.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/mongodb.js +0 -29
- package/dist/node_modules/@openhands/extensions/mcps/catalog/mongodb.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/neon.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/neon.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/neon.js +0 -33
- package/dist/node_modules/@openhands/extensions/mcps/catalog/neon.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/notion.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/notion.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/notion.js +0 -32
- package/dist/node_modules/@openhands/extensions/mcps/catalog/notion.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/obsidian.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/obsidian.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/obsidian.js +0 -31
- package/dist/node_modules/@openhands/extensions/mcps/catalog/obsidian.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/paypal.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/paypal.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/paypal.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/playwright.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/playwright.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/playwright.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/redis.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/redis.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/redis.js +0 -36
- package/dist/node_modules/@openhands/extensions/mcps/catalog/redis.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/resend.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/resend.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/resend.js +0 -34
- package/dist/node_modules/@openhands/extensions/mcps/catalog/resend.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/sentry.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/sentry.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/sentry.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/sequential-thinking.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/sequential-thinking.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/sequential-thinking.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/slack.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/slack.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/slack.js +0 -38
- package/dist/node_modules/@openhands/extensions/mcps/catalog/slack.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/stripe.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/stripe.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/stripe.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/supabase.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/supabase.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/supabase.js +0 -30
- package/dist/node_modules/@openhands/extensions/mcps/catalog/supabase.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/tavily.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/tavily.js +0 -32
- package/dist/node_modules/@openhands/extensions/mcps/catalog/tavily.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/time.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/catalog/time.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/catalog/time.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/index.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/mcps/index.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/index.js +0 -87
- package/dist/node_modules/@openhands/extensions/mcps/index.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/logos.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/mcps/logos.js.map +0 -1
|
@@ -10,65 +10,65 @@ import { SettingsDropdownInput as c } from "../settings-dropdown-input.js";
|
|
|
10
10
|
import l from "react";
|
|
11
11
|
import { Fragment as u, jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
12
12
|
//#region src/components/features/settings/mcp-settings/mcp-server-form.tsx
|
|
13
|
-
function p({ mode: p, server: m, existingServers: h, onSubmit: g, onCancel: _, onDelete: v, isActionDisabled: y = !1 }) {
|
|
14
|
-
let { t:
|
|
13
|
+
function p({ mode: p, server: m, existingServers: h, onSubmit: g, onCancel: _, onDelete: v, isActionDisabled: y = !1, onTest: b, isTestPending: x = !1, testMessage: S = null }) {
|
|
14
|
+
let { t: C } = e("openhands"), [w, T] = l.useState(m?.type || "sse"), [E, D] = l.useState(null), O = l.useRef(null), k = [
|
|
15
15
|
{
|
|
16
16
|
key: "sse",
|
|
17
|
-
label:
|
|
17
|
+
label: C(t.SETTINGS$MCP_SERVER_TYPE_SSE)
|
|
18
18
|
},
|
|
19
19
|
{
|
|
20
20
|
key: "stdio",
|
|
21
|
-
label:
|
|
21
|
+
label: C(t.SETTINGS$MCP_SERVER_TYPE_STDIO)
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
key: "shttp",
|
|
25
|
-
label:
|
|
25
|
+
label: C(t.SETTINGS$MCP_SERVER_TYPE_SHTTP)
|
|
26
26
|
}
|
|
27
|
-
],
|
|
28
|
-
if (!e) return
|
|
27
|
+
], A = (e) => {
|
|
28
|
+
if (!e) return C(t.SETTINGS$MCP_ERROR_URL_REQUIRED);
|
|
29
29
|
try {
|
|
30
30
|
let n = new URL(e);
|
|
31
|
-
if (!["http:", "https:"].includes(n.protocol)) return
|
|
31
|
+
if (!["http:", "https:"].includes(n.protocol)) return C(t.SETTINGS$MCP_ERROR_URL_INVALID_PROTOCOL);
|
|
32
32
|
} catch {
|
|
33
|
-
return
|
|
33
|
+
return C(t.SETTINGS$MCP_ERROR_URL_INVALID);
|
|
34
34
|
}
|
|
35
35
|
return null;
|
|
36
|
-
},
|
|
36
|
+
}, j = (e) => e ? /^[a-zA-Z0-9_-]+$/.test(e) ? null : C(t.SETTINGS$MCP_ERROR_NAME_INVALID) : C(t.SETTINGS$MCP_ERROR_NAME_REQUIRED), M = (e) => !h || !(p === "add" || p === "edit" && m?.name !== e) ? null : h.filter((e) => e.type === "stdio").map((e) => e.name).filter(Boolean).includes(e) ? C(t.SETTINGS$MCP_ERROR_NAME_DUPLICATE) : null, N = (e) => e ? e.includes(" ") ? C(t.SETTINGS$MCP_ERROR_COMMAND_NO_SPACES) : null : C(t.SETTINGS$MCP_ERROR_COMMAND_REQUIRED), P = (e) => {
|
|
37
37
|
if (!h) return null;
|
|
38
38
|
let n = m?.url;
|
|
39
|
-
return (p === "add" || p === "edit" && n !== e) && h.some((t) => (t.type === "sse" || t.type === "shttp") && t.url === e) ?
|
|
40
|
-
},
|
|
39
|
+
return (p === "add" || p === "edit" && n !== e) && h.some((t) => (t.type === "sse" || t.type === "shttp") && t.url === e) ? C(t.SETTINGS$MCP_ERROR_URL_DUPLICATE) : null;
|
|
40
|
+
}, F = (e) => {
|
|
41
41
|
if (!e.trim()) return null;
|
|
42
42
|
let n = e.split("\n");
|
|
43
43
|
for (let e = 0; e < n.length; e += 1) {
|
|
44
44
|
let r = n[e].trim();
|
|
45
45
|
if (r) {
|
|
46
46
|
let e = r.indexOf("=");
|
|
47
|
-
if (e === -1 || !r.substring(0, e).trim()) return
|
|
47
|
+
if (e === -1 || !r.substring(0, e).trim()) return C(t.SETTINGS$MCP_ERROR_ENV_INVALID_FORMAT);
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
return null;
|
|
51
|
-
},
|
|
51
|
+
}, I = (e) => {
|
|
52
52
|
if (!e.trim()) return null;
|
|
53
53
|
let n = parseInt(e.trim(), 10);
|
|
54
|
-
return Number.isNaN(n) ?
|
|
55
|
-
},
|
|
54
|
+
return Number.isNaN(n) ? C(t.SETTINGS$MCP_ERROR_TIMEOUT_INVALID_NUMBER) : n <= 0 ? C(t.SETTINGS$MCP_ERROR_TIMEOUT_POSITIVE) : n > 3600 ? C(t.SETTINGS$MCP_ERROR_TIMEOUT_MAX_EXCEEDED) : null;
|
|
55
|
+
}, L = (e) => {
|
|
56
56
|
let t = e.get("name")?.toString().trim() || "", n = e.get("command")?.toString().trim() || "", r = e.get("env")?.toString() || "";
|
|
57
|
-
return
|
|
58
|
-
},
|
|
59
|
-
if (
|
|
60
|
-
let t = e.get("url")?.toString().trim() || "", n =
|
|
57
|
+
return j(t) || M(t) || N(n) || F(r) || null;
|
|
58
|
+
}, R = (e) => {
|
|
59
|
+
if (w === "sse" || w === "shttp") {
|
|
60
|
+
let t = e.get("url")?.toString().trim() || "", n = A(t);
|
|
61
61
|
if (n) return n;
|
|
62
|
-
let r =
|
|
62
|
+
let r = P(t);
|
|
63
63
|
if (r) return r;
|
|
64
|
-
if (
|
|
65
|
-
let t =
|
|
64
|
+
if (w === "shttp") {
|
|
65
|
+
let t = I(e.get("timeout")?.toString() || "");
|
|
66
66
|
if (t) return t;
|
|
67
67
|
}
|
|
68
68
|
return null;
|
|
69
69
|
}
|
|
70
|
-
return
|
|
71
|
-
},
|
|
70
|
+
return w === "stdio" ? L(e) : null;
|
|
71
|
+
}, z = (e) => {
|
|
72
72
|
let t = {}, n = e.trim();
|
|
73
73
|
if (!n) return t;
|
|
74
74
|
for (let e of n.split("\n")) {
|
|
@@ -76,67 +76,69 @@ function p({ mode: p, server: m, existingServers: h, onSubmit: g, onCancel: _, o
|
|
|
76
76
|
n && r !== -1 && i && (t[i] = n.substring(r + 1).trim());
|
|
77
77
|
}
|
|
78
78
|
return t;
|
|
79
|
+
}, B = (e) => e ? Object.entries(e).map(([e, t]) => `${e}=${t}`).join("\n") : "", V = (e) => {
|
|
80
|
+
let t = {
|
|
81
|
+
id: m?.id || `${w}-${Date.now()}`,
|
|
82
|
+
type: w
|
|
83
|
+
};
|
|
84
|
+
if (w === "sse" || w === "shttp") {
|
|
85
|
+
let n = e.get("url")?.toString().trim(), r = e.get("api_key")?.toString().trim(), i = e.get("timeout")?.toString().trim(), a = {
|
|
86
|
+
...t,
|
|
87
|
+
url: n,
|
|
88
|
+
...r && { api_key: r }
|
|
89
|
+
};
|
|
90
|
+
if (w === "shttp" && i) {
|
|
91
|
+
let e = parseInt(i, 10);
|
|
92
|
+
Number.isNaN(e) || (a.timeout = e);
|
|
93
|
+
}
|
|
94
|
+
return a;
|
|
95
|
+
}
|
|
96
|
+
let n = e.get("name")?.toString().trim(), r = e.get("command")?.toString().trim(), i = e.get("args")?.toString().trim(), a = e.get("env")?.toString().trim(), o = i ? i.split("\n").map((e) => e.trim()).filter(Boolean) : [], s = z(a || "");
|
|
97
|
+
return {
|
|
98
|
+
...t,
|
|
99
|
+
name: n,
|
|
100
|
+
command: r,
|
|
101
|
+
...o.length > 0 && { args: o },
|
|
102
|
+
...Object.keys(s).length > 0 && { env: s }
|
|
103
|
+
};
|
|
79
104
|
};
|
|
80
105
|
return /* @__PURE__ */ f("form", {
|
|
106
|
+
ref: O,
|
|
81
107
|
"data-testid": p === "add" ? "add-mcp-server-form" : "edit-mcp-server-form",
|
|
82
108
|
onSubmit: (e) => {
|
|
83
|
-
e.preventDefault(),
|
|
84
|
-
let t = new FormData(e.currentTarget), n =
|
|
109
|
+
e.preventDefault(), D(null);
|
|
110
|
+
let t = new FormData(e.currentTarget), n = R(t);
|
|
85
111
|
if (n) {
|
|
86
|
-
|
|
112
|
+
D(n);
|
|
87
113
|
return;
|
|
88
114
|
}
|
|
89
|
-
|
|
90
|
-
id: m?.id || `${x}-${Date.now()}`,
|
|
91
|
-
type: x
|
|
92
|
-
};
|
|
93
|
-
if (x === "sse" || x === "shttp") {
|
|
94
|
-
let e = t.get("url")?.toString().trim(), n = t.get("api_key")?.toString().trim(), i = t.get("timeout")?.toString().trim(), a = {
|
|
95
|
-
...r,
|
|
96
|
-
url: e,
|
|
97
|
-
...n && { api_key: n }
|
|
98
|
-
};
|
|
99
|
-
if (x === "shttp" && i) {
|
|
100
|
-
let e = parseInt(i, 10);
|
|
101
|
-
Number.isNaN(e) || (a.timeout = e);
|
|
102
|
-
}
|
|
103
|
-
g(a);
|
|
104
|
-
} else if (x === "stdio") {
|
|
105
|
-
let e = t.get("name")?.toString().trim(), n = t.get("command")?.toString().trim(), i = t.get("args")?.toString().trim(), a = t.get("env")?.toString().trim(), o = i ? i.split("\n").map((e) => e.trim()).filter(Boolean) : [], s = F(a || "");
|
|
106
|
-
g({
|
|
107
|
-
...r,
|
|
108
|
-
name: e,
|
|
109
|
-
command: n,
|
|
110
|
-
...o.length > 0 && { args: o },
|
|
111
|
-
...Object.keys(s).length > 0 && { env: s }
|
|
112
|
-
});
|
|
113
|
-
}
|
|
115
|
+
g(V(t));
|
|
114
116
|
},
|
|
115
117
|
className: "flex flex-col items-start gap-6",
|
|
116
118
|
children: [
|
|
117
119
|
p === "add" && /* @__PURE__ */ d(c, {
|
|
118
120
|
testId: "server-type-dropdown",
|
|
119
121
|
name: "server-type",
|
|
120
|
-
label:
|
|
121
|
-
items:
|
|
122
|
-
selectedKey:
|
|
123
|
-
onSelectionChange: (e) =>
|
|
122
|
+
label: C(t.SETTINGS$MCP_SERVER_TYPE),
|
|
123
|
+
items: k,
|
|
124
|
+
selectedKey: w,
|
|
125
|
+
onSelectionChange: (e) => T(e),
|
|
124
126
|
onInputChange: () => {},
|
|
125
127
|
isClearable: !1,
|
|
126
128
|
allowsCustomValue: !1,
|
|
127
129
|
required: !0,
|
|
128
130
|
wrapperClassName: "w-full min-w-0"
|
|
129
131
|
}),
|
|
130
|
-
|
|
132
|
+
E && /* @__PURE__ */ d("p", {
|
|
131
133
|
className: "text-red-500 text-sm",
|
|
132
|
-
children:
|
|
134
|
+
children: E
|
|
133
135
|
}),
|
|
134
|
-
(
|
|
136
|
+
(w === "sse" || w === "shttp") && /* @__PURE__ */ f(u, { children: [
|
|
135
137
|
/* @__PURE__ */ d(s, {
|
|
136
138
|
testId: "url-input",
|
|
137
139
|
name: "url",
|
|
138
140
|
type: "url",
|
|
139
|
-
label:
|
|
141
|
+
label: C(t.SETTINGS$MCP_URL),
|
|
140
142
|
className: "w-full min-w-0",
|
|
141
143
|
required: !0,
|
|
142
144
|
defaultValue: m?.url || "",
|
|
@@ -146,17 +148,17 @@ function p({ mode: p, server: m, existingServers: h, onSubmit: g, onCancel: _, o
|
|
|
146
148
|
testId: "api-key-input",
|
|
147
149
|
name: "api_key",
|
|
148
150
|
type: "password",
|
|
149
|
-
label:
|
|
151
|
+
label: C(t.SETTINGS$MCP_API_KEY),
|
|
150
152
|
className: "w-full min-w-0",
|
|
151
153
|
showOptionalTag: !0,
|
|
152
154
|
defaultValue: m?.api_key || "",
|
|
153
|
-
placeholder:
|
|
155
|
+
placeholder: C(t.SETTINGS$MCP_API_KEY_PLACEHOLDER)
|
|
154
156
|
}),
|
|
155
|
-
|
|
157
|
+
w === "shttp" && /* @__PURE__ */ d(s, {
|
|
156
158
|
testId: "timeout-input",
|
|
157
159
|
name: "timeout",
|
|
158
160
|
type: "number",
|
|
159
|
-
label:
|
|
161
|
+
label: C(t.SETTINGS$MCP_TIMEOUT_LABEL),
|
|
160
162
|
className: "w-full min-w-0",
|
|
161
163
|
showOptionalTag: !0,
|
|
162
164
|
defaultValue: m?.timeout?.toString() || "",
|
|
@@ -165,12 +167,12 @@ function p({ mode: p, server: m, existingServers: h, onSubmit: g, onCancel: _, o
|
|
|
165
167
|
max: 3600
|
|
166
168
|
})
|
|
167
169
|
] }),
|
|
168
|
-
|
|
170
|
+
w === "stdio" && /* @__PURE__ */ f(u, { children: [
|
|
169
171
|
/* @__PURE__ */ d(s, {
|
|
170
172
|
testId: "name-input",
|
|
171
173
|
name: "name",
|
|
172
174
|
type: "text",
|
|
173
|
-
label:
|
|
175
|
+
label: C(t.SETTINGS$MCP_NAME),
|
|
174
176
|
className: "w-full min-w-0",
|
|
175
177
|
required: !0,
|
|
176
178
|
defaultValue: m?.name || "",
|
|
@@ -181,7 +183,7 @@ function p({ mode: p, server: m, existingServers: h, onSubmit: g, onCancel: _, o
|
|
|
181
183
|
testId: "command-input",
|
|
182
184
|
name: "command",
|
|
183
185
|
type: "text",
|
|
184
|
-
label:
|
|
186
|
+
label: C(t.SETTINGS$MCP_COMMAND),
|
|
185
187
|
className: "w-full min-w-0",
|
|
186
188
|
required: !0,
|
|
187
189
|
defaultValue: m?.command || "",
|
|
@@ -194,7 +196,7 @@ function p({ mode: p, server: m, existingServers: h, onSubmit: g, onCancel: _, o
|
|
|
194
196
|
className: "flex items-center gap-2",
|
|
195
197
|
children: [/* @__PURE__ */ d("span", {
|
|
196
198
|
className: "text-sm",
|
|
197
|
-
children:
|
|
199
|
+
children: C(t.SETTINGS$MCP_COMMAND_ARGUMENTS)
|
|
198
200
|
}), /* @__PURE__ */ d(o, {})]
|
|
199
201
|
}),
|
|
200
202
|
/* @__PURE__ */ d("textarea", {
|
|
@@ -207,7 +209,7 @@ function p({ mode: p, server: m, existingServers: h, onSubmit: g, onCancel: _, o
|
|
|
207
209
|
}),
|
|
208
210
|
/* @__PURE__ */ d("p", {
|
|
209
211
|
className: "text-xs text-tertiary-alt",
|
|
210
|
-
children:
|
|
212
|
+
children: C(t.SETTINGS$MCP_COMMAND_ARGUMENTS_HELP)
|
|
211
213
|
})
|
|
212
214
|
]
|
|
213
215
|
}),
|
|
@@ -217,18 +219,23 @@ function p({ mode: p, server: m, existingServers: h, onSubmit: g, onCancel: _, o
|
|
|
217
219
|
className: "flex items-center gap-2",
|
|
218
220
|
children: [/* @__PURE__ */ d("span", {
|
|
219
221
|
className: "text-sm",
|
|
220
|
-
children:
|
|
222
|
+
children: C(t.SETTINGS$MCP_ENVIRONMENT_VARIABLES)
|
|
221
223
|
}), /* @__PURE__ */ d(o, {})]
|
|
222
224
|
}), /* @__PURE__ */ d("textarea", {
|
|
223
225
|
"data-testid": "env-input",
|
|
224
226
|
name: "env",
|
|
225
227
|
rows: 4,
|
|
226
|
-
defaultValue: (
|
|
228
|
+
defaultValue: B(m?.env),
|
|
227
229
|
placeholder: "KEY1=value1\nKEY2=value2",
|
|
228
230
|
className: n(i, "resize-none placeholder:italic", "disabled:bg-[var(--oh-surface-raised)] disabled:border-[var(--oh-border-subtle)]")
|
|
229
231
|
})]
|
|
230
232
|
})
|
|
231
233
|
] }),
|
|
234
|
+
S && /* @__PURE__ */ d("p", {
|
|
235
|
+
"data-testid": "mcp-test-message",
|
|
236
|
+
className: S.ok ? "text-sm text-green-500 whitespace-pre-wrap" : "text-sm text-red-500 whitespace-pre-wrap",
|
|
237
|
+
children: S.text
|
|
238
|
+
}),
|
|
232
239
|
/* @__PURE__ */ f("div", {
|
|
233
240
|
className: n("flex w-full items-center gap-2", v ? "justify-between" : "justify-end"),
|
|
234
241
|
children: [v ? /* @__PURE__ */ d(a, {
|
|
@@ -242,23 +249,43 @@ function p({ mode: p, server: m, existingServers: h, onSubmit: g, onCancel: _, o
|
|
|
242
249
|
className: "size-4",
|
|
243
250
|
strokeWidth: 2
|
|
244
251
|
}),
|
|
245
|
-
children:
|
|
252
|
+
children: C(t.BUTTON$DELETE)
|
|
246
253
|
}) : null, /* @__PURE__ */ f("div", {
|
|
247
254
|
className: "flex items-center gap-2",
|
|
248
|
-
children: [
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
255
|
+
children: [
|
|
256
|
+
/* @__PURE__ */ d(a, {
|
|
257
|
+
testId: "cancel-button",
|
|
258
|
+
type: "button",
|
|
259
|
+
variant: "secondary",
|
|
260
|
+
onClick: _,
|
|
261
|
+
isDisabled: y,
|
|
262
|
+
children: C(t.BUTTON$CANCEL)
|
|
263
|
+
}),
|
|
264
|
+
b && /* @__PURE__ */ d(a, {
|
|
265
|
+
testId: "mcp-test-connection",
|
|
266
|
+
type: "button",
|
|
267
|
+
variant: "secondary",
|
|
268
|
+
onClick: () => {
|
|
269
|
+
if (!b || !O.current) return;
|
|
270
|
+
D(null);
|
|
271
|
+
let e = new FormData(O.current), t = R(e);
|
|
272
|
+
if (t) {
|
|
273
|
+
D(t);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
b(V(e));
|
|
277
|
+
},
|
|
278
|
+
isDisabled: y || x,
|
|
279
|
+
children: C(x ? t.MCP$VERIFYING : t.MCP$TEST_BUTTON)
|
|
280
|
+
}),
|
|
281
|
+
/* @__PURE__ */ f(a, {
|
|
282
|
+
testId: "submit-button",
|
|
283
|
+
type: "submit",
|
|
284
|
+
variant: "primary",
|
|
285
|
+
isDisabled: y || x,
|
|
286
|
+
children: [p === "add" && C(t.SETTINGS$MCP_ADD_SERVER), p === "edit" && C(t.SETTINGS$MCP_SAVE_SERVER)]
|
|
287
|
+
})
|
|
288
|
+
]
|
|
262
289
|
})]
|
|
263
290
|
})
|
|
264
291
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server-form.js","names":[],"sources":["../../../../../src/components/features/settings/mcp-settings/mcp-server-form.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Trash2 } from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { SettingsInput } from \"../settings-input\";\nimport { SettingsDropdownInput } from \"../settings-dropdown-input\";\nimport { BrandButton } from \"../brand-button\";\nimport { OptionalTag } from \"../optional-tag\";\nimport { cn } from \"#/utils/utils\";\nimport { formControlMultilineFieldClassName } from \"#/utils/form-control-classes\";\n\ntype MCPServerType = \"sse\" | \"stdio\" | \"shttp\";\n\ninterface MCPServerConfig {\n id: string;\n type: MCPServerType;\n name?: string;\n url?: string;\n api_key?: string;\n timeout?: number;\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\ninterface MCPServerFormProps {\n mode: \"add\" | \"edit\";\n server?: MCPServerConfig;\n existingServers?: MCPServerConfig[];\n onSubmit: (server: MCPServerConfig) => void;\n onCancel: () => void;\n onDelete?: () => void;\n isActionDisabled?: boolean;\n}\n\nexport function MCPServerForm({\n mode,\n server,\n existingServers,\n onSubmit,\n onCancel,\n onDelete,\n isActionDisabled = false,\n}: MCPServerFormProps) {\n const { t } = useTranslation(\"openhands\");\n const [serverType, setServerType] = React.useState<MCPServerType>(\n server?.type || \"sse\",\n );\n const [error, setError] = React.useState<string | null>(null);\n\n const serverTypeOptions = [\n { key: \"sse\", label: t(I18nKey.SETTINGS$MCP_SERVER_TYPE_SSE) },\n { key: \"stdio\", label: t(I18nKey.SETTINGS$MCP_SERVER_TYPE_STDIO) },\n { key: \"shttp\", label: t(I18nKey.SETTINGS$MCP_SERVER_TYPE_SHTTP) },\n ];\n\n const validateUrl = (url: string): string | null => {\n if (!url) return t(I18nKey.SETTINGS$MCP_ERROR_URL_REQUIRED);\n try {\n const urlObj = new URL(url);\n if (![\"http:\", \"https:\"].includes(urlObj.protocol)) {\n return t(I18nKey.SETTINGS$MCP_ERROR_URL_INVALID_PROTOCOL);\n }\n } catch {\n return t(I18nKey.SETTINGS$MCP_ERROR_URL_INVALID);\n }\n return null;\n };\n\n const validateName = (name: string): string | null => {\n if (!name) return t(I18nKey.SETTINGS$MCP_ERROR_NAME_REQUIRED);\n if (!/^[a-zA-Z0-9_-]+$/.test(name)) {\n return t(I18nKey.SETTINGS$MCP_ERROR_NAME_INVALID);\n }\n return null;\n };\n\n const validateNameUniqueness = (name: string): string | null => {\n if (!existingServers) return null;\n const shouldCheckUniqueness =\n mode === \"add\" || (mode === \"edit\" && server?.name !== name);\n if (!shouldCheckUniqueness) return null;\n\n const existingStdioNames = existingServers\n .filter((s) => s.type === \"stdio\")\n .map((s) => s.name)\n .filter(Boolean);\n if (existingStdioNames.includes(name)) {\n return t(I18nKey.SETTINGS$MCP_ERROR_NAME_DUPLICATE);\n }\n return null;\n };\n\n const validateCommand = (command: string): string | null => {\n if (!command) return t(I18nKey.SETTINGS$MCP_ERROR_COMMAND_REQUIRED);\n if (command.includes(\" \")) {\n return t(I18nKey.SETTINGS$MCP_ERROR_COMMAND_NO_SPACES);\n }\n return null;\n };\n\n const validateUrlUniqueness = (url: string): string | null => {\n if (!existingServers) return null;\n const originalUrl = server?.url;\n const changed = mode === \"add\" || (mode === \"edit\" && originalUrl !== url);\n if (!changed) return null;\n // For URL-based servers (sse/shttp), ensure URL is unique across both types\n const exists = existingServers.some(\n (s) => (s.type === \"sse\" || s.type === \"shttp\") && s.url === url,\n );\n if (exists) return t(I18nKey.SETTINGS$MCP_ERROR_URL_DUPLICATE);\n return null;\n };\n\n const validateEnvFormat = (envString: string): string | null => {\n if (!envString.trim()) return null;\n const lines = envString.split(\"\\n\");\n for (let i = 0; i < lines.length; i += 1) {\n const trimmed = lines[i].trim();\n if (trimmed) {\n const eq = trimmed.indexOf(\"=\");\n if (eq === -1) return t(I18nKey.SETTINGS$MCP_ERROR_ENV_INVALID_FORMAT);\n const key = trimmed.substring(0, eq).trim();\n if (!key) return t(I18nKey.SETTINGS$MCP_ERROR_ENV_INVALID_FORMAT);\n }\n }\n return null;\n };\n\n const validateTimeout = (timeoutStr: string): string | null => {\n if (!timeoutStr.trim()) return null; // Optional field\n\n const timeout = parseInt(timeoutStr.trim(), 10);\n if (Number.isNaN(timeout)) {\n return t(I18nKey.SETTINGS$MCP_ERROR_TIMEOUT_INVALID_NUMBER);\n }\n if (timeout <= 0) {\n return t(I18nKey.SETTINGS$MCP_ERROR_TIMEOUT_POSITIVE);\n }\n if (timeout > 3600) {\n return t(I18nKey.SETTINGS$MCP_ERROR_TIMEOUT_MAX_EXCEEDED);\n }\n return null;\n };\n\n const validateStdioServer = (formData: FormData): string | null => {\n const name = formData.get(\"name\")?.toString().trim() || \"\";\n const command = formData.get(\"command\")?.toString().trim() || \"\";\n const envString = formData.get(\"env\")?.toString() || \"\";\n\n const nameError = validateName(name);\n if (nameError) return nameError;\n\n const uniquenessError = validateNameUniqueness(name);\n if (uniquenessError) return uniquenessError;\n\n const commandError = validateCommand(command);\n if (commandError) return commandError;\n\n // Validate environment variable format\n const envError = validateEnvFormat(envString);\n if (envError) return envError;\n\n return null;\n };\n\n const validateForm = (formData: FormData): string | null => {\n if (serverType === \"sse\" || serverType === \"shttp\") {\n const url = formData.get(\"url\")?.toString().trim() || \"\";\n const urlError = validateUrl(url);\n if (urlError) return urlError;\n const urlDupError = validateUrlUniqueness(url);\n if (urlDupError) return urlDupError;\n\n // Validate timeout for SHTTP servers only\n if (serverType === \"shttp\") {\n const timeoutStr = formData.get(\"timeout\")?.toString() || \"\";\n const timeoutError = validateTimeout(timeoutStr);\n if (timeoutError) return timeoutError;\n }\n\n return null;\n }\n\n if (serverType === \"stdio\") {\n return validateStdioServer(formData);\n }\n\n return null;\n };\n\n const parseEnvironmentVariables = (\n envString: string,\n ): Record<string, string> => {\n const env: Record<string, string> = {};\n const input = envString.trim();\n if (!input) return env;\n\n for (const line of input.split(\"\\n\")) {\n const trimmed = line.trim();\n const eq = trimmed.indexOf(\"=\");\n const key = eq >= 0 ? trimmed.substring(0, eq).trim() : \"\";\n if (trimmed && eq !== -1 && key) {\n env[key] = trimmed.substring(eq + 1).trim();\n }\n }\n return env;\n };\n\n const formatEnvironmentVariables = (env?: Record<string, string>): string => {\n if (!env) return \"\";\n return Object.entries(env)\n .map(([key, value]) => `${key}=${value}`)\n .join(\"\\n\");\n };\n\n const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setError(null);\n\n const formData = new FormData(event.currentTarget);\n const validationError = validateForm(formData);\n\n if (validationError) {\n setError(validationError);\n return;\n }\n\n const baseConfig = {\n id: server?.id || `${serverType}-${Date.now()}`,\n type: serverType,\n };\n\n if (serverType === \"sse\" || serverType === \"shttp\") {\n const url = formData.get(\"url\")?.toString().trim();\n const apiKey = formData.get(\"api_key\")?.toString().trim();\n const timeoutStr = formData.get(\"timeout\")?.toString().trim();\n\n const serverConfig: MCPServerConfig = {\n ...baseConfig,\n url: url!,\n ...(apiKey && { api_key: apiKey }),\n };\n\n // Only add timeout for SHTTP servers\n if (serverType === \"shttp\" && timeoutStr) {\n const timeoutValue = parseInt(timeoutStr, 10);\n if (!Number.isNaN(timeoutValue)) {\n serverConfig.timeout = timeoutValue;\n }\n }\n\n onSubmit(serverConfig);\n } else if (serverType === \"stdio\") {\n const name = formData.get(\"name\")?.toString().trim();\n const command = formData.get(\"command\")?.toString().trim();\n const argsString = formData.get(\"args\")?.toString().trim();\n const envString = formData.get(\"env\")?.toString().trim();\n\n const args = argsString\n ? argsString\n .split(\"\\n\")\n .map((arg) => arg.trim())\n .filter(Boolean)\n : [];\n const env = parseEnvironmentVariables(envString || \"\");\n\n onSubmit({\n ...baseConfig,\n name: name!,\n command: command!,\n ...(args.length > 0 && { args }),\n ...(Object.keys(env).length > 0 && { env }),\n });\n }\n };\n\n const formTestId =\n mode === \"add\" ? \"add-mcp-server-form\" : \"edit-mcp-server-form\";\n\n return (\n <form\n data-testid={formTestId}\n onSubmit={handleSubmit}\n className=\"flex flex-col items-start gap-6\"\n >\n {mode === \"add\" && (\n <SettingsDropdownInput\n testId=\"server-type-dropdown\"\n name=\"server-type\"\n label={t(I18nKey.SETTINGS$MCP_SERVER_TYPE)}\n items={serverTypeOptions}\n selectedKey={serverType}\n onSelectionChange={(key) => setServerType(key as MCPServerType)}\n onInputChange={() => {}} // Prevent input changes\n isClearable={false}\n allowsCustomValue={false}\n required\n wrapperClassName=\"w-full min-w-0\"\n />\n )}\n\n {error && <p className=\"text-red-500 text-sm\">{error}</p>}\n\n {(serverType === \"sse\" || serverType === \"shttp\") && (\n <>\n <SettingsInput\n testId=\"url-input\"\n name=\"url\"\n type=\"url\"\n label={t(I18nKey.SETTINGS$MCP_URL)}\n className=\"w-full min-w-0\"\n required\n defaultValue={server?.url || \"\"}\n placeholder=\"https://api.example.com\"\n />\n\n <SettingsInput\n testId=\"api-key-input\"\n name=\"api_key\"\n type=\"password\"\n label={t(I18nKey.SETTINGS$MCP_API_KEY)}\n className=\"w-full min-w-0\"\n showOptionalTag\n defaultValue={server?.api_key || \"\"}\n placeholder={t(I18nKey.SETTINGS$MCP_API_KEY_PLACEHOLDER)}\n />\n\n {serverType === \"shttp\" && (\n <SettingsInput\n testId=\"timeout-input\"\n name=\"timeout\"\n type=\"number\"\n label={t(I18nKey.SETTINGS$MCP_TIMEOUT_LABEL)}\n className=\"w-full min-w-0\"\n showOptionalTag\n defaultValue={server?.timeout?.toString() || \"\"}\n placeholder=\"60\"\n min={1}\n max={3600}\n />\n )}\n </>\n )}\n\n {serverType === \"stdio\" && (\n <>\n <SettingsInput\n testId=\"name-input\"\n name=\"name\"\n type=\"text\"\n label={t(I18nKey.SETTINGS$MCP_NAME)}\n className=\"w-full min-w-0\"\n required\n defaultValue={server?.name || \"\"}\n placeholder=\"my-mcp-server\"\n pattern=\"^[a-zA-Z0-9_-]+$\"\n />\n\n <SettingsInput\n testId=\"command-input\"\n name=\"command\"\n type=\"text\"\n label={t(I18nKey.SETTINGS$MCP_COMMAND)}\n className=\"w-full min-w-0\"\n required\n defaultValue={server?.command || \"\"}\n placeholder=\"npx\"\n />\n\n <label className=\"flex flex-col gap-2.5 w-full min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">\n {t(I18nKey.SETTINGS$MCP_COMMAND_ARGUMENTS)}\n </span>\n <OptionalTag />\n </div>\n <textarea\n data-testid=\"args-input\"\n name=\"args\"\n rows={3}\n defaultValue={server?.args?.join(\"\\n\") || \"\"}\n placeholder=\"arg1 arg2 arg3\"\n className={cn(\n formControlMultilineFieldClassName,\n \"resize-none placeholder:italic\",\n \"disabled:bg-[var(--oh-surface-raised)] disabled:border-[var(--oh-border-subtle)]\",\n )}\n />\n <p className=\"text-xs text-tertiary-alt\">\n {t(I18nKey.SETTINGS$MCP_COMMAND_ARGUMENTS_HELP)}\n </p>\n </label>\n\n <label className=\"flex flex-col gap-2.5 w-full min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">\n {t(I18nKey.SETTINGS$MCP_ENVIRONMENT_VARIABLES)}\n </span>\n <OptionalTag />\n </div>\n <textarea\n data-testid=\"env-input\"\n name=\"env\"\n rows={4}\n defaultValue={formatEnvironmentVariables(server?.env)}\n placeholder=\"KEY1=value1 KEY2=value2\"\n className={cn(\n formControlMultilineFieldClassName,\n \"resize-none placeholder:italic\",\n \"disabled:bg-[var(--oh-surface-raised)] disabled:border-[var(--oh-border-subtle)]\",\n )}\n />\n </label>\n </>\n )}\n\n <div\n className={cn(\n \"flex w-full items-center gap-2\",\n onDelete ? \"justify-between\" : \"justify-end\",\n )}\n >\n {onDelete ? (\n <BrandButton\n testId=\"mcp-custom-editor-delete\"\n type=\"button\"\n variant=\"secondary\"\n onClick={onDelete}\n isDisabled={isActionDisabled}\n startContent={\n <Trash2 aria-hidden className=\"size-4\" strokeWidth={2} />\n }\n >\n {t(I18nKey.BUTTON$DELETE)}\n </BrandButton>\n ) : null}\n <div className=\"flex items-center gap-2\">\n <BrandButton\n testId=\"cancel-button\"\n type=\"button\"\n variant=\"secondary\"\n onClick={onCancel}\n isDisabled={isActionDisabled}\n >\n {t(I18nKey.BUTTON$CANCEL)}\n </BrandButton>\n <BrandButton\n testId=\"submit-button\"\n type=\"submit\"\n variant=\"primary\"\n isDisabled={isActionDisabled}\n >\n {mode === \"add\" && t(I18nKey.SETTINGS$MCP_ADD_SERVER)}\n {mode === \"edit\" && t(I18nKey.SETTINGS$MCP_SAVE_SERVER)}\n </BrandButton>\n </div>\n </div>\n </form>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mcp-server-form.js","names":[],"sources":["../../../../../src/components/features/settings/mcp-settings/mcp-server-form.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Trash2 } from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { SettingsInput } from \"../settings-input\";\nimport { SettingsDropdownInput } from \"../settings-dropdown-input\";\nimport { BrandButton } from \"../brand-button\";\nimport { OptionalTag } from \"../optional-tag\";\nimport { cn } from \"#/utils/utils\";\nimport { formControlMultilineFieldClassName } from \"#/utils/form-control-classes\";\nimport type { MCPServerConfig } from \"#/types/mcp-server\";\n\ntype MCPServerType = \"sse\" | \"stdio\" | \"shttp\";\n\nexport interface TestMessage {\n ok: boolean;\n text: string;\n}\n\ninterface MCPServerFormProps {\n mode: \"add\" | \"edit\";\n server?: MCPServerConfig;\n existingServers?: MCPServerConfig[];\n onSubmit: (server: MCPServerConfig) => void;\n onCancel: () => void;\n onDelete?: () => void;\n isActionDisabled?: boolean;\n onTest?: (server: MCPServerConfig) => void;\n isTestPending?: boolean;\n testMessage?: TestMessage | null;\n}\n\nexport function MCPServerForm({\n mode,\n server,\n existingServers,\n onSubmit,\n onCancel,\n onDelete,\n isActionDisabled = false,\n onTest,\n isTestPending = false,\n testMessage = null,\n}: MCPServerFormProps) {\n const { t } = useTranslation(\"openhands\");\n const [serverType, setServerType] = React.useState<MCPServerType>(\n server?.type || \"sse\",\n );\n const [error, setError] = React.useState<string | null>(null);\n const formRef = React.useRef<HTMLFormElement>(null);\n\n const serverTypeOptions = [\n { key: \"sse\", label: t(I18nKey.SETTINGS$MCP_SERVER_TYPE_SSE) },\n { key: \"stdio\", label: t(I18nKey.SETTINGS$MCP_SERVER_TYPE_STDIO) },\n { key: \"shttp\", label: t(I18nKey.SETTINGS$MCP_SERVER_TYPE_SHTTP) },\n ];\n\n const validateUrl = (url: string): string | null => {\n if (!url) return t(I18nKey.SETTINGS$MCP_ERROR_URL_REQUIRED);\n try {\n const urlObj = new URL(url);\n if (![\"http:\", \"https:\"].includes(urlObj.protocol)) {\n return t(I18nKey.SETTINGS$MCP_ERROR_URL_INVALID_PROTOCOL);\n }\n } catch {\n return t(I18nKey.SETTINGS$MCP_ERROR_URL_INVALID);\n }\n return null;\n };\n\n const validateName = (name: string): string | null => {\n if (!name) return t(I18nKey.SETTINGS$MCP_ERROR_NAME_REQUIRED);\n if (!/^[a-zA-Z0-9_-]+$/.test(name)) {\n return t(I18nKey.SETTINGS$MCP_ERROR_NAME_INVALID);\n }\n return null;\n };\n\n const validateNameUniqueness = (name: string): string | null => {\n if (!existingServers) return null;\n const shouldCheckUniqueness =\n mode === \"add\" || (mode === \"edit\" && server?.name !== name);\n if (!shouldCheckUniqueness) return null;\n\n const existingStdioNames = existingServers\n .filter((s) => s.type === \"stdio\")\n .map((s) => s.name)\n .filter(Boolean);\n if (existingStdioNames.includes(name)) {\n return t(I18nKey.SETTINGS$MCP_ERROR_NAME_DUPLICATE);\n }\n return null;\n };\n\n const validateCommand = (command: string): string | null => {\n if (!command) return t(I18nKey.SETTINGS$MCP_ERROR_COMMAND_REQUIRED);\n if (command.includes(\" \")) {\n return t(I18nKey.SETTINGS$MCP_ERROR_COMMAND_NO_SPACES);\n }\n return null;\n };\n\n const validateUrlUniqueness = (url: string): string | null => {\n if (!existingServers) return null;\n const originalUrl = server?.url;\n const changed = mode === \"add\" || (mode === \"edit\" && originalUrl !== url);\n if (!changed) return null;\n // For URL-based servers (sse/shttp), ensure URL is unique across both types\n const exists = existingServers.some(\n (s) => (s.type === \"sse\" || s.type === \"shttp\") && s.url === url,\n );\n if (exists) return t(I18nKey.SETTINGS$MCP_ERROR_URL_DUPLICATE);\n return null;\n };\n\n const validateEnvFormat = (envString: string): string | null => {\n if (!envString.trim()) return null;\n const lines = envString.split(\"\\n\");\n for (let i = 0; i < lines.length; i += 1) {\n const trimmed = lines[i].trim();\n if (trimmed) {\n const eq = trimmed.indexOf(\"=\");\n if (eq === -1) return t(I18nKey.SETTINGS$MCP_ERROR_ENV_INVALID_FORMAT);\n const key = trimmed.substring(0, eq).trim();\n if (!key) return t(I18nKey.SETTINGS$MCP_ERROR_ENV_INVALID_FORMAT);\n }\n }\n return null;\n };\n\n const validateTimeout = (timeoutStr: string): string | null => {\n if (!timeoutStr.trim()) return null; // Optional field\n\n const timeout = parseInt(timeoutStr.trim(), 10);\n if (Number.isNaN(timeout)) {\n return t(I18nKey.SETTINGS$MCP_ERROR_TIMEOUT_INVALID_NUMBER);\n }\n if (timeout <= 0) {\n return t(I18nKey.SETTINGS$MCP_ERROR_TIMEOUT_POSITIVE);\n }\n if (timeout > 3600) {\n return t(I18nKey.SETTINGS$MCP_ERROR_TIMEOUT_MAX_EXCEEDED);\n }\n return null;\n };\n\n const validateStdioServer = (formData: FormData): string | null => {\n const name = formData.get(\"name\")?.toString().trim() || \"\";\n const command = formData.get(\"command\")?.toString().trim() || \"\";\n const envString = formData.get(\"env\")?.toString() || \"\";\n\n const nameError = validateName(name);\n if (nameError) return nameError;\n\n const uniquenessError = validateNameUniqueness(name);\n if (uniquenessError) return uniquenessError;\n\n const commandError = validateCommand(command);\n if (commandError) return commandError;\n\n // Validate environment variable format\n const envError = validateEnvFormat(envString);\n if (envError) return envError;\n\n return null;\n };\n\n const validateForm = (formData: FormData): string | null => {\n if (serverType === \"sse\" || serverType === \"shttp\") {\n const url = formData.get(\"url\")?.toString().trim() || \"\";\n const urlError = validateUrl(url);\n if (urlError) return urlError;\n const urlDupError = validateUrlUniqueness(url);\n if (urlDupError) return urlDupError;\n\n // Validate timeout for SHTTP servers only\n if (serverType === \"shttp\") {\n const timeoutStr = formData.get(\"timeout\")?.toString() || \"\";\n const timeoutError = validateTimeout(timeoutStr);\n if (timeoutError) return timeoutError;\n }\n\n return null;\n }\n\n if (serverType === \"stdio\") {\n return validateStdioServer(formData);\n }\n\n return null;\n };\n\n const parseEnvironmentVariables = (\n envString: string,\n ): Record<string, string> => {\n const env: Record<string, string> = {};\n const input = envString.trim();\n if (!input) return env;\n\n for (const line of input.split(\"\\n\")) {\n const trimmed = line.trim();\n const eq = trimmed.indexOf(\"=\");\n const key = eq >= 0 ? trimmed.substring(0, eq).trim() : \"\";\n if (trimmed && eq !== -1 && key) {\n env[key] = trimmed.substring(eq + 1).trim();\n }\n }\n return env;\n };\n\n const formatEnvironmentVariables = (env?: Record<string, string>): string => {\n if (!env) return \"\";\n return Object.entries(env)\n .map(([key, value]) => `${key}=${value}`)\n .join(\"\\n\");\n };\n\n const buildConfig = (formData: FormData): MCPServerConfig => {\n const baseConfig = {\n id: server?.id || `${serverType}-${Date.now()}`,\n type: serverType,\n };\n\n if (serverType === \"sse\" || serverType === \"shttp\") {\n const url = formData.get(\"url\")?.toString().trim();\n const apiKey = formData.get(\"api_key\")?.toString().trim();\n const timeoutStr = formData.get(\"timeout\")?.toString().trim();\n\n const serverConfig: MCPServerConfig = {\n ...baseConfig,\n url: url!,\n ...(apiKey && { api_key: apiKey }),\n };\n\n // Only add timeout for SHTTP servers\n if (serverType === \"shttp\" && timeoutStr) {\n const timeoutValue = parseInt(timeoutStr, 10);\n if (!Number.isNaN(timeoutValue)) {\n serverConfig.timeout = timeoutValue;\n }\n }\n\n return serverConfig;\n }\n\n // stdio\n const name = formData.get(\"name\")?.toString().trim();\n const command = formData.get(\"command\")?.toString().trim();\n const argsString = formData.get(\"args\")?.toString().trim();\n const envString = formData.get(\"env\")?.toString().trim();\n\n const args = argsString\n ? argsString\n .split(\"\\n\")\n .map((arg) => arg.trim())\n .filter(Boolean)\n : [];\n const env = parseEnvironmentVariables(envString || \"\");\n\n return {\n ...baseConfig,\n name: name!,\n command: command!,\n ...(args.length > 0 && { args }),\n ...(Object.keys(env).length > 0 && { env }),\n };\n };\n\n const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setError(null);\n\n const formData = new FormData(event.currentTarget);\n const validationError = validateForm(formData);\n\n if (validationError) {\n setError(validationError);\n return;\n }\n\n onSubmit(buildConfig(formData));\n };\n\n const handleTestClick = () => {\n if (!onTest || !formRef.current) return;\n setError(null);\n const formData = new FormData(formRef.current);\n const validationError = validateForm(formData);\n if (validationError) {\n setError(validationError);\n return;\n }\n onTest(buildConfig(formData));\n };\n\n const formTestId =\n mode === \"add\" ? \"add-mcp-server-form\" : \"edit-mcp-server-form\";\n\n return (\n <form\n ref={formRef}\n data-testid={formTestId}\n onSubmit={handleSubmit}\n className=\"flex flex-col items-start gap-6\"\n >\n {mode === \"add\" && (\n <SettingsDropdownInput\n testId=\"server-type-dropdown\"\n name=\"server-type\"\n label={t(I18nKey.SETTINGS$MCP_SERVER_TYPE)}\n items={serverTypeOptions}\n selectedKey={serverType}\n onSelectionChange={(key) => setServerType(key as MCPServerType)}\n onInputChange={() => {}} // Prevent input changes\n isClearable={false}\n allowsCustomValue={false}\n required\n wrapperClassName=\"w-full min-w-0\"\n />\n )}\n\n {error && <p className=\"text-red-500 text-sm\">{error}</p>}\n\n {(serverType === \"sse\" || serverType === \"shttp\") && (\n <>\n <SettingsInput\n testId=\"url-input\"\n name=\"url\"\n type=\"url\"\n label={t(I18nKey.SETTINGS$MCP_URL)}\n className=\"w-full min-w-0\"\n required\n defaultValue={server?.url || \"\"}\n placeholder=\"https://api.example.com\"\n />\n\n <SettingsInput\n testId=\"api-key-input\"\n name=\"api_key\"\n type=\"password\"\n label={t(I18nKey.SETTINGS$MCP_API_KEY)}\n className=\"w-full min-w-0\"\n showOptionalTag\n defaultValue={server?.api_key || \"\"}\n placeholder={t(I18nKey.SETTINGS$MCP_API_KEY_PLACEHOLDER)}\n />\n\n {serverType === \"shttp\" && (\n <SettingsInput\n testId=\"timeout-input\"\n name=\"timeout\"\n type=\"number\"\n label={t(I18nKey.SETTINGS$MCP_TIMEOUT_LABEL)}\n className=\"w-full min-w-0\"\n showOptionalTag\n defaultValue={server?.timeout?.toString() || \"\"}\n placeholder=\"60\"\n min={1}\n max={3600}\n />\n )}\n </>\n )}\n\n {serverType === \"stdio\" && (\n <>\n <SettingsInput\n testId=\"name-input\"\n name=\"name\"\n type=\"text\"\n label={t(I18nKey.SETTINGS$MCP_NAME)}\n className=\"w-full min-w-0\"\n required\n defaultValue={server?.name || \"\"}\n placeholder=\"my-mcp-server\"\n pattern=\"^[a-zA-Z0-9_-]+$\"\n />\n\n <SettingsInput\n testId=\"command-input\"\n name=\"command\"\n type=\"text\"\n label={t(I18nKey.SETTINGS$MCP_COMMAND)}\n className=\"w-full min-w-0\"\n required\n defaultValue={server?.command || \"\"}\n placeholder=\"npx\"\n />\n\n <label className=\"flex flex-col gap-2.5 w-full min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">\n {t(I18nKey.SETTINGS$MCP_COMMAND_ARGUMENTS)}\n </span>\n <OptionalTag />\n </div>\n <textarea\n data-testid=\"args-input\"\n name=\"args\"\n rows={3}\n defaultValue={server?.args?.join(\"\\n\") || \"\"}\n placeholder=\"arg1 arg2 arg3\"\n className={cn(\n formControlMultilineFieldClassName,\n \"resize-none placeholder:italic\",\n \"disabled:bg-[var(--oh-surface-raised)] disabled:border-[var(--oh-border-subtle)]\",\n )}\n />\n <p className=\"text-xs text-tertiary-alt\">\n {t(I18nKey.SETTINGS$MCP_COMMAND_ARGUMENTS_HELP)}\n </p>\n </label>\n\n <label className=\"flex flex-col gap-2.5 w-full min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">\n {t(I18nKey.SETTINGS$MCP_ENVIRONMENT_VARIABLES)}\n </span>\n <OptionalTag />\n </div>\n <textarea\n data-testid=\"env-input\"\n name=\"env\"\n rows={4}\n defaultValue={formatEnvironmentVariables(server?.env)}\n placeholder=\"KEY1=value1 KEY2=value2\"\n className={cn(\n formControlMultilineFieldClassName,\n \"resize-none placeholder:italic\",\n \"disabled:bg-[var(--oh-surface-raised)] disabled:border-[var(--oh-border-subtle)]\",\n )}\n />\n </label>\n </>\n )}\n\n {testMessage && (\n <p\n data-testid=\"mcp-test-message\"\n className={\n testMessage.ok\n ? \"text-sm text-green-500 whitespace-pre-wrap\"\n : \"text-sm text-red-500 whitespace-pre-wrap\"\n }\n >\n {testMessage.text}\n </p>\n )}\n\n <div\n className={cn(\n \"flex w-full items-center gap-2\",\n onDelete ? \"justify-between\" : \"justify-end\",\n )}\n >\n {onDelete ? (\n <BrandButton\n testId=\"mcp-custom-editor-delete\"\n type=\"button\"\n variant=\"secondary\"\n onClick={onDelete}\n isDisabled={isActionDisabled}\n startContent={\n <Trash2 aria-hidden className=\"size-4\" strokeWidth={2} />\n }\n >\n {t(I18nKey.BUTTON$DELETE)}\n </BrandButton>\n ) : null}\n <div className=\"flex items-center gap-2\">\n <BrandButton\n testId=\"cancel-button\"\n type=\"button\"\n variant=\"secondary\"\n onClick={onCancel}\n isDisabled={isActionDisabled}\n >\n {t(I18nKey.BUTTON$CANCEL)}\n </BrandButton>\n {onTest && (\n <BrandButton\n testId=\"mcp-test-connection\"\n type=\"button\"\n variant=\"secondary\"\n onClick={handleTestClick}\n isDisabled={isActionDisabled || isTestPending}\n >\n {isTestPending\n ? t(I18nKey.MCP$VERIFYING)\n : t(I18nKey.MCP$TEST_BUTTON)}\n </BrandButton>\n )}\n <BrandButton\n testId=\"submit-button\"\n type=\"submit\"\n variant=\"primary\"\n isDisabled={isActionDisabled || isTestPending}\n >\n {mode === \"add\" && t(I18nKey.SETTINGS$MCP_ADD_SERVER)}\n {mode === \"edit\" && t(I18nKey.SETTINGS$MCP_SAVE_SERVER)}\n </BrandButton>\n </div>\n </div>\n </form>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../hooks/use-scroll-to-bottom.cjs`);let n=require(`react`);n=e.__toESM(n,1);let r=require(`react/jsx-runtime`);var i=(0,n.createContext)(void 0);function a({children:e,value:a}){let o=t.useScrollToBottom(n.default.useRef(null)),s=a||o;return(0,r.jsx)(i.Provider,{value:s,children:e})}function o(){let e=(0,n.useContext)(i);if(e===void 0)throw Error(`useScrollContext must be used within a ScrollProvider`);return e}exports.ScrollProvider=a,exports.useScrollContext=o;
|
|
1
|
+
const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../hooks/use-scroll-to-bottom.cjs`);let n=require(`react`);n=e.__toESM(n,1);let r=require(`react/jsx-runtime`);var i=(0,n.createContext)(void 0);function a({children:e,value:a}){let o=t.useScrollToBottom(n.default.useRef(null)),s=a||o;return(0,r.jsx)(i.Provider,{value:s,children:e})}function o(){let e=(0,n.useContext)(i);if(e===void 0)throw Error(`useScrollContext must be used within a ScrollProvider`);return e}function s(){return(0,n.useContext)(i)}exports.ScrollProvider=a,exports.useOptionalScrollContext=s,exports.useScrollContext=o;
|
|
2
2
|
//# sourceMappingURL=scroll-context.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-context.cjs","names":[],"sources":["../../src/context/scroll-context.tsx"],"sourcesContent":["import React, { createContext, useContext, ReactNode, RefObject } from \"react\";\nimport { useScrollToBottom } from \"#/hooks/use-scroll-to-bottom\";\n\ninterface ScrollContextType {\n scrollRef: RefObject<HTMLDivElement | null>;\n autoScroll: boolean;\n setAutoScroll: (value: boolean) => void;\n scrollDomToBottom: () => void;\n hitBottom: boolean;\n setHitBottom: (value: boolean) => void;\n onChatBodyScroll: (e: HTMLElement) => void;\n}\n\nexport const ScrollContext = createContext<ScrollContextType | undefined>(\n undefined,\n);\n\ninterface ScrollProviderProps {\n children: ReactNode;\n value?: ScrollContextType;\n}\n\nexport function ScrollProvider({ children, value }: ScrollProviderProps) {\n const scrollHook = useScrollToBottom(React.useRef<HTMLDivElement>(null));\n\n // Use provided value or default to the hook\n const contextValue = value || scrollHook;\n\n return (\n <ScrollContext.Provider value={contextValue}>\n {children}\n </ScrollContext.Provider>\n );\n}\n\nexport function useScrollContext() {\n const context = useContext(ScrollContext);\n if (context === undefined) {\n throw new Error(\"useScrollContext must be used within a ScrollProvider\");\n }\n return context;\n}\n"],"mappings":"+KAaA,IAAa,GAAA,EAAA,EAAA,eACX,IAAA,GACD,CAOD,SAAgB,EAAe,CAAE,WAAU,SAA8B,CACvE,IAAM,EAAa,EAAA,kBAAkB,EAAA,QAAM,OAAuB,KAAK,CAAC,CAGlE,EAAe,GAAS,EAE9B,OACE,EAAA,EAAA,KAAC,EAAc,SAAf,CAAwB,MAAO,EAC5B,WACsB,CAAA,CAI7B,SAAgB,GAAmB,CACjC,IAAM,GAAA,EAAA,EAAA,YAAqB,EAAc,CACzC,GAAI,IAAY,IAAA,GACd,MAAU,MAAM,wDAAwD,CAE1E,OAAO"}
|
|
1
|
+
{"version":3,"file":"scroll-context.cjs","names":[],"sources":["../../src/context/scroll-context.tsx"],"sourcesContent":["import React, { createContext, useContext, ReactNode, RefObject } from \"react\";\nimport { useScrollToBottom } from \"#/hooks/use-scroll-to-bottom\";\n\ninterface ScrollContextType {\n scrollRef: RefObject<HTMLDivElement | null>;\n autoScroll: boolean;\n setAutoScroll: (value: boolean) => void;\n scrollDomToBottom: () => void;\n hitBottom: boolean;\n setHitBottom: (value: boolean) => void;\n onChatBodyScroll: (e: HTMLElement) => void;\n}\n\nexport const ScrollContext = createContext<ScrollContextType | undefined>(\n undefined,\n);\n\ninterface ScrollProviderProps {\n children: ReactNode;\n value?: ScrollContextType;\n}\n\nexport function ScrollProvider({ children, value }: ScrollProviderProps) {\n const scrollHook = useScrollToBottom(React.useRef<HTMLDivElement>(null));\n\n // Use provided value or default to the hook\n const contextValue = value || scrollHook;\n\n return (\n <ScrollContext.Provider value={contextValue}>\n {children}\n </ScrollContext.Provider>\n );\n}\n\nexport function useScrollContext() {\n const context = useContext(ScrollContext);\n if (context === undefined) {\n throw new Error(\"useScrollContext must be used within a ScrollProvider\");\n }\n return context;\n}\n\n// Same as useScrollContext but returns undefined when no provider is mounted.\n// Use this in components that have valid render paths both inside and outside\n// the chat's ScrollProvider (e.g. GitControlBar in production vs. isolated\n// test mounts).\nexport function useOptionalScrollContext() {\n return useContext(ScrollContext);\n}\n"],"mappings":"+KAaA,IAAa,GAAA,EAAA,EAAA,eACX,IAAA,GACD,CAOD,SAAgB,EAAe,CAAE,WAAU,SAA8B,CACvE,IAAM,EAAa,EAAA,kBAAkB,EAAA,QAAM,OAAuB,KAAK,CAAC,CAGlE,EAAe,GAAS,EAE9B,OACE,EAAA,EAAA,KAAC,EAAc,SAAf,CAAwB,MAAO,EAC5B,WACsB,CAAA,CAI7B,SAAgB,GAAmB,CACjC,IAAM,GAAA,EAAA,EAAA,YAAqB,EAAc,CACzC,GAAI,IAAY,IAAA,GACd,MAAU,MAAM,wDAAwD,CAE1E,OAAO,EAOT,SAAgB,GAA2B,CACzC,OAAA,EAAA,EAAA,YAAkB,EAAc"}
|
|
@@ -15,4 +15,5 @@ interface ScrollProviderProps {
|
|
|
15
15
|
}
|
|
16
16
|
export declare function ScrollProvider({ children, value }: ScrollProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
17
17
|
export declare function useScrollContext(): ScrollContextType;
|
|
18
|
+
export declare function useOptionalScrollContext(): ScrollContextType | undefined;
|
|
18
19
|
export {};
|
|
@@ -15,7 +15,10 @@ function s() {
|
|
|
15
15
|
if (e === void 0) throw Error("useScrollContext must be used within a ScrollProvider");
|
|
16
16
|
return e;
|
|
17
17
|
}
|
|
18
|
+
function c() {
|
|
19
|
+
return r(a);
|
|
20
|
+
}
|
|
18
21
|
//#endregion
|
|
19
|
-
export { o as ScrollProvider, s as useScrollContext };
|
|
22
|
+
export { o as ScrollProvider, c as useOptionalScrollContext, s as useScrollContext };
|
|
20
23
|
|
|
21
24
|
//# sourceMappingURL=scroll-context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-context.js","names":[],"sources":["../../src/context/scroll-context.tsx"],"sourcesContent":["import React, { createContext, useContext, ReactNode, RefObject } from \"react\";\nimport { useScrollToBottom } from \"#/hooks/use-scroll-to-bottom\";\n\ninterface ScrollContextType {\n scrollRef: RefObject<HTMLDivElement | null>;\n autoScroll: boolean;\n setAutoScroll: (value: boolean) => void;\n scrollDomToBottom: () => void;\n hitBottom: boolean;\n setHitBottom: (value: boolean) => void;\n onChatBodyScroll: (e: HTMLElement) => void;\n}\n\nexport const ScrollContext = createContext<ScrollContextType | undefined>(\n undefined,\n);\n\ninterface ScrollProviderProps {\n children: ReactNode;\n value?: ScrollContextType;\n}\n\nexport function ScrollProvider({ children, value }: ScrollProviderProps) {\n const scrollHook = useScrollToBottom(React.useRef<HTMLDivElement>(null));\n\n // Use provided value or default to the hook\n const contextValue = value || scrollHook;\n\n return (\n <ScrollContext.Provider value={contextValue}>\n {children}\n </ScrollContext.Provider>\n );\n}\n\nexport function useScrollContext() {\n const context = useContext(ScrollContext);\n if (context === undefined) {\n throw new Error(\"useScrollContext must be used within a ScrollProvider\");\n }\n return context;\n}\n"],"mappings":";;;;AAaA,IAAa,IAAgB,EAC3B,KAAA,EACD;AAOD,SAAgB,EAAe,EAAE,aAAU,YAA8B;CACvE,IAAM,IAAa,EAAkB,EAAM,OAAuB,KAAK,CAAC,EAGlE,IAAe,KAAS;AAE9B,QACE,kBAAC,EAAc,UAAf;EAAwB,OAAO;EAC5B;EACsB,CAAA;;AAI7B,SAAgB,IAAmB;CACjC,IAAM,IAAU,EAAW,EAAc;AACzC,KAAI,MAAY,KAAA,EACd,OAAU,MAAM,wDAAwD;AAE1E,QAAO"}
|
|
1
|
+
{"version":3,"file":"scroll-context.js","names":[],"sources":["../../src/context/scroll-context.tsx"],"sourcesContent":["import React, { createContext, useContext, ReactNode, RefObject } from \"react\";\nimport { useScrollToBottom } from \"#/hooks/use-scroll-to-bottom\";\n\ninterface ScrollContextType {\n scrollRef: RefObject<HTMLDivElement | null>;\n autoScroll: boolean;\n setAutoScroll: (value: boolean) => void;\n scrollDomToBottom: () => void;\n hitBottom: boolean;\n setHitBottom: (value: boolean) => void;\n onChatBodyScroll: (e: HTMLElement) => void;\n}\n\nexport const ScrollContext = createContext<ScrollContextType | undefined>(\n undefined,\n);\n\ninterface ScrollProviderProps {\n children: ReactNode;\n value?: ScrollContextType;\n}\n\nexport function ScrollProvider({ children, value }: ScrollProviderProps) {\n const scrollHook = useScrollToBottom(React.useRef<HTMLDivElement>(null));\n\n // Use provided value or default to the hook\n const contextValue = value || scrollHook;\n\n return (\n <ScrollContext.Provider value={contextValue}>\n {children}\n </ScrollContext.Provider>\n );\n}\n\nexport function useScrollContext() {\n const context = useContext(ScrollContext);\n if (context === undefined) {\n throw new Error(\"useScrollContext must be used within a ScrollProvider\");\n }\n return context;\n}\n\n// Same as useScrollContext but returns undefined when no provider is mounted.\n// Use this in components that have valid render paths both inside and outside\n// the chat's ScrollProvider (e.g. GitControlBar in production vs. isolated\n// test mounts).\nexport function useOptionalScrollContext() {\n return useContext(ScrollContext);\n}\n"],"mappings":";;;;AAaA,IAAa,IAAgB,EAC3B,KAAA,EACD;AAOD,SAAgB,EAAe,EAAE,aAAU,YAA8B;CACvE,IAAM,IAAa,EAAkB,EAAM,OAAuB,KAAK,CAAC,EAGlE,IAAe,KAAS;AAE9B,QACE,kBAAC,EAAc,UAAf;EAAwB,OAAO;EAC5B;EACsB,CAAA;;AAI7B,SAAgB,IAAmB;CACjC,IAAM,IAAU,EAAW,EAAc;AACzC,KAAI,MAAY,KAAA,EACd,OAAU,MAAM,wDAAwD;AAE1E,QAAO;;AAOT,SAAgB,IAA2B;AACzC,QAAO,EAAW,EAAc"}
|
package/dist/favicon.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?> <svg id="App_Icon_Shape" data-name="App Icon Shape" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1024 1024"> <defs> <style> .cls-1 { fill: url(#linear-gradient); } .cls-2 { fill: #fff; } </style> <linearGradient id="linear-gradient" x1="512" y1="464.77" x2="512" y2="-1109.83" gradientUnits="userSpaceOnUse"> <stop offset="0" stop-color="#000"/> <stop offset="1" stop-color="#fff"/> </linearGradient> </defs> <path class="cls-1" d="M1024,651c0,14.24,0,28.48-.08,42.73-.07,12-.21,23.99-.53,35.98-.71,26.13-2.25,52.49-6.89,78.34-4.71,26.22-12.4,50.62-24.53,74.44-11.92,23.41-27.49,44.84-46.07,63.41-18.58,18.58-40,34.15-63.41,46.07-23.82,12.12-48.22,19.82-74.44,24.53-25.84,4.65-52.2,6.18-78.34,6.89-11.99.33-23.99.46-35.98.53-14.24.09-28.48.08-42.73.08h-278c-14.24,0-28.48,0-42.73-.08-12-.07-23.99-.21-35.98-.53-26.13-.71-52.49-2.25-78.34-6.89-26.22-4.71-50.62-12.4-74.44-24.53-23.41-11.92-44.84-27.49-63.41-46.07-18.58-18.58-34.15-40-46.07-63.41-12.12-23.82-19.82-48.22-24.53-74.44-4.65-25.84-6.18-52.2-6.89-78.34-.33-11.99-.46-23.99-.53-35.98C0,679.48,0,665.24,0,651v-278C0,358.76,0,344.52.08,330.27c.07-12,.21-23.99.53-35.98.71-26.13,2.25-52.49,6.89-78.34,4.71-26.22,12.4-50.62,24.53-74.44,11.92-23.41,27.49-44.84,46.07-63.41,18.58-18.58,40-34.15,63.41-46.07,23.82-12.12,48.22-19.82,74.44-24.53,25.84-4.65,52.2-6.18,78.34-6.89,11.99-.33,23.99-.46,35.98-.53C344.52,0,358.76,0,373,0h278c14.24,0,28.48,0,42.73.08,12,.07,23.99.21,35.98.53,26.13.71,52.49,2.25,78.34,6.89,26.22,4.71,50.62,12.4,74.44,24.53,23.41,11.92,44.84,27.49,63.41,46.07,18.58,18.58,34.15,40,46.07,63.41,12.12,23.82,19.82,48.22,24.53,74.44,4.65,25.84,6.18,52.2,6.89,78.34.33,11.99.46,23.99.53,35.98.09,14.24.08,28.48.08,42.73v278Z"/> <g> <path class="cls-2" d="M500.73,326.03v-73.61c0-6.1,4.95-11.04,11.04-11.04s11.04,4.94,11.04,11.04v73.61c0,6.1-4.94,11.04-11.04,11.04s-11.04-4.94-11.04-11.04Z"/> <path class="cls-2" d="M557.82,337l36.8-63.75c3.05-5.28,9.8-7.09,15.08-4.04,5.28,3.05,7.09,9.8,4.04,15.08l-36.8,63.75c-3.05,5.28-9.8,7.09-15.08,4.04-5.28-3.05-7.09-9.8-4.04-15.08Z"/> <path class="cls-2" d="M465.72,337l-36.8-63.75c-3.05-5.28-9.8-7.09-15.08-4.04-5.28,3.05-7.09,9.8-4.04,15.08l36.8,63.75c3.05,5.28,9.8,7.09,15.08,4.04,5.28-3.05,7.09-9.8,4.04-15.08Z"/> <path class="cls-2" d="M865.63,565.4c0-19.19,5.18-76.08,6.8-94.85,1.1-12.69-.43-19.65-2.47-23.2-1.5-2.61-3.84-4.45-9.49-4.83-4.08-.27-8.52.89-11.83,3.88-3.11,2.8-6.58,8.44-6.58,19.83l-.02.64-5.07,86.49c-.18,3.11-1.67,6.01-4.1,7.96-2.43,1.95-5.56,2.79-8.64,2.3l-53.15-8.41-57.32-7.61c-5.29-.7-9.33-5.1-9.57-10.43l-3.16-68.35-.03-.58c-1.41-27.21-2.75-52.04-2.75-59.72,0-21.42-3.63-30.46-6.79-34.26-2.53-3.03-6.16-4.36-13.94-4.36-2.79,0-4.76.57-6.24,1.44-1.45.85-3.11,2.37-4.69,5.35-3.39,6.39-5.85,18.39-4.93,39.36,1.19,27.2,3.04,47.52,4.86,65.84,1.81,18.29,3.62,34.9,4.63,54.19,1.57,30.21,1.43,51.03.2,65.16-.62,7.06-1.53,12.76-2.77,17.27-1.17,4.27-2.93,8.62-5.97,11.86-3.69,3.93-8.95,5.81-14.41,4.49-4.33-1.04-7.38-3.79-9.04-5.54-3.48-3.66-5.94-8.38-6.9-10.81-5.61-14.15-22.96-47.01-46.46-65.56-6.85-5.41-11.85-6.97-14.99-7.21-2.96-.22-5.11.65-6.8,1.99-1.86,1.48-3.25,3.63-3.94,5.66-.24.72-.35,1.23-.39,1.56,6.37,10.75,31.63,50.16,43.54,90.15,8.88,29.81,30.28,60.19,46.27,73.2,15.48,12.6,43.29,20.41,74.62,21.95,31.04,1.52,63-3.23,85.5-13.32,43.46-19.48,52.31-62.38,56.27-80.98,3.08-14.43,3.14-29.84,2.31-44.14-.41-7.13-1.02-13.8-1.56-19.95-.52-5.97-.99-11.74-.99-16.47ZM761.65,380.26c0-6.7-1.79-12.67-4.75-16.66-2.68-3.61-6.62-6.11-12.95-6.11-5.18,0-8.67.64-11.13,1.69-2.2.94-4.05,2.4-5.74,5.12-3.88,6.27-6.74,18.88-6.75,43.99l2.75,59.45c1.03,19.83,2.1,41.32,2.8,59.19l35.77,4.75v-151.42ZM783.73,534.86l31.9,5.05,4.35-73.94v-57.02c0-7.83-3.19-12.62-6.96-15.68-4.21-3.42-9.12-4.64-11.44-4.64-4.22,0-8.59.66-11.73,2.89-2.42,1.72-6.11,5.78-6.11,17.44v125.91ZM842.06,424.42c6.61-3.29,13.68-4.34,19.89-3.93,11.26.75,21.19,5.47,27.16,15.85,5.42,9.44,6.55,21.92,5.32,36.12-1.7,19.62-6.73,75.01-6.73,92.94,0,3.6.38,8.39.91,14.56.52,6,1.17,13.05,1.61,20.59.87,15.04.93,32.74-2.76,50.02-3.84,18-14.24,72.04-68.84,96.52-26.54,11.89-62.2,16.87-95.62,15.23-33.13-1.63-66.61-9.88-87.49-26.88-19.65-16-43.43-50.25-53.49-84.02-11.36-38.14-35.96-75.76-42.1-86.42-3.62-6.28-2.48-13.73-.8-18.7,1.9-5.6,5.58-11.46,11.12-15.86,5.71-4.53,13.28-7.4,22.2-6.73,8.74.66,17.8,4.64,27.01,11.9,23.69,18.71,41.08,48.22,49.6,66.31.09-.83.19-1.7.27-2.61,1.11-12.65,1.3-32.3-.25-62.1-.97-18.65-2.71-34.62-4.55-53.16-1.84-18.51-3.74-39.28-4.95-67.06-.97-22.16,1.3-39,7.48-50.66,3.2-6.05,7.54-10.86,13.05-14.08,5.49-3.21,11.47-4.45,17.38-4.45,8.74,0,19.63,1.23,28.29,9.51.77-1.64,1.6-3.19,2.51-4.65,4-6.47,9.33-11.03,15.85-13.81,6.27-2.67,13.07-3.46,19.79-3.46,13.51,0,23.95,5.96,30.68,15.04,4.36,5.87,6.97,12.77,8.21,19.77,7.17-3.24,14.34-3.66,18.73-3.66,7.49,0,17.3,3.03,25.36,9.59,8.5,6.9,15.13,17.8,15.13,32.82v15.47Z"/> <path class="cls-2" d="M158.37,565.4c0-19.19-5.18-76.08-6.8-94.85-1.1-12.69.43-19.65,2.47-23.2,1.5-2.61,3.84-4.45,9.48-4.83,4.08-.27,8.52.89,11.84,3.88,3.11,2.8,6.58,8.44,6.58,19.83l.02.64,5.07,86.49c.18,3.11,1.67,6.01,4.1,7.96,2.43,1.95,5.57,2.79,8.65,2.3l53.15-8.41,57.32-7.61c5.3-.7,9.33-5.1,9.57-10.43l3.16-68.35.03-.58c1.41-27.21,2.74-52.04,2.74-59.72,0-21.42,3.63-30.46,6.8-34.26,2.53-3.03,6.16-4.36,13.94-4.36,2.79,0,4.76.57,6.24,1.44,1.45.85,3.11,2.37,4.69,5.35,3.38,6.39,5.85,18.39,4.93,39.36-1.19,27.2-3.04,47.52-4.86,65.84-1.81,18.29-3.62,34.9-4.63,54.19-1.57,30.21-1.43,51.03-.2,65.16.62,7.06,1.53,12.76,2.76,17.27,1.17,4.27,2.92,8.62,5.97,11.86,3.69,3.93,8.95,5.81,14.41,4.49,4.33-1.04,7.38-3.79,9.04-5.54,3.48-3.66,5.94-8.38,6.9-10.81,5.61-14.15,22.96-47.01,46.46-65.56,6.85-5.41,11.85-6.97,14.99-7.21,2.96-.22,5.11.65,6.8,1.99,1.86,1.48,3.25,3.63,3.94,5.66.24.72.35,1.23.39,1.56-6.37,10.75-31.63,50.16-43.54,90.15-8.88,29.81-30.28,60.19-46.27,73.2-15.48,12.6-43.29,20.41-74.62,21.95-31.03,1.52-63-3.23-85.5-13.32-43.46-19.48-52.31-62.38-56.28-80.98-3.08-14.43-3.14-29.84-2.31-44.14.41-7.13,1.02-13.8,1.56-19.95.52-5.97.99-11.74.99-16.47ZM262.35,380.26c0-6.7,1.79-12.67,4.75-16.66,2.68-3.61,6.62-6.11,12.95-6.11,5.18,0,8.67.64,11.13,1.69,2.21.94,4.06,2.4,5.74,5.12,3.89,6.27,6.74,18.88,6.75,43.99l-2.75,59.45c-1.03,19.83-2.1,41.32-2.8,59.19l-35.77,4.75v-151.42ZM240.27,534.86l-31.9,5.05-4.35-73.94v-57.02c0-7.83,3.19-12.62,6.97-15.68,4.21-3.42,9.12-4.64,11.44-4.64,4.23,0,8.59.66,11.73,2.89,2.42,1.72,6.11,5.78,6.11,17.44v125.91ZM181.94,424.42c-6.61-3.29-13.68-4.34-19.89-3.93-11.26.75-21.19,5.47-27.16,15.85-5.42,9.44-6.55,21.92-5.32,36.12,1.7,19.62,6.73,75.01,6.73,92.94,0,3.6-.37,8.39-.91,14.56-.52,6-1.17,13.05-1.61,20.59-.87,15.04-.93,32.74,2.76,50.02,3.84,18,14.23,72.04,68.84,96.52,26.53,11.89,62.2,16.87,95.62,15.23,33.13-1.63,66.61-9.88,87.48-26.88,19.65-16,43.43-50.25,53.49-84.02,11.36-38.14,35.96-75.76,42.1-86.42,3.62-6.28,2.48-13.73.8-18.7-1.9-5.6-5.58-11.46-11.12-15.86-5.71-4.53-13.28-7.4-22.2-6.73-8.74.66-17.8,4.64-27.01,11.9-23.69,18.71-41.08,48.22-49.6,66.31-.09-.83-.19-1.7-.27-2.61-1.11-12.65-1.3-32.3.25-62.1.97-18.65,2.71-34.62,4.55-53.16,1.83-18.51,3.73-39.28,4.95-67.06.97-22.16-1.31-39-7.48-50.66-3.2-6.05-7.54-10.86-13.05-14.08-5.49-3.21-11.47-4.45-17.38-4.45-8.74,0-19.62,1.23-28.29,9.51-.76-1.64-1.6-3.19-2.5-4.65-4-6.47-9.33-11.03-15.85-13.81-6.27-2.67-13.07-3.46-19.79-3.46-13.51,0-23.95,5.96-30.68,15.04-4.36,5.87-6.97,12.77-8.22,19.77-7.17-3.24-14.34-3.66-18.73-3.66-7.49,0-17.3,3.03-25.36,9.59-8.5,6.9-15.13,17.8-15.13,32.82v15.47Z"/> </g> </svg>
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs`),t=require(`../../node_modules/@tanstack/react-query/build/modern/useMutation.cjs`),n=require(`../../api/settings-service/settings-service.api.cjs`),r=require(`../../api/conversation-service/agent-server-conversation-service.api.cjs`),i=require(`./conversation-mutation-utils.cjs`),a=require(`../query/query-keys.cjs`);var o=()=>{let o=e.useQueryClient();return t.useMutation({mutationFn:async({conversationId:e,model:t})=>{if(e){await r.default.switchAcpModel(e,t);return}await n.default.saveSettings({agent_settings_diff:{acp_model:t}})},onSuccess:(e,{conversationId:t})=>{t?i.invalidateConversationQueries(o,t):(n.default.invalidateCache(),o.invalidateQueries({queryKey:a.SETTINGS_QUERY_KEYS.personal()}))}})};exports.useSwitchAcpModel=o;
|
|
2
|
+
//# sourceMappingURL=use-switch-acp-model.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-switch-acp-model.cjs","names":[],"sources":["../../../src/hooks/mutation/use-switch-acp-model.ts"],"sourcesContent":["import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport AgentServerConversationService from \"#/api/conversation-service/agent-server-conversation-service.api\";\nimport SettingsService from \"#/api/settings-service/settings-service.api\";\nimport { SETTINGS_QUERY_KEYS } from \"#/hooks/query/query-keys\";\nimport { invalidateConversationQueries } from \"./conversation-mutation-utils\";\n\ninterface SwitchAcpModelVars {\n /**\n * When set, the ACP conversation's running model is swapped live via the\n * wrapper's ``session/set_model`` (POST /switch_acp_model) and the user's\n * saved default is untouched. When null (home page / no session), the model\n * is persisted as the agent-settings default so the next conversation\n * created here inherits it.\n */\n conversationId: string | null;\n model: string;\n}\n\n/**\n * ACP analog of {@link useSwitchLlmProfile}. Switches the ACP model\n * per-conversation when called from inside a conversation (live in-place model\n * switch); persists it as the agent-settings default when called from the home\n * page (no live session to switch — the agent-server returns 409 before the\n * first message, so we write the default the next conversation inherits).\n *\n * Invalidates the same conversation/settings query keys the profile hook does\n * so the chat-input model chip + conversation chip refresh with the new model.\n */\nexport const useSwitchAcpModel = () => {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({ conversationId, model }: SwitchAcpModelVars) => {\n if (conversationId) {\n await AgentServerConversationService.switchAcpModel(\n conversationId,\n model,\n );\n return;\n }\n // Home page / no session: persist as the agent-settings default. The\n // backend deep-merges ``agent_settings_diff`` into the existing\n // ``agent_settings`` dict, so a scalar ``acp_model`` diff updates only\n // the model and preserves the selected provider + command.\n await SettingsService.saveSettings({\n agent_settings_diff: { acp_model: model },\n });\n },\n onSuccess: (_data, { conversationId }) => {\n if (conversationId) {\n invalidateConversationQueries(queryClient, conversationId);\n } else {\n // Mirror useSwitchLlmProfile's home-page path: clear the stale settings\n // cache so the next conversation-start reads the newly saved default,\n // and refetch the settings query so the home-page chip updates.\n SettingsService.invalidateCache();\n queryClient.invalidateQueries({\n queryKey: SETTINGS_QUERY_KEYS.personal(),\n });\n }\n },\n // No meta.disableToast: unlike useSwitchLlmProfile (wrapped by\n // useSwitchLlmProfileAndLog, which re-surfaces errors), this hook is called\n // directly, so we let the global mutation error toast report a failed\n // switch / settings write rather than swallowing it.\n });\n};\n"],"mappings":"+cA4BA,IAAa,MAA0B,CACrC,IAAM,EAAc,EAAA,gBAAgB,CAEpC,OAAO,EAAA,YAAY,CACjB,WAAY,MAAO,CAAE,iBAAgB,WAAgC,CACnE,GAAI,EAAgB,CAClB,MAAM,EAAA,QAA+B,eACnC,EACA,EACD,CACD,OAMF,MAAM,EAAA,QAAgB,aAAa,CACjC,oBAAqB,CAAE,UAAW,EAAO,CAC1C,CAAC,EAEJ,WAAY,EAAO,CAAE,oBAAqB,CACpC,EACF,EAAA,8BAA8B,EAAa,EAAe,EAK1D,EAAA,QAAgB,iBAAiB,CACjC,EAAY,kBAAkB,CAC5B,SAAU,EAAA,oBAAoB,UAAU,CACzC,CAAC,GAOP,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
interface SwitchAcpModelVars {
|
|
2
|
+
/**
|
|
3
|
+
* When set, the ACP conversation's running model is swapped live via the
|
|
4
|
+
* wrapper's ``session/set_model`` (POST /switch_acp_model) and the user's
|
|
5
|
+
* saved default is untouched. When null (home page / no session), the model
|
|
6
|
+
* is persisted as the agent-settings default so the next conversation
|
|
7
|
+
* created here inherits it.
|
|
8
|
+
*/
|
|
9
|
+
conversationId: string | null;
|
|
10
|
+
model: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* ACP analog of {@link useSwitchLlmProfile}. Switches the ACP model
|
|
14
|
+
* per-conversation when called from inside a conversation (live in-place model
|
|
15
|
+
* switch); persists it as the agent-settings default when called from the home
|
|
16
|
+
* page (no live session to switch — the agent-server returns 409 before the
|
|
17
|
+
* first message, so we write the default the next conversation inherits).
|
|
18
|
+
*
|
|
19
|
+
* Invalidates the same conversation/settings query keys the profile hook does
|
|
20
|
+
* so the chat-input model chip + conversation chip refresh with the new model.
|
|
21
|
+
*/
|
|
22
|
+
export declare const useSwitchAcpModel: () => import("@tanstack/react-query").UseMutationResult<void, import("axios").AxiosError<unknown, any>, SwitchAcpModelVars, unknown>;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { useQueryClient as e } from "../../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js";
|
|
2
|
+
import { useMutation as t } from "../../node_modules/@tanstack/react-query/build/modern/useMutation.js";
|
|
3
|
+
import n from "../../api/settings-service/settings-service.api.js";
|
|
4
|
+
import r from "../../api/conversation-service/agent-server-conversation-service.api.js";
|
|
5
|
+
import { invalidateConversationQueries as i } from "./conversation-mutation-utils.js";
|
|
6
|
+
import { SETTINGS_QUERY_KEYS as a } from "../query/query-keys.js";
|
|
7
|
+
//#region src/hooks/mutation/use-switch-acp-model.ts
|
|
8
|
+
var o = () => {
|
|
9
|
+
let o = e();
|
|
10
|
+
return t({
|
|
11
|
+
mutationFn: async ({ conversationId: e, model: t }) => {
|
|
12
|
+
if (e) {
|
|
13
|
+
await r.switchAcpModel(e, t);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
await n.saveSettings({ agent_settings_diff: { acp_model: t } });
|
|
17
|
+
},
|
|
18
|
+
onSuccess: (e, { conversationId: t }) => {
|
|
19
|
+
t ? i(o, t) : (n.invalidateCache(), o.invalidateQueries({ queryKey: a.personal() }));
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
//#endregion
|
|
24
|
+
export { o as useSwitchAcpModel };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=use-switch-acp-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-switch-acp-model.js","names":[],"sources":["../../../src/hooks/mutation/use-switch-acp-model.ts"],"sourcesContent":["import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport AgentServerConversationService from \"#/api/conversation-service/agent-server-conversation-service.api\";\nimport SettingsService from \"#/api/settings-service/settings-service.api\";\nimport { SETTINGS_QUERY_KEYS } from \"#/hooks/query/query-keys\";\nimport { invalidateConversationQueries } from \"./conversation-mutation-utils\";\n\ninterface SwitchAcpModelVars {\n /**\n * When set, the ACP conversation's running model is swapped live via the\n * wrapper's ``session/set_model`` (POST /switch_acp_model) and the user's\n * saved default is untouched. When null (home page / no session), the model\n * is persisted as the agent-settings default so the next conversation\n * created here inherits it.\n */\n conversationId: string | null;\n model: string;\n}\n\n/**\n * ACP analog of {@link useSwitchLlmProfile}. Switches the ACP model\n * per-conversation when called from inside a conversation (live in-place model\n * switch); persists it as the agent-settings default when called from the home\n * page (no live session to switch — the agent-server returns 409 before the\n * first message, so we write the default the next conversation inherits).\n *\n * Invalidates the same conversation/settings query keys the profile hook does\n * so the chat-input model chip + conversation chip refresh with the new model.\n */\nexport const useSwitchAcpModel = () => {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({ conversationId, model }: SwitchAcpModelVars) => {\n if (conversationId) {\n await AgentServerConversationService.switchAcpModel(\n conversationId,\n model,\n );\n return;\n }\n // Home page / no session: persist as the agent-settings default. The\n // backend deep-merges ``agent_settings_diff`` into the existing\n // ``agent_settings`` dict, so a scalar ``acp_model`` diff updates only\n // the model and preserves the selected provider + command.\n await SettingsService.saveSettings({\n agent_settings_diff: { acp_model: model },\n });\n },\n onSuccess: (_data, { conversationId }) => {\n if (conversationId) {\n invalidateConversationQueries(queryClient, conversationId);\n } else {\n // Mirror useSwitchLlmProfile's home-page path: clear the stale settings\n // cache so the next conversation-start reads the newly saved default,\n // and refetch the settings query so the home-page chip updates.\n SettingsService.invalidateCache();\n queryClient.invalidateQueries({\n queryKey: SETTINGS_QUERY_KEYS.personal(),\n });\n }\n },\n // No meta.disableToast: unlike useSwitchLlmProfile (wrapped by\n // useSwitchLlmProfileAndLog, which re-surfaces errors), this hook is called\n // directly, so we let the global mutation error toast report a failed\n // switch / settings write rather than swallowing it.\n });\n};\n"],"mappings":";;;;;;;AA4BA,IAAa,UAA0B;CACrC,IAAM,IAAc,GAAgB;AAEpC,QAAO,EAAY;EACjB,YAAY,OAAO,EAAE,mBAAgB,eAAgC;AACnE,OAAI,GAAgB;AAClB,UAAM,EAA+B,eACnC,GACA,EACD;AACD;;AAMF,SAAM,EAAgB,aAAa,EACjC,qBAAqB,EAAE,WAAW,GAAO,EAC1C,CAAC;;EAEJ,YAAY,GAAO,EAAE,wBAAqB;AACxC,GAAI,IACF,EAA8B,GAAa,EAAe,IAK1D,EAAgB,iBAAiB,EACjC,EAAY,kBAAkB,EAC5B,UAAU,EAAoB,UAAU,EACzC,CAAC;;EAOP,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../node_modules/@tanstack/react-query/build/modern/useMutation.cjs`),t=require(`../../api/mcp-service/mcp-service.api.cjs`);function n(){return e.useMutation({mutationFn:e=>t.default.testServer(e)})}exports.useTestMcpServer=n;
|
|
2
|
+
//# sourceMappingURL=use-test-mcp-server.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-test-mcp-server.cjs","names":[],"sources":["../../../src/hooks/mutation/use-test-mcp-server.ts"],"sourcesContent":["import { useMutation } from \"@tanstack/react-query\";\nimport McpService from \"#/api/mcp-service/mcp-service.api\";\nimport type { MCPServerConfig } from \"#/types/mcp-server\";\n\nexport function useTestMcpServer() {\n return useMutation({\n mutationFn: (server: MCPServerConfig) => McpService.testServer(server),\n });\n}\n"],"mappings":"gMAIA,SAAgB,GAAmB,CACjC,OAAO,EAAA,YAAY,CACjB,WAAa,GAA4B,EAAA,QAAW,WAAW,EAAO,CACvE,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import type { MCPServerConfig } from "#/types/mcp-server";
|
|
2
|
+
export declare function useTestMcpServer(): import("@tanstack/react-query").UseMutationResult<import("@openhands/typescript-client").MCPTestResponse, import("axios").AxiosError<unknown, any>, MCPServerConfig, unknown>;
|