@openhands/agent-canvas 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/README.windows.md +2 -2
- package/build/assets/Trans-De9RwQhA.js +1 -0
- package/build/assets/__vite-browser-external-4xJsU2-u.js +1 -0
- package/build/assets/{acp-providers-B_ZxlEbx.js → acp-providers-D_D8VUpP.js} +1 -1
- package/build/assets/active-backend-context-DRFevVIj.js +1 -0
- package/build/assets/add-backend-modal-DzuB9zlG.js +1 -0
- package/build/assets/agent-profiles-settings-BfAwTshW.js +1 -0
- package/build/assets/{agent-server-client-options-CxnCYyIW.js → agent-server-client-options-DVLRd9sw.js} +1 -1
- package/build/assets/agent-server-conversation-service.api-DfH2k6Sx.js +5 -0
- package/build/assets/agent-settings-CMMms-0q.js +1 -0
- package/build/assets/agent-settings-DjVlKgaP.js +2 -0
- package/build/assets/alert-banner-BW0wRYw6.js +1 -0
- package/build/assets/api-key-entry-screen-O8gS-fnF.js +1 -0
- package/build/assets/app-settings-SlZvaXlk.js +1 -0
- package/build/assets/automation-detail-CwsNJ9AM.js +2 -0
- package/build/assets/automations-list-B9cPtugh.js +1 -0
- package/build/assets/back-nav-button-BYmxFxGt.js +1 -0
- package/build/assets/backend-form-modal-D2EDGVAc.js +1 -0
- package/build/assets/backend-synced-settings-badge-6OCwIuLY.js +1 -0
- package/build/assets/base-modal-CC5Pp8CF.js +1 -0
- package/build/assets/bot-D7eUAuSB.js +1 -0
- package/build/assets/brand-button-DKPMEKcW.js +1 -0
- package/build/assets/{browser-CCwPzPsD.js → browser-B39N74jU.js} +2 -2
- package/build/assets/browser-store-BI6uklCG.js +1 -0
- package/build/assets/browser-tab-aiDg7aEn.js +1 -0
- package/build/assets/chat-send-button-DxuZIoW8.js +1 -0
- package/build/assets/check-Bvi71siz.js +1 -0
- package/build/assets/checkmark-h7udgXMM.js +1 -0
- package/build/assets/{chevron-down-BxZEAIv4.js → chevron-down-CI8A6tet.js} +1 -1
- package/build/assets/circle-plus-check-toggle-T3eAIuPQ.js +1 -0
- package/build/assets/close-p3Op5lxI.js +1 -0
- package/build/assets/code-tag-DYlAhEQY.js +1 -0
- package/build/assets/{color-themes-CTNRQd1a.js → color-themes-Dd1sO5U6.js} +1 -1
- package/build/assets/combobox-caret-CLGvOs32.js +1 -0
- package/build/assets/command-menu-DKrLCRla.js +1 -0
- package/build/assets/{command-store-C-57Heey.js → command-store-D8J5LMW1.js} +1 -1
- package/build/assets/condenser-settings-BhxvlfoY.js +1 -0
- package/build/assets/confirmation-modal-BK1F0A68.js +1 -0
- package/build/assets/context-menu-list-item-DBFzplWW.js +1 -0
- package/build/assets/conversation-B8prFAZF.js +19 -0
- package/build/assets/conversation-DGVDwGn8.js +1 -0
- package/build/assets/conversation-local-storage-F6zVMM--.js +1 -0
- package/build/assets/conversation-panel-C7DC4Cxx.js +1 -0
- package/build/assets/conversation-service.api-Ch9kR9aE.js +1 -0
- package/build/assets/conversation-state-store-B2Bp32XI.js +1 -0
- package/build/assets/conversation-store-LptbOvKa.js +1 -0
- package/build/assets/conversation-tab-empty-state-m8IUkfMj.js +1 -0
- package/build/assets/copy-3JCw_XFB.js +1 -0
- package/build/assets/copy-BLmGeJcd.js +1 -0
- package/build/assets/copy-to-clipboard-button-Aj9wFmt2.js +1 -0
- package/build/assets/createLucideIcon-CVAsW2Yo.js +1 -0
- package/build/assets/declaration-B9kpCaYl.js +1 -0
- package/build/assets/device-verify-B5YCrvSu.js +1 -0
- package/build/assets/dist-CodhvuAP.js +1 -0
- package/build/assets/dropdown-classes-CgQ45JmQ.js +1 -0
- package/build/assets/edit-automation-modal-BoibW8cd.js +1 -0
- package/build/assets/ellipsis-button-1BV9Sga8.js +1 -0
- package/build/assets/entry.client-BgWj9jL_.js +2 -0
- package/build/assets/enum-filter-dropdown-DCITiYVi.js +1 -0
- package/build/assets/environment-switch-overlay-DUnKILNH.js +1 -0
- package/build/assets/extensions-hub-MtC8lK3A.js +1 -0
- package/build/assets/{extensions-navigation-DfLHdTUC.js → extensions-navigation-BtV14oQL.js} +1 -1
- package/build/assets/{external-link-D8njjDTk.js → external-link-D2zJjE9G.js} +1 -1
- package/build/assets/files-tab-DHqtsKLy.js +1 -0
- package/build/assets/files-tab-store-DJsPxYdg.js +1 -0
- package/build/assets/folder-mMWFvaw0.js +1 -0
- package/build/assets/form-control-classes-9rkU4usZ.js +1 -0
- package/build/assets/get-language-from-path-CPNnuVhI.js +1 -0
- package/build/assets/git-provider-icon-CGU7_KiU.js +1 -0
- package/build/assets/home-BgjWP_UN.js +1 -0
- package/build/assets/iconBase-DaTRRUjy.js +1 -0
- package/build/assets/index-redirect-CUUJiNki.js +1 -0
- package/build/assets/install-server-modal-J_eQ6lhG.js +1 -0
- package/build/assets/launch-DamfAY5L.js +1 -0
- package/build/assets/lesson-plan-HD886V64.js +4 -0
- package/build/assets/link-external-DfKQroKX.js +1 -0
- package/build/assets/{list-todo-B_Ts2JmZ.js → list-todo-BfH6yYUK.js} +1 -1
- package/build/assets/llm-not-configured-banner-DTrLsVr_.js +27 -0
- package/build/assets/llm-settings-BgSFkbHC.js +1 -0
- package/build/assets/llm-settings-Bkc8C5Bi.js +1 -0
- package/build/assets/{llm-subscription-service-BX_AtNlO.js → llm-subscription-service-CKyaV24y.js} +1 -1
- package/build/assets/loader-circle-BEykUKYG.js +1 -0
- package/build/assets/loading-spinner-DHAIPZkP.js +1 -0
- package/build/assets/manage-backends-modal-BUzj5_Lq.js +1 -0
- package/build/assets/manifest-4d6a1552.js +1 -0
- package/build/assets/{markdown-renderer-DWy7Np7u.js → markdown-renderer-D8mayGjI.js} +1 -1
- package/build/assets/mcp-DvqJYDbz.js +9 -0
- package/build/assets/messages-C4KEFkPk.js +40 -0
- package/build/assets/middleware-DYHYNAnP.js +6 -0
- package/build/assets/modal-backdrop-zVwfOJZr.js +1 -0
- package/build/assets/modal-body-Dcu5McCa.js +1 -0
- package/build/assets/{modal-classes-C4kS6ib_.js → modal-classes-DPqxSyuP.js} +1 -1
- package/build/assets/modal-close-button-CTCX4nCH.js +1 -0
- package/build/assets/model-selector-VDHBytb6.js +1 -0
- package/build/assets/{mouse-pointer-click-CXAx4FyM.js → mouse-pointer-click-PdEQPL6v.js} +1 -1
- package/build/assets/navigation-context-DPs2G0X8.js +1 -0
- package/build/assets/navigation-link-D8hfwvxI.js +1 -0
- package/build/assets/onboarding-gGIqoxvA.js +1 -0
- package/build/assets/onboarding-modal-CGHPoMp7.js +1 -0
- package/build/assets/openhands-logo-bcNw5bkY.js +1 -0
- package/build/assets/option-service.api-Dz7Eomnx.js +1 -0
- package/build/assets/organization-service.api-CnynNoT-.js +1 -0
- package/build/assets/path-utils-CBaRYg35.js +1 -0
- package/build/assets/{pencil-CsL0ns9y.js → pencil-Dj2XjKmI.js} +1 -1
- package/build/assets/plan-components-j9X4AxYM.js +1 -0
- package/build/assets/planner-tab-G4j36bJk.js +1 -0
- package/build/assets/plugins-management-service-BAp70KN7.js +1 -0
- package/build/assets/profiles-service.api-CeYEmSM3.js +1 -0
- package/build/assets/providers-CPoq0VXm.js +1 -0
- package/build/assets/{proxy-TeteRRW5.js → proxy-CHmFkV16.js} +1 -1
- package/build/assets/react-DPDgL6du.js +1 -0
- package/build/assets/recommended-automations-launcher-CXaEK1rW.js +50 -0
- package/build/assets/{refresh-cw-GkGYXsU-.js → refresh-cw-DM82EIyx.js} +1 -1
- package/build/assets/root-CxWZUXTQ.css +1 -0
- package/build/assets/root-S6CfVoNm.js +2 -0
- package/build/assets/root-layout-CvxdHJ6j.js +2 -0
- package/build/assets/runtime-waiting-state-DkzLgvMn.js +1 -0
- package/build/assets/schema-field-DwUzlw6b.js +1 -0
- package/build/assets/sdk-section-page-BUXONTx6.js +1 -0
- package/build/assets/sdk-settings-schema-BjBkMHzZ.js +1 -0
- package/build/assets/search-4DHskuhE.js +1 -0
- package/build/assets/search-BsjCEFNf.js +1 -0
- package/build/assets/secrets-service-CZYjNxFw.js +1 -0
- package/build/assets/secrets-settings-ZxyfRBgx.js +1 -0
- package/build/assets/segmented-toggle-Cen5AMUc.js +1 -0
- package/build/assets/settings-Bx6vn-g8.js +1 -0
- package/build/assets/settings-dropdown-input-xzoZwgUe.js +1 -0
- package/build/assets/settings-gear-MXCyZW0x.js +1 -0
- package/build/assets/settings-index-D4SM26d5.js +1 -0
- package/build/assets/settings-input-DYs7t3oK.js +1 -0
- package/build/assets/settings-list-classes-DvQr5jVS.js +1 -0
- package/build/assets/{settings-CN_HaPjH.js → settings-mQUckT0g.js} +1 -1
- package/build/assets/settings-modal-BoC8oMlg.js +1 -0
- package/build/assets/settings-section-header-context-COMOIaxV.js +1 -0
- package/build/assets/settings-service.api-DldkFI1x.js +1 -0
- package/build/assets/settings-switch-C2N2xqEb.js +1 -0
- package/build/assets/{settings-utils-9-_6iVIn.js → settings-utils-BMdG65By.js} +1 -1
- package/build/assets/shared-conversation-DMiaQFsj.js +1 -0
- package/build/assets/sidebar-layout-BtpUSN3j.js +1 -0
- package/build/assets/sidebar-mobile-menu-toggle-CaV3tQFF.js +1 -0
- package/build/assets/sidebar-nav-link-CIB3NBRW.js +1 -0
- package/build/assets/sidebar-store-CZuE8AH5.js +1 -0
- package/build/assets/skill-card-pill-row-D2bUe2kB.js +1 -0
- package/build/assets/skills-9cDZONKh.js +1 -0
- package/build/assets/skills-plugins-D2WkrXkr.js +1 -0
- package/build/assets/skills-settings-CZGVOp_t.js +2 -0
- package/build/assets/{square-chevron-right-Cfi-SUY0.js → square-chevron-right-Czw3FFWc.js} +1 -1
- package/build/assets/styled-tooltip-DsKsFjuq.js +1 -0
- package/build/assets/suspense-X5dBsJzn.js +1 -0
- package/build/assets/switch-skeleton-DqQwalyu.js +1 -0
- package/build/assets/task-list-tab-BAThr9Ex.js +1 -0
- package/build/assets/{terminal-HakoMrQX.js → terminal-B0aL_iDZ.js} +2 -2
- package/build/assets/terminal-BuLtIrb9.js +1 -0
- package/build/assets/toggle-switch-DBlOOzBr.js +1 -0
- package/build/assets/{trash-2-Bq4hqiRH.js → trash-2-Be_7y3Mn.js} +1 -1
- package/build/assets/typography-YGPBGzOG.js +1 -0
- package/build/assets/u-check-circle-BqoIxNz_.js +1 -0
- package/build/assets/u-check-circle-half-LiwZkuFe.js +1 -0
- package/build/assets/u-edit-DJ90xc8Z.js +1 -0
- package/build/assets/use-acp-credential-form-rzaqkJ1n.js +1 -0
- package/build/assets/use-activate-agent-profile-DY0txItX.js +1 -0
- package/build/assets/use-active-agent-profile-Cp5AFONR.js +1 -0
- package/build/assets/use-active-conversation-DvcFBqFe.js +1 -0
- package/build/assets/use-agent-profiles-DnH16_Vm.js +1 -0
- package/build/assets/use-agent-state-BvRcEzY4.js +1 -0
- package/build/assets/use-backends-health-e-Ull4wz.js +1 -0
- package/build/assets/use-breakpoint-B-O0lQ84.js +1 -0
- package/build/assets/use-can-manage-org-profiles-OIhplvQ0.js +1 -0
- package/build/assets/use-click-outside-element-Bf4Omzot.js +1 -0
- package/build/assets/use-cloud-current-user-id-ekU7UXDT.js +1 -0
- package/build/assets/use-config-Dwf5gla-.js +1 -0
- package/build/assets/use-create-conversation-CvAXfA3T.js +1 -0
- package/build/assets/use-create-secret-BKeXCo__.js +1 -0
- package/build/assets/use-event-store-YSOxy9FC.js +4 -0
- package/build/assets/use-handle-plan-click-cAXS-Hft.js +1 -0
- package/build/assets/use-is-authed-_dhQ2Xuj.js +1 -0
- package/build/assets/use-launch-skill-in-chat-BnoDgvAy.js +1 -0
- package/build/assets/use-llm-profiles-BcLibtGb.js +1 -0
- package/build/assets/use-onboarding-completion-C_Swglzp.js +1 -0
- package/build/assets/use-plugins-marketplace-BGb-KgfD.js +1 -0
- package/build/assets/use-runtime-is-ready-CBFe69Ew.js +1 -0
- package/build/assets/use-save-agent-profile-DFjxHhNx.js +1 -0
- package/build/assets/{use-save-settings-DErJDIDL.js → use-save-settings-5xPYpSQM.js} +1 -1
- package/build/assets/use-settings-B07msZ2Z.js +1 -0
- package/build/assets/use-settings-nav-items-CswsOEyw.js +16 -0
- package/build/assets/use-skills-Aoaoq_ei.js +1 -0
- package/build/assets/use-task-list-CmWGElgb.js +1 -0
- package/build/assets/use-tracking-CqODdfO4.js +1 -0
- package/build/assets/use-user-conversation-BPHQ-dm-.js +1 -0
- package/build/assets/useMutation-DCE9RcgK.js +1 -0
- package/build/assets/useMutationState-BUab8Kxr.js +1 -0
- package/build/assets/useQueries-CRzaAqzH.js +1 -0
- package/build/assets/useQuery-CpjHYtZc.js +1 -0
- package/build/assets/useTranslation-Cgy4JA_g.js +1 -0
- package/build/assets/utils-CE0lDWtb.js +1 -0
- package/build/assets/vendor-styling-CI0PQ3ab.js +22 -0
- package/build/assets/{vendor~browser-BQU4C3CQ.js → vendor~browser-Cvg7jXCP.js} +1 -1
- package/build/assets/{vendor~browser-tab-Cim6xN2k.js → vendor~browser-tab-Di0kh5Zw.js} +1 -1
- package/build/assets/vendor~conversation-panel~conversation~alert-banner-DHDkknt5.js +1 -0
- package/build/assets/vendor~entry.client-9tWQ_Ugw.js +1 -0
- package/build/assets/{vendor~entry.client-lAMyAlBD.js → vendor~entry.client-D6BtSOtn.js} +1 -1
- package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~d1e18dtv-5Q6lQJdE.js +177 -0
- package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~i3v2mlbw-BrJQ3XZH.js +1 -0
- package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~ncdxw0bh-ClHnt5lR.js +10 -0
- package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~t35o0b0f-Bss49YXv.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~k6tszsdc-Bb-xMtbv.js} +1 -1
- package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~nn5zty47-Zl0G1QCy.js +1 -0
- package/build/assets/{vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~fpbtwbmk-DDSPtjxR.js → vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~byh8a1g4-XNPdpuO8.js} +1 -1
- package/build/assets/{vendor~files-tab-BvQLon-P.js → vendor~files-tab-B02k3xvx.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation-DBPRU26Z.js → vendor~home~conversation-panel~conversation-CYMF9JYB.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DnEBAp2W.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-9UMeuPV6.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CzI-A-Gz.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BD0GaRGa.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-ByET2Quf.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CqXiHwjU.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DCYBrned.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-D7EUmQ8Y.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DnctfFZL.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DTzw2x50.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-pSG7lnvH.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-d8aETPbZ.js} +1 -1
- package/build/assets/{vendor~launch-DqoOsAhA.js → vendor~launch-CHXA9cJu.js} +1 -1
- package/build/assets/vendor~root-layout~conversation-panel~conversation-CpiTHpHl.js +1 -0
- package/build/assets/{vendor~root-layout~conversation-panel~conversation~shared-conversation-BJl81v7J.js → vendor~root-layout~conversation-panel~conversation~shared-conversation-_TdZcNMD.js} +1 -1
- package/build/assets/vendor~root-layout~home~conversation-panel~conversation-Cn2jwSga.js +1 -0
- package/build/assets/vendor~root-layout~home~conversation-panel~conversation~launch~settings~settings-index~agen~enjl5xdm-mMKDm94D.js +48 -0
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~automations-~ki5qnp0d-DRld6s9c.js → vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~automations-~ki5qnp0d-DJHl5b-B.js} +236 -17
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-9d2kA26V.js → vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-CZM4hwUT.js} +1 -1
- package/build/assets/vendor~root-layout~home~mcp~automations-list~onboarding-modal-L2sdihTY.js +1 -0
- package/build/assets/verification-settings-DZQ-JvKH.js +1 -0
- package/build/assets/x-Cb0WAtak.js +1 -0
- package/build/assets/x-mark-Batp6gXa.js +1 -0
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +138 -1
- package/build/locales/ca/openhands.json +138 -1
- package/build/locales/de/openhands.json +138 -1
- package/build/locales/en/openhands.json +138 -1
- package/build/locales/es/openhands.json +138 -1
- package/build/locales/fr/openhands.json +138 -1
- package/build/locales/it/openhands.json +138 -1
- package/build/locales/ja/openhands.json +138 -1
- package/build/locales/ko-KR/openhands.json +138 -1
- package/build/locales/no/openhands.json +138 -1
- package/build/locales/pt/openhands.json +138 -1
- package/build/locales/tr/openhands.json +138 -1
- package/build/locales/uk/openhands.json +138 -1
- package/build/locales/zh-CN/openhands.json +138 -1
- package/build/locales/zh-TW/openhands.json +138 -1
- package/config/defaults.json +7 -9
- package/dist/_virtual/__vite-browser-external.cjs +2 -0
- package/dist/_virtual/__vite-browser-external.cjs.map +1 -0
- package/dist/_virtual/__vite-browser-external.js +9 -0
- package/dist/_virtual/__vite-browser-external.js.map +1 -0
- package/dist/api/agent-profiles-service/agent-profiles-service.api.cjs +2 -0
- package/dist/api/agent-profiles-service/agent-profiles-service.api.cjs.map +1 -0
- package/dist/api/agent-profiles-service/agent-profiles-service.api.d.ts +22 -0
- package/dist/api/agent-profiles-service/agent-profiles-service.api.js +35 -0
- package/dist/api/agent-profiles-service/agent-profiles-service.api.js.map +1 -0
- package/dist/api/agent-server-adapter.cjs +2 -2
- package/dist/api/agent-server-adapter.cjs.map +1 -1
- package/dist/api/agent-server-adapter.d.ts +11 -1
- package/dist/api/agent-server-adapter.js +60 -60
- package/dist/api/agent-server-adapter.js.map +1 -1
- package/dist/api/agent-server-compatibility.cjs +1 -1
- package/dist/api/agent-server-compatibility.cjs.map +1 -1
- package/dist/api/agent-server-compatibility.js +1 -0
- package/dist/api/agent-server-compatibility.js.map +1 -1
- package/dist/api/agent-server-home.cjs +1 -1
- package/dist/api/agent-server-home.cjs.map +1 -1
- package/dist/api/agent-server-home.js +1 -0
- package/dist/api/agent-server-home.js.map +1 -1
- package/dist/api/cloud/agent-profiles-service.api.cjs +2 -0
- package/dist/api/cloud/agent-profiles-service.api.cjs.map +1 -0
- package/dist/api/cloud/agent-profiles-service.api.d.ts +7 -0
- package/dist/api/cloud/agent-profiles-service.api.js +58 -0
- package/dist/api/cloud/agent-profiles-service.api.js.map +1 -0
- package/dist/api/cloud/organization-service.api.cjs +1 -1
- package/dist/api/cloud/organization-service.api.cjs.map +1 -1
- package/dist/api/cloud/organization-service.api.d.ts +8 -0
- package/dist/api/cloud/organization-service.api.js +3 -1
- package/dist/api/cloud/organization-service.api.js.map +1 -1
- package/dist/api/cloud/profiles-service.api.cjs +2 -0
- package/dist/api/cloud/profiles-service.api.cjs.map +1 -0
- package/dist/api/cloud/profiles-service.api.d.ts +7 -0
- package/dist/api/cloud/profiles-service.api.js +75 -0
- package/dist/api/cloud/profiles-service.api.js.map +1 -0
- package/dist/api/cloud/settings-service.api.cjs +1 -1
- package/dist/api/cloud/settings-service.api.cjs.map +1 -1
- package/dist/api/cloud/settings-service.api.js +1 -1
- package/dist/api/cloud/settings-service.api.js.map +1 -1
- package/dist/api/config-service/config-service.api.cjs +1 -1
- package/dist/api/config-service/config-service.api.cjs.map +1 -1
- package/dist/api/config-service/config-service.api.js +1 -0
- package/dist/api/config-service/config-service.api.js.map +1 -1
- package/dist/api/conversation-metadata-store.cjs.map +1 -1
- package/dist/api/conversation-metadata-store.d.ts +11 -0
- package/dist/api/conversation-metadata-store.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 +20 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.js +134 -105
- package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.types.d.ts +2 -0
- package/dist/api/conversation-service/conversation-service.api.cjs +1 -1
- package/dist/api/conversation-service/conversation-service.api.cjs.map +1 -1
- package/dist/api/conversation-service/conversation-service.api.d.ts +1 -0
- package/dist/api/conversation-service/conversation-service.api.js +4 -0
- package/dist/api/conversation-service/conversation-service.api.js.map +1 -1
- package/dist/api/device-flow-client.cjs +1 -1
- package/dist/api/device-flow-client.cjs.map +1 -1
- package/dist/api/device-flow-client.js +33 -25
- package/dist/api/device-flow-client.js.map +1 -1
- package/dist/api/event-service/event-service.api.cjs +1 -1
- package/dist/api/event-service/event-service.api.cjs.map +1 -1
- package/dist/api/event-service/event-service.api.js +1 -0
- package/dist/api/event-service/event-service.api.js.map +1 -1
- package/dist/api/mcp-service/mcp-redacted-credentials.cjs +1 -1
- package/dist/api/mcp-service/mcp-redacted-credentials.cjs.map +1 -1
- package/dist/api/mcp-service/mcp-redacted-credentials.d.ts +3 -3
- package/dist/api/mcp-service/mcp-redacted-credentials.js +29 -30
- package/dist/api/mcp-service/mcp-redacted-credentials.js.map +1 -1
- package/dist/api/mcp-service/mcp-service.api.cjs +1 -1
- package/dist/api/mcp-service/mcp-service.api.cjs.map +1 -1
- package/dist/api/mcp-service/mcp-service.api.d.ts +8 -1
- package/dist/api/mcp-service/mcp-service.api.js +129 -23
- package/dist/api/mcp-service/mcp-service.api.js.map +1 -1
- package/dist/api/option-service/option-service.api.cjs +1 -1
- package/dist/api/option-service/option-service.api.cjs.map +1 -1
- package/dist/api/option-service/option-service.api.js +1 -0
- package/dist/api/option-service/option-service.api.js.map +1 -1
- package/dist/api/plugins-management-service.cjs +2 -0
- package/dist/api/plugins-management-service.cjs.map +1 -0
- package/dist/api/plugins-management-service.d.ts +50 -0
- package/dist/api/plugins-management-service.js +41 -0
- package/dist/api/plugins-management-service.js.map +1 -0
- package/dist/api/plugins-service.d.ts +49 -0
- package/dist/api/profiles-service/profiles-service.api.cjs +1 -1
- package/dist/api/profiles-service/profiles-service.api.cjs.map +1 -1
- package/dist/api/profiles-service/profiles-service.api.js +21 -14
- package/dist/api/profiles-service/profiles-service.api.js.map +1 -1
- package/dist/api/runtime-service/agent-server-runtime-service.cjs +1 -1
- package/dist/api/runtime-service/agent-server-runtime-service.cjs.map +1 -1
- package/dist/api/runtime-service/agent-server-runtime-service.js +1 -0
- package/dist/api/runtime-service/agent-server-runtime-service.js.map +1 -1
- package/dist/api/secrets-service.cjs +1 -1
- package/dist/api/secrets-service.cjs.map +1 -1
- package/dist/api/secrets-service.js +1 -0
- package/dist/api/secrets-service.js.map +1 -1
- 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.js +92 -50
- package/dist/api/settings-service/settings-service.api.js.map +1 -1
- package/dist/api/skills-service.cjs +1 -1
- package/dist/api/skills-service.cjs.map +1 -1
- package/dist/api/skills-service.js +1 -0
- package/dist/api/skills-service.js.map +1 -1
- package/dist/api/workspaces-service/workspaces-service.api.cjs +1 -1
- package/dist/api/workspaces-service/workspaces-service.api.cjs.map +1 -1
- package/dist/api/workspaces-service/workspaces-service.api.js +1 -0
- package/dist/api/workspaces-service/workspaces-service.api.js.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +57 -38
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs +2 -1
- package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js +13 -9
- package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js +65 -26
- package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message.cjs +2 -2
- package/dist/components/conversation-events/chat/event-message.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message.js +78 -76
- package/dist/components/conversation-events/chat/event-message.js.map +1 -1
- package/dist/components/features/analytics/telemetry-consent-banner.cjs +1 -1
- package/dist/components/features/analytics/telemetry-consent-banner.cjs.map +1 -1
- package/dist/components/features/analytics/telemetry-consent-banner.js +1 -0
- package/dist/components/features/analytics/telemetry-consent-banner.js.map +1 -1
- package/dist/components/features/automations/detail/activity-log-item.d.ts +3 -2
- package/dist/components/features/automations/detail/activity-log-section.d.ts +3 -2
- package/dist/components/features/automations/detail/debug-automation-button.d.ts +17 -0
- package/dist/components/features/automations/detail/run-logs-modal.d.ts +6 -1
- package/dist/components/features/backends/backend-form-modal.cjs +1 -1
- package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
- package/dist/components/features/backends/backend-form-modal.d.ts +6 -2
- package/dist/components/features/backends/backend-form-modal.js +198 -161
- package/dist/components/features/backends/backend-form-modal.js.map +1 -1
- package/dist/components/features/backends/backend-row.cjs +1 -1
- package/dist/components/features/backends/backend-row.cjs.map +1 -1
- package/dist/components/features/backends/backend-row.d.ts +2 -1
- package/dist/components/features/backends/backend-row.js +60 -54
- package/dist/components/features/backends/backend-row.js.map +1 -1
- package/dist/components/features/backends/backend-selector.cjs +1 -1
- package/dist/components/features/backends/backend-selector.cjs.map +1 -1
- package/dist/components/features/backends/backend-selector.js +4 -4
- package/dist/components/features/backends/backend-version.cjs +1 -1
- package/dist/components/features/backends/backend-version.cjs.map +1 -1
- package/dist/components/features/backends/backend-version.js +1 -0
- package/dist/components/features/backends/backend-version.js.map +1 -1
- package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
- package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
- package/dist/components/features/backends/manage-backends-modal.js +72 -61
- package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
- package/dist/components/features/chat/change-agent-button.cjs +1 -1
- package/dist/components/features/chat/change-agent-button.js +9 -9
- package/dist/components/features/chat/chat-add-file-button.cjs +1 -1
- package/dist/components/features/chat/chat-add-file-button.cjs.map +1 -1
- package/dist/components/features/chat/chat-add-file-button.js +38 -34
- package/dist/components/features/chat/chat-add-file-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 +136 -129
- 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 +100 -87
- package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs +2 -0
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs.map +1 -0
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.d.ts +15 -0
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.js +118 -0
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.js.map +1 -0
- package/dist/components/features/chat/components/chat-input-model.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-model.js +17 -17
- package/dist/components/features/chat/components/chat-input-profile-picker.cjs +2 -0
- package/dist/components/features/chat/components/chat-input-profile-picker.cjs.map +1 -0
- package/dist/components/features/chat/components/chat-input-profile-picker.d.ts +9 -0
- package/dist/components/features/chat/components/chat-input-profile-picker.js +112 -0
- package/dist/components/features/chat/components/chat-input-profile-picker.js.map +1 -0
- package/dist/components/features/chat/components/resolve-picker-kind.cjs +2 -0
- package/dist/components/features/chat/components/resolve-picker-kind.cjs.map +1 -0
- package/dist/components/features/chat/components/resolve-picker-kind.d.ts +29 -0
- package/dist/components/features/chat/components/resolve-picker-kind.js +8 -0
- package/dist/components/features/chat/components/resolve-picker-kind.js.map +1 -0
- package/dist/components/features/chat/goal-status-banner.cjs +2 -0
- package/dist/components/features/chat/goal-status-banner.cjs.map +1 -0
- package/dist/components/features/chat/goal-status-banner.d.ts +11 -0
- package/dist/components/features/chat/goal-status-banner.js +12 -0
- package/dist/components/features/chat/goal-status-banner.js.map +1 -0
- package/dist/components/features/chat/goal-status-content.cjs +2 -0
- package/dist/components/features/chat/goal-status-content.cjs.map +1 -0
- package/dist/components/features/chat/goal-status-content.d.ts +21 -0
- package/dist/components/features/chat/goal-status-content.js +98 -0
- package/dist/components/features/chat/goal-status-content.js.map +1 -0
- package/dist/components/features/chat/interactive-chat-box.cjs +1 -1
- package/dist/components/features/chat/interactive-chat-box.cjs.map +1 -1
- package/dist/components/features/chat/interactive-chat-box.js +20 -19
- package/dist/components/features/chat/interactive-chat-box.js.map +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/code-block.cjs +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/code-block.cjs.map +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/code-block.d.ts +10 -3
- package/dist/components/features/chat/tool-visualizers/primitives/code-block.js +29 -16
- package/dist/components/features/chat/tool-visualizers/primitives/code-block.js.map +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/output-pane.cjs +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/output-pane.cjs.map +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/output-pane.d.ts +2 -2
- package/dist/components/features/chat/tool-visualizers/primitives/output-pane.js +16 -16
- package/dist/components/features/chat/tool-visualizers/primitives/output-pane.js.map +1 -1
- package/dist/components/features/chat/user-message-body.cjs +1 -1
- package/dist/components/features/chat/user-message-body.cjs.map +1 -1
- package/dist/components/features/chat/user-message-body.js +20 -20
- package/dist/components/features/chat/user-message-body.js.map +1 -1
- package/dist/components/features/command-menu/command-menu-items.d.ts +32 -0
- package/dist/components/features/command-menu/command-menu-trigger.cjs +2 -0
- package/dist/components/features/command-menu/command-menu-trigger.cjs.map +1 -0
- package/dist/components/features/command-menu/command-menu-trigger.d.ts +5 -0
- package/dist/components/features/command-menu/command-menu-trigger.js +53 -0
- package/dist/components/features/command-menu/command-menu-trigger.js.map +1 -0
- package/dist/components/features/command-menu/command-menu.d.ts +2 -0
- package/dist/components/features/command-menu/index.d.ts +2 -0
- package/dist/components/features/controls/tools-context-menu.cjs +1 -1
- package/dist/components/features/controls/tools-context-menu.cjs.map +1 -1
- package/dist/components/features/controls/tools-context-menu.d.ts +3 -1
- package/dist/components/features/controls/tools-context-menu.js +94 -77
- package/dist/components/features/controls/tools-context-menu.js.map +1 -1
- package/dist/components/features/conversation-panel/cloud-new-conversation-menu.cjs +1 -1
- package/dist/components/features/conversation-panel/cloud-new-conversation-menu.cjs.map +1 -1
- package/dist/components/features/conversation-panel/cloud-new-conversation-menu.js +8 -5
- package/dist/components/features/conversation-panel/cloud-new-conversation-menu.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.js +2 -1
- package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
- package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs +1 -1
- package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs.map +1 -1
- package/dist/components/features/conversation-panel/local-new-conversation-menu.js +4 -1
- package/dist/components/features/conversation-panel/local-new-conversation-menu.js.map +1 -1
- package/dist/components/features/conversation-panel/plugins-modal.cjs +2 -0
- package/dist/components/features/conversation-panel/plugins-modal.cjs.map +1 -0
- package/dist/components/features/conversation-panel/plugins-modal.d.ts +12 -0
- package/dist/components/features/conversation-panel/plugins-modal.js +62 -0
- package/dist/components/features/conversation-panel/plugins-modal.js.map +1 -0
- package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.cjs +1 -1
- package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.cjs.map +1 -1
- package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.js +4 -4
- 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.js +17 -15
- 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 +102 -59
- 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.js +284 -169
- 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 +16 -18
- package/dist/components/features/mcp-page/installed-server-card.js.map +1 -1
- package/dist/components/features/onboarding/onboarding-host.d.ts +3 -13
- package/dist/components/features/plugins/add-plugin-modal.d.ts +6 -0
- package/dist/components/features/plugins/build-plugins-view-model.d.ts +39 -0
- package/dist/components/features/plugins/plugin-card.d.ts +13 -0
- package/dist/components/features/plugins/plugin-detail-modal.d.ts +13 -0
- package/dist/components/features/plugins/plugin-picker-card.d.ts +10 -0
- package/dist/components/features/plugins/plugin-picker-modal.d.ts +9 -0
- package/dist/components/features/plugins/plugin-picker-trigger.d.ts +9 -0
- package/dist/components/features/plugins/plugin-picker.d.ts +18 -0
- package/dist/components/features/plugins/plugin-spec-identity.d.ts +28 -0
- package/dist/components/features/plugins/plugins-toolbar.d.ts +9 -0
- package/dist/components/features/settings/agent-profiles/agent-profile-actions-menu.d.ts +16 -0
- package/dist/components/features/settings/agent-profiles/agent-profile-row.d.ts +13 -0
- package/dist/components/features/settings/agent-profiles/agent-profiles-body.d.ts +15 -0
- package/dist/components/features/settings/agent-profiles/agent-profiles-local-view.d.ts +7 -0
- package/dist/components/features/settings/agent-profiles/agent-profiles-manager.d.ts +7 -0
- package/dist/components/features/settings/agent-profiles/delete-agent-profile-modal.d.ts +7 -0
- package/dist/components/features/settings/agent-profiles/index.d.ts +6 -0
- package/dist/components/features/settings/agent-profiles/merge-agent-profile-save-input.d.ts +18 -0
- package/dist/components/features/settings/llm-profiles/llm-profiles-manager.cjs +1 -1
- package/dist/components/features/settings/llm-profiles/llm-profiles-manager.js +1 -0
- package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
- package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +1 -1
- package/dist/components/features/settings/llm-profiles/profile-row.d.ts +3 -1
- package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +3 -1
- package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.cjs +1 -1
- package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.cjs.map +1 -1
- package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.js +3 -2
- package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.js.map +1 -1
- 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.js +279 -130
- package/dist/components/features/settings/mcp-settings/mcp-server-form.js.map +1 -1
- package/dist/components/features/settings/mcp-settings/mcp-server-list-item.d.ts +1 -12
- package/dist/components/features/settings/mcp-settings/mcp-server-list.d.ts +1 -11
- package/dist/components/features/settings/settings-dropdown-input.cjs +1 -1
- package/dist/components/features/settings/settings-dropdown-input.js +6 -6
- package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
- package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
- package/dist/components/features/sidebar/sidebar-rail-body.d.ts +1 -2
- package/dist/components/features/sidebar/sidebar-rail-body.js +81 -82
- package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
- package/dist/components/features/sidebar/sidebar.cjs +1 -1
- package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
- package/dist/components/features/sidebar/sidebar.js +45 -46
- package/dist/components/features/sidebar/sidebar.js.map +1 -1
- package/dist/components/features/skills/extensions-navigation.cjs +1 -1
- package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
- package/dist/components/features/skills/extensions-navigation.js +1 -2
- package/dist/components/features/skills/extensions-navigation.js.map +1 -1
- package/dist/components/shared/modals/modal-backdrop.cjs +1 -1
- package/dist/components/shared/modals/modal-backdrop.cjs.map +1 -1
- package/dist/components/shared/modals/modal-backdrop.d.ts +5 -1
- package/dist/components/shared/modals/modal-backdrop.js +3 -3
- package/dist/components/shared/modals/modal-backdrop.js.map +1 -1
- package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
- package/dist/components/shared/modals/settings/model-selector.js +16 -16
- package/dist/config/defaults.cjs +1 -1
- package/dist/config/defaults.cjs.map +1 -1
- package/dist/config/defaults.js +7 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/contexts/conversation-websocket-context.cjs +3 -3
- package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
- package/dist/contexts/conversation-websocket-context.js +200 -197
- package/dist/contexts/conversation-websocket-context.js.map +1 -1
- package/dist/hooks/chat/use-goal-interceptor.cjs +2 -0
- package/dist/hooks/chat/use-goal-interceptor.cjs.map +1 -0
- package/dist/hooks/chat/use-goal-interceptor.d.ts +8 -0
- package/dist/hooks/chat/use-goal-interceptor.js +37 -0
- package/dist/hooks/chat/use-goal-interceptor.js.map +1 -0
- package/dist/hooks/chat/use-grip-resize.cjs +1 -1
- package/dist/hooks/chat/use-grip-resize.cjs.map +1 -1
- package/dist/hooks/chat/use-grip-resize.js +17 -16
- package/dist/hooks/chat/use-grip-resize.js.map +1 -1
- package/dist/hooks/chat/use-model-interceptor.cjs +1 -1
- package/dist/hooks/chat/use-model-interceptor.cjs.map +1 -1
- package/dist/hooks/chat/use-model-interceptor.d.ts +3 -3
- package/dist/hooks/chat/use-model-interceptor.js +8 -9
- package/dist/hooks/chat/use-model-interceptor.js.map +1 -1
- package/dist/hooks/chat/use-slash-command.cjs +1 -1
- package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
- package/dist/hooks/chat/use-slash-command.js +4 -4
- package/dist/hooks/chat/use-slash-command.js.map +1 -1
- package/dist/hooks/mutation/conversation-mutation-utils.cjs +1 -1
- package/dist/hooks/mutation/conversation-mutation-utils.cjs.map +1 -1
- package/dist/hooks/mutation/conversation-mutation-utils.d.ts +17 -0
- package/dist/hooks/mutation/conversation-mutation-utils.js +23 -4
- package/dist/hooks/mutation/conversation-mutation-utils.js.map +1 -1
- package/dist/hooks/mutation/use-activate-agent-profile.cjs +2 -0
- package/dist/hooks/mutation/use-activate-agent-profile.cjs.map +1 -0
- package/dist/hooks/mutation/use-activate-agent-profile.d.ts +23 -0
- package/dist/hooks/mutation/use-activate-agent-profile.js +34 -0
- package/dist/hooks/mutation/use-activate-agent-profile.js.map +1 -0
- package/dist/hooks/mutation/use-activate-llm-profile.cjs +1 -1
- package/dist/hooks/mutation/use-activate-llm-profile.js +1 -1
- package/dist/hooks/mutation/use-add-mcp-server.cjs +1 -1
- package/dist/hooks/mutation/use-add-mcp-server.cjs.map +1 -1
- package/dist/hooks/mutation/use-add-mcp-server.d.ts +1 -12
- package/dist/hooks/mutation/use-add-mcp-server.js +10 -34
- package/dist/hooks/mutation/use-add-mcp-server.js.map +1 -1
- package/dist/hooks/mutation/use-apply-onboarding-agent-profile.d.ts +20 -0
- package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
- package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
- package/dist/hooks/mutation/use-create-conversation.d.ts +2 -0
- package/dist/hooks/mutation/use-create-conversation.js +94 -25
- package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
- package/dist/hooks/mutation/use-delete-agent-profile.d.ts +1 -0
- package/dist/hooks/mutation/use-delete-llm-profile.cjs +1 -1
- package/dist/hooks/mutation/use-delete-llm-profile.js +1 -1
- package/dist/hooks/mutation/use-delete-mcp-server.cjs +1 -1
- package/dist/hooks/mutation/use-delete-mcp-server.js +4 -4
- package/dist/hooks/mutation/use-fork-conversation.cjs +2 -0
- package/dist/hooks/mutation/use-fork-conversation.cjs.map +1 -0
- package/dist/hooks/mutation/use-fork-conversation.d.ts +24 -0
- package/dist/hooks/mutation/use-fork-conversation.js +29 -0
- package/dist/hooks/mutation/use-fork-conversation.js.map +1 -0
- package/dist/hooks/mutation/use-install-plugin.d.ts +7 -0
- package/dist/hooks/mutation/use-new-conversation-command.cjs +1 -1
- package/dist/hooks/mutation/use-new-conversation-command.cjs.map +1 -1
- package/dist/hooks/mutation/use-new-conversation-command.d.ts +1 -0
- package/dist/hooks/mutation/use-new-conversation-command.js +20 -10
- package/dist/hooks/mutation/use-new-conversation-command.js.map +1 -1
- package/dist/hooks/mutation/use-rename-agent-profile.d.ts +6 -0
- package/dist/hooks/mutation/use-rename-llm-profile.cjs +1 -1
- package/dist/hooks/mutation/use-rename-llm-profile.js +1 -1
- package/dist/hooks/mutation/use-save-agent-profile.d.ts +5 -0
- package/dist/hooks/mutation/use-save-llm-profile.cjs +1 -1
- package/dist/hooks/mutation/use-save-llm-profile.js +1 -1
- package/dist/hooks/mutation/use-switch-acp-model.cjs.map +1 -1
- package/dist/hooks/mutation/use-switch-acp-model.js.map +1 -1
- package/dist/hooks/mutation/use-switch-llm-profile-and-log.cjs +1 -1
- package/dist/hooks/mutation/use-switch-llm-profile-and-log.cjs.map +1 -1
- package/dist/hooks/mutation/use-switch-llm-profile-and-log.d.ts +3 -4
- package/dist/hooks/mutation/use-switch-llm-profile-and-log.js +10 -35
- package/dist/hooks/mutation/use-switch-llm-profile-and-log.js.map +1 -1
- package/dist/hooks/mutation/use-switch-llm-profile.cjs +1 -1
- package/dist/hooks/mutation/use-switch-llm-profile.cjs.map +1 -1
- package/dist/hooks/mutation/use-switch-llm-profile.d.ts +20 -5
- package/dist/hooks/mutation/use-switch-llm-profile.js +38 -14
- package/dist/hooks/mutation/use-switch-llm-profile.js.map +1 -1
- package/dist/hooks/mutation/use-update-mcp-server.cjs +1 -1
- package/dist/hooks/mutation/use-update-mcp-server.cjs.map +1 -1
- package/dist/hooks/mutation/use-update-mcp-server.js +11 -37
- package/dist/hooks/mutation/use-update-mcp-server.js.map +1 -1
- package/dist/hooks/query/query-keys.cjs +1 -1
- package/dist/hooks/query/query-keys.cjs.map +1 -1
- package/dist/hooks/query/query-keys.d.ts +21 -0
- package/dist/hooks/query/query-keys.js +7 -3
- package/dist/hooks/query/query-keys.js.map +1 -1
- package/dist/hooks/query/use-active-conversation.cjs +1 -1
- package/dist/hooks/query/use-active-conversation.cjs.map +1 -1
- package/dist/hooks/query/use-active-conversation.js +17 -16
- package/dist/hooks/query/use-active-conversation.js.map +1 -1
- package/dist/hooks/query/use-agent-profiles.cjs +2 -0
- package/dist/hooks/query/use-agent-profiles.cjs.map +1 -0
- package/dist/hooks/query/use-agent-profiles.d.ts +13 -0
- package/dist/hooks/query/use-agent-profiles.js +24 -0
- package/dist/hooks/query/use-agent-profiles.js.map +1 -0
- package/dist/hooks/query/use-backends-health.cjs +1 -1
- package/dist/hooks/query/use-backends-health.cjs.map +1 -1
- package/dist/hooks/query/use-backends-health.js +18 -3
- package/dist/hooks/query/use-backends-health.js.map +1 -1
- package/dist/hooks/query/use-conversation-history.cjs +1 -1
- package/dist/hooks/query/use-conversation-history.cjs.map +1 -1
- package/dist/hooks/query/use-conversation-history.js +4 -2
- package/dist/hooks/query/use-conversation-history.js.map +1 -1
- package/dist/hooks/query/use-local-workspaces.cjs +1 -1
- package/dist/hooks/query/use-local-workspaces.cjs.map +1 -1
- package/dist/hooks/query/use-local-workspaces.js +1 -0
- package/dist/hooks/query/use-local-workspaces.js.map +1 -1
- package/dist/hooks/query/use-plugins-marketplace.d.ts +7 -0
- package/dist/hooks/query/use-resolved-workspaces.cjs +1 -1
- package/dist/hooks/query/use-resolved-workspaces.cjs.map +1 -1
- package/dist/hooks/query/use-resolved-workspaces.js +7 -6
- package/dist/hooks/query/use-resolved-workspaces.js.map +1 -1
- package/dist/hooks/query/use-search-subdirs.cjs +1 -1
- package/dist/hooks/query/use-search-subdirs.cjs.map +1 -1
- package/dist/hooks/query/use-search-subdirs.js +1 -0
- package/dist/hooks/query/use-search-subdirs.js.map +1 -1
- package/dist/hooks/query/use-settings.cjs +1 -1
- package/dist/hooks/query/use-settings.cjs.map +1 -1
- package/dist/hooks/query/use-settings.js +11 -11
- package/dist/hooks/query/use-settings.js.map +1 -1
- package/dist/hooks/query/use-verified-models.cjs +1 -1
- package/dist/hooks/query/use-verified-models.cjs.map +1 -1
- package/dist/hooks/query/use-verified-models.js +1 -0
- package/dist/hooks/query/use-verified-models.js.map +1 -1
- package/dist/hooks/use-acp-model-context.cjs +1 -1
- package/dist/hooks/use-acp-model-context.cjs.map +1 -1
- package/dist/hooks/use-acp-model-context.d.ts +1 -1
- package/dist/hooks/use-acp-model-context.js +9 -8
- package/dist/hooks/use-acp-model-context.js.map +1 -1
- package/dist/hooks/use-active-agent-profile.cjs +2 -0
- package/dist/hooks/use-active-agent-profile.cjs.map +1 -0
- package/dist/hooks/use-active-agent-profile.d.ts +20 -0
- package/dist/hooks/use-active-agent-profile.js +17 -0
- package/dist/hooks/use-active-agent-profile.js.map +1 -0
- package/dist/hooks/use-auto-resize.cjs +1 -1
- package/dist/hooks/use-auto-resize.cjs.map +1 -1
- package/dist/hooks/use-auto-resize.d.ts +2 -0
- package/dist/hooks/use-auto-resize.js +49 -45
- package/dist/hooks/use-auto-resize.js.map +1 -1
- package/dist/hooks/use-can-manage-org-profiles.cjs +1 -0
- package/dist/hooks/use-can-manage-org-profiles.d.ts +18 -0
- package/dist/hooks/use-can-manage-org-profiles.js +2 -0
- package/dist/hooks/use-chat-input-llm-profile-state.cjs +2 -0
- package/dist/hooks/use-chat-input-llm-profile-state.cjs.map +1 -0
- package/dist/hooks/use-chat-input-llm-profile-state.d.ts +23 -0
- package/dist/hooks/use-chat-input-llm-profile-state.js +30 -0
- package/dist/hooks/use-chat-input-llm-profile-state.js.map +1 -0
- package/dist/hooks/use-chat-input-model-state.cjs.map +1 -1
- package/dist/hooks/use-chat-input-model-state.d.ts +1 -1
- package/dist/hooks/use-chat-input-model-state.js.map +1 -1
- package/dist/hooks/use-chat-input-profile-state.cjs +2 -0
- package/dist/hooks/use-chat-input-profile-state.cjs.map +1 -0
- package/dist/hooks/use-chat-input-profile-state.d.ts +20 -0
- package/dist/hooks/use-chat-input-profile-state.js +22 -0
- package/dist/hooks/use-chat-input-profile-state.js.map +1 -0
- package/dist/hooks/use-conversation-name-context-menu.cjs +1 -1
- package/dist/hooks/use-conversation-name-context-menu.cjs.map +1 -1
- package/dist/hooks/use-conversation-name-context-menu.d.ts +4 -0
- package/dist/hooks/use-conversation-name-context-menu.js +44 -37
- package/dist/hooks/use-conversation-name-context-menu.js.map +1 -1
- package/dist/hooks/use-conversation-plugins.cjs +2 -0
- package/dist/hooks/use-conversation-plugins.cjs.map +1 -0
- package/dist/hooks/use-conversation-plugins.d.ts +9 -0
- package/dist/hooks/use-conversation-plugins.js +12 -0
- package/dist/hooks/use-conversation-plugins.js.map +1 -0
- package/dist/hooks/use-handle-plan-click.cjs +1 -1
- package/dist/hooks/use-handle-plan-click.cjs.map +1 -1
- package/dist/hooks/use-handle-plan-click.js +2 -1
- package/dist/hooks/use-handle-plan-click.js.map +1 -1
- package/dist/hooks/use-llm-configured.cjs +1 -1
- package/dist/hooks/use-llm-configured.cjs.map +1 -1
- package/dist/hooks/use-llm-configured.js +17 -16
- package/dist/hooks/use-llm-configured.js.map +1 -1
- package/dist/hooks/use-tracking.cjs +1 -1
- package/dist/hooks/use-tracking.cjs.map +1 -1
- package/dist/hooks/use-tracking.d.ts +51 -1
- package/dist/hooks/use-tracking.js +61 -2
- package/dist/hooks/use-tracking.js.map +1 -1
- package/dist/i18n/declaration.cjs +1 -1
- package/dist/i18n/declaration.cjs.map +1 -1
- package/dist/i18n/declaration.d.ts +138 -1
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/translation.cjs +18 -3
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +2329 -0
- package/dist/i18n/translation.js.map +1 -1
- package/dist/icons/slack.cjs +2 -0
- package/dist/icons/slack.cjs.map +1 -0
- package/dist/icons/slack.js +19 -0
- package/dist/icons/slack.js.map +1 -0
- package/dist/icons/u-puzzle-piece.cjs +2 -0
- package/dist/icons/u-puzzle-piece.cjs.map +1 -0
- package/dist/icons/u-puzzle-piece.js +19 -0
- package/dist/icons/u-puzzle-piece.js.map +1 -0
- package/dist/icons/x-circle-solid.cjs +2 -0
- package/dist/icons/x-circle-solid.cjs.map +1 -0
- package/dist/icons/x-circle-solid.js +13 -0
- package/dist/icons/x-circle-solid.js.map +1 -0
- package/dist/locales/ar/openhands.json +138 -1
- package/dist/locales/ca/openhands.json +138 -1
- package/dist/locales/de/openhands.json +138 -1
- package/dist/locales/en/openhands.json +138 -1
- package/dist/locales/es/openhands.json +138 -1
- package/dist/locales/fr/openhands.json +138 -1
- package/dist/locales/it/openhands.json +138 -1
- package/dist/locales/ja/openhands.json +138 -1
- package/dist/locales/ko-KR/openhands.json +138 -1
- package/dist/locales/no/openhands.json +138 -1
- package/dist/locales/pt/openhands.json +138 -1
- package/dist/locales/tr/openhands.json +138 -1
- package/dist/locales/uk/openhands.json +138 -1
- package/dist/locales/zh-CN/openhands.json +138 -1
- package/dist/locales/zh-TW/openhands.json +138 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.js +0 -20
- package/dist/node_modules/@openhands/extensions/integrations/catalog/airtable.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/asana.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/asana.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/asana.js +1 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/asana.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/bitbucket.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/bitbucket.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/bitbucket.js +1 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/bitbucket.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/box.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/box.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/box.js +1 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/box.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/canva.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/canva.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/canva.js +3 -7
- package/dist/node_modules/@openhands/extensions/integrations/catalog/canva.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/confluence.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/confluence.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/confluence.js +1 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/confluence.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/discord.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/discord.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/discord.js +1 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/discord.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.js +20 -26
- package/dist/node_modules/@openhands/extensions/integrations/catalog/figma.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/github.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/github.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/github.js +0 -9
- package/dist/node_modules/@openhands/extensions/integrations/catalog/github.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gmail.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gmail.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gmail.js +1 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gmail.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/google-calendar.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/google-calendar.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/google-calendar.js +1 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/google-calendar.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/google-docs.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/google-docs.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/google-docs.js +1 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/google-docs.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/google-drive.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/google-drive.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/google-drive.js +1 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/google-drive.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/google-sheets.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/google-sheets.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/google-sheets.js +1 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/google-sheets.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/intercom.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/intercom.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/intercom.js +1 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/intercom.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/jira.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/jira.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/jira.js +1 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/jira.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.js +13 -13
- package/dist/node_modules/@openhands/extensions/integrations/catalog/linear.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-outlook.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-outlook.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-outlook.js +1 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-outlook.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-teams.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-teams.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-teams.js +1 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/microsoft-teams.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/miro.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/miro.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/miro.js +14 -10
- package/dist/node_modules/@openhands/extensions/integrations/catalog/miro.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/monday.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/monday.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/monday.js +13 -10
- package/dist/node_modules/@openhands/extensions/integrations/catalog/monday.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/netlify.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/netlify.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/netlify.js +1 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/netlify.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js +1 -8
- package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/okta.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/okta.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/okta.js +1 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/okta.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/onedrive.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/onedrive.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/onedrive.js +1 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/onedrive.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.js +20 -18
- package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/quickbooks.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/quickbooks.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/quickbooks.js +66 -21
- package/dist/node_modules/@openhands/extensions/integrations/catalog/quickbooks.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/salesforce.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/salesforce.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/salesforce.js +17 -11
- package/dist/node_modules/@openhands/extensions/integrations/catalog/salesforce.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sentry.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sentry.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sentry.js +12 -17
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sentry.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sharepoint.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sharepoint.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sharepoint.js +1 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sharepoint.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.js +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/slack.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/stripe.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/stripe.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/stripe.js +14 -19
- package/dist/node_modules/@openhands/extensions/integrations/catalog/stripe.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.js +15 -20
- package/dist/node_modules/@openhands/extensions/integrations/catalog/supabase.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/trello.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/trello.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/trello.js +10 -8
- package/dist/node_modules/@openhands/extensions/integrations/catalog/trello.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/vercel.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/vercel.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/vercel.js +1 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/vercel.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/xero.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/xero.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/xero.js +1 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/xero.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/zoom.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/zoom.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/zoom.js +1 -6
- package/dist/node_modules/@openhands/extensions/integrations/catalog/zoom.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js +67 -87
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/index.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/index.js +4 -4
- package/dist/node_modules/@openhands/extensions/integrations/index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.cjs +236 -17
- package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.js +24 -5
- package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/agent-profiles-client.cjs +2 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/agent-profiles-client.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/agent-profiles-client.js +40 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/agent-profiles-client.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.js +4 -4
- package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.js +3 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.js.map +1 -1
- 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/desktop-client.cjs +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.cjs +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/hooks-client.js +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/http-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/http-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/http-client.js +84 -27
- package/dist/node_modules/@openhands/typescript-client/dist/client/http-client.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/mcp-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/mcp-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/mcp-client.js +9 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/mcp-client.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.cjs +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/meta-profiles-client.js +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/plugins-client.cjs +2 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/plugins-client.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/plugins-client.js +42 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/plugins-client.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.cjs +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/shared-client.js +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/skills-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/skills-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/skills-client.js +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/skills-client.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.cjs +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/sub-agents-client.js +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.cjs +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/tool-client.js +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/clients.cjs +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/clients.js +20 -0
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation-manager.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation-manager.js +18 -0
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation.js +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-conversation.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-conversation.js +2 -0
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.js +15 -17
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/index.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/index.js +3 -0
- package/dist/node_modules/@openhands/typescript-client/dist/workspace/workspace.cjs +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/workspace/workspace.js +1 -0
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +7 -4
- package/dist/package.js.map +1 -1
- package/dist/routes/agent-settings.d.ts +106 -0
- package/dist/routes/files-tab.cjs +1 -1
- package/dist/routes/files-tab.js +23 -23
- package/dist/routes/llm-settings.cjs +1 -1
- package/dist/routes/llm-settings.cjs.map +1 -1
- package/dist/routes/llm-settings.d.ts +6 -4
- package/dist/routes/llm-settings.js +0 -1
- package/dist/routes/llm-settings.js.map +1 -1
- package/dist/routes/mcp.cjs.map +1 -1
- package/dist/routes/mcp.js.map +1 -1
- package/dist/services/settings.cjs +1 -1
- package/dist/services/settings.cjs.map +1 -1
- package/dist/services/settings.js +2 -6
- package/dist/services/settings.js.map +1 -1
- package/dist/stores/command-menu-store.cjs +2 -0
- package/dist/stores/command-menu-store.cjs.map +1 -0
- package/dist/stores/command-menu-store.d.ts +8 -0
- package/dist/stores/command-menu-store.js +12 -0
- package/dist/stores/command-menu-store.js.map +1 -0
- package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
- package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
- package/dist/stores/conversation-panel-preferences-store.js +1 -1
- package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
- package/dist/stores/conversation-store.cjs +1 -1
- package/dist/stores/conversation-store.cjs.map +1 -1
- package/dist/stores/conversation-store.d.ts +1 -0
- package/dist/stores/conversation-store.js +1 -0
- package/dist/stores/conversation-store.js.map +1 -1
- package/dist/stores/goal-store.cjs +2 -0
- package/dist/stores/goal-store.cjs.map +1 -0
- package/dist/stores/goal-store.d.ts +28 -0
- package/dist/stores/goal-store.js +14 -0
- package/dist/stores/goal-store.js.map +1 -0
- package/dist/types/agent-server/core/events/conversation-state-event.d.ts +39 -3
- package/dist/types/agent-server/type-guards.cjs +1 -1
- package/dist/types/agent-server/type-guards.cjs.map +1 -1
- package/dist/types/agent-server/type-guards.d.ts +2 -1
- package/dist/types/agent-server/type-guards.js +3 -3
- package/dist/types/agent-server/type-guards.js.map +1 -1
- package/dist/types/mcp-auth.cjs +2 -0
- package/dist/types/mcp-auth.cjs.map +1 -0
- package/dist/types/mcp-auth.d.ts +43 -0
- package/dist/types/mcp-auth.js +13 -0
- package/dist/types/mcp-auth.js.map +1 -0
- package/dist/types/mcp-server.d.ts +22 -1
- package/dist/types/settings.d.ts +6 -4
- package/dist/ui/context-menu.d.ts +1 -1
- package/dist/utils/acp-command.d.ts +64 -0
- package/dist/utils/automation-debug-prompt.d.ts +18 -0
- package/dist/utils/constants.cjs +1 -1
- package/dist/utils/constants.cjs.map +1 -1
- package/dist/utils/constants.d.ts +2 -0
- package/dist/utils/constants.js +12 -3
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/dropdown-classes.cjs +1 -1
- package/dist/utils/dropdown-classes.cjs.map +1 -1
- package/dist/utils/dropdown-classes.js +4 -2
- package/dist/utils/dropdown-classes.js.map +1 -1
- package/dist/utils/form-control-classes.cjs +1 -1
- package/dist/utils/form-control-classes.js +1 -1
- package/dist/utils/handle-event-for-ui.cjs +1 -1
- package/dist/utils/handle-event-for-ui.cjs.map +1 -1
- package/dist/utils/handle-event-for-ui.js +72 -37
- package/dist/utils/handle-event-for-ui.js.map +1 -1
- package/dist/utils/mcp-config.cjs +1 -1
- package/dist/utils/mcp-config.cjs.map +1 -1
- package/dist/utils/mcp-config.d.ts +15 -9
- package/dist/utils/mcp-config.js +124 -53
- package/dist/utils/mcp-config.js.map +1 -1
- package/dist/utils/mcp-installed-server-display.cjs +2 -0
- package/dist/utils/mcp-installed-server-display.cjs.map +1 -0
- package/dist/utils/mcp-installed-server-display.d.ts +8 -0
- package/dist/utils/mcp-installed-server-display.js +12 -0
- package/dist/utils/mcp-installed-server-display.js.map +1 -0
- package/dist/utils/mcp-installed-servers.cjs +1 -1
- package/dist/utils/mcp-installed-servers.cjs.map +1 -1
- package/dist/utils/mcp-installed-servers.js +4 -4
- package/dist/utils/mcp-installed-servers.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 +2 -0
- package/dist/utils/mcp-marketplace-utils.js +31 -16
- package/dist/utils/mcp-marketplace-utils.js.map +1 -1
- package/dist/utils/mcp-server-name.cjs +2 -0
- package/dist/utils/mcp-server-name.cjs.map +1 -0
- package/dist/utils/mcp-server-name.d.ts +3 -0
- package/dist/utils/mcp-server-name.js +12 -0
- package/dist/utils/mcp-server-name.js.map +1 -0
- package/dist/utils/plugin-display.cjs +2 -0
- package/dist/utils/plugin-display.cjs.map +1 -0
- package/dist/utils/plugin-display.d.ts +20 -0
- package/dist/utils/plugin-display.js +29 -0
- package/dist/utils/plugin-display.js.map +1 -0
- package/dist/utils/settings-utils.cjs.map +1 -1
- package/dist/utils/settings-utils.js.map +1 -1
- package/dist/utils/workspaces-compatibility.cjs +1 -1
- package/dist/utils/workspaces-compatibility.cjs.map +1 -1
- package/dist/utils/workspaces-compatibility.js +1 -0
- package/dist/utils/workspaces-compatibility.js.map +1 -1
- package/package.json +7 -4
- package/scripts/check-sdk-version-sync.mjs +6 -6
- package/scripts/check-translation-completeness.cjs +6 -0
- package/scripts/dev-safe.mjs +14 -3
- package/scripts/dev-with-automation.mjs +4 -0
- package/scripts/gen-acp-docker-env.mjs +107 -0
- package/scripts/ingress.mjs +66 -226
- package/scripts/proxy-utils.mjs +171 -0
- package/scripts/static-server.mjs +127 -283
- package/build/assets/Trans-CiZR6eVI.js +0 -1
- package/build/assets/active-backend-context-CEuva6ZJ.js +0 -1
- package/build/assets/add-backend-modal-b_eiVk3A.js +0 -1
- package/build/assets/agent-server-conversation-service.api-D_uJ7BKc.js +0 -5
- package/build/assets/agent-settings-DyfziYyM.js +0 -2
- package/build/assets/alert-banner-BFayS5vM.js +0 -1
- package/build/assets/analytics-consent-form-modal-CQ22qlFF.js +0 -1
- package/build/assets/api-key-entry-screen-KnIwP0vN.js +0 -1
- package/build/assets/app-settings-CBaHJ5vJ.js +0 -1
- package/build/assets/automation-detail-DgQswnXg.js +0 -1
- package/build/assets/automations-list-D99p6CoQ.js +0 -1
- package/build/assets/back-nav-button-Cp9z-wsG.js +0 -1
- package/build/assets/backend-form-modal-BABAz-zH.js +0 -1
- package/build/assets/backend-synced-settings-badge-DzwWQC4T.js +0 -1
- package/build/assets/base-modal-1bHiB5Wf.js +0 -1
- package/build/assets/brand-button-FHWgEb4Q.js +0 -1
- package/build/assets/browser-store-B9h0eW79.js +0 -1
- package/build/assets/browser-tab-JiCXo0Nc.js +0 -1
- package/build/assets/chat-send-button-QtyofqFt.js +0 -1
- package/build/assets/check-6ieIiPhW.js +0 -1
- package/build/assets/checkmark-BfgRVMHK.js +0 -1
- package/build/assets/circle-plus-check-toggle-CmINKfZj.js +0 -1
- package/build/assets/close-DhH0uMa7.js +0 -1
- package/build/assets/code-tag-CnORXDJj.js +0 -1
- package/build/assets/combobox-caret-BB15S7zY.js +0 -1
- package/build/assets/condenser-settings-BOKNShD9.js +0 -1
- package/build/assets/confirmation-modal-CofmThy4.js +0 -1
- package/build/assets/context-menu-list-item-DO12IEaK.js +0 -1
- package/build/assets/conversation-DIzv-jq8.js +0 -1
- package/build/assets/conversation-DV3odvMe.js +0 -19
- package/build/assets/conversation-local-storage-DK7yJr5N.js +0 -1
- package/build/assets/conversation-panel-CgCarTAn.js +0 -1
- package/build/assets/conversation-service.api-RV_bOKNz.js +0 -1
- package/build/assets/conversation-state-store-4obo4ZMf.js +0 -1
- package/build/assets/conversation-store-CXrL0v-X.js +0 -6
- package/build/assets/conversation-tab-empty-state-CqT5ur_H.js +0 -1
- package/build/assets/copy-C5tBqfWu.js +0 -1
- package/build/assets/copy-to-clipboard-button-BVFYcsg_.js +0 -1
- package/build/assets/createLucideIcon-D3nkdIAN.js +0 -1
- package/build/assets/declaration-B0yY_dkQ.js +0 -1
- package/build/assets/device-verify-DRupI_hz.js +0 -1
- package/build/assets/dist-D5d5zm8o.js +0 -1
- package/build/assets/dist-fV7trlfb.js +0 -1
- package/build/assets/dropdown-classes-5IsMjYYw.js +0 -1
- package/build/assets/edit-automation-modal-BG-gd82b.js +0 -1
- package/build/assets/ellipsis-button-DWvVZO_r.js +0 -1
- package/build/assets/entry.client-uhbVfCtd.js +0 -2
- package/build/assets/enum-filter-dropdown-CB2fqz_e.js +0 -1
- package/build/assets/environment-switch-overlay-Oeal5TVq.js +0 -1
- package/build/assets/extensions-hub-DxiE0AZR.js +0 -1
- package/build/assets/files-tab-1F2OlNeH.js +0 -1
- package/build/assets/files-tab-store-C1q5Rbx3.js +0 -1
- package/build/assets/folder-C5tr7xyN.js +0 -1
- package/build/assets/get-language-from-path-E1JKsbeE.js +0 -1
- package/build/assets/git-provider-icon-CKs-22Ts.js +0 -1
- package/build/assets/home-B3E0le0g.js +0 -1
- package/build/assets/iconBase-DMoh3FEg.js +0 -1
- package/build/assets/index-redirect-DhuK5mhS.js +0 -1
- package/build/assets/install-server-modal-DjintV14.js +0 -1
- package/build/assets/is-backend-llm-ready-Bj44pekN.js +0 -1
- package/build/assets/launch-DCU3S84p.js +0 -1
- package/build/assets/lesson-plan-BUUPKVsa.js +0 -3
- package/build/assets/link-external-CF4KHxx-.js +0 -1
- package/build/assets/llm-client-BakM_czF.js +0 -1
- package/build/assets/llm-not-configured-banner-BV-NIjfR.js +0 -27
- package/build/assets/llm-settings-B5d7PHzz.js +0 -1
- package/build/assets/llm-settings-C5whb-0p.js +0 -1
- package/build/assets/loader-circle-DyX8DmLg.js +0 -1
- package/build/assets/loading-spinner-BvOAco8a.js +0 -1
- package/build/assets/manage-backends-modal-D9ClxVpM.js +0 -1
- package/build/assets/manifest-38a873aa.js +0 -1
- package/build/assets/mcp-7rk44GRS.js +0 -9
- package/build/assets/mcp-client-DxHXYNOw.js +0 -1
- package/build/assets/messages-DgBEaXil.js +0 -43
- package/build/assets/modal-backdrop-DjAC2zOZ.js +0 -1
- package/build/assets/modal-body-OJdIUJ68.js +0 -1
- package/build/assets/modal-close-button-BNjGesHc.js +0 -1
- package/build/assets/model-selector-w2uGPM5y.js +0 -1
- package/build/assets/navigation-context-CUJ60pLI.js +0 -1
- package/build/assets/navigation-link-BiPKTOHF.js +0 -1
- package/build/assets/onboarding-Cit87z8g.js +0 -1
- package/build/assets/onboarding-modal-JPrzvr8W.js +0 -1
- package/build/assets/openhands-logo-uNs9g6LY.js +0 -1
- package/build/assets/option-service.api-BLYUhnCF.js +0 -1
- package/build/assets/organization-service.api-DpSSwlZu.js +0 -1
- package/build/assets/path-utils-B4WAVqvK.js +0 -1
- package/build/assets/plan-components-DSOTFW2D.js +0 -1
- package/build/assets/planner-tab-LmoxgKKe.js +0 -1
- package/build/assets/preload-helper-D_sPnjeL.js +0 -1
- package/build/assets/profiles-client-B4SJ4ZAf.js +0 -1
- package/build/assets/providers-BGUAB8kf.js +0 -1
- package/build/assets/react-Dn-iWFF5.js +0 -1
- package/build/assets/react-dom-BBXlXOZX.js +0 -1
- package/build/assets/react-uQK8du1l.js +0 -1
- package/build/assets/recommended-automations-launcher-Df9MXUpX.js +0 -50
- package/build/assets/root-BShAdYGY.css +0 -1
- package/build/assets/root-C99reK-P.js +0 -2
- package/build/assets/root-layout-BtH64XeC.js +0 -2
- package/build/assets/runtime-waiting-state-C7MjXDeW.js +0 -1
- package/build/assets/schema-field-BCDuEMrl.js +0 -1
- package/build/assets/sdk-section-page-XJN9mGju.js +0 -1
- package/build/assets/sdk-settings-schema-B15AE1GH.js +0 -1
- package/build/assets/search-rob4u9f8.js +0 -1
- package/build/assets/secrets-service-CrPyCR8u.js +0 -1
- package/build/assets/secrets-settings-UJn15N7E.js +0 -1
- package/build/assets/settings-C5aUD_sQ.js +0 -1
- package/build/assets/settings-dropdown-input-DQRt2_RA.js +0 -1
- package/build/assets/settings-gear-B7bZDo_8.js +0 -1
- package/build/assets/settings-index-zP_rYIW1.js +0 -1
- package/build/assets/settings-input-n8FzVso3.js +0 -1
- package/build/assets/settings-list-classes-DquY3fwm.js +0 -1
- package/build/assets/settings-modal-szlQ6LpE.js +0 -1
- package/build/assets/settings-section-header-context-DrXgyNC-.js +0 -1
- package/build/assets/settings-service.api-B4G8NzCM.js +0 -1
- package/build/assets/settings-switch-DsbEm3ie.js +0 -1
- package/build/assets/shared-conversation-BrAvqeaI.js +0 -1
- package/build/assets/sidebar-mobile-menu-toggle-BRZGCe-l.js +0 -1
- package/build/assets/sidebar-nav-link-B_EygIce.js +0 -1
- package/build/assets/skill-card-pill-row-Bq9Imkdh.js +0 -1
- package/build/assets/skills-Wg6i0kbu.js +0 -1
- package/build/assets/skills-client-DNd444Bm.js +0 -1
- package/build/assets/skills-plugins-DaGkVI7-.js +0 -1
- package/build/assets/skills-settings-Dlp0WFaT.js +0 -2
- package/build/assets/styled-tooltip-ulgpZDga.js +0 -1
- package/build/assets/suspense-BqBQEuKs.js +0 -1
- package/build/assets/switch-skeleton-C49gVWOQ.js +0 -1
- package/build/assets/task-list-tab-Bz-UlCm2.js +0 -1
- package/build/assets/telemetry-DD3HKMgf.js +0 -2
- package/build/assets/terminal-BwLvVzyJ.js +0 -1
- package/build/assets/toggle-switch-CxW8-lBI.js +0 -1
- package/build/assets/typography-BLf_mRKH.js +0 -1
- package/build/assets/u-check-circle-CxTAJuY9.js +0 -1
- package/build/assets/u-check-circle-half-Bj73jfUG.js +0 -1
- package/build/assets/u-circuit-C-6V9H9C.js +0 -1
- package/build/assets/u-edit-C7OnK2sa.js +0 -1
- package/build/assets/use-acp-credential-form-oehc057O.js +0 -1
- package/build/assets/use-active-conversation-CFXVX2on.js +0 -1
- package/build/assets/use-agent-state-D6xfZA4-.js +0 -1
- package/build/assets/use-backends-health-93yRIOWs.js +0 -1
- package/build/assets/use-breakpoint-Xdy_aZHE.js +0 -1
- package/build/assets/use-click-outside-element-CADb_gCP.js +0 -1
- package/build/assets/use-cloud-current-user-id-CzOXsy04.js +0 -1
- package/build/assets/use-config-oXjEWyb6.js +0 -1
- package/build/assets/use-create-conversation-D-YkgrxS.js +0 -1
- package/build/assets/use-create-secret-CX7Ij7W4.js +0 -1
- package/build/assets/use-event-store-DMRAQQi8.js +0 -1
- package/build/assets/use-handle-plan-click-CwW2Ijc2.js +0 -1
- package/build/assets/use-is-authed-CNbX1KMm.js +0 -1
- package/build/assets/use-launch-skill-in-chat-xI9byRUw.js +0 -1
- package/build/assets/use-llm-profiles-BXRZ2rBh.js +0 -1
- package/build/assets/use-runtime-is-ready-Dwzs9_vp.js +0 -1
- package/build/assets/use-settings-_usWr_qn.js +0 -1
- package/build/assets/use-settings-nav-items-DoB5iH-7.js +0 -16
- package/build/assets/use-skills-BtorhoCN.js +0 -1
- package/build/assets/use-task-list-u46BhYBC.js +0 -1
- package/build/assets/use-tracking-Ca7p71hH.js +0 -1
- package/build/assets/use-user-conversation-U-16WF6G.js +0 -1
- package/build/assets/useMutation-CseCrRRO.js +0 -1
- package/build/assets/useQuery-bowvACed.js +0 -1
- package/build/assets/useTranslation-KhTtKmnv.js +0 -1
- package/build/assets/utils-cRyMoFbz.js +0 -1
- package/build/assets/vendor~conversation-panel~conversation~alert-banner-CjfR7T3x.js +0 -1
- package/build/assets/vendor~entry.client-_zl82x5T.js +0 -1
- package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~dj9x5fm9-CgCGB-3J.js +0 -177
- package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~jfvr34cq-BJdsUTJG.js +0 -1
- package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~m3df9r20-BynFAJ_S.js +0 -1
- package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~nk00xiud-MfCRtPrK.js +0 -9
- package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~ghtfhmuy-BHDILMe2.js +0 -1
- package/build/assets/vendor~root-layout~conversation-panel~conversation-BFZmbXpq.js +0 -1
- package/build/assets/vendor~root-layout~conversation-panel~conversation~index-BPY-kNjK.js +0 -1
- package/build/assets/vendor~root-layout~home~conversation-panel~conversation-BhWqQNmF.js +0 -1
- package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~cfyi58ut-CnnEa0dP.js +0 -1
- package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~clac83qc-DMX6XUwI.js +0 -2
- package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~ldu51w4e-Cqp6k3RG.js +0 -1
- package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~mcp~~ldu51w4e-DS4GWhCz.js +0 -9
- package/build/assets/vendor~root-layout~home~conversation-panel~conversation~launch~settings~settings-index~agen~ji28rqgb-DVffa9Ks.js +0 -48
- package/build/assets/vendor~root-layout~home~mcp~automations-list~onboarding-modal-BzR6ypP3.js +0 -1
- package/build/assets/vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~hzfcl1q6-BcvHZmEZ.js +0 -2
- package/build/assets/vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~hzfcl1q6-Cuvp6wqR.js +0 -14
- package/build/assets/verification-settings-DKZnUHD6.js +0 -1
- package/build/assets/x-DpnGZyVW.js +0 -1
- package/build/assets/x-mark-x3tvCZzc.js +0 -1
- package/dist/components/features/analytics/analytics-consent-form-modal.d.ts +0 -5
- package/dist/components/features/chat/switch-profile-button.cjs +0 -2
- package/dist/components/features/chat/switch-profile-button.cjs.map +0 -1
- package/dist/components/features/chat/switch-profile-button.d.ts +0 -1
- package/dist/components/features/chat/switch-profile-button.js +0 -48
- package/dist/components/features/chat/switch-profile-button.js.map +0 -1
- package/dist/components/features/chat/switch-profile-context-menu.cjs +0 -2
- package/dist/components/features/chat/switch-profile-context-menu.cjs.map +0 -1
- package/dist/components/features/chat/switch-profile-context-menu.d.ts +0 -9
- package/dist/components/features/chat/switch-profile-context-menu.js +0 -106
- package/dist/components/features/chat/switch-profile-context-menu.js.map +0 -1
- package/dist/components/features/onboarding/is-backend-llm-ready.d.ts +0 -30
- package/dist/icons/u-circuit.cjs +0 -2
- package/dist/icons/u-circuit.cjs.map +0 -1
- package/dist/icons/u-circuit.js +0 -19
- package/dist/icons/u-circuit.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/clickup.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/integrations/catalog/clickup.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/clickup.js +0 -35
- package/dist/node_modules/@openhands/extensions/integrations/catalog/clickup.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/dropbox.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/integrations/catalog/dropbox.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/dropbox.js +0 -35
- package/dist/node_modules/@openhands/extensions/integrations/catalog/dropbox.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/freshdesk.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/integrations/catalog/freshdesk.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/freshdesk.js +0 -35
- package/dist/node_modules/@openhands/extensions/integrations/catalog/freshdesk.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js +0 -35
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/mailchimp.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/integrations/catalog/mailchimp.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/mailchimp.js +0 -35
- package/dist/node_modules/@openhands/extensions/integrations/catalog/mailchimp.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/pipedrive.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/integrations/catalog/pipedrive.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/pipedrive.js +0 -35
- package/dist/node_modules/@openhands/extensions/integrations/catalog/pipedrive.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/plaid.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/integrations/catalog/plaid.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/plaid.js +0 -28
- package/dist/node_modules/@openhands/extensions/integrations/catalog/plaid.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/servicenow.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/integrations/catalog/servicenow.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/servicenow.js +0 -35
- package/dist/node_modules/@openhands/extensions/integrations/catalog/servicenow.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/shopify.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/integrations/catalog/shopify.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/shopify.js +0 -35
- package/dist/node_modules/@openhands/extensions/integrations/catalog/shopify.js.map +0 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/zendesk.cjs +0 -2
- package/dist/node_modules/@openhands/extensions/integrations/catalog/zendesk.cjs.map +0 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/zendesk.js +0 -35
- package/dist/node_modules/@openhands/extensions/integrations/catalog/zendesk.js.map +0 -1
- /package/build/assets/{agent-server-ui-style-scope-CIDFDeQb.js → agent-server-ui-style-scope-COnDHTm5.js} +0 -0
- /package/build/assets/{automation-DNgDxqtq.js → automation-BU8zu-FP.js} +0 -0
- /package/build/assets/{common-KeiA2Rod.js → common-Dh7OqABE.js} +0 -0
- /package/build/assets/{environment-switch-store-BpKxp6Xq.js → environment-switch-store-DkjlKWzN.js} +0 -0
- /package/build/assets/{extension-module-card-classes-DvvyImGv.js → extension-module-card-classes-9V3J9J_b.js} +0 -0
- /package/build/assets/{git-status-mapper-B3_HbzUT.js → git-status-mapper-BI8FyUVp.js} +0 -0
- /package/build/assets/{handle-capture-consent-BChvj6mt.js → handle-capture-consent-CPMXU29K.js} +0 -0
- /package/build/assets/{llm-subscription-C1xDoa3K.js → llm-subscription-DtsX5Lhg.js} +0 -0
- /package/build/assets/{map-provider-MonJL5SS.js → map-provider-BM2SJarp.js} +0 -0
- /package/build/assets/{objectWithoutPropertiesLoose-BRYudkUn.js → objectWithoutPropertiesLoose-BgYIAs2y.js} +0 -0
- /package/build/assets/{rolldown-runtime-wFmyQBCi.js → rolldown-runtime-BFRubm34.js} +0 -0
- /package/build/assets/{settings-like-page-layout-classes-DNg2vKSM.js → settings-like-page-layout-classes-DENKlZpD.js} +0 -0
- /package/build/assets/{v4-BMWDcIWQ.js → v4-DbCkTSoU.js} +0 -0
- /package/build/assets/{vendor~browser-yZEspfT9.js → vendor~browser-Dqd33JyP.js} +0 -0
- /package/build/assets/{vendor~terminal-CcUoOdAH.js → vendor~terminal-aeP3PnKf.js} +0 -0
|
@@ -3,6 +3,7 @@ import { AppConversation } from "./agent-server-conversation-service.types";
|
|
|
3
3
|
declare class ConversationService {
|
|
4
4
|
private static currentConversation;
|
|
5
5
|
static setCurrentConversation(currentConversation: AppConversation | null): void;
|
|
6
|
+
static getCurrentConversation(): AppConversation | null;
|
|
6
7
|
private static getClientOverrides;
|
|
7
8
|
static getVSCodeUrl(conversationId: string): Promise<GetVSCodeUrlResponse>;
|
|
8
9
|
static getTrajectory(conversationId: string): Promise<GetTrajectoryResponse>;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { VSCodeClient as e } from "../../node_modules/@openhands/typescript-client/dist/client/vscode-client.js";
|
|
2
|
+
import "../../node_modules/@openhands/typescript-client/dist/clients.js";
|
|
2
3
|
import { getAgentServerWorkingDir as t } from "../agent-server-config.js";
|
|
3
4
|
import { getAgentServerClientOptions as n, getAgentServerHttpClientOptions as r } from "../agent-server-client-options.js";
|
|
4
5
|
import { RemoteEventsList as i } from "../../node_modules/@openhands/typescript-client/dist/events/remote-events-list.js";
|
|
@@ -9,6 +10,9 @@ var o = class {
|
|
|
9
10
|
static setCurrentConversation(e) {
|
|
10
11
|
this.currentConversation = e;
|
|
11
12
|
}
|
|
13
|
+
static getCurrentConversation() {
|
|
14
|
+
return this.currentConversation;
|
|
15
|
+
}
|
|
12
16
|
static getClientOverrides() {
|
|
13
17
|
return { sessionApiKey: this.currentConversation?.session_api_key };
|
|
14
18
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-service.api.js","names":[],"sources":["../../../src/api/conversation-service/conversation-service.api.ts"],"sourcesContent":["import { VSCodeClient } from \"@openhands/typescript-client/clients\";\nimport { RemoteEventsList } from \"@openhands/typescript-client/events/remote-events-list\";\nimport { uploadFilesToConversation } from \"#/api/conversation-file-upload.api\";\nimport {\n GetVSCodeUrlResponse,\n GetTrajectoryResponse,\n FileUploadSuccessResponse,\n} from \"../open-hands.types\";\nimport { getAgentServerWorkingDir } from \"../agent-server-config\";\nimport {\n getAgentServerClientOptions,\n getAgentServerHttpClientOptions,\n} from \"../agent-server-client-options\";\nimport { AppConversation } from \"./agent-server-conversation-service.types\";\n\nclass ConversationService {\n private static currentConversation: AppConversation | null = null;\n\n static setCurrentConversation(\n currentConversation: AppConversation | null,\n ): void {\n this.currentConversation = currentConversation;\n }\n\n private static getClientOverrides() {\n return {\n sessionApiKey: this.currentConversation?.session_api_key,\n };\n }\n\n static async getVSCodeUrl(\n conversationId: string,\n ): Promise<GetVSCodeUrlResponse> {\n const workspaceDir =\n this.currentConversation?.id === conversationId\n ? (this.currentConversation?.workspace?.working_dir ??\n getAgentServerWorkingDir())\n : getAgentServerWorkingDir();\n const vscodeUrl = await new VSCodeClient(\n getAgentServerClientOptions(this.getClientOverrides()),\n ).getUrl({\n baseUrl:\n typeof window !== \"undefined\" ? window.location.origin : undefined,\n workspaceDir,\n });\n\n return { vscode_url: vscodeUrl };\n }\n\n static async getTrajectory(\n conversationId: string,\n ): Promise<GetTrajectoryResponse> {\n const page = await new RemoteEventsList(\n getAgentServerHttpClientOptions(this.getClientOverrides()),\n conversationId,\n ).search({ limit: 10000 });\n\n return { trajectory: page.items ?? [] };\n }\n\n static async uploadFiles(\n conversationId: string,\n files: File[],\n ): Promise<FileUploadSuccessResponse> {\n return uploadFilesToConversation(\n conversationId,\n files,\n this.currentConversation,\n );\n }\n}\n\nexport default ConversationService;\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"conversation-service.api.js","names":[],"sources":["../../../src/api/conversation-service/conversation-service.api.ts"],"sourcesContent":["import { VSCodeClient } from \"@openhands/typescript-client/clients\";\nimport { RemoteEventsList } from \"@openhands/typescript-client/events/remote-events-list\";\nimport { uploadFilesToConversation } from \"#/api/conversation-file-upload.api\";\nimport {\n GetVSCodeUrlResponse,\n GetTrajectoryResponse,\n FileUploadSuccessResponse,\n} from \"../open-hands.types\";\nimport { getAgentServerWorkingDir } from \"../agent-server-config\";\nimport {\n getAgentServerClientOptions,\n getAgentServerHttpClientOptions,\n} from \"../agent-server-client-options\";\nimport { AppConversation } from \"./agent-server-conversation-service.types\";\n\nclass ConversationService {\n private static currentConversation: AppConversation | null = null;\n\n static setCurrentConversation(\n currentConversation: AppConversation | null,\n ): void {\n this.currentConversation = currentConversation;\n }\n\n static getCurrentConversation(): AppConversation | null {\n return this.currentConversation;\n }\n\n private static getClientOverrides() {\n return {\n sessionApiKey: this.currentConversation?.session_api_key,\n };\n }\n\n static async getVSCodeUrl(\n conversationId: string,\n ): Promise<GetVSCodeUrlResponse> {\n const workspaceDir =\n this.currentConversation?.id === conversationId\n ? (this.currentConversation?.workspace?.working_dir ??\n getAgentServerWorkingDir())\n : getAgentServerWorkingDir();\n const vscodeUrl = await new VSCodeClient(\n getAgentServerClientOptions(this.getClientOverrides()),\n ).getUrl({\n baseUrl:\n typeof window !== \"undefined\" ? window.location.origin : undefined,\n workspaceDir,\n });\n\n return { vscode_url: vscodeUrl };\n }\n\n static async getTrajectory(\n conversationId: string,\n ): Promise<GetTrajectoryResponse> {\n const page = await new RemoteEventsList(\n getAgentServerHttpClientOptions(this.getClientOverrides()),\n conversationId,\n ).search({ limit: 10000 });\n\n return { trajectory: page.items ?? [] };\n }\n\n static async uploadFiles(\n conversationId: string,\n files: File[],\n ): Promise<FileUploadSuccessResponse> {\n return uploadFilesToConversation(\n conversationId,\n files,\n this.currentConversation,\n );\n }\n}\n\nexport default ConversationService;\n"],"mappings":";;;;;;;AAeA,IAAM,IAAN,MAA0B;CACxB,OAAe,sBAA8C;CAE7D,OAAO,uBACL,GACM;AACN,OAAK,sBAAsB;;CAG7B,OAAO,yBAAiD;AACtD,SAAO,KAAK;;CAGd,OAAe,qBAAqB;AAClC,SAAO,EACL,eAAe,KAAK,qBAAqB,iBAC1C;;CAGH,aAAa,aACX,GAC+B;EAC/B,IAAM,IACJ,KAAK,qBAAqB,OAAO,IAC5B,KAAK,qBAAqB,WAAW,eACtC,GAA0B,GAC1B,GAA0B;AAShC,SAAO,EAAE,YAAY,MARG,IAAI,EAC1B,EAA4B,KAAK,oBAAoB,CAAC,CACvD,CAAC,OAAO;GACP,SACE,OAAO,SAAW,MAAc,OAAO,SAAS,SAAS,KAAA;GAC3D;GACD,CAAC,EAE8B;;CAGlC,aAAa,cACX,GACgC;AAMhC,SAAO,EAAE,aAAY,MALF,IAAI,EACrB,EAAgC,KAAK,oBAAoB,CAAC,EAC1D,EACD,CAAC,OAAO,EAAE,OAAO,KAAO,CAAC,EAEA,SAAS,EAAE,EAAE;;CAGzC,aAAa,YACX,GACA,GACoC;AACpC,SAAO,EACL,GACA,GACA,KAAK,oBACN"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../_virtual/_rolldown/runtime.cjs`);var e=class extends Error{constructor(e,t){super(e),this.code=t,this.name=`DeviceFlowError`}},t=6e5,n=3e4;async function
|
|
1
|
+
require(`../_virtual/_rolldown/runtime.cjs`);var e=class extends Error{constructor(e,t){super(e),this.code=t,this.name=`DeviceFlowError`}},t=6e5,n=3e4;function r(e){try{let t=e.trim().toLowerCase(),n=/^https?:\/\//i.test(t)?t:`https://${t}`,r=new URL(n).hostname;return r.endsWith(`.all-hands.dev`)||r===`all-hands.dev`||r.endsWith(`.openhands.dev`)||r===`openhands.dev`}catch{return!1}}async function i(e,t,n,r,i,a){let o=r===void 0?void 0:typeof r==`string`||r instanceof Blob||r instanceof FormData||r instanceof URLSearchParams?r:JSON.stringify(r);return await fetch(`${e.replace(/\/+$/,``)}${n}`,{method:t,headers:{...i?{"Content-Type":i}:{}},body:o,signal:a})}async function a(t){let n=t.replace(/\/+$/,``);try{let t=await i(n,`POST`,`/oauth/device/authorize`,{},`application/json`);if(!t.ok)throw new e(`Failed to start device flow: Server returned ${t.status}`);let r=await t.json();if(!r.device_code||!r.user_code||!r.verification_uri)throw new e(`Invalid response from device authorization endpoint: missing required fields`);let a=r.verification_uri_complete??`${r.verification_uri}?user_code=${encodeURIComponent(r.user_code)}`;return{device_code:r.device_code,user_code:r.user_code,verification_uri:r.verification_uri,verification_uri_complete:a,expires_in:r.expires_in??600,interval:r.interval??5}}catch(t){throw t instanceof e?t:new e(`Failed to start device flow: ${t instanceof Error?t.message:String(t)}`)}}async function o(r,a,o){let c=r.replace(/\/+$/,``),l=o.timeout??t,u=Math.max(1,o.interval)*1e3,d=Date.now();for(;Date.now()-d<l;){if(o.signal?.aborted)throw new e(`Authorization cancelled`,`cancelled`);try{let t=await i(c,`POST`,`/oauth/device/token`,new URLSearchParams({grant_type:`urn:ietf:params:oauth:grant-type:device_code`,device_code:a}).toString(),`application/x-www-form-urlencoded`,o.signal);if(t.ok){let n=await t.json();if(!n.access_token)throw new e(`Invalid token response: missing access_token`);return{access_token:n.access_token,token_type:n.token_type??`Bearer`,expires_in:n.expires_in}}let r;try{r=await t.json()}catch{throw new e(`Unexpected response from server: ${t.status}`)}let{error:s,error_description:l}=r;switch(s){case`authorization_pending`:break;case`slow_down`:u=typeof r.interval==`number`&&isFinite(r.interval)&&r.interval>0?Math.max(1,Math.min(r.interval,30))*1e3:Math.min(u+5e3,n);break;case`expired_token`:throw new e(`Device code has expired. Please try again.`,`expired_token`);case`access_denied`:throw new e(`Authorization request was denied.`,`access_denied`);default:throw new e(`Authorization error: ${s}${l?` - ${l}`:``}`,s)}}catch(t){if(t instanceof e)throw t;if(t instanceof DOMException&&t.name===`AbortError`)throw new e(`Authorization cancelled`,`cancelled`);console.warn(`Network error during polling, retrying:`,t)}try{await s(u,o.signal)}catch(t){throw t instanceof DOMException&&t.name===`AbortError`?new e(`Authorization cancelled`,`cancelled`):t}}throw new e(`Timeout waiting for authorization. Please try again.`,`timeout`)}function s(e,t){return new Promise((n,r)=>{if(t?.aborted){r(new DOMException(`Aborted`,`AbortError`));return}let i=setTimeout(n,e);t?.addEventListener(`abort`,()=>{clearTimeout(i),r(new DOMException(`Aborted`,`AbortError`))},{once:!0})})}exports.DeviceFlowError=e,exports.isOpenHandsCloudHost=r,exports.pollForToken=o,exports.startDeviceFlow=a;
|
|
2
2
|
//# sourceMappingURL=device-flow-client.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-flow-client.cjs","names":[],"sources":["../../src/api/device-flow-client.ts"],"sourcesContent":["/**\n * OAuth 2.0 Device Flow client implementation (RFC 8628).\n *\n * Used for one-click authentication with cloud backends.\n * The flow allows users to authenticate in their browser while the\n * application polls for the resulting API key.\n *\n * Device flow requests go directly to the configured OpenHands Cloud host.\n */\n\nexport class DeviceFlowError extends Error {\n constructor(\n message: string,\n public readonly code?: string,\n ) {\n super(message);\n this.name = \"DeviceFlowError\";\n }\n}\n\nexport interface DeviceAuthorizationResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete: string;\n expires_in: number;\n interval: number;\n}\n\nexport interface DeviceTokenResponse {\n access_token: string;\n token_type: string;\n expires_in?: number;\n}\n\ninterface DeviceTokenErrorResponse {\n error: string;\n error_description?: string;\n interval?: number;\n}\n\nconst DEFAULT_TIMEOUT_MS = 600_000; // 10 minutes\nconst MAX_INTERVAL_MS = 30_000; // 30 seconds max polling interval\n\n/**\n * Check if a host is a known OpenHands Cloud domain.\n * Uses hostname extraction to prevent substring matching attacks.\n */\nexport function isOpenHandsCloudHost(host: string): boolean {\n try {\n // Extract hostname from URL or treat as hostname if no protocol\n const trimmed = host.trim().toLowerCase();\n const withProtocol = /^https?:\\/\\//i.test(trimmed)\n ? trimmed\n : `https://${trimmed}`;\n const url = new URL(withProtocol);\n const hostname = url.hostname;\n\n // Check if hostname ends with known domains (exact suffix match)\n return (\n hostname.endsWith(\".all-hands.dev\") ||\n hostname === \"all-hands.dev\" ||\n hostname.endsWith(\".openhands.dev\") ||\n hostname === \"openhands.dev\"\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Make a direct request to the OpenHands Cloud device-flow endpoint.\n */\nasync function makeCloudRequest(\n upstreamHost: string,\n method: \"GET\" | \"POST\",\n path: string,\n body?: unknown,\n contentType?: string,\n signal?: AbortSignal,\n): Promise<Response> {\n const requestBody =\n body === undefined\n ? undefined\n : typeof body === \"string\" ||\n body instanceof Blob ||\n body instanceof FormData ||\n body instanceof URLSearchParams\n ? body\n : JSON.stringify(body);\n\n const response = await fetch(`${upstreamHost.replace(/\\/+$/, \"\")}${path}`, {\n method,\n headers: {\n ...(contentType ? { \"Content-Type\": contentType } : {}),\n },\n body: requestBody,\n signal,\n });\n\n return response;\n}\n\n/**\n * Start the OAuth 2.0 Device Flow by requesting a device code.\n * Requests are sent directly to the cloud host.\n *\n * @param host - The cloud backend host URL (e.g., \"https://app.all-hands.dev\")\n * @returns DeviceAuthorizationResponse with device_code, user_code, verification URLs, etc.\n * @throws DeviceFlowError if the request fails\n */\nexport async function startDeviceFlow(\n host: string,\n): Promise<DeviceAuthorizationResponse> {\n const normalizedHost = host.replace(/\\/+$/, \"\");\n\n try {\n const response = await makeCloudRequest(\n normalizedHost,\n \"POST\",\n \"/oauth/device/authorize\",\n {},\n \"application/json\",\n );\n\n if (!response.ok) {\n // Avoid exposing sensitive server error details\n throw new DeviceFlowError(\n `Failed to start device flow: Server returned ${response.status}`,\n );\n }\n\n const data = await response.json();\n\n // Validate required fields per RFC 8628 Section 3.2\n // verification_uri_complete is OPTIONAL per RFC\n if (!data.device_code || !data.user_code || !data.verification_uri) {\n throw new DeviceFlowError(\n \"Invalid response from device authorization endpoint: missing required fields\",\n );\n }\n\n // Build verification_uri_complete if not provided (optional per RFC)\n const verificationUriComplete =\n data.verification_uri_complete ??\n `${data.verification_uri}?user_code=${encodeURIComponent(data.user_code)}`;\n\n return {\n device_code: data.device_code,\n user_code: data.user_code,\n verification_uri: data.verification_uri,\n verification_uri_complete: verificationUriComplete,\n expires_in: data.expires_in ?? 600,\n interval: data.interval ?? 5,\n };\n } catch (error) {\n if (error instanceof DeviceFlowError) {\n throw error;\n }\n throw new DeviceFlowError(\n `Failed to start device flow: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport interface PollOptions {\n /** Polling interval in seconds (from device authorization response) */\n interval: number;\n /** Maximum time to wait for authorization in milliseconds */\n timeout?: number;\n /** Abort signal to cancel polling */\n signal?: AbortSignal;\n}\n\n/**\n * Poll for the API key after user authorization.\n * Requests are sent directly to the cloud host.\n *\n * @param host - The cloud backend host URL\n * @param deviceCode - The device code from startDeviceFlow\n * @param options - Polling options including interval, timeout, and abort signal\n * @returns DeviceTokenResponse containing the access_token (API key)\n * @throws DeviceFlowError if polling fails, user denies access, or timeout expires\n */\nexport async function pollForToken(\n host: string,\n deviceCode: string,\n options: PollOptions,\n): Promise<DeviceTokenResponse> {\n const normalizedHost = host.replace(/\\/+$/, \"\");\n const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;\n let interval = Math.max(1, options.interval) * 1000; // At least 1 second\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout) {\n // Check if cancelled\n if (options.signal?.aborted) {\n throw new DeviceFlowError(\"Authorization cancelled\", \"cancelled\");\n }\n\n try {\n // RFC 8628 Section 3.4 requires grant_type parameter\n const tokenRequestBody = new URLSearchParams({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code: deviceCode,\n }).toString();\n\n const response = await makeCloudRequest(\n normalizedHost,\n \"POST\",\n \"/oauth/device/token\",\n tokenRequestBody,\n \"application/x-www-form-urlencoded\",\n options.signal,\n );\n\n if (response.ok) {\n const data = await response.json();\n if (!data.access_token) {\n throw new DeviceFlowError(\n \"Invalid token response: missing access_token\",\n );\n }\n return {\n access_token: data.access_token,\n token_type: data.token_type ?? \"Bearer\",\n expires_in: data.expires_in,\n };\n }\n\n // Handle error responses\n let errorData: DeviceTokenErrorResponse;\n try {\n errorData = await response.json();\n } catch {\n throw new DeviceFlowError(\n `Unexpected response from server: ${response.status}`,\n );\n }\n\n const { error, error_description } = errorData;\n\n switch (error) {\n case \"authorization_pending\":\n // User hasn't finished yet; continue polling\n break;\n\n case \"slow_down\":\n // Server asks us to poll less frequently\n // RFC 8628 Section 3.5: \"the client MUST increase its polling interval by 5 seconds\"\n // Validate server-provided interval to prevent DoS (must be number, finite, positive)\n if (\n typeof errorData.interval === \"number\" &&\n isFinite(errorData.interval) &&\n errorData.interval > 0\n ) {\n interval = Math.max(1, Math.min(errorData.interval, 30)) * 1000;\n } else {\n // RFC 8628 mandates incrementing by 5 seconds\n interval = Math.min(interval + 5000, MAX_INTERVAL_MS);\n }\n break;\n\n case \"expired_token\":\n throw new DeviceFlowError(\n \"Device code has expired. Please try again.\",\n \"expired_token\",\n );\n\n case \"access_denied\":\n throw new DeviceFlowError(\n \"Authorization request was denied.\",\n \"access_denied\",\n );\n\n default:\n throw new DeviceFlowError(\n `Authorization error: ${error}${error_description ? ` - ${error_description}` : \"\"}`,\n error,\n );\n }\n } catch (error) {\n // DeviceFlowError means a definitive error (denied, expired, etc.) - rethrow\n if (error instanceof DeviceFlowError) {\n throw error;\n }\n // User cancelled - rethrow\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw new DeviceFlowError(\"Authorization cancelled\", \"cancelled\");\n }\n // Network errors during polling should continue until timeout, not fail immediately\n // Brief network hiccups shouldn't abort 10-minute flows\n console.warn(\"Network error during polling, retrying:\", error);\n }\n\n // Wait before next poll (wrap in try-catch for consistent abort handling)\n try {\n await sleep(interval, options.signal);\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw new DeviceFlowError(\"Authorization cancelled\", \"cancelled\");\n }\n throw error;\n }\n }\n\n throw new DeviceFlowError(\n \"Timeout waiting for authorization. Please try again.\",\n \"timeout\",\n );\n}\n\n/**\n * Sleep for a given duration, respecting an optional abort signal.\n */\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n return;\n }\n\n const timeoutId = setTimeout(resolve, ms);\n\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timeoutId);\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n },\n { once: true },\n );\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"device-flow-client.cjs","names":[],"sources":["../../src/api/device-flow-client.ts"],"sourcesContent":["/**\n * OAuth 2.0 Device Flow client implementation (RFC 8628).\n *\n * Used for one-click authentication with cloud backends.\n * The flow allows users to authenticate in their browser while the\n * application polls for the resulting API key.\n *\n * Device flow requests go directly to the configured OpenHands Cloud host.\n */\n\nexport class DeviceFlowError extends Error {\n constructor(\n message: string,\n public readonly code?: string,\n ) {\n super(message);\n this.name = \"DeviceFlowError\";\n }\n}\n\nexport interface DeviceAuthorizationResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete: string;\n expires_in: number;\n interval: number;\n}\n\nexport interface DeviceTokenResponse {\n access_token: string;\n token_type: string;\n expires_in?: number;\n}\n\ninterface DeviceTokenErrorResponse {\n error: string;\n error_description?: string;\n interval?: number;\n}\n\nconst DEFAULT_TIMEOUT_MS = 600_000; // 10 minutes\nconst MAX_INTERVAL_MS = 30_000; // 30 seconds max polling interval\n\n/**\n * Check if a host is a known OpenHands Cloud domain.\n * Uses hostname extraction to prevent substring matching attacks.\n */\nexport function isOpenHandsCloudHost(host: string): boolean {\n try {\n // Extract hostname from URL or treat as hostname if no protocol\n const trimmed = host.trim().toLowerCase();\n const withProtocol = /^https?:\\/\\//i.test(trimmed)\n ? trimmed\n : `https://${trimmed}`;\n const url = new URL(withProtocol);\n const hostname = url.hostname;\n\n // Check if hostname ends with known domains (exact suffix match)\n return (\n hostname.endsWith(\".all-hands.dev\") ||\n hostname === \"all-hands.dev\" ||\n hostname.endsWith(\".openhands.dev\") ||\n hostname === \"openhands.dev\"\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Make a direct request to the OpenHands Cloud device-flow endpoint.\n */\nasync function makeCloudRequest(\n upstreamHost: string,\n method: \"GET\" | \"POST\",\n path: string,\n body?: unknown,\n contentType?: string,\n signal?: AbortSignal,\n): Promise<Response> {\n const requestBody =\n body === undefined\n ? undefined\n : typeof body === \"string\" ||\n body instanceof Blob ||\n body instanceof FormData ||\n body instanceof URLSearchParams\n ? body\n : JSON.stringify(body);\n\n const response = await fetch(`${upstreamHost.replace(/\\/+$/, \"\")}${path}`, {\n method,\n headers: {\n ...(contentType ? { \"Content-Type\": contentType } : {}),\n },\n body: requestBody,\n signal,\n });\n\n return response;\n}\n\n/**\n * Start the OAuth 2.0 Device Flow by requesting a device code.\n * Requests are sent directly to the cloud host.\n *\n * @param host - The cloud backend host URL (e.g., \"https://app.all-hands.dev\")\n * @returns DeviceAuthorizationResponse with device_code, user_code, verification URLs, etc.\n * @throws DeviceFlowError if the request fails\n */\nexport async function startDeviceFlow(\n host: string,\n): Promise<DeviceAuthorizationResponse> {\n const normalizedHost = host.replace(/\\/+$/, \"\");\n\n try {\n const response = await makeCloudRequest(\n normalizedHost,\n \"POST\",\n \"/oauth/device/authorize\",\n {},\n \"application/json\",\n );\n\n if (!response.ok) {\n // Avoid exposing sensitive server error details\n throw new DeviceFlowError(\n `Failed to start device flow: Server returned ${response.status}`,\n );\n }\n\n const data = await response.json();\n\n // Validate required fields per RFC 8628 Section 3.2\n // verification_uri_complete is OPTIONAL per RFC\n if (!data.device_code || !data.user_code || !data.verification_uri) {\n throw new DeviceFlowError(\n \"Invalid response from device authorization endpoint: missing required fields\",\n );\n }\n\n // Build verification_uri_complete if not provided (optional per RFC)\n const verificationUriComplete =\n data.verification_uri_complete ??\n `${data.verification_uri}?user_code=${encodeURIComponent(data.user_code)}`;\n\n return {\n device_code: data.device_code,\n user_code: data.user_code,\n verification_uri: data.verification_uri,\n verification_uri_complete: verificationUriComplete,\n expires_in: data.expires_in ?? 600,\n interval: data.interval ?? 5,\n };\n } catch (error) {\n if (error instanceof DeviceFlowError) {\n throw error;\n }\n throw new DeviceFlowError(\n `Failed to start device flow: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport interface PollOptions {\n /** Polling interval in seconds (from device authorization response) */\n interval: number;\n /** Maximum time to wait for authorization in milliseconds */\n timeout?: number;\n /** Abort signal to cancel polling */\n signal?: AbortSignal;\n}\n\n/**\n * Poll for the API key after user authorization.\n * Requests are sent directly to the cloud host.\n *\n * @param host - The cloud backend host URL\n * @param deviceCode - The device code from startDeviceFlow\n * @param options - Polling options including interval, timeout, and abort signal\n * @returns DeviceTokenResponse containing the access_token (API key)\n * @throws DeviceFlowError if polling fails, user denies access, or timeout expires\n */\nexport async function pollForToken(\n host: string,\n deviceCode: string,\n options: PollOptions,\n): Promise<DeviceTokenResponse> {\n const normalizedHost = host.replace(/\\/+$/, \"\");\n const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;\n let interval = Math.max(1, options.interval) * 1000; // At least 1 second\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout) {\n // Check if cancelled\n if (options.signal?.aborted) {\n throw new DeviceFlowError(\"Authorization cancelled\", \"cancelled\");\n }\n\n try {\n // RFC 8628 Section 3.4 requires grant_type parameter\n const tokenRequestBody = new URLSearchParams({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code: deviceCode,\n }).toString();\n\n const response = await makeCloudRequest(\n normalizedHost,\n \"POST\",\n \"/oauth/device/token\",\n tokenRequestBody,\n \"application/x-www-form-urlencoded\",\n options.signal,\n );\n\n if (response.ok) {\n const data = await response.json();\n if (!data.access_token) {\n throw new DeviceFlowError(\n \"Invalid token response: missing access_token\",\n );\n }\n return {\n access_token: data.access_token,\n token_type: data.token_type ?? \"Bearer\",\n expires_in: data.expires_in,\n };\n }\n\n // Handle error responses\n let errorData: DeviceTokenErrorResponse;\n try {\n errorData = await response.json();\n } catch {\n throw new DeviceFlowError(\n `Unexpected response from server: ${response.status}`,\n );\n }\n\n const { error, error_description } = errorData;\n\n switch (error) {\n case \"authorization_pending\":\n // User hasn't finished yet; continue polling\n break;\n\n case \"slow_down\":\n // Server asks us to poll less frequently\n // RFC 8628 Section 3.5: \"the client MUST increase its polling interval by 5 seconds\"\n // Validate server-provided interval to prevent DoS (must be number, finite, positive)\n if (\n typeof errorData.interval === \"number\" &&\n isFinite(errorData.interval) &&\n errorData.interval > 0\n ) {\n interval = Math.max(1, Math.min(errorData.interval, 30)) * 1000;\n } else {\n // RFC 8628 mandates incrementing by 5 seconds\n interval = Math.min(interval + 5000, MAX_INTERVAL_MS);\n }\n break;\n\n case \"expired_token\":\n throw new DeviceFlowError(\n \"Device code has expired. Please try again.\",\n \"expired_token\",\n );\n\n case \"access_denied\":\n throw new DeviceFlowError(\n \"Authorization request was denied.\",\n \"access_denied\",\n );\n\n default:\n throw new DeviceFlowError(\n `Authorization error: ${error}${error_description ? ` - ${error_description}` : \"\"}`,\n error,\n );\n }\n } catch (error) {\n // DeviceFlowError means a definitive error (denied, expired, etc.) - rethrow\n if (error instanceof DeviceFlowError) {\n throw error;\n }\n // User cancelled - rethrow\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw new DeviceFlowError(\"Authorization cancelled\", \"cancelled\");\n }\n // Network errors during polling should continue until timeout, not fail immediately\n // Brief network hiccups shouldn't abort 10-minute flows\n console.warn(\"Network error during polling, retrying:\", error);\n }\n\n // Wait before next poll (wrap in try-catch for consistent abort handling)\n try {\n await sleep(interval, options.signal);\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw new DeviceFlowError(\"Authorization cancelled\", \"cancelled\");\n }\n throw error;\n }\n }\n\n throw new DeviceFlowError(\n \"Timeout waiting for authorization. Please try again.\",\n \"timeout\",\n );\n}\n\n/**\n * Sleep for a given duration, respecting an optional abort signal.\n */\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n return;\n }\n\n const timeoutId = setTimeout(resolve, ms);\n\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timeoutId);\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n },\n { once: true },\n );\n });\n}\n"],"mappings":"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"}
|
|
@@ -4,7 +4,15 @@ var e = class extends Error {
|
|
|
4
4
|
super(e), this.code = t, this.name = "DeviceFlowError";
|
|
5
5
|
}
|
|
6
6
|
}, t = 6e5, n = 3e4;
|
|
7
|
-
|
|
7
|
+
function r(e) {
|
|
8
|
+
try {
|
|
9
|
+
let t = e.trim().toLowerCase(), n = /^https?:\/\//i.test(t) ? t : `https://${t}`, r = new URL(n).hostname;
|
|
10
|
+
return r.endsWith(".all-hands.dev") || r === "all-hands.dev" || r.endsWith(".openhands.dev") || r === "openhands.dev";
|
|
11
|
+
} catch {
|
|
12
|
+
return !1;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async function i(e, t, n, r, i, a) {
|
|
8
16
|
let o = r === void 0 ? void 0 : typeof r == "string" || r instanceof Blob || r instanceof FormData || r instanceof URLSearchParams ? r : JSON.stringify(r);
|
|
9
17
|
return await fetch(`${e.replace(/\/+$/, "")}${n}`, {
|
|
10
18
|
method: t,
|
|
@@ -13,35 +21,35 @@ async function r(e, t, n, r, i, a) {
|
|
|
13
21
|
signal: a
|
|
14
22
|
});
|
|
15
23
|
}
|
|
16
|
-
async function
|
|
24
|
+
async function a(t) {
|
|
17
25
|
let n = t.replace(/\/+$/, "");
|
|
18
26
|
try {
|
|
19
|
-
let t = await
|
|
27
|
+
let t = await i(n, "POST", "/oauth/device/authorize", {}, "application/json");
|
|
20
28
|
if (!t.ok) throw new e(`Failed to start device flow: Server returned ${t.status}`);
|
|
21
|
-
let
|
|
22
|
-
if (!
|
|
23
|
-
let a =
|
|
29
|
+
let r = await t.json();
|
|
30
|
+
if (!r.device_code || !r.user_code || !r.verification_uri) throw new e("Invalid response from device authorization endpoint: missing required fields");
|
|
31
|
+
let a = r.verification_uri_complete ?? `${r.verification_uri}?user_code=${encodeURIComponent(r.user_code)}`;
|
|
24
32
|
return {
|
|
25
|
-
device_code:
|
|
26
|
-
user_code:
|
|
27
|
-
verification_uri:
|
|
33
|
+
device_code: r.device_code,
|
|
34
|
+
user_code: r.user_code,
|
|
35
|
+
verification_uri: r.verification_uri,
|
|
28
36
|
verification_uri_complete: a,
|
|
29
|
-
expires_in:
|
|
30
|
-
interval:
|
|
37
|
+
expires_in: r.expires_in ?? 600,
|
|
38
|
+
interval: r.interval ?? 5
|
|
31
39
|
};
|
|
32
40
|
} catch (t) {
|
|
33
41
|
throw t instanceof e ? t : new e(`Failed to start device flow: ${t instanceof Error ? t.message : String(t)}`);
|
|
34
42
|
}
|
|
35
43
|
}
|
|
36
|
-
async function
|
|
37
|
-
let c =
|
|
44
|
+
async function o(r, a, o) {
|
|
45
|
+
let c = r.replace(/\/+$/, ""), l = o.timeout ?? t, u = Math.max(1, o.interval) * 1e3, d = Date.now();
|
|
38
46
|
for (; Date.now() - d < l;) {
|
|
39
|
-
if (
|
|
47
|
+
if (o.signal?.aborted) throw new e("Authorization cancelled", "cancelled");
|
|
40
48
|
try {
|
|
41
|
-
let t = await
|
|
49
|
+
let t = await i(c, "POST", "/oauth/device/token", new URLSearchParams({
|
|
42
50
|
grant_type: "urn:ietf:params:oauth:grant-type:device_code",
|
|
43
51
|
device_code: a
|
|
44
|
-
}).toString(), "application/x-www-form-urlencoded",
|
|
52
|
+
}).toString(), "application/x-www-form-urlencoded", o.signal);
|
|
45
53
|
if (t.ok) {
|
|
46
54
|
let n = await t.json();
|
|
47
55
|
if (!n.access_token) throw new e("Invalid token response: missing access_token");
|
|
@@ -51,21 +59,21 @@ async function a(i, a, s) {
|
|
|
51
59
|
expires_in: n.expires_in
|
|
52
60
|
};
|
|
53
61
|
}
|
|
54
|
-
let
|
|
62
|
+
let r;
|
|
55
63
|
try {
|
|
56
|
-
|
|
64
|
+
r = await t.json();
|
|
57
65
|
} catch {
|
|
58
66
|
throw new e(`Unexpected response from server: ${t.status}`);
|
|
59
67
|
}
|
|
60
|
-
let { error:
|
|
61
|
-
switch (
|
|
68
|
+
let { error: s, error_description: l } = r;
|
|
69
|
+
switch (s) {
|
|
62
70
|
case "authorization_pending": break;
|
|
63
71
|
case "slow_down":
|
|
64
|
-
u = typeof
|
|
72
|
+
u = typeof r.interval == "number" && isFinite(r.interval) && r.interval > 0 ? Math.max(1, Math.min(r.interval, 30)) * 1e3 : Math.min(u + 5e3, n);
|
|
65
73
|
break;
|
|
66
74
|
case "expired_token": throw new e("Device code has expired. Please try again.", "expired_token");
|
|
67
75
|
case "access_denied": throw new e("Authorization request was denied.", "access_denied");
|
|
68
|
-
default: throw new e(`Authorization error: ${
|
|
76
|
+
default: throw new e(`Authorization error: ${s}${l ? ` - ${l}` : ""}`, s);
|
|
69
77
|
}
|
|
70
78
|
} catch (t) {
|
|
71
79
|
if (t instanceof e) throw t;
|
|
@@ -73,14 +81,14 @@ async function a(i, a, s) {
|
|
|
73
81
|
console.warn("Network error during polling, retrying:", t);
|
|
74
82
|
}
|
|
75
83
|
try {
|
|
76
|
-
await
|
|
84
|
+
await s(u, o.signal);
|
|
77
85
|
} catch (t) {
|
|
78
86
|
throw t instanceof DOMException && t.name === "AbortError" ? new e("Authorization cancelled", "cancelled") : t;
|
|
79
87
|
}
|
|
80
88
|
}
|
|
81
89
|
throw new e("Timeout waiting for authorization. Please try again.", "timeout");
|
|
82
90
|
}
|
|
83
|
-
function
|
|
91
|
+
function s(e, t) {
|
|
84
92
|
return new Promise((n, r) => {
|
|
85
93
|
if (t?.aborted) {
|
|
86
94
|
r(new DOMException("Aborted", "AbortError"));
|
|
@@ -93,6 +101,6 @@ function o(e, t) {
|
|
|
93
101
|
});
|
|
94
102
|
}
|
|
95
103
|
//#endregion
|
|
96
|
-
export { e as DeviceFlowError,
|
|
104
|
+
export { e as DeviceFlowError, r as isOpenHandsCloudHost, o as pollForToken, a as startDeviceFlow };
|
|
97
105
|
|
|
98
106
|
//# sourceMappingURL=device-flow-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-flow-client.js","names":[],"sources":["../../src/api/device-flow-client.ts"],"sourcesContent":["/**\n * OAuth 2.0 Device Flow client implementation (RFC 8628).\n *\n * Used for one-click authentication with cloud backends.\n * The flow allows users to authenticate in their browser while the\n * application polls for the resulting API key.\n *\n * Device flow requests go directly to the configured OpenHands Cloud host.\n */\n\nexport class DeviceFlowError extends Error {\n constructor(\n message: string,\n public readonly code?: string,\n ) {\n super(message);\n this.name = \"DeviceFlowError\";\n }\n}\n\nexport interface DeviceAuthorizationResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete: string;\n expires_in: number;\n interval: number;\n}\n\nexport interface DeviceTokenResponse {\n access_token: string;\n token_type: string;\n expires_in?: number;\n}\n\ninterface DeviceTokenErrorResponse {\n error: string;\n error_description?: string;\n interval?: number;\n}\n\nconst DEFAULT_TIMEOUT_MS = 600_000; // 10 minutes\nconst MAX_INTERVAL_MS = 30_000; // 30 seconds max polling interval\n\n/**\n * Check if a host is a known OpenHands Cloud domain.\n * Uses hostname extraction to prevent substring matching attacks.\n */\nexport function isOpenHandsCloudHost(host: string): boolean {\n try {\n // Extract hostname from URL or treat as hostname if no protocol\n const trimmed = host.trim().toLowerCase();\n const withProtocol = /^https?:\\/\\//i.test(trimmed)\n ? trimmed\n : `https://${trimmed}`;\n const url = new URL(withProtocol);\n const hostname = url.hostname;\n\n // Check if hostname ends with known domains (exact suffix match)\n return (\n hostname.endsWith(\".all-hands.dev\") ||\n hostname === \"all-hands.dev\" ||\n hostname.endsWith(\".openhands.dev\") ||\n hostname === \"openhands.dev\"\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Make a direct request to the OpenHands Cloud device-flow endpoint.\n */\nasync function makeCloudRequest(\n upstreamHost: string,\n method: \"GET\" | \"POST\",\n path: string,\n body?: unknown,\n contentType?: string,\n signal?: AbortSignal,\n): Promise<Response> {\n const requestBody =\n body === undefined\n ? undefined\n : typeof body === \"string\" ||\n body instanceof Blob ||\n body instanceof FormData ||\n body instanceof URLSearchParams\n ? body\n : JSON.stringify(body);\n\n const response = await fetch(`${upstreamHost.replace(/\\/+$/, \"\")}${path}`, {\n method,\n headers: {\n ...(contentType ? { \"Content-Type\": contentType } : {}),\n },\n body: requestBody,\n signal,\n });\n\n return response;\n}\n\n/**\n * Start the OAuth 2.0 Device Flow by requesting a device code.\n * Requests are sent directly to the cloud host.\n *\n * @param host - The cloud backend host URL (e.g., \"https://app.all-hands.dev\")\n * @returns DeviceAuthorizationResponse with device_code, user_code, verification URLs, etc.\n * @throws DeviceFlowError if the request fails\n */\nexport async function startDeviceFlow(\n host: string,\n): Promise<DeviceAuthorizationResponse> {\n const normalizedHost = host.replace(/\\/+$/, \"\");\n\n try {\n const response = await makeCloudRequest(\n normalizedHost,\n \"POST\",\n \"/oauth/device/authorize\",\n {},\n \"application/json\",\n );\n\n if (!response.ok) {\n // Avoid exposing sensitive server error details\n throw new DeviceFlowError(\n `Failed to start device flow: Server returned ${response.status}`,\n );\n }\n\n const data = await response.json();\n\n // Validate required fields per RFC 8628 Section 3.2\n // verification_uri_complete is OPTIONAL per RFC\n if (!data.device_code || !data.user_code || !data.verification_uri) {\n throw new DeviceFlowError(\n \"Invalid response from device authorization endpoint: missing required fields\",\n );\n }\n\n // Build verification_uri_complete if not provided (optional per RFC)\n const verificationUriComplete =\n data.verification_uri_complete ??\n `${data.verification_uri}?user_code=${encodeURIComponent(data.user_code)}`;\n\n return {\n device_code: data.device_code,\n user_code: data.user_code,\n verification_uri: data.verification_uri,\n verification_uri_complete: verificationUriComplete,\n expires_in: data.expires_in ?? 600,\n interval: data.interval ?? 5,\n };\n } catch (error) {\n if (error instanceof DeviceFlowError) {\n throw error;\n }\n throw new DeviceFlowError(\n `Failed to start device flow: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport interface PollOptions {\n /** Polling interval in seconds (from device authorization response) */\n interval: number;\n /** Maximum time to wait for authorization in milliseconds */\n timeout?: number;\n /** Abort signal to cancel polling */\n signal?: AbortSignal;\n}\n\n/**\n * Poll for the API key after user authorization.\n * Requests are sent directly to the cloud host.\n *\n * @param host - The cloud backend host URL\n * @param deviceCode - The device code from startDeviceFlow\n * @param options - Polling options including interval, timeout, and abort signal\n * @returns DeviceTokenResponse containing the access_token (API key)\n * @throws DeviceFlowError if polling fails, user denies access, or timeout expires\n */\nexport async function pollForToken(\n host: string,\n deviceCode: string,\n options: PollOptions,\n): Promise<DeviceTokenResponse> {\n const normalizedHost = host.replace(/\\/+$/, \"\");\n const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;\n let interval = Math.max(1, options.interval) * 1000; // At least 1 second\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout) {\n // Check if cancelled\n if (options.signal?.aborted) {\n throw new DeviceFlowError(\"Authorization cancelled\", \"cancelled\");\n }\n\n try {\n // RFC 8628 Section 3.4 requires grant_type parameter\n const tokenRequestBody = new URLSearchParams({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code: deviceCode,\n }).toString();\n\n const response = await makeCloudRequest(\n normalizedHost,\n \"POST\",\n \"/oauth/device/token\",\n tokenRequestBody,\n \"application/x-www-form-urlencoded\",\n options.signal,\n );\n\n if (response.ok) {\n const data = await response.json();\n if (!data.access_token) {\n throw new DeviceFlowError(\n \"Invalid token response: missing access_token\",\n );\n }\n return {\n access_token: data.access_token,\n token_type: data.token_type ?? \"Bearer\",\n expires_in: data.expires_in,\n };\n }\n\n // Handle error responses\n let errorData: DeviceTokenErrorResponse;\n try {\n errorData = await response.json();\n } catch {\n throw new DeviceFlowError(\n `Unexpected response from server: ${response.status}`,\n );\n }\n\n const { error, error_description } = errorData;\n\n switch (error) {\n case \"authorization_pending\":\n // User hasn't finished yet; continue polling\n break;\n\n case \"slow_down\":\n // Server asks us to poll less frequently\n // RFC 8628 Section 3.5: \"the client MUST increase its polling interval by 5 seconds\"\n // Validate server-provided interval to prevent DoS (must be number, finite, positive)\n if (\n typeof errorData.interval === \"number\" &&\n isFinite(errorData.interval) &&\n errorData.interval > 0\n ) {\n interval = Math.max(1, Math.min(errorData.interval, 30)) * 1000;\n } else {\n // RFC 8628 mandates incrementing by 5 seconds\n interval = Math.min(interval + 5000, MAX_INTERVAL_MS);\n }\n break;\n\n case \"expired_token\":\n throw new DeviceFlowError(\n \"Device code has expired. Please try again.\",\n \"expired_token\",\n );\n\n case \"access_denied\":\n throw new DeviceFlowError(\n \"Authorization request was denied.\",\n \"access_denied\",\n );\n\n default:\n throw new DeviceFlowError(\n `Authorization error: ${error}${error_description ? ` - ${error_description}` : \"\"}`,\n error,\n );\n }\n } catch (error) {\n // DeviceFlowError means a definitive error (denied, expired, etc.) - rethrow\n if (error instanceof DeviceFlowError) {\n throw error;\n }\n // User cancelled - rethrow\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw new DeviceFlowError(\"Authorization cancelled\", \"cancelled\");\n }\n // Network errors during polling should continue until timeout, not fail immediately\n // Brief network hiccups shouldn't abort 10-minute flows\n console.warn(\"Network error during polling, retrying:\", error);\n }\n\n // Wait before next poll (wrap in try-catch for consistent abort handling)\n try {\n await sleep(interval, options.signal);\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw new DeviceFlowError(\"Authorization cancelled\", \"cancelled\");\n }\n throw error;\n }\n }\n\n throw new DeviceFlowError(\n \"Timeout waiting for authorization. Please try again.\",\n \"timeout\",\n );\n}\n\n/**\n * Sleep for a given duration, respecting an optional abort signal.\n */\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n return;\n }\n\n const timeoutId = setTimeout(resolve, ms);\n\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timeoutId);\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n },\n { once: true },\n );\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"device-flow-client.js","names":[],"sources":["../../src/api/device-flow-client.ts"],"sourcesContent":["/**\n * OAuth 2.0 Device Flow client implementation (RFC 8628).\n *\n * Used for one-click authentication with cloud backends.\n * The flow allows users to authenticate in their browser while the\n * application polls for the resulting API key.\n *\n * Device flow requests go directly to the configured OpenHands Cloud host.\n */\n\nexport class DeviceFlowError extends Error {\n constructor(\n message: string,\n public readonly code?: string,\n ) {\n super(message);\n this.name = \"DeviceFlowError\";\n }\n}\n\nexport interface DeviceAuthorizationResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete: string;\n expires_in: number;\n interval: number;\n}\n\nexport interface DeviceTokenResponse {\n access_token: string;\n token_type: string;\n expires_in?: number;\n}\n\ninterface DeviceTokenErrorResponse {\n error: string;\n error_description?: string;\n interval?: number;\n}\n\nconst DEFAULT_TIMEOUT_MS = 600_000; // 10 minutes\nconst MAX_INTERVAL_MS = 30_000; // 30 seconds max polling interval\n\n/**\n * Check if a host is a known OpenHands Cloud domain.\n * Uses hostname extraction to prevent substring matching attacks.\n */\nexport function isOpenHandsCloudHost(host: string): boolean {\n try {\n // Extract hostname from URL or treat as hostname if no protocol\n const trimmed = host.trim().toLowerCase();\n const withProtocol = /^https?:\\/\\//i.test(trimmed)\n ? trimmed\n : `https://${trimmed}`;\n const url = new URL(withProtocol);\n const hostname = url.hostname;\n\n // Check if hostname ends with known domains (exact suffix match)\n return (\n hostname.endsWith(\".all-hands.dev\") ||\n hostname === \"all-hands.dev\" ||\n hostname.endsWith(\".openhands.dev\") ||\n hostname === \"openhands.dev\"\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Make a direct request to the OpenHands Cloud device-flow endpoint.\n */\nasync function makeCloudRequest(\n upstreamHost: string,\n method: \"GET\" | \"POST\",\n path: string,\n body?: unknown,\n contentType?: string,\n signal?: AbortSignal,\n): Promise<Response> {\n const requestBody =\n body === undefined\n ? undefined\n : typeof body === \"string\" ||\n body instanceof Blob ||\n body instanceof FormData ||\n body instanceof URLSearchParams\n ? body\n : JSON.stringify(body);\n\n const response = await fetch(`${upstreamHost.replace(/\\/+$/, \"\")}${path}`, {\n method,\n headers: {\n ...(contentType ? { \"Content-Type\": contentType } : {}),\n },\n body: requestBody,\n signal,\n });\n\n return response;\n}\n\n/**\n * Start the OAuth 2.0 Device Flow by requesting a device code.\n * Requests are sent directly to the cloud host.\n *\n * @param host - The cloud backend host URL (e.g., \"https://app.all-hands.dev\")\n * @returns DeviceAuthorizationResponse with device_code, user_code, verification URLs, etc.\n * @throws DeviceFlowError if the request fails\n */\nexport async function startDeviceFlow(\n host: string,\n): Promise<DeviceAuthorizationResponse> {\n const normalizedHost = host.replace(/\\/+$/, \"\");\n\n try {\n const response = await makeCloudRequest(\n normalizedHost,\n \"POST\",\n \"/oauth/device/authorize\",\n {},\n \"application/json\",\n );\n\n if (!response.ok) {\n // Avoid exposing sensitive server error details\n throw new DeviceFlowError(\n `Failed to start device flow: Server returned ${response.status}`,\n );\n }\n\n const data = await response.json();\n\n // Validate required fields per RFC 8628 Section 3.2\n // verification_uri_complete is OPTIONAL per RFC\n if (!data.device_code || !data.user_code || !data.verification_uri) {\n throw new DeviceFlowError(\n \"Invalid response from device authorization endpoint: missing required fields\",\n );\n }\n\n // Build verification_uri_complete if not provided (optional per RFC)\n const verificationUriComplete =\n data.verification_uri_complete ??\n `${data.verification_uri}?user_code=${encodeURIComponent(data.user_code)}`;\n\n return {\n device_code: data.device_code,\n user_code: data.user_code,\n verification_uri: data.verification_uri,\n verification_uri_complete: verificationUriComplete,\n expires_in: data.expires_in ?? 600,\n interval: data.interval ?? 5,\n };\n } catch (error) {\n if (error instanceof DeviceFlowError) {\n throw error;\n }\n throw new DeviceFlowError(\n `Failed to start device flow: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\nexport interface PollOptions {\n /** Polling interval in seconds (from device authorization response) */\n interval: number;\n /** Maximum time to wait for authorization in milliseconds */\n timeout?: number;\n /** Abort signal to cancel polling */\n signal?: AbortSignal;\n}\n\n/**\n * Poll for the API key after user authorization.\n * Requests are sent directly to the cloud host.\n *\n * @param host - The cloud backend host URL\n * @param deviceCode - The device code from startDeviceFlow\n * @param options - Polling options including interval, timeout, and abort signal\n * @returns DeviceTokenResponse containing the access_token (API key)\n * @throws DeviceFlowError if polling fails, user denies access, or timeout expires\n */\nexport async function pollForToken(\n host: string,\n deviceCode: string,\n options: PollOptions,\n): Promise<DeviceTokenResponse> {\n const normalizedHost = host.replace(/\\/+$/, \"\");\n const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;\n let interval = Math.max(1, options.interval) * 1000; // At least 1 second\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout) {\n // Check if cancelled\n if (options.signal?.aborted) {\n throw new DeviceFlowError(\"Authorization cancelled\", \"cancelled\");\n }\n\n try {\n // RFC 8628 Section 3.4 requires grant_type parameter\n const tokenRequestBody = new URLSearchParams({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code: deviceCode,\n }).toString();\n\n const response = await makeCloudRequest(\n normalizedHost,\n \"POST\",\n \"/oauth/device/token\",\n tokenRequestBody,\n \"application/x-www-form-urlencoded\",\n options.signal,\n );\n\n if (response.ok) {\n const data = await response.json();\n if (!data.access_token) {\n throw new DeviceFlowError(\n \"Invalid token response: missing access_token\",\n );\n }\n return {\n access_token: data.access_token,\n token_type: data.token_type ?? \"Bearer\",\n expires_in: data.expires_in,\n };\n }\n\n // Handle error responses\n let errorData: DeviceTokenErrorResponse;\n try {\n errorData = await response.json();\n } catch {\n throw new DeviceFlowError(\n `Unexpected response from server: ${response.status}`,\n );\n }\n\n const { error, error_description } = errorData;\n\n switch (error) {\n case \"authorization_pending\":\n // User hasn't finished yet; continue polling\n break;\n\n case \"slow_down\":\n // Server asks us to poll less frequently\n // RFC 8628 Section 3.5: \"the client MUST increase its polling interval by 5 seconds\"\n // Validate server-provided interval to prevent DoS (must be number, finite, positive)\n if (\n typeof errorData.interval === \"number\" &&\n isFinite(errorData.interval) &&\n errorData.interval > 0\n ) {\n interval = Math.max(1, Math.min(errorData.interval, 30)) * 1000;\n } else {\n // RFC 8628 mandates incrementing by 5 seconds\n interval = Math.min(interval + 5000, MAX_INTERVAL_MS);\n }\n break;\n\n case \"expired_token\":\n throw new DeviceFlowError(\n \"Device code has expired. Please try again.\",\n \"expired_token\",\n );\n\n case \"access_denied\":\n throw new DeviceFlowError(\n \"Authorization request was denied.\",\n \"access_denied\",\n );\n\n default:\n throw new DeviceFlowError(\n `Authorization error: ${error}${error_description ? ` - ${error_description}` : \"\"}`,\n error,\n );\n }\n } catch (error) {\n // DeviceFlowError means a definitive error (denied, expired, etc.) - rethrow\n if (error instanceof DeviceFlowError) {\n throw error;\n }\n // User cancelled - rethrow\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw new DeviceFlowError(\"Authorization cancelled\", \"cancelled\");\n }\n // Network errors during polling should continue until timeout, not fail immediately\n // Brief network hiccups shouldn't abort 10-minute flows\n console.warn(\"Network error during polling, retrying:\", error);\n }\n\n // Wait before next poll (wrap in try-catch for consistent abort handling)\n try {\n await sleep(interval, options.signal);\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw new DeviceFlowError(\"Authorization cancelled\", \"cancelled\");\n }\n throw error;\n }\n }\n\n throw new DeviceFlowError(\n \"Timeout waiting for authorization. Please try again.\",\n \"timeout\",\n );\n}\n\n/**\n * Sleep for a given duration, respecting an optional abort signal.\n */\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n return;\n }\n\n const timeoutId = setTimeout(resolve, ms);\n\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timeoutId);\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n },\n { once: true },\n );\n });\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs`)
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs`);require(`../../node_modules/@openhands/typescript-client/dist/clients.cjs`);const t=require(`../../utils/websocket-url.cjs`),n=require(`../backend-registry/active-store.cjs`),r=require(`../agent-server-client-options.cjs`),i=require(`../../node_modules/@openhands/typescript-client/dist/events/remote-events-list.cjs`),a=require(`../cloud/proxy.cjs`);var o=class{static async respondToConfirmation(i,o,s,c){let l=n.getActiveBackend().backend;return l.kind===`cloud`?a.callCloudProxy({backend:l,method:`POST`,hostOverride:t.buildHttpBaseUrl(o),path:`/api/conversations/${i}/events/respond_to_confirmation`,body:s,authMode:`session-api-key`,sessionApiKey:c}):new e.ConversationClient(r.getAgentServerClientOptions({conversationUrl:o,sessionApiKey:c})).respondToConfirmation(i,s)}static async getEventCount(i,o,s){let c=n.getActiveBackend().backend;return c.kind===`cloud`?a.callCloudProxy({backend:c,method:`GET`,hostOverride:t.buildHttpBaseUrl(o),path:`/api/conversations/${i}/events/count`,authMode:`session-api-key`,sessionApiKey:s}):new e.ConversationClient(r.getAgentServerClientOptions({conversationUrl:o,sessionApiKey:s})).getEventCount(i)}static async searchEvents(e,t,o,s={}){let c=n.getActiveBackend().backend,l=s.limit??100;if(c.kind===`cloud`){let t=Math.min(l,100),n=!!(s.sortOrder||s.pageId||s.timestampGte||s.timestampLt),r=new URLSearchParams;r.set(`limit`,String(t)),s.sortOrder&&r.set(`sort_order`,s.sortOrder),s.pageId&&r.set(`page_id`,s.pageId),s.timestampGte&&r.set(`timestamp__gte`,s.timestampGte),s.timestampLt&&r.set(`timestamp__lt`,s.timestampLt);let i=t=>a.callCloudProxy({backend:c,method:`GET`,path:`/api/v1/conversation/${e}/events/search?${t.toString()}`});try{let e=await i(r);return{items:e?.items??[],next_page_id:e?.next_page_id??null}}catch(e){if(!n)throw e;return console.warn(`[EventService] Cloud backend doesn't support pagination filters. Falling back to initial load only. Server needs OpenHands/OpenHands#14399.`),{items:[],next_page_id:null}}}let u=await new i.RemoteEventsList(r.getAgentServerHttpClientOptions({conversationUrl:t,sessionApiKey:o}),e).search({limit:l,...s.pageId?{page_id:s.pageId}:{},...s.sortOrder?{sort_order:s.sortOrder}:{},...s.timestampGte?{timestamp__gte:s.timestampGte}:{},...s.timestampLt?{timestamp__lt:s.timestampLt}:{}});return{items:u?.items??[],next_page_id:u?.next_page_id??null}}};exports.default=o;
|
|
2
2
|
//# sourceMappingURL=event-service.api.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-service.api.cjs","names":[],"sources":["../../../src/api/event-service/event-service.api.ts"],"sourcesContent":["import { ConversationClient } from \"@openhands/typescript-client/clients\";\nimport { RemoteEventsList } from \"@openhands/typescript-client/events/remote-events-list\";\nimport { OpenHandsEvent } from \"#/types/agent-server/core\";\nimport { buildHttpBaseUrl } from \"#/utils/websocket-url\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport {\n getAgentServerClientOptions,\n getAgentServerHttpClientOptions,\n} from \"../agent-server-client-options\";\nimport type {\n ConfirmationResponseRequest,\n ConfirmationResponseResponse,\n EventSearchOptions,\n EventSearchPage,\n} from \"./event-service.types\";\n\n/**\n * Cloud-mode REST calls are split between two upstream hosts (matching\n * OpenHands' cloud frontend):\n *\n * - **App API** (`backend.host`, default in `callCloudProxy`):\n * event *history* (`/api/v1/conversation/{id}/events/search`).\n * Persisted by the cloud backend — survives the runtime sandbox.\n *\n * - **Runtime sandbox** (extracted from `conversation.conversation_url`\n * and passed as `hostOverride`): live runtime endpoints like\n * `/api/conversations/{id}/events/count` and\n * `/api/conversations/{id}/events/respond_to_confirmation`. Auth on\n * these endpoints is `X-Session-API-Key`, not `Authorization: Bearer`.\n *\n * App API calls go directly to the cloud backend with bearer auth. Runtime\n * sandbox calls go through `/api/cloud-proxy`, which avoids depending on CORS\n * for per-conversation runtime hosts.\n *\n * Local mode keeps the existing typescript-client path: it targets the\n * conversation's host directly via typed client classes.\n */\nclass EventService {\n static async respondToConfirmation(\n conversationId: string,\n conversationUrl: string,\n request: ConfirmationResponseRequest,\n sessionApiKey?: string | null,\n ): Promise<ConfirmationResponseResponse> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<ConfirmationResponseResponse>({\n backend: active,\n method: \"POST\",\n hostOverride: buildHttpBaseUrl(conversationUrl),\n path: `/api/conversations/${conversationId}/events/respond_to_confirmation`,\n body: request,\n authMode: \"session-api-key\",\n sessionApiKey,\n });\n }\n\n return new ConversationClient(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n }),\n ).respondToConfirmation<ConfirmationResponseResponse>(\n conversationId,\n request,\n );\n }\n\n static async getEventCount(\n conversationId: string,\n conversationUrl: string,\n sessionApiKey?: string | null,\n ): Promise<number> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<number>({\n backend: active,\n method: \"GET\",\n hostOverride: buildHttpBaseUrl(conversationUrl),\n path: `/api/conversations/${conversationId}/events/count`,\n authMode: \"session-api-key\",\n sessionApiKey,\n });\n }\n\n return new ConversationClient(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n }),\n ).getEventCount(conversationId);\n }\n\n /**\n * Search events for a conversation. Returns the raw page so callers can\n * paginate (via `next_page_id`) and so REST-driven history loading can\n * tell when there are no more older events to load.\n */\n static async searchEvents(\n conversationId: string,\n conversationUrl?: string | null,\n sessionApiKey?: string | null,\n options: EventSearchOptions = {},\n ): Promise<EventSearchPage<OpenHandsEvent>> {\n const active = getActiveBackend().backend;\n const limit = options.limit ?? 100;\n\n if (active.kind === \"cloud\") {\n // Event *history* lives on the cloud App API, not the runtime\n // sandbox. Path is singular `conversation` and v1-prefixed.\n //\n // Full pagination params (sort_order, page_id, timestamp filters)\n // require the server-side fix from OpenHands/OpenHands#14399. If\n // the cloud backend hasn't been updated yet, the timestamp filters\n // trigger a 500 (str-vs-datetime comparison). We attempt the full\n // request first and fall back to a limit-only request on failure.\n const cloudLimit = Math.min(limit, 100);\n const hasFilterParams = !!(\n options.sortOrder ||\n options.pageId ||\n options.timestampGte ||\n options.timestampLt\n );\n\n const params = new URLSearchParams();\n params.set(\"limit\", String(cloudLimit));\n if (options.sortOrder) params.set(\"sort_order\", options.sortOrder);\n if (options.pageId) params.set(\"page_id\", options.pageId);\n if (options.timestampGte)\n params.set(\"timestamp__gte\", options.timestampGte);\n if (options.timestampLt) params.set(\"timestamp__lt\", options.timestampLt);\n\n const doCloudSearch = (searchParams: URLSearchParams) =>\n callCloudProxy<EventSearchPage<OpenHandsEvent>>({\n backend: active,\n method: \"GET\",\n path: `/api/v1/conversation/${conversationId}/events/search?${searchParams.toString()}`,\n });\n\n try {\n const data = await doCloudSearch(params);\n return {\n items: data?.items ?? [],\n next_page_id: data?.next_page_id ?? null,\n };\n } catch (err) {\n if (!hasFilterParams) throw err;\n\n // Server doesn't support timestamp filters yet — stop pagination\n // by returning an empty page so the UI doesn't retry indefinitely.\n // A limit-only fallback would return the same most-recent events\n // already in the store, which get deduped but keep hasMore=true.\n console.warn(\n \"[EventService] Cloud backend doesn't support pagination filters. \" +\n \"Falling back to initial load only. \" +\n \"Server needs OpenHands/OpenHands#14399.\",\n );\n return { items: [], next_page_id: null };\n }\n }\n\n const page = await new RemoteEventsList(\n getAgentServerHttpClientOptions({ conversationUrl, sessionApiKey }),\n conversationId,\n ).search({\n limit,\n ...(options.pageId ? { page_id: options.pageId } : {}),\n ...(options.sortOrder ? { sort_order: options.sortOrder } : {}),\n ...(options.timestampGte ? { timestamp__gte: options.timestampGte } : {}),\n ...(options.timestampLt ? { timestamp__lt: options.timestampLt } : {}),\n });\n\n return {\n items: (page?.items ?? []) as OpenHandsEvent[],\n next_page_id: page?.next_page_id ?? null,\n };\n }\n}\n\nexport default EventService;\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"event-service.api.cjs","names":[],"sources":["../../../src/api/event-service/event-service.api.ts"],"sourcesContent":["import { ConversationClient } from \"@openhands/typescript-client/clients\";\nimport { RemoteEventsList } from \"@openhands/typescript-client/events/remote-events-list\";\nimport { OpenHandsEvent } from \"#/types/agent-server/core\";\nimport { buildHttpBaseUrl } from \"#/utils/websocket-url\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport {\n getAgentServerClientOptions,\n getAgentServerHttpClientOptions,\n} from \"../agent-server-client-options\";\nimport type {\n ConfirmationResponseRequest,\n ConfirmationResponseResponse,\n EventSearchOptions,\n EventSearchPage,\n} from \"./event-service.types\";\n\n/**\n * Cloud-mode REST calls are split between two upstream hosts (matching\n * OpenHands' cloud frontend):\n *\n * - **App API** (`backend.host`, default in `callCloudProxy`):\n * event *history* (`/api/v1/conversation/{id}/events/search`).\n * Persisted by the cloud backend — survives the runtime sandbox.\n *\n * - **Runtime sandbox** (extracted from `conversation.conversation_url`\n * and passed as `hostOverride`): live runtime endpoints like\n * `/api/conversations/{id}/events/count` and\n * `/api/conversations/{id}/events/respond_to_confirmation`. Auth on\n * these endpoints is `X-Session-API-Key`, not `Authorization: Bearer`.\n *\n * App API calls go directly to the cloud backend with bearer auth. Runtime\n * sandbox calls go through `/api/cloud-proxy`, which avoids depending on CORS\n * for per-conversation runtime hosts.\n *\n * Local mode keeps the existing typescript-client path: it targets the\n * conversation's host directly via typed client classes.\n */\nclass EventService {\n static async respondToConfirmation(\n conversationId: string,\n conversationUrl: string,\n request: ConfirmationResponseRequest,\n sessionApiKey?: string | null,\n ): Promise<ConfirmationResponseResponse> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<ConfirmationResponseResponse>({\n backend: active,\n method: \"POST\",\n hostOverride: buildHttpBaseUrl(conversationUrl),\n path: `/api/conversations/${conversationId}/events/respond_to_confirmation`,\n body: request,\n authMode: \"session-api-key\",\n sessionApiKey,\n });\n }\n\n return new ConversationClient(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n }),\n ).respondToConfirmation<ConfirmationResponseResponse>(\n conversationId,\n request,\n );\n }\n\n static async getEventCount(\n conversationId: string,\n conversationUrl: string,\n sessionApiKey?: string | null,\n ): Promise<number> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<number>({\n backend: active,\n method: \"GET\",\n hostOverride: buildHttpBaseUrl(conversationUrl),\n path: `/api/conversations/${conversationId}/events/count`,\n authMode: \"session-api-key\",\n sessionApiKey,\n });\n }\n\n return new ConversationClient(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n }),\n ).getEventCount(conversationId);\n }\n\n /**\n * Search events for a conversation. Returns the raw page so callers can\n * paginate (via `next_page_id`) and so REST-driven history loading can\n * tell when there are no more older events to load.\n */\n static async searchEvents(\n conversationId: string,\n conversationUrl?: string | null,\n sessionApiKey?: string | null,\n options: EventSearchOptions = {},\n ): Promise<EventSearchPage<OpenHandsEvent>> {\n const active = getActiveBackend().backend;\n const limit = options.limit ?? 100;\n\n if (active.kind === \"cloud\") {\n // Event *history* lives on the cloud App API, not the runtime\n // sandbox. Path is singular `conversation` and v1-prefixed.\n //\n // Full pagination params (sort_order, page_id, timestamp filters)\n // require the server-side fix from OpenHands/OpenHands#14399. If\n // the cloud backend hasn't been updated yet, the timestamp filters\n // trigger a 500 (str-vs-datetime comparison). We attempt the full\n // request first and fall back to a limit-only request on failure.\n const cloudLimit = Math.min(limit, 100);\n const hasFilterParams = !!(\n options.sortOrder ||\n options.pageId ||\n options.timestampGte ||\n options.timestampLt\n );\n\n const params = new URLSearchParams();\n params.set(\"limit\", String(cloudLimit));\n if (options.sortOrder) params.set(\"sort_order\", options.sortOrder);\n if (options.pageId) params.set(\"page_id\", options.pageId);\n if (options.timestampGte)\n params.set(\"timestamp__gte\", options.timestampGte);\n if (options.timestampLt) params.set(\"timestamp__lt\", options.timestampLt);\n\n const doCloudSearch = (searchParams: URLSearchParams) =>\n callCloudProxy<EventSearchPage<OpenHandsEvent>>({\n backend: active,\n method: \"GET\",\n path: `/api/v1/conversation/${conversationId}/events/search?${searchParams.toString()}`,\n });\n\n try {\n const data = await doCloudSearch(params);\n return {\n items: data?.items ?? [],\n next_page_id: data?.next_page_id ?? null,\n };\n } catch (err) {\n if (!hasFilterParams) throw err;\n\n // Server doesn't support timestamp filters yet — stop pagination\n // by returning an empty page so the UI doesn't retry indefinitely.\n // A limit-only fallback would return the same most-recent events\n // already in the store, which get deduped but keep hasMore=true.\n console.warn(\n \"[EventService] Cloud backend doesn't support pagination filters. \" +\n \"Falling back to initial load only. \" +\n \"Server needs OpenHands/OpenHands#14399.\",\n );\n return { items: [], next_page_id: null };\n }\n }\n\n const page = await new RemoteEventsList(\n getAgentServerHttpClientOptions({ conversationUrl, sessionApiKey }),\n conversationId,\n ).search({\n limit,\n ...(options.pageId ? { page_id: options.pageId } : {}),\n ...(options.sortOrder ? { sort_order: options.sortOrder } : {}),\n ...(options.timestampGte ? { timestamp__gte: options.timestampGte } : {}),\n ...(options.timestampLt ? { timestamp__lt: options.timestampLt } : {}),\n });\n\n return {\n items: (page?.items ?? []) as OpenHandsEvent[],\n next_page_id: page?.next_page_id ?? null,\n };\n }\n}\n\nexport default EventService;\n"],"mappings":"sfAsCA,IAAM,EAAN,KAAmB,CACjB,aAAa,sBACX,EACA,EACA,EACA,EACuC,CACvC,IAAM,EAAS,EAAA,kBAAkB,CAAC,QAclC,OAZI,EAAO,OAAS,QACX,EAAA,eAA6C,CAClD,QAAS,EACT,OAAQ,OACR,aAAc,EAAA,iBAAiB,EAAgB,CAC/C,KAAM,sBAAsB,EAAe,iCAC3C,KAAM,EACN,SAAU,kBACV,gBACD,CAAC,CAGG,IAAI,EAAA,mBACT,EAAA,4BAA4B,CAC1B,kBACA,gBACD,CAAC,CACH,CAAC,sBACA,EACA,EACD,CAGH,aAAa,cACX,EACA,EACA,EACiB,CACjB,IAAM,EAAS,EAAA,kBAAkB,CAAC,QAalC,OAXI,EAAO,OAAS,QACX,EAAA,eAAuB,CAC5B,QAAS,EACT,OAAQ,MACR,aAAc,EAAA,iBAAiB,EAAgB,CAC/C,KAAM,sBAAsB,EAAe,eAC3C,SAAU,kBACV,gBACD,CAAC,CAGG,IAAI,EAAA,mBACT,EAAA,4BAA4B,CAC1B,kBACA,gBACD,CAAC,CACH,CAAC,cAAc,EAAe,CAQjC,aAAa,aACX,EACA,EACA,EACA,EAA8B,EAAE,CACU,CAC1C,IAAM,EAAS,EAAA,kBAAkB,CAAC,QAC5B,EAAQ,EAAQ,OAAS,IAE/B,GAAI,EAAO,OAAS,QAAS,CAS3B,IAAM,EAAa,KAAK,IAAI,EAAO,IAAI,CACjC,EAAkB,CAAC,EACvB,EAAQ,WACR,EAAQ,QACR,EAAQ,cACR,EAAQ,aAGJ,EAAS,IAAI,gBACnB,EAAO,IAAI,QAAS,OAAO,EAAW,CAAC,CACnC,EAAQ,WAAW,EAAO,IAAI,aAAc,EAAQ,UAAU,CAC9D,EAAQ,QAAQ,EAAO,IAAI,UAAW,EAAQ,OAAO,CACrD,EAAQ,cACV,EAAO,IAAI,iBAAkB,EAAQ,aAAa,CAChD,EAAQ,aAAa,EAAO,IAAI,gBAAiB,EAAQ,YAAY,CAEzE,IAAM,EAAiB,GACrB,EAAA,eAAgD,CAC9C,QAAS,EACT,OAAQ,MACR,KAAM,wBAAwB,EAAe,iBAAiB,EAAa,UAAU,GACtF,CAAC,CAEJ,GAAI,CACF,IAAM,EAAO,MAAM,EAAc,EAAO,CACxC,MAAO,CACL,MAAO,GAAM,OAAS,EAAE,CACxB,aAAc,GAAM,cAAgB,KACrC,OACM,EAAK,CACZ,GAAI,CAAC,EAAiB,MAAM,EAW5B,OALA,QAAQ,KACN,8IAGD,CACM,CAAE,MAAO,EAAE,CAAE,aAAc,KAAM,EAI5C,IAAM,EAAO,MAAM,IAAI,EAAA,iBACrB,EAAA,gCAAgC,CAAE,kBAAiB,gBAAe,CAAC,CACnE,EACD,CAAC,OAAO,CACP,QACA,GAAI,EAAQ,OAAS,CAAE,QAAS,EAAQ,OAAQ,CAAG,EAAE,CACrD,GAAI,EAAQ,UAAY,CAAE,WAAY,EAAQ,UAAW,CAAG,EAAE,CAC9D,GAAI,EAAQ,aAAe,CAAE,eAAgB,EAAQ,aAAc,CAAG,EAAE,CACxE,GAAI,EAAQ,YAAc,CAAE,cAAe,EAAQ,YAAa,CAAG,EAAE,CACtE,CAAC,CAEF,MAAO,CACL,MAAQ,GAAM,OAAS,EAAE,CACzB,aAAc,GAAM,cAAgB,KACrC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ConversationClient as e } from "../../node_modules/@openhands/typescript-client/dist/client/conversation-client.js";
|
|
2
|
+
import "../../node_modules/@openhands/typescript-client/dist/clients.js";
|
|
2
3
|
import { buildHttpBaseUrl as t } from "../../utils/websocket-url.js";
|
|
3
4
|
import { getActiveBackend as n } from "../backend-registry/active-store.js";
|
|
4
5
|
import { getAgentServerClientOptions as r, getAgentServerHttpClientOptions as i } from "../agent-server-client-options.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-service.api.js","names":[],"sources":["../../../src/api/event-service/event-service.api.ts"],"sourcesContent":["import { ConversationClient } from \"@openhands/typescript-client/clients\";\nimport { RemoteEventsList } from \"@openhands/typescript-client/events/remote-events-list\";\nimport { OpenHandsEvent } from \"#/types/agent-server/core\";\nimport { buildHttpBaseUrl } from \"#/utils/websocket-url\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport {\n getAgentServerClientOptions,\n getAgentServerHttpClientOptions,\n} from \"../agent-server-client-options\";\nimport type {\n ConfirmationResponseRequest,\n ConfirmationResponseResponse,\n EventSearchOptions,\n EventSearchPage,\n} from \"./event-service.types\";\n\n/**\n * Cloud-mode REST calls are split between two upstream hosts (matching\n * OpenHands' cloud frontend):\n *\n * - **App API** (`backend.host`, default in `callCloudProxy`):\n * event *history* (`/api/v1/conversation/{id}/events/search`).\n * Persisted by the cloud backend — survives the runtime sandbox.\n *\n * - **Runtime sandbox** (extracted from `conversation.conversation_url`\n * and passed as `hostOverride`): live runtime endpoints like\n * `/api/conversations/{id}/events/count` and\n * `/api/conversations/{id}/events/respond_to_confirmation`. Auth on\n * these endpoints is `X-Session-API-Key`, not `Authorization: Bearer`.\n *\n * App API calls go directly to the cloud backend with bearer auth. Runtime\n * sandbox calls go through `/api/cloud-proxy`, which avoids depending on CORS\n * for per-conversation runtime hosts.\n *\n * Local mode keeps the existing typescript-client path: it targets the\n * conversation's host directly via typed client classes.\n */\nclass EventService {\n static async respondToConfirmation(\n conversationId: string,\n conversationUrl: string,\n request: ConfirmationResponseRequest,\n sessionApiKey?: string | null,\n ): Promise<ConfirmationResponseResponse> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<ConfirmationResponseResponse>({\n backend: active,\n method: \"POST\",\n hostOverride: buildHttpBaseUrl(conversationUrl),\n path: `/api/conversations/${conversationId}/events/respond_to_confirmation`,\n body: request,\n authMode: \"session-api-key\",\n sessionApiKey,\n });\n }\n\n return new ConversationClient(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n }),\n ).respondToConfirmation<ConfirmationResponseResponse>(\n conversationId,\n request,\n );\n }\n\n static async getEventCount(\n conversationId: string,\n conversationUrl: string,\n sessionApiKey?: string | null,\n ): Promise<number> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<number>({\n backend: active,\n method: \"GET\",\n hostOverride: buildHttpBaseUrl(conversationUrl),\n path: `/api/conversations/${conversationId}/events/count`,\n authMode: \"session-api-key\",\n sessionApiKey,\n });\n }\n\n return new ConversationClient(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n }),\n ).getEventCount(conversationId);\n }\n\n /**\n * Search events for a conversation. Returns the raw page so callers can\n * paginate (via `next_page_id`) and so REST-driven history loading can\n * tell when there are no more older events to load.\n */\n static async searchEvents(\n conversationId: string,\n conversationUrl?: string | null,\n sessionApiKey?: string | null,\n options: EventSearchOptions = {},\n ): Promise<EventSearchPage<OpenHandsEvent>> {\n const active = getActiveBackend().backend;\n const limit = options.limit ?? 100;\n\n if (active.kind === \"cloud\") {\n // Event *history* lives on the cloud App API, not the runtime\n // sandbox. Path is singular `conversation` and v1-prefixed.\n //\n // Full pagination params (sort_order, page_id, timestamp filters)\n // require the server-side fix from OpenHands/OpenHands#14399. If\n // the cloud backend hasn't been updated yet, the timestamp filters\n // trigger a 500 (str-vs-datetime comparison). We attempt the full\n // request first and fall back to a limit-only request on failure.\n const cloudLimit = Math.min(limit, 100);\n const hasFilterParams = !!(\n options.sortOrder ||\n options.pageId ||\n options.timestampGte ||\n options.timestampLt\n );\n\n const params = new URLSearchParams();\n params.set(\"limit\", String(cloudLimit));\n if (options.sortOrder) params.set(\"sort_order\", options.sortOrder);\n if (options.pageId) params.set(\"page_id\", options.pageId);\n if (options.timestampGte)\n params.set(\"timestamp__gte\", options.timestampGte);\n if (options.timestampLt) params.set(\"timestamp__lt\", options.timestampLt);\n\n const doCloudSearch = (searchParams: URLSearchParams) =>\n callCloudProxy<EventSearchPage<OpenHandsEvent>>({\n backend: active,\n method: \"GET\",\n path: `/api/v1/conversation/${conversationId}/events/search?${searchParams.toString()}`,\n });\n\n try {\n const data = await doCloudSearch(params);\n return {\n items: data?.items ?? [],\n next_page_id: data?.next_page_id ?? null,\n };\n } catch (err) {\n if (!hasFilterParams) throw err;\n\n // Server doesn't support timestamp filters yet — stop pagination\n // by returning an empty page so the UI doesn't retry indefinitely.\n // A limit-only fallback would return the same most-recent events\n // already in the store, which get deduped but keep hasMore=true.\n console.warn(\n \"[EventService] Cloud backend doesn't support pagination filters. \" +\n \"Falling back to initial load only. \" +\n \"Server needs OpenHands/OpenHands#14399.\",\n );\n return { items: [], next_page_id: null };\n }\n }\n\n const page = await new RemoteEventsList(\n getAgentServerHttpClientOptions({ conversationUrl, sessionApiKey }),\n conversationId,\n ).search({\n limit,\n ...(options.pageId ? { page_id: options.pageId } : {}),\n ...(options.sortOrder ? { sort_order: options.sortOrder } : {}),\n ...(options.timestampGte ? { timestamp__gte: options.timestampGte } : {}),\n ...(options.timestampLt ? { timestamp__lt: options.timestampLt } : {}),\n });\n\n return {\n items: (page?.items ?? []) as OpenHandsEvent[],\n next_page_id: page?.next_page_id ?? null,\n };\n }\n}\n\nexport default EventService;\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"event-service.api.js","names":[],"sources":["../../../src/api/event-service/event-service.api.ts"],"sourcesContent":["import { ConversationClient } from \"@openhands/typescript-client/clients\";\nimport { RemoteEventsList } from \"@openhands/typescript-client/events/remote-events-list\";\nimport { OpenHandsEvent } from \"#/types/agent-server/core\";\nimport { buildHttpBaseUrl } from \"#/utils/websocket-url\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport {\n getAgentServerClientOptions,\n getAgentServerHttpClientOptions,\n} from \"../agent-server-client-options\";\nimport type {\n ConfirmationResponseRequest,\n ConfirmationResponseResponse,\n EventSearchOptions,\n EventSearchPage,\n} from \"./event-service.types\";\n\n/**\n * Cloud-mode REST calls are split between two upstream hosts (matching\n * OpenHands' cloud frontend):\n *\n * - **App API** (`backend.host`, default in `callCloudProxy`):\n * event *history* (`/api/v1/conversation/{id}/events/search`).\n * Persisted by the cloud backend — survives the runtime sandbox.\n *\n * - **Runtime sandbox** (extracted from `conversation.conversation_url`\n * and passed as `hostOverride`): live runtime endpoints like\n * `/api/conversations/{id}/events/count` and\n * `/api/conversations/{id}/events/respond_to_confirmation`. Auth on\n * these endpoints is `X-Session-API-Key`, not `Authorization: Bearer`.\n *\n * App API calls go directly to the cloud backend with bearer auth. Runtime\n * sandbox calls go through `/api/cloud-proxy`, which avoids depending on CORS\n * for per-conversation runtime hosts.\n *\n * Local mode keeps the existing typescript-client path: it targets the\n * conversation's host directly via typed client classes.\n */\nclass EventService {\n static async respondToConfirmation(\n conversationId: string,\n conversationUrl: string,\n request: ConfirmationResponseRequest,\n sessionApiKey?: string | null,\n ): Promise<ConfirmationResponseResponse> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<ConfirmationResponseResponse>({\n backend: active,\n method: \"POST\",\n hostOverride: buildHttpBaseUrl(conversationUrl),\n path: `/api/conversations/${conversationId}/events/respond_to_confirmation`,\n body: request,\n authMode: \"session-api-key\",\n sessionApiKey,\n });\n }\n\n return new ConversationClient(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n }),\n ).respondToConfirmation<ConfirmationResponseResponse>(\n conversationId,\n request,\n );\n }\n\n static async getEventCount(\n conversationId: string,\n conversationUrl: string,\n sessionApiKey?: string | null,\n ): Promise<number> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<number>({\n backend: active,\n method: \"GET\",\n hostOverride: buildHttpBaseUrl(conversationUrl),\n path: `/api/conversations/${conversationId}/events/count`,\n authMode: \"session-api-key\",\n sessionApiKey,\n });\n }\n\n return new ConversationClient(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n }),\n ).getEventCount(conversationId);\n }\n\n /**\n * Search events for a conversation. Returns the raw page so callers can\n * paginate (via `next_page_id`) and so REST-driven history loading can\n * tell when there are no more older events to load.\n */\n static async searchEvents(\n conversationId: string,\n conversationUrl?: string | null,\n sessionApiKey?: string | null,\n options: EventSearchOptions = {},\n ): Promise<EventSearchPage<OpenHandsEvent>> {\n const active = getActiveBackend().backend;\n const limit = options.limit ?? 100;\n\n if (active.kind === \"cloud\") {\n // Event *history* lives on the cloud App API, not the runtime\n // sandbox. Path is singular `conversation` and v1-prefixed.\n //\n // Full pagination params (sort_order, page_id, timestamp filters)\n // require the server-side fix from OpenHands/OpenHands#14399. If\n // the cloud backend hasn't been updated yet, the timestamp filters\n // trigger a 500 (str-vs-datetime comparison). We attempt the full\n // request first and fall back to a limit-only request on failure.\n const cloudLimit = Math.min(limit, 100);\n const hasFilterParams = !!(\n options.sortOrder ||\n options.pageId ||\n options.timestampGte ||\n options.timestampLt\n );\n\n const params = new URLSearchParams();\n params.set(\"limit\", String(cloudLimit));\n if (options.sortOrder) params.set(\"sort_order\", options.sortOrder);\n if (options.pageId) params.set(\"page_id\", options.pageId);\n if (options.timestampGte)\n params.set(\"timestamp__gte\", options.timestampGte);\n if (options.timestampLt) params.set(\"timestamp__lt\", options.timestampLt);\n\n const doCloudSearch = (searchParams: URLSearchParams) =>\n callCloudProxy<EventSearchPage<OpenHandsEvent>>({\n backend: active,\n method: \"GET\",\n path: `/api/v1/conversation/${conversationId}/events/search?${searchParams.toString()}`,\n });\n\n try {\n const data = await doCloudSearch(params);\n return {\n items: data?.items ?? [],\n next_page_id: data?.next_page_id ?? null,\n };\n } catch (err) {\n if (!hasFilterParams) throw err;\n\n // Server doesn't support timestamp filters yet — stop pagination\n // by returning an empty page so the UI doesn't retry indefinitely.\n // A limit-only fallback would return the same most-recent events\n // already in the store, which get deduped but keep hasMore=true.\n console.warn(\n \"[EventService] Cloud backend doesn't support pagination filters. \" +\n \"Falling back to initial load only. \" +\n \"Server needs OpenHands/OpenHands#14399.\",\n );\n return { items: [], next_page_id: null };\n }\n }\n\n const page = await new RemoteEventsList(\n getAgentServerHttpClientOptions({ conversationUrl, sessionApiKey }),\n conversationId,\n ).search({\n limit,\n ...(options.pageId ? { page_id: options.pageId } : {}),\n ...(options.sortOrder ? { sort_order: options.sortOrder } : {}),\n ...(options.timestampGte ? { timestamp__gte: options.timestampGte } : {}),\n ...(options.timestampLt ? { timestamp__lt: options.timestampLt } : {}),\n });\n\n return {\n items: (page?.items ?? []) as OpenHandsEvent[],\n next_page_id: page?.next_page_id ?? null,\n };\n }\n}\n\nexport default EventService;\n"],"mappings":";;;;;;;;AAsCA,IAAM,IAAN,MAAmB;CACjB,aAAa,sBACX,GACA,GACA,GACA,GACuC;EACvC,IAAM,IAAS,GAAkB,CAAC;AAclC,SAZI,EAAO,SAAS,UACX,EAA6C;GAClD,SAAS;GACT,QAAQ;GACR,cAAc,EAAiB,EAAgB;GAC/C,MAAM,sBAAsB,EAAe;GAC3C,MAAM;GACN,UAAU;GACV;GACD,CAAC,GAGG,IAAI,EACT,EAA4B;GAC1B;GACA;GACD,CAAC,CACH,CAAC,sBACA,GACA,EACD;;CAGH,aAAa,cACX,GACA,GACA,GACiB;EACjB,IAAM,IAAS,GAAkB,CAAC;AAalC,SAXI,EAAO,SAAS,UACX,EAAuB;GAC5B,SAAS;GACT,QAAQ;GACR,cAAc,EAAiB,EAAgB;GAC/C,MAAM,sBAAsB,EAAe;GAC3C,UAAU;GACV;GACD,CAAC,GAGG,IAAI,EACT,EAA4B;GAC1B;GACA;GACD,CAAC,CACH,CAAC,cAAc,EAAe;;CAQjC,aAAa,aACX,GACA,GACA,GACA,IAA8B,EAAE,EACU;EAC1C,IAAM,IAAS,GAAkB,CAAC,SAC5B,IAAQ,EAAQ,SAAS;AAE/B,MAAI,EAAO,SAAS,SAAS;GAS3B,IAAM,IAAa,KAAK,IAAI,GAAO,IAAI,EACjC,IAAkB,CAAC,EACvB,EAAQ,aACR,EAAQ,UACR,EAAQ,gBACR,EAAQ,cAGJ,IAAS,IAAI,iBAAiB;AAMpC,GALA,EAAO,IAAI,SAAS,OAAO,EAAW,CAAC,EACnC,EAAQ,aAAW,EAAO,IAAI,cAAc,EAAQ,UAAU,EAC9D,EAAQ,UAAQ,EAAO,IAAI,WAAW,EAAQ,OAAO,EACrD,EAAQ,gBACV,EAAO,IAAI,kBAAkB,EAAQ,aAAa,EAChD,EAAQ,eAAa,EAAO,IAAI,iBAAiB,EAAQ,YAAY;GAEzE,IAAM,KAAiB,MACrB,EAAgD;IAC9C,SAAS;IACT,QAAQ;IACR,MAAM,wBAAwB,EAAe,iBAAiB,EAAa,UAAU;IACtF,CAAC;AAEJ,OAAI;IACF,IAAM,IAAO,MAAM,EAAc,EAAO;AACxC,WAAO;KACL,OAAO,GAAM,SAAS,EAAE;KACxB,cAAc,GAAM,gBAAgB;KACrC;YACM,GAAK;AACZ,QAAI,CAAC,EAAiB,OAAM;AAW5B,WALA,QAAQ,KACN,8IAGD,EACM;KAAE,OAAO,EAAE;KAAE,cAAc;KAAM;;;EAI5C,IAAM,IAAO,MAAM,IAAI,EACrB,EAAgC;GAAE;GAAiB;GAAe,CAAC,EACnE,EACD,CAAC,OAAO;GACP;GACA,GAAI,EAAQ,SAAS,EAAE,SAAS,EAAQ,QAAQ,GAAG,EAAE;GACrD,GAAI,EAAQ,YAAY,EAAE,YAAY,EAAQ,WAAW,GAAG,EAAE;GAC9D,GAAI,EAAQ,eAAe,EAAE,gBAAgB,EAAQ,cAAc,GAAG,EAAE;GACxE,GAAI,EAAQ,cAAc,EAAE,eAAe,EAAQ,aAAa,GAAG,EAAE;GACtE,CAAC;AAEF,SAAO;GACL,OAAQ,GAAM,SAAS,EAAE;GACzB,cAAc,GAAM,gBAAgB;GACrC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../settings-service/settings-service.api.cjs`)
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../utils/mcp-config.cjs`),t=require(`../settings-service/settings-service.api.cjs`),n=require(`../../types/mcp-auth.cjs`);var r=e=>!!e&&typeof e==`object`&&!Array.isArray(e),i=e=>{if(!r(e))return;let t=Object.entries(e).filter(e=>typeof e[1]==`string`);return t.length>0?Object.fromEntries(t):void 0},a=e=>!!e&&Object.values(e).some(e=>e===`**********`),o=(e,t)=>e===`sse`?t===`sse`:e===`shttp`?t===void 0||t===`http`||t===`shttp`||t===`streamable-http`:!1,s=e=>{if(!e)return;let t=/^stdio-(\d+)$/.exec(e);return t?Number.parseInt(t[1],10):void 0},c=(e,t)=>{let n=s(e);if(n!==void 0)return Object.entries(t).filter(([,e])=>!e.url)[n]?.[1]},l=(e,t)=>e.type===`stdio`?c(e.id,t)??(e.name?t[e.name]:void 0):e.name&&t[e.name]?t[e.name]:Object.values(t).find(t=>t.url===e.url&&o(e.type,t.transport));async function u(e){let n=(await t.default.fetchSettingsFromApi(`encrypted`)).agent_settings?.mcp_config;if(r(n))return l(e,n)}async function d(t){let r=t.type===`stdio`&&a(t.env),o=(t.type===`sse`||t.type===`shttp`)&&e.hasRedactedMcpSecretLeaf(t.auth);if(!r&&!o)return t;try{let e=await u(t);if(!e)return t;if(r){let n=i(e.env)??{},r=Object.fromEntries(Object.entries(t.env??{}).map(([e,t])=>[e,t===`**********`&&typeof n[e]==`string`?n[e]:t]));return{...t,env:r}}return o&&n.isMcpAuthCredential(e.auth)?{...t,auth:e.auth}:t}catch{return t}}exports.substituteRedactedMcpCredentials=d;
|
|
2
2
|
//# sourceMappingURL=mcp-redacted-credentials.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-redacted-credentials.cjs","names":[],"sources":["../../../src/api/mcp-service/mcp-redacted-credentials.ts"],"sourcesContent":["import SettingsService from \"#/api/settings-service/settings-service.api\";\nimport type { MCPServerConfig } from \"#/types/mcp-server\";\nimport {
|
|
1
|
+
{"version":3,"file":"mcp-redacted-credentials.cjs","names":[],"sources":["../../../src/api/mcp-service/mcp-redacted-credentials.ts"],"sourcesContent":["import SettingsService from \"#/api/settings-service/settings-service.api\";\nimport { isMcpAuthCredential } from \"#/types/mcp-auth\";\nimport type { MCPServerConfig } from \"#/types/mcp-server\";\nimport {\n hasRedactedMcpSecretLeaf,\n REDACTED_MCP_SECRET_VALUE,\n} from \"#/utils/mcp-config\";\n\ntype StoredMcpServer = {\n url?: unknown;\n transport?: unknown;\n env?: unknown;\n auth?: unknown;\n headers?: unknown;\n};\n\ntype StoredMcpConfig = Record<string, StoredMcpServer>;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === \"object\" && !Array.isArray(value);\n\nconst stringRecord = (value: unknown): Record<string, string> | undefined => {\n if (!isRecord(value)) return undefined;\n const entries = Object.entries(value).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n );\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n};\n\nconst hasRedactedValue = (values: Record<string, string> | undefined) =>\n !!values &&\n Object.values(values).some((value) => value === REDACTED_MCP_SECRET_VALUE);\n\nconst remoteTransportMatches = (\n type: MCPServerConfig[\"type\"],\n transport: unknown,\n) => {\n if (type === \"sse\") return transport === \"sse\";\n if (type === \"shttp\") {\n return (\n transport === undefined ||\n transport === \"http\" ||\n transport === \"shttp\" ||\n transport === \"streamable-http\"\n );\n }\n return false;\n};\n\n// The editor assigns each stdio server an id of the form ``stdio-<i>`` matching\n// its position in ``parseMcpConfig``'s stdio array. That position is stable\n// across a rename because ``parseMcpConfig`` collects stdio entries (those\n// without a ``url``) in ``Object.entries`` order, identical for the redacted\n// and encrypted settings. Resolve the original stored entry by position so a\n// renamed stdio server still finds its stored encrypted env, instead of\n// looking it up by the new (no-longer-matching) display name.\nconst stdioIndexFromId = (id: string | undefined): number | undefined => {\n if (!id) return undefined;\n const match = /^stdio-(\\d+)$/.exec(id);\n return match ? Number.parseInt(match[1], 10) : undefined;\n};\n\nconst findStoredStdioByIndex = (\n id: string | undefined,\n storedServers: StoredMcpConfig,\n): StoredMcpServer | undefined => {\n const index = stdioIndexFromId(id);\n if (index === undefined) return undefined;\n const stdioEntries = Object.entries(storedServers).filter(\n ([, stored]) => !stored.url,\n );\n return stdioEntries[index]?.[1];\n};\n\nconst findStoredServer = (\n server: MCPServerConfig,\n storedServers: StoredMcpConfig,\n): StoredMcpServer | undefined => {\n if (server.type === \"stdio\") {\n // Prefer the positional id: a rename changes the display name (the stored\n // dict key), and a rename onto an existing name would otherwise restore the\n // wrong server's secrets. Fall back to a name match only when no id-based\n // position is available (e.g. configs built without an editor-assigned id).\n return (\n findStoredStdioByIndex(server.id, storedServers) ??\n (server.name ? storedServers[server.name] : undefined)\n );\n }\n\n if (server.name && storedServers[server.name]) {\n return storedServers[server.name];\n }\n\n return Object.values(storedServers).find(\n (stored) =>\n stored.url === server.url &&\n remoteTransportMatches(server.type, stored.transport),\n );\n};\n\nasync function fetchEncryptedStoredServer(\n server: MCPServerConfig,\n): Promise<StoredMcpServer | undefined> {\n const response = await SettingsService.fetchSettingsFromApi(\"encrypted\");\n const mcpConfig = response.agent_settings?.mcp_config;\n if (!isRecord(mcpConfig)) {\n return undefined;\n }\n return findStoredServer(server, mcpConfig as StoredMcpConfig);\n}\n\n/**\n * The MCP editor sees redacted settings (`**********`). When the user leaves\n * a secret unchanged, replace that placeholder with the stored encrypted\n * env/header/OAuth state value so tests and saves round-trip the real\n * credential without exposing plaintext in the browser.\n */\nexport async function substituteRedactedMcpCredentials(\n server: MCPServerConfig,\n): Promise<MCPServerConfig> {\n const redactedStdioEnv =\n server.type === \"stdio\" && hasRedactedValue(server.env);\n const redactedRemoteAuth =\n (server.type === \"sse\" || server.type === \"shttp\") &&\n hasRedactedMcpSecretLeaf(server.auth);\n\n if (!redactedStdioEnv && !redactedRemoteAuth) {\n return server;\n }\n\n try {\n const stored = await fetchEncryptedStoredServer(server);\n if (!stored) return server;\n\n if (redactedStdioEnv) {\n const storedEnv = stringRecord(stored.env) ?? {};\n const env = Object.fromEntries(\n Object.entries(server.env ?? {}).map(([key, value]) => [\n key,\n value === REDACTED_MCP_SECRET_VALUE &&\n typeof storedEnv[key] === \"string\"\n ? storedEnv[key]\n : value,\n ]),\n );\n return { ...server, env };\n }\n\n if (!redactedRemoteAuth) return server;\n if (isMcpAuthCredential(stored.auth)) {\n return { ...server, auth: stored.auth };\n }\n return server;\n } catch {\n return server;\n }\n}\n"],"mappings":"8LAkBA,IAAM,EAAY,GAChB,CAAC,CAAC,GAAS,OAAO,GAAU,UAAY,CAAC,MAAM,QAAQ,EAAM,CAEzD,EAAgB,GAAuD,CAC3E,GAAI,CAAC,EAAS,EAAM,CAAE,OACtB,IAAM,EAAU,OAAO,QAAQ,EAAM,CAAC,OACnC,GAAqC,OAAO,EAAM,IAAO,SAC3D,CACD,OAAO,EAAQ,OAAS,EAAI,OAAO,YAAY,EAAQ,CAAG,IAAA,IAGtD,EAAoB,GACxB,CAAC,CAAC,GACF,OAAO,OAAO,EAAO,CAAC,KAAM,GAAU,IAAA,aAAoC,CAEtE,GACJ,EACA,IAEI,IAAS,MAAc,IAAc,MACrC,IAAS,QAET,IAAc,IAAA,IACd,IAAc,QACd,IAAc,SACd,IAAc,kBAGX,GAUH,EAAoB,GAA+C,CACvE,GAAI,CAAC,EAAI,OACT,IAAM,EAAQ,gBAAgB,KAAK,EAAG,CACtC,OAAO,EAAQ,OAAO,SAAS,EAAM,GAAI,GAAG,CAAG,IAAA,IAG3C,GACJ,EACA,IACgC,CAChC,IAAM,EAAQ,EAAiB,EAAG,CAC9B,OAAU,IAAA,GAId,OAHqB,OAAO,QAAQ,EAAc,CAAC,QAChD,EAAG,KAAY,CAAC,EAAO,IAEnB,CAAa,KAAS,IAGzB,GACJ,EACA,IAEI,EAAO,OAAS,QAMhB,EAAuB,EAAO,GAAI,EAAc,GAC/C,EAAO,KAAO,EAAc,EAAO,MAAQ,IAAA,IAI5C,EAAO,MAAQ,EAAc,EAAO,MAC/B,EAAc,EAAO,MAGvB,OAAO,OAAO,EAAc,CAAC,KACjC,GACC,EAAO,MAAQ,EAAO,KACtB,EAAuB,EAAO,KAAM,EAAO,UAAU,CACxD,CAGH,eAAe,EACb,EACsC,CAEtC,IAAM,GAAY,MADK,EAAA,QAAgB,qBAAqB,YAAY,EAC7C,gBAAgB,WACtC,KAAS,EAAU,CAGxB,OAAO,EAAiB,EAAQ,EAA6B,CAS/D,eAAsB,EACpB,EAC0B,CAC1B,IAAM,EACJ,EAAO,OAAS,SAAW,EAAiB,EAAO,IAAI,CACnD,GACH,EAAO,OAAS,OAAS,EAAO,OAAS,UAC1C,EAAA,yBAAyB,EAAO,KAAK,CAEvC,GAAI,CAAC,GAAoB,CAAC,EACxB,OAAO,EAGT,GAAI,CACF,IAAM,EAAS,MAAM,EAA2B,EAAO,CACvD,GAAI,CAAC,EAAQ,OAAO,EAEpB,GAAI,EAAkB,CACpB,IAAM,EAAY,EAAa,EAAO,IAAI,EAAI,EAAE,CAC1C,EAAM,OAAO,YACjB,OAAO,QAAQ,EAAO,KAAO,EAAE,CAAC,CAAC,KAAK,CAAC,EAAK,KAAW,CACrD,EACA,IAAA,cACA,OAAO,EAAU,IAAS,SACtB,EAAU,GACV,EACL,CAAC,CACH,CACD,MAAO,CAAE,GAAG,EAAQ,MAAK,CAO3B,OAJK,GACD,EAAA,oBAAoB,EAAO,KAAK,CAC3B,CAAE,GAAG,EAAQ,KAAM,EAAO,KAAM,CAElC,OACD,CACN,OAAO"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { MCPServerConfig } from "#/types/mcp-server";
|
|
2
2
|
/**
|
|
3
|
-
* The MCP editor sees redacted settings (
|
|
3
|
+
* The MCP editor sees redacted settings (`**********`). When the user leaves
|
|
4
4
|
* a secret unchanged, replace that placeholder with the stored encrypted
|
|
5
|
-
* env/header value so tests and saves round-trip the real
|
|
6
|
-
* exposing plaintext in the browser.
|
|
5
|
+
* env/header/OAuth state value so tests and saves round-trip the real
|
|
6
|
+
* credential without exposing plaintext in the browser.
|
|
7
7
|
*/
|
|
8
8
|
export declare function substituteRedactedMcpCredentials(server: MCPServerConfig): Promise<MCPServerConfig>;
|
|
@@ -1,46 +1,45 @@
|
|
|
1
|
-
import e from "
|
|
2
|
-
import "
|
|
1
|
+
import { hasRedactedMcpSecretLeaf as e } from "../../utils/mcp-config.js";
|
|
2
|
+
import t from "../settings-service/settings-service.api.js";
|
|
3
|
+
import { isMcpAuthCredential as n } from "../../types/mcp-auth.js";
|
|
3
4
|
//#region src/api/mcp-service/mcp-redacted-credentials.ts
|
|
4
|
-
var
|
|
5
|
-
if (!
|
|
6
|
-
let
|
|
7
|
-
return
|
|
8
|
-
},
|
|
5
|
+
var r = (e) => !!e && typeof e == "object" && !Array.isArray(e), i = (e) => {
|
|
6
|
+
if (!r(e)) return;
|
|
7
|
+
let t = Object.entries(e).filter((e) => typeof e[1] == "string");
|
|
8
|
+
return t.length > 0 ? Object.fromEntries(t) : void 0;
|
|
9
|
+
}, a = (e) => !!e && Object.values(e).some((e) => e === "**********"), o = (e, t) => e === "sse" ? t === "sse" : e === "shttp" ? t === void 0 || t === "http" || t === "shttp" || t === "streamable-http" : !1, s = (e) => {
|
|
9
10
|
if (!e) return;
|
|
10
11
|
let t = /^stdio-(\d+)$/.exec(e);
|
|
11
12
|
return t ? Number.parseInt(t[1], 10) : void 0;
|
|
12
|
-
},
|
|
13
|
-
let n =
|
|
13
|
+
}, c = (e, t) => {
|
|
14
|
+
let n = s(e);
|
|
14
15
|
if (n !== void 0) return Object.entries(t).filter(([, e]) => !e.url)[n]?.[1];
|
|
15
|
-
},
|
|
16
|
-
async function
|
|
17
|
-
let
|
|
18
|
-
if (
|
|
16
|
+
}, l = (e, t) => e.type === "stdio" ? c(e.id, t) ?? (e.name ? t[e.name] : void 0) : e.name && t[e.name] ? t[e.name] : Object.values(t).find((t) => t.url === e.url && o(e.type, t.transport));
|
|
17
|
+
async function u(e) {
|
|
18
|
+
let n = (await t.fetchSettingsFromApi("encrypted")).agent_settings?.mcp_config;
|
|
19
|
+
if (r(n)) return l(e, n);
|
|
19
20
|
}
|
|
20
|
-
async function
|
|
21
|
-
let
|
|
22
|
-
if (!
|
|
21
|
+
async function d(t) {
|
|
22
|
+
let r = t.type === "stdio" && a(t.env), o = (t.type === "sse" || t.type === "shttp") && e(t.auth);
|
|
23
|
+
if (!r && !o) return t;
|
|
23
24
|
try {
|
|
24
|
-
let
|
|
25
|
-
if (!
|
|
26
|
-
if (
|
|
27
|
-
let
|
|
25
|
+
let e = await u(t);
|
|
26
|
+
if (!e) return t;
|
|
27
|
+
if (r) {
|
|
28
|
+
let n = i(e.env) ?? {}, r = Object.fromEntries(Object.entries(t.env ?? {}).map(([e, t]) => [e, t === "**********" && typeof n[e] == "string" ? n[e] : t]));
|
|
28
29
|
return {
|
|
29
|
-
...
|
|
30
|
-
env:
|
|
30
|
+
...t,
|
|
31
|
+
env: r
|
|
31
32
|
};
|
|
32
33
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
headers: i
|
|
38
|
-
} : e;
|
|
34
|
+
return o && n(e.auth) ? {
|
|
35
|
+
...t,
|
|
36
|
+
auth: e.auth
|
|
37
|
+
} : t;
|
|
39
38
|
} catch {
|
|
40
|
-
return
|
|
39
|
+
return t;
|
|
41
40
|
}
|
|
42
41
|
}
|
|
43
42
|
//#endregion
|
|
44
|
-
export {
|
|
43
|
+
export { d as substituteRedactedMcpCredentials };
|
|
45
44
|
|
|
46
45
|
//# sourceMappingURL=mcp-redacted-credentials.js.map
|