@openhands/agent-canvas 1.15.0 → 1.17.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 +15 -1
- package/README.windows.md +2 -2
- package/build/assets/{acp-providers-BKvmTf82.js → acp-providers-DrjNsPOH.js} +1 -1
- package/build/assets/active-backend-context-rZiLJRUc.js +2 -0
- package/build/assets/{agent-context-settings-D3PjSTU1.js → agent-context-settings-CJUrcBut.js} +1 -1
- package/build/assets/agent-profiles-service.api-Biieml2L.js +1 -0
- package/build/assets/agent-profiles-settings-x6RvPsq7.js +1 -0
- package/build/assets/agent-server-client-options-BikiNwTa.js +1 -0
- package/build/assets/agent-server-conversation-service.api-DYFsNHKf.js +88 -0
- package/build/assets/agent-settings-BJyovpJ_.js +1 -0
- package/build/assets/agent-settings-CpY3zObk.js +2 -0
- package/build/assets/alert-banner-vARz1idS.js +1 -0
- package/build/assets/{api-error-message-BJyfWp6p.js → api-error-message-Ve79qDcN.js} +1 -1
- package/build/assets/api-key-entry-screen-CsMuBhoP.js +1 -0
- package/build/assets/{app-settings-CbHqzQus.js → app-settings-BaJ7nfHt.js} +1 -1
- package/build/assets/automation-detail-CVoGDrKq.js +3 -0
- package/build/assets/{automation-export-BRopEHMu.js → automation-export-DxY47m3T.js} +1 -1
- package/build/assets/automation-git-sync-CRMP9Bbm.js +1 -0
- package/build/assets/automation-setup-route-072beLz1.js +3 -0
- package/build/assets/{automation-templates-C_0FZgLG.js → automation-templates-4C4PM8K7.js} +1 -1
- package/build/assets/automations-list-xuqTSQL4.js +1 -0
- package/build/assets/{back-nav-button-Dm9tIjVf.js → back-nav-button-B8tH0BEp.js} +1 -1
- package/build/assets/backend-form-modal-0aJmWdsa.js +1 -0
- package/build/assets/{backend-synced-settings-badge-3fOwg6Bd.js → backend-synced-settings-badge-B7rKWBir.js} +1 -1
- package/build/assets/{badge-D4SqUCsR.js → badge-CcGx2TaV.js} +1 -1
- package/build/assets/{base-modal-C7_BDl_U.js → base-modal-DTULovNc.js} +1 -1
- package/build/assets/bot-CLMxGFaq.js +1 -0
- package/build/assets/{brand-button-Dxv6PDeN.js → brand-button-DxPO4Lf8.js} +1 -1
- package/build/assets/browser-C-_qBasq.js +46 -0
- package/build/assets/{browser-tab-BAl4ckJE.js → browser-tab-DZanIw5m.js} +1 -1
- package/build/assets/canvas-extension-page-o_cWgE9B.js +1 -0
- package/build/assets/canvas-extensions-DSgNlCha.js +1 -0
- package/build/assets/canvas-extensions-runtime-DdnkgJXV.js +1 -0
- package/build/assets/{chat-send-button-DWwR2cgI.js → chat-send-button-B3SFSIg5.js} +1 -1
- package/build/assets/check-fDEfgSzj.js +1 -0
- package/build/assets/chevron-down-CFrWHqu8.js +1 -0
- package/build/assets/chevron-right-C5roOrJu.js +1 -0
- package/build/assets/circle-check-ClTzJTdb.js +1 -0
- package/build/assets/{circle-plus-check-toggle-CBh_qomE.js → circle-plus-check-toggle-Fr-h-mbL.js} +1 -1
- package/build/assets/{cloud-funnel-analytics-287iIERo.js → cloud-funnel-analytics-BQanUEEC.js} +1 -1
- package/build/assets/{cog-C4rrw-ZK.js → cog-VBlRo6iw.js} +1 -1
- package/build/assets/command-menu-BT3Ia5Ru.js +1 -0
- package/build/assets/commits-tab-2jhtaohl.js +1 -0
- package/build/assets/{condenser-settings-BcNmYR4s.js → condenser-settings-eVKFMvap.js} +1 -1
- package/build/assets/confirmation-modal-gIFHeZt6.js +1 -0
- package/build/assets/{context-menu-list-item-lVYETtY5.js → context-menu-list-item-DDROe12Z.js} +1 -1
- package/build/assets/conversation-BnjJSFf5.js +93 -0
- package/build/assets/conversation-DZ578rOX.js +1 -0
- package/build/assets/conversation-panel-DZ578rOX.js +1 -0
- package/build/assets/conversation-state-store-D1_G_9I-.js +1 -0
- package/build/assets/{conversation-store-Ca3ghXap.js → conversation-store-DVVfkCsk.js} +1 -1
- package/build/assets/{conversation-tab-empty-state-HJtkmHZj.js → conversation-tab-empty-state-DKlzAz5c.js} +1 -1
- package/build/assets/{copy-to-clipboard-button-Cjkswvnj.js → copy-to-clipboard-button-B3w0X7WH.js} +1 -1
- package/build/assets/{device-verify-EZhHhBT7.js → device-verify-BfkCzyFB.js} +1 -1
- package/build/assets/{dropdown-classes-DJe-E6MC.js → dropdown-classes-B9kJVDIk.js} +1 -1
- package/build/assets/edit-automation-modal-BwhJ39JT.js +1 -0
- package/build/assets/empty-state-RZz0OfnY.js +1 -0
- package/build/assets/{entry.client-C7Bi2tkU.js → entry.client-Ds8LVp-E.js} +2 -2
- package/build/assets/enum-filter-dropdown-C4pW0ORd.js +1 -0
- package/build/assets/{environment-switch-overlay-CEKrFiMw.js → environment-switch-overlay-P2ZAuzov.js} +1 -1
- package/build/assets/{error-state-BALXiBNy.js → error-state-B_5cgNPJ.js} +1 -1
- package/build/assets/extensions-hub-DsaUr4ca.js +1 -0
- package/build/assets/extensions-navigation-CRMZd-FE.js +1 -0
- package/build/assets/external-link-DQtv7eTh.js +1 -0
- package/build/assets/files-tab-CCgAcVdc.js +1 -0
- package/build/assets/{form-control-classes-CGw40z5h.js → form-control-classes-B-z85REi.js} +1 -1
- package/build/assets/format-model-name-CasAP3nd.js +1 -0
- package/build/assets/get-git-path-EHrSDxTM.js +1 -0
- package/build/assets/git-repo-dropdown-D2WEQ97X.js +1 -0
- package/build/assets/{git-repo-dropdown-ai8qaNkD.js → git-repo-dropdown-DVeCUUXG.js} +1 -1
- package/build/assets/{highlighted-source-view-C3sxykQi.js → highlighted-source-view-DjHO3SdW.js} +1 -1
- package/build/assets/home-BorS_vdS.js +1 -0
- package/build/assets/home-aIMbHw5M.js +1 -0
- package/build/assets/home-automation-run-tooltip-CpHNFiFl.js +1 -0
- package/build/assets/home-store-DyXz0w6d.js +1 -0
- package/build/assets/hooks-service-C6dpRtZM.js +1 -0
- package/build/assets/index-home-zKFuKK2B.js +1 -0
- package/build/assets/info-CTIdjttz.js +1 -0
- package/build/assets/install-server-modal-DUiZMc8u.js +1 -0
- package/build/assets/kebab-menu-item-content-mm04SBD3.js +1 -0
- package/build/assets/{key-Cn5za3rg.js → key-CfXbJa8w.js} +1 -1
- package/build/assets/{launch-C1ieiOGe.js → launch-BSIf9KEg.js} +1 -1
- package/build/assets/list-filter-CNpqTWVY.js +1 -0
- package/build/assets/{list-todo-Cuu-STFc.js → list-todo-ByXMdY4W.js} +1 -1
- package/build/assets/llm-not-configured-banner-z_QRSeV0.js +27 -0
- package/build/assets/llm-settings-B-5AHMiX.js +1 -0
- package/build/assets/llm-settings-B3SjHDmA.js +1 -0
- package/build/assets/llm-subscription-service-aDNBQ7Gq.js +1 -0
- package/build/assets/loader-circle-Dex47vVW.js +1 -0
- package/build/assets/{loading-spinner-0L3ZTToZ.js → loading-spinner-DfHI77BA.js} +1 -1
- package/build/assets/manage-backends-modal-q1NdFisr.js +1 -0
- package/build/assets/manifest-8920b615.js +1 -0
- package/build/assets/{manifest-subpage-layout-BGhiUQbA.js → manifest-subpage-layout-BQQy5ipR.js} +1 -1
- package/build/assets/{map-provider-B9LTm23I.js → map-provider-DXvssjw9.js} +1 -1
- package/build/assets/markdown-renderer-rivLvYh-.js +8 -0
- package/build/assets/{mcp-CKbR4Vft.js → mcp-CEXDhQWn.js} +1 -1
- package/build/assets/{mcp-marketplace-utils-C13fFccR.js → mcp-marketplace-utils-Cn_NIMWM.js} +1 -1
- package/build/assets/mcp-page-LGYIICMG.js +9 -0
- package/build/assets/messages-DUSeANAh.js +41 -0
- package/build/assets/{modal-body-CMOc2tLl.js → modal-body-DJw4xBki.js} +1 -1
- package/build/assets/{modal-classes-BAb4Y_BG.js → modal-classes-Dg0ngBPO.js} +1 -1
- package/build/assets/{modal-close-button-CkJ0Ktjj.js → modal-close-button-B9j4nasm.js} +1 -1
- package/build/assets/{mouse-pointer-click-CsgRs_-r.js → mouse-pointer-click-DEhsSUpu.js} +1 -1
- package/build/assets/onboarding-BjFebfs5.js +1 -0
- package/build/assets/onboarding-modal-DDTjOpyd.js +1 -0
- package/build/assets/organization-service.api-Cyg1Tn03.js +1 -0
- package/build/assets/pencil-D5c47kyN.js +1 -0
- package/build/assets/pin-C7vMagvf.js +1 -0
- package/build/assets/planner-tab-D8f2Y3rn.js +1 -0
- package/build/assets/plug-CeaqeF6u.js +1 -0
- package/build/assets/plugins-management-service-Bh_pBuf-.js +1 -0
- package/build/assets/plus-B3wvU06-.js +1 -0
- package/build/assets/profiles-service.api-BbOK0EkF.js +1 -0
- package/build/assets/providers-2gIIkz2N.js +1 -0
- package/build/assets/proxy-CBgMd2zf.js +1 -0
- package/build/assets/{puzzle-A9pGxxai.js → puzzle-DdAqbUrb.js} +1 -1
- package/build/assets/recommended-automations-launcher-YLAQTp4s.js +1 -0
- package/build/assets/refresh-cw-DEQdPCpH.js +1 -0
- package/build/assets/root-Bye_XmEL.js +2 -0
- package/build/assets/root-Cnwwzgo0.css +1 -0
- package/build/assets/root-layout-CSAwxBGM.js +2 -0
- package/build/assets/schema-field-CK0xYNbO.js +1 -0
- package/build/assets/scroll-fade-state-Dt_fx2kf.js +1 -0
- package/build/assets/sdk-section-page-Da73Rs_o.js +1 -0
- package/build/assets/secret-form-CB2VwYYg.js +1 -0
- package/build/assets/secrets-service-Cr8g8xuv.js +1 -0
- package/build/assets/{secrets-settings-BizaTEr1.js → secrets-settings-Bh0udeKv.js} +1 -1
- package/build/assets/settings-CKqk8ZnH.js +1 -0
- package/build/assets/settings-DmyIgRxO.js +1 -0
- package/build/assets/{settings-dropdown-input-tM0A0ipy.js → settings-dropdown-input-DVpyD87C.js} +1 -1
- package/build/assets/settings-index-BSJUFmjE.js +1 -0
- package/build/assets/{settings-input-C03KUoSC.js → settings-input-C0dd8Utu.js} +1 -1
- package/build/assets/{settings-list-classes-BJ0g8rWj.js → settings-list-classes-Ds4jPBHK.js} +1 -1
- package/build/assets/{settings-modal-AzEF1QPP.js → settings-modal-yStgEh2o.js} +1 -1
- package/build/assets/settings-service.api-9_xdv_mh.js +1 -0
- package/build/assets/{settings-switch-CQE0EGC-.js → settings-switch-B78Khmyz.js} +1 -1
- package/build/assets/{settings-utils-ClYOkbbI.js → settings-utils-8GIIgOQL.js} +1 -1
- package/build/assets/shared-conversation-DM96X4KV.js +1 -0
- package/build/assets/shield-check-DO7wa_eu.js +1 -0
- package/build/assets/{sidebar-layout-D3hE08wK.js → sidebar-layout-EPfWxk11.js} +1 -1
- package/build/assets/sidebar-mobile-menu-toggle-D5GR5xT9.js +1 -0
- package/build/assets/sidebar-nav-link-_t4_Ef-9.js +1 -0
- package/build/assets/{sidebar-onboarding-checklist-storage-3qYflszY.js → sidebar-onboarding-checklist-storage-DbDX-Wvj.js} +1 -1
- package/build/assets/sidebar-store-CSDFK0W5.js +1 -0
- package/build/assets/{skill-card-pill-row-CFxjoqxn.js → skill-card-pill-row-989y15jV.js} +1 -1
- package/build/assets/skill-enablement-DXeaImBz.js +1 -0
- package/build/assets/skill-filter-BBeZ4JEP.js +2 -0
- package/build/assets/{skill-icon-badge-CPQJ6A-I.js → skill-icon-badge-BDhQ-tQ0.js} +1 -1
- package/build/assets/skill-scope-Dz3kPH3P.js +1 -0
- package/build/assets/skills-plugins-e3CYGdUJ.js +1 -0
- package/build/assets/skills-settings-3e-FuHw_.js +1 -0
- package/build/assets/styled-tooltip-Pd22BIvr.js +1 -0
- package/build/assets/{task-list-tab-04GNQuii.js → task-list-tab-3Jg8ywch.js} +1 -1
- package/build/assets/{terminal-Cj0iHIW7.js → terminal-onXx0_Qz.js} +1 -1
- package/build/assets/toggle-switch-lwQtxDcm.js +1 -0
- package/build/assets/trash-2-ZhKuTLiz.js +1 -0
- package/build/assets/trash-B6OIe4yX.js +1 -0
- package/build/assets/triangle-alert-BajLPpQg.js +1 -0
- package/build/assets/{typography-SgFy466J.js → typography-HLLg_FAn.js} +1 -1
- package/build/assets/usage-tab-Cm-9j3UK.js +1 -0
- package/build/assets/use-acp-credential-form-BARcvjYE.js +1 -0
- package/build/assets/use-activate-agent-profile-BLKML6vQ.js +1 -0
- package/build/assets/use-agent-profiles-1P91KSXz.js +1 -0
- package/build/assets/{use-automation-health-BxXdzZMP.js → use-automation-health-BZkQNEA8.js} +1 -1
- package/build/assets/use-automation-permissions-B_RpvL-s.js +1 -0
- package/build/assets/{use-automations-zYb0dUny.js → use-automations-Cg0PDIZr.js} +1 -1
- package/build/assets/{use-can-manage-org-profiles-BWMahtUh.js → use-can-manage-org-profiles-BbN6KfDr.js} +1 -1
- package/build/assets/use-canvas-extensions-CFUpHat6.js +1 -0
- package/build/assets/{use-cloud-current-user-id-CPHMDG-C.js → use-cloud-current-user-id-Dk0rjr63.js} +1 -1
- package/build/assets/use-config-DpafU_QP.js +1 -0
- package/build/assets/use-create-conversation-1YgmAHt-.js +1 -0
- package/build/assets/use-create-secret-D8p9ybQj.js +1 -0
- package/build/assets/{use-get-secrets-BT4ihRwj.js → use-get-secrets-CQ4b0qK8.js} +1 -1
- package/build/assets/use-is-authed-BRPjCRKM.js +1 -0
- package/build/assets/{use-launch-skill-in-chat-BYjYihBP.js → use-launch-skill-in-chat-DeYa1tFM.js} +1 -1
- package/build/assets/use-llm-configured-DGm8FiRR.js +1 -0
- package/build/assets/use-llm-profiles-BTTtpW4z.js +1 -0
- package/build/assets/use-manifest-capabilities-AOWGcu0j.js +1 -0
- package/build/assets/use-onboarding-completion-CoINurkm.js +1 -0
- package/build/assets/use-pinned-home-route-D6krwXjy.js +1 -0
- package/build/assets/use-plugins-marketplace-mLsIDhBv.js +1 -0
- package/build/assets/use-save-agent-profile-CxyO9YG-.js +1 -0
- package/build/assets/{use-save-settings-CUZW6yXP.js → use-save-settings-3U5K9-8x.js} +1 -1
- package/build/assets/use-settings-Dn00UISA.js +1 -0
- package/build/assets/use-settings-nav-items-vrjxTqcu.js +16 -0
- package/build/assets/use-tracking-B9prBsrq.js +3 -0
- package/build/assets/{use-user-conversation-DT0_QCnL.js → use-user-conversation-ZWlXtbZb.js} +1 -1
- package/build/assets/{useInfiniteQuery-CgeUQPfs.js → useInfiniteQuery-BzrRqjLg.js} +1 -1
- package/build/assets/{useMutation-DFnzkf6f.js → useMutation-CJuK90oc.js} +1 -1
- package/build/assets/{useQueries-BhbrGEf1.js → useQueries-CykmpT-a.js} +1 -1
- package/build/assets/{useQuery-BXWbZBZl.js → useQuery-S6j94er1.js} +1 -1
- package/build/assets/utils-BOco8mxR.js +1 -0
- package/build/assets/{vendor~conversation-panel~conversation-CTvDDiXg.js → vendor~conversation-panel~conversation-4eJ0tml3.js} +1 -1
- package/build/assets/{vendor~entry.client-BFE7Llz9.js → vendor~entry.client-CoCfUXUF.js} +1 -1
- package/build/assets/{vendor~entry.client-BaKt_PIp.js → vendor~entry.client-DA2izTjq.js} +1 -1
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-Z0lly3FE.js +2 -0
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BfkNGovw.js +185 -0
- package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew3u153i-rfV8mQ9m.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-DnDoaYNi.js} +1 -1
- package/build/assets/{vendor~index-home~home~conversation-panel~conversation-BTyukeM-.js → vendor~index-home~home~conversation-panel~conversation-CSFLzmTN.js} +1 -1
- package/build/assets/vendor~root-layout-n8XCEXG8.js +1 -0
- package/build/assets/{vendor~root-layout~conversation-panel~conversation-BYAWJwQX.js → vendor~root-layout~conversation-panel~conversation-3Idg1_U3.js} +1 -1
- package/build/assets/{vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-CHaLEBVR.js → vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-DkPlXWl9.js} +1 -1
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation-DgQ564nC.js +1 -0
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-CxhwKuAd.js +1 -0
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-Dtu7BpYk.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~inibp4qe-CnsDDzeE.js} +2 -2
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-CV850oio.js +1 -0
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-DonTKfQD.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-BPjI-atc.js} +125 -15
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-BgxDvUcf.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-C7HiY4Ae.js} +42 -3
- package/build/assets/{verification-settings-Bj6bo097.js → verification-settings-u2POabjH.js} +1 -1
- package/build/assets/{wrench-hi7Q13dF.js → wrench-CkgI4rxA.js} +1 -1
- package/build/assets/x-By6qCmtY.js +1 -0
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +94 -25
- package/build/locales/ca/openhands.json +94 -25
- package/build/locales/de/openhands.json +94 -25
- package/build/locales/en/openhands.json +94 -25
- package/build/locales/es/openhands.json +94 -25
- package/build/locales/fr/openhands.json +94 -25
- package/build/locales/it/openhands.json +94 -25
- package/build/locales/ja/openhands.json +94 -25
- package/build/locales/ko-KR/openhands.json +94 -25
- package/build/locales/no/openhands.json +94 -25
- package/build/locales/pt/openhands.json +94 -25
- package/build/locales/tr/openhands.json +94 -25
- package/build/locales/uk/openhands.json +94 -25
- package/build/locales/zh-CN/openhands.json +94 -25
- package/build/locales/zh-TW/openhands.json +94 -25
- package/config/defaults.json +9 -5
- package/dist/api/agent-profiles-service/profile-field-support.d.ts +26 -0
- package/dist/api/agent-server-adapter.cjs +3 -3
- package/dist/api/agent-server-adapter.cjs.map +1 -1
- package/dist/api/agent-server-adapter.d.ts +72 -12
- package/dist/api/agent-server-adapter.js +249 -145
- 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.d.ts +21 -0
- package/dist/api/agent-server-compatibility.js +52 -38
- package/dist/api/agent-server-compatibility.js.map +1 -1
- package/dist/api/agent-server-config.cjs +1 -1
- package/dist/api/agent-server-config.cjs.map +1 -1
- package/dist/api/agent-server-config.d.ts +32 -0
- package/dist/api/agent-server-config.js +21 -5
- package/dist/api/agent-server-config.js.map +1 -1
- package/dist/api/automation-service/automation-service.api.cjs +1 -1
- package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
- package/dist/api/automation-service/automation-service.api.d.ts +2 -2
- package/dist/api/automation-service/automation-service.api.js +7 -7
- package/dist/api/automation-service/automation-service.api.js.map +1 -1
- package/dist/api/canvas-extensions-service.cjs +1 -0
- package/dist/api/canvas-extensions-service.d.ts +22 -0
- package/dist/api/canvas-extensions-service.js +4 -0
- package/dist/api/cloud/conversation-service.api.cjs +1 -1
- package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
- package/dist/api/cloud/conversation-service.api.d.ts +6 -0
- package/dist/api/cloud/conversation-service.api.js +14 -6
- package/dist/api/cloud/conversation-service.api.js.map +1 -1
- package/dist/api/cloud/provider-connections-service.api.cjs +2 -0
- package/dist/api/cloud/provider-connections-service.api.cjs.map +1 -0
- package/dist/api/cloud/provider-connections-service.api.d.ts +5 -0
- package/dist/api/cloud/provider-connections-service.api.js +50 -0
- package/dist/api/cloud/provider-connections-service.api.js.map +1 -0
- package/dist/api/cloud/skills-service.api.cjs +1 -1
- package/dist/api/cloud/skills-service.api.cjs.map +1 -1
- package/dist/api/cloud/skills-service.api.d.ts +10 -0
- package/dist/api/cloud/skills-service.api.js +11 -1
- package/dist/api/cloud/skills-service.api.js.map +1 -1
- package/dist/api/conversation-file-upload.api.cjs +1 -1
- package/dist/api/conversation-file-upload.api.js +10 -10
- package/dist/api/conversation-metadata-store.cjs +1 -1
- package/dist/api/conversation-metadata-store.cjs.map +1 -1
- package/dist/api/conversation-metadata-store.d.ts +24 -0
- package/dist/api/conversation-metadata-store.js +10 -2
- 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 +31 -0
- package/dist/api/conversation-service/agent-server-conversation-service.api.js +188 -128
- package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
- package/dist/api/event-service/event-service.api.cjs +1 -1
- package/dist/api/event-service/event-service.api.js +12 -12
- package/dist/api/git-service/agent-server-git-service.api.cjs +1 -1
- package/dist/api/git-service/agent-server-git-service.api.js +8 -8
- package/dist/api/hooks-service.cjs +2 -0
- package/dist/api/hooks-service.cjs.map +1 -0
- package/dist/api/hooks-service.d.ts +13 -0
- package/dist/api/hooks-service.js +20 -0
- package/dist/api/hooks-service.js.map +1 -0
- package/dist/api/provider-connections-service/provider-connections-service.api.cjs +1 -1
- package/dist/api/provider-connections-service/provider-connections-service.api.cjs.map +1 -1
- package/dist/api/provider-connections-service/provider-connections-service.api.js +25 -16
- package/dist/api/provider-connections-service/provider-connections-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.js +8 -8
- package/dist/api/settings-service/settings-service.api.cjs +1 -1
- package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
- package/dist/api/settings-service/settings-service.api.d.ts +5 -2
- package/dist/api/settings-service/settings-service.api.js +20 -11
- 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.d.ts +7 -0
- package/dist/api/skills-service.js +11 -8
- package/dist/api/skills-service.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/critic-result-display.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message-components/critic-result-display.js +5 -5
- package/dist/components/conversation-events/chat/event-message-components/event-group.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message-components/event-group.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/event-group.js +40 -36
- package/dist/components/conversation-events/chat/event-message-components/event-group.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/finish-event-message.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message-components/finish-event-message.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/finish-event-message.js +2 -1
- package/dist/components/conversation-events/chat/event-message-components/finish-event-message.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.d.ts +1 -1
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js +28 -28
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/thought-event-message.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message-components/thought-event-message.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/thought-event-message.js +2 -1
- package/dist/components/conversation-events/chat/event-message-components/thought-event-message.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.d.ts +1 -1
- package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js +37 -37
- 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 +79 -70
- package/dist/components/conversation-events/chat/event-message.js.map +1 -1
- package/dist/components/conversation-events/chat/messages.cjs +1 -1
- package/dist/components/conversation-events/chat/messages.cjs.map +1 -1
- package/dist/components/conversation-events/chat/messages.js +28 -27
- package/dist/components/conversation-events/chat/messages.js.map +1 -1
- package/dist/components/features/automations/automation-card.cjs +1 -1
- package/dist/components/features/automations/automation-card.cjs.map +1 -1
- package/dist/components/features/automations/automation-card.js +118 -102
- package/dist/components/features/automations/automation-card.js.map +1 -1
- package/dist/components/features/automations/automation-list-row.cjs +1 -1
- package/dist/components/features/automations/automation-list-row.cjs.map +1 -1
- package/dist/components/features/automations/automation-list-row.js +88 -77
- package/dist/components/features/automations/automation-list-row.js.map +1 -1
- package/dist/components/features/automations/detail/detail-header.d.ts +3 -1
- package/dist/components/features/automations/detail/run-phase.cjs +2 -0
- package/dist/components/features/automations/detail/run-phase.cjs.map +1 -0
- package/dist/components/features/automations/detail/run-phase.d.ts +89 -0
- package/dist/components/features/automations/detail/run-phase.js +72 -0
- package/dist/components/features/automations/detail/run-phase.js.map +1 -0
- package/dist/components/features/automations/detail/run-status-badge.cjs +1 -1
- package/dist/components/features/automations/detail/run-status-badge.cjs.map +1 -1
- package/dist/components/features/automations/detail/run-status-badge.d.ts +2 -2
- package/dist/components/features/automations/detail/run-status-badge.js +82 -53
- package/dist/components/features/automations/detail/run-status-badge.js.map +1 -1
- package/dist/components/features/automations/kebab-menu.cjs +1 -1
- package/dist/components/features/automations/kebab-menu.cjs.map +1 -1
- package/dist/components/features/automations/kebab-menu.js +9 -5
- package/dist/components/features/automations/kebab-menu.js.map +1 -1
- package/dist/components/features/automations/recommended-automations-launcher.cjs +1 -1
- package/dist/components/features/automations/recommended-automations-launcher.cjs.map +1 -1
- package/dist/components/features/automations/recommended-automations-launcher.js +12 -12
- package/dist/components/features/automations/recommended-automations-launcher.js.map +1 -1
- package/dist/components/features/automations/recommended-automations-section.cjs +1 -1
- package/dist/components/features/automations/recommended-automations-section.js +9 -9
- 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.js +5 -11
- package/dist/components/features/backends/backend-form-modal.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 +133 -122
- package/dist/components/features/backends/backend-selector.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 +29 -29
- package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
- package/dist/components/features/canvas-extensions/add-canvas-extension-modal.d.ts +6 -0
- package/dist/components/features/canvas-extensions/canvas-extension-card.d.ts +9 -0
- package/dist/components/features/canvas-extensions/canvas-extensions-runtime.cjs +2 -0
- package/dist/components/features/canvas-extensions/canvas-extensions-runtime.cjs.map +1 -0
- package/dist/components/features/canvas-extensions/canvas-extensions-runtime.d.ts +23 -0
- package/dist/components/features/canvas-extensions/canvas-extensions-runtime.js +19 -0
- package/dist/components/features/canvas-extensions/canvas-extensions-runtime.js.map +1 -0
- package/dist/components/features/chat/change-agent-button.cjs +1 -1
- package/dist/components/features/chat/change-agent-button.js +4 -4
- 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 +107 -104
- package/dist/components/features/chat/chat-interface.js.map +1 -1
- package/dist/components/features/chat/chat-markdown-path-code.cjs +3 -0
- package/dist/components/features/chat/chat-markdown-path-code.cjs.map +1 -0
- package/dist/components/features/chat/chat-markdown-path-code.d.ts +27 -0
- package/dist/components/features/chat/chat-markdown-path-code.js +72 -0
- package/dist/components/features/chat/chat-markdown-path-code.js.map +1 -0
- package/dist/components/features/chat/chat-message.cjs +1 -1
- package/dist/components/features/chat/chat-message.cjs.map +1 -1
- package/dist/components/features/chat/chat-message.d.ts +2 -1
- package/dist/components/features/chat/chat-message.js +88 -79
- package/dist/components/features/chat/chat-message.js.map +1 -1
- package/dist/components/features/chat/components/context-window-meter.cjs +1 -1
- package/dist/components/features/chat/components/context-window-meter.js +4 -4
- package/dist/components/features/chat/confirmation-mode-enabled.cjs +1 -1
- package/dist/components/features/chat/confirmation-mode-enabled.js +4 -4
- package/dist/components/features/chat/generic-event-message.cjs +1 -1
- package/dist/components/features/chat/generic-event-message.cjs.map +1 -1
- package/dist/components/features/chat/generic-event-message.d.ts +2 -1
- package/dist/components/features/chat/generic-event-message.js +41 -22
- package/dist/components/features/chat/generic-event-message.js.map +1 -1
- 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/path-component.cjs +1 -1
- package/dist/components/features/chat/path-component.cjs.map +1 -1
- package/dist/components/features/chat/path-component.d.ts +8 -2
- package/dist/components/features/chat/path-component.js +33 -21
- package/dist/components/features/chat/path-component.js.map +1 -1
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs +1 -1
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs.map +1 -1
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js +38 -43
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js.map +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs.map +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.d.ts +8 -5
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js +22 -16
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.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.d.ts +4 -0
- package/dist/components/features/chat/user-message-body.js +30 -24
- package/dist/components/features/chat/user-message-body.js.map +1 -1
- package/dist/components/features/conversation/conversation-overview-git-section.cjs +1 -1
- package/dist/components/features/conversation/conversation-overview-git-section.js +4 -4
- package/dist/components/features/conversation/conversation-overview-skills-panel.cjs +1 -1
- package/dist/components/features/conversation/conversation-overview-skills-panel.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-overview-skills-panel.js +63 -81
- package/dist/components/features/conversation/conversation-overview-skills-panel.js.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +77 -78
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +96 -96
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.d.ts +1 -1
- package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.js +3 -3
- package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.js.map +1 -1
- package/dist/components/features/conversation-panel/advanced-conversation-options-modal.cjs +2 -0
- package/dist/components/features/conversation-panel/advanced-conversation-options-modal.cjs.map +1 -0
- package/dist/components/features/conversation-panel/advanced-conversation-options-modal.d.ts +21 -0
- package/dist/components/features/conversation-panel/advanced-conversation-options-modal.js +239 -0
- package/dist/components/features/conversation-panel/advanced-conversation-options-modal.js.map +1 -0
- package/dist/components/features/conversation-panel/conversation-active-tag-filters.cjs +2 -0
- package/dist/components/features/conversation-panel/conversation-active-tag-filters.cjs.map +1 -0
- package/dist/components/features/conversation-panel/conversation-active-tag-filters.d.ts +28 -0
- package/dist/components/features/conversation-panel/conversation-active-tag-filters.js +69 -0
- package/dist/components/features/conversation-panel/conversation-active-tag-filters.js.map +1 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +2 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +19 -18
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.d.ts +2 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +91 -80
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +7 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.js +87 -81
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.d.ts +2 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.d.ts +2 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js +2 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-layouts-menu.cjs +2 -0
- package/dist/components/features/conversation-panel/conversation-layouts-menu.cjs.map +1 -0
- package/dist/components/features/conversation-panel/conversation-layouts-menu.d.ts +29 -0
- package/dist/components/features/conversation-panel/conversation-layouts-menu.js +177 -0
- package/dist/components/features/conversation-panel/conversation-layouts-menu.js.map +1 -0
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +37 -0
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +85 -45
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.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 +296 -290
- package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
- package/dist/components/features/conversation-panel/edit-conversation-tags-modal.cjs +2 -0
- package/dist/components/features/conversation-panel/edit-conversation-tags-modal.cjs.map +1 -0
- package/dist/components/features/conversation-panel/edit-conversation-tags-modal.d.ts +22 -0
- package/dist/components/features/conversation-panel/edit-conversation-tags-modal.js +153 -0
- package/dist/components/features/conversation-panel/edit-conversation-tags-modal.js.map +1 -0
- package/dist/components/features/conversation-panel/hide-older-conversations-row.cjs +2 -0
- package/dist/components/features/conversation-panel/hide-older-conversations-row.cjs.map +1 -0
- package/dist/components/features/conversation-panel/hide-older-conversations-row.d.ts +6 -0
- package/dist/components/features/conversation-panel/hide-older-conversations-row.js +65 -0
- package/dist/components/features/conversation-panel/hide-older-conversations-row.js.map +1 -0
- package/dist/components/features/conversation-panel/menu-row.cjs +1 -1
- package/dist/components/features/conversation-panel/menu-row.cjs.map +1 -1
- package/dist/components/features/conversation-panel/menu-row.d.ts +11 -1
- package/dist/components/features/conversation-panel/menu-row.js +27 -16
- package/dist/components/features/conversation-panel/menu-row.js.map +1 -1
- package/dist/components/features/conversation-panel/skills-modal.cjs +1 -1
- package/dist/components/features/conversation-panel/skills-modal.cjs.map +1 -1
- package/dist/components/features/conversation-panel/skills-modal.js +29 -28
- package/dist/components/features/conversation-panel/skills-modal.js.map +1 -1
- package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
- package/dist/components/features/files-tab/file-content-viewer.js +5 -5
- package/dist/components/features/home/featured-automations/automation-health-indicator.cjs +1 -1
- package/dist/components/features/home/featured-automations/automation-health-indicator.cjs.map +1 -1
- package/dist/components/features/home/featured-automations/automation-health-indicator.js +1 -1
- package/dist/components/features/home/featured-automations/automation-health-indicator.js.map +1 -1
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs +1 -1
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs.map +1 -1
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.d.ts +4 -3
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js +22 -25
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js.map +1 -1
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs +1 -1
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs.map +1 -1
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.d.ts +1 -1
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js +15 -15
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js.map +1 -1
- package/dist/components/features/home/featured-automations/automation-run-health.cjs +1 -1
- package/dist/components/features/home/featured-automations/automation-run-health.cjs.map +1 -1
- package/dist/components/features/home/featured-automations/automation-run-health.d.ts +5 -3
- package/dist/components/features/home/featured-automations/automation-run-health.js +30 -23
- package/dist/components/features/home/featured-automations/automation-run-health.js.map +1 -1
- package/dist/components/features/home/featured-automations/home-automation-activity.d.ts +3 -2
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs +1 -1
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs.map +1 -1
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.d.ts +1 -1
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js +59 -37
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js.map +1 -1
- package/dist/components/features/manifest/manifest-form-field.d.ts +3 -1
- package/dist/components/features/manifest/manifest-review-step.d.ts +3 -1
- package/dist/components/features/onboarding/onboarding-host.d.ts +3 -4
- package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +5 -9
- package/dist/components/features/settings/acp-auth-status-banner.d.ts +23 -6
- package/dist/components/features/settings/cloud-settings-link.cjs +1 -1
- package/dist/components/features/settings/cloud-settings-link.cjs.map +1 -1
- package/dist/components/features/settings/cloud-settings-link.js +5 -3
- package/dist/components/features/settings/cloud-settings-link.js.map +1 -1
- package/dist/components/features/settings/integrations-settings-link.cjs +1 -1
- package/dist/components/features/settings/integrations-settings-link.cjs.map +1 -1
- package/dist/components/features/settings/integrations-settings-link.d.ts +3 -1
- package/dist/components/features/settings/integrations-settings-link.js +20 -17
- package/dist/components/features/settings/integrations-settings-link.js.map +1 -1
- 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 +2 -1
- package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +2 -2
- package/dist/components/features/settings/llm-profiles/provider-connection-modal.cjs +1 -1
- package/dist/components/features/settings/llm-profiles/provider-connection-modal.js +3 -0
- package/dist/components/features/settings/sdk-settings/field-help.cjs +1 -1
- package/dist/components/features/settings/sdk-settings/field-help.cjs.map +1 -1
- package/dist/components/features/settings/sdk-settings/field-help.d.ts +1 -1
- package/dist/components/features/settings/sdk-settings/field-help.js +1 -1
- package/dist/components/features/settings/sdk-settings/field-help.js.map +1 -1
- package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs +1 -1
- package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs.map +1 -1
- package/dist/components/features/settings/sdk-settings/sdk-section-page.d.ts +8 -7
- package/dist/components/features/settings/sdk-settings/sdk-section-page.js +172 -142
- package/dist/components/features/settings/sdk-settings/sdk-section-page.js.map +1 -1
- package/dist/components/features/settings/secrets-settings/secret-form.cjs +1 -1
- package/dist/components/features/settings/secrets-settings/secret-form.cjs.map +1 -1
- package/dist/components/features/settings/secrets-settings/secret-form.js +38 -25
- package/dist/components/features/settings/secrets-settings/secret-form.js.map +1 -1
- 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-nav-link.cjs +1 -1
- package/dist/components/features/sidebar/sidebar-nav-link.cjs.map +1 -1
- package/dist/components/features/sidebar/sidebar-nav-link.d.ts +10 -1
- package/dist/components/features/sidebar/sidebar-nav-link.js +54 -36
- package/dist/components/features/sidebar/sidebar-nav-link.js.map +1 -1
- 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 +3 -1
- package/dist/components/features/sidebar/sidebar-rail-body.js +98 -58
- 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 +44 -43
- package/dist/components/features/sidebar/sidebar.js.map +1 -1
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.cjs +1 -1
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.js +3 -3
- package/dist/components/features/skills/build-skill-pills.cjs +1 -1
- package/dist/components/features/skills/build-skill-pills.cjs.map +1 -1
- package/dist/components/features/skills/build-skill-pills.js +60 -52
- package/dist/components/features/skills/build-skill-pills.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 +54 -43
- package/dist/components/features/skills/extensions-navigation.js.map +1 -1
- package/dist/components/features/skills/skill-filter.cjs +1 -1
- package/dist/components/features/skills/skill-filter.cjs.map +1 -1
- package/dist/components/features/skills/skill-filter.d.ts +8 -3
- package/dist/components/features/skills/skill-filter.js +69 -52
- package/dist/components/features/skills/skill-filter.js.map +1 -1
- package/dist/components/shared/buttons/styled-tooltip.cjs +1 -1
- package/dist/components/shared/buttons/styled-tooltip.cjs.map +1 -1
- package/dist/components/shared/buttons/styled-tooltip.d.ts +2 -1
- package/dist/components/shared/buttons/styled-tooltip.js +2 -1
- package/dist/components/shared/buttons/styled-tooltip.js.map +1 -1
- package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
- package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
- package/dist/components/shared/filters/enum-filter-dropdown.d.ts +5 -1
- package/dist/components/shared/filters/enum-filter-dropdown.js +14 -14
- package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
- package/dist/components/shared/modals/confirmation-modal.cjs +1 -1
- package/dist/components/shared/modals/confirmation-modal.cjs.map +1 -1
- package/dist/components/shared/modals/confirmation-modal.d.ts +2 -1
- package/dist/components/shared/modals/confirmation-modal.js +8 -8
- package/dist/components/shared/modals/confirmation-modal.js.map +1 -1
- package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
- package/dist/components/shared/modals/settings/model-selector.js +27 -27
- package/dist/components/shared/modals/settings/settings-form.cjs +1 -1
- package/dist/components/shared/modals/settings/settings-form.js +8 -8
- package/dist/config/defaults.cjs +1 -1
- package/dist/config/defaults.cjs.map +1 -1
- package/dist/config/defaults.js +9 -5
- package/dist/config/defaults.js.map +1 -1
- package/dist/constants/settings-nav.d.ts +8 -0
- 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.d.ts +5 -0
- package/dist/contexts/conversation-websocket-context.js +194 -198
- package/dist/contexts/conversation-websocket-context.js.map +1 -1
- package/dist/contexts/websocket-provider-wrapper.cjs +1 -1
- package/dist/contexts/websocket-provider-wrapper.cjs.map +1 -1
- package/dist/contexts/websocket-provider-wrapper.js +31 -15
- package/dist/contexts/websocket-provider-wrapper.js.map +1 -1
- package/dist/extensions/canvas-extension-module-loader.d.ts +11 -0
- package/dist/hooks/chat/record-model-switch-message.cjs +1 -1
- package/dist/hooks/chat/record-model-switch-message.cjs.map +1 -1
- package/dist/hooks/chat/record-model-switch-message.d.ts +31 -0
- package/dist/hooks/chat/record-model-switch-message.js +25 -12
- package/dist/hooks/chat/record-model-switch-message.js.map +1 -1
- package/dist/hooks/chat/use-plan-mode-interceptor.cjs +2 -0
- package/dist/hooks/chat/use-plan-mode-interceptor.cjs.map +1 -0
- package/dist/hooks/chat/use-plan-mode-interceptor.d.ts +16 -0
- package/dist/hooks/chat/use-plan-mode-interceptor.js +43 -0
- package/dist/hooks/chat/use-plan-mode-interceptor.js.map +1 -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.js +5 -1
- package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
- package/dist/hooks/mutation/use-manage-canvas-extensions.d.ts +12 -0
- package/dist/hooks/mutation/use-read-conversation-file.cjs +1 -1
- package/dist/hooks/mutation/use-read-conversation-file.cjs.map +1 -1
- package/dist/hooks/mutation/use-read-conversation-file.js +11 -4
- package/dist/hooks/mutation/use-read-conversation-file.js.map +1 -1
- package/dist/hooks/mutation/use-save-settings.cjs +1 -1
- package/dist/hooks/mutation/use-save-settings.js +3 -3
- 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.js +13 -25
- package/dist/hooks/mutation/use-switch-llm-profile.js.map +1 -1
- package/dist/hooks/mutation/use-update-conversation-tags.cjs +2 -0
- package/dist/hooks/mutation/use-update-conversation-tags.cjs.map +1 -0
- package/dist/hooks/mutation/use-update-conversation-tags.d.ts +8 -0
- package/dist/hooks/mutation/use-update-conversation-tags.js +45 -0
- package/dist/hooks/mutation/use-update-conversation-tags.js.map +1 -0
- package/dist/hooks/query/concurrency-limiter.cjs +2 -0
- package/dist/hooks/query/concurrency-limiter.cjs.map +1 -0
- package/dist/hooks/query/concurrency-limiter.d.ts +22 -0
- package/dist/hooks/query/concurrency-limiter.js +29 -0
- package/dist/hooks/query/concurrency-limiter.js.map +1 -0
- 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 +10 -0
- package/dist/hooks/query/query-keys.js +2 -2
- 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.js +4 -4
- package/dist/hooks/query/use-automation-sdk-version.cjs +1 -1
- package/dist/hooks/query/use-automation-sdk-version.cjs.map +1 -1
- package/dist/hooks/query/use-automation-sdk-version.d.ts +0 -1
- package/dist/hooks/query/use-automation-sdk-version.js +30 -55
- package/dist/hooks/query/use-automation-sdk-version.js.map +1 -1
- package/dist/hooks/query/use-automations.cjs.map +1 -1
- package/dist/hooks/query/use-automations.js.map +1 -1
- 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.d.ts +1 -1
- package/dist/hooks/query/use-backends-health.js +50 -64
- package/dist/hooks/query/use-backends-health.js.map +1 -1
- package/dist/hooks/query/use-canvas-extensions.cjs +1 -0
- package/dist/hooks/query/use-canvas-extensions.d.ts +5 -0
- package/dist/hooks/query/use-canvas-extensions.js +3 -0
- package/dist/hooks/query/use-commit-changes.cjs +1 -1
- package/dist/hooks/query/use-commit-changes.js +4 -4
- package/dist/hooks/query/use-conversation-skills.cjs +1 -1
- package/dist/hooks/query/use-conversation-skills.cjs.map +1 -1
- package/dist/hooks/query/use-conversation-skills.d.ts +14 -5
- package/dist/hooks/query/use-conversation-skills.js +20 -4
- package/dist/hooks/query/use-conversation-skills.js.map +1 -1
- package/dist/hooks/query/use-latest-automation-runs.cjs +1 -1
- package/dist/hooks/query/use-latest-automation-runs.js +1 -0
- package/dist/hooks/query/use-paginated-conversations.cjs +1 -1
- package/dist/hooks/query/use-paginated-conversations.cjs.map +1 -1
- package/dist/hooks/query/use-paginated-conversations.js +19 -16
- package/dist/hooks/query/use-paginated-conversations.js.map +1 -1
- package/dist/hooks/query/use-provider-connections.cjs +1 -1
- package/dist/hooks/query/use-provider-connections.cjs.map +1 -1
- package/dist/hooks/query/use-provider-connections.d.ts +6 -3
- package/dist/hooks/query/use-provider-connections.js +7 -3
- package/dist/hooks/query/use-provider-connections.js.map +1 -1
- package/dist/hooks/query/use-search-providers.cjs +1 -1
- package/dist/hooks/query/use-search-providers.cjs.map +1 -1
- package/dist/hooks/query/use-search-providers.js +17 -10
- package/dist/hooks/query/use-search-providers.js.map +1 -1
- package/dist/hooks/query/use-sub-conversations.cjs +1 -1
- package/dist/hooks/query/use-sub-conversations.cjs.map +1 -1
- package/dist/hooks/query/use-sub-conversations.js +16 -16
- package/dist/hooks/query/use-sub-conversations.js.map +1 -1
- package/dist/hooks/query/use-unified-get-git-changes.cjs +1 -1
- package/dist/hooks/query/use-unified-get-git-changes.js +4 -4
- package/dist/hooks/query/use-unified-git-commits.cjs +1 -1
- package/dist/hooks/query/use-unified-git-commits.js +4 -4
- package/dist/hooks/query/use-unified-git-diff.cjs +1 -1
- package/dist/hooks/query/use-unified-git-diff.js +4 -4
- package/dist/hooks/query/use-unified-vscode-url.cjs +1 -1
- package/dist/hooks/query/use-unified-vscode-url.cjs.map +1 -1
- package/dist/hooks/query/use-unified-vscode-url.d.ts +1 -0
- package/dist/hooks/query/use-unified-vscode-url.js +40 -26
- package/dist/hooks/query/use-unified-vscode-url.js.map +1 -1
- package/dist/hooks/query/use-workspace-file-content.cjs +1 -1
- package/dist/hooks/query/use-workspace-file-content.js +5 -5
- package/dist/hooks/query/use-workspace-files.cjs +1 -1
- package/dist/hooks/query/use-workspace-files.js +6 -6
- package/dist/hooks/use-acp-credential-form.d.ts +6 -0
- package/dist/hooks/use-acp-model-context.cjs +1 -1
- package/dist/hooks/use-acp-model-context.js +3 -3
- package/dist/hooks/use-agent-state.cjs +1 -1
- package/dist/hooks/use-agent-state.cjs.map +1 -1
- package/dist/hooks/use-agent-state.d.ts +17 -1
- package/dist/hooks/use-agent-state.js +19 -9
- package/dist/hooks/use-agent-state.js.map +1 -1
- package/dist/hooks/use-automation-permissions.cjs +2 -0
- package/dist/hooks/use-automation-permissions.cjs.map +1 -0
- package/dist/hooks/use-automation-permissions.d.ts +43 -0
- package/dist/hooks/use-automation-permissions.js +52 -0
- package/dist/hooks/use-automation-permissions.js.map +1 -0
- package/dist/hooks/use-chat-input-model-state.cjs +1 -1
- package/dist/hooks/use-chat-input-model-state.js +3 -3
- package/dist/hooks/use-conversation-overview-git-diff-stats.cjs +1 -1
- package/dist/hooks/use-conversation-overview-git-diff-stats.js +4 -4
- 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.d.ts +3 -1
- package/dist/hooks/use-handle-plan-click.js +85 -26
- package/dist/hooks/use-handle-plan-click.js.map +1 -1
- package/dist/hooks/use-home-automation-actions.cjs +1 -1
- package/dist/hooks/use-home-automation-actions.cjs.map +1 -1
- package/dist/hooks/use-home-automation-actions.js +1 -0
- package/dist/hooks/use-home-automation-actions.js.map +1 -1
- package/dist/hooks/use-llm-configured.cjs +1 -1
- package/dist/hooks/use-llm-configured.js +3 -3
- package/dist/hooks/use-manifest-preflight.d.ts +1 -1
- package/dist/hooks/use-pinned-home-route.cjs +2 -0
- package/dist/hooks/use-pinned-home-route.cjs.map +1 -0
- package/dist/hooks/use-pinned-home-route.d.ts +33 -0
- package/dist/hooks/use-pinned-home-route.js +34 -0
- package/dist/hooks/use-pinned-home-route.js.map +1 -0
- package/dist/hooks/use-skill-enablement.cjs +2 -0
- package/dist/hooks/use-skill-enablement.cjs.map +1 -0
- package/dist/hooks/use-skill-enablement.d.ts +14 -0
- package/dist/hooks/use-skill-enablement.js +80 -0
- package/dist/hooks/use-skill-enablement.js.map +1 -0
- package/dist/hooks/use-unified-websocket-status.cjs +1 -1
- package/dist/hooks/use-unified-websocket-status.cjs.map +1 -1
- package/dist/hooks/use-unified-websocket-status.d.ts +7 -0
- package/dist/hooks/use-unified-websocket-status.js +5 -1
- package/dist/hooks/use-unified-websocket-status.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 +83 -14
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/translation.cjs +3 -3
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +1575 -402
- package/dist/i18n/translation.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +15 -14
- package/dist/lib/index.cjs +1 -1
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.js +1 -0
- package/dist/locales/ar/openhands.json +94 -25
- package/dist/locales/ca/openhands.json +94 -25
- package/dist/locales/de/openhands.json +94 -25
- package/dist/locales/en/openhands.json +94 -25
- package/dist/locales/es/openhands.json +94 -25
- package/dist/locales/fr/openhands.json +94 -25
- package/dist/locales/it/openhands.json +94 -25
- package/dist/locales/ja/openhands.json +94 -25
- package/dist/locales/ko-KR/openhands.json +94 -25
- package/dist/locales/no/openhands.json +94 -25
- package/dist/locales/pt/openhands.json +94 -25
- package/dist/locales/tr/openhands.json +94 -25
- package/dist/locales/uk/openhands.json +94 -25
- package/dist/locales/zh-CN/openhands.json +94 -25
- package/dist/locales/zh-TW/openhands.json +94 -25
- package/dist/manifests/automation-insights.cjs.map +1 -1
- package/dist/manifests/automation-insights.d.ts +10 -2
- package/dist/manifests/automation-insights.js.map +1 -1
- package/dist/manifests/automation-interface.cjs +1 -1
- package/dist/manifests/automation-interface.cjs.map +1 -1
- package/dist/manifests/automation-interface.d.ts +6 -0
- package/dist/manifests/automation-interface.js +11 -8
- package/dist/manifests/automation-interface.js.map +1 -1
- package/dist/manifests/automation-setup.cjs +1 -1
- package/dist/manifests/automation-setup.cjs.map +1 -1
- package/dist/manifests/automation-setup.d.ts +9 -16
- package/dist/manifests/automation-setup.js +17 -7
- package/dist/manifests/automation-setup.js.map +1 -1
- package/dist/manifests/manifest-actions.d.ts +1 -1
- package/dist/manifests/manifest-capabilities.d.ts +3 -1
- package/dist/manifests/manifest-local-validation.cjs +2 -0
- package/dist/manifests/manifest-local-validation.cjs.map +1 -0
- package/dist/manifests/manifest-local-validation.d.ts +15 -11
- package/dist/manifests/manifest-local-validation.js +8 -0
- package/dist/manifests/manifest-local-validation.js.map +1 -0
- package/dist/manifests/manifest-template.cjs +2 -0
- package/dist/manifests/manifest-template.cjs.map +1 -0
- package/dist/manifests/manifest-template.d.ts +4 -4
- package/dist/manifests/manifest-template.js +12 -0
- package/dist/manifests/manifest-template.js.map +1 -0
- package/dist/manifests/manifest-validation.cjs +1 -1
- package/dist/manifests/manifest-validation.cjs.map +1 -1
- package/dist/manifests/manifest-validation.js +106 -28
- package/dist/manifests/manifest-validation.js.map +1 -1
- package/dist/manifests/types.cjs.map +1 -1
- package/dist/manifests/types.d.ts +39 -4
- package/dist/manifests/types.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs +45 -4
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.js +1 -1
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.cjs +8 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.js +221 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js +5 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs +2 -2
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js +6 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +2 -2
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js +6 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js +5 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.js +21 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.js +21 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.js +21 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.js +21 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.js +21 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.js +5 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs +30 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js +65 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +28 -14
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/interface.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/interface.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/interface.js +2 -1
- package/dist/node_modules/@openhands/extensions/automations/interface.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js +2 -2
- package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js +59 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js.map +1 -0
- 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 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.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 +74 -72
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.cjs +42 -3
- package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.js +22 -3
- package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
- 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 +1 -1
- 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 +8 -7
- 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 +2 -2
- package/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs +1 -1
- package/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js +1 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/blocks.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/blocks.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/blocks.js +16 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/blocks.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.js +21 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.js +23 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/shrink.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/shrink.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/shrink.js +23 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/shrink.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js +43 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/tags.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/tags.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/tags.js +22 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/tags.js.map +1 -0
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +5 -5
- package/dist/package.js.map +1 -1
- package/dist/routes/agent-settings.d.ts +12 -0
- package/dist/routes/app-settings.cjs +1 -1
- package/dist/routes/app-settings.cjs.map +1 -1
- package/dist/routes/app-settings.js +11 -11
- package/dist/routes/files-tab.cjs +1 -1
- package/dist/routes/files-tab.cjs.map +1 -1
- package/dist/routes/files-tab.js +14 -14
- package/dist/routes/files-tab.js.map +1 -1
- package/dist/routes/llm-settings.cjs +1 -1
- package/dist/routes/llm-settings.cjs.map +1 -1
- package/dist/routes/llm-settings.d.ts +3 -1
- package/dist/routes/llm-settings.js +100 -91
- package/dist/routes/llm-settings.js.map +1 -1
- package/dist/routes/planner-tab.cjs +1 -1
- package/dist/routes/planner-tab.cjs.map +1 -1
- package/dist/routes/planner-tab.js +44 -28
- package/dist/routes/planner-tab.js.map +1 -1
- package/dist/services/canvas-ui.cjs +1 -1
- package/dist/services/canvas-ui.cjs.map +1 -1
- package/dist/services/canvas-ui.d.ts +5 -0
- package/dist/services/canvas-ui.js +24 -10
- package/dist/services/canvas-ui.js.map +1 -1
- package/dist/services/settings.cjs +1 -1
- package/dist/services/settings.cjs.map +1 -1
- package/dist/services/settings.js +3 -2
- package/dist/services/settings.js.map +1 -1
- package/dist/services/telemetry.cjs +1 -1
- package/dist/services/telemetry.cjs.map +1 -1
- package/dist/services/telemetry.d.ts +5 -0
- package/dist/services/telemetry.js +122 -115
- package/dist/services/telemetry.js.map +1 -1
- 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.d.ts +32 -5
- package/dist/stores/conversation-panel-preferences-store.js +29 -12
- package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
- package/dist/stores/conversation-state-store.cjs +1 -1
- package/dist/stores/conversation-state-store.cjs.map +1 -1
- package/dist/stores/conversation-state-store.d.ts +9 -3
- package/dist/stores/conversation-state-store.js +6 -3
- package/dist/stores/conversation-state-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 +2 -0
- package/dist/stores/conversation-store.js +3 -0
- package/dist/stores/conversation-store.js.map +1 -1
- package/dist/stores/model-store.cjs +1 -1
- package/dist/stores/model-store.cjs.map +1 -1
- package/dist/stores/model-store.d.ts +7 -0
- package/dist/stores/model-store.js +4 -0
- package/dist/stores/model-store.js.map +1 -1
- package/dist/types/automation.cjs.map +1 -1
- package/dist/types/automation.d.ts +66 -1
- package/dist/types/automation.js.map +1 -1
- package/dist/types/canvas-extension.cjs +2 -0
- package/dist/types/canvas-extension.cjs.map +1 -0
- package/dist/types/canvas-extension.d.ts +77 -0
- package/dist/types/canvas-extension.js +6 -0
- package/dist/types/canvas-extension.js.map +1 -0
- package/dist/types/settings.d.ts +7 -0
- package/dist/ui/context-menu.d.ts +1 -1
- package/dist/ui/help-link.cjs +1 -1
- package/dist/ui/help-link.cjs.map +1 -1
- package/dist/ui/help-link.d.ts +6 -1
- package/dist/ui/help-link.js +32 -18
- package/dist/ui/help-link.js.map +1 -1
- package/dist/ui/toggle-switch.cjs +1 -1
- package/dist/ui/toggle-switch.cjs.map +1 -1
- package/dist/ui/toggle-switch.d.ts +4 -1
- package/dist/ui/toggle-switch.js +4 -3
- package/dist/ui/toggle-switch.js.map +1 -1
- package/dist/utils/acp-auth-display.d.ts +35 -0
- package/dist/utils/automation-catalog.cjs +1 -1
- package/dist/utils/automation-catalog.cjs.map +1 -1
- package/dist/utils/automation-catalog.d.ts +12 -1
- package/dist/utils/automation-catalog.js +42 -12
- package/dist/utils/automation-catalog.js.map +1 -1
- package/dist/utils/automation-run-display.cjs +2 -0
- package/dist/utils/automation-run-display.cjs.map +1 -0
- package/dist/utils/automation-run-display.d.ts +20 -0
- package/dist/utils/automation-run-display.js +85 -0
- package/dist/utils/automation-run-display.js.map +1 -0
- package/dist/utils/automation-schedule.cjs +1 -1
- package/dist/utils/automation-schedule.cjs.map +1 -1
- package/dist/utils/automation-schedule.d.ts +16 -0
- package/dist/utils/automation-schedule.js +2 -0
- package/dist/utils/automation-schedule.js.map +1 -1
- package/dist/utils/cache-utils.cjs +1 -1
- package/dist/utils/cache-utils.js +5 -5
- package/dist/utils/constants.cjs +1 -1
- package/dist/utils/constants.cjs.map +1 -1
- package/dist/utils/constants.d.ts +4 -0
- package/dist/utils/constants.js +23 -3
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/format-event-timestamp.cjs +2 -0
- package/dist/utils/format-event-timestamp.cjs.map +1 -0
- package/dist/utils/format-event-timestamp.d.ts +1 -0
- package/dist/utils/format-event-timestamp.js +13 -0
- package/dist/utils/format-event-timestamp.js.map +1 -0
- package/dist/utils/format-model-name.cjs +1 -1
- package/dist/utils/format-model-name.cjs.map +1 -1
- package/dist/utils/format-model-name.d.ts +7 -3
- package/dist/utils/format-model-name.js +6 -11
- package/dist/utils/format-model-name.js.map +1 -1
- package/dist/utils/format-relative-time.cjs +1 -1
- package/dist/utils/format-relative-time.cjs.map +1 -1
- package/dist/utils/format-relative-time.d.ts +7 -0
- package/dist/utils/format-relative-time.js +7 -2
- package/dist/utils/format-relative-time.js.map +1 -1
- package/dist/utils/git-diff-stats.cjs +2 -2
- package/dist/utils/git-diff-stats.cjs.map +1 -1
- package/dist/utils/git-diff-stats.d.ts +4 -0
- package/dist/utils/git-diff-stats.js +12 -2
- package/dist/utils/git-diff-stats.js.map +1 -1
- package/dist/utils/path-utils.cjs +1 -1
- package/dist/utils/path-utils.cjs.map +1 -1
- package/dist/utils/path-utils.d.ts +15 -3
- package/dist/utils/path-utils.js +29 -3
- package/dist/utils/path-utils.js.map +1 -1
- package/dist/utils/plan-file.cjs +4 -0
- package/dist/utils/plan-file.cjs.map +1 -0
- package/dist/utils/plan-file.d.ts +18 -0
- package/dist/utils/plan-file.js +58 -0
- package/dist/utils/plan-file.js.map +1 -0
- package/dist/utils/recommended-automation-rail.cjs +1 -1
- package/dist/utils/recommended-automation-rail.cjs.map +1 -1
- package/dist/utils/recommended-automation-rail.js +1 -0
- package/dist/utils/recommended-automation-rail.js.map +1 -1
- package/dist/utils/scroll-fade-state.cjs +1 -1
- package/dist/utils/scroll-fade-state.cjs.map +1 -1
- package/dist/utils/scroll-fade-state.d.ts +6 -0
- package/dist/utils/scroll-fade-state.js +8 -1
- package/dist/utils/scroll-fade-state.js.map +1 -1
- package/dist/utils/sdk-settings-schema.cjs +1 -1
- package/dist/utils/sdk-settings-schema.cjs.map +1 -1
- package/dist/utils/sdk-settings-schema.d.ts +1 -0
- package/dist/utils/sdk-settings-schema.js +25 -22
- package/dist/utils/sdk-settings-schema.js.map +1 -1
- package/dist/utils/skill-enablement.cjs +2 -0
- package/dist/utils/skill-enablement.cjs.map +1 -0
- package/dist/utils/skill-enablement.d.ts +51 -0
- package/dist/utils/skill-enablement.js +31 -0
- package/dist/utils/skill-enablement.js.map +1 -0
- package/dist/utils/utils.cjs +1 -1
- package/dist/utils/utils.cjs.map +1 -1
- package/dist/utils/utils.js +11 -11
- package/dist/utils/utils.js.map +1 -1
- package/dist/utils/vscode-origin.cjs +2 -0
- package/dist/utils/vscode-origin.cjs.map +1 -0
- package/dist/utils/vscode-origin.d.ts +55 -0
- package/dist/utils/vscode-origin.js +27 -0
- package/dist/utils/vscode-origin.js.map +1 -0
- package/dist/utils/workspace-mode.d.ts +4 -0
- package/package.json +5 -5
- package/scripts/check-sdk-version-sync.mjs +6 -6
- package/scripts/check-translation-completeness.cjs +1 -0
- package/scripts/dev-extra-backend.mjs +28 -9
- package/scripts/dev-safe.mjs +81 -8
- package/scripts/dev-static.mjs +35 -37
- package/scripts/dev-with-automation.mjs +83 -2
- package/scripts/ingress.mjs +27 -1
- package/scripts/static-server.mjs +107 -2
- package/tools/canvas_ui_tool.py +19 -0
- package/build/assets/active-backend-context-DKFSMbn3.js +0 -2
- package/build/assets/agent-profiles-settings-D4cY5U2T.js +0 -1
- package/build/assets/agent-server-conversation-service.api-DozDKIW_.js +0 -86
- package/build/assets/agent-settings-351vXWc9.js +0 -2
- package/build/assets/agent-settings-Ce7BDZ6I.js +0 -1
- package/build/assets/alert-banner-Kyy1YWZU.js +0 -1
- package/build/assets/api-key-entry-screen-INIxqAMs.js +0 -1
- package/build/assets/automation-detail-DXDhUwPq.js +0 -3
- package/build/assets/automation-git-sync-CzyS4cn1.js +0 -1
- package/build/assets/automation-setup-route-FRr05f_g.js +0 -1
- package/build/assets/automations-list-CERuQWE6.js +0 -1
- package/build/assets/backend-form-modal-DK78-jn1.js +0 -1
- package/build/assets/bot-C-0Wu7vQ.js +0 -1
- package/build/assets/browser-11etCQ04.js +0 -7
- package/build/assets/check-Cf2YoT90.js +0 -1
- package/build/assets/chevron-down-C3OQ-ehx.js +0 -1
- package/build/assets/chevron-right-CN1uUiJ1.js +0 -1
- package/build/assets/circle-check-g5yeGMd-.js +0 -1
- package/build/assets/command-menu-BZQ8S3Ke.js +0 -1
- package/build/assets/commits-tab-DZtJgaDM.js +0 -1
- package/build/assets/confirmation-modal-Bk4JRcCM.js +0 -1
- package/build/assets/conversation-CchMzpGl.js +0 -1
- package/build/assets/conversation-Dpzftz57.js +0 -93
- package/build/assets/conversation-panel-CchMzpGl.js +0 -1
- package/build/assets/conversation-state-store-a9d2fxRc.js +0 -1
- package/build/assets/edit-automation-modal-D-urtv8n.js +0 -1
- package/build/assets/empty-state-CvaVahVr.js +0 -1
- package/build/assets/enum-filter-dropdown-DliX_Lo0.js +0 -1
- package/build/assets/extensions-hub-CFduxBnk.js +0 -1
- package/build/assets/extensions-navigation-BeC224yX.js +0 -1
- package/build/assets/external-link-DFpYunfj.js +0 -1
- package/build/assets/files-tab-CL3J9b3p.js +0 -1
- package/build/assets/format-model-name-BNPKVsIq.js +0 -1
- package/build/assets/get-git-path-DlAJa_i6.js +0 -1
- package/build/assets/git-repo-dropdown-DGMEhz7d.js +0 -1
- package/build/assets/home-BCGlNJCA.js +0 -1
- package/build/assets/home-DB1pRqTC.js +0 -1
- package/build/assets/home-automation-run-tooltip-CooFQRIG.js +0 -1
- package/build/assets/home-store-Dl1dPE58.js +0 -1
- package/build/assets/index-home-DB1pRqTC.js +0 -1
- package/build/assets/info-uYSVzX86.js +0 -1
- package/build/assets/install-server-modal-BbJdhzet.js +0 -1
- package/build/assets/kebab-menu-item-content-BYokkRHi.js +0 -1
- package/build/assets/list-filter-OFkpRrmi.js +0 -1
- package/build/assets/llm-not-configured-banner-BqqYnJ1t.js +0 -27
- package/build/assets/llm-settings-CnDbbmVW.js +0 -1
- package/build/assets/llm-settings-S8Yjg__1.js +0 -1
- package/build/assets/llm-subscription-service-BpPfzW4x.js +0 -1
- package/build/assets/loader-circle-nvrwthvj.js +0 -1
- package/build/assets/manage-backends-modal-BCUPswyl.js +0 -1
- package/build/assets/manifest-58597dde.js +0 -1
- package/build/assets/markdown-renderer-Cb2sBWtV.js +0 -8
- package/build/assets/mcp-page-Bm4K2NQq.js +0 -9
- package/build/assets/messages-BTN5thLe.js +0 -40
- package/build/assets/onboarding-Cx_kaiD1.js +0 -1
- package/build/assets/onboarding-modal-vMwn7ihv.js +0 -1
- package/build/assets/organization-service.api-C8XpQ0pM.js +0 -1
- package/build/assets/pencil-Clh1Wjvh.js +0 -1
- package/build/assets/planner-tab-DQvDU3ap.js +0 -1
- package/build/assets/plug-BuQhHSSG.js +0 -1
- package/build/assets/plugins-management-service-BjYeF0b0.js +0 -1
- package/build/assets/plus-CEKne-Yp.js +0 -1
- package/build/assets/profiles-service.api-QB-T_u-g.js +0 -1
- package/build/assets/providers-FfSZ5TXP.js +0 -1
- package/build/assets/proxy-tcFL2yTQ.js +0 -1
- package/build/assets/recommended-automations-launcher-Bw8uC4V6.js +0 -1
- package/build/assets/refresh-cw-Bh69DyYO.js +0 -1
- package/build/assets/root-BLeQfBEq.css +0 -1
- package/build/assets/root-ZKKYPR1Z.js +0 -2
- package/build/assets/root-layout-luJoE9IG.js +0 -2
- package/build/assets/schema-field-Csw5fhtN.js +0 -1
- package/build/assets/scroll-fade-state-Dw-i4SGq.js +0 -1
- package/build/assets/sdk-section-page-HTffvm7Q.js +0 -1
- package/build/assets/secret-form-HTUbYw5o.js +0 -1
- package/build/assets/secrets-service-BTor9uAU.js +0 -1
- package/build/assets/settings-BlmrkwRi.js +0 -1
- package/build/assets/settings-DcNPxz0v.js +0 -1
- package/build/assets/settings-index-CKq0b0Vg.js +0 -1
- package/build/assets/settings-service.api-B2agVfjL.js +0 -1
- package/build/assets/shared-conversation-B55pCyBG.js +0 -1
- package/build/assets/shield-check-CFDViW82.js +0 -1
- package/build/assets/sidebar-mobile-menu-toggle-BOtyJHwE.js +0 -1
- package/build/assets/sidebar-nav-link-CPzhyHQg.js +0 -1
- package/build/assets/sidebar-store-DtpU7zaI.js +0 -1
- package/build/assets/skill-filter-CWZ5kjcg.js +0 -2
- package/build/assets/skill-scope-CV1dkAbW.js +0 -1
- package/build/assets/skills-plugins-DGHULTq6.js +0 -1
- package/build/assets/skills-settings-CM1lFv3e.js +0 -1
- package/build/assets/styled-tooltip-Dl06rkpY.js +0 -1
- package/build/assets/toggle-switch-Fd_QGz0r.js +0 -1
- package/build/assets/trash-2-Dl8_RGz0.js +0 -1
- package/build/assets/trash-_RMt7Ayc.js +0 -1
- package/build/assets/triangle-alert-SM-q4NU_.js +0 -1
- package/build/assets/usage-tab-BcfWV6db.js +0 -1
- package/build/assets/use-acp-credential-form-BsSW5NHG.js +0 -1
- package/build/assets/use-activate-agent-profile-B2NS8nA5.js +0 -1
- package/build/assets/use-agent-profiles-DWBPC0Si.js +0 -1
- package/build/assets/use-config-Bft35DOK.js +0 -1
- package/build/assets/use-create-conversation-DwN5vv2f.js +0 -1
- package/build/assets/use-create-secret-BSxJMxHp.js +0 -1
- package/build/assets/use-has-permission-B3C8rQmR.js +0 -1
- package/build/assets/use-is-authed-CFGkY3-Z.js +0 -1
- package/build/assets/use-llm-configured-BI6obxsc.js +0 -1
- package/build/assets/use-llm-profiles-djGAhTWL.js +0 -1
- package/build/assets/use-manifest-capabilities-3z0-1G59.js +0 -1
- package/build/assets/use-onboarding-completion-BXpyUSsJ.js +0 -1
- package/build/assets/use-plugins-marketplace-DI4_pK56.js +0 -1
- package/build/assets/use-save-agent-profile-DdBSTdpN.js +0 -1
- package/build/assets/use-settings-C5VhGpqd.js +0 -1
- package/build/assets/use-settings-nav-items-DHaUu1Dg.js +0 -16
- package/build/assets/use-tracking-D5t9otIF.js +0 -3
- package/build/assets/utils-DaCIEEQP.js +0 -1
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kepq2zme-ZixYGy6E.js +0 -186
- package/build/assets/vendor~index-home~home~conversation-panel~conversation~alert-banner-B3qC_oj8.js +0 -1
- package/build/assets/vendor~root-layout-BlUaZ18v.js +0 -1
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-B2OLKL7N.js +0 -1
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iw7io29p-Dz-MAyNb.js +0 -1
- package/build/assets/x-DkgltWa0.js +0 -1
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +0 -2
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +0 -1
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +0 -35
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +0 -247
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +0 -1
- package/dist/components/features/tips/random-tip.d.ts +0 -2
- package/dist/hooks/query/use-skills.cjs +0 -2
- package/dist/hooks/query/use-skills.cjs.map +0 -1
- package/dist/hooks/query/use-skills.d.ts +0 -7
- package/dist/hooks/query/use-skills.js +0 -13
- package/dist/hooks/query/use-skills.js.map +0 -1
- package/dist/hooks/use-has-permission.cjs +0 -2
- package/dist/hooks/use-has-permission.cjs.map +0 -1
- package/dist/hooks/use-has-permission.d.ts +0 -1
- package/dist/hooks/use-has-permission.js +0 -8
- package/dist/hooks/use-has-permission.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs +0 -2
- package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/eye.js +0 -14
- package/dist/node_modules/lucide-react/dist/esm/icons/eye.js.map +0 -1
- package/dist/utils/tips.d.ts +0 -7
- package/dist/utils/workspace-relative-path.cjs +0 -2
- package/dist/utils/workspace-relative-path.cjs.map +0 -1
- package/dist/utils/workspace-relative-path.d.ts +0 -10
- package/dist/utils/workspace-relative-path.js +0 -22
- package/dist/utils/workspace-relative-path.js.map +0 -1
- /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ox0jfsa0-cHFhpUBq.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~i58xkef6-cHFhpUBq.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-backends-health.cjs","names":[],"sources":["../../../src/hooks/query/use-backends-health.ts"],"sourcesContent":["import React from \"react\";\nimport axios from \"axios\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport { HttpError } from \"@openhands/typescript-client\";\nimport {\n ServerClient,\n SettingsClient,\n} from \"@openhands/typescript-client/clients\";\nimport {\n getCloudOrganizations,\n getCurrentCloudApiKey,\n} from \"#/api/cloud/organization-service.api\";\nimport {\n assertAgentServerVersionIsSupported,\n isSdkHttpStatusError,\n} from \"#/api/agent-server-compatibility\";\nimport type { Backend } from \"#/api/backend-registry/types\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport {\n isCorsOrNetworkError,\n isCorsOrNetworkErrorMessage,\n} from \"#/utils/user-facing-error\";\nimport {\n getHealthSnapshot,\n recordBackendFailure,\n recordBackendSuccess,\n subscribeBackendHealth,\n} from \"#/api/backend-registry/health-store\";\nimport { MAX_CONSECUTIVE_FAILURES } from \"#/api/backend-registry/health-storage\";\n\n// 30s: each tick costs two sequential requests per backend (settings +\n// server_info), which on slow links measurably competes with conversation\n// traffic for the browser's per-origin HTTP/1.1 connection pool.\nconst REFRESH_INTERVAL_MS = 30000;\nconst PROBE_TIMEOUT_MS = 4000;\nexport const INVALID_BACKEND_API_KEY_ERROR = \"Invalid API key\";\nexport const MISSING_BACKEND_API_KEY_ERROR = \"API key required\";\nexport const CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR =\n \"Cloud API key or network issue\";\nexport const CLOUD_BACKEND_LOGGED_OUT_ERROR = \"Logged out\";\n\nexport function isInvalidBackendApiKeyHealthError(\n error: string | null | undefined,\n): boolean {\n return error === INVALID_BACKEND_API_KEY_ERROR;\n}\n\nexport function isMissingBackendApiKeyHealthError(\n error: string | null | undefined,\n): boolean {\n return error === MISSING_BACKEND_API_KEY_ERROR;\n}\n\nexport function isCloudBackendApiKeyOrNetworkHealthError(\n error: string | null | undefined,\n): boolean {\n return error === CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR;\n}\n\nfunction hasMissingBackendApiKey(backend: Backend): boolean {\n return (\n backend.kind === \"cloud\" &&\n backend.authMode !== \"cookie\" &&\n !backend.apiKey.trim()\n );\n}\n\nexport function isCloudBackendLoggedOutHealthError(\n error: string | null | undefined,\n): boolean {\n return error === CLOUD_BACKEND_LOGGED_OUT_ERROR;\n}\n\n/**\n * Probe a single backend for connectivity. The probe path differs by\n * backend kind:\n *\n * - Local agent-server: GET `/api/settings`, then `/server_info` via the\n * typescript-client. The settings call validates the configured session\n * API key; the server info call validates the version compatibility floor.\n * - Cloud: GET `/api/keys/current` directly against the cloud host. That\n * endpoint is lightweight, requires auth, and `getCurrentCloudApiKey`\n * already absorbs the legacy-key 400 fallback so we treat that as\n * \"connected\" too. Missing / rejected keys are reported explicitly instead\n * of falling through to the browser's opaque CORS/network error shape.\n *\n * Throws on failure so React Query marks the query as errored — the\n * dropdown reads `isSuccess` to flip the indicator green.\n */\nasync function probeBackend(backend: Backend): Promise<true> {\n if (backend.kind === \"cloud\") {\n if (backend.authMode !== \"cookie\" && !backend.apiKey?.trim()) {\n throw new Error(MISSING_BACKEND_API_KEY_ERROR);\n }\n\n try {\n if (backend.authMode === \"cookie\") {\n await getCloudOrganizations(backend);\n } else {\n await getCurrentCloudApiKey(backend);\n }\n } catch (error) {\n if (\n (axios.isAxiosError(error) && error.response?.status === 401) ||\n (error instanceof HttpError && error.status === 401)\n ) {\n throw new Error(CLOUD_BACKEND_LOGGED_OUT_ERROR);\n }\n if (isCorsOrNetworkError(error)) {\n throw new Error(CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR);\n }\n throw error;\n }\n return true;\n }\n\n try {\n const clientOptions = getAgentServerClientOptions({\n host: backend.host,\n sessionApiKey: backend.apiKey || null,\n timeout: PROBE_TIMEOUT_MS,\n });\n\n await new SettingsClient(clientOptions).getSettings();\n const serverInfo = await new ServerClient(clientOptions).getServerInfo();\n assertAgentServerVersionIsSupported(serverInfo);\n } catch (error) {\n if (isSdkHttpStatusError(error, 401)) {\n throw new Error(INVALID_BACKEND_API_KEY_ERROR);\n }\n throw error;\n }\n return true;\n}\n\n/**\n * How many extra times to re-run a failed probe before giving up, and how\n * long to wait between attempts.\n */\nconst PROBE_RETRY_ATTEMPTS = 2;\nconst PROBE_RETRY_DELAY_MS = 300;\n\n/**\n * Probe a backend, retrying a couple of times on failure before giving up.\n *\n * The connectivity indicator (and the onboarding \"backend connected\" banner)\n * only flips green once a probe succeeds. With `retry: false` at the query\n * level and a REFRESH_INTERVAL_MS (30s) poll, a single transient first-probe\n * miss — the agent-server still warming up right after navigation, a momentary\n * proxy 5xx, a dropped connection — would otherwise leave the banner stuck\n * until the next scheduled refetch. That is the root cause of the\n * flaky onboarding e2e \"backend health probe should report connected\" timeout.\n *\n * Retrying here, inside the query function rather than via React Query's\n * `retry`, is deliberate: the success/failure recording below runs once per\n * settled query, so a single logical probe still records exactly one outcome.\n * Retrying at the query level instead would call `recordBackendFailure` on\n * every internal attempt and reach the disabled cap several times too fast.\n *\n * Definitive auth failures (logged out, invalid/missing key) are NOT retried:\n * they are a decided server response, not a transient miss, so retrying only\n * delays surfacing the correct \"disconnected\" state (and the recovery UI).\n */\nfunction isRetryableProbeError(error: unknown): boolean {\n if (!(error instanceof Error)) return true;\n return (\n error.message !== INVALID_BACKEND_API_KEY_ERROR &&\n error.message !== MISSING_BACKEND_API_KEY_ERROR &&\n error.message !== CLOUD_BACKEND_LOGGED_OUT_ERROR\n );\n}\n\nasync function probeBackendWithQuickRetry(backend: Backend): Promise<true> {\n for (let attempt = 0; ; attempt += 1) {\n try {\n return await probeBackend(backend);\n } catch (error) {\n if (attempt >= PROBE_RETRY_ATTEMPTS || !isRetryableProbeError(error)) {\n throw error;\n }\n await new Promise((resolve) => {\n setTimeout(resolve, PROBE_RETRY_DELAY_MS);\n });\n }\n }\n}\n\nexport interface BackendHealth {\n /** `null` while the first probe is in flight; then `true` / `false`. */\n isConnected: boolean | null;\n /** Number of consecutive failed probes since the last success. */\n consecutiveFailures: number;\n /** Last error message captured from a failed probe, if any. */\n lastError: string | null;\n /**\n * `true` once `consecutiveFailures` reaches the cap. While disabled,\n * ordinary background polling stops and survives a page refresh in\n * that state.\n */\n disabled: boolean;\n}\n\nexport interface UseBackendsHealthOptions {\n /**\n * Re-probe disabled backends once when the hook mounts. Used by the\n * Manage Backends modal so a recovered backend can clear its stale\n * persisted error state without forcing the user to edit the config.\n */\n probeDisabledOnce?: boolean;\n}\n\n/**\n * Poll every backend in `backends` once every 10s and report a simple\n * connected / disconnected verdict per backend id.\n *\n * The query key includes `host` and `apiKey` so editing a backend's\n * connection details re-keys the query and triggers an immediate\n * refetch instead of waiting for the next tick.\n *\n * After `MAX_CONSECUTIVE_FAILURES` failures in a row, ordinary polling\n * stops for that backend until the user updates its host / apiKey.\n * Callers can still opt into a one-shot recheck for disabled backends\n * (for example when the user explicitly opens Manage Backends). The\n * failure count and last error live in localStorage so a page refresh\n * does not silently re-arm polling against a backend that's known to\n * be unreachable.\n */\nexport function useBackendsHealth(\n backends: Backend[],\n options: UseBackendsHealthOptions = {},\n): Record<string, BackendHealth> {\n const { probeDisabledOnce = false } = options;\n const healthMap = React.useSyncExternalStore(\n subscribeBackendHealth,\n getHealthSnapshot,\n getHealthSnapshot,\n );\n\n const results = useQueries({\n queries: backends.map((b) => {\n const entry = healthMap[b.id];\n const hasMissingCloudApiKey = hasMissingBackendApiKey(b);\n const isDisabled = entry?.disabled === true;\n const shouldReprobeStaleCloudNetworkError =\n isDisabled &&\n b.kind === \"cloud\" &&\n isCorsOrNetworkErrorMessage(entry?.lastError);\n const shouldProbe =\n !hasMissingCloudApiKey &&\n (!isDisabled ||\n probeDisabledOnce ||\n shouldReprobeStaleCloudNetworkError);\n return {\n queryKey: [\n \"backend-health\",\n b.id,\n b.kind,\n b.host,\n b.apiKey ?? \"\",\n ] as const,\n queryFn: async () => {\n try {\n const result = await probeBackendWithQuickRetry(b);\n recordBackendSuccess(b.id);\n return result;\n } catch (err) {\n recordBackendFailure(b.id, err);\n throw err;\n }\n },\n enabled: shouldProbe,\n refetchInterval:\n isDisabled || hasMissingCloudApiKey\n ? (false as const)\n : REFRESH_INTERVAL_MS,\n refetchIntervalInBackground: false,\n refetchOnMount: isDisabled && probeDisabledOnce ? \"always\" : true,\n refetchOnReconnect: !isDisabled && !hasMissingCloudApiKey,\n refetchOnWindowFocus: !isDisabled && !hasMissingCloudApiKey,\n retry: false,\n // Keep the previous verdict visible while the next probe is in\n // flight so the indicator doesn't flicker on routine polling.\n staleTime: isDisabled ? 0 : REFRESH_INTERVAL_MS,\n meta: { disableToast: true },\n };\n }),\n });\n\n const out: Record<string, BackendHealth> = {};\n backends.forEach((b, i) => {\n const r = results[i];\n const entry = healthMap[b.id];\n const hasMissingCloudApiKey = hasMissingBackendApiKey(b);\n const disabled = hasMissingCloudApiKey ? false : entry?.disabled === true;\n const consecutiveFailures = hasMissingCloudApiKey\n ? 0\n : (entry?.consecutiveFailures ?? 0);\n const lastError = hasMissingCloudApiKey\n ? MISSING_BACKEND_API_KEY_ERROR\n : (entry?.lastError ?? null);\n\n let isConnected: boolean | null;\n if (hasMissingCloudApiKey) {\n isConnected = false;\n } else if (disabled) {\n // Polling stopped after hitting the cap — treat as disconnected\n // so existing consumers (dot, badge) render red without needing\n // to know about the new fields.\n isConnected = false;\n } else if (r.isSuccess) isConnected = true;\n else if (r.isError) isConnected = false;\n else isConnected = null;\n\n out[b.id] = { isConnected, consecutiveFailures, lastError, disabled };\n });\n return out;\n}\n\nexport { MAX_CONSECUTIVE_FAILURES };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-backends-health.cjs","names":[],"sources":["../../../src/hooks/query/use-backends-health.ts"],"sourcesContent":["import React from \"react\";\nimport axios from \"axios\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport { HttpError } from \"@openhands/typescript-client\";\nimport {\n getCloudOrganizations,\n getCurrentCloudApiKey,\n} from \"#/api/cloud/organization-service.api\";\nimport {\n validateLocalBackend,\n INVALID_BACKEND_API_KEY_ERROR,\n} from \"#/api/agent-server-compatibility\";\nimport type { Backend } from \"#/api/backend-registry/types\";\nimport {\n isCorsOrNetworkError,\n isCorsOrNetworkErrorMessage,\n} from \"#/utils/user-facing-error\";\nimport {\n getHealthSnapshot,\n recordBackendFailure,\n recordBackendSuccess,\n subscribeBackendHealth,\n} from \"#/api/backend-registry/health-store\";\nimport { MAX_CONSECUTIVE_FAILURES } from \"#/api/backend-registry/health-storage\";\n\n// 30s: each tick costs two sequential requests per backend (settings +\n// server_info), which on slow links measurably competes with conversation\n// traffic for the browser's per-origin HTTP/1.1 connection pool.\nconst REFRESH_INTERVAL_MS = 30000;\nconst PROBE_TIMEOUT_MS = 4000;\nexport { INVALID_BACKEND_API_KEY_ERROR } from \"#/api/agent-server-compatibility\";\nexport const MISSING_BACKEND_API_KEY_ERROR = \"API key required\";\nexport const CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR =\n \"Cloud API key or network issue\";\nexport const CLOUD_BACKEND_LOGGED_OUT_ERROR = \"Logged out\";\n\nexport function isInvalidBackendApiKeyHealthError(\n error: string | null | undefined,\n): boolean {\n return error === INVALID_BACKEND_API_KEY_ERROR;\n}\n\nexport function isMissingBackendApiKeyHealthError(\n error: string | null | undefined,\n): boolean {\n return error === MISSING_BACKEND_API_KEY_ERROR;\n}\n\nexport function isCloudBackendApiKeyOrNetworkHealthError(\n error: string | null | undefined,\n): boolean {\n return error === CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR;\n}\n\nfunction hasMissingBackendApiKey(backend: Backend): boolean {\n return (\n backend.kind === \"cloud\" &&\n backend.authMode !== \"cookie\" &&\n !backend.apiKey.trim()\n );\n}\n\nexport function isCloudBackendLoggedOutHealthError(\n error: string | null | undefined,\n): boolean {\n return error === CLOUD_BACKEND_LOGGED_OUT_ERROR;\n}\n\n/**\n * Probe a single backend for connectivity. The probe path differs by\n * backend kind:\n *\n * - Local agent-server: GET `/api/settings`, then `/server_info` via the\n * typescript-client. The settings call validates the configured session\n * API key; the server info call validates the version compatibility floor.\n * - Cloud: GET `/api/keys/current` directly against the cloud host. That\n * endpoint is lightweight, requires auth, and `getCurrentCloudApiKey`\n * already absorbs the legacy-key 400 fallback so we treat that as\n * \"connected\" too. Missing / rejected keys are reported explicitly instead\n * of falling through to the browser's opaque CORS/network error shape.\n *\n * Throws on failure so React Query marks the query as errored — the\n * dropdown reads `isSuccess` to flip the indicator green.\n */\nasync function probeBackend(backend: Backend): Promise<true> {\n if (backend.kind === \"cloud\") {\n if (backend.authMode !== \"cookie\" && !backend.apiKey?.trim()) {\n throw new Error(MISSING_BACKEND_API_KEY_ERROR);\n }\n\n try {\n if (backend.authMode === \"cookie\") {\n await getCloudOrganizations(backend);\n } else {\n await getCurrentCloudApiKey(backend);\n }\n } catch (error) {\n if (\n (axios.isAxiosError(error) && error.response?.status === 401) ||\n (error instanceof HttpError && error.status === 401)\n ) {\n throw new Error(CLOUD_BACKEND_LOGGED_OUT_ERROR);\n }\n if (isCorsOrNetworkError(error)) {\n throw new Error(CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR);\n }\n throw error;\n }\n return true;\n }\n\n await validateLocalBackend(backend, PROBE_TIMEOUT_MS);\n return true;\n}\n\n/**\n * How many extra times to re-run a failed probe before giving up, and how\n * long to wait between attempts.\n */\nconst PROBE_RETRY_ATTEMPTS = 2;\nconst PROBE_RETRY_DELAY_MS = 300;\n\n/**\n * Probe a backend, retrying a couple of times on failure before giving up.\n *\n * The connectivity indicator (and the onboarding \"backend connected\" banner)\n * only flips green once a probe succeeds. With `retry: false` at the query\n * level and a REFRESH_INTERVAL_MS (30s) poll, a single transient first-probe\n * miss — the agent-server still warming up right after navigation, a momentary\n * proxy 5xx, a dropped connection — would otherwise leave the banner stuck\n * until the next scheduled refetch. That is the root cause of the\n * flaky onboarding e2e \"backend health probe should report connected\" timeout.\n *\n * Retrying here, inside the query function rather than via React Query's\n * `retry`, is deliberate: the success/failure recording below runs once per\n * settled query, so a single logical probe still records exactly one outcome.\n * Retrying at the query level instead would call `recordBackendFailure` on\n * every internal attempt and reach the disabled cap several times too fast.\n *\n * Definitive auth failures (logged out, invalid/missing key) are NOT retried:\n * they are a decided server response, not a transient miss, so retrying only\n * delays surfacing the correct \"disconnected\" state (and the recovery UI).\n */\nfunction isRetryableProbeError(error: unknown): boolean {\n if (!(error instanceof Error)) return true;\n return (\n error.message !== INVALID_BACKEND_API_KEY_ERROR &&\n error.message !== MISSING_BACKEND_API_KEY_ERROR &&\n error.message !== CLOUD_BACKEND_LOGGED_OUT_ERROR\n );\n}\n\nasync function probeBackendWithQuickRetry(backend: Backend): Promise<true> {\n for (let attempt = 0; ; attempt += 1) {\n try {\n return await probeBackend(backend);\n } catch (error) {\n if (attempt >= PROBE_RETRY_ATTEMPTS || !isRetryableProbeError(error)) {\n throw error;\n }\n await new Promise((resolve) => {\n setTimeout(resolve, PROBE_RETRY_DELAY_MS);\n });\n }\n }\n}\n\nexport interface BackendHealth {\n /** `null` while the first probe is in flight; then `true` / `false`. */\n isConnected: boolean | null;\n /** Number of consecutive failed probes since the last success. */\n consecutiveFailures: number;\n /** Last error message captured from a failed probe, if any. */\n lastError: string | null;\n /**\n * `true` once `consecutiveFailures` reaches the cap. While disabled,\n * ordinary background polling stops and survives a page refresh in\n * that state.\n */\n disabled: boolean;\n}\n\nexport interface UseBackendsHealthOptions {\n /**\n * Re-probe disabled backends once when the hook mounts. Used by the\n * Manage Backends modal so a recovered backend can clear its stale\n * persisted error state without forcing the user to edit the config.\n */\n probeDisabledOnce?: boolean;\n}\n\n/**\n * Poll every backend in `backends` once every 10s and report a simple\n * connected / disconnected verdict per backend id.\n *\n * The query key includes `host` and `apiKey` so editing a backend's\n * connection details re-keys the query and triggers an immediate\n * refetch instead of waiting for the next tick.\n *\n * After `MAX_CONSECUTIVE_FAILURES` failures in a row, ordinary polling\n * stops for that backend until the user updates its host / apiKey.\n * Callers can still opt into a one-shot recheck for disabled backends\n * (for example when the user explicitly opens Manage Backends). The\n * failure count and last error live in localStorage so a page refresh\n * does not silently re-arm polling against a backend that's known to\n * be unreachable.\n */\nexport function useBackendsHealth(\n backends: Backend[],\n options: UseBackendsHealthOptions = {},\n): Record<string, BackendHealth> {\n const { probeDisabledOnce = false } = options;\n const healthMap = React.useSyncExternalStore(\n subscribeBackendHealth,\n getHealthSnapshot,\n getHealthSnapshot,\n );\n\n const results = useQueries({\n queries: backends.map((b) => {\n const entry = healthMap[b.id];\n const hasMissingCloudApiKey = hasMissingBackendApiKey(b);\n const isDisabled = entry?.disabled === true;\n const shouldReprobeStaleCloudNetworkError =\n isDisabled &&\n b.kind === \"cloud\" &&\n isCorsOrNetworkErrorMessage(entry?.lastError);\n const shouldProbe =\n !hasMissingCloudApiKey &&\n (!isDisabled ||\n probeDisabledOnce ||\n shouldReprobeStaleCloudNetworkError);\n return {\n queryKey: [\n \"backend-health\",\n b.id,\n b.kind,\n b.host,\n b.apiKey ?? \"\",\n ] as const,\n queryFn: async () => {\n try {\n const result = await probeBackendWithQuickRetry(b);\n recordBackendSuccess(b.id);\n return result;\n } catch (err) {\n recordBackendFailure(b.id, err);\n throw err;\n }\n },\n enabled: shouldProbe,\n refetchInterval:\n isDisabled || hasMissingCloudApiKey\n ? (false as const)\n : REFRESH_INTERVAL_MS,\n refetchIntervalInBackground: false,\n refetchOnMount: isDisabled && probeDisabledOnce ? \"always\" : true,\n refetchOnReconnect: !isDisabled && !hasMissingCloudApiKey,\n refetchOnWindowFocus: !isDisabled && !hasMissingCloudApiKey,\n retry: false,\n // Keep the previous verdict visible while the next probe is in\n // flight so the indicator doesn't flicker on routine polling.\n staleTime: isDisabled ? 0 : REFRESH_INTERVAL_MS,\n meta: { disableToast: true },\n };\n }),\n });\n\n const out: Record<string, BackendHealth> = {};\n backends.forEach((b, i) => {\n const r = results[i];\n const entry = healthMap[b.id];\n const hasMissingCloudApiKey = hasMissingBackendApiKey(b);\n const disabled = hasMissingCloudApiKey ? false : entry?.disabled === true;\n const consecutiveFailures = hasMissingCloudApiKey\n ? 0\n : (entry?.consecutiveFailures ?? 0);\n const lastError = hasMissingCloudApiKey\n ? MISSING_BACKEND_API_KEY_ERROR\n : (entry?.lastError ?? null);\n\n let isConnected: boolean | null;\n if (hasMissingCloudApiKey) {\n isConnected = false;\n } else if (disabled) {\n // Polling stopped after hitting the cap — treat as disconnected\n // so existing consumers (dot, badge) render red without needing\n // to know about the new fields.\n isConnected = false;\n } else if (r.isSuccess) isConnected = true;\n else if (r.isError) isConnected = false;\n else isConnected = null;\n\n out[b.id] = { isConnected, consecutiveFailures, lastError, disabled };\n });\n return out;\n}\n\nexport { MAX_CONSECUTIVE_FAILURES };\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Backend } from "#/api/backend-registry/types";
|
|
2
2
|
import { MAX_CONSECUTIVE_FAILURES } from "#/api/backend-registry/health-storage";
|
|
3
|
-
export
|
|
3
|
+
export { INVALID_BACKEND_API_KEY_ERROR } from "#/api/agent-server-compatibility";
|
|
4
4
|
export declare const MISSING_BACKEND_API_KEY_ERROR = "API key required";
|
|
5
5
|
export declare const CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR = "Cloud API key or network issue";
|
|
6
6
|
export declare const CLOUD_BACKEND_LOGGED_OUT_ERROR = "Logged out";
|
|
@@ -1,72 +1,58 @@
|
|
|
1
1
|
import { HttpError as e } from "../../node_modules/@openhands/typescript-client/dist/client/http-client.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import "../../
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import { getAgentServerClientOptions as l } from "../../api/agent-server-client-options.js";
|
|
8
|
-
import { assertAgentServerVersionIsSupported as u, isSdkHttpStatusError as d } from "../../api/agent-server-compatibility.js";
|
|
9
|
-
import { useQueries as f } from "../../node_modules/@tanstack/react-query/build/modern/useQueries.js";
|
|
10
|
-
import p from "../../node_modules/axios/lib/axios.js";
|
|
2
|
+
import { isCorsOrNetworkError as t, isCorsOrNetworkErrorMessage as n } from "../../utils/user-facing-error.js";
|
|
3
|
+
import { getHealthSnapshot as r, recordBackendFailure as i, recordBackendSuccess as a, subscribeBackendHealth as o } from "../../api/backend-registry/health-store.js";
|
|
4
|
+
import { INVALID_BACKEND_API_KEY_ERROR as s, validateLocalBackend as c } from "../../api/agent-server-compatibility.js";
|
|
5
|
+
import { useQueries as l } from "../../node_modules/@tanstack/react-query/build/modern/useQueries.js";
|
|
6
|
+
import u from "../../node_modules/axios/lib/axios.js";
|
|
11
7
|
import "../../node_modules/@openhands/typescript-client/dist/index.js";
|
|
12
|
-
import { getCloudOrganizations as
|
|
13
|
-
import
|
|
8
|
+
import { getCloudOrganizations as d, getCurrentCloudApiKey as f } from "../../api/cloud/organization-service.api.js";
|
|
9
|
+
import p from "react";
|
|
14
10
|
//#region src/hooks/query/use-backends-health.ts
|
|
15
|
-
var
|
|
16
|
-
function
|
|
17
|
-
return e ===
|
|
11
|
+
var m = 3e4, h = 4e3, g = "API key required", _ = "Cloud API key or network issue", v = "Logged out";
|
|
12
|
+
function y(e) {
|
|
13
|
+
return e === s;
|
|
18
14
|
}
|
|
19
|
-
function
|
|
20
|
-
return e ===
|
|
15
|
+
function b(e) {
|
|
16
|
+
return e === g;
|
|
21
17
|
}
|
|
22
|
-
function
|
|
23
|
-
return e ===
|
|
18
|
+
function x(e) {
|
|
19
|
+
return e === _;
|
|
24
20
|
}
|
|
25
|
-
function
|
|
21
|
+
function S(e) {
|
|
26
22
|
return e.kind === "cloud" && e.authMode !== "cookie" && !e.apiKey.trim();
|
|
27
23
|
}
|
|
28
|
-
function
|
|
29
|
-
return e ===
|
|
24
|
+
function C(e) {
|
|
25
|
+
return e === v;
|
|
30
26
|
}
|
|
31
|
-
async function
|
|
32
|
-
if (
|
|
33
|
-
if (
|
|
27
|
+
async function w(n) {
|
|
28
|
+
if (n.kind === "cloud") {
|
|
29
|
+
if (n.authMode !== "cookie" && !n.apiKey?.trim()) throw Error(g);
|
|
34
30
|
try {
|
|
35
|
-
|
|
36
|
-
} catch (
|
|
37
|
-
throw
|
|
31
|
+
n.authMode === "cookie" ? await d(n) : await f(n);
|
|
32
|
+
} catch (n) {
|
|
33
|
+
throw u.isAxiosError(n) && n.response?.status === 401 || n instanceof e && n.status === 401 ? Error(v) : t(n) ? Error(_) : n;
|
|
38
34
|
}
|
|
39
35
|
return !0;
|
|
40
36
|
}
|
|
41
|
-
|
|
42
|
-
let e = l({
|
|
43
|
-
host: i.host,
|
|
44
|
-
sessionApiKey: i.apiKey || null,
|
|
45
|
-
timeout: v
|
|
46
|
-
});
|
|
47
|
-
await new n(e).getSettings(), u(await new t(e).getServerInfo());
|
|
48
|
-
} catch (e) {
|
|
49
|
-
throw d(e, 401) ? Error(y) : e;
|
|
50
|
-
}
|
|
51
|
-
return !0;
|
|
37
|
+
return await c(n, h), !0;
|
|
52
38
|
}
|
|
53
|
-
var
|
|
54
|
-
function
|
|
39
|
+
var T = 2, E = 300;
|
|
40
|
+
function D(e) {
|
|
55
41
|
return e instanceof Error ? e.message !== "Invalid API key" && e.message !== "API key required" && e.message !== "Logged out" : !0;
|
|
56
42
|
}
|
|
57
|
-
async function
|
|
43
|
+
async function O(e) {
|
|
58
44
|
for (let t = 0;; t += 1) try {
|
|
59
|
-
return await
|
|
45
|
+
return await w(e);
|
|
60
46
|
} catch (e) {
|
|
61
|
-
if (t >=
|
|
47
|
+
if (t >= T || !D(e)) throw e;
|
|
62
48
|
await new Promise((e) => {
|
|
63
|
-
setTimeout(e,
|
|
49
|
+
setTimeout(e, E);
|
|
64
50
|
});
|
|
65
51
|
}
|
|
66
52
|
}
|
|
67
|
-
function
|
|
68
|
-
let { probeDisabledOnce:
|
|
69
|
-
let t =
|
|
53
|
+
function k(e, t = {}) {
|
|
54
|
+
let { probeDisabledOnce: s = !1 } = t, c = p.useSyncExternalStore(o, r, r), u = l({ queries: e.map((e) => {
|
|
55
|
+
let t = c[e.id], r = S(e), o = t?.disabled === !0, l = o && e.kind === "cloud" && n(t?.lastError), u = !r && (!o || s || l);
|
|
70
56
|
return {
|
|
71
57
|
queryKey: [
|
|
72
58
|
"backend-health",
|
|
@@ -77,34 +63,34 @@ function N(e, t = {}) {
|
|
|
77
63
|
],
|
|
78
64
|
queryFn: async () => {
|
|
79
65
|
try {
|
|
80
|
-
let t = await
|
|
81
|
-
return
|
|
66
|
+
let t = await O(e);
|
|
67
|
+
return a(e.id), t;
|
|
82
68
|
} catch (t) {
|
|
83
|
-
throw
|
|
69
|
+
throw i(e.id, t), t;
|
|
84
70
|
}
|
|
85
71
|
},
|
|
86
72
|
enabled: u,
|
|
87
|
-
refetchInterval:
|
|
73
|
+
refetchInterval: o || r ? !1 : m,
|
|
88
74
|
refetchIntervalInBackground: !1,
|
|
89
|
-
refetchOnMount:
|
|
90
|
-
refetchOnReconnect: !
|
|
91
|
-
refetchOnWindowFocus: !
|
|
75
|
+
refetchOnMount: o && s ? "always" : !0,
|
|
76
|
+
refetchOnReconnect: !o && !r,
|
|
77
|
+
refetchOnWindowFocus: !o && !r,
|
|
92
78
|
retry: !1,
|
|
93
|
-
staleTime:
|
|
79
|
+
staleTime: o ? 0 : m,
|
|
94
80
|
meta: { disableToast: !0 }
|
|
95
81
|
};
|
|
96
|
-
}) }),
|
|
82
|
+
}) }), d = {};
|
|
97
83
|
return e.forEach((e, t) => {
|
|
98
|
-
let n =
|
|
99
|
-
|
|
100
|
-
isConnected:
|
|
101
|
-
consecutiveFailures:
|
|
102
|
-
lastError:
|
|
103
|
-
disabled:
|
|
84
|
+
let n = u[t], r = c[e.id], i = S(e), a = i ? !1 : r?.disabled === !0, o = i ? 0 : r?.consecutiveFailures ?? 0, s = i ? g : r?.lastError ?? null, l;
|
|
85
|
+
l = i || a ? !1 : n.isSuccess ? !0 : n.isError ? !1 : null, d[e.id] = {
|
|
86
|
+
isConnected: l,
|
|
87
|
+
consecutiveFailures: o,
|
|
88
|
+
lastError: s,
|
|
89
|
+
disabled: a
|
|
104
90
|
};
|
|
105
|
-
}),
|
|
91
|
+
}), d;
|
|
106
92
|
}
|
|
107
93
|
//#endregion
|
|
108
|
-
export {
|
|
94
|
+
export { x as isCloudBackendApiKeyOrNetworkHealthError, C as isCloudBackendLoggedOutHealthError, y as isInvalidBackendApiKeyHealthError, b as isMissingBackendApiKeyHealthError, k as useBackendsHealth };
|
|
109
95
|
|
|
110
96
|
//# sourceMappingURL=use-backends-health.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-backends-health.js","names":[],"sources":["../../../src/hooks/query/use-backends-health.ts"],"sourcesContent":["import React from \"react\";\nimport axios from \"axios\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport { HttpError } from \"@openhands/typescript-client\";\nimport {\n ServerClient,\n SettingsClient,\n} from \"@openhands/typescript-client/clients\";\nimport {\n getCloudOrganizations,\n getCurrentCloudApiKey,\n} from \"#/api/cloud/organization-service.api\";\nimport {\n assertAgentServerVersionIsSupported,\n isSdkHttpStatusError,\n} from \"#/api/agent-server-compatibility\";\nimport type { Backend } from \"#/api/backend-registry/types\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport {\n isCorsOrNetworkError,\n isCorsOrNetworkErrorMessage,\n} from \"#/utils/user-facing-error\";\nimport {\n getHealthSnapshot,\n recordBackendFailure,\n recordBackendSuccess,\n subscribeBackendHealth,\n} from \"#/api/backend-registry/health-store\";\nimport { MAX_CONSECUTIVE_FAILURES } from \"#/api/backend-registry/health-storage\";\n\n// 30s: each tick costs two sequential requests per backend (settings +\n// server_info), which on slow links measurably competes with conversation\n// traffic for the browser's per-origin HTTP/1.1 connection pool.\nconst REFRESH_INTERVAL_MS = 30000;\nconst PROBE_TIMEOUT_MS = 4000;\nexport const INVALID_BACKEND_API_KEY_ERROR = \"Invalid API key\";\nexport const MISSING_BACKEND_API_KEY_ERROR = \"API key required\";\nexport const CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR =\n \"Cloud API key or network issue\";\nexport const CLOUD_BACKEND_LOGGED_OUT_ERROR = \"Logged out\";\n\nexport function isInvalidBackendApiKeyHealthError(\n error: string | null | undefined,\n): boolean {\n return error === INVALID_BACKEND_API_KEY_ERROR;\n}\n\nexport function isMissingBackendApiKeyHealthError(\n error: string | null | undefined,\n): boolean {\n return error === MISSING_BACKEND_API_KEY_ERROR;\n}\n\nexport function isCloudBackendApiKeyOrNetworkHealthError(\n error: string | null | undefined,\n): boolean {\n return error === CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR;\n}\n\nfunction hasMissingBackendApiKey(backend: Backend): boolean {\n return (\n backend.kind === \"cloud\" &&\n backend.authMode !== \"cookie\" &&\n !backend.apiKey.trim()\n );\n}\n\nexport function isCloudBackendLoggedOutHealthError(\n error: string | null | undefined,\n): boolean {\n return error === CLOUD_BACKEND_LOGGED_OUT_ERROR;\n}\n\n/**\n * Probe a single backend for connectivity. The probe path differs by\n * backend kind:\n *\n * - Local agent-server: GET `/api/settings`, then `/server_info` via the\n * typescript-client. The settings call validates the configured session\n * API key; the server info call validates the version compatibility floor.\n * - Cloud: GET `/api/keys/current` directly against the cloud host. That\n * endpoint is lightweight, requires auth, and `getCurrentCloudApiKey`\n * already absorbs the legacy-key 400 fallback so we treat that as\n * \"connected\" too. Missing / rejected keys are reported explicitly instead\n * of falling through to the browser's opaque CORS/network error shape.\n *\n * Throws on failure so React Query marks the query as errored — the\n * dropdown reads `isSuccess` to flip the indicator green.\n */\nasync function probeBackend(backend: Backend): Promise<true> {\n if (backend.kind === \"cloud\") {\n if (backend.authMode !== \"cookie\" && !backend.apiKey?.trim()) {\n throw new Error(MISSING_BACKEND_API_KEY_ERROR);\n }\n\n try {\n if (backend.authMode === \"cookie\") {\n await getCloudOrganizations(backend);\n } else {\n await getCurrentCloudApiKey(backend);\n }\n } catch (error) {\n if (\n (axios.isAxiosError(error) && error.response?.status === 401) ||\n (error instanceof HttpError && error.status === 401)\n ) {\n throw new Error(CLOUD_BACKEND_LOGGED_OUT_ERROR);\n }\n if (isCorsOrNetworkError(error)) {\n throw new Error(CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR);\n }\n throw error;\n }\n return true;\n }\n\n try {\n const clientOptions = getAgentServerClientOptions({\n host: backend.host,\n sessionApiKey: backend.apiKey || null,\n timeout: PROBE_TIMEOUT_MS,\n });\n\n await new SettingsClient(clientOptions).getSettings();\n const serverInfo = await new ServerClient(clientOptions).getServerInfo();\n assertAgentServerVersionIsSupported(serverInfo);\n } catch (error) {\n if (isSdkHttpStatusError(error, 401)) {\n throw new Error(INVALID_BACKEND_API_KEY_ERROR);\n }\n throw error;\n }\n return true;\n}\n\n/**\n * How many extra times to re-run a failed probe before giving up, and how\n * long to wait between attempts.\n */\nconst PROBE_RETRY_ATTEMPTS = 2;\nconst PROBE_RETRY_DELAY_MS = 300;\n\n/**\n * Probe a backend, retrying a couple of times on failure before giving up.\n *\n * The connectivity indicator (and the onboarding \"backend connected\" banner)\n * only flips green once a probe succeeds. With `retry: false` at the query\n * level and a REFRESH_INTERVAL_MS (30s) poll, a single transient first-probe\n * miss — the agent-server still warming up right after navigation, a momentary\n * proxy 5xx, a dropped connection — would otherwise leave the banner stuck\n * until the next scheduled refetch. That is the root cause of the\n * flaky onboarding e2e \"backend health probe should report connected\" timeout.\n *\n * Retrying here, inside the query function rather than via React Query's\n * `retry`, is deliberate: the success/failure recording below runs once per\n * settled query, so a single logical probe still records exactly one outcome.\n * Retrying at the query level instead would call `recordBackendFailure` on\n * every internal attempt and reach the disabled cap several times too fast.\n *\n * Definitive auth failures (logged out, invalid/missing key) are NOT retried:\n * they are a decided server response, not a transient miss, so retrying only\n * delays surfacing the correct \"disconnected\" state (and the recovery UI).\n */\nfunction isRetryableProbeError(error: unknown): boolean {\n if (!(error instanceof Error)) return true;\n return (\n error.message !== INVALID_BACKEND_API_KEY_ERROR &&\n error.message !== MISSING_BACKEND_API_KEY_ERROR &&\n error.message !== CLOUD_BACKEND_LOGGED_OUT_ERROR\n );\n}\n\nasync function probeBackendWithQuickRetry(backend: Backend): Promise<true> {\n for (let attempt = 0; ; attempt += 1) {\n try {\n return await probeBackend(backend);\n } catch (error) {\n if (attempt >= PROBE_RETRY_ATTEMPTS || !isRetryableProbeError(error)) {\n throw error;\n }\n await new Promise((resolve) => {\n setTimeout(resolve, PROBE_RETRY_DELAY_MS);\n });\n }\n }\n}\n\nexport interface BackendHealth {\n /** `null` while the first probe is in flight; then `true` / `false`. */\n isConnected: boolean | null;\n /** Number of consecutive failed probes since the last success. */\n consecutiveFailures: number;\n /** Last error message captured from a failed probe, if any. */\n lastError: string | null;\n /**\n * `true` once `consecutiveFailures` reaches the cap. While disabled,\n * ordinary background polling stops and survives a page refresh in\n * that state.\n */\n disabled: boolean;\n}\n\nexport interface UseBackendsHealthOptions {\n /**\n * Re-probe disabled backends once when the hook mounts. Used by the\n * Manage Backends modal so a recovered backend can clear its stale\n * persisted error state without forcing the user to edit the config.\n */\n probeDisabledOnce?: boolean;\n}\n\n/**\n * Poll every backend in `backends` once every 10s and report a simple\n * connected / disconnected verdict per backend id.\n *\n * The query key includes `host` and `apiKey` so editing a backend's\n * connection details re-keys the query and triggers an immediate\n * refetch instead of waiting for the next tick.\n *\n * After `MAX_CONSECUTIVE_FAILURES` failures in a row, ordinary polling\n * stops for that backend until the user updates its host / apiKey.\n * Callers can still opt into a one-shot recheck for disabled backends\n * (for example when the user explicitly opens Manage Backends). The\n * failure count and last error live in localStorage so a page refresh\n * does not silently re-arm polling against a backend that's known to\n * be unreachable.\n */\nexport function useBackendsHealth(\n backends: Backend[],\n options: UseBackendsHealthOptions = {},\n): Record<string, BackendHealth> {\n const { probeDisabledOnce = false } = options;\n const healthMap = React.useSyncExternalStore(\n subscribeBackendHealth,\n getHealthSnapshot,\n getHealthSnapshot,\n );\n\n const results = useQueries({\n queries: backends.map((b) => {\n const entry = healthMap[b.id];\n const hasMissingCloudApiKey = hasMissingBackendApiKey(b);\n const isDisabled = entry?.disabled === true;\n const shouldReprobeStaleCloudNetworkError =\n isDisabled &&\n b.kind === \"cloud\" &&\n isCorsOrNetworkErrorMessage(entry?.lastError);\n const shouldProbe =\n !hasMissingCloudApiKey &&\n (!isDisabled ||\n probeDisabledOnce ||\n shouldReprobeStaleCloudNetworkError);\n return {\n queryKey: [\n \"backend-health\",\n b.id,\n b.kind,\n b.host,\n b.apiKey ?? \"\",\n ] as const,\n queryFn: async () => {\n try {\n const result = await probeBackendWithQuickRetry(b);\n recordBackendSuccess(b.id);\n return result;\n } catch (err) {\n recordBackendFailure(b.id, err);\n throw err;\n }\n },\n enabled: shouldProbe,\n refetchInterval:\n isDisabled || hasMissingCloudApiKey\n ? (false as const)\n : REFRESH_INTERVAL_MS,\n refetchIntervalInBackground: false,\n refetchOnMount: isDisabled && probeDisabledOnce ? \"always\" : true,\n refetchOnReconnect: !isDisabled && !hasMissingCloudApiKey,\n refetchOnWindowFocus: !isDisabled && !hasMissingCloudApiKey,\n retry: false,\n // Keep the previous verdict visible while the next probe is in\n // flight so the indicator doesn't flicker on routine polling.\n staleTime: isDisabled ? 0 : REFRESH_INTERVAL_MS,\n meta: { disableToast: true },\n };\n }),\n });\n\n const out: Record<string, BackendHealth> = {};\n backends.forEach((b, i) => {\n const r = results[i];\n const entry = healthMap[b.id];\n const hasMissingCloudApiKey = hasMissingBackendApiKey(b);\n const disabled = hasMissingCloudApiKey ? false : entry?.disabled === true;\n const consecutiveFailures = hasMissingCloudApiKey\n ? 0\n : (entry?.consecutiveFailures ?? 0);\n const lastError = hasMissingCloudApiKey\n ? MISSING_BACKEND_API_KEY_ERROR\n : (entry?.lastError ?? null);\n\n let isConnected: boolean | null;\n if (hasMissingCloudApiKey) {\n isConnected = false;\n } else if (disabled) {\n // Polling stopped after hitting the cap — treat as disconnected\n // so existing consumers (dot, badge) render red without needing\n // to know about the new fields.\n isConnected = false;\n } else if (r.isSuccess) isConnected = true;\n else if (r.isError) isConnected = false;\n else isConnected = null;\n\n out[b.id] = { isConnected, consecutiveFailures, lastError, disabled };\n });\n return out;\n}\n\nexport { MAX_CONSECUTIVE_FAILURES };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-backends-health.js","names":[],"sources":["../../../src/hooks/query/use-backends-health.ts"],"sourcesContent":["import React from \"react\";\nimport axios from \"axios\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport { HttpError } from \"@openhands/typescript-client\";\nimport {\n getCloudOrganizations,\n getCurrentCloudApiKey,\n} from \"#/api/cloud/organization-service.api\";\nimport {\n validateLocalBackend,\n INVALID_BACKEND_API_KEY_ERROR,\n} from \"#/api/agent-server-compatibility\";\nimport type { Backend } from \"#/api/backend-registry/types\";\nimport {\n isCorsOrNetworkError,\n isCorsOrNetworkErrorMessage,\n} from \"#/utils/user-facing-error\";\nimport {\n getHealthSnapshot,\n recordBackendFailure,\n recordBackendSuccess,\n subscribeBackendHealth,\n} from \"#/api/backend-registry/health-store\";\nimport { MAX_CONSECUTIVE_FAILURES } from \"#/api/backend-registry/health-storage\";\n\n// 30s: each tick costs two sequential requests per backend (settings +\n// server_info), which on slow links measurably competes with conversation\n// traffic for the browser's per-origin HTTP/1.1 connection pool.\nconst REFRESH_INTERVAL_MS = 30000;\nconst PROBE_TIMEOUT_MS = 4000;\nexport { INVALID_BACKEND_API_KEY_ERROR } from \"#/api/agent-server-compatibility\";\nexport const MISSING_BACKEND_API_KEY_ERROR = \"API key required\";\nexport const CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR =\n \"Cloud API key or network issue\";\nexport const CLOUD_BACKEND_LOGGED_OUT_ERROR = \"Logged out\";\n\nexport function isInvalidBackendApiKeyHealthError(\n error: string | null | undefined,\n): boolean {\n return error === INVALID_BACKEND_API_KEY_ERROR;\n}\n\nexport function isMissingBackendApiKeyHealthError(\n error: string | null | undefined,\n): boolean {\n return error === MISSING_BACKEND_API_KEY_ERROR;\n}\n\nexport function isCloudBackendApiKeyOrNetworkHealthError(\n error: string | null | undefined,\n): boolean {\n return error === CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR;\n}\n\nfunction hasMissingBackendApiKey(backend: Backend): boolean {\n return (\n backend.kind === \"cloud\" &&\n backend.authMode !== \"cookie\" &&\n !backend.apiKey.trim()\n );\n}\n\nexport function isCloudBackendLoggedOutHealthError(\n error: string | null | undefined,\n): boolean {\n return error === CLOUD_BACKEND_LOGGED_OUT_ERROR;\n}\n\n/**\n * Probe a single backend for connectivity. The probe path differs by\n * backend kind:\n *\n * - Local agent-server: GET `/api/settings`, then `/server_info` via the\n * typescript-client. The settings call validates the configured session\n * API key; the server info call validates the version compatibility floor.\n * - Cloud: GET `/api/keys/current` directly against the cloud host. That\n * endpoint is lightweight, requires auth, and `getCurrentCloudApiKey`\n * already absorbs the legacy-key 400 fallback so we treat that as\n * \"connected\" too. Missing / rejected keys are reported explicitly instead\n * of falling through to the browser's opaque CORS/network error shape.\n *\n * Throws on failure so React Query marks the query as errored — the\n * dropdown reads `isSuccess` to flip the indicator green.\n */\nasync function probeBackend(backend: Backend): Promise<true> {\n if (backend.kind === \"cloud\") {\n if (backend.authMode !== \"cookie\" && !backend.apiKey?.trim()) {\n throw new Error(MISSING_BACKEND_API_KEY_ERROR);\n }\n\n try {\n if (backend.authMode === \"cookie\") {\n await getCloudOrganizations(backend);\n } else {\n await getCurrentCloudApiKey(backend);\n }\n } catch (error) {\n if (\n (axios.isAxiosError(error) && error.response?.status === 401) ||\n (error instanceof HttpError && error.status === 401)\n ) {\n throw new Error(CLOUD_BACKEND_LOGGED_OUT_ERROR);\n }\n if (isCorsOrNetworkError(error)) {\n throw new Error(CLOUD_BACKEND_API_KEY_OR_NETWORK_ERROR);\n }\n throw error;\n }\n return true;\n }\n\n await validateLocalBackend(backend, PROBE_TIMEOUT_MS);\n return true;\n}\n\n/**\n * How many extra times to re-run a failed probe before giving up, and how\n * long to wait between attempts.\n */\nconst PROBE_RETRY_ATTEMPTS = 2;\nconst PROBE_RETRY_DELAY_MS = 300;\n\n/**\n * Probe a backend, retrying a couple of times on failure before giving up.\n *\n * The connectivity indicator (and the onboarding \"backend connected\" banner)\n * only flips green once a probe succeeds. With `retry: false` at the query\n * level and a REFRESH_INTERVAL_MS (30s) poll, a single transient first-probe\n * miss — the agent-server still warming up right after navigation, a momentary\n * proxy 5xx, a dropped connection — would otherwise leave the banner stuck\n * until the next scheduled refetch. That is the root cause of the\n * flaky onboarding e2e \"backend health probe should report connected\" timeout.\n *\n * Retrying here, inside the query function rather than via React Query's\n * `retry`, is deliberate: the success/failure recording below runs once per\n * settled query, so a single logical probe still records exactly one outcome.\n * Retrying at the query level instead would call `recordBackendFailure` on\n * every internal attempt and reach the disabled cap several times too fast.\n *\n * Definitive auth failures (logged out, invalid/missing key) are NOT retried:\n * they are a decided server response, not a transient miss, so retrying only\n * delays surfacing the correct \"disconnected\" state (and the recovery UI).\n */\nfunction isRetryableProbeError(error: unknown): boolean {\n if (!(error instanceof Error)) return true;\n return (\n error.message !== INVALID_BACKEND_API_KEY_ERROR &&\n error.message !== MISSING_BACKEND_API_KEY_ERROR &&\n error.message !== CLOUD_BACKEND_LOGGED_OUT_ERROR\n );\n}\n\nasync function probeBackendWithQuickRetry(backend: Backend): Promise<true> {\n for (let attempt = 0; ; attempt += 1) {\n try {\n return await probeBackend(backend);\n } catch (error) {\n if (attempt >= PROBE_RETRY_ATTEMPTS || !isRetryableProbeError(error)) {\n throw error;\n }\n await new Promise((resolve) => {\n setTimeout(resolve, PROBE_RETRY_DELAY_MS);\n });\n }\n }\n}\n\nexport interface BackendHealth {\n /** `null` while the first probe is in flight; then `true` / `false`. */\n isConnected: boolean | null;\n /** Number of consecutive failed probes since the last success. */\n consecutiveFailures: number;\n /** Last error message captured from a failed probe, if any. */\n lastError: string | null;\n /**\n * `true` once `consecutiveFailures` reaches the cap. While disabled,\n * ordinary background polling stops and survives a page refresh in\n * that state.\n */\n disabled: boolean;\n}\n\nexport interface UseBackendsHealthOptions {\n /**\n * Re-probe disabled backends once when the hook mounts. Used by the\n * Manage Backends modal so a recovered backend can clear its stale\n * persisted error state without forcing the user to edit the config.\n */\n probeDisabledOnce?: boolean;\n}\n\n/**\n * Poll every backend in `backends` once every 10s and report a simple\n * connected / disconnected verdict per backend id.\n *\n * The query key includes `host` and `apiKey` so editing a backend's\n * connection details re-keys the query and triggers an immediate\n * refetch instead of waiting for the next tick.\n *\n * After `MAX_CONSECUTIVE_FAILURES` failures in a row, ordinary polling\n * stops for that backend until the user updates its host / apiKey.\n * Callers can still opt into a one-shot recheck for disabled backends\n * (for example when the user explicitly opens Manage Backends). The\n * failure count and last error live in localStorage so a page refresh\n * does not silently re-arm polling against a backend that's known to\n * be unreachable.\n */\nexport function useBackendsHealth(\n backends: Backend[],\n options: UseBackendsHealthOptions = {},\n): Record<string, BackendHealth> {\n const { probeDisabledOnce = false } = options;\n const healthMap = React.useSyncExternalStore(\n subscribeBackendHealth,\n getHealthSnapshot,\n getHealthSnapshot,\n );\n\n const results = useQueries({\n queries: backends.map((b) => {\n const entry = healthMap[b.id];\n const hasMissingCloudApiKey = hasMissingBackendApiKey(b);\n const isDisabled = entry?.disabled === true;\n const shouldReprobeStaleCloudNetworkError =\n isDisabled &&\n b.kind === \"cloud\" &&\n isCorsOrNetworkErrorMessage(entry?.lastError);\n const shouldProbe =\n !hasMissingCloudApiKey &&\n (!isDisabled ||\n probeDisabledOnce ||\n shouldReprobeStaleCloudNetworkError);\n return {\n queryKey: [\n \"backend-health\",\n b.id,\n b.kind,\n b.host,\n b.apiKey ?? \"\",\n ] as const,\n queryFn: async () => {\n try {\n const result = await probeBackendWithQuickRetry(b);\n recordBackendSuccess(b.id);\n return result;\n } catch (err) {\n recordBackendFailure(b.id, err);\n throw err;\n }\n },\n enabled: shouldProbe,\n refetchInterval:\n isDisabled || hasMissingCloudApiKey\n ? (false as const)\n : REFRESH_INTERVAL_MS,\n refetchIntervalInBackground: false,\n refetchOnMount: isDisabled && probeDisabledOnce ? \"always\" : true,\n refetchOnReconnect: !isDisabled && !hasMissingCloudApiKey,\n refetchOnWindowFocus: !isDisabled && !hasMissingCloudApiKey,\n retry: false,\n // Keep the previous verdict visible while the next probe is in\n // flight so the indicator doesn't flicker on routine polling.\n staleTime: isDisabled ? 0 : REFRESH_INTERVAL_MS,\n meta: { disableToast: true },\n };\n }),\n });\n\n const out: Record<string, BackendHealth> = {};\n backends.forEach((b, i) => {\n const r = results[i];\n const entry = healthMap[b.id];\n const hasMissingCloudApiKey = hasMissingBackendApiKey(b);\n const disabled = hasMissingCloudApiKey ? false : entry?.disabled === true;\n const consecutiveFailures = hasMissingCloudApiKey\n ? 0\n : (entry?.consecutiveFailures ?? 0);\n const lastError = hasMissingCloudApiKey\n ? MISSING_BACKEND_API_KEY_ERROR\n : (entry?.lastError ?? null);\n\n let isConnected: boolean | null;\n if (hasMissingCloudApiKey) {\n isConnected = false;\n } else if (disabled) {\n // Polling stopped after hitting the cap — treat as disconnected\n // so existing consumers (dot, badge) render red without needing\n // to know about the new fields.\n isConnected = false;\n } else if (r.isSuccess) isConnected = true;\n else if (r.isError) isConnected = false;\n else isConnected = null;\n\n out[b.id] = { isConnected, consecutiveFailures, lastError, disabled };\n });\n return out;\n}\n\nexport { MAX_CONSECUTIVE_FAILURES };\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require("../../_virtual/_rolldown/runtime.cjs"),require("../../api/backend-registry/active-store.cjs"),require("../../contexts/active-backend-context.cjs"),require("../../api/canvas-extensions-service.cjs");
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
interface UseCanvasExtensionsOptions {
|
|
2
|
+
enabled?: boolean;
|
|
3
|
+
}
|
|
4
|
+
export declare function useCanvasExtensions(options?: UseCanvasExtensionsOptions): import("@tanstack/react-query").UseQueryResult<NoInfer<import("../..").InstalledCanvasExtensionInfo[]>, import("axios").AxiosError<unknown, any>>;
|
|
5
|
+
export {};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../use-conversation-id.cjs"),n=require("../../node_modules/@tanstack/react-query/build/modern/useQuery.cjs"),r=require("./use-active-conversation.cjs"),i=require("../use-runtime-is-ready.cjs"),a=require("../../
|
|
1
|
+
const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../use-conversation-id.cjs"),n=require("../../node_modules/@tanstack/react-query/build/modern/useQuery.cjs"),r=require("./use-active-conversation.cjs"),i=require("../use-runtime-is-ready.cjs"),a=require("../../utils/get-git-path.cjs"),o=require("../../api/git-service/agent-server-git-service.api.cjs");let s=require("react");s=e.__toESM(s,1);var c=(e,c)=>{let{conversationId:l}=t.useConversationId(),{data:u}=r.useActiveConversation(),d=i.useRuntimeIsReady(),f=u?.conversation_url,p=u?.session_api_key,m=u?.selected_repository,h=u?.workspace?.working_dir?.trim(),g=s.default.useMemo(()=>a.getGitPath(m,h),[m,h]);return n.useQuery({queryKey:[`commit_changes`,l,f,p,g,e],queryFn:async()=>{if(!l)throw Error(`No conversation ID`);return o.default.getCommitChanges(f,p,g,e)},staleTime:1/0,gcTime:1e3*60*15,retry:!1,enabled:c.enabled&&d&&!!l,meta:{disableToast:!0}})};exports.useCommitChanges=c;
|
|
2
2
|
//# sourceMappingURL=use-commit-changes.cjs.map
|
|
@@ -2,12 +2,12 @@ import { useConversationId as e } from "../use-conversation-id.js";
|
|
|
2
2
|
import { useQuery as t } from "../../node_modules/@tanstack/react-query/build/modern/useQuery.js";
|
|
3
3
|
import { useActiveConversation as n } from "./use-active-conversation.js";
|
|
4
4
|
import { useRuntimeIsReady as r } from "../use-runtime-is-ready.js";
|
|
5
|
-
import i from "../../
|
|
6
|
-
import
|
|
5
|
+
import { getGitPath as i } from "../../utils/get-git-path.js";
|
|
6
|
+
import a from "../../api/git-service/agent-server-git-service.api.js";
|
|
7
7
|
import o from "react";
|
|
8
8
|
//#region src/hooks/query/use-commit-changes.ts
|
|
9
9
|
var s = (s, c) => {
|
|
10
|
-
let { conversationId: l } = e(), { data: u } = n(), d = r(), f = u?.conversation_url, p = u?.session_api_key, m = u?.selected_repository, h = u?.workspace?.working_dir?.trim(), g = o.useMemo(() =>
|
|
10
|
+
let { conversationId: l } = e(), { data: u } = n(), d = r(), f = u?.conversation_url, p = u?.session_api_key, m = u?.selected_repository, h = u?.workspace?.working_dir?.trim(), g = o.useMemo(() => i(m, h), [m, h]);
|
|
11
11
|
return t({
|
|
12
12
|
queryKey: [
|
|
13
13
|
"commit_changes",
|
|
@@ -19,7 +19,7 @@ var s = (s, c) => {
|
|
|
19
19
|
],
|
|
20
20
|
queryFn: async () => {
|
|
21
21
|
if (!l) throw Error("No conversation ID");
|
|
22
|
-
return
|
|
22
|
+
return a.getCommitChanges(f, p, g, s);
|
|
23
23
|
},
|
|
24
24
|
staleTime: Infinity,
|
|
25
25
|
gcTime: 1e3 * 60 * 15,
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../../_virtual/_rolldown/runtime.cjs");const e=require("
|
|
1
|
+
require("../../_virtual/_rolldown/runtime.cjs");const e=require("../use-conversation-id.cjs"),t=require("../../node_modules/@tanstack/react-query/build/modern/useQuery.cjs"),n=require("../../contexts/active-backend-context.cjs"),r=require("./use-active-conversation.cjs"),i=require("../../api/skills-service.cjs");var a=()=>{let a=n.useActiveBackend().backend.kind===`cloud`,{conversationId:o}=e.useOptionalConversationId(),{data:s}=r.useActiveConversation(),c=s?.selected_workspace??void 0,l=a?o:null;return t.useQuery({queryKey:l?[`conversation`,l,`skills`]:[`skills`,c??null],queryFn:()=>l?i.default.getConversationSkills(l):i.default.getSkills(c),enabled:!l||s?.sandbox_status===`RUNNING`,staleTime:1e3*60*10,refetchOnWindowFocus:!1})};exports.useConversationSkills=a;
|
|
2
2
|
//# sourceMappingURL=use-conversation-skills.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-conversation-skills.cjs","names":[],"sources":["../../../src/hooks/query/use-conversation-skills.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"use-conversation-skills.cjs","names":[],"sources":["../../../src/hooks/query/use-conversation-skills.ts"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport SkillsService from \"#/api/skills-service\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useOptionalConversationId } from \"#/hooks/use-conversation-id\";\nimport { SkillInfo } from \"#/types/settings\";\nimport { useActiveConversation } from \"./use-active-conversation\";\n\n/**\n * Skills catalog scoped to the active conversation, so the slash-command menu\n * and skills modal list the same skills that were loaded into it.\n *\n * Cloud: the per-conversation route reports what the conversation's\n * agent-server actually loaded (public catalog, user/org repos, project\n * skills, auto-loaded marketplace plugins); the global `/api/v1/skills/search`\n * catalog only scans the API host's built-in skills directory. The route needs\n * a running sandbox, which `useActiveConversation` polls for.\n *\n * Local (and cloud with no conversation route, e.g. the home page): the\n * workspace-scoped catalog, falling back to the global workspace dir for\n * \"No workspace\" conversations (`selected_workspace` is null).\n */\nexport const useConversationSkills = () => {\n const isCloud = useActiveBackend().backend.kind === \"cloud\";\n const { conversationId } = useOptionalConversationId();\n const { data: conversation } = useActiveConversation();\n const projectDir = conversation?.selected_workspace ?? undefined;\n // Keyed on the route id so a still-loading cloud conversation does not fall\n // back to the global catalog; only a missing route does.\n const cloudConversationId = isCloud ? conversationId : null;\n\n return useQuery<SkillInfo[]>({\n queryKey: cloudConversationId\n ? [\"conversation\", cloudConversationId, \"skills\"]\n : [\"skills\", projectDir ?? null],\n queryFn: () =>\n cloudConversationId\n ? SkillsService.getConversationSkills(cloudConversationId)\n : SkillsService.getSkills(projectDir),\n // The cloud route 404s until the sandbox runs.\n enabled: !cloudConversationId || conversation?.sandbox_status === \"RUNNING\",\n staleTime: 1000 * 60 * 10, // 10 minutes – skill list rarely changes\n refetchOnWindowFocus: false,\n });\n};\n"],"mappings":"0TAqBA,IAAa,MAA8B,CACzC,IAAM,EAAU,EAAA,iBAAiB,EAAE,QAAQ,OAAS,QAC9C,CAAE,kBAAmB,EAAA,0BAA0B,EAC/C,CAAE,KAAM,GAAiB,EAAA,sBAAsB,EAC/C,EAAa,GAAc,oBAAsB,IAAA,GAGjD,EAAsB,EAAU,EAAiB,KAEvD,OAAO,EAAA,SAAsB,CAC3B,SAAU,EACN,CAAC,eAAgB,EAAqB,QAAQ,EAC9C,CAAC,SAAU,GAAc,IAAI,EACjC,YACE,EACI,EAAA,QAAc,sBAAsB,CAAmB,EACvD,EAAA,QAAc,UAAU,CAAU,EAExC,QAAS,CAAC,GAAuB,GAAc,iBAAmB,UAClE,UAAW,IAAO,GAAK,GACvB,qBAAsB,EACxB,CAAC,CACH"}
|
|
@@ -1,7 +1,16 @@
|
|
|
1
|
+
import { SkillInfo } from "#/types/settings";
|
|
1
2
|
/**
|
|
2
|
-
* Skills catalog scoped to the active conversation
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* Skills catalog scoped to the active conversation, so the slash-command menu
|
|
4
|
+
* and skills modal list the same skills that were loaded into it.
|
|
5
|
+
*
|
|
6
|
+
* Cloud: the per-conversation route reports what the conversation's
|
|
7
|
+
* agent-server actually loaded (public catalog, user/org repos, project
|
|
8
|
+
* skills, auto-loaded marketplace plugins); the global `/api/v1/skills/search`
|
|
9
|
+
* catalog only scans the API host's built-in skills directory. The route needs
|
|
10
|
+
* a running sandbox, which `useActiveConversation` polls for.
|
|
11
|
+
*
|
|
12
|
+
* Local (and cloud with no conversation route, e.g. the home page): the
|
|
13
|
+
* workspace-scoped catalog, falling back to the global workspace dir for
|
|
14
|
+
* "No workspace" conversations (`selected_workspace` is null).
|
|
6
15
|
*/
|
|
7
|
-
export declare const useConversationSkills: () => import("@tanstack/react-query").UseQueryResult<NoInfer<
|
|
16
|
+
export declare const useConversationSkills: () => import("@tanstack/react-query").UseQueryResult<NoInfer<SkillInfo[]>, import("axios").AxiosError<unknown, any>>;
|
|
@@ -1,8 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { useOptionalConversationId as e } from "../use-conversation-id.js";
|
|
2
|
+
import { useQuery as t } from "../../node_modules/@tanstack/react-query/build/modern/useQuery.js";
|
|
3
|
+
import { useActiveBackend as n } from "../../contexts/active-backend-context.js";
|
|
4
|
+
import { useActiveConversation as r } from "./use-active-conversation.js";
|
|
5
|
+
import i from "../../api/skills-service.js";
|
|
3
6
|
//#region src/hooks/query/use-conversation-skills.ts
|
|
4
|
-
var
|
|
7
|
+
var a = () => {
|
|
8
|
+
let a = n().backend.kind === "cloud", { conversationId: o } = e(), { data: s } = r(), c = s?.selected_workspace ?? void 0, l = a ? o : null;
|
|
9
|
+
return t({
|
|
10
|
+
queryKey: l ? [
|
|
11
|
+
"conversation",
|
|
12
|
+
l,
|
|
13
|
+
"skills"
|
|
14
|
+
] : ["skills", c ?? null],
|
|
15
|
+
queryFn: () => l ? i.getConversationSkills(l) : i.getSkills(c),
|
|
16
|
+
enabled: !l || s?.sandbox_status === "RUNNING",
|
|
17
|
+
staleTime: 1e3 * 60 * 10,
|
|
18
|
+
refetchOnWindowFocus: !1
|
|
19
|
+
});
|
|
20
|
+
};
|
|
5
21
|
//#endregion
|
|
6
|
-
export {
|
|
22
|
+
export { a as useConversationSkills };
|
|
7
23
|
|
|
8
24
|
//# sourceMappingURL=use-conversation-skills.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-conversation-skills.js","names":[],"sources":["../../../src/hooks/query/use-conversation-skills.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"use-conversation-skills.js","names":[],"sources":["../../../src/hooks/query/use-conversation-skills.ts"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport SkillsService from \"#/api/skills-service\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useOptionalConversationId } from \"#/hooks/use-conversation-id\";\nimport { SkillInfo } from \"#/types/settings\";\nimport { useActiveConversation } from \"./use-active-conversation\";\n\n/**\n * Skills catalog scoped to the active conversation, so the slash-command menu\n * and skills modal list the same skills that were loaded into it.\n *\n * Cloud: the per-conversation route reports what the conversation's\n * agent-server actually loaded (public catalog, user/org repos, project\n * skills, auto-loaded marketplace plugins); the global `/api/v1/skills/search`\n * catalog only scans the API host's built-in skills directory. The route needs\n * a running sandbox, which `useActiveConversation` polls for.\n *\n * Local (and cloud with no conversation route, e.g. the home page): the\n * workspace-scoped catalog, falling back to the global workspace dir for\n * \"No workspace\" conversations (`selected_workspace` is null).\n */\nexport const useConversationSkills = () => {\n const isCloud = useActiveBackend().backend.kind === \"cloud\";\n const { conversationId } = useOptionalConversationId();\n const { data: conversation } = useActiveConversation();\n const projectDir = conversation?.selected_workspace ?? undefined;\n // Keyed on the route id so a still-loading cloud conversation does not fall\n // back to the global catalog; only a missing route does.\n const cloudConversationId = isCloud ? conversationId : null;\n\n return useQuery<SkillInfo[]>({\n queryKey: cloudConversationId\n ? [\"conversation\", cloudConversationId, \"skills\"]\n : [\"skills\", projectDir ?? null],\n queryFn: () =>\n cloudConversationId\n ? SkillsService.getConversationSkills(cloudConversationId)\n : SkillsService.getSkills(projectDir),\n // The cloud route 404s until the sandbox runs.\n enabled: !cloudConversationId || conversation?.sandbox_status === \"RUNNING\",\n staleTime: 1000 * 60 * 10, // 10 minutes – skill list rarely changes\n refetchOnWindowFocus: false,\n });\n};\n"],"mappings":";;;;;;AAqBA,IAAa,UAA8B;CACzC,IAAM,IAAU,EAAiB,EAAE,QAAQ,SAAS,SAC9C,EAAE,sBAAmB,EAA0B,GAC/C,EAAE,MAAM,MAAiB,EAAsB,GAC/C,IAAa,GAAc,sBAAsB,KAAA,GAGjD,IAAsB,IAAU,IAAiB;CAEvD,OAAO,EAAsB;EAC3B,UAAU,IACN;GAAC;GAAgB;GAAqB;EAAQ,IAC9C,CAAC,UAAU,KAAc,IAAI;EACjC,eACE,IACI,EAAc,sBAAsB,CAAmB,IACvD,EAAc,UAAU,CAAU;EAExC,SAAS,CAAC,KAAuB,GAAc,mBAAmB;EAClE,WAAW,MAAO,KAAK;EACvB,sBAAsB;CACxB,CAAC;AACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
require("../../_virtual/_rolldown/runtime.cjs"),require("../../contexts/active-backend-context.cjs"),require("../../api/automation-service/automation-service.api.cjs"),require("./use-automation-detail.cjs");
|
|
1
|
+
require("../../_virtual/_rolldown/runtime.cjs"),require("../../contexts/active-backend-context.cjs"),require("../../api/automation-service/automation-service.api.cjs"),require("./concurrency-limiter.cjs"),require("./use-automation-detail.cjs");
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../api/backend-registry/active-store.cjs"),
|
|
1
|
+
require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../context/navigation-context.cjs"),t=require("../../api/backend-registry/active-store.cjs"),n=require("../../node_modules/@tanstack/react-query/build/modern/useInfiniteQuery.cjs"),r=require("../../contexts/active-backend-context.cjs"),i=require("../../api/conversation-service/agent-server-conversation-service.api.cjs"),a=require("./use-is-authed.cjs"),o=require("../../manifests/automation-interface.cjs");var s=(s=20)=>{let{data:c}=a.useIsAuthed(),l=r.useActiveBackend(),{currentPath:u}=e.useNavigation(),d=!t.isNoBackend(l.backend);return n.useInfiniteQuery({queryKey:[`user`,`conversations`,`paginated`,s,l.backend.id,l.orgId],queryFn:async({pageParam:e})=>await i.default.searchConversations(s,e),enabled:!!c&&d,getNextPageParam:e=>e.next_page_id,initialPageParam:void 0,refetchInterval:o.isAutomationsRoute(u)?!1:3e4,refetchIntervalInBackground:!1,meta:{backendId:l.backend.id}})};exports.usePaginatedConversations=s;
|
|
2
2
|
//# sourceMappingURL=use-paginated-conversations.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-paginated-conversations.cjs","names":[],"sources":["../../../src/hooks/query/use-paginated-conversations.ts"],"sourcesContent":["import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport AgentServerConversationService from \"#/api/conversation-service/agent-server-conversation-service.api\";\nimport { useIsAuthed } from \"./use-is-authed\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { AppConversationPage } from \"#/api/conversation-service/agent-server-conversation-service.types\";\n\nexport const usePaginatedConversations = (limit: number = 20) => {\n const { data: userIsAuthenticated } = useIsAuthed();\n const active = useActiveBackend();\n const hasBackend = !isNoBackend(active.backend);\n\n return useInfiniteQuery({\n // Include the active backend identity so each (backend, org) pair\n // maintains its own paginated cache. Switching backends naturally\n // produces a new query and a fresh fetch — without it the previous\n // backend's conversations stay visible for staleTime.\n queryKey: [\n \"user\",\n \"conversations\",\n \"paginated\",\n limit,\n active.backend.id,\n active.orgId,\n ],\n queryFn: async ({ pageParam }) => {\n const result = await AgentServerConversationService.searchConversations(\n limit,\n pageParam,\n );\n\n return result;\n },\n enabled: !!userIsAuthenticated && hasBackend,\n getNextPageParam: (lastPage: AppConversationPage) => lastPage.next_page_id,\n initialPageParam: undefined as string | undefined,\n // Poll every 30s so titles, execution status, and timestamps stay fresh\n // without requiring the user to refresh. Each response carries the full\n // conversation objects, so on slow links a tighter interval degrades into\n // a continuous download that starves the rest of the app (including the\n // events WebSocket handshake). Consumers must gate initial-load UI (e.g.\n // skeletons) on `isLoading`, not `isFetching` — `isFetching` flips back to\n // true on every background refetch, which would cause the skeleton to\n // flicker on each poll when the list is empty.\n refetchInterval: 30_000,\n // A successful fetch proves the backend is reachable. The global\n // QueryCache onSuccess handler reads this to clear any persisted\n // failure state, re-arming the status dot without user intervention.\n meta: { backendId: active.backend.id },\n });\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-paginated-conversations.cjs","names":[],"sources":["../../../src/hooks/query/use-paginated-conversations.ts"],"sourcesContent":["import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport AgentServerConversationService from \"#/api/conversation-service/agent-server-conversation-service.api\";\nimport { useIsAuthed } from \"./use-is-authed\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { isAutomationsRoute } from \"#/manifests/automation-interface\";\nimport { AppConversationPage } from \"#/api/conversation-service/agent-server-conversation-service.types\";\n\nexport const usePaginatedConversations = (limit: number = 20) => {\n const { data: userIsAuthenticated } = useIsAuthed();\n const active = useActiveBackend();\n const { currentPath } = useNavigation();\n const hasBackend = !isNoBackend(active.backend);\n\n return useInfiniteQuery({\n // Include the active backend identity so each (backend, org) pair\n // maintains its own paginated cache. Switching backends naturally\n // produces a new query and a fresh fetch — without it the previous\n // backend's conversations stay visible for staleTime.\n queryKey: [\n \"user\",\n \"conversations\",\n \"paginated\",\n limit,\n active.backend.id,\n active.orgId,\n ],\n queryFn: async ({ pageParam }) => {\n const result = await AgentServerConversationService.searchConversations(\n limit,\n pageParam,\n );\n\n return result;\n },\n enabled: !!userIsAuthenticated && hasBackend,\n getNextPageParam: (lastPage: AppConversationPage) => lastPage.next_page_id,\n initialPageParam: undefined as string | undefined,\n // Poll every 30s so titles, execution status, and timestamps stay fresh\n // without requiring the user to refresh. Each response carries the full\n // conversation objects, so on slow links a tighter interval degrades into\n // a continuous download that starves the rest of the app (including the\n // events WebSocket handshake). Consumers must gate initial-load UI (e.g.\n // skeletons) on `isLoading`, not `isFetching` — `isFetching` flips back to\n // true on every background refetch, which would cause the skeleton to\n // flicker on each poll when the list is empty.\n //\n // The interval is paused on automation routes: the dashboard there already\n // fans out one runs request per automation, and the sidebar list is not\n // the focus. Only the poll pauses — the initial fetch still happens — and\n // mutations that create or cancel runs invalidate [\"user\", \"conversations\"]\n // so the sidebar stays correct while paused.\n refetchInterval: isAutomationsRoute(currentPath) ? false : 30_000,\n refetchIntervalInBackground: false,\n // A successful fetch proves the backend is reachable. The global\n // QueryCache onSuccess handler reads this to clear any persisted\n // failure state, re-arming the status dot without user intervention.\n meta: { backendId: active.backend.id },\n });\n};\n"],"mappings":"6dASA,IAAa,GAA6B,EAAgB,KAAO,CAC/D,GAAM,CAAE,KAAM,GAAwB,EAAA,YAAY,EAC5C,EAAS,EAAA,iBAAiB,EAC1B,CAAE,eAAgB,EAAA,cAAc,EAChC,EAAa,CAAC,EAAA,YAAY,EAAO,OAAO,EAE9C,OAAO,EAAA,iBAAiB,CAKtB,SAAU,CACR,OACA,gBACA,YACA,EACA,EAAO,QAAQ,GACf,EAAO,KACT,EACA,QAAS,MAAO,CAAE,eAMT,MALc,EAAA,QAA+B,oBAClD,EACA,CACF,EAIF,QAAS,CAAC,CAAC,GAAuB,EAClC,iBAAmB,GAAkC,EAAS,aAC9D,iBAAkB,IAAA,GAelB,gBAAiB,EAAA,mBAAmB,CAAW,EAAI,GAAQ,IAC3D,4BAA6B,GAI7B,KAAM,CAAE,UAAW,EAAO,QAAQ,EAAG,CACvC,CAAC,CACH"}
|
|
@@ -1,29 +1,32 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import r from "../../
|
|
5
|
-
import
|
|
1
|
+
import { useNavigation as e } from "../../context/navigation-context.js";
|
|
2
|
+
import { isNoBackend as t } from "../../api/backend-registry/active-store.js";
|
|
3
|
+
import { useInfiniteQuery as n } from "../../node_modules/@tanstack/react-query/build/modern/useInfiniteQuery.js";
|
|
4
|
+
import { useActiveBackend as r } from "../../contexts/active-backend-context.js";
|
|
5
|
+
import i from "../../api/conversation-service/agent-server-conversation-service.api.js";
|
|
6
|
+
import { useIsAuthed as a } from "./use-is-authed.js";
|
|
7
|
+
import { isAutomationsRoute as o } from "../../manifests/automation-interface.js";
|
|
6
8
|
//#region src/hooks/query/use-paginated-conversations.ts
|
|
7
|
-
var
|
|
8
|
-
let { data:
|
|
9
|
-
return
|
|
9
|
+
var s = (s = 20) => {
|
|
10
|
+
let { data: c } = a(), l = r(), { currentPath: u } = e(), d = !t(l.backend);
|
|
11
|
+
return n({
|
|
10
12
|
queryKey: [
|
|
11
13
|
"user",
|
|
12
14
|
"conversations",
|
|
13
15
|
"paginated",
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
16
|
+
s,
|
|
17
|
+
l.backend.id,
|
|
18
|
+
l.orgId
|
|
17
19
|
],
|
|
18
|
-
queryFn: async ({ pageParam: e }) => await
|
|
19
|
-
enabled: !!
|
|
20
|
+
queryFn: async ({ pageParam: e }) => await i.searchConversations(s, e),
|
|
21
|
+
enabled: !!c && d,
|
|
20
22
|
getNextPageParam: (e) => e.next_page_id,
|
|
21
23
|
initialPageParam: void 0,
|
|
22
|
-
refetchInterval: 3e4,
|
|
23
|
-
|
|
24
|
+
refetchInterval: o(u) ? !1 : 3e4,
|
|
25
|
+
refetchIntervalInBackground: !1,
|
|
26
|
+
meta: { backendId: l.backend.id }
|
|
24
27
|
});
|
|
25
28
|
};
|
|
26
29
|
//#endregion
|
|
27
|
-
export {
|
|
30
|
+
export { s as usePaginatedConversations };
|
|
28
31
|
|
|
29
32
|
//# sourceMappingURL=use-paginated-conversations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-paginated-conversations.js","names":[],"sources":["../../../src/hooks/query/use-paginated-conversations.ts"],"sourcesContent":["import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport AgentServerConversationService from \"#/api/conversation-service/agent-server-conversation-service.api\";\nimport { useIsAuthed } from \"./use-is-authed\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { AppConversationPage } from \"#/api/conversation-service/agent-server-conversation-service.types\";\n\nexport const usePaginatedConversations = (limit: number = 20) => {\n const { data: userIsAuthenticated } = useIsAuthed();\n const active = useActiveBackend();\n const hasBackend = !isNoBackend(active.backend);\n\n return useInfiniteQuery({\n // Include the active backend identity so each (backend, org) pair\n // maintains its own paginated cache. Switching backends naturally\n // produces a new query and a fresh fetch — without it the previous\n // backend's conversations stay visible for staleTime.\n queryKey: [\n \"user\",\n \"conversations\",\n \"paginated\",\n limit,\n active.backend.id,\n active.orgId,\n ],\n queryFn: async ({ pageParam }) => {\n const result = await AgentServerConversationService.searchConversations(\n limit,\n pageParam,\n );\n\n return result;\n },\n enabled: !!userIsAuthenticated && hasBackend,\n getNextPageParam: (lastPage: AppConversationPage) => lastPage.next_page_id,\n initialPageParam: undefined as string | undefined,\n // Poll every 30s so titles, execution status, and timestamps stay fresh\n // without requiring the user to refresh. Each response carries the full\n // conversation objects, so on slow links a tighter interval degrades into\n // a continuous download that starves the rest of the app (including the\n // events WebSocket handshake). Consumers must gate initial-load UI (e.g.\n // skeletons) on `isLoading`, not `isFetching` — `isFetching` flips back to\n // true on every background refetch, which would cause the skeleton to\n // flicker on each poll when the list is empty.\n refetchInterval: 30_000,\n // A successful fetch proves the backend is reachable. The global\n // QueryCache onSuccess handler reads this to clear any persisted\n // failure state, re-arming the status dot without user intervention.\n meta: { backendId: active.backend.id },\n });\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-paginated-conversations.js","names":[],"sources":["../../../src/hooks/query/use-paginated-conversations.ts"],"sourcesContent":["import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport AgentServerConversationService from \"#/api/conversation-service/agent-server-conversation-service.api\";\nimport { useIsAuthed } from \"./use-is-authed\";\nimport { isNoBackend } from \"#/api/backend-registry/active-store\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { isAutomationsRoute } from \"#/manifests/automation-interface\";\nimport { AppConversationPage } from \"#/api/conversation-service/agent-server-conversation-service.types\";\n\nexport const usePaginatedConversations = (limit: number = 20) => {\n const { data: userIsAuthenticated } = useIsAuthed();\n const active = useActiveBackend();\n const { currentPath } = useNavigation();\n const hasBackend = !isNoBackend(active.backend);\n\n return useInfiniteQuery({\n // Include the active backend identity so each (backend, org) pair\n // maintains its own paginated cache. Switching backends naturally\n // produces a new query and a fresh fetch — without it the previous\n // backend's conversations stay visible for staleTime.\n queryKey: [\n \"user\",\n \"conversations\",\n \"paginated\",\n limit,\n active.backend.id,\n active.orgId,\n ],\n queryFn: async ({ pageParam }) => {\n const result = await AgentServerConversationService.searchConversations(\n limit,\n pageParam,\n );\n\n return result;\n },\n enabled: !!userIsAuthenticated && hasBackend,\n getNextPageParam: (lastPage: AppConversationPage) => lastPage.next_page_id,\n initialPageParam: undefined as string | undefined,\n // Poll every 30s so titles, execution status, and timestamps stay fresh\n // without requiring the user to refresh. Each response carries the full\n // conversation objects, so on slow links a tighter interval degrades into\n // a continuous download that starves the rest of the app (including the\n // events WebSocket handshake). Consumers must gate initial-load UI (e.g.\n // skeletons) on `isLoading`, not `isFetching` — `isFetching` flips back to\n // true on every background refetch, which would cause the skeleton to\n // flicker on each poll when the list is empty.\n //\n // The interval is paused on automation routes: the dashboard there already\n // fans out one runs request per automation, and the sidebar list is not\n // the focus. Only the poll pauses — the initial fetch still happens — and\n // mutations that create or cancel runs invalidate [\"user\", \"conversations\"]\n // so the sidebar stays correct while paused.\n refetchInterval: isAutomationsRoute(currentPath) ? false : 30_000,\n refetchIntervalInBackground: false,\n // A successful fetch proves the backend is reachable. The global\n // QueryCache onSuccess handler reads this to clear any persisted\n // failure state, re-arming the status dot without user intervention.\n meta: { backendId: active.backend.id },\n });\n};\n"],"mappings":";;;;;;;;AASA,IAAa,KAA6B,IAAgB,OAAO;CAC/D,IAAM,EAAE,MAAM,MAAwB,EAAY,GAC5C,IAAS,EAAiB,GAC1B,EAAE,mBAAgB,EAAc,GAChC,IAAa,CAAC,EAAY,EAAO,OAAO;CAE9C,OAAO,EAAiB;EAKtB,UAAU;GACR;GACA;GACA;GACA;GACA,EAAO,QAAQ;GACf,EAAO;EACT;EACA,SAAS,OAAO,EAAE,mBAMT,MALc,EAA+B,oBAClD,GACA,CACF;EAIF,SAAS,CAAC,CAAC,KAAuB;EAClC,mBAAmB,MAAkC,EAAS;EAC9D,kBAAkB,KAAA;EAelB,iBAAiB,EAAmB,CAAW,IAAI,KAAQ;EAC3D,6BAA6B;EAI7B,MAAM,EAAE,WAAW,EAAO,QAAQ,GAAG;CACvC,CAAC;AACH"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../../_virtual/_rolldown/runtime.cjs");const e=require("./query-keys.cjs"),t=require("../../node_modules/@tanstack/react-query/build/modern/useQuery.cjs"),n=require("../../contexts/active-backend-context.cjs"),r=require("../../api/provider-connections-service/provider-connections-service.api.cjs");function i(){let{backend:i}=n.useActiveBackend(),
|
|
1
|
+
require("../../_virtual/_rolldown/runtime.cjs");const e=require("./query-keys.cjs"),t=require("../../node_modules/@tanstack/react-query/build/modern/useQuery.cjs"),n=require("../../contexts/active-backend-context.cjs"),r=require("../../api/provider-connections-service/provider-connections-service.api.cjs");function i(){let{backend:i,orgId:a}=n.useActiveBackend(),o=i.kind===`local`,s=i.kind===`cloud`&&!!a,c=o||s;return t.useQuery({queryKey:[...e.PROVIDER_CONNECTIONS_QUERY_KEYS.all,i.id,a],queryFn:r.default.list,...e.CONFIG_CACHE_OPTIONS,enabled:c,meta:{disableToast:!0}})}exports.useProviderConnections=i;
|
|
2
2
|
//# sourceMappingURL=use-provider-connections.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-provider-connections.cjs","names":[],"sources":["../../../src/hooks/query/use-provider-connections.ts"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport ProviderConnectionsService from \"#/api/provider-connections-service/provider-connections-service.api\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport {\n CONFIG_CACHE_OPTIONS,\n PROVIDER_CONNECTIONS_QUERY_KEYS,\n} from \"./query-keys\";\n\nexport { PROVIDER_CONNECTIONS_QUERY_KEYS };\n\n/**\n * Provider connections
|
|
1
|
+
{"version":3,"file":"use-provider-connections.cjs","names":[],"sources":["../../../src/hooks/query/use-provider-connections.ts"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport ProviderConnectionsService from \"#/api/provider-connections-service/provider-connections-service.api\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport {\n CONFIG_CACHE_OPTIONS,\n PROVIDER_CONNECTIONS_QUERY_KEYS,\n} from \"./query-keys\";\n\nexport { PROVIDER_CONNECTIONS_QUERY_KEYS };\n\n/**\n * Provider connections are available on the local agent-server\n * (`/api/llm/provider-connections`) and on cloud when an org is bound\n * (`/api/organizations/{orgId}/provider-connections`). The query is disabled\n * only for a cloud backend without an org (legacy API keys), where the\n * org-scoped route cannot be addressed — there it returns no data so the\n * connections UI hides itself rather than firing an unaddressable request.\n */\nexport function useProviderConnections() {\n const { backend, orgId } = useActiveBackend();\n const isLocal = backend.kind === \"local\";\n const isCloudWithOrg = backend.kind === \"cloud\" && !!orgId;\n const enabled = isLocal || isCloudWithOrg;\n\n return useQuery({\n queryKey: [...PROVIDER_CONNECTIONS_QUERY_KEYS.all, backend.id, orgId],\n queryFn: ProviderConnectionsService.list,\n ...CONFIG_CACHE_OPTIONS,\n enabled,\n meta: { disableToast: true },\n });\n}\n"],"mappings":"oTAkBA,SAAgB,GAAyB,CACvC,GAAM,CAAE,UAAS,SAAU,EAAA,iBAAiB,EACtC,EAAU,EAAQ,OAAS,QAC3B,EAAiB,EAAQ,OAAS,SAAW,CAAC,CAAC,EAC/C,EAAU,GAAW,EAE3B,OAAO,EAAA,SAAS,CACd,SAAU,CAAC,GAAG,EAAA,gCAAgC,IAAK,EAAQ,GAAI,CAAK,EACpE,QAAS,EAAA,QAA2B,KACpC,GAAG,EAAA,qBACH,UACA,KAAM,CAAE,aAAc,EAAK,CAC7B,CAAC,CACH"}
|