@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-slash-command.cjs","names":[],"sources":["../../../src/hooks/chat/use-slash-command.ts"],"sourcesContent":["import { useState, useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useConversationSkills } from \"#/hooks/query/use-conversation-skills\";\nimport { SkillInfo } from \"#/types/settings\";\nimport { Microagent } from \"#/api/open-hands.types\";\nimport { BUILT_IN_COMMANDS, MODEL_COMMAND } from \"#/utils/constants\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useLlmProfiles } from \"#/hooks/query/use-llm-profiles\";\n\nexport type SlashCommandSkill = SkillInfo | Microagent;\n\nexport interface SlashCommandItem {\n skill: SlashCommandSkill;\n /** The slash command string, e.g. \"/random-number\" */\n command: string;\n}\n\ntype SlashCompletionKind = \"command\" | \"model-profile\";\n\n/** Get the cursor's character offset within a contentEditable element. */\nfunction getCursorOffset(element: HTMLElement): number {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return -1;\n const range = selection.getRangeAt(0);\n const preRange = range.cloneRange();\n preRange.selectNodeContents(element);\n preRange.setEnd(range.startContainer, range.startOffset);\n return preRange.toString().length;\n}\n\n/**\n * Hook for managing slash command autocomplete in the chat input.\n * Detects when user types \"/\" and provides filtered skill suggestions.\n * Only skills with explicit \"/\" triggers (TaskTrigger) appear in the menu.\n */\nexport const useSlashCommand = (\n chatInputRef: React.RefObject<HTMLDivElement | null>,\n) => {\n // Scope the skill catalog to this conversation's attached workspace so the\n // slash menu lists the same project skills that were loaded into it.\n const { data: skills, isLoading: isSkillsLoading } = useConversationSkills();\n const isCloud = useActiveBackend().backend.kind === \"cloud\";\n const { data: profilesData, isLoading: isProfilesLoading } = useLlmProfiles({\n enabled: !isCloud,\n });\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [filterText, setFilterText] = useState(\"\");\n const [completionKind, setCompletionKind] =\n useState<SlashCompletionKind>(\"command\");\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n // Build slash command items from built-in commands + skills:\n // - Built-in commands (like /new) are included for V1 conversations\n // - /new is cloud-only — local backends don't surface it\n // - /model is local-only — cloud backends don't have profiles\n // - Skills with explicit \"/\" triggers use those triggers\n // - AgentSkills without \"/\" triggers get a derived \"/<name>\" command\n const slashItems = useMemo(() => {\n const items: SlashCommandItem[] = BUILT_IN_COMMANDS.filter((cmd) => {\n if (cmd.command === \"/new\") return isCloud;\n if (cmd.command === MODEL_COMMAND) return !isCloud;\n return true;\n });\n\n // Wait for skills to finish initial load so all commands appear together\n if (isSkillsLoading) return items;\n\n if (!skills) return items;\n skills.forEach((skill) => {\n const triggers = skill.triggers || [];\n const slashTriggers = triggers.filter((t) => t.startsWith(\"/\"));\n\n if (slashTriggers.length > 0) {\n // Skill has explicit slash triggers\n slashTriggers.forEach((trigger) => {\n items.push({ skill, command: trigger });\n });\n } else if (skill.type === \"agentskills\") {\n // AgentSkills without slash triggers get a derived command\n items.push({ skill, command: `/${skill.name}` });\n }\n });\n return items;\n }, [skills, isSkillsLoading, isCloud]);\n\n const modelProfileItems = useMemo<SlashCommandItem[]>(() => {\n if (isCloud) return [];\n\n return (profilesData?.profiles ?? []).map((profile) => {\n const command = `${MODEL_COMMAND} ${profile.name}`;\n return {\n command,\n skill: {\n name: profile.name,\n type: \"agentskills\",\n content: profile.model\n ? `Switch to ${profile.model}`\n : \"Switch to this LLM profile\",\n triggers: [command],\n },\n };\n });\n }, [profilesData?.profiles, isCloud]);\n\n // Filter items based on user input after \"/\"\n const filteredItems = useMemo(() => {\n const sourceItems =\n completionKind === \"model-profile\" ? modelProfileItems : slashItems;\n if (!filterText) return sourceItems;\n const lower = filterText.toLowerCase();\n return sourceItems.filter(\n (item) =>\n item.command.toLowerCase().includes(lower) ||\n item.skill.name.toLowerCase().includes(lower) ||\n item.skill.content?.toLowerCase().includes(lower),\n );\n }, [completionKind, modelProfileItems, slashItems, filterText]);\n\n // Keep refs in sync so handleSlashKeyDown always reads the latest values,\n // avoiding stale closures from React's batched state updates.\n const isMenuOpenRef = useRef(isMenuOpen);\n isMenuOpenRef.current = isMenuOpen;\n const filteredItemsRef = useRef(filteredItems);\n filteredItemsRef.current = filteredItems;\n const selectedIndexRef = useRef(selectedIndex);\n selectedIndexRef.current = selectedIndex;\n\n // Reset selected index when the filter text changes\n useEffect(() => {\n setSelectedIndex(0);\n }, [filterText]);\n\n // Track the character range of the current slash word so selectItem can\n // replace only that portion instead of wiping the entire input.\n const slashRangeRef = useRef<{ start: number; end: number } | null>(null);\n\n // Detect a slash word at the cursor position.\n // Returns the filter text (characters after \"/\") and the range of the\n // slash word within the full input text, or null if no slash word found.\n const getSlashText = useCallback((): {\n kind: SlashCompletionKind;\n text: string;\n start: number;\n end: number;\n } | null => {\n const element = chatInputRef.current;\n if (!element) return null;\n\n // Strip trailing newlines that contentEditable can produce, but preserve\n // spaces so \"/command \" (after selection) won't re-trigger the menu.\n const text = (element.innerText || \"\").replace(/[\\n\\r]+$/, \"\");\n const cursor = getCursorOffset(element);\n if (cursor < 0) return null;\n\n const textBeforeCursor = text.slice(0, cursor);\n\n const modelMatch = textBeforeCursor.match(/(^|\\s)(\\/model(?:\\s+\\S*)?)$/);\n if (modelMatch) {\n const modelCommand = modelMatch[2];\n const start = textBeforeCursor.length - modelCommand.length;\n const afterCursor = text.slice(cursor);\n const trailing = afterCursor.match(/^\\S*/);\n const end = cursor + (trailing ? trailing[0].length : 0);\n\n return {\n kind: \"model-profile\",\n text: modelCommand.replace(/^\\/model(?:\\s+)?/, \"\"),\n start,\n end,\n };\n }\n\n // Match a \"/\" preceded by whitespace or at position 0, followed by\n // non-whitespace characters, ending right at the cursor.\n const match = textBeforeCursor.match(/(^|\\s)(\\/\\S*)$/);\n if (!match) return null;\n\n const slashWord = match[2]; // e.g. \"/hel\"\n const start = textBeforeCursor.length - slashWord.length;\n // The end of the slash word extends past the cursor to include any\n // contiguous non-whitespace characters (covers the case where the\n // cursor sits in the middle of a word).\n const afterCursor = text.slice(cursor);\n const trailing = afterCursor.match(/^\\S*/);\n const end = cursor + (trailing ? trailing[0].length : 0);\n\n return { kind: \"command\", text: slashWord.slice(1), start, end }; // strip leading \"/\"\n }, [chatInputRef]);\n\n // Update the menu state based on current input\n const updateSlashMenu = useCallback(() => {\n const result = getSlashText();\n const hasItems =\n result?.kind === \"model-profile\"\n ? modelProfileItems.length > 0 || isProfilesLoading\n : slashItems.length > 0;\n\n if (result !== null && hasItems) {\n setCompletionKind(result.kind);\n setFilterText(result.text);\n slashRangeRef.current = { start: result.start, end: result.end };\n setIsMenuOpen(true);\n } else {\n setIsMenuOpen(false);\n setFilterText(\"\");\n setCompletionKind(\"command\");\n slashRangeRef.current = null;\n }\n }, [\n getSlashText,\n isProfilesLoading,\n modelProfileItems.length,\n slashItems.length,\n ]);\n\n // Select an item and replace only the slash word with the command\n const selectItem = useCallback(\n (item: SlashCommandItem) => {\n const element = chatInputRef.current;\n if (!element) return;\n\n const slashRange = slashRangeRef.current;\n const currentText = (element.innerText || \"\").replace(/[\\n\\r]+$/, \"\");\n const replacement = `${item.command} `;\n\n if (slashRange) {\n // Splice the command into the text, replacing only the slash word\n element.textContent =\n currentText.slice(0, slashRange.start) +\n replacement +\n currentText.slice(slashRange.end);\n\n // Position cursor right after the inserted command + space\n const cursorPos = slashRange.start + replacement.length;\n const textNode = element.firstChild;\n if (textNode) {\n const range = document.createRange();\n const sel = window.getSelection();\n const offset = Math.min(cursorPos, textNode.textContent!.length);\n range.setStart(textNode, offset);\n range.collapse(true);\n sel?.removeAllRanges();\n sel?.addRange(range);\n }\n } else {\n // Fallback: replace everything (e.g. if range tracking failed)\n element.textContent = replacement;\n const range = document.createRange();\n const sel = window.getSelection();\n range.selectNodeContents(element);\n range.collapse(false);\n sel?.removeAllRanges();\n sel?.addRange(range);\n }\n\n setIsMenuOpen(false);\n setFilterText(\"\");\n setCompletionKind(\"command\");\n setSelectedIndex(0);\n slashRangeRef.current = null;\n\n // Trigger a native InputEvent so React's onInput fires (for smartResize etc.)\n element.dispatchEvent(new InputEvent(\"input\", { bubbles: true }));\n\n // Restore focus so keyboard events (Enter to submit) work after selection\n element.focus();\n },\n [chatInputRef],\n );\n\n // Handle keyboard navigation in the menu.\n // Uses refs to always read the latest state, avoiding stale closures.\n const handleSlashKeyDown = useCallback(\n (e: React.KeyboardEvent): boolean => {\n const items = filteredItemsRef.current;\n if (!isMenuOpenRef.current || items.length === 0) return false;\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setSelectedIndex((prev) => (prev < items.length - 1 ? prev + 1 : 0));\n return true;\n case \"ArrowUp\":\n e.preventDefault();\n setSelectedIndex((prev) => (prev > 0 ? prev - 1 : items.length - 1));\n return true;\n case \"Enter\":\n case \"Tab\": {\n const item = items[selectedIndexRef.current];\n if (!item) return false;\n e.preventDefault();\n selectItem(item);\n return true;\n }\n case \"Escape\":\n e.preventDefault();\n setIsMenuOpen(false);\n return true;\n // Cursor-movement keys: close the menu to avoid acting on a stale\n // slash-word range, but don't consume the event so the cursor moves.\n case \"ArrowLeft\":\n case \"ArrowRight\":\n case \"Home\":\n case \"End\":\n setIsMenuOpen(false);\n return false;\n default:\n return false;\n }\n },\n [selectItem],\n );\n\n const closeMenu = useCallback(() => setIsMenuOpen(false), []);\n\n return {\n isMenuOpen,\n filteredItems,\n selectedIndex,\n updateSlashMenu,\n selectItem,\n handleSlashKeyDown,\n closeMenu,\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-slash-command.cjs","names":[],"sources":["../../../src/hooks/chat/use-slash-command.ts"],"sourcesContent":["import { useState, useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useConversationSkills } from \"#/hooks/query/use-conversation-skills\";\nimport { SkillInfo } from \"#/types/settings\";\nimport { Microagent } from \"#/api/open-hands.types\";\nimport { BUILT_IN_COMMANDS, MODEL_COMMAND } from \"#/utils/constants\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useLlmProfiles } from \"#/hooks/query/use-llm-profiles\";\n\nexport type SlashCommandSkill = SkillInfo | Microagent;\n\nexport interface SlashCommandItem {\n skill: SlashCommandSkill;\n /** The slash command string, e.g. \"/random-number\" */\n command: string;\n}\n\ntype SlashCompletionKind = \"command\" | \"model-profile\";\n\n/** Get the cursor's character offset within a contentEditable element. */\nfunction getCursorOffset(element: HTMLElement): number {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return -1;\n const range = selection.getRangeAt(0);\n const preRange = range.cloneRange();\n preRange.selectNodeContents(element);\n preRange.setEnd(range.startContainer, range.startOffset);\n return preRange.toString().length;\n}\n\n/**\n * Hook for managing slash command autocomplete in the chat input.\n * Detects when user types \"/\" and provides filtered skill suggestions.\n * Only skills with explicit \"/\" triggers (TaskTrigger) appear in the menu.\n */\nexport const useSlashCommand = (\n chatInputRef: React.RefObject<HTMLDivElement | null>,\n) => {\n // Scope the skill catalog to this conversation's attached workspace so the\n // slash menu lists the same project skills that were loaded into it.\n const { data: skills, isLoading: isSkillsLoading } = useConversationSkills();\n const isCloud = useActiveBackend().backend.kind === \"cloud\";\n const { data: profilesData, isLoading: isProfilesLoading } = useLlmProfiles();\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [filterText, setFilterText] = useState(\"\");\n const [completionKind, setCompletionKind] =\n useState<SlashCompletionKind>(\"command\");\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n // Build slash command items from built-in commands + skills:\n // - Built-in commands (like /new) are included for V1 conversations\n // - /new is cloud-only — local backends don't surface it\n // - /model lists/switches LLM profiles; both local and cloud support them\n // - Skills with explicit \"/\" triggers use those triggers\n // - AgentSkills without \"/\" triggers get a derived \"/<name>\" command\n const slashItems = useMemo(() => {\n const items: SlashCommandItem[] = BUILT_IN_COMMANDS.filter((cmd) => {\n if (cmd.command === \"/new\") return isCloud;\n return true;\n });\n\n // Wait for skills to finish initial load so all commands appear together\n if (isSkillsLoading) return items;\n\n if (!skills) return items;\n skills.forEach((skill) => {\n const triggers = skill.triggers || [];\n const slashTriggers = triggers.filter((t) => t.startsWith(\"/\"));\n\n if (slashTriggers.length > 0) {\n // Skill has explicit slash triggers\n slashTriggers.forEach((trigger) => {\n items.push({ skill, command: trigger });\n });\n } else if (skill.type === \"agentskills\") {\n // AgentSkills without slash triggers get a derived command\n items.push({ skill, command: `/${skill.name}` });\n }\n });\n return items;\n }, [skills, isSkillsLoading, isCloud]);\n\n const modelProfileItems = useMemo<SlashCommandItem[]>(() => {\n return (profilesData?.profiles ?? []).map((profile) => {\n const command = `${MODEL_COMMAND} ${profile.name}`;\n return {\n command,\n skill: {\n name: profile.name,\n type: \"agentskills\",\n content: profile.model\n ? `Switch to ${profile.model}`\n : \"Switch to this LLM profile\",\n triggers: [command],\n },\n };\n });\n }, [profilesData?.profiles]);\n\n // Filter items based on user input after \"/\"\n const filteredItems = useMemo(() => {\n const sourceItems =\n completionKind === \"model-profile\" ? modelProfileItems : slashItems;\n if (!filterText) return sourceItems;\n const lower = filterText.toLowerCase();\n return sourceItems.filter(\n (item) =>\n item.command.toLowerCase().includes(lower) ||\n item.skill.name.toLowerCase().includes(lower) ||\n item.skill.content?.toLowerCase().includes(lower),\n );\n }, [completionKind, modelProfileItems, slashItems, filterText]);\n\n // Keep refs in sync so handleSlashKeyDown always reads the latest values,\n // avoiding stale closures from React's batched state updates.\n const isMenuOpenRef = useRef(isMenuOpen);\n isMenuOpenRef.current = isMenuOpen;\n const filteredItemsRef = useRef(filteredItems);\n filteredItemsRef.current = filteredItems;\n const selectedIndexRef = useRef(selectedIndex);\n selectedIndexRef.current = selectedIndex;\n\n // Reset selected index when the filter text changes\n useEffect(() => {\n setSelectedIndex(0);\n }, [filterText]);\n\n // Track the character range of the current slash word so selectItem can\n // replace only that portion instead of wiping the entire input.\n const slashRangeRef = useRef<{ start: number; end: number } | null>(null);\n\n // Detect a slash word at the cursor position.\n // Returns the filter text (characters after \"/\") and the range of the\n // slash word within the full input text, or null if no slash word found.\n const getSlashText = useCallback((): {\n kind: SlashCompletionKind;\n text: string;\n start: number;\n end: number;\n } | null => {\n const element = chatInputRef.current;\n if (!element) return null;\n\n // Strip trailing newlines that contentEditable can produce, but preserve\n // spaces so \"/command \" (after selection) won't re-trigger the menu.\n const text = (element.innerText || \"\").replace(/[\\n\\r]+$/, \"\");\n const cursor = getCursorOffset(element);\n if (cursor < 0) return null;\n\n const textBeforeCursor = text.slice(0, cursor);\n\n const modelMatch = textBeforeCursor.match(/(^|\\s)(\\/model(?:\\s+\\S*)?)$/);\n if (modelMatch) {\n const modelCommand = modelMatch[2];\n const start = textBeforeCursor.length - modelCommand.length;\n const afterCursor = text.slice(cursor);\n const trailing = afterCursor.match(/^\\S*/);\n const end = cursor + (trailing ? trailing[0].length : 0);\n\n return {\n kind: \"model-profile\",\n text: modelCommand.replace(/^\\/model(?:\\s+)?/, \"\"),\n start,\n end,\n };\n }\n\n // Match a \"/\" preceded by whitespace or at position 0, followed by\n // non-whitespace characters, ending right at the cursor.\n const match = textBeforeCursor.match(/(^|\\s)(\\/\\S*)$/);\n if (!match) return null;\n\n const slashWord = match[2]; // e.g. \"/hel\"\n const start = textBeforeCursor.length - slashWord.length;\n // The end of the slash word extends past the cursor to include any\n // contiguous non-whitespace characters (covers the case where the\n // cursor sits in the middle of a word).\n const afterCursor = text.slice(cursor);\n const trailing = afterCursor.match(/^\\S*/);\n const end = cursor + (trailing ? trailing[0].length : 0);\n\n return { kind: \"command\", text: slashWord.slice(1), start, end }; // strip leading \"/\"\n }, [chatInputRef]);\n\n // Update the menu state based on current input\n const updateSlashMenu = useCallback(() => {\n const result = getSlashText();\n const hasItems =\n result?.kind === \"model-profile\"\n ? modelProfileItems.length > 0 || isProfilesLoading\n : slashItems.length > 0;\n\n if (result !== null && hasItems) {\n setCompletionKind(result.kind);\n setFilterText(result.text);\n slashRangeRef.current = { start: result.start, end: result.end };\n setIsMenuOpen(true);\n } else {\n setIsMenuOpen(false);\n setFilterText(\"\");\n setCompletionKind(\"command\");\n slashRangeRef.current = null;\n }\n }, [\n getSlashText,\n isProfilesLoading,\n modelProfileItems.length,\n slashItems.length,\n ]);\n\n // Select an item and replace only the slash word with the command\n const selectItem = useCallback(\n (item: SlashCommandItem) => {\n const element = chatInputRef.current;\n if (!element) return;\n\n const slashRange = slashRangeRef.current;\n const currentText = (element.innerText || \"\").replace(/[\\n\\r]+$/, \"\");\n const replacement = `${item.command} `;\n\n if (slashRange) {\n // Splice the command into the text, replacing only the slash word\n element.textContent =\n currentText.slice(0, slashRange.start) +\n replacement +\n currentText.slice(slashRange.end);\n\n // Position cursor right after the inserted command + space\n const cursorPos = slashRange.start + replacement.length;\n const textNode = element.firstChild;\n if (textNode) {\n const range = document.createRange();\n const sel = window.getSelection();\n const offset = Math.min(cursorPos, textNode.textContent!.length);\n range.setStart(textNode, offset);\n range.collapse(true);\n sel?.removeAllRanges();\n sel?.addRange(range);\n }\n } else {\n // Fallback: replace everything (e.g. if range tracking failed)\n element.textContent = replacement;\n const range = document.createRange();\n const sel = window.getSelection();\n range.selectNodeContents(element);\n range.collapse(false);\n sel?.removeAllRanges();\n sel?.addRange(range);\n }\n\n setIsMenuOpen(false);\n setFilterText(\"\");\n setCompletionKind(\"command\");\n setSelectedIndex(0);\n slashRangeRef.current = null;\n\n // Trigger a native InputEvent so React's onInput fires (for smartResize etc.)\n element.dispatchEvent(new InputEvent(\"input\", { bubbles: true }));\n\n // Restore focus so keyboard events (Enter to submit) work after selection\n element.focus();\n },\n [chatInputRef],\n );\n\n // Handle keyboard navigation in the menu.\n // Uses refs to always read the latest state, avoiding stale closures.\n const handleSlashKeyDown = useCallback(\n (e: React.KeyboardEvent): boolean => {\n const items = filteredItemsRef.current;\n if (!isMenuOpenRef.current || items.length === 0) return false;\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setSelectedIndex((prev) => (prev < items.length - 1 ? prev + 1 : 0));\n return true;\n case \"ArrowUp\":\n e.preventDefault();\n setSelectedIndex((prev) => (prev > 0 ? prev - 1 : items.length - 1));\n return true;\n case \"Enter\":\n case \"Tab\": {\n const item = items[selectedIndexRef.current];\n if (!item) return false;\n e.preventDefault();\n selectItem(item);\n return true;\n }\n case \"Escape\":\n e.preventDefault();\n setIsMenuOpen(false);\n return true;\n // Cursor-movement keys: close the menu to avoid acting on a stale\n // slash-word range, but don't consume the event so the cursor moves.\n case \"ArrowLeft\":\n case \"ArrowRight\":\n case \"Home\":\n case \"End\":\n setIsMenuOpen(false);\n return false;\n default:\n return false;\n }\n },\n [selectItem],\n );\n\n const closeMenu = useCallback(() => setIsMenuOpen(false), []);\n\n return {\n isMenuOpen,\n filteredItems,\n selectedIndex,\n updateSlashMenu,\n selectItem,\n handleSlashKeyDown,\n closeMenu,\n };\n};\n"],"mappings":"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"}
|
|
@@ -11,8 +11,8 @@ function u(e) {
|
|
|
11
11
|
return r.selectNodeContents(e), r.setEnd(n.startContainer, n.startOffset), r.toString().length;
|
|
12
12
|
}
|
|
13
13
|
var d = (d) => {
|
|
14
|
-
let { data: f, isLoading: p } = r(), m = n().backend.kind === "cloud", { data: h, isLoading: g } = i(
|
|
15
|
-
let t = e.filter((e) => e.command === "/new" ? m :
|
|
14
|
+
let { data: f, isLoading: p } = r(), m = n().backend.kind === "cloud", { data: h, isLoading: g } = i(), [_, v] = l(!1), [y, b] = l(""), [x, S] = l("command"), [C, w] = l(0), T = s(() => {
|
|
15
|
+
let t = e.filter((e) => e.command === "/new" ? m : !0);
|
|
16
16
|
return p || !f || f.forEach((e) => {
|
|
17
17
|
let n = (e.triggers || []).filter((e) => e.startsWith("/"));
|
|
18
18
|
n.length > 0 ? n.forEach((n) => {
|
|
@@ -29,7 +29,7 @@ var d = (d) => {
|
|
|
29
29
|
f,
|
|
30
30
|
p,
|
|
31
31
|
m
|
|
32
|
-
]), E = s(() =>
|
|
32
|
+
]), E = s(() => (h?.profiles ?? []).map((e) => {
|
|
33
33
|
let n = `${t} ${e.name}`;
|
|
34
34
|
return {
|
|
35
35
|
command: n,
|
|
@@ -40,7 +40,7 @@ var d = (d) => {
|
|
|
40
40
|
triggers: [n]
|
|
41
41
|
}
|
|
42
42
|
};
|
|
43
|
-
}), [h?.profiles
|
|
43
|
+
}), [h?.profiles]), D = s(() => {
|
|
44
44
|
let e = x === "model-profile" ? E : T;
|
|
45
45
|
if (!y) return e;
|
|
46
46
|
let t = y.toLowerCase();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-slash-command.js","names":[],"sources":["../../../src/hooks/chat/use-slash-command.ts"],"sourcesContent":["import { useState, useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useConversationSkills } from \"#/hooks/query/use-conversation-skills\";\nimport { SkillInfo } from \"#/types/settings\";\nimport { Microagent } from \"#/api/open-hands.types\";\nimport { BUILT_IN_COMMANDS, MODEL_COMMAND } from \"#/utils/constants\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useLlmProfiles } from \"#/hooks/query/use-llm-profiles\";\n\nexport type SlashCommandSkill = SkillInfo | Microagent;\n\nexport interface SlashCommandItem {\n skill: SlashCommandSkill;\n /** The slash command string, e.g. \"/random-number\" */\n command: string;\n}\n\ntype SlashCompletionKind = \"command\" | \"model-profile\";\n\n/** Get the cursor's character offset within a contentEditable element. */\nfunction getCursorOffset(element: HTMLElement): number {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return -1;\n const range = selection.getRangeAt(0);\n const preRange = range.cloneRange();\n preRange.selectNodeContents(element);\n preRange.setEnd(range.startContainer, range.startOffset);\n return preRange.toString().length;\n}\n\n/**\n * Hook for managing slash command autocomplete in the chat input.\n * Detects when user types \"/\" and provides filtered skill suggestions.\n * Only skills with explicit \"/\" triggers (TaskTrigger) appear in the menu.\n */\nexport const useSlashCommand = (\n chatInputRef: React.RefObject<HTMLDivElement | null>,\n) => {\n // Scope the skill catalog to this conversation's attached workspace so the\n // slash menu lists the same project skills that were loaded into it.\n const { data: skills, isLoading: isSkillsLoading } = useConversationSkills();\n const isCloud = useActiveBackend().backend.kind === \"cloud\";\n const { data: profilesData, isLoading: isProfilesLoading } = useLlmProfiles({\n enabled: !isCloud,\n });\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [filterText, setFilterText] = useState(\"\");\n const [completionKind, setCompletionKind] =\n useState<SlashCompletionKind>(\"command\");\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n // Build slash command items from built-in commands + skills:\n // - Built-in commands (like /new) are included for V1 conversations\n // - /new is cloud-only — local backends don't surface it\n // - /model is local-only — cloud backends don't have profiles\n // - Skills with explicit \"/\" triggers use those triggers\n // - AgentSkills without \"/\" triggers get a derived \"/<name>\" command\n const slashItems = useMemo(() => {\n const items: SlashCommandItem[] = BUILT_IN_COMMANDS.filter((cmd) => {\n if (cmd.command === \"/new\") return isCloud;\n if (cmd.command === MODEL_COMMAND) return !isCloud;\n return true;\n });\n\n // Wait for skills to finish initial load so all commands appear together\n if (isSkillsLoading) return items;\n\n if (!skills) return items;\n skills.forEach((skill) => {\n const triggers = skill.triggers || [];\n const slashTriggers = triggers.filter((t) => t.startsWith(\"/\"));\n\n if (slashTriggers.length > 0) {\n // Skill has explicit slash triggers\n slashTriggers.forEach((trigger) => {\n items.push({ skill, command: trigger });\n });\n } else if (skill.type === \"agentskills\") {\n // AgentSkills without slash triggers get a derived command\n items.push({ skill, command: `/${skill.name}` });\n }\n });\n return items;\n }, [skills, isSkillsLoading, isCloud]);\n\n const modelProfileItems = useMemo<SlashCommandItem[]>(() => {\n if (isCloud) return [];\n\n return (profilesData?.profiles ?? []).map((profile) => {\n const command = `${MODEL_COMMAND} ${profile.name}`;\n return {\n command,\n skill: {\n name: profile.name,\n type: \"agentskills\",\n content: profile.model\n ? `Switch to ${profile.model}`\n : \"Switch to this LLM profile\",\n triggers: [command],\n },\n };\n });\n }, [profilesData?.profiles, isCloud]);\n\n // Filter items based on user input after \"/\"\n const filteredItems = useMemo(() => {\n const sourceItems =\n completionKind === \"model-profile\" ? modelProfileItems : slashItems;\n if (!filterText) return sourceItems;\n const lower = filterText.toLowerCase();\n return sourceItems.filter(\n (item) =>\n item.command.toLowerCase().includes(lower) ||\n item.skill.name.toLowerCase().includes(lower) ||\n item.skill.content?.toLowerCase().includes(lower),\n );\n }, [completionKind, modelProfileItems, slashItems, filterText]);\n\n // Keep refs in sync so handleSlashKeyDown always reads the latest values,\n // avoiding stale closures from React's batched state updates.\n const isMenuOpenRef = useRef(isMenuOpen);\n isMenuOpenRef.current = isMenuOpen;\n const filteredItemsRef = useRef(filteredItems);\n filteredItemsRef.current = filteredItems;\n const selectedIndexRef = useRef(selectedIndex);\n selectedIndexRef.current = selectedIndex;\n\n // Reset selected index when the filter text changes\n useEffect(() => {\n setSelectedIndex(0);\n }, [filterText]);\n\n // Track the character range of the current slash word so selectItem can\n // replace only that portion instead of wiping the entire input.\n const slashRangeRef = useRef<{ start: number; end: number } | null>(null);\n\n // Detect a slash word at the cursor position.\n // Returns the filter text (characters after \"/\") and the range of the\n // slash word within the full input text, or null if no slash word found.\n const getSlashText = useCallback((): {\n kind: SlashCompletionKind;\n text: string;\n start: number;\n end: number;\n } | null => {\n const element = chatInputRef.current;\n if (!element) return null;\n\n // Strip trailing newlines that contentEditable can produce, but preserve\n // spaces so \"/command \" (after selection) won't re-trigger the menu.\n const text = (element.innerText || \"\").replace(/[\\n\\r]+$/, \"\");\n const cursor = getCursorOffset(element);\n if (cursor < 0) return null;\n\n const textBeforeCursor = text.slice(0, cursor);\n\n const modelMatch = textBeforeCursor.match(/(^|\\s)(\\/model(?:\\s+\\S*)?)$/);\n if (modelMatch) {\n const modelCommand = modelMatch[2];\n const start = textBeforeCursor.length - modelCommand.length;\n const afterCursor = text.slice(cursor);\n const trailing = afterCursor.match(/^\\S*/);\n const end = cursor + (trailing ? trailing[0].length : 0);\n\n return {\n kind: \"model-profile\",\n text: modelCommand.replace(/^\\/model(?:\\s+)?/, \"\"),\n start,\n end,\n };\n }\n\n // Match a \"/\" preceded by whitespace or at position 0, followed by\n // non-whitespace characters, ending right at the cursor.\n const match = textBeforeCursor.match(/(^|\\s)(\\/\\S*)$/);\n if (!match) return null;\n\n const slashWord = match[2]; // e.g. \"/hel\"\n const start = textBeforeCursor.length - slashWord.length;\n // The end of the slash word extends past the cursor to include any\n // contiguous non-whitespace characters (covers the case where the\n // cursor sits in the middle of a word).\n const afterCursor = text.slice(cursor);\n const trailing = afterCursor.match(/^\\S*/);\n const end = cursor + (trailing ? trailing[0].length : 0);\n\n return { kind: \"command\", text: slashWord.slice(1), start, end }; // strip leading \"/\"\n }, [chatInputRef]);\n\n // Update the menu state based on current input\n const updateSlashMenu = useCallback(() => {\n const result = getSlashText();\n const hasItems =\n result?.kind === \"model-profile\"\n ? modelProfileItems.length > 0 || isProfilesLoading\n : slashItems.length > 0;\n\n if (result !== null && hasItems) {\n setCompletionKind(result.kind);\n setFilterText(result.text);\n slashRangeRef.current = { start: result.start, end: result.end };\n setIsMenuOpen(true);\n } else {\n setIsMenuOpen(false);\n setFilterText(\"\");\n setCompletionKind(\"command\");\n slashRangeRef.current = null;\n }\n }, [\n getSlashText,\n isProfilesLoading,\n modelProfileItems.length,\n slashItems.length,\n ]);\n\n // Select an item and replace only the slash word with the command\n const selectItem = useCallback(\n (item: SlashCommandItem) => {\n const element = chatInputRef.current;\n if (!element) return;\n\n const slashRange = slashRangeRef.current;\n const currentText = (element.innerText || \"\").replace(/[\\n\\r]+$/, \"\");\n const replacement = `${item.command} `;\n\n if (slashRange) {\n // Splice the command into the text, replacing only the slash word\n element.textContent =\n currentText.slice(0, slashRange.start) +\n replacement +\n currentText.slice(slashRange.end);\n\n // Position cursor right after the inserted command + space\n const cursorPos = slashRange.start + replacement.length;\n const textNode = element.firstChild;\n if (textNode) {\n const range = document.createRange();\n const sel = window.getSelection();\n const offset = Math.min(cursorPos, textNode.textContent!.length);\n range.setStart(textNode, offset);\n range.collapse(true);\n sel?.removeAllRanges();\n sel?.addRange(range);\n }\n } else {\n // Fallback: replace everything (e.g. if range tracking failed)\n element.textContent = replacement;\n const range = document.createRange();\n const sel = window.getSelection();\n range.selectNodeContents(element);\n range.collapse(false);\n sel?.removeAllRanges();\n sel?.addRange(range);\n }\n\n setIsMenuOpen(false);\n setFilterText(\"\");\n setCompletionKind(\"command\");\n setSelectedIndex(0);\n slashRangeRef.current = null;\n\n // Trigger a native InputEvent so React's onInput fires (for smartResize etc.)\n element.dispatchEvent(new InputEvent(\"input\", { bubbles: true }));\n\n // Restore focus so keyboard events (Enter to submit) work after selection\n element.focus();\n },\n [chatInputRef],\n );\n\n // Handle keyboard navigation in the menu.\n // Uses refs to always read the latest state, avoiding stale closures.\n const handleSlashKeyDown = useCallback(\n (e: React.KeyboardEvent): boolean => {\n const items = filteredItemsRef.current;\n if (!isMenuOpenRef.current || items.length === 0) return false;\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setSelectedIndex((prev) => (prev < items.length - 1 ? prev + 1 : 0));\n return true;\n case \"ArrowUp\":\n e.preventDefault();\n setSelectedIndex((prev) => (prev > 0 ? prev - 1 : items.length - 1));\n return true;\n case \"Enter\":\n case \"Tab\": {\n const item = items[selectedIndexRef.current];\n if (!item) return false;\n e.preventDefault();\n selectItem(item);\n return true;\n }\n case \"Escape\":\n e.preventDefault();\n setIsMenuOpen(false);\n return true;\n // Cursor-movement keys: close the menu to avoid acting on a stale\n // slash-word range, but don't consume the event so the cursor moves.\n case \"ArrowLeft\":\n case \"ArrowRight\":\n case \"Home\":\n case \"End\":\n setIsMenuOpen(false);\n return false;\n default:\n return false;\n }\n },\n [selectItem],\n );\n\n const closeMenu = useCallback(() => setIsMenuOpen(false), []);\n\n return {\n isMenuOpen,\n filteredItems,\n selectedIndex,\n updateSlashMenu,\n selectItem,\n handleSlashKeyDown,\n closeMenu,\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-slash-command.js","names":[],"sources":["../../../src/hooks/chat/use-slash-command.ts"],"sourcesContent":["import { useState, useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { useConversationSkills } from \"#/hooks/query/use-conversation-skills\";\nimport { SkillInfo } from \"#/types/settings\";\nimport { Microagent } from \"#/api/open-hands.types\";\nimport { BUILT_IN_COMMANDS, MODEL_COMMAND } from \"#/utils/constants\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useLlmProfiles } from \"#/hooks/query/use-llm-profiles\";\n\nexport type SlashCommandSkill = SkillInfo | Microagent;\n\nexport interface SlashCommandItem {\n skill: SlashCommandSkill;\n /** The slash command string, e.g. \"/random-number\" */\n command: string;\n}\n\ntype SlashCompletionKind = \"command\" | \"model-profile\";\n\n/** Get the cursor's character offset within a contentEditable element. */\nfunction getCursorOffset(element: HTMLElement): number {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return -1;\n const range = selection.getRangeAt(0);\n const preRange = range.cloneRange();\n preRange.selectNodeContents(element);\n preRange.setEnd(range.startContainer, range.startOffset);\n return preRange.toString().length;\n}\n\n/**\n * Hook for managing slash command autocomplete in the chat input.\n * Detects when user types \"/\" and provides filtered skill suggestions.\n * Only skills with explicit \"/\" triggers (TaskTrigger) appear in the menu.\n */\nexport const useSlashCommand = (\n chatInputRef: React.RefObject<HTMLDivElement | null>,\n) => {\n // Scope the skill catalog to this conversation's attached workspace so the\n // slash menu lists the same project skills that were loaded into it.\n const { data: skills, isLoading: isSkillsLoading } = useConversationSkills();\n const isCloud = useActiveBackend().backend.kind === \"cloud\";\n const { data: profilesData, isLoading: isProfilesLoading } = useLlmProfiles();\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const [filterText, setFilterText] = useState(\"\");\n const [completionKind, setCompletionKind] =\n useState<SlashCompletionKind>(\"command\");\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n // Build slash command items from built-in commands + skills:\n // - Built-in commands (like /new) are included for V1 conversations\n // - /new is cloud-only — local backends don't surface it\n // - /model lists/switches LLM profiles; both local and cloud support them\n // - Skills with explicit \"/\" triggers use those triggers\n // - AgentSkills without \"/\" triggers get a derived \"/<name>\" command\n const slashItems = useMemo(() => {\n const items: SlashCommandItem[] = BUILT_IN_COMMANDS.filter((cmd) => {\n if (cmd.command === \"/new\") return isCloud;\n return true;\n });\n\n // Wait for skills to finish initial load so all commands appear together\n if (isSkillsLoading) return items;\n\n if (!skills) return items;\n skills.forEach((skill) => {\n const triggers = skill.triggers || [];\n const slashTriggers = triggers.filter((t) => t.startsWith(\"/\"));\n\n if (slashTriggers.length > 0) {\n // Skill has explicit slash triggers\n slashTriggers.forEach((trigger) => {\n items.push({ skill, command: trigger });\n });\n } else if (skill.type === \"agentskills\") {\n // AgentSkills without slash triggers get a derived command\n items.push({ skill, command: `/${skill.name}` });\n }\n });\n return items;\n }, [skills, isSkillsLoading, isCloud]);\n\n const modelProfileItems = useMemo<SlashCommandItem[]>(() => {\n return (profilesData?.profiles ?? []).map((profile) => {\n const command = `${MODEL_COMMAND} ${profile.name}`;\n return {\n command,\n skill: {\n name: profile.name,\n type: \"agentskills\",\n content: profile.model\n ? `Switch to ${profile.model}`\n : \"Switch to this LLM profile\",\n triggers: [command],\n },\n };\n });\n }, [profilesData?.profiles]);\n\n // Filter items based on user input after \"/\"\n const filteredItems = useMemo(() => {\n const sourceItems =\n completionKind === \"model-profile\" ? modelProfileItems : slashItems;\n if (!filterText) return sourceItems;\n const lower = filterText.toLowerCase();\n return sourceItems.filter(\n (item) =>\n item.command.toLowerCase().includes(lower) ||\n item.skill.name.toLowerCase().includes(lower) ||\n item.skill.content?.toLowerCase().includes(lower),\n );\n }, [completionKind, modelProfileItems, slashItems, filterText]);\n\n // Keep refs in sync so handleSlashKeyDown always reads the latest values,\n // avoiding stale closures from React's batched state updates.\n const isMenuOpenRef = useRef(isMenuOpen);\n isMenuOpenRef.current = isMenuOpen;\n const filteredItemsRef = useRef(filteredItems);\n filteredItemsRef.current = filteredItems;\n const selectedIndexRef = useRef(selectedIndex);\n selectedIndexRef.current = selectedIndex;\n\n // Reset selected index when the filter text changes\n useEffect(() => {\n setSelectedIndex(0);\n }, [filterText]);\n\n // Track the character range of the current slash word so selectItem can\n // replace only that portion instead of wiping the entire input.\n const slashRangeRef = useRef<{ start: number; end: number } | null>(null);\n\n // Detect a slash word at the cursor position.\n // Returns the filter text (characters after \"/\") and the range of the\n // slash word within the full input text, or null if no slash word found.\n const getSlashText = useCallback((): {\n kind: SlashCompletionKind;\n text: string;\n start: number;\n end: number;\n } | null => {\n const element = chatInputRef.current;\n if (!element) return null;\n\n // Strip trailing newlines that contentEditable can produce, but preserve\n // spaces so \"/command \" (after selection) won't re-trigger the menu.\n const text = (element.innerText || \"\").replace(/[\\n\\r]+$/, \"\");\n const cursor = getCursorOffset(element);\n if (cursor < 0) return null;\n\n const textBeforeCursor = text.slice(0, cursor);\n\n const modelMatch = textBeforeCursor.match(/(^|\\s)(\\/model(?:\\s+\\S*)?)$/);\n if (modelMatch) {\n const modelCommand = modelMatch[2];\n const start = textBeforeCursor.length - modelCommand.length;\n const afterCursor = text.slice(cursor);\n const trailing = afterCursor.match(/^\\S*/);\n const end = cursor + (trailing ? trailing[0].length : 0);\n\n return {\n kind: \"model-profile\",\n text: modelCommand.replace(/^\\/model(?:\\s+)?/, \"\"),\n start,\n end,\n };\n }\n\n // Match a \"/\" preceded by whitespace or at position 0, followed by\n // non-whitespace characters, ending right at the cursor.\n const match = textBeforeCursor.match(/(^|\\s)(\\/\\S*)$/);\n if (!match) return null;\n\n const slashWord = match[2]; // e.g. \"/hel\"\n const start = textBeforeCursor.length - slashWord.length;\n // The end of the slash word extends past the cursor to include any\n // contiguous non-whitespace characters (covers the case where the\n // cursor sits in the middle of a word).\n const afterCursor = text.slice(cursor);\n const trailing = afterCursor.match(/^\\S*/);\n const end = cursor + (trailing ? trailing[0].length : 0);\n\n return { kind: \"command\", text: slashWord.slice(1), start, end }; // strip leading \"/\"\n }, [chatInputRef]);\n\n // Update the menu state based on current input\n const updateSlashMenu = useCallback(() => {\n const result = getSlashText();\n const hasItems =\n result?.kind === \"model-profile\"\n ? modelProfileItems.length > 0 || isProfilesLoading\n : slashItems.length > 0;\n\n if (result !== null && hasItems) {\n setCompletionKind(result.kind);\n setFilterText(result.text);\n slashRangeRef.current = { start: result.start, end: result.end };\n setIsMenuOpen(true);\n } else {\n setIsMenuOpen(false);\n setFilterText(\"\");\n setCompletionKind(\"command\");\n slashRangeRef.current = null;\n }\n }, [\n getSlashText,\n isProfilesLoading,\n modelProfileItems.length,\n slashItems.length,\n ]);\n\n // Select an item and replace only the slash word with the command\n const selectItem = useCallback(\n (item: SlashCommandItem) => {\n const element = chatInputRef.current;\n if (!element) return;\n\n const slashRange = slashRangeRef.current;\n const currentText = (element.innerText || \"\").replace(/[\\n\\r]+$/, \"\");\n const replacement = `${item.command} `;\n\n if (slashRange) {\n // Splice the command into the text, replacing only the slash word\n element.textContent =\n currentText.slice(0, slashRange.start) +\n replacement +\n currentText.slice(slashRange.end);\n\n // Position cursor right after the inserted command + space\n const cursorPos = slashRange.start + replacement.length;\n const textNode = element.firstChild;\n if (textNode) {\n const range = document.createRange();\n const sel = window.getSelection();\n const offset = Math.min(cursorPos, textNode.textContent!.length);\n range.setStart(textNode, offset);\n range.collapse(true);\n sel?.removeAllRanges();\n sel?.addRange(range);\n }\n } else {\n // Fallback: replace everything (e.g. if range tracking failed)\n element.textContent = replacement;\n const range = document.createRange();\n const sel = window.getSelection();\n range.selectNodeContents(element);\n range.collapse(false);\n sel?.removeAllRanges();\n sel?.addRange(range);\n }\n\n setIsMenuOpen(false);\n setFilterText(\"\");\n setCompletionKind(\"command\");\n setSelectedIndex(0);\n slashRangeRef.current = null;\n\n // Trigger a native InputEvent so React's onInput fires (for smartResize etc.)\n element.dispatchEvent(new InputEvent(\"input\", { bubbles: true }));\n\n // Restore focus so keyboard events (Enter to submit) work after selection\n element.focus();\n },\n [chatInputRef],\n );\n\n // Handle keyboard navigation in the menu.\n // Uses refs to always read the latest state, avoiding stale closures.\n const handleSlashKeyDown = useCallback(\n (e: React.KeyboardEvent): boolean => {\n const items = filteredItemsRef.current;\n if (!isMenuOpenRef.current || items.length === 0) return false;\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setSelectedIndex((prev) => (prev < items.length - 1 ? prev + 1 : 0));\n return true;\n case \"ArrowUp\":\n e.preventDefault();\n setSelectedIndex((prev) => (prev > 0 ? prev - 1 : items.length - 1));\n return true;\n case \"Enter\":\n case \"Tab\": {\n const item = items[selectedIndexRef.current];\n if (!item) return false;\n e.preventDefault();\n selectItem(item);\n return true;\n }\n case \"Escape\":\n e.preventDefault();\n setIsMenuOpen(false);\n return true;\n // Cursor-movement keys: close the menu to avoid acting on a stale\n // slash-word range, but don't consume the event so the cursor moves.\n case \"ArrowLeft\":\n case \"ArrowRight\":\n case \"Home\":\n case \"End\":\n setIsMenuOpen(false);\n return false;\n default:\n return false;\n }\n },\n [selectItem],\n );\n\n const closeMenu = useCallback(() => setIsMenuOpen(false), []);\n\n return {\n isMenuOpen,\n filteredItems,\n selectedIndex,\n updateSlashMenu,\n selectItem,\n handleSlashKeyDown,\n closeMenu,\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(`../../api/backend-registry/active-store.cjs`),n=require(`../../api/agent-server-client-options.cjs`),r=require(`../../api/cloud/conversation-service.api.cjs`),i=require(`../../api/conversation-service/agent-server-conversation-service.api.cjs`);var a=async e=>{let t=(await i.default.batchGetAppConversations([e]))[0];if(!t)throw Error(`V1 conversation not found: ${e}`);return{conversationUrl:t.conversation_url,sessionApiKey:t.session_api_key,sandboxId:t.sandbox_id}},o=async i=>{let{conversationUrl:o,sessionApiKey:s,sandboxId:c}=await a(i);if(t.getActiveBackend().backend.kind===`cloud`){if(!c)throw Error(`Cannot stop runtime: cloud conversation ${i} has no sandbox_id.`);return await r.pauseCloudSandbox(c),{success:!0}}return new e.ConversationClient(n.getAgentServerClientOptions({conversationUrl:o,sessionApiKey:s})).interruptConversation(i)},s=async(t,r)=>{let{conversationUrl:i,sessionApiKey:o}=await a(t);return new e.ConversationClient(n.getAgentServerClientOptions({conversationUrl:i,sessionApiKey:o})).askAgent(t,r)},c=async(t,r)=>{let{conversationUrl:i,sessionApiKey:o}=await a(t);await new e.ConversationClient(n.getAgentServerClientOptions({conversationUrl:i,sessionApiKey:o})).startGoal(t,r)},l=async t=>{let{conversationUrl:r,sessionApiKey:i}=await a(t);await new e.ConversationClient(n.getAgentServerClientOptions({conversationUrl:r,sessionApiKey:i})).stopGoal(t)},u=async t=>{let{conversationUrl:r,sessionApiKey:i}=await a(t);await new e.ConversationClient(n.getAgentServerClientOptions({conversationUrl:r,sessionApiKey:i})).resumeGoal(t)},d=async t=>{let{conversationUrl:r,sessionApiKey:i}=await a(t);return new e.ConversationClient(n.getAgentServerClientOptions({conversationUrl:r,sessionApiKey:i})).runConversation(t)},f=(e,t,n)=>{e.setQueriesData({queryKey:[`user`,`conversation`,t]},e=>e&&{...e,...n}),e.setQueriesData({queryKey:[`user`,`conversations`]},e=>e&&{...e,pages:e.pages.map(e=>({...e,items:e.items.map(e=>e.id===t?{...e,...n}:e)}))})},p=(e,t,n)=>f(e,t,{execution_status:n}),m=(e,t,n)=>f(e,t,{llm_model:n}),h=(e,t)=>{e.invalidateQueries({queryKey:[`user`,`conversation`,t]}),e.invalidateQueries({queryKey:[`user`,`conversations`]}),e.invalidateQueries({queryKey:[`v1-batch-get-app-conversations`]}),e.invalidateQueries({queryKey:[`unified`,`vscode_url`]})};exports.askAgent=s,exports.invalidateConversationQueries=h,exports.patchConversationInCache=f,exports.pauseConversation=o,exports.resumeConversation=d,exports.resumeGoal=u,exports.startGoal=c,exports.stopGoal=l,exports.updateConversationExecutionStatusInCache=p,exports.updateConversationLlmModelInCache=m;
|
|
2
2
|
//# sourceMappingURL=conversation-mutation-utils.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-mutation-utils.cjs","names":[],"sources":["../../../src/hooks/mutation/conversation-mutation-utils.ts"],"sourcesContent":["import { QueryClient } from \"@tanstack/react-query\";\nimport { ConversationClient } from \"@openhands/typescript-client/clients\";\nimport { getActiveBackend } from \"#/api/backend-registry/active-store\";\nimport { pauseCloudSandbox } from \"#/api/cloud/conversation-service.api\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport AgentServerConversationService from \"#/api/conversation-service/agent-server-conversation-service.api\";\nimport { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\n\ntype ExecutionStatusValue = AppConversation[\"execution_status\"];\n\nconst fetchConversationData = async (\n conversationId: string,\n): Promise<{\n conversationUrl: string | null;\n sessionApiKey: string | null;\n sandboxId: string | null;\n}> => {\n const conversations =\n await AgentServerConversationService.batchGetAppConversations([\n conversationId,\n ]);\n\n const appConversation = conversations[0];\n if (!appConversation) {\n throw new Error(`V1 conversation not found: ${conversationId}`);\n }\n\n return {\n conversationUrl: appConversation.conversation_url,\n sessionApiKey: appConversation.session_api_key,\n sandboxId: appConversation.sandbox_id,\n };\n};\n\n/**\n * Stop a running conversation.\n * - Cloud mode: Pauses the sandbox (waits for current LLM call to finish).\n * - Local mode: Interrupts immediately (cancels in-flight requests).\n */\nexport const pauseConversation = async (conversationId: string) => {\n const { conversationUrl, sessionApiKey, sandboxId } =\n await fetchConversationData(conversationId);\n\n if (getActiveBackend().backend.kind === \"cloud\") {\n if (!sandboxId) {\n throw new Error(\n `Cannot stop runtime: cloud conversation ${conversationId} has no sandbox_id.`,\n );\n }\n await pauseCloudSandbox(sandboxId);\n return { success: true };\n }\n\n // In local mode, use /interrupt instead of /pause so in-flight LLM\n // requests are cancelled immediately rather than waiting for the\n // current call to finish.\n return new ConversationClient(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).interruptConversation(conversationId);\n};\n\n/**\n * Ask the agent a side question on a V1 conversation\n */\nexport const askAgent = async (\n conversationId: string,\n question: string,\n): Promise<{ response: string }> => {\n const { conversationUrl, sessionApiKey } =\n await fetchConversationData(conversationId);\n return new ConversationClient(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).askAgent(conversationId, question);\n};\n\nexport const resumeConversation = async (conversationId: string) => {\n const { conversationUrl, sessionApiKey } =\n await fetchConversationData(conversationId);\n return new ConversationClient(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).runConversation(conversationId);\n};\n\n/**\n * Patch arbitrary fields on a cached AppConversation in both the single-item\n * and paginated list query caches. Prefer this over the narrower\n * `updateConversationExecutionStatusInCache` when you need to update more than\n * one field atomically (e.g. `execution_status` + `sandbox_status` together).\n */\nexport const patchConversationInCache = (\n queryClient: QueryClient,\n conversationId: string,\n patch: Partial<AppConversation>,\n): void => {\n // useUserConversation stores data under a 5-part key that includes the active\n // backend id and org id. Use setQueriesData with prefix matching so the\n // update reaches whichever (backend, org) variant is currently mounted.\n queryClient.setQueriesData<AppConversation | null>(\n { queryKey: [\"user\", \"conversation\", conversationId] },\n (oldData) => (oldData ? { ...oldData, ...patch } : oldData),\n );\n\n queryClient.setQueriesData<{\n pages: Array<{ items: AppConversation[] }>;\n }>({ queryKey: [\"user\", \"conversations\"] }, (oldData) => {\n if (!oldData) return oldData;\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n items: page.items.map((conv) =>\n conv.id === conversationId ? { ...conv, ...patch } : conv,\n ),\n })),\n };\n });\n};\n\nexport const updateConversationExecutionStatusInCache = (\n queryClient: QueryClient,\n conversationId: string,\n execution_status: ExecutionStatusValue,\n): void =>\n patchConversationInCache(queryClient, conversationId, { execution_status });\n\nexport const updateConversationLlmModelInCache = (\n queryClient: QueryClient,\n conversationId: string,\n llm_model: string,\n): void => patchConversationInCache(queryClient, conversationId, { llm_model });\n\nexport const invalidateConversationQueries = (\n queryClient: QueryClient,\n conversationId: string,\n): void => {\n queryClient.invalidateQueries({\n queryKey: [\"user\", \"conversation\", conversationId],\n });\n queryClient.invalidateQueries({ queryKey: [\"user\", \"conversations\"] });\n queryClient.invalidateQueries({\n queryKey: [\"v1-batch-get-app-conversations\"],\n });\n queryClient.invalidateQueries({ queryKey: [\"unified\", \"vscode_url\"] });\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"conversation-mutation-utils.cjs","names":[],"sources":["../../../src/hooks/mutation/conversation-mutation-utils.ts"],"sourcesContent":["import { QueryClient } from \"@tanstack/react-query\";\nimport { ConversationClient } from \"@openhands/typescript-client/clients\";\nimport type { StartGoalRequest } from \"@openhands/typescript-client\";\nimport { getActiveBackend } from \"#/api/backend-registry/active-store\";\nimport { pauseCloudSandbox } from \"#/api/cloud/conversation-service.api\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport AgentServerConversationService from \"#/api/conversation-service/agent-server-conversation-service.api\";\nimport { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\n\ntype ExecutionStatusValue = AppConversation[\"execution_status\"];\n\nconst fetchConversationData = async (\n conversationId: string,\n): Promise<{\n conversationUrl: string | null;\n sessionApiKey: string | null;\n sandboxId: string | null;\n}> => {\n const conversations =\n await AgentServerConversationService.batchGetAppConversations([\n conversationId,\n ]);\n\n const appConversation = conversations[0];\n if (!appConversation) {\n throw new Error(`V1 conversation not found: ${conversationId}`);\n }\n\n return {\n conversationUrl: appConversation.conversation_url,\n sessionApiKey: appConversation.session_api_key,\n sandboxId: appConversation.sandbox_id,\n };\n};\n\n/**\n * Stop a running conversation.\n * - Cloud mode: Pauses the sandbox (waits for current LLM call to finish).\n * - Local mode: Interrupts immediately (cancels in-flight requests).\n */\nexport const pauseConversation = async (conversationId: string) => {\n const { conversationUrl, sessionApiKey, sandboxId } =\n await fetchConversationData(conversationId);\n\n if (getActiveBackend().backend.kind === \"cloud\") {\n if (!sandboxId) {\n throw new Error(\n `Cannot stop runtime: cloud conversation ${conversationId} has no sandbox_id.`,\n );\n }\n await pauseCloudSandbox(sandboxId);\n return { success: true };\n }\n\n // In local mode, use /interrupt instead of /pause so in-flight LLM\n // requests are cancelled immediately rather than waiting for the\n // current call to finish.\n return new ConversationClient(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).interruptConversation(conversationId);\n};\n\n/**\n * Ask the agent a side question on a V1 conversation\n */\nexport const askAgent = async (\n conversationId: string,\n question: string,\n): Promise<{ response: string }> => {\n const { conversationUrl, sessionApiKey } =\n await fetchConversationData(conversationId);\n return new ConversationClient(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).askAgent(conversationId, question);\n};\n\n/**\n * Start a `/goal` loop on a V1 conversation. The agent server drives the agent\n * toward the objective, judging completion after each run until it is done or\n * `max_iterations` is reached, streaming progress as goal\n * ConversationStateUpdateEvents over the conversation's event stream.\n */\nexport const startGoal = async (\n conversationId: string,\n request: StartGoalRequest,\n): Promise<void> => {\n const { conversationUrl, sessionApiKey } =\n await fetchConversationData(conversationId);\n await new ConversationClient(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).startGoal(conversationId, request);\n};\n\n/**\n * Stop the active `/goal` loop. The backend only cancels the background loop\n * (recording an `interrupted` status so {@link resumeGoal} can continue it) and\n * deliberately leaves the in-flight agent turn running, so callers should also\n * interrupt the conversation (e.g. `pauseConversation`) to actually halt it.\n */\nexport const stopGoal = async (conversationId: string): Promise<void> => {\n const { conversationUrl, sessionApiKey } =\n await fetchConversationData(conversationId);\n await new ConversationClient(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).stopGoal(conversationId);\n};\n\n/** Resume the last interrupted `/goal` loop in this conversation. */\nexport const resumeGoal = async (conversationId: string): Promise<void> => {\n const { conversationUrl, sessionApiKey } =\n await fetchConversationData(conversationId);\n await new ConversationClient(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).resumeGoal(conversationId);\n};\n\nexport const resumeConversation = async (conversationId: string) => {\n const { conversationUrl, sessionApiKey } =\n await fetchConversationData(conversationId);\n return new ConversationClient(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).runConversation(conversationId);\n};\n\n/**\n * Patch arbitrary fields on a cached AppConversation in both the single-item\n * and paginated list query caches. Prefer this over the narrower\n * `updateConversationExecutionStatusInCache` when you need to update more than\n * one field atomically (e.g. `execution_status` + `sandbox_status` together).\n */\nexport const patchConversationInCache = (\n queryClient: QueryClient,\n conversationId: string,\n patch: Partial<AppConversation>,\n): void => {\n // useUserConversation stores data under a 5-part key that includes the active\n // backend id and org id. Use setQueriesData with prefix matching so the\n // update reaches whichever (backend, org) variant is currently mounted.\n queryClient.setQueriesData<AppConversation | null>(\n { queryKey: [\"user\", \"conversation\", conversationId] },\n (oldData) => (oldData ? { ...oldData, ...patch } : oldData),\n );\n\n queryClient.setQueriesData<{\n pages: Array<{ items: AppConversation[] }>;\n }>({ queryKey: [\"user\", \"conversations\"] }, (oldData) => {\n if (!oldData) return oldData;\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n items: page.items.map((conv) =>\n conv.id === conversationId ? { ...conv, ...patch } : conv,\n ),\n })),\n };\n });\n};\n\nexport const updateConversationExecutionStatusInCache = (\n queryClient: QueryClient,\n conversationId: string,\n execution_status: ExecutionStatusValue,\n): void =>\n patchConversationInCache(queryClient, conversationId, { execution_status });\n\nexport const updateConversationLlmModelInCache = (\n queryClient: QueryClient,\n conversationId: string,\n llm_model: string,\n): void => patchConversationInCache(queryClient, conversationId, { llm_model });\n\nexport const invalidateConversationQueries = (\n queryClient: QueryClient,\n conversationId: string,\n): void => {\n queryClient.invalidateQueries({\n queryKey: [\"user\", \"conversation\", conversationId],\n });\n queryClient.invalidateQueries({ queryKey: [\"user\", \"conversations\"] });\n queryClient.invalidateQueries({\n queryKey: [\"v1-batch-get-app-conversations\"],\n });\n queryClient.invalidateQueries({ queryKey: [\"unified\", \"vscode_url\"] });\n};\n"],"mappings":"yeAWA,IAAM,EAAwB,KAC5B,IAKI,CAMJ,IAAM,GAAkB,MAJhB,EAAA,QAA+B,yBAAyB,CAC5D,EACD,CAAC,EAEkC,GACtC,GAAI,CAAC,EACH,MAAU,MAAM,8BAA8B,IAAiB,CAGjE,MAAO,CACL,gBAAiB,EAAgB,iBACjC,cAAe,EAAgB,gBAC/B,UAAW,EAAgB,WAC5B,EAQU,EAAoB,KAAO,IAA2B,CACjE,GAAM,CAAE,kBAAiB,gBAAe,aACtC,MAAM,EAAsB,EAAe,CAE7C,GAAI,EAAA,kBAAkB,CAAC,QAAQ,OAAS,QAAS,CAC/C,GAAI,CAAC,EACH,MAAU,MACR,2CAA2C,EAAe,qBAC3D,CAGH,OADA,MAAM,EAAA,kBAAkB,EAAU,CAC3B,CAAE,QAAS,GAAM,CAM1B,OAAO,IAAI,EAAA,mBACT,EAAA,4BAA4B,CAAE,kBAAiB,gBAAe,CAAC,CAChE,CAAC,sBAAsB,EAAe,EAM5B,EAAW,MACtB,EACA,IACkC,CAClC,GAAM,CAAE,kBAAiB,iBACvB,MAAM,EAAsB,EAAe,CAC7C,OAAO,IAAI,EAAA,mBACT,EAAA,4BAA4B,CAAE,kBAAiB,gBAAe,CAAC,CAChE,CAAC,SAAS,EAAgB,EAAS,EASzB,EAAY,MACvB,EACA,IACkB,CAClB,GAAM,CAAE,kBAAiB,iBACvB,MAAM,EAAsB,EAAe,CAC7C,MAAM,IAAI,EAAA,mBACR,EAAA,4BAA4B,CAAE,kBAAiB,gBAAe,CAAC,CAChE,CAAC,UAAU,EAAgB,EAAQ,EASzB,EAAW,KAAO,IAA0C,CACvE,GAAM,CAAE,kBAAiB,iBACvB,MAAM,EAAsB,EAAe,CAC7C,MAAM,IAAI,EAAA,mBACR,EAAA,4BAA4B,CAAE,kBAAiB,gBAAe,CAAC,CAChE,CAAC,SAAS,EAAe,EAIf,EAAa,KAAO,IAA0C,CACzE,GAAM,CAAE,kBAAiB,iBACvB,MAAM,EAAsB,EAAe,CAC7C,MAAM,IAAI,EAAA,mBACR,EAAA,4BAA4B,CAAE,kBAAiB,gBAAe,CAAC,CAChE,CAAC,WAAW,EAAe,EAGjB,EAAqB,KAAO,IAA2B,CAClE,GAAM,CAAE,kBAAiB,iBACvB,MAAM,EAAsB,EAAe,CAC7C,OAAO,IAAI,EAAA,mBACT,EAAA,4BAA4B,CAAE,kBAAiB,gBAAe,CAAC,CAChE,CAAC,gBAAgB,EAAe,EAStB,GACX,EACA,EACA,IACS,CAIT,EAAY,eACV,CAAE,SAAU,CAAC,OAAQ,eAAgB,EAAe,CAAE,CACrD,GAAa,GAAU,CAAE,GAAG,EAAS,GAAG,EAAO,CACjD,CAED,EAAY,eAET,CAAE,SAAU,CAAC,OAAQ,gBAAgB,CAAE,CAAG,GACtC,GACE,CACL,GAAG,EACH,MAAO,EAAQ,MAAM,IAAK,IAAU,CAClC,GAAG,EACH,MAAO,EAAK,MAAM,IAAK,GACrB,EAAK,KAAO,EAAiB,CAAE,GAAG,EAAM,GAAG,EAAO,CAAG,EACtD,CACF,EAAE,CACJ,CACD,EAGS,GACX,EACA,EACA,IAEA,EAAyB,EAAa,EAAgB,CAAE,mBAAkB,CAAC,CAEhE,GACX,EACA,EACA,IACS,EAAyB,EAAa,EAAgB,CAAE,YAAW,CAAC,CAElE,GACX,EACA,IACS,CACT,EAAY,kBAAkB,CAC5B,SAAU,CAAC,OAAQ,eAAgB,EAAe,CACnD,CAAC,CACF,EAAY,kBAAkB,CAAE,SAAU,CAAC,OAAQ,gBAAgB,CAAE,CAAC,CACtE,EAAY,kBAAkB,CAC5B,SAAU,CAAC,iCAAiC,CAC7C,CAAC,CACF,EAAY,kBAAkB,CAAE,SAAU,CAAC,UAAW,aAAa,CAAE,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { QueryClient } from "@tanstack/react-query";
|
|
2
|
+
import type { StartGoalRequest } from "@openhands/typescript-client";
|
|
2
3
|
import { AppConversation } from "#/api/conversation-service/agent-server-conversation-service.types";
|
|
3
4
|
type ExecutionStatusValue = AppConversation["execution_status"];
|
|
4
5
|
/**
|
|
@@ -13,6 +14,22 @@ export declare const pauseConversation: (conversationId: string) => Promise<impo
|
|
|
13
14
|
export declare const askAgent: (conversationId: string, question: string) => Promise<{
|
|
14
15
|
response: string;
|
|
15
16
|
}>;
|
|
17
|
+
/**
|
|
18
|
+
* Start a `/goal` loop on a V1 conversation. The agent server drives the agent
|
|
19
|
+
* toward the objective, judging completion after each run until it is done or
|
|
20
|
+
* `max_iterations` is reached, streaming progress as goal
|
|
21
|
+
* ConversationStateUpdateEvents over the conversation's event stream.
|
|
22
|
+
*/
|
|
23
|
+
export declare const startGoal: (conversationId: string, request: StartGoalRequest) => Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Stop the active `/goal` loop. The backend only cancels the background loop
|
|
26
|
+
* (recording an `interrupted` status so {@link resumeGoal} can continue it) and
|
|
27
|
+
* deliberately leaves the in-flight agent turn running, so callers should also
|
|
28
|
+
* interrupt the conversation (e.g. `pauseConversation`) to actually halt it.
|
|
29
|
+
*/
|
|
30
|
+
export declare const stopGoal: (conversationId: string) => Promise<void>;
|
|
31
|
+
/** Resume the last interrupted `/goal` loop in this conversation. */
|
|
32
|
+
export declare const resumeGoal: (conversationId: string) => Promise<void>;
|
|
16
33
|
export declare const resumeConversation: (conversationId: string) => Promise<import("@openhands/typescript-client").Success>;
|
|
17
34
|
/**
|
|
18
35
|
* Patch arbitrary fields on a cached AppConversation in both the single-item
|
|
@@ -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 { getActiveBackend as t } from "../../api/backend-registry/active-store.js";
|
|
3
4
|
import { getAgentServerClientOptions as n } from "../../api/agent-server-client-options.js";
|
|
4
5
|
import { pauseCloudSandbox as r } from "../../api/cloud/conversation-service.api.js";
|
|
@@ -28,13 +29,31 @@ var a = async (e) => {
|
|
|
28
29
|
conversationUrl: i,
|
|
29
30
|
sessionApiKey: o
|
|
30
31
|
})).askAgent(t, r);
|
|
31
|
-
}, c = async (t) => {
|
|
32
|
+
}, c = async (t, r) => {
|
|
33
|
+
let { conversationUrl: i, sessionApiKey: o } = await a(t);
|
|
34
|
+
await new e(n({
|
|
35
|
+
conversationUrl: i,
|
|
36
|
+
sessionApiKey: o
|
|
37
|
+
})).startGoal(t, r);
|
|
38
|
+
}, l = async (t) => {
|
|
39
|
+
let { conversationUrl: r, sessionApiKey: i } = await a(t);
|
|
40
|
+
await new e(n({
|
|
41
|
+
conversationUrl: r,
|
|
42
|
+
sessionApiKey: i
|
|
43
|
+
})).stopGoal(t);
|
|
44
|
+
}, u = async (t) => {
|
|
45
|
+
let { conversationUrl: r, sessionApiKey: i } = await a(t);
|
|
46
|
+
await new e(n({
|
|
47
|
+
conversationUrl: r,
|
|
48
|
+
sessionApiKey: i
|
|
49
|
+
})).resumeGoal(t);
|
|
50
|
+
}, d = async (t) => {
|
|
32
51
|
let { conversationUrl: r, sessionApiKey: i } = await a(t);
|
|
33
52
|
return new e(n({
|
|
34
53
|
conversationUrl: r,
|
|
35
54
|
sessionApiKey: i
|
|
36
55
|
})).runConversation(t);
|
|
37
|
-
},
|
|
56
|
+
}, f = (e, t, n) => {
|
|
38
57
|
e.setQueriesData({ queryKey: [
|
|
39
58
|
"user",
|
|
40
59
|
"conversation",
|
|
@@ -52,7 +71,7 @@ var a = async (e) => {
|
|
|
52
71
|
} : e)
|
|
53
72
|
}))
|
|
54
73
|
});
|
|
55
|
-
},
|
|
74
|
+
}, p = (e, t, n) => f(e, t, { execution_status: n }), m = (e, t, n) => f(e, t, { llm_model: n }), h = (e, t) => {
|
|
56
75
|
e.invalidateQueries({ queryKey: [
|
|
57
76
|
"user",
|
|
58
77
|
"conversation",
|
|
@@ -60,6 +79,6 @@ var a = async (e) => {
|
|
|
60
79
|
] }), e.invalidateQueries({ queryKey: ["user", "conversations"] }), e.invalidateQueries({ queryKey: ["v1-batch-get-app-conversations"] }), e.invalidateQueries({ queryKey: ["unified", "vscode_url"] });
|
|
61
80
|
};
|
|
62
81
|
//#endregion
|
|
63
|
-
export { s as askAgent,
|
|
82
|
+
export { s as askAgent, h as invalidateConversationQueries, f as patchConversationInCache, o as pauseConversation, d as resumeConversation, u as resumeGoal, c as startGoal, l as stopGoal, p as updateConversationExecutionStatusInCache, m as updateConversationLlmModelInCache };
|
|
64
83
|
|
|
65
84
|
//# sourceMappingURL=conversation-mutation-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-mutation-utils.js","names":[],"sources":["../../../src/hooks/mutation/conversation-mutation-utils.ts"],"sourcesContent":["import { QueryClient } from \"@tanstack/react-query\";\nimport { ConversationClient } from \"@openhands/typescript-client/clients\";\nimport { getActiveBackend } from \"#/api/backend-registry/active-store\";\nimport { pauseCloudSandbox } from \"#/api/cloud/conversation-service.api\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport AgentServerConversationService from \"#/api/conversation-service/agent-server-conversation-service.api\";\nimport { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\n\ntype ExecutionStatusValue = AppConversation[\"execution_status\"];\n\nconst fetchConversationData = async (\n conversationId: string,\n): Promise<{\n conversationUrl: string | null;\n sessionApiKey: string | null;\n sandboxId: string | null;\n}> => {\n const conversations =\n await AgentServerConversationService.batchGetAppConversations([\n conversationId,\n ]);\n\n const appConversation = conversations[0];\n if (!appConversation) {\n throw new Error(`V1 conversation not found: ${conversationId}`);\n }\n\n return {\n conversationUrl: appConversation.conversation_url,\n sessionApiKey: appConversation.session_api_key,\n sandboxId: appConversation.sandbox_id,\n };\n};\n\n/**\n * Stop a running conversation.\n * - Cloud mode: Pauses the sandbox (waits for current LLM call to finish).\n * - Local mode: Interrupts immediately (cancels in-flight requests).\n */\nexport const pauseConversation = async (conversationId: string) => {\n const { conversationUrl, sessionApiKey, sandboxId } =\n await fetchConversationData(conversationId);\n\n if (getActiveBackend().backend.kind === \"cloud\") {\n if (!sandboxId) {\n throw new Error(\n `Cannot stop runtime: cloud conversation ${conversationId} has no sandbox_id.`,\n );\n }\n await pauseCloudSandbox(sandboxId);\n return { success: true };\n }\n\n // In local mode, use /interrupt instead of /pause so in-flight LLM\n // requests are cancelled immediately rather than waiting for the\n // current call to finish.\n return new ConversationClient(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).interruptConversation(conversationId);\n};\n\n/**\n * Ask the agent a side question on a V1 conversation\n */\nexport const askAgent = async (\n conversationId: string,\n question: string,\n): Promise<{ response: string }> => {\n const { conversationUrl, sessionApiKey } =\n await fetchConversationData(conversationId);\n return new ConversationClient(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).askAgent(conversationId, question);\n};\n\nexport const resumeConversation = async (conversationId: string) => {\n const { conversationUrl, sessionApiKey } =\n await fetchConversationData(conversationId);\n return new ConversationClient(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).runConversation(conversationId);\n};\n\n/**\n * Patch arbitrary fields on a cached AppConversation in both the single-item\n * and paginated list query caches. Prefer this over the narrower\n * `updateConversationExecutionStatusInCache` when you need to update more than\n * one field atomically (e.g. `execution_status` + `sandbox_status` together).\n */\nexport const patchConversationInCache = (\n queryClient: QueryClient,\n conversationId: string,\n patch: Partial<AppConversation>,\n): void => {\n // useUserConversation stores data under a 5-part key that includes the active\n // backend id and org id. Use setQueriesData with prefix matching so the\n // update reaches whichever (backend, org) variant is currently mounted.\n queryClient.setQueriesData<AppConversation | null>(\n { queryKey: [\"user\", \"conversation\", conversationId] },\n (oldData) => (oldData ? { ...oldData, ...patch } : oldData),\n );\n\n queryClient.setQueriesData<{\n pages: Array<{ items: AppConversation[] }>;\n }>({ queryKey: [\"user\", \"conversations\"] }, (oldData) => {\n if (!oldData) return oldData;\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n items: page.items.map((conv) =>\n conv.id === conversationId ? { ...conv, ...patch } : conv,\n ),\n })),\n };\n });\n};\n\nexport const updateConversationExecutionStatusInCache = (\n queryClient: QueryClient,\n conversationId: string,\n execution_status: ExecutionStatusValue,\n): void =>\n patchConversationInCache(queryClient, conversationId, { execution_status });\n\nexport const updateConversationLlmModelInCache = (\n queryClient: QueryClient,\n conversationId: string,\n llm_model: string,\n): void => patchConversationInCache(queryClient, conversationId, { llm_model });\n\nexport const invalidateConversationQueries = (\n queryClient: QueryClient,\n conversationId: string,\n): void => {\n queryClient.invalidateQueries({\n queryKey: [\"user\", \"conversation\", conversationId],\n });\n queryClient.invalidateQueries({ queryKey: [\"user\", \"conversations\"] });\n queryClient.invalidateQueries({\n queryKey: [\"v1-batch-get-app-conversations\"],\n });\n queryClient.invalidateQueries({ queryKey: [\"unified\", \"vscode_url\"] });\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"conversation-mutation-utils.js","names":[],"sources":["../../../src/hooks/mutation/conversation-mutation-utils.ts"],"sourcesContent":["import { QueryClient } from \"@tanstack/react-query\";\nimport { ConversationClient } from \"@openhands/typescript-client/clients\";\nimport type { StartGoalRequest } from \"@openhands/typescript-client\";\nimport { getActiveBackend } from \"#/api/backend-registry/active-store\";\nimport { pauseCloudSandbox } from \"#/api/cloud/conversation-service.api\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport AgentServerConversationService from \"#/api/conversation-service/agent-server-conversation-service.api\";\nimport { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\n\ntype ExecutionStatusValue = AppConversation[\"execution_status\"];\n\nconst fetchConversationData = async (\n conversationId: string,\n): Promise<{\n conversationUrl: string | null;\n sessionApiKey: string | null;\n sandboxId: string | null;\n}> => {\n const conversations =\n await AgentServerConversationService.batchGetAppConversations([\n conversationId,\n ]);\n\n const appConversation = conversations[0];\n if (!appConversation) {\n throw new Error(`V1 conversation not found: ${conversationId}`);\n }\n\n return {\n conversationUrl: appConversation.conversation_url,\n sessionApiKey: appConversation.session_api_key,\n sandboxId: appConversation.sandbox_id,\n };\n};\n\n/**\n * Stop a running conversation.\n * - Cloud mode: Pauses the sandbox (waits for current LLM call to finish).\n * - Local mode: Interrupts immediately (cancels in-flight requests).\n */\nexport const pauseConversation = async (conversationId: string) => {\n const { conversationUrl, sessionApiKey, sandboxId } =\n await fetchConversationData(conversationId);\n\n if (getActiveBackend().backend.kind === \"cloud\") {\n if (!sandboxId) {\n throw new Error(\n `Cannot stop runtime: cloud conversation ${conversationId} has no sandbox_id.`,\n );\n }\n await pauseCloudSandbox(sandboxId);\n return { success: true };\n }\n\n // In local mode, use /interrupt instead of /pause so in-flight LLM\n // requests are cancelled immediately rather than waiting for the\n // current call to finish.\n return new ConversationClient(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).interruptConversation(conversationId);\n};\n\n/**\n * Ask the agent a side question on a V1 conversation\n */\nexport const askAgent = async (\n conversationId: string,\n question: string,\n): Promise<{ response: string }> => {\n const { conversationUrl, sessionApiKey } =\n await fetchConversationData(conversationId);\n return new ConversationClient(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).askAgent(conversationId, question);\n};\n\n/**\n * Start a `/goal` loop on a V1 conversation. The agent server drives the agent\n * toward the objective, judging completion after each run until it is done or\n * `max_iterations` is reached, streaming progress as goal\n * ConversationStateUpdateEvents over the conversation's event stream.\n */\nexport const startGoal = async (\n conversationId: string,\n request: StartGoalRequest,\n): Promise<void> => {\n const { conversationUrl, sessionApiKey } =\n await fetchConversationData(conversationId);\n await new ConversationClient(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).startGoal(conversationId, request);\n};\n\n/**\n * Stop the active `/goal` loop. The backend only cancels the background loop\n * (recording an `interrupted` status so {@link resumeGoal} can continue it) and\n * deliberately leaves the in-flight agent turn running, so callers should also\n * interrupt the conversation (e.g. `pauseConversation`) to actually halt it.\n */\nexport const stopGoal = async (conversationId: string): Promise<void> => {\n const { conversationUrl, sessionApiKey } =\n await fetchConversationData(conversationId);\n await new ConversationClient(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).stopGoal(conversationId);\n};\n\n/** Resume the last interrupted `/goal` loop in this conversation. */\nexport const resumeGoal = async (conversationId: string): Promise<void> => {\n const { conversationUrl, sessionApiKey } =\n await fetchConversationData(conversationId);\n await new ConversationClient(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).resumeGoal(conversationId);\n};\n\nexport const resumeConversation = async (conversationId: string) => {\n const { conversationUrl, sessionApiKey } =\n await fetchConversationData(conversationId);\n return new ConversationClient(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).runConversation(conversationId);\n};\n\n/**\n * Patch arbitrary fields on a cached AppConversation in both the single-item\n * and paginated list query caches. Prefer this over the narrower\n * `updateConversationExecutionStatusInCache` when you need to update more than\n * one field atomically (e.g. `execution_status` + `sandbox_status` together).\n */\nexport const patchConversationInCache = (\n queryClient: QueryClient,\n conversationId: string,\n patch: Partial<AppConversation>,\n): void => {\n // useUserConversation stores data under a 5-part key that includes the active\n // backend id and org id. Use setQueriesData with prefix matching so the\n // update reaches whichever (backend, org) variant is currently mounted.\n queryClient.setQueriesData<AppConversation | null>(\n { queryKey: [\"user\", \"conversation\", conversationId] },\n (oldData) => (oldData ? { ...oldData, ...patch } : oldData),\n );\n\n queryClient.setQueriesData<{\n pages: Array<{ items: AppConversation[] }>;\n }>({ queryKey: [\"user\", \"conversations\"] }, (oldData) => {\n if (!oldData) return oldData;\n return {\n ...oldData,\n pages: oldData.pages.map((page) => ({\n ...page,\n items: page.items.map((conv) =>\n conv.id === conversationId ? { ...conv, ...patch } : conv,\n ),\n })),\n };\n });\n};\n\nexport const updateConversationExecutionStatusInCache = (\n queryClient: QueryClient,\n conversationId: string,\n execution_status: ExecutionStatusValue,\n): void =>\n patchConversationInCache(queryClient, conversationId, { execution_status });\n\nexport const updateConversationLlmModelInCache = (\n queryClient: QueryClient,\n conversationId: string,\n llm_model: string,\n): void => patchConversationInCache(queryClient, conversationId, { llm_model });\n\nexport const invalidateConversationQueries = (\n queryClient: QueryClient,\n conversationId: string,\n): void => {\n queryClient.invalidateQueries({\n queryKey: [\"user\", \"conversation\", conversationId],\n });\n queryClient.invalidateQueries({ queryKey: [\"user\", \"conversations\"] });\n queryClient.invalidateQueries({\n queryKey: [\"v1-batch-get-app-conversations\"],\n });\n queryClient.invalidateQueries({ queryKey: [\"unified\", \"vscode_url\"] });\n};\n"],"mappings":";;;;;;;AAWA,IAAM,IAAwB,OAC5B,MAKI;CAMJ,IAAM,KAAkB,MAJhB,EAA+B,yBAAyB,CAC5D,EACD,CAAC,EAEkC;AACtC,KAAI,CAAC,EACH,OAAU,MAAM,8BAA8B,IAAiB;AAGjE,QAAO;EACL,iBAAiB,EAAgB;EACjC,eAAe,EAAgB;EAC/B,WAAW,EAAgB;EAC5B;GAQU,IAAoB,OAAO,MAA2B;CACjE,IAAM,EAAE,oBAAiB,kBAAe,iBACtC,MAAM,EAAsB,EAAe;AAE7C,KAAI,GAAkB,CAAC,QAAQ,SAAS,SAAS;AAC/C,MAAI,CAAC,EACH,OAAU,MACR,2CAA2C,EAAe,qBAC3D;AAGH,SADA,MAAM,EAAkB,EAAU,EAC3B,EAAE,SAAS,IAAM;;AAM1B,QAAO,IAAI,EACT,EAA4B;EAAE;EAAiB;EAAe,CAAC,CAChE,CAAC,sBAAsB,EAAe;GAM5B,IAAW,OACtB,GACA,MACkC;CAClC,IAAM,EAAE,oBAAiB,qBACvB,MAAM,EAAsB,EAAe;AAC7C,QAAO,IAAI,EACT,EAA4B;EAAE;EAAiB;EAAe,CAAC,CAChE,CAAC,SAAS,GAAgB,EAAS;GASzB,IAAY,OACvB,GACA,MACkB;CAClB,IAAM,EAAE,oBAAiB,qBACvB,MAAM,EAAsB,EAAe;AAC7C,OAAM,IAAI,EACR,EAA4B;EAAE;EAAiB;EAAe,CAAC,CAChE,CAAC,UAAU,GAAgB,EAAQ;GASzB,IAAW,OAAO,MAA0C;CACvE,IAAM,EAAE,oBAAiB,qBACvB,MAAM,EAAsB,EAAe;AAC7C,OAAM,IAAI,EACR,EAA4B;EAAE;EAAiB;EAAe,CAAC,CAChE,CAAC,SAAS,EAAe;GAIf,IAAa,OAAO,MAA0C;CACzE,IAAM,EAAE,oBAAiB,qBACvB,MAAM,EAAsB,EAAe;AAC7C,OAAM,IAAI,EACR,EAA4B;EAAE;EAAiB;EAAe,CAAC,CAChE,CAAC,WAAW,EAAe;GAGjB,IAAqB,OAAO,MAA2B;CAClE,IAAM,EAAE,oBAAiB,qBACvB,MAAM,EAAsB,EAAe;AAC7C,QAAO,IAAI,EACT,EAA4B;EAAE;EAAiB;EAAe,CAAC,CAChE,CAAC,gBAAgB,EAAe;GAStB,KACX,GACA,GACA,MACS;AAST,CALA,EAAY,eACV,EAAE,UAAU;EAAC;EAAQ;EAAgB;EAAe,EAAE,GACrD,MAAa,KAAU;EAAE,GAAG;EAAS,GAAG;EAAO,CACjD,EAED,EAAY,eAET,EAAE,UAAU,CAAC,QAAQ,gBAAgB,EAAE,GAAG,MACtC,KACE;EACL,GAAG;EACH,OAAO,EAAQ,MAAM,KAAK,OAAU;GAClC,GAAG;GACH,OAAO,EAAK,MAAM,KAAK,MACrB,EAAK,OAAO,IAAiB;IAAE,GAAG;IAAM,GAAG;IAAO,GAAG,EACtD;GACF,EAAE;EACJ,CACD;GAGS,KACX,GACA,GACA,MAEA,EAAyB,GAAa,GAAgB,EAAE,qBAAkB,CAAC,EAEhE,KACX,GACA,GACA,MACS,EAAyB,GAAa,GAAgB,EAAE,cAAW,CAAC,EAElE,KACX,GACA,MACS;AAQT,CAPA,EAAY,kBAAkB,EAC5B,UAAU;EAAC;EAAQ;EAAgB;EAAe,EACnD,CAAC,EACF,EAAY,kBAAkB,EAAE,UAAU,CAAC,QAAQ,gBAAgB,EAAE,CAAC,EACtE,EAAY,kBAAkB,EAC5B,UAAU,CAAC,iCAAiC,EAC7C,CAAC,EACF,EAAY,kBAAkB,EAAE,UAAU,CAAC,WAAW,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../query/query-keys.cjs`),t=require(`../../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs`),n=require(`../../node_modules/@tanstack/react-query/build/modern/useMutation.cjs`),r=require(`../../api/settings-service/settings-service.api.cjs`),i=require(`../../api/agent-profiles-service/agent-profiles-service.api.cjs`);var a=[`activate-agent-profile`];function o(){let o=t.useQueryClient();return n.useMutation({mutationKey:a,mutationFn:e=>i.default.activateProfile(e),onMutate:async t=>{await o.cancelQueries({queryKey:e.AGENT_PROFILES_QUERY_KEYS.all});let n=o.getQueriesData({queryKey:e.AGENT_PROFILES_QUERY_KEYS.all});return o.setQueriesData({queryKey:e.AGENT_PROFILES_QUERY_KEYS.all},e=>e&&{...e,active_agent_profile_id:t}),{snapshots:n}},onError:(e,t,n)=>{n?.snapshots?.forEach(([e,t])=>{o.setQueryData(e,t)})},onSuccess:async()=>{r.default.invalidateCache(),await o.invalidateQueries({queryKey:e.AGENT_PROFILES_QUERY_KEYS.all}),await o.invalidateQueries({queryKey:e.SETTINGS_QUERY_KEYS.personal()})}})}exports.ACTIVATE_AGENT_PROFILE_MUTATION_KEY=a,exports.useActivateAgentProfile=o;
|
|
2
|
+
//# sourceMappingURL=use-activate-agent-profile.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-activate-agent-profile.cjs","names":[],"sources":["../../../src/hooks/mutation/use-activate-agent-profile.ts"],"sourcesContent":["import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport AgentProfilesService, {\n type AgentProfileListResponse,\n} from \"#/api/agent-profiles-service/agent-profiles-service.api\";\nimport SettingsService from \"#/api/settings-service/settings-service.api\";\nimport {\n AGENT_PROFILES_QUERY_KEYS,\n SETTINGS_QUERY_KEYS,\n} from \"#/hooks/query/query-keys\";\n\n/**\n * Shared key so any picker instance can observe an in-flight activation via\n * `useIsMutating` (the pill button and the menu that fires it are separate\n * hook instances, so per-observer `isPending` wouldn't line up).\n */\nexport const ACTIVATE_AGENT_PROFILE_MUTATION_KEY = [\"activate-agent-profile\"];\n\n/**\n * Activate an agent profile by its stable UUID `id`. Activation is\n * pointer-only (it does NOT write agent_settings), but it changes the launch\n * default the backend resolves for new conversations, so the settings cache is\n * invalidated defensively alongside the profiles list.\n *\n * The active pointer is flipped optimistically so the picker label and the\n * launch default (`useCreateConversation` reads `active_agent_profile_id`)\n * reflect the selection before the refetch lands. Errors roll the pointer back\n * and surface via the global mutation toast (no `meta.disableToast`) so a\n * failure isn't silent when fired from the chat-input picker, whose menu\n * unmounts on select.\n */\nexport function useActivateAgentProfile() {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationKey: ACTIVATE_AGENT_PROFILE_MUTATION_KEY,\n mutationFn: (profileId: string) =>\n AgentProfilesService.activateProfile(profileId),\n onMutate: async (profileId) => {\n await queryClient.cancelQueries({\n queryKey: AGENT_PROFILES_QUERY_KEYS.all,\n });\n const snapshots = queryClient.getQueriesData<AgentProfileListResponse>({\n queryKey: AGENT_PROFILES_QUERY_KEYS.all,\n });\n queryClient.setQueriesData<AgentProfileListResponse>(\n { queryKey: AGENT_PROFILES_QUERY_KEYS.all },\n (prev) =>\n prev ? { ...prev, active_agent_profile_id: profileId } : prev,\n );\n return { snapshots };\n },\n onError: (_err, _profileId, context) => {\n context?.snapshots?.forEach(([key, data]) => {\n queryClient.setQueryData(key, data);\n });\n },\n onSuccess: async () => {\n SettingsService.invalidateCache();\n await queryClient.invalidateQueries({\n queryKey: AGENT_PROFILES_QUERY_KEYS.all,\n });\n await queryClient.invalidateQueries({\n queryKey: SETTINGS_QUERY_KEYS.personal(),\n });\n },\n });\n}\n"],"mappings":"uZAeA,IAAa,EAAsC,CAAC,yBAAyB,CAe7E,SAAgB,GAA0B,CACxC,IAAM,EAAc,EAAA,gBAAgB,CAEpC,OAAO,EAAA,YAAY,CACjB,YAAa,EACb,WAAa,GACX,EAAA,QAAqB,gBAAgB,EAAU,CACjD,SAAU,KAAO,IAAc,CAC7B,MAAM,EAAY,cAAc,CAC9B,SAAU,EAAA,0BAA0B,IACrC,CAAC,CACF,IAAM,EAAY,EAAY,eAAyC,CACrE,SAAU,EAAA,0BAA0B,IACrC,CAAC,CAMF,OALA,EAAY,eACV,CAAE,SAAU,EAAA,0BAA0B,IAAK,CAC1C,GACC,GAAO,CAAE,GAAG,EAAM,wBAAyB,EAAW,CACzD,CACM,CAAE,YAAW,EAEtB,SAAU,EAAM,EAAY,IAAY,CACtC,GAAS,WAAW,SAAS,CAAC,EAAK,KAAU,CAC3C,EAAY,aAAa,EAAK,EAAK,EACnC,EAEJ,UAAW,SAAY,CACrB,EAAA,QAAgB,iBAAiB,CACjC,MAAM,EAAY,kBAAkB,CAClC,SAAU,EAAA,0BAA0B,IACrC,CAAC,CACF,MAAM,EAAY,kBAAkB,CAClC,SAAU,EAAA,oBAAoB,UAAU,CACzC,CAAC,EAEL,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type AgentProfileListResponse } from "#/api/agent-profiles-service/agent-profiles-service.api";
|
|
2
|
+
/**
|
|
3
|
+
* Shared key so any picker instance can observe an in-flight activation via
|
|
4
|
+
* `useIsMutating` (the pill button and the menu that fires it are separate
|
|
5
|
+
* hook instances, so per-observer `isPending` wouldn't line up).
|
|
6
|
+
*/
|
|
7
|
+
export declare const ACTIVATE_AGENT_PROFILE_MUTATION_KEY: string[];
|
|
8
|
+
/**
|
|
9
|
+
* Activate an agent profile by its stable UUID `id`. Activation is
|
|
10
|
+
* pointer-only (it does NOT write agent_settings), but it changes the launch
|
|
11
|
+
* default the backend resolves for new conversations, so the settings cache is
|
|
12
|
+
* invalidated defensively alongside the profiles list.
|
|
13
|
+
*
|
|
14
|
+
* The active pointer is flipped optimistically so the picker label and the
|
|
15
|
+
* launch default (`useCreateConversation` reads `active_agent_profile_id`)
|
|
16
|
+
* reflect the selection before the refetch lands. Errors roll the pointer back
|
|
17
|
+
* and surface via the global mutation toast (no `meta.disableToast`) so a
|
|
18
|
+
* failure isn't silent when fired from the chat-input picker, whose menu
|
|
19
|
+
* unmounts on select.
|
|
20
|
+
*/
|
|
21
|
+
export declare function useActivateAgentProfile(): import("@tanstack/react-query").UseMutationResult<import("@openhands/typescript-client").ActivateAgentProfileResponse, import("axios").AxiosError<unknown, any>, string, {
|
|
22
|
+
snapshots: [readonly unknown[], AgentProfileListResponse | undefined][];
|
|
23
|
+
}>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { AGENT_PROFILES_QUERY_KEYS as e, SETTINGS_QUERY_KEYS as t } from "../query/query-keys.js";
|
|
2
|
+
import { useQueryClient as n } from "../../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js";
|
|
3
|
+
import { useMutation as r } from "../../node_modules/@tanstack/react-query/build/modern/useMutation.js";
|
|
4
|
+
import i from "../../api/settings-service/settings-service.api.js";
|
|
5
|
+
import a from "../../api/agent-profiles-service/agent-profiles-service.api.js";
|
|
6
|
+
//#region src/hooks/mutation/use-activate-agent-profile.ts
|
|
7
|
+
var o = ["activate-agent-profile"];
|
|
8
|
+
function s() {
|
|
9
|
+
let s = n();
|
|
10
|
+
return r({
|
|
11
|
+
mutationKey: o,
|
|
12
|
+
mutationFn: (e) => a.activateProfile(e),
|
|
13
|
+
onMutate: async (t) => {
|
|
14
|
+
await s.cancelQueries({ queryKey: e.all });
|
|
15
|
+
let n = s.getQueriesData({ queryKey: e.all });
|
|
16
|
+
return s.setQueriesData({ queryKey: e.all }, (e) => e && {
|
|
17
|
+
...e,
|
|
18
|
+
active_agent_profile_id: t
|
|
19
|
+
}), { snapshots: n };
|
|
20
|
+
},
|
|
21
|
+
onError: (e, t, n) => {
|
|
22
|
+
n?.snapshots?.forEach(([e, t]) => {
|
|
23
|
+
s.setQueryData(e, t);
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
onSuccess: async () => {
|
|
27
|
+
i.invalidateCache(), await s.invalidateQueries({ queryKey: e.all }), await s.invalidateQueries({ queryKey: t.personal() });
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
export { o as ACTIVATE_AGENT_PROFILE_MUTATION_KEY, s as useActivateAgentProfile };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=use-activate-agent-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-activate-agent-profile.js","names":[],"sources":["../../../src/hooks/mutation/use-activate-agent-profile.ts"],"sourcesContent":["import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport AgentProfilesService, {\n type AgentProfileListResponse,\n} from \"#/api/agent-profiles-service/agent-profiles-service.api\";\nimport SettingsService from \"#/api/settings-service/settings-service.api\";\nimport {\n AGENT_PROFILES_QUERY_KEYS,\n SETTINGS_QUERY_KEYS,\n} from \"#/hooks/query/query-keys\";\n\n/**\n * Shared key so any picker instance can observe an in-flight activation via\n * `useIsMutating` (the pill button and the menu that fires it are separate\n * hook instances, so per-observer `isPending` wouldn't line up).\n */\nexport const ACTIVATE_AGENT_PROFILE_MUTATION_KEY = [\"activate-agent-profile\"];\n\n/**\n * Activate an agent profile by its stable UUID `id`. Activation is\n * pointer-only (it does NOT write agent_settings), but it changes the launch\n * default the backend resolves for new conversations, so the settings cache is\n * invalidated defensively alongside the profiles list.\n *\n * The active pointer is flipped optimistically so the picker label and the\n * launch default (`useCreateConversation` reads `active_agent_profile_id`)\n * reflect the selection before the refetch lands. Errors roll the pointer back\n * and surface via the global mutation toast (no `meta.disableToast`) so a\n * failure isn't silent when fired from the chat-input picker, whose menu\n * unmounts on select.\n */\nexport function useActivateAgentProfile() {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationKey: ACTIVATE_AGENT_PROFILE_MUTATION_KEY,\n mutationFn: (profileId: string) =>\n AgentProfilesService.activateProfile(profileId),\n onMutate: async (profileId) => {\n await queryClient.cancelQueries({\n queryKey: AGENT_PROFILES_QUERY_KEYS.all,\n });\n const snapshots = queryClient.getQueriesData<AgentProfileListResponse>({\n queryKey: AGENT_PROFILES_QUERY_KEYS.all,\n });\n queryClient.setQueriesData<AgentProfileListResponse>(\n { queryKey: AGENT_PROFILES_QUERY_KEYS.all },\n (prev) =>\n prev ? { ...prev, active_agent_profile_id: profileId } : prev,\n );\n return { snapshots };\n },\n onError: (_err, _profileId, context) => {\n context?.snapshots?.forEach(([key, data]) => {\n queryClient.setQueryData(key, data);\n });\n },\n onSuccess: async () => {\n SettingsService.invalidateCache();\n await queryClient.invalidateQueries({\n queryKey: AGENT_PROFILES_QUERY_KEYS.all,\n });\n await queryClient.invalidateQueries({\n queryKey: SETTINGS_QUERY_KEYS.personal(),\n });\n },\n });\n}\n"],"mappings":";;;;;;AAeA,IAAa,IAAsC,CAAC,yBAAyB;AAe7E,SAAgB,IAA0B;CACxC,IAAM,IAAc,GAAgB;AAEpC,QAAO,EAAY;EACjB,aAAa;EACb,aAAa,MACX,EAAqB,gBAAgB,EAAU;EACjD,UAAU,OAAO,MAAc;AAC7B,SAAM,EAAY,cAAc,EAC9B,UAAU,EAA0B,KACrC,CAAC;GACF,IAAM,IAAY,EAAY,eAAyC,EACrE,UAAU,EAA0B,KACrC,CAAC;AAMF,UALA,EAAY,eACV,EAAE,UAAU,EAA0B,KAAK,GAC1C,MACC,KAAO;IAAE,GAAG;IAAM,yBAAyB;IAAW,CACzD,EACM,EAAE,cAAW;;EAEtB,UAAU,GAAM,GAAY,MAAY;AACtC,MAAS,WAAW,SAAS,CAAC,GAAK,OAAU;AAC3C,MAAY,aAAa,GAAK,EAAK;KACnC;;EAEJ,WAAW,YAAY;AAKrB,GAJA,EAAgB,iBAAiB,EACjC,MAAM,EAAY,kBAAkB,EAClC,UAAU,EAA0B,KACrC,CAAC,EACF,MAAM,EAAY,kBAAkB,EAClC,UAAU,EAAoB,UAAU,EACzC,CAAC;;EAEL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`../../_virtual/_rolldown/runtime.cjs`),require(`../../api/
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`),require(`../../api/profiles-service/profiles-service.api.cjs`),require(`../../api/settings-service/settings-service.api.cjs`);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../query/query-keys.cjs`),t=require(`../../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs`),n=require(`../../node_modules/@tanstack/react-query/build/modern/useMutation.cjs`),r=require(`../../
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../query/query-keys.cjs`),t=require(`../../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs`),n=require(`../../node_modules/@tanstack/react-query/build/modern/useMutation.cjs`),r=require(`../../utils/mcp-config.cjs`),i=require(`../../api/settings-service/settings-service.api.cjs`),a=require(`../query/use-settings.cjs`);function o(){let o=t.useQueryClient(),{data:s}=a.useSettings();return n.useMutation({mutationFn:async e=>{if(!s)return;let t=r.parseMcpConfig(s.agent_settings?.mcp_config),n={sse_servers:[...t.sse_servers],stdio_servers:[...t.stdio_servers],shttp_servers:[...t.shttp_servers]};e.type===`sse`?n.sse_servers.push(r.toMcpSseServer(e)):e.type===`stdio`?n.stdio_servers.push(r.toMcpStdioServer(e)):e.type===`shttp`&&n.shttp_servers.push(r.toMcpShttpServer(e)),await i.default.saveSettings({agent_settings_diff:{mcp_config:r.toSdkMcpConfig(n)}})},onSuccess:()=>{o.invalidateQueries({queryKey:e.SETTINGS_QUERY_KEYS.personal()})}})}exports.useAddMcpServer=o;
|
|
2
2
|
//# sourceMappingURL=use-add-mcp-server.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-add-mcp-server.cjs","names":[],"sources":["../../../src/hooks/mutation/use-add-mcp-server.ts"],"sourcesContent":["import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useSettings } from \"#/hooks/query/use-settings\";\nimport SettingsService from \"#/api/settings-service/settings-service.api\";\nimport {
|
|
1
|
+
{"version":3,"file":"use-add-mcp-server.cjs","names":[],"sources":["../../../src/hooks/mutation/use-add-mcp-server.ts"],"sourcesContent":["import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { useSettings } from \"#/hooks/query/use-settings\";\nimport SettingsService from \"#/api/settings-service/settings-service.api\";\nimport { MCPConfig } from \"#/types/settings\";\nimport type { MCPServerConfig } from \"#/types/mcp-server\";\nimport {\n parseMcpConfig,\n toMcpShttpServer,\n toMcpSseServer,\n toMcpStdioServer,\n toSdkMcpConfig,\n} from \"#/utils/mcp-config\";\nimport { SETTINGS_QUERY_KEYS } from \"#/hooks/query/query-keys\";\n\nexport function useAddMcpServer() {\n const queryClient = useQueryClient();\n const { data: settings } = useSettings();\n\n return useMutation({\n mutationFn: async (server: MCPServerConfig): Promise<void> => {\n if (!settings) return;\n\n const currentConfig = parseMcpConfig(settings.agent_settings?.mcp_config);\n\n const newConfig: MCPConfig = {\n sse_servers: [...currentConfig.sse_servers],\n stdio_servers: [...currentConfig.stdio_servers],\n shttp_servers: [...currentConfig.shttp_servers],\n };\n\n if (server.type === \"sse\") {\n newConfig.sse_servers.push(toMcpSseServer(server));\n } else if (server.type === \"stdio\") {\n newConfig.stdio_servers.push(toMcpStdioServer(server));\n } else if (server.type === \"shttp\") {\n newConfig.shttp_servers.push(toMcpShttpServer(server));\n }\n\n await SettingsService.saveSettings({\n agent_settings_diff: { mcp_config: toSdkMcpConfig(newConfig) },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: SETTINGS_QUERY_KEYS.personal(),\n });\n },\n });\n}\n"],"mappings":"yZAcA,SAAgB,GAAkB,CAChC,IAAM,EAAc,EAAA,gBAAgB,CAC9B,CAAE,KAAM,GAAa,EAAA,aAAa,CAExC,OAAO,EAAA,YAAY,CACjB,WAAY,KAAO,IAA2C,CAC5D,GAAI,CAAC,EAAU,OAEf,IAAM,EAAgB,EAAA,eAAe,EAAS,gBAAgB,WAAW,CAEnE,EAAuB,CAC3B,YAAa,CAAC,GAAG,EAAc,YAAY,CAC3C,cAAe,CAAC,GAAG,EAAc,cAAc,CAC/C,cAAe,CAAC,GAAG,EAAc,cAAc,CAChD,CAEG,EAAO,OAAS,MAClB,EAAU,YAAY,KAAK,EAAA,eAAe,EAAO,CAAC,CACzC,EAAO,OAAS,QACzB,EAAU,cAAc,KAAK,EAAA,iBAAiB,EAAO,CAAC,CAC7C,EAAO,OAAS,SACzB,EAAU,cAAc,KAAK,EAAA,iBAAiB,EAAO,CAAC,CAGxD,MAAM,EAAA,QAAgB,aAAa,CACjC,oBAAqB,CAAE,WAAY,EAAA,eAAe,EAAU,CAAE,CAC/D,CAAC,EAEJ,cAAiB,CACf,EAAY,kBAAkB,CAC5B,SAAU,EAAA,oBAAoB,UAAU,CACzC,CAAC,EAEL,CAAC"}
|
|
@@ -1,13 +1,2 @@
|
|
|
1
|
-
type
|
|
2
|
-
interface MCPServerConfig {
|
|
3
|
-
type: MCPServerType;
|
|
4
|
-
name?: string;
|
|
5
|
-
url?: string;
|
|
6
|
-
api_key?: string;
|
|
7
|
-
timeout?: number;
|
|
8
|
-
command?: string;
|
|
9
|
-
args?: string[];
|
|
10
|
-
env?: Record<string, string>;
|
|
11
|
-
}
|
|
1
|
+
import type { MCPServerConfig } from "#/types/mcp-server";
|
|
12
2
|
export declare function useAddMcpServer(): import("@tanstack/react-query").UseMutationResult<void, import("axios").AxiosError<unknown, any>, MCPServerConfig, unknown>;
|
|
13
|
-
export {};
|
|
@@ -1,52 +1,28 @@
|
|
|
1
1
|
import { SETTINGS_QUERY_KEYS as e } from "../query/query-keys.js";
|
|
2
2
|
import { useQueryClient as t } from "../../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js";
|
|
3
3
|
import { useMutation as n } from "../../node_modules/@tanstack/react-query/build/modern/useMutation.js";
|
|
4
|
-
import r from "../../
|
|
5
|
-
import
|
|
6
|
-
import { useSettings as
|
|
4
|
+
import { parseMcpConfig as r, toMcpShttpServer as i, toMcpSseServer as a, toMcpStdioServer as o, toSdkMcpConfig as s } from "../../utils/mcp-config.js";
|
|
5
|
+
import c from "../../api/settings-service/settings-service.api.js";
|
|
6
|
+
import { useSettings as l } from "../query/use-settings.js";
|
|
7
7
|
//#region src/hooks/mutation/use-add-mcp-server.ts
|
|
8
|
-
function
|
|
9
|
-
let
|
|
8
|
+
function u() {
|
|
9
|
+
let u = t(), { data: d } = l();
|
|
10
10
|
return n({
|
|
11
11
|
mutationFn: async (e) => {
|
|
12
|
-
if (!
|
|
13
|
-
let t =
|
|
12
|
+
if (!d) return;
|
|
13
|
+
let t = r(d.agent_settings?.mcp_config), n = {
|
|
14
14
|
sse_servers: [...t.sse_servers],
|
|
15
15
|
stdio_servers: [...t.stdio_servers],
|
|
16
16
|
shttp_servers: [...t.shttp_servers]
|
|
17
17
|
};
|
|
18
|
-
|
|
19
|
-
let t = {
|
|
20
|
-
...e.name && { name: e.name },
|
|
21
|
-
url: e.url,
|
|
22
|
-
...e.api_key && { api_key: e.api_key }
|
|
23
|
-
};
|
|
24
|
-
n.sse_servers.push(t);
|
|
25
|
-
} else if (e.type === "stdio") {
|
|
26
|
-
let t = {
|
|
27
|
-
name: e.name,
|
|
28
|
-
command: e.command,
|
|
29
|
-
...e.args && { args: e.args },
|
|
30
|
-
...e.env && { env: e.env }
|
|
31
|
-
};
|
|
32
|
-
n.stdio_servers.push(t);
|
|
33
|
-
} else if (e.type === "shttp") {
|
|
34
|
-
let t = {
|
|
35
|
-
...e.name && { name: e.name },
|
|
36
|
-
url: e.url,
|
|
37
|
-
...e.api_key && { api_key: e.api_key },
|
|
38
|
-
...e.timeout !== void 0 && { timeout: e.timeout }
|
|
39
|
-
};
|
|
40
|
-
n.shttp_servers.push(t);
|
|
41
|
-
}
|
|
42
|
-
await r.saveSettings({ agent_settings_diff: { mcp_config: a(n) } });
|
|
18
|
+
e.type === "sse" ? n.sse_servers.push(a(e)) : e.type === "stdio" ? n.stdio_servers.push(o(e)) : e.type === "shttp" && n.shttp_servers.push(i(e)), await c.saveSettings({ agent_settings_diff: { mcp_config: s(n) } });
|
|
43
19
|
},
|
|
44
20
|
onSuccess: () => {
|
|
45
|
-
|
|
21
|
+
u.invalidateQueries({ queryKey: e.personal() });
|
|
46
22
|
}
|
|
47
23
|
});
|
|
48
24
|
}
|
|
49
25
|
//#endregion
|
|
50
|
-
export {
|
|
26
|
+
export { u as useAddMcpServer };
|
|
51
27
|
|
|
52
28
|
//# sourceMappingURL=use-add-mcp-server.js.map
|