@openhands/agent-canvas 1.17.0 → 1.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/README.windows.md +2 -2
- package/build/assets/{acp-providers-DrjNsPOH.js → acp-providers-DcY_mKYa.js} +1 -1
- package/build/assets/active-backend-context-BnH4-L8h.js +2 -0
- package/build/assets/{agent-context-settings-CJUrcBut.js → agent-context-settings-D3peZkjX.js} +1 -1
- package/build/assets/{agent-profiles-service.api-Biieml2L.js → agent-profiles-service.api-DkeZaqIl.js} +1 -1
- package/build/assets/agent-profiles-settings-7yMWYjGF.js +1 -0
- package/build/assets/agent-server-client-options-EHB23gyx.js +1 -0
- package/build/assets/agent-server-config-C_x8Otd9.js +1 -0
- package/build/assets/agent-server-conversation-service.api-jiCopc2E.js +88 -0
- package/build/assets/{agent-settings-CpY3zObk.js → agent-settings-BF8hM6wb.js} +1 -1
- package/build/assets/agent-settings-YPutBAeR.js +1 -0
- package/build/assets/alert-banner-eYyqvHL3.js +1 -0
- package/build/assets/{api-error-message-Ve79qDcN.js → api-error-message-BXo0lCI5.js} +1 -1
- package/build/assets/api-key-entry-screen-CCBvBD8u.js +1 -0
- package/build/assets/app-settings-BtYDs-Be.js +1 -0
- package/build/assets/automation-detail-BxXhb_m2.js +3 -0
- package/build/assets/{automation-export-DxY47m3T.js → automation-export-BJsfi7n2.js} +1 -1
- package/build/assets/automation-git-sync-B7o_Nbl-.js +1 -0
- package/build/assets/automation-setup-route-qaJ6lLCf.js +3 -0
- package/build/assets/{automation-templates-4C4PM8K7.js → automation-templates-Bb98r-kx.js} +1 -1
- package/build/assets/automations-list-DEPVNud3.js +1 -0
- package/build/assets/{back-nav-button-B8tH0BEp.js → back-nav-button-B2yBiVMB.js} +1 -1
- package/build/assets/backend-form-modal-DxisQV_6.js +1 -0
- package/build/assets/backend-synced-settings-badge-DLEp6cq7.js +1 -0
- package/build/assets/badge-ehL-kgeO.js +1 -0
- package/build/assets/{base-modal-DTULovNc.js → base-modal-C1a0TsSx.js} +1 -1
- package/build/assets/{bot-CLMxGFaq.js → bot-ByolqPEr.js} +1 -1
- package/build/assets/{brand-button-DxPO4Lf8.js → brand-button-CUMfjb99.js} +1 -1
- package/build/assets/{browser-C-_qBasq.js → browser-SE24Tk8g.js} +6 -6
- package/build/assets/browser-tab-HjJxHA0V.js +1 -0
- package/build/assets/canvas-extension-page-BsUGBb1T.js +1 -0
- package/build/assets/canvas-extensions-C9Tm6s_E.js +1 -0
- package/build/assets/{canvas-extensions-runtime-DdnkgJXV.js → canvas-extensions-runtime-B8kxM4rO.js} +1 -1
- package/build/assets/{chat-send-button-B3SFSIg5.js → chat-send-button-CGvc2wpE.js} +1 -1
- package/build/assets/check-Bo8s5Ylg.js +1 -0
- package/build/assets/chevron-down-Cr6Fn_wS.js +1 -0
- package/build/assets/chevron-right-CfdfRn-8.js +1 -0
- package/build/assets/circle-check-5pH3qCji.js +1 -0
- package/build/assets/circle-plus-check-toggle-BDX_ctNs.js +1 -0
- package/build/assets/{cloud-funnel-analytics-BQanUEEC.js → cloud-funnel-analytics-D5uJ_4JE.js} +1 -1
- package/build/assets/{cog-VBlRo6iw.js → cog-CAEugqtV.js} +1 -1
- package/build/assets/command-menu-CQxs4mtX.js +1 -0
- package/build/assets/commits-tab-D0xgjipP.js +1 -0
- package/build/assets/{condenser-settings-eVKFMvap.js → condenser-settings-D63NJRBT.js} +1 -1
- package/build/assets/confirmation-modal-78sd9Vny.js +1 -0
- package/build/assets/{context-menu-list-item-DDROe12Z.js → context-menu-list-item-Cm7-7Y-7.js} +1 -1
- package/build/assets/{conversation-BnjJSFf5.js → conversation-B_nweu5p.js} +8 -8
- package/build/assets/conversation-edjzrv5w.js +1 -0
- package/build/assets/conversation-panel-edjzrv5w.js +1 -0
- package/build/assets/conversation-state-store-9D_3P7q4.js +1 -0
- package/build/assets/conversation-store-DC-JlJuq.js +6 -0
- package/build/assets/{conversation-tab-empty-state-DKlzAz5c.js → conversation-tab-empty-state-B3dpJXX0.js} +1 -1
- package/build/assets/copy-to-clipboard-button-B1ljgNxO.js +1 -0
- package/build/assets/device-verify-D5QRIS_x.js +1 -0
- package/build/assets/{dropdown-classes-B9kJVDIk.js → dropdown-classes-BGvOvW2_.js} +1 -1
- package/build/assets/edit-automation-modal-D_JWSmxT.js +1 -0
- package/build/assets/empty-state-FK_s1B60.js +1 -0
- package/build/assets/{entry.client-Ds8LVp-E.js → entry.client-BMafTpjO.js} +2 -2
- package/build/assets/enum-filter-dropdown-UNaom12H.js +1 -0
- package/build/assets/environment-switch-overlay-COibRUA-.js +1 -0
- package/build/assets/error-state-Cf8LRuuY.js +1 -0
- package/build/assets/extensions-hub-C_6ahIua.js +1 -0
- package/build/assets/extensions-navigation-C5GfpzFe.js +1 -0
- package/build/assets/{external-link-DQtv7eTh.js → external-link-Bd7Tga-1.js} +1 -1
- package/build/assets/files-tab-D5PPIWI1.js +1 -0
- package/build/assets/{form-control-classes-B-z85REi.js → form-control-classes-Dbq-7YP_.js} +1 -1
- package/build/assets/format-model-name-Dfh9Udrx.js +1 -0
- package/build/assets/get-git-path-jU2zjqIB.js +1 -0
- package/build/assets/git-repo-dropdown-BoDDWXfX.js +1 -0
- package/build/assets/git-repo-dropdown-uxlFw2gn.js +1 -0
- package/build/assets/highlighted-source-view-C7pAXrT0.js +1 -0
- package/build/assets/home-BM5_Wz_R.js +1 -0
- package/build/assets/home-Ivfm7KC4.js +1 -0
- package/build/assets/home-automation-run-tooltip-B1N2uO9p.js +1 -0
- package/build/assets/home-store-DCbei3DX.js +1 -0
- package/build/assets/hooks-service-Dnmhqc0Z.js +1 -0
- package/build/assets/index-home-td9BN2T3.js +1 -0
- package/build/assets/info-BcajzHn1.js +1 -0
- package/build/assets/install-server-modal-B81I-5OE.js +1 -0
- package/build/assets/kebab-menu-item-content-SCJBwZnp.js +1 -0
- package/build/assets/{key-CfXbJa8w.js → key-O84CMFHb.js} +1 -1
- package/build/assets/launch-ZLxI4opd.js +1 -0
- package/build/assets/list-filter-B8PQk3RA.js +1 -0
- package/build/assets/{list-todo-ByXMdY4W.js → list-todo-Caa8E1X_.js} +1 -1
- package/build/assets/llm-not-configured-banner-Dh_ajcM8.js +27 -0
- package/build/assets/llm-settings-CODhjQzy.js +1 -0
- package/build/assets/llm-settings-CZaXYgtw.js +1 -0
- package/build/assets/{llm-subscription-service-aDNBQ7Gq.js → llm-subscription-service-CgIDc38n.js} +1 -1
- package/build/assets/loader-circle-BxJgk73D.js +1 -0
- package/build/assets/{loading-spinner-DfHI77BA.js → loading-spinner-BeLV0IXf.js} +1 -1
- package/build/assets/manage-backends-modal-cMXqCb-B.js +1 -0
- package/build/assets/manifest-bfeccb98.js +1 -0
- package/build/assets/manifest-subpage-layout-CVZgVKoY.js +1 -0
- package/build/assets/{map-provider-DXvssjw9.js → map-provider-iRs80q_6.js} +1 -1
- package/build/assets/markdown-renderer-DyFl9-mL.js +8 -0
- package/build/assets/mcp-CraxoXQv.js +1 -0
- package/build/assets/{mcp-marketplace-utils-Cn_NIMWM.js → mcp-marketplace-utils-C7PYr293.js} +1 -1
- package/build/assets/mcp-page-CteH_K0N.js +9 -0
- package/build/assets/messages-Bk1xhbU2.js +41 -0
- package/build/assets/{modal-body-DJw4xBki.js → modal-body-C24WsdFb.js} +1 -1
- package/build/assets/{modal-classes-Dg0ngBPO.js → modal-classes-B0b9eiL8.js} +1 -1
- package/build/assets/modal-close-button-DfqfB2Nj.js +1 -0
- package/build/assets/{mouse-pointer-click-DEhsSUpu.js → mouse-pointer-click-BXlRN92t.js} +1 -1
- package/build/assets/onboarding-DXFBRqEy.js +1 -0
- package/build/assets/onboarding-modal-BT3Gx_sZ.js +1 -0
- package/build/assets/{organization-service.api-Cyg1Tn03.js → organization-service.api-B5CvmnYQ.js} +1 -1
- package/build/assets/{pencil-D5c47kyN.js → pencil-q-ihqDYv.js} +1 -1
- package/build/assets/{pin-C7vMagvf.js → pin-BdroVQdN.js} +1 -1
- package/build/assets/planner-tab-CstoOlAB.js +1 -0
- package/build/assets/{plug-CeaqeF6u.js → plug-7ACOEbMs.js} +1 -1
- package/build/assets/{plugins-management-service-Bh_pBuf-.js → plugins-management-service-5rqVPEGN.js} +1 -1
- package/build/assets/plus-C2e21TFC.js +1 -0
- package/build/assets/{profiles-service.api-BbOK0EkF.js → profiles-service.api-D1XKMgr0.js} +1 -1
- package/build/assets/providers-XmZ9HM4Q.js +1 -0
- package/build/assets/proxy-XP6U1Dhv.js +1 -0
- package/build/assets/{puzzle-DdAqbUrb.js → puzzle-LJYnuxKe.js} +1 -1
- package/build/assets/react-BX7IV650.js +1 -0
- package/build/assets/recommended-automations-launcher-DEHRKIAg.js +1 -0
- package/build/assets/{refresh-cw-DEQdPCpH.js → refresh-cw-BtdC3T8P.js} +1 -1
- package/build/assets/root-CM6IZHlg.css +1 -0
- package/build/assets/root-DdFkodKW.js +2 -0
- package/build/assets/root-layout-DUquNZTU.js +2 -0
- package/build/assets/schema-field-Y3F8JvXd.js +1 -0
- package/build/assets/sdk-section-page-CNZTLwH9.js +1 -0
- package/build/assets/secret-form-9-BoGA40.js +1 -0
- package/build/assets/{secrets-service-Cr8g8xuv.js → secrets-service-BOIsfD9j.js} +1 -1
- package/build/assets/secrets-settings-CBJgFr42.js +1 -0
- package/build/assets/settings-D4hdToD4.js +1 -0
- package/build/assets/settings-dropdown-input-DBvsZ7-Q.js +1 -0
- package/build/assets/settings-index-DeQphyBK.js +1 -0
- package/build/assets/settings-input-dVuzapBA.js +1 -0
- package/build/assets/{settings-list-classes-Ds4jPBHK.js → settings-list-classes-DhAPuXm6.js} +1 -1
- package/build/assets/settings-modal-tHiJ8iYV.js +1 -0
- package/build/assets/settings-nav-GAQjW1a-.js +16 -0
- package/build/assets/{settings-service.api-9_xdv_mh.js → settings-service.api-C1vZH9Vh.js} +1 -1
- package/build/assets/settings-switch-DDd1cQ8t.js +1 -0
- package/build/assets/{settings-utils-8GIIgOQL.js → settings-utils-BTaaRhLZ.js} +1 -1
- package/build/assets/shared-conversation-Cyg7m7ns.js +1 -0
- package/build/assets/{shield-check-DO7wa_eu.js → shield-check-C3Rl0NF8.js} +1 -1
- package/build/assets/{sidebar-layout-EPfWxk11.js → sidebar-layout-DH0E-5KW.js} +1 -1
- package/build/assets/sidebar-mobile-menu-toggle-CQ4iky__.js +1 -0
- package/build/assets/{sidebar-nav-link-_t4_Ef-9.js → sidebar-nav-link-oLQiKUBu.js} +1 -1
- package/build/assets/{sidebar-onboarding-checklist-storage-DbDX-Wvj.js → sidebar-onboarding-checklist-storage-TfvNNnnr.js} +1 -1
- package/build/assets/sidebar-store-DAZVH-DR.js +1 -0
- package/build/assets/skill-card-pill-row-DfjIfj0K.js +1 -0
- package/build/assets/{skill-filter-BBeZ4JEP.js → skill-filter-DsNLmn76.js} +2 -2
- package/build/assets/{skill-icon-badge-BDhQ-tQ0.js → skill-icon-badge-0MK_68Nc.js} +1 -1
- package/build/assets/skill-scope-BE-H9TSZ.js +1 -0
- package/build/assets/skills-plugins-vzSdxSk_.js +1 -0
- package/build/assets/skills-settings-BiPOH9H9.js +1 -0
- package/build/assets/{styled-tooltip-Pd22BIvr.js → styled-tooltip-CejG0rqv.js} +1 -1
- package/build/assets/task-list-tab-OkZSqnTp.js +1 -0
- package/build/assets/{terminal-onXx0_Qz.js → terminal-Dph60VFZ.js} +1 -1
- package/build/assets/{toggle-switch-lwQtxDcm.js → toggle-switch-B2uXaAUS.js} +1 -1
- package/build/assets/{trash-2-ZhKuTLiz.js → trash-2-Bb40zQzs.js} +1 -1
- package/build/assets/trash-Ckh7yCaB.js +1 -0
- package/build/assets/{triangle-alert-BajLPpQg.js → triangle-alert-DEdu-b_L.js} +1 -1
- package/build/assets/{typography-HLLg_FAn.js → typography-DgcLGdHk.js} +1 -1
- package/build/assets/usage-tab-MCmNRAnR.js +1 -0
- package/build/assets/use-acp-credential-form-ychoGqjC.js +1 -0
- package/build/assets/{use-activate-agent-profile-BLKML6vQ.js → use-activate-agent-profile-8L8Xdghy.js} +1 -1
- package/build/assets/use-agent-profiles-Bi8hSkze.js +1 -0
- package/build/assets/{use-automation-health-BZkQNEA8.js → use-automation-health-U99vvHxx.js} +1 -1
- package/build/assets/{use-automation-permissions-B_RpvL-s.js → use-automation-permissions-Buus0R6h.js} +1 -1
- package/build/assets/{use-automations-Cg0PDIZr.js → use-automations-Bq5hVuv0.js} +1 -1
- package/build/assets/{use-can-manage-org-profiles-BbN6KfDr.js → use-can-manage-org-profiles-MzIeEV8F.js} +1 -1
- package/build/assets/{use-canvas-extensions-CFUpHat6.js → use-canvas-extensions-Ca9KoVEm.js} +1 -1
- package/build/assets/{use-cloud-current-user-id-Dk0rjr63.js → use-cloud-current-user-id-B4ZLUZSa.js} +1 -1
- package/build/assets/{use-config-DpafU_QP.js → use-config-l5tkDHyD.js} +1 -1
- package/build/assets/{use-create-conversation-1YgmAHt-.js → use-create-conversation-i_PdFdIs.js} +1 -1
- package/build/assets/use-create-secret-CjWq0J4O.js +1 -0
- package/build/assets/use-free-models-gCsJ5BV0.js +1 -0
- package/build/assets/{use-get-secrets-CQ4b0qK8.js → use-get-secrets-CMTuWEp_.js} +1 -1
- package/build/assets/use-is-authed-A2Yinlt0.js +1 -0
- package/build/assets/{use-launch-skill-in-chat-DeYa1tFM.js → use-launch-skill-in-chat-QbXDhiHr.js} +1 -1
- package/build/assets/use-llm-configured-Dl4zg8ht.js +1 -0
- package/build/assets/use-llm-profiles-SWsuFmFu.js +1 -0
- package/build/assets/{use-manifest-capabilities-AOWGcu0j.js → use-manifest-capabilities-CdqYfUAC.js} +1 -1
- package/build/assets/{use-onboarding-completion-CoINurkm.js → use-onboarding-completion-Xl63ZvzQ.js} +1 -1
- package/build/assets/{use-pinned-home-route-D6krwXjy.js → use-pinned-home-route-BXDIUaxQ.js} +1 -1
- package/build/assets/{use-plugins-marketplace-mLsIDhBv.js → use-plugins-marketplace-BIIaPiaB.js} +1 -1
- package/build/assets/use-save-agent-profile-D-ZHHE94.js +1 -0
- package/build/assets/{use-save-settings-3U5K9-8x.js → use-save-settings-Dapkf4cC.js} +1 -1
- package/build/assets/{use-settings-Dn00UISA.js → use-settings-C2KKQKVC.js} +1 -1
- package/build/assets/use-settings-nav-items-TOc0Rsfd.js +1 -0
- package/build/assets/{use-tracking-B9prBsrq.js → use-tracking-j4uo9VEW.js} +1 -1
- package/build/assets/{use-user-conversation-ZWlXtbZb.js → use-user-conversation-5UFqMoO4.js} +1 -1
- package/build/assets/{useInfiniteQuery-BzrRqjLg.js → useInfiniteQuery-CtSRG7uW.js} +1 -1
- package/build/assets/{useMutation-CJuK90oc.js → useMutation-Cszf8mKy.js} +1 -1
- package/build/assets/useQueries-pUohFMSP.js +1 -0
- package/build/assets/useQuery-DAAacS7O.js +1 -0
- package/build/assets/useTranslation-CCgUjPJF.js +1 -0
- package/build/assets/utils-BgLSZdyy.js +1 -0
- package/build/assets/{vendor~conversation-panel~conversation-4eJ0tml3.js → vendor~conversation-panel~conversation-C22sJuWZ.js} +1 -1
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BXXGJNDU.js +185 -0
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-40UR63Gt.js +1 -0
- package/build/assets/{vendor~index-home~home~conversation-panel~conversation-CSFLzmTN.js → vendor~index-home~home~conversation-panel~conversation-UTl7gUo9.js} +1 -1
- package/build/assets/{vendor~root-layout-n8XCEXG8.js → vendor~root-layout-CcdIqs-C.js} +1 -1
- package/build/assets/{vendor~root-layout~conversation-panel~conversation-3Idg1_U3.js → vendor~root-layout~conversation-panel~conversation-C3EBV3kp.js} +1 -1
- package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-BCe0JJVy.js +1 -0
- package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation-DgQ564nC.js → vendor~root-layout~index-home~home~conversation-panel~conversation-BGGbPcYh.js} +1 -1
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-BPjI-atc.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-3eJ4ExtV.js} +1 -1
- package/build/assets/{verification-settings-u2POabjH.js → verification-settings-DdBpaVPz.js} +1 -1
- package/build/assets/{wrench-CkgI4rxA.js → wrench-B8Wg_nbp.js} +1 -1
- package/build/assets/{x-By6qCmtY.js → x-CX8lVGwm.js} +1 -1
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +6 -2
- package/build/locales/ca/openhands.json +6 -2
- package/build/locales/de/openhands.json +6 -2
- package/build/locales/en/openhands.json +6 -2
- package/build/locales/es/openhands.json +6 -2
- package/build/locales/fr/openhands.json +6 -2
- package/build/locales/it/openhands.json +6 -2
- package/build/locales/ja/openhands.json +6 -2
- package/build/locales/ko-KR/openhands.json +6 -2
- package/build/locales/no/openhands.json +6 -2
- package/build/locales/pt/openhands.json +6 -2
- package/build/locales/tr/openhands.json +6 -2
- package/build/locales/uk/openhands.json +6 -2
- package/build/locales/zh-CN/openhands.json +6 -2
- package/build/locales/zh-TW/openhands.json +6 -2
- package/config/defaults.json +1 -1
- package/dist/api/cloud/organization-service.api.cjs.map +1 -1
- package/dist/api/cloud/organization-service.api.d.ts +9 -1
- package/dist/api/cloud/organization-service.api.js.map +1 -1
- package/dist/api/config-service/config-service.api.cjs +1 -1
- package/dist/api/config-service/config-service.api.cjs.map +1 -1
- package/dist/api/config-service/config-service.api.js +6 -2
- package/dist/api/config-service/config-service.api.js.map +1 -1
- package/dist/api/config-service/config-service.types.d.ts +13 -0
- 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 +39 -38
- 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 +73 -72
- package/dist/components/features/automations/automation-list-row.js.map +1 -1
- package/dist/components/features/automations/build-automation-menu-items.cjs +1 -1
- package/dist/components/features/automations/build-automation-menu-items.cjs.map +1 -1
- package/dist/components/features/automations/build-automation-menu-items.d.ts +3 -1
- package/dist/components/features/automations/build-automation-menu-items.js +12 -11
- package/dist/components/features/automations/build-automation-menu-items.js.map +1 -1
- package/dist/components/features/automations/detail/configuration-section.d.ts +7 -1
- package/dist/components/features/automations/detail/detail-header.d.ts +8 -5
- 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 +112 -112
- package/dist/components/features/backends/backend-selector.js.map +1 -1
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs.map +1 -1
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.js +62 -61
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.js.map +1 -1
- package/dist/components/features/chat/model-messages.cjs +1 -1
- package/dist/components/features/chat/model-messages.cjs.map +1 -1
- package/dist/components/features/chat/model-messages.js +27 -26
- package/dist/components/features/chat/model-messages.js.map +1 -1
- package/dist/components/features/conversation-panel/budget-display.cjs +1 -1
- package/dist/components/features/conversation-panel/budget-display.cjs.map +1 -1
- package/dist/components/features/conversation-panel/budget-display.d.ts +1 -2
- package/dist/components/features/conversation-panel/budget-display.js +12 -19
- package/dist/components/features/conversation-panel/budget-display.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +45 -44
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
- package/dist/components/features/home/featured-automations/build-home-automation-menu-items.d.ts +1 -2
- package/dist/components/features/home/featured-automations/build-pinned-automation-menu-items.d.ts +0 -1
- package/dist/components/features/images/image-lightbox.cjs +2 -0
- package/dist/components/features/images/image-lightbox.cjs.map +1 -0
- package/dist/components/features/images/image-lightbox.d.ts +11 -0
- package/dist/components/features/images/image-lightbox.js +37 -0
- package/dist/components/features/images/image-lightbox.js.map +1 -0
- package/dist/components/features/images/image-preview.cjs +1 -1
- package/dist/components/features/images/image-preview.cjs.map +1 -1
- package/dist/components/features/images/image-preview.d.ts +2 -1
- package/dist/components/features/images/image-preview.js +33 -13
- package/dist/components/features/images/image-preview.js.map +1 -1
- package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +3 -4
- 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.d.ts +3 -1
- package/dist/components/features/settings/cloud-settings-link.js +22 -21
- package/dist/components/features/settings/cloud-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/profile-row.cjs +1 -1
- package/dist/components/features/settings/llm-profiles/profile-row.js +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 +2 -1
- package/dist/components/features/sidebar/sidebar-rail-body.js +143 -142
- 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 +28 -27
- package/dist/components/features/sidebar/sidebar.js.map +1 -1
- package/dist/components/providers/agent-server-ui-providers.cjs +1 -1
- package/dist/components/providers/agent-server-ui-providers.cjs.map +1 -1
- package/dist/components/providers/agent-server-ui-providers.js +33 -29
- package/dist/components/providers/agent-server-ui-providers.js.map +1 -1
- package/dist/components/shared/buttons/remove-button.cjs +1 -1
- package/dist/components/shared/buttons/remove-button.cjs.map +1 -1
- package/dist/components/shared/buttons/remove-button.d.ts +2 -1
- package/dist/components/shared/buttons/remove-button.js +2 -1
- package/dist/components/shared/buttons/remove-button.js.map +1 -1
- package/dist/components/shared/free-models-note.cjs +2 -0
- package/dist/components/shared/free-models-note.cjs.map +1 -0
- package/dist/components/shared/free-models-note.d.ts +3 -0
- package/dist/components/shared/free-models-note.js +20 -0
- package/dist/components/shared/free-models-note.js.map +1 -0
- package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
- package/dist/components/shared/modals/settings/model-selector.cjs.map +1 -1
- package/dist/components/shared/modals/settings/model-selector.js +102 -112
- package/dist/components/shared/modals/settings/model-selector.js.map +1 -1
- package/dist/config/defaults.cjs +1 -1
- package/dist/config/defaults.cjs.map +1 -1
- package/dist/config/defaults.js +1 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/constants/acp-providers.cjs.map +1 -1
- package/dist/constants/acp-providers.d.ts +12 -0
- package/dist/constants/acp-providers.js.map +1 -1
- package/dist/hooks/chat/use-slash-command.cjs +1 -1
- package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
- package/dist/hooks/chat/use-slash-command.js +63 -62
- package/dist/hooks/chat/use-slash-command.js.map +1 -1
- package/dist/hooks/query/use-free-models.cjs +2 -0
- package/dist/hooks/query/use-free-models.cjs.map +1 -0
- package/dist/hooks/query/use-free-models.d.ts +23 -0
- package/dist/hooks/query/use-free-models.js +67 -0
- package/dist/hooks/query/use-free-models.js.map +1 -0
- package/dist/hooks/query/use-local-git-info.cjs.map +1 -1
- package/dist/hooks/query/use-local-git-info.js.map +1 -1
- package/dist/hooks/query/use-provider-models.cjs +1 -1
- package/dist/hooks/query/use-provider-models.cjs.map +1 -1
- package/dist/hooks/query/use-provider-models.js +34 -25
- package/dist/hooks/query/use-provider-models.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 +31 -19
- package/dist/hooks/query/use-search-providers.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.d.ts +1 -2
- package/dist/hooks/use-home-automation-actions.js +0 -1
- package/dist/hooks/use-home-automation-actions.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 +6 -2
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/translation.cjs +2 -2
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +85 -17
- package/dist/i18n/translation.js.map +1 -1
- package/dist/locales/ar/openhands.json +6 -2
- package/dist/locales/ca/openhands.json +6 -2
- package/dist/locales/de/openhands.json +6 -2
- package/dist/locales/en/openhands.json +6 -2
- package/dist/locales/es/openhands.json +6 -2
- package/dist/locales/fr/openhands.json +6 -2
- package/dist/locales/it/openhands.json +6 -2
- package/dist/locales/ja/openhands.json +6 -2
- package/dist/locales/ko-KR/openhands.json +6 -2
- package/dist/locales/no/openhands.json +6 -2
- package/dist/locales/pt/openhands.json +6 -2
- package/dist/locales/tr/openhands.json +6 -2
- package/dist/locales/uk/openhands.json +6 -2
- package/dist/locales/zh-CN/openhands.json +6 -2
- package/dist/locales/zh-TW/openhands.json +6 -2
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/dist/routes/app-settings.cjs +1 -1
- package/dist/routes/app-settings.cjs.map +1 -1
- package/dist/routes/app-settings.js +52 -47
- package/dist/routes/app-settings.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.js +137 -145
- package/dist/routes/llm-settings.js.map +1 -1
- package/dist/stores/free-models-store.cjs +2 -0
- package/dist/stores/free-models-store.cjs.map +1 -0
- package/dist/stores/free-models-store.d.ts +30 -0
- package/dist/stores/free-models-store.js +22 -0
- package/dist/stores/free-models-store.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 +27 -6
- package/dist/utils/format-model-name.js +14 -6
- package/dist/utils/format-model-name.js.map +1 -1
- package/package.json +1 -1
- package/build/assets/active-backend-context-rZiLJRUc.js +0 -2
- package/build/assets/agent-profiles-settings-x6RvPsq7.js +0 -1
- package/build/assets/agent-server-client-options-BikiNwTa.js +0 -1
- package/build/assets/agent-server-conversation-service.api-DYFsNHKf.js +0 -88
- package/build/assets/agent-settings-BJyovpJ_.js +0 -1
- package/build/assets/alert-banner-vARz1idS.js +0 -1
- package/build/assets/api-key-entry-screen-CsMuBhoP.js +0 -1
- package/build/assets/app-settings-BaJ7nfHt.js +0 -1
- package/build/assets/automation-detail-CVoGDrKq.js +0 -3
- package/build/assets/automation-git-sync-CRMP9Bbm.js +0 -1
- package/build/assets/automation-setup-route-072beLz1.js +0 -3
- package/build/assets/automations-list-xuqTSQL4.js +0 -1
- package/build/assets/backend-form-modal-0aJmWdsa.js +0 -1
- package/build/assets/backend-synced-settings-badge-B7rKWBir.js +0 -1
- package/build/assets/badge-CcGx2TaV.js +0 -1
- package/build/assets/browser-tab-DZanIw5m.js +0 -1
- package/build/assets/canvas-extension-page-o_cWgE9B.js +0 -1
- package/build/assets/canvas-extensions-DSgNlCha.js +0 -1
- package/build/assets/check-fDEfgSzj.js +0 -1
- package/build/assets/chevron-down-CFrWHqu8.js +0 -1
- package/build/assets/chevron-right-C5roOrJu.js +0 -1
- package/build/assets/circle-check-ClTzJTdb.js +0 -1
- package/build/assets/circle-plus-check-toggle-Fr-h-mbL.js +0 -1
- package/build/assets/command-menu-BT3Ia5Ru.js +0 -1
- package/build/assets/commits-tab-2jhtaohl.js +0 -1
- package/build/assets/confirmation-modal-gIFHeZt6.js +0 -1
- package/build/assets/conversation-DZ578rOX.js +0 -1
- package/build/assets/conversation-panel-DZ578rOX.js +0 -1
- package/build/assets/conversation-state-store-D1_G_9I-.js +0 -1
- package/build/assets/conversation-store-DVVfkCsk.js +0 -6
- package/build/assets/copy-to-clipboard-button-B3w0X7WH.js +0 -1
- package/build/assets/device-verify-BfkCzyFB.js +0 -1
- package/build/assets/edit-automation-modal-BwhJ39JT.js +0 -1
- package/build/assets/empty-state-RZz0OfnY.js +0 -1
- package/build/assets/enum-filter-dropdown-C4pW0ORd.js +0 -1
- package/build/assets/environment-switch-overlay-P2ZAuzov.js +0 -1
- package/build/assets/error-state-B_5cgNPJ.js +0 -1
- package/build/assets/extensions-hub-DsaUr4ca.js +0 -1
- package/build/assets/extensions-navigation-CRMZd-FE.js +0 -1
- package/build/assets/files-tab-CCgAcVdc.js +0 -1
- package/build/assets/format-model-name-CasAP3nd.js +0 -1
- package/build/assets/get-git-path-EHrSDxTM.js +0 -1
- package/build/assets/git-repo-dropdown-D2WEQ97X.js +0 -1
- package/build/assets/git-repo-dropdown-DVeCUUXG.js +0 -1
- package/build/assets/highlighted-source-view-DjHO3SdW.js +0 -1
- package/build/assets/home-BorS_vdS.js +0 -1
- package/build/assets/home-aIMbHw5M.js +0 -1
- package/build/assets/home-automation-run-tooltip-CpHNFiFl.js +0 -1
- package/build/assets/home-store-DyXz0w6d.js +0 -1
- package/build/assets/hooks-service-C6dpRtZM.js +0 -1
- package/build/assets/index-home-zKFuKK2B.js +0 -1
- package/build/assets/info-CTIdjttz.js +0 -1
- package/build/assets/install-server-modal-DUiZMc8u.js +0 -1
- package/build/assets/kebab-menu-item-content-mm04SBD3.js +0 -1
- package/build/assets/launch-BSIf9KEg.js +0 -1
- package/build/assets/list-filter-CNpqTWVY.js +0 -1
- package/build/assets/llm-not-configured-banner-z_QRSeV0.js +0 -27
- package/build/assets/llm-settings-B-5AHMiX.js +0 -1
- package/build/assets/llm-settings-B3SjHDmA.js +0 -1
- package/build/assets/loader-circle-Dex47vVW.js +0 -1
- package/build/assets/manage-backends-modal-q1NdFisr.js +0 -1
- package/build/assets/manifest-8920b615.js +0 -1
- package/build/assets/manifest-subpage-layout-BQQy5ipR.js +0 -1
- package/build/assets/markdown-renderer-rivLvYh-.js +0 -8
- package/build/assets/mcp-CEXDhQWn.js +0 -1
- package/build/assets/mcp-page-LGYIICMG.js +0 -9
- package/build/assets/messages-DUSeANAh.js +0 -41
- package/build/assets/modal-close-button-B9j4nasm.js +0 -1
- package/build/assets/onboarding-BjFebfs5.js +0 -1
- package/build/assets/onboarding-modal-DDTjOpyd.js +0 -1
- package/build/assets/planner-tab-D8f2Y3rn.js +0 -1
- package/build/assets/plus-B3wvU06-.js +0 -1
- package/build/assets/providers-2gIIkz2N.js +0 -1
- package/build/assets/proxy-CBgMd2zf.js +0 -1
- package/build/assets/recommended-automations-launcher-YLAQTp4s.js +0 -1
- package/build/assets/root-Bye_XmEL.js +0 -2
- package/build/assets/root-Cnwwzgo0.css +0 -1
- package/build/assets/root-layout-CSAwxBGM.js +0 -2
- package/build/assets/schema-field-CK0xYNbO.js +0 -1
- package/build/assets/sdk-section-page-Da73Rs_o.js +0 -1
- package/build/assets/secret-form-CB2VwYYg.js +0 -1
- package/build/assets/secrets-settings-Bh0udeKv.js +0 -1
- package/build/assets/settings-DmyIgRxO.js +0 -1
- package/build/assets/settings-dropdown-input-DVpyD87C.js +0 -1
- package/build/assets/settings-index-BSJUFmjE.js +0 -1
- package/build/assets/settings-input-C0dd8Utu.js +0 -1
- package/build/assets/settings-modal-yStgEh2o.js +0 -1
- package/build/assets/settings-switch-B78Khmyz.js +0 -1
- package/build/assets/shared-conversation-DM96X4KV.js +0 -1
- package/build/assets/sidebar-mobile-menu-toggle-D5GR5xT9.js +0 -1
- package/build/assets/sidebar-store-CSDFK0W5.js +0 -1
- package/build/assets/skill-card-pill-row-989y15jV.js +0 -1
- package/build/assets/skill-scope-Dz3kPH3P.js +0 -1
- package/build/assets/skills-plugins-e3CYGdUJ.js +0 -1
- package/build/assets/skills-settings-3e-FuHw_.js +0 -1
- package/build/assets/task-list-tab-3Jg8ywch.js +0 -1
- package/build/assets/trash-B6OIe4yX.js +0 -1
- package/build/assets/usage-tab-Cm-9j3UK.js +0 -1
- package/build/assets/use-acp-credential-form-BARcvjYE.js +0 -1
- package/build/assets/use-agent-profiles-1P91KSXz.js +0 -1
- package/build/assets/use-create-secret-D8p9ybQj.js +0 -1
- package/build/assets/use-is-authed-BRPjCRKM.js +0 -1
- package/build/assets/use-llm-configured-DGm8FiRR.js +0 -1
- package/build/assets/use-llm-profiles-BTTtpW4z.js +0 -1
- package/build/assets/use-save-agent-profile-CxyO9YG-.js +0 -1
- package/build/assets/use-settings-nav-items-vrjxTqcu.js +0 -16
- package/build/assets/useQueries-CykmpT-a.js +0 -1
- package/build/assets/useQuery-S6j94er1.js +0 -1
- package/build/assets/utils-BOco8mxR.js +0 -1
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BfkNGovw.js +0 -185
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-DnDoaYNi.js +0 -1
- package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-DkPlXWl9.js +0 -1
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-CV850oio.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidebar.cjs","names":[],"sources":["../../../../src/components/features/sidebar/sidebar.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { SidebarRailBody } from \"./sidebar-rail-body\";\nimport { getErrorStatus, useSettings } from \"#/hooks/query/use-settings\";\nimport { useConfig } from \"#/hooks/query/use-config\";\nimport { displayErrorToast } from \"#/utils/custom-toast-handlers\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { cn } from \"#/utils/utils\";\nimport { useSidebarMobileNav } from \"./sidebar-mobile-nav-context\";\nimport { useSidebarStore } from \"#/stores/sidebar-store\";\nimport { useClickOutsideElement } from \"#/hooks/use-click-outside-element\";\nimport { useBackendsHealth } from \"#/hooks/query/use-backends-health\";\n// The LLM settings modal is only mounted when the settings query 404s and\n// LLM settings aren't hidden — keep it out of the sidebar's eager graph.\nconst SettingsModal = React.lazy(() =>\n import(\"#/components/shared/modals/settings/settings-modal\").then((m) => ({\n default: m.SettingsModal,\n })),\n);\n\n// Add/Manage backend modals are lifted into the sidebar (instead of living\n// inside BackendSelector) so they survive the collapsed popover unmounting\n// when the user moves the cursor out of the popover toward the modal.\nconst AddBackendModal = React.lazy(() =>\n import(\"#/components/features/backends/add-backend-modal\").then((m) => ({\n default: m.AddBackendModal,\n })),\n);\nconst ManageBackendsModal = React.lazy(() =>\n import(\"#/components/features/backends/manage-backends-modal\").then((m) => ({\n default: m.ManageBackendsModal,\n })),\n);\n\nconst MOBILE_DRAWER_TRANSITION_MS = 250;\n\nexport function Sidebar() {\n const { t } = useTranslation(\"openhands\");\n const { currentPath } = useNavigation();\n const { data: config } = useConfig();\n const {\n data: settings,\n error: settingsError,\n isError: settingsIsError,\n isFetching: isFetchingSettings,\n } = useSettings();\n const { backends, active } = useActiveBackendContext();\n const healthByBackendId = useBackendsHealth(backends);\n const activeBackendHealth = healthByBackendId[active.backend.id];\n const collapsed = useSidebarStore((state) => state.collapsed);\n const setCollapsed = useSidebarStore((state) => state.setCollapsed);\n const [settingsModalIsOpen, setSettingsModalIsOpen] = React.useState(false);\n const [collapsedBackendPopoverOpen, setCollapsedBackendPopoverOpen] =\n React.useState(false);\n const collapsedBackendCloseTimer = React.useRef<ReturnType<\n typeof setTimeout\n > | null>(null);\n // Lifted out of BackendSelector so opening these modals from the\n // collapsed-sidebar popover doesn't lose state when the popover unmounts\n // (cursor moving toward the modal triggers onMouseLeave -> close).\n const [addBackendModalOpen, setAddBackendModalOpen] = React.useState(false);\n const [manageBackendsModalOpen, setManageBackendsModalOpen] =\n React.useState(false);\n const [collapsedRailHovered, setCollapsedRailHovered] = React.useState(false);\n const suppressCollapsedExpandRef = React.useRef(false);\n const [, refreshCollapsedExpandGate] = React.useReducer((n) => n + 1, 0);\n const { isOpen: isMobileNavOpen, close: closeMobileNav } =\n useSidebarMobileNav();\n const [mobileDrawerMounted, setMobileDrawerMounted] = React.useState(false);\n const [mobileDrawerVisible, setMobileDrawerVisible] = React.useState(false);\n const collapsedBackendPopoverRef = useClickOutsideElement<HTMLDivElement>(\n () => setCollapsedBackendPopoverOpen(false),\n );\n const settingsErrorStatus = getErrorStatus(settingsError);\n\n React.useEffect(() => {\n closeMobileNav();\n }, [currentPath, closeMobileNav]);\n\n React.useEffect(() => {\n if (isMobileNavOpen) {\n setMobileDrawerMounted(true);\n const frame = requestAnimationFrame(() => {\n setMobileDrawerVisible(true);\n });\n return () => cancelAnimationFrame(frame);\n }\n\n setMobileDrawerVisible(false);\n const timer = window.setTimeout(() => {\n setMobileDrawerMounted(false);\n }, MOBILE_DRAWER_TRANSITION_MS);\n return () => window.clearTimeout(timer);\n }, [isMobileNavOpen]);\n\n React.useEffect(() => {\n if (!isMobileNavOpen) {\n return undefined;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n closeMobileNav();\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [isMobileNavOpen, closeMobileNav]);\n\n React.useEffect(() => {\n if (currentPath === \"/settings\") {\n setSettingsModalIsOpen(false);\n } else if (\n !isFetchingSettings &&\n settingsIsError &&\n settingsErrorStatus !== 404\n ) {\n // We don't show toast errors for settings in the global error handler\n // because we have a special case for 404 errors\n displayErrorToast(t(I18nKey.SETTINGS$FETCH_ERROR));\n } else if (\n settingsErrorStatus === 404 &&\n !config?.feature_flags?.hide_llm_settings\n ) {\n setSettingsModalIsOpen(true);\n }\n }, [\n currentPath,\n isFetchingSettings,\n settingsIsError,\n settingsErrorStatus,\n config?.feature_flags?.hide_llm_settings,\n t,\n ]);\n\n const collapseToggleLabel = t(\n collapsed ? I18nKey.SIDEBAR$EXPAND : I18nKey.SIDEBAR$COLLAPSE,\n );\n const handleCollapsedRailClick = React.useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n if (!collapsed) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n // Keep existing behavior for explicit controls/links and only use\n // this as a convenience hit-area for empty collapsed-rail space.\n if (\n target.closest(\n \"a,button,input,textarea,select,[role='button'],[role='link']\",\n )\n ) {\n return;\n }\n\n setCollapsed(false);\n },\n [collapsed, setCollapsed],\n );\n const handleCollapse = React.useCallback(() => {\n setCollapsedRailHovered(false);\n suppressCollapsedExpandRef.current = true;\n refreshCollapsedExpandGate();\n setCollapsed(true);\n window.setTimeout(() => {\n suppressCollapsedExpandRef.current = false;\n refreshCollapsedExpandGate();\n }, 250);\n }, [setCollapsed]);\n const showCollapsedExpandButton =\n collapsed && collapsedRailHovered && !suppressCollapsedExpandRef.current;\n\n const isExtensionsActive =\n currentPath === \"/customize\" ||\n currentPath.startsWith(\"/skills\") ||\n currentPath === \"/plugins\" ||\n currentPath === \"/apps\" ||\n currentPath === \"/mcp\";\n\n const railBodyProps = {\n collapseToggleLabel,\n onCollapse: handleCollapse,\n onExpand: () => setCollapsed(false),\n showCollapsedExpandButton,\n isExtensionsActive,\n currentPath,\n activeBackend: active.backend,\n activeBackendHealth,\n collapsedBackendPopoverOpen,\n setCollapsedBackendPopoverOpen,\n collapsedBackendPopoverRef,\n collapsedBackendCloseTimer,\n onOpenAddBackend: () => setAddBackendModalOpen(true),\n onOpenManageBackends: () => setManageBackendsModalOpen(true),\n };\n\n return (\n <>\n {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- the aside acts as a hit-area for the collapsed rail; nested controls handle their own keyboard interactions. */}\n <aside\n aria-label={t(I18nKey.SIDEBAR$NAVIGATION_LABEL)}\n data-collapsed={collapsed ? \"true\" : \"false\"}\n onClick={handleCollapsedRailClick}\n onMouseEnter={() => {\n if (collapsed) {\n setCollapsedRailHovered(true);\n }\n }}\n onMouseLeave={() => {\n setCollapsedRailHovered(false);\n }}\n className={cn(\n \"max-md:hidden flex bg-base flex-col min-h-0 transition-[width,min-width] duration-200\",\n \"md:border-r md:border-[var(--oh-border)] md:h-full\",\n collapsed\n ? \"md:w-[60px] md:min-w-[60px] md:px-2.5\"\n : \"md:w-[300px] md:min-w-[300px] pb-2 md:pl-2.5 md:pr-0\",\n currentPath === \"/\" && \"md:pb-3\",\n )}\n >\n <SidebarRailBody\n collapsed={collapsed}\n showCollapseToggle\n {...railBodyProps}\n />\n </aside>\n\n {mobileDrawerMounted ? (\n <>\n <div\n className={cn(\n \"fixed inset-0 z-40 bg-black/50 md:hidden\",\n \"transition-opacity ease-in-out motion-reduce:transition-none\",\n mobileDrawerVisible\n ? \"opacity-100\"\n : \"pointer-events-none opacity-0\",\n )}\n style={{ transitionDuration: `${MOBILE_DRAWER_TRANSITION_MS}ms` }}\n onClick={closeMobileNav}\n aria-hidden={!mobileDrawerVisible}\n />\n <aside\n aria-label={t(I18nKey.SIDEBAR$NAVIGATION_LABEL)}\n data-testid=\"sidebar-mobile-drawer\"\n aria-hidden={!mobileDrawerVisible}\n className={cn(\n \"fixed inset-y-0 left-0 z-50 flex min-h-0 w-[min(300px,85vw)] flex-col bg-base\",\n \"border-r border-[var(--oh-border)] pb-2 pl-2.5 pr-0 md:hidden\",\n \"transition-transform ease-in-out motion-reduce:transition-none\",\n mobileDrawerVisible ? \"translate-x-0\" : \"-translate-x-full\",\n )}\n style={{ transitionDuration: `${MOBILE_DRAWER_TRANSITION_MS}ms` }}\n >\n <SidebarRailBody\n collapsed={false}\n showCollapseToggle={false}\n showMobileCloseButton\n onCloseMobile={closeMobileNav}\n {...railBodyProps}\n />\n </aside>\n </>\n ) : null}\n\n {settingsModalIsOpen && (\n <React.Suspense fallback={null}>\n <SettingsModal\n settings={settings}\n onClose={() => setSettingsModalIsOpen(false)}\n />\n </React.Suspense>\n )}\n {addBackendModalOpen && (\n <React.Suspense fallback={null}>\n <AddBackendModal onClose={() => setAddBackendModalOpen(false)} />\n </React.Suspense>\n )}\n {manageBackendsModalOpen && (\n <React.Suspense fallback={null}>\n <ManageBackendsModal\n onClose={() => setManageBackendsModalOpen(false)}\n />\n </React.Suspense>\n )}\n </>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sidebar.cjs","names":[],"sources":["../../../../src/components/features/sidebar/sidebar.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { SidebarRailBody } from \"./sidebar-rail-body\";\nimport { getErrorStatus, useSettings } from \"#/hooks/query/use-settings\";\nimport { useConfig } from \"#/hooks/query/use-config\";\nimport { displayErrorToast } from \"#/utils/custom-toast-handlers\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { cn } from \"#/utils/utils\";\nimport { useSidebarMobileNav } from \"./sidebar-mobile-nav-context\";\nimport { useSidebarStore } from \"#/stores/sidebar-store\";\nimport { useClickOutsideElement } from \"#/hooks/use-click-outside-element\";\nimport { useBackendsHealth } from \"#/hooks/query/use-backends-health\";\n// The LLM settings modal is only mounted when the settings query 404s and\n// LLM settings aren't hidden — keep it out of the sidebar's eager graph.\nconst SettingsModal = React.lazy(() =>\n import(\"#/components/shared/modals/settings/settings-modal\").then((m) => ({\n default: m.SettingsModal,\n })),\n);\n\n// Add/Manage backend modals are lifted into the sidebar (instead of living\n// inside BackendSelector) so they survive the collapsed popover unmounting\n// when the user moves the cursor out of the popover toward the modal.\nconst AddBackendModal = React.lazy(() =>\n import(\"#/components/features/backends/add-backend-modal\").then((m) => ({\n default: m.AddBackendModal,\n })),\n);\nconst ManageBackendsModal = React.lazy(() =>\n import(\"#/components/features/backends/manage-backends-modal\").then((m) => ({\n default: m.ManageBackendsModal,\n })),\n);\n\nconst MOBILE_DRAWER_TRANSITION_MS = 250;\n\nexport function Sidebar() {\n const { t } = useTranslation(\"openhands\");\n const { currentPath } = useNavigation();\n const { data: config } = useConfig();\n const {\n data: settings,\n error: settingsError,\n isError: settingsIsError,\n isFetching: isFetchingSettings,\n } = useSettings();\n const { backends, active } = useActiveBackendContext();\n const healthByBackendId = useBackendsHealth(backends);\n const activeBackendHealth = healthByBackendId[active.backend.id];\n const collapsed = useSidebarStore((state) => state.collapsed);\n const setCollapsed = useSidebarStore((state) => state.setCollapsed);\n const [settingsModalIsOpen, setSettingsModalIsOpen] = React.useState(false);\n const [collapsedBackendPopoverOpen, setCollapsedBackendPopoverOpen] =\n React.useState(false);\n const collapsedBackendCloseTimer = React.useRef<ReturnType<\n typeof setTimeout\n > | null>(null);\n // Lifted out of BackendSelector so opening these modals from the\n // collapsed-sidebar popover doesn't lose state when the popover unmounts\n // (cursor moving toward the modal triggers onMouseLeave -> close).\n const [addBackendModalOpen, setAddBackendModalOpen] = React.useState(false);\n const [manageBackendsModalOpen, setManageBackendsModalOpen] =\n React.useState(false);\n const [collapsedRailHovered, setCollapsedRailHovered] = React.useState(false);\n const suppressCollapsedExpandRef = React.useRef(false);\n const [, refreshCollapsedExpandGate] = React.useReducer((n) => n + 1, 0);\n const { isOpen: isMobileNavOpen, close: closeMobileNav } =\n useSidebarMobileNav();\n const [mobileDrawerMounted, setMobileDrawerMounted] = React.useState(false);\n const [mobileDrawerVisible, setMobileDrawerVisible] = React.useState(false);\n const collapsedBackendPopoverRef = useClickOutsideElement<HTMLDivElement>(\n () => setCollapsedBackendPopoverOpen(false),\n );\n const settingsErrorStatus = getErrorStatus(settingsError);\n\n React.useEffect(() => {\n closeMobileNav();\n }, [currentPath, closeMobileNav]);\n\n React.useEffect(() => {\n if (isMobileNavOpen) {\n setMobileDrawerMounted(true);\n const frame = requestAnimationFrame(() => {\n setMobileDrawerVisible(true);\n });\n return () => cancelAnimationFrame(frame);\n }\n\n setMobileDrawerVisible(false);\n const timer = window.setTimeout(() => {\n setMobileDrawerMounted(false);\n }, MOBILE_DRAWER_TRANSITION_MS);\n return () => window.clearTimeout(timer);\n }, [isMobileNavOpen]);\n\n React.useEffect(() => {\n if (!isMobileNavOpen) {\n return undefined;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n closeMobileNav();\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [isMobileNavOpen, closeMobileNav]);\n\n React.useEffect(() => {\n if (currentPath === \"/settings\") {\n setSettingsModalIsOpen(false);\n } else if (\n !isFetchingSettings &&\n settingsIsError &&\n settingsErrorStatus !== 404\n ) {\n // We don't show toast errors for settings in the global error handler\n // because we have a special case for 404 errors\n displayErrorToast(t(I18nKey.SETTINGS$FETCH_ERROR));\n } else if (\n settingsErrorStatus === 404 &&\n !config?.feature_flags?.hide_llm_settings\n ) {\n setSettingsModalIsOpen(true);\n }\n }, [\n currentPath,\n isFetchingSettings,\n settingsIsError,\n settingsErrorStatus,\n config?.feature_flags?.hide_llm_settings,\n t,\n ]);\n\n const collapseToggleLabel = t(\n collapsed ? I18nKey.SIDEBAR$EXPAND : I18nKey.SIDEBAR$COLLAPSE,\n );\n const handleCollapsedRailClick = React.useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n if (!collapsed) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n // Keep existing behavior for explicit controls/links and only use\n // this as a convenience hit-area for empty collapsed-rail space.\n if (\n target.closest(\n \"a,button,input,textarea,select,[role='button'],[role='link']\",\n )\n ) {\n return;\n }\n\n setCollapsed(false);\n },\n [collapsed, setCollapsed],\n );\n const handleCollapse = React.useCallback(() => {\n setCollapsedRailHovered(false);\n suppressCollapsedExpandRef.current = true;\n refreshCollapsedExpandGate();\n setCollapsed(true);\n window.setTimeout(() => {\n suppressCollapsedExpandRef.current = false;\n refreshCollapsedExpandGate();\n }, 250);\n }, [setCollapsed]);\n const showCollapsedExpandButton =\n collapsed && collapsedRailHovered && !suppressCollapsedExpandRef.current;\n\n const isExtensionsActive =\n currentPath === \"/customize\" ||\n currentPath.startsWith(\"/skills\") ||\n currentPath === \"/plugins\" ||\n currentPath === \"/apps\" ||\n currentPath === \"/mcp\";\n\n const railBodyProps = {\n collapseToggleLabel,\n onCollapse: handleCollapse,\n onExpand: () => setCollapsed(false),\n showCollapsedExpandButton,\n isExtensionsActive,\n currentPath,\n activeBackend: active.backend,\n activeOrgId: active.orgId,\n activeBackendHealth,\n collapsedBackendPopoverOpen,\n setCollapsedBackendPopoverOpen,\n collapsedBackendPopoverRef,\n collapsedBackendCloseTimer,\n onOpenAddBackend: () => setAddBackendModalOpen(true),\n onOpenManageBackends: () => setManageBackendsModalOpen(true),\n };\n\n return (\n <>\n {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- the aside acts as a hit-area for the collapsed rail; nested controls handle their own keyboard interactions. */}\n <aside\n aria-label={t(I18nKey.SIDEBAR$NAVIGATION_LABEL)}\n data-collapsed={collapsed ? \"true\" : \"false\"}\n onClick={handleCollapsedRailClick}\n onMouseEnter={() => {\n if (collapsed) {\n setCollapsedRailHovered(true);\n }\n }}\n onMouseLeave={() => {\n setCollapsedRailHovered(false);\n }}\n className={cn(\n \"max-md:hidden flex bg-base flex-col min-h-0 transition-[width,min-width] duration-200\",\n \"md:border-r md:border-[var(--oh-border)] md:h-full\",\n collapsed\n ? \"md:w-[60px] md:min-w-[60px] md:px-2.5\"\n : \"md:w-[300px] md:min-w-[300px] pb-2 md:pl-2.5 md:pr-0\",\n currentPath === \"/\" && \"md:pb-3\",\n )}\n >\n <SidebarRailBody\n collapsed={collapsed}\n showCollapseToggle\n {...railBodyProps}\n />\n </aside>\n\n {mobileDrawerMounted ? (\n <>\n <div\n className={cn(\n \"fixed inset-0 z-40 bg-black/50 md:hidden\",\n \"transition-opacity ease-in-out motion-reduce:transition-none\",\n mobileDrawerVisible\n ? \"opacity-100\"\n : \"pointer-events-none opacity-0\",\n )}\n style={{ transitionDuration: `${MOBILE_DRAWER_TRANSITION_MS}ms` }}\n onClick={closeMobileNav}\n aria-hidden={!mobileDrawerVisible}\n />\n <aside\n aria-label={t(I18nKey.SIDEBAR$NAVIGATION_LABEL)}\n data-testid=\"sidebar-mobile-drawer\"\n aria-hidden={!mobileDrawerVisible}\n className={cn(\n \"fixed inset-y-0 left-0 z-50 flex min-h-0 w-[min(300px,85vw)] flex-col bg-base\",\n \"border-r border-[var(--oh-border)] pb-2 pl-2.5 pr-0 md:hidden\",\n \"transition-transform ease-in-out motion-reduce:transition-none\",\n mobileDrawerVisible ? \"translate-x-0\" : \"-translate-x-full\",\n )}\n style={{ transitionDuration: `${MOBILE_DRAWER_TRANSITION_MS}ms` }}\n >\n <SidebarRailBody\n collapsed={false}\n showCollapseToggle={false}\n showMobileCloseButton\n onCloseMobile={closeMobileNav}\n {...railBodyProps}\n />\n </aside>\n </>\n ) : null}\n\n {settingsModalIsOpen && (\n <React.Suspense fallback={null}>\n <SettingsModal\n settings={settings}\n onClose={() => setSettingsModalIsOpen(false)}\n />\n </React.Suspense>\n )}\n {addBackendModalOpen && (\n <React.Suspense fallback={null}>\n <AddBackendModal onClose={() => setAddBackendModalOpen(false)} />\n </React.Suspense>\n )}\n {manageBackendsModalOpen && (\n <React.Suspense fallback={null}>\n <ManageBackendsModal\n onClose={() => setManageBackendsModalOpen(false)}\n />\n </React.Suspense>\n )}\n </>\n );\n}\n"],"mappings":"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"}
|
|
@@ -6,20 +6,20 @@ import { displayErrorToast as i } from "../../../utils/custom-toast-handlers.js"
|
|
|
6
6
|
import { useActiveBackendContext as a } from "../../../contexts/active-backend-context.js";
|
|
7
7
|
import { getErrorStatus as o, useSettings as s } from "../../../hooks/query/use-settings.js";
|
|
8
8
|
import { useClickOutsideElement as c } from "../../../hooks/use-click-outside-element.js";
|
|
9
|
-
import { useConfig as
|
|
10
|
-
import { useSidebarMobileNav as
|
|
11
|
-
import { useBackendsHealth as
|
|
12
|
-
import { SidebarRailBody as
|
|
13
|
-
import { useSidebarStore as
|
|
14
|
-
import
|
|
15
|
-
import { Fragment as
|
|
9
|
+
import { useConfig as l } from "../../../hooks/query/use-config.js";
|
|
10
|
+
import { useSidebarMobileNav as ee } from "./sidebar-mobile-nav-context.js";
|
|
11
|
+
import { useBackendsHealth as u } from "../../../hooks/query/use-backends-health.js";
|
|
12
|
+
import { SidebarRailBody as d } from "./sidebar-rail-body.js";
|
|
13
|
+
import { useSidebarStore as f } from "../../../stores/sidebar-store.js";
|
|
14
|
+
import p from "react";
|
|
15
|
+
import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
16
16
|
//#region src/components/features/sidebar/sidebar.tsx
|
|
17
|
-
var
|
|
17
|
+
var te = p.lazy(() => import("../../shared/modals/settings/settings-modal.js").then((e) => ({ default: e.SettingsModal }))), _ = p.lazy(() => import("../backends/add-backend-modal.js").then((e) => ({ default: e.AddBackendModal }))), v = p.lazy(() => import("../backends/manage-backends-modal.js").then((e) => ({ default: e.ManageBackendsModal }))), y = 250;
|
|
18
18
|
function b() {
|
|
19
|
-
let { t: b } = e("openhands"), { currentPath: x } = r(), { data: S } =
|
|
20
|
-
|
|
19
|
+
let { t: b } = e("openhands"), { currentPath: x } = r(), { data: S } = l(), { data: C, error: w, isError: T, isFetching: E } = s(), { backends: D, active: O } = a(), k = u(D)[O.backend.id], A = f((e) => e.collapsed), j = f((e) => e.setCollapsed), [M, N] = p.useState(!1), [P, F] = p.useState(!1), I = p.useRef(null), [L, R] = p.useState(!1), [z, B] = p.useState(!1), [V, H] = p.useState(!1), U = p.useRef(!1), [, W] = p.useReducer((e) => e + 1, 0), { isOpen: G, close: K } = ee(), [q, J] = p.useState(!1), [Y, X] = p.useState(!1), Z = c(() => F(!1)), Q = o(w);
|
|
20
|
+
p.useEffect(() => {
|
|
21
21
|
K();
|
|
22
|
-
}, [x, K]),
|
|
22
|
+
}, [x, K]), p.useEffect(() => {
|
|
23
23
|
if (G) {
|
|
24
24
|
J(!0);
|
|
25
25
|
let e = requestAnimationFrame(() => {
|
|
@@ -32,13 +32,13 @@ function b() {
|
|
|
32
32
|
J(!1);
|
|
33
33
|
}, y);
|
|
34
34
|
return () => window.clearTimeout(e);
|
|
35
|
-
}, [G]),
|
|
35
|
+
}, [G]), p.useEffect(() => {
|
|
36
36
|
if (!G) return;
|
|
37
37
|
let e = (e) => {
|
|
38
38
|
e.key === "Escape" && K();
|
|
39
39
|
};
|
|
40
40
|
return window.addEventListener("keydown", e), () => window.removeEventListener("keydown", e);
|
|
41
|
-
}, [G, K]),
|
|
41
|
+
}, [G, K]), p.useEffect(() => {
|
|
42
42
|
x === "/settings" ? N(!1) : !E && T && Q !== 404 ? i(b(t.SETTINGS$FETCH_ERROR)) : Q === 404 && !S?.feature_flags?.hide_llm_settings && N(!0);
|
|
43
43
|
}, [
|
|
44
44
|
x,
|
|
@@ -48,13 +48,13 @@ function b() {
|
|
|
48
48
|
S?.feature_flags?.hide_llm_settings,
|
|
49
49
|
b
|
|
50
50
|
]);
|
|
51
|
-
let ne = b(A ? t.SIDEBAR$EXPAND : t.SIDEBAR$COLLAPSE), re =
|
|
51
|
+
let ne = b(A ? t.SIDEBAR$EXPAND : t.SIDEBAR$COLLAPSE), re = p.useCallback((e) => {
|
|
52
52
|
if (!A) return;
|
|
53
53
|
let t = e.target;
|
|
54
54
|
t instanceof HTMLElement && (t.closest("a,button,input,textarea,select,[role='button'],[role='link']") || j(!1));
|
|
55
55
|
}, [A, j]), $ = {
|
|
56
56
|
collapseToggleLabel: ne,
|
|
57
|
-
onCollapse:
|
|
57
|
+
onCollapse: p.useCallback(() => {
|
|
58
58
|
H(!1), U.current = !0, W(), j(!0), window.setTimeout(() => {
|
|
59
59
|
U.current = !1, W();
|
|
60
60
|
}, 250);
|
|
@@ -64,6 +64,7 @@ function b() {
|
|
|
64
64
|
isExtensionsActive: x === "/customize" || x.startsWith("/skills") || x === "/plugins" || x === "/apps" || x === "/mcp",
|
|
65
65
|
currentPath: x,
|
|
66
66
|
activeBackend: O.backend,
|
|
67
|
+
activeOrgId: O.orgId,
|
|
67
68
|
activeBackendHealth: k,
|
|
68
69
|
collapsedBackendPopoverOpen: P,
|
|
69
70
|
setCollapsedBackendPopoverOpen: F,
|
|
@@ -72,8 +73,8 @@ function b() {
|
|
|
72
73
|
onOpenAddBackend: () => R(!0),
|
|
73
74
|
onOpenManageBackends: () => B(!0)
|
|
74
75
|
};
|
|
75
|
-
return /* @__PURE__ */
|
|
76
|
-
/* @__PURE__ */
|
|
76
|
+
return /* @__PURE__ */ g(m, { children: [
|
|
77
|
+
/* @__PURE__ */ h("aside", {
|
|
77
78
|
"aria-label": b(t.SIDEBAR$NAVIGATION_LABEL),
|
|
78
79
|
"data-collapsed": A ? "true" : "false",
|
|
79
80
|
onClick: re,
|
|
@@ -84,24 +85,24 @@ function b() {
|
|
|
84
85
|
H(!1);
|
|
85
86
|
},
|
|
86
87
|
className: n("max-md:hidden flex bg-base flex-col min-h-0 transition-[width,min-width] duration-200", "md:border-r md:border-[var(--oh-border)] md:h-full", A ? "md:w-[60px] md:min-w-[60px] md:px-2.5" : "md:w-[300px] md:min-w-[300px] pb-2 md:pl-2.5 md:pr-0", x === "/" && "md:pb-3"),
|
|
87
|
-
children: /* @__PURE__ */
|
|
88
|
+
children: /* @__PURE__ */ h(d, {
|
|
88
89
|
collapsed: A,
|
|
89
90
|
showCollapseToggle: !0,
|
|
90
91
|
...$
|
|
91
92
|
})
|
|
92
93
|
}),
|
|
93
|
-
q ? /* @__PURE__ */
|
|
94
|
+
q ? /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h("div", {
|
|
94
95
|
className: n("fixed inset-0 z-40 bg-black/50 md:hidden", "transition-opacity ease-in-out motion-reduce:transition-none", Y ? "opacity-100" : "pointer-events-none opacity-0"),
|
|
95
96
|
style: { transitionDuration: `${y}ms` },
|
|
96
97
|
onClick: K,
|
|
97
98
|
"aria-hidden": !Y
|
|
98
|
-
}), /* @__PURE__ */
|
|
99
|
+
}), /* @__PURE__ */ h("aside", {
|
|
99
100
|
"aria-label": b(t.SIDEBAR$NAVIGATION_LABEL),
|
|
100
101
|
"data-testid": "sidebar-mobile-drawer",
|
|
101
102
|
"aria-hidden": !Y,
|
|
102
103
|
className: n("fixed inset-y-0 left-0 z-50 flex min-h-0 w-[min(300px,85vw)] flex-col bg-base", "border-r border-[var(--oh-border)] pb-2 pl-2.5 pr-0 md:hidden", "transition-transform ease-in-out motion-reduce:transition-none", Y ? "translate-x-0" : "-translate-x-full"),
|
|
103
104
|
style: { transitionDuration: `${y}ms` },
|
|
104
|
-
children: /* @__PURE__ */
|
|
105
|
+
children: /* @__PURE__ */ h(d, {
|
|
105
106
|
collapsed: !1,
|
|
106
107
|
showCollapseToggle: !1,
|
|
107
108
|
showMobileCloseButton: !0,
|
|
@@ -109,20 +110,20 @@ function b() {
|
|
|
109
110
|
...$
|
|
110
111
|
})
|
|
111
112
|
})] }) : null,
|
|
112
|
-
M && /* @__PURE__ */
|
|
113
|
+
M && /* @__PURE__ */ h(p.Suspense, {
|
|
113
114
|
fallback: null,
|
|
114
|
-
children: /* @__PURE__ */
|
|
115
|
+
children: /* @__PURE__ */ h(te, {
|
|
115
116
|
settings: C,
|
|
116
117
|
onClose: () => N(!1)
|
|
117
118
|
})
|
|
118
119
|
}),
|
|
119
|
-
L && /* @__PURE__ */
|
|
120
|
+
L && /* @__PURE__ */ h(p.Suspense, {
|
|
120
121
|
fallback: null,
|
|
121
|
-
children: /* @__PURE__ */
|
|
122
|
+
children: /* @__PURE__ */ h(_, { onClose: () => R(!1) })
|
|
122
123
|
}),
|
|
123
|
-
z && /* @__PURE__ */
|
|
124
|
+
z && /* @__PURE__ */ h(p.Suspense, {
|
|
124
125
|
fallback: null,
|
|
125
|
-
children: /* @__PURE__ */
|
|
126
|
+
children: /* @__PURE__ */ h(v, { onClose: () => B(!1) })
|
|
126
127
|
})
|
|
127
128
|
] });
|
|
128
129
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidebar.js","names":[],"sources":["../../../../src/components/features/sidebar/sidebar.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { SidebarRailBody } from \"./sidebar-rail-body\";\nimport { getErrorStatus, useSettings } from \"#/hooks/query/use-settings\";\nimport { useConfig } from \"#/hooks/query/use-config\";\nimport { displayErrorToast } from \"#/utils/custom-toast-handlers\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { cn } from \"#/utils/utils\";\nimport { useSidebarMobileNav } from \"./sidebar-mobile-nav-context\";\nimport { useSidebarStore } from \"#/stores/sidebar-store\";\nimport { useClickOutsideElement } from \"#/hooks/use-click-outside-element\";\nimport { useBackendsHealth } from \"#/hooks/query/use-backends-health\";\n// The LLM settings modal is only mounted when the settings query 404s and\n// LLM settings aren't hidden — keep it out of the sidebar's eager graph.\nconst SettingsModal = React.lazy(() =>\n import(\"#/components/shared/modals/settings/settings-modal\").then((m) => ({\n default: m.SettingsModal,\n })),\n);\n\n// Add/Manage backend modals are lifted into the sidebar (instead of living\n// inside BackendSelector) so they survive the collapsed popover unmounting\n// when the user moves the cursor out of the popover toward the modal.\nconst AddBackendModal = React.lazy(() =>\n import(\"#/components/features/backends/add-backend-modal\").then((m) => ({\n default: m.AddBackendModal,\n })),\n);\nconst ManageBackendsModal = React.lazy(() =>\n import(\"#/components/features/backends/manage-backends-modal\").then((m) => ({\n default: m.ManageBackendsModal,\n })),\n);\n\nconst MOBILE_DRAWER_TRANSITION_MS = 250;\n\nexport function Sidebar() {\n const { t } = useTranslation(\"openhands\");\n const { currentPath } = useNavigation();\n const { data: config } = useConfig();\n const {\n data: settings,\n error: settingsError,\n isError: settingsIsError,\n isFetching: isFetchingSettings,\n } = useSettings();\n const { backends, active } = useActiveBackendContext();\n const healthByBackendId = useBackendsHealth(backends);\n const activeBackendHealth = healthByBackendId[active.backend.id];\n const collapsed = useSidebarStore((state) => state.collapsed);\n const setCollapsed = useSidebarStore((state) => state.setCollapsed);\n const [settingsModalIsOpen, setSettingsModalIsOpen] = React.useState(false);\n const [collapsedBackendPopoverOpen, setCollapsedBackendPopoverOpen] =\n React.useState(false);\n const collapsedBackendCloseTimer = React.useRef<ReturnType<\n typeof setTimeout\n > | null>(null);\n // Lifted out of BackendSelector so opening these modals from the\n // collapsed-sidebar popover doesn't lose state when the popover unmounts\n // (cursor moving toward the modal triggers onMouseLeave -> close).\n const [addBackendModalOpen, setAddBackendModalOpen] = React.useState(false);\n const [manageBackendsModalOpen, setManageBackendsModalOpen] =\n React.useState(false);\n const [collapsedRailHovered, setCollapsedRailHovered] = React.useState(false);\n const suppressCollapsedExpandRef = React.useRef(false);\n const [, refreshCollapsedExpandGate] = React.useReducer((n) => n + 1, 0);\n const { isOpen: isMobileNavOpen, close: closeMobileNav } =\n useSidebarMobileNav();\n const [mobileDrawerMounted, setMobileDrawerMounted] = React.useState(false);\n const [mobileDrawerVisible, setMobileDrawerVisible] = React.useState(false);\n const collapsedBackendPopoverRef = useClickOutsideElement<HTMLDivElement>(\n () => setCollapsedBackendPopoverOpen(false),\n );\n const settingsErrorStatus = getErrorStatus(settingsError);\n\n React.useEffect(() => {\n closeMobileNav();\n }, [currentPath, closeMobileNav]);\n\n React.useEffect(() => {\n if (isMobileNavOpen) {\n setMobileDrawerMounted(true);\n const frame = requestAnimationFrame(() => {\n setMobileDrawerVisible(true);\n });\n return () => cancelAnimationFrame(frame);\n }\n\n setMobileDrawerVisible(false);\n const timer = window.setTimeout(() => {\n setMobileDrawerMounted(false);\n }, MOBILE_DRAWER_TRANSITION_MS);\n return () => window.clearTimeout(timer);\n }, [isMobileNavOpen]);\n\n React.useEffect(() => {\n if (!isMobileNavOpen) {\n return undefined;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n closeMobileNav();\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [isMobileNavOpen, closeMobileNav]);\n\n React.useEffect(() => {\n if (currentPath === \"/settings\") {\n setSettingsModalIsOpen(false);\n } else if (\n !isFetchingSettings &&\n settingsIsError &&\n settingsErrorStatus !== 404\n ) {\n // We don't show toast errors for settings in the global error handler\n // because we have a special case for 404 errors\n displayErrorToast(t(I18nKey.SETTINGS$FETCH_ERROR));\n } else if (\n settingsErrorStatus === 404 &&\n !config?.feature_flags?.hide_llm_settings\n ) {\n setSettingsModalIsOpen(true);\n }\n }, [\n currentPath,\n isFetchingSettings,\n settingsIsError,\n settingsErrorStatus,\n config?.feature_flags?.hide_llm_settings,\n t,\n ]);\n\n const collapseToggleLabel = t(\n collapsed ? I18nKey.SIDEBAR$EXPAND : I18nKey.SIDEBAR$COLLAPSE,\n );\n const handleCollapsedRailClick = React.useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n if (!collapsed) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n // Keep existing behavior for explicit controls/links and only use\n // this as a convenience hit-area for empty collapsed-rail space.\n if (\n target.closest(\n \"a,button,input,textarea,select,[role='button'],[role='link']\",\n )\n ) {\n return;\n }\n\n setCollapsed(false);\n },\n [collapsed, setCollapsed],\n );\n const handleCollapse = React.useCallback(() => {\n setCollapsedRailHovered(false);\n suppressCollapsedExpandRef.current = true;\n refreshCollapsedExpandGate();\n setCollapsed(true);\n window.setTimeout(() => {\n suppressCollapsedExpandRef.current = false;\n refreshCollapsedExpandGate();\n }, 250);\n }, [setCollapsed]);\n const showCollapsedExpandButton =\n collapsed && collapsedRailHovered && !suppressCollapsedExpandRef.current;\n\n const isExtensionsActive =\n currentPath === \"/customize\" ||\n currentPath.startsWith(\"/skills\") ||\n currentPath === \"/plugins\" ||\n currentPath === \"/apps\" ||\n currentPath === \"/mcp\";\n\n const railBodyProps = {\n collapseToggleLabel,\n onCollapse: handleCollapse,\n onExpand: () => setCollapsed(false),\n showCollapsedExpandButton,\n isExtensionsActive,\n currentPath,\n activeBackend: active.backend,\n activeBackendHealth,\n collapsedBackendPopoverOpen,\n setCollapsedBackendPopoverOpen,\n collapsedBackendPopoverRef,\n collapsedBackendCloseTimer,\n onOpenAddBackend: () => setAddBackendModalOpen(true),\n onOpenManageBackends: () => setManageBackendsModalOpen(true),\n };\n\n return (\n <>\n {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- the aside acts as a hit-area for the collapsed rail; nested controls handle their own keyboard interactions. */}\n <aside\n aria-label={t(I18nKey.SIDEBAR$NAVIGATION_LABEL)}\n data-collapsed={collapsed ? \"true\" : \"false\"}\n onClick={handleCollapsedRailClick}\n onMouseEnter={() => {\n if (collapsed) {\n setCollapsedRailHovered(true);\n }\n }}\n onMouseLeave={() => {\n setCollapsedRailHovered(false);\n }}\n className={cn(\n \"max-md:hidden flex bg-base flex-col min-h-0 transition-[width,min-width] duration-200\",\n \"md:border-r md:border-[var(--oh-border)] md:h-full\",\n collapsed\n ? \"md:w-[60px] md:min-w-[60px] md:px-2.5\"\n : \"md:w-[300px] md:min-w-[300px] pb-2 md:pl-2.5 md:pr-0\",\n currentPath === \"/\" && \"md:pb-3\",\n )}\n >\n <SidebarRailBody\n collapsed={collapsed}\n showCollapseToggle\n {...railBodyProps}\n />\n </aside>\n\n {mobileDrawerMounted ? (\n <>\n <div\n className={cn(\n \"fixed inset-0 z-40 bg-black/50 md:hidden\",\n \"transition-opacity ease-in-out motion-reduce:transition-none\",\n mobileDrawerVisible\n ? \"opacity-100\"\n : \"pointer-events-none opacity-0\",\n )}\n style={{ transitionDuration: `${MOBILE_DRAWER_TRANSITION_MS}ms` }}\n onClick={closeMobileNav}\n aria-hidden={!mobileDrawerVisible}\n />\n <aside\n aria-label={t(I18nKey.SIDEBAR$NAVIGATION_LABEL)}\n data-testid=\"sidebar-mobile-drawer\"\n aria-hidden={!mobileDrawerVisible}\n className={cn(\n \"fixed inset-y-0 left-0 z-50 flex min-h-0 w-[min(300px,85vw)] flex-col bg-base\",\n \"border-r border-[var(--oh-border)] pb-2 pl-2.5 pr-0 md:hidden\",\n \"transition-transform ease-in-out motion-reduce:transition-none\",\n mobileDrawerVisible ? \"translate-x-0\" : \"-translate-x-full\",\n )}\n style={{ transitionDuration: `${MOBILE_DRAWER_TRANSITION_MS}ms` }}\n >\n <SidebarRailBody\n collapsed={false}\n showCollapseToggle={false}\n showMobileCloseButton\n onCloseMobile={closeMobileNav}\n {...railBodyProps}\n />\n </aside>\n </>\n ) : null}\n\n {settingsModalIsOpen && (\n <React.Suspense fallback={null}>\n <SettingsModal\n settings={settings}\n onClose={() => setSettingsModalIsOpen(false)}\n />\n </React.Suspense>\n )}\n {addBackendModalOpen && (\n <React.Suspense fallback={null}>\n <AddBackendModal onClose={() => setAddBackendModalOpen(false)} />\n </React.Suspense>\n )}\n {manageBackendsModalOpen && (\n <React.Suspense fallback={null}>\n <ManageBackendsModal\n onClose={() => setManageBackendsModalOpen(false)}\n />\n </React.Suspense>\n )}\n </>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sidebar.js","names":[],"sources":["../../../../src/components/features/sidebar/sidebar.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { SidebarRailBody } from \"./sidebar-rail-body\";\nimport { getErrorStatus, useSettings } from \"#/hooks/query/use-settings\";\nimport { useConfig } from \"#/hooks/query/use-config\";\nimport { displayErrorToast } from \"#/utils/custom-toast-handlers\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { useNavigation } from \"#/context/navigation-context\";\nimport { useActiveBackendContext } from \"#/contexts/active-backend-context\";\nimport { cn } from \"#/utils/utils\";\nimport { useSidebarMobileNav } from \"./sidebar-mobile-nav-context\";\nimport { useSidebarStore } from \"#/stores/sidebar-store\";\nimport { useClickOutsideElement } from \"#/hooks/use-click-outside-element\";\nimport { useBackendsHealth } from \"#/hooks/query/use-backends-health\";\n// The LLM settings modal is only mounted when the settings query 404s and\n// LLM settings aren't hidden — keep it out of the sidebar's eager graph.\nconst SettingsModal = React.lazy(() =>\n import(\"#/components/shared/modals/settings/settings-modal\").then((m) => ({\n default: m.SettingsModal,\n })),\n);\n\n// Add/Manage backend modals are lifted into the sidebar (instead of living\n// inside BackendSelector) so they survive the collapsed popover unmounting\n// when the user moves the cursor out of the popover toward the modal.\nconst AddBackendModal = React.lazy(() =>\n import(\"#/components/features/backends/add-backend-modal\").then((m) => ({\n default: m.AddBackendModal,\n })),\n);\nconst ManageBackendsModal = React.lazy(() =>\n import(\"#/components/features/backends/manage-backends-modal\").then((m) => ({\n default: m.ManageBackendsModal,\n })),\n);\n\nconst MOBILE_DRAWER_TRANSITION_MS = 250;\n\nexport function Sidebar() {\n const { t } = useTranslation(\"openhands\");\n const { currentPath } = useNavigation();\n const { data: config } = useConfig();\n const {\n data: settings,\n error: settingsError,\n isError: settingsIsError,\n isFetching: isFetchingSettings,\n } = useSettings();\n const { backends, active } = useActiveBackendContext();\n const healthByBackendId = useBackendsHealth(backends);\n const activeBackendHealth = healthByBackendId[active.backend.id];\n const collapsed = useSidebarStore((state) => state.collapsed);\n const setCollapsed = useSidebarStore((state) => state.setCollapsed);\n const [settingsModalIsOpen, setSettingsModalIsOpen] = React.useState(false);\n const [collapsedBackendPopoverOpen, setCollapsedBackendPopoverOpen] =\n React.useState(false);\n const collapsedBackendCloseTimer = React.useRef<ReturnType<\n typeof setTimeout\n > | null>(null);\n // Lifted out of BackendSelector so opening these modals from the\n // collapsed-sidebar popover doesn't lose state when the popover unmounts\n // (cursor moving toward the modal triggers onMouseLeave -> close).\n const [addBackendModalOpen, setAddBackendModalOpen] = React.useState(false);\n const [manageBackendsModalOpen, setManageBackendsModalOpen] =\n React.useState(false);\n const [collapsedRailHovered, setCollapsedRailHovered] = React.useState(false);\n const suppressCollapsedExpandRef = React.useRef(false);\n const [, refreshCollapsedExpandGate] = React.useReducer((n) => n + 1, 0);\n const { isOpen: isMobileNavOpen, close: closeMobileNav } =\n useSidebarMobileNav();\n const [mobileDrawerMounted, setMobileDrawerMounted] = React.useState(false);\n const [mobileDrawerVisible, setMobileDrawerVisible] = React.useState(false);\n const collapsedBackendPopoverRef = useClickOutsideElement<HTMLDivElement>(\n () => setCollapsedBackendPopoverOpen(false),\n );\n const settingsErrorStatus = getErrorStatus(settingsError);\n\n React.useEffect(() => {\n closeMobileNav();\n }, [currentPath, closeMobileNav]);\n\n React.useEffect(() => {\n if (isMobileNavOpen) {\n setMobileDrawerMounted(true);\n const frame = requestAnimationFrame(() => {\n setMobileDrawerVisible(true);\n });\n return () => cancelAnimationFrame(frame);\n }\n\n setMobileDrawerVisible(false);\n const timer = window.setTimeout(() => {\n setMobileDrawerMounted(false);\n }, MOBILE_DRAWER_TRANSITION_MS);\n return () => window.clearTimeout(timer);\n }, [isMobileNavOpen]);\n\n React.useEffect(() => {\n if (!isMobileNavOpen) {\n return undefined;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n closeMobileNav();\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => window.removeEventListener(\"keydown\", onKeyDown);\n }, [isMobileNavOpen, closeMobileNav]);\n\n React.useEffect(() => {\n if (currentPath === \"/settings\") {\n setSettingsModalIsOpen(false);\n } else if (\n !isFetchingSettings &&\n settingsIsError &&\n settingsErrorStatus !== 404\n ) {\n // We don't show toast errors for settings in the global error handler\n // because we have a special case for 404 errors\n displayErrorToast(t(I18nKey.SETTINGS$FETCH_ERROR));\n } else if (\n settingsErrorStatus === 404 &&\n !config?.feature_flags?.hide_llm_settings\n ) {\n setSettingsModalIsOpen(true);\n }\n }, [\n currentPath,\n isFetchingSettings,\n settingsIsError,\n settingsErrorStatus,\n config?.feature_flags?.hide_llm_settings,\n t,\n ]);\n\n const collapseToggleLabel = t(\n collapsed ? I18nKey.SIDEBAR$EXPAND : I18nKey.SIDEBAR$COLLAPSE,\n );\n const handleCollapsedRailClick = React.useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n if (!collapsed) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n\n // Keep existing behavior for explicit controls/links and only use\n // this as a convenience hit-area for empty collapsed-rail space.\n if (\n target.closest(\n \"a,button,input,textarea,select,[role='button'],[role='link']\",\n )\n ) {\n return;\n }\n\n setCollapsed(false);\n },\n [collapsed, setCollapsed],\n );\n const handleCollapse = React.useCallback(() => {\n setCollapsedRailHovered(false);\n suppressCollapsedExpandRef.current = true;\n refreshCollapsedExpandGate();\n setCollapsed(true);\n window.setTimeout(() => {\n suppressCollapsedExpandRef.current = false;\n refreshCollapsedExpandGate();\n }, 250);\n }, [setCollapsed]);\n const showCollapsedExpandButton =\n collapsed && collapsedRailHovered && !suppressCollapsedExpandRef.current;\n\n const isExtensionsActive =\n currentPath === \"/customize\" ||\n currentPath.startsWith(\"/skills\") ||\n currentPath === \"/plugins\" ||\n currentPath === \"/apps\" ||\n currentPath === \"/mcp\";\n\n const railBodyProps = {\n collapseToggleLabel,\n onCollapse: handleCollapse,\n onExpand: () => setCollapsed(false),\n showCollapsedExpandButton,\n isExtensionsActive,\n currentPath,\n activeBackend: active.backend,\n activeOrgId: active.orgId,\n activeBackendHealth,\n collapsedBackendPopoverOpen,\n setCollapsedBackendPopoverOpen,\n collapsedBackendPopoverRef,\n collapsedBackendCloseTimer,\n onOpenAddBackend: () => setAddBackendModalOpen(true),\n onOpenManageBackends: () => setManageBackendsModalOpen(true),\n };\n\n return (\n <>\n {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- the aside acts as a hit-area for the collapsed rail; nested controls handle their own keyboard interactions. */}\n <aside\n aria-label={t(I18nKey.SIDEBAR$NAVIGATION_LABEL)}\n data-collapsed={collapsed ? \"true\" : \"false\"}\n onClick={handleCollapsedRailClick}\n onMouseEnter={() => {\n if (collapsed) {\n setCollapsedRailHovered(true);\n }\n }}\n onMouseLeave={() => {\n setCollapsedRailHovered(false);\n }}\n className={cn(\n \"max-md:hidden flex bg-base flex-col min-h-0 transition-[width,min-width] duration-200\",\n \"md:border-r md:border-[var(--oh-border)] md:h-full\",\n collapsed\n ? \"md:w-[60px] md:min-w-[60px] md:px-2.5\"\n : \"md:w-[300px] md:min-w-[300px] pb-2 md:pl-2.5 md:pr-0\",\n currentPath === \"/\" && \"md:pb-3\",\n )}\n >\n <SidebarRailBody\n collapsed={collapsed}\n showCollapseToggle\n {...railBodyProps}\n />\n </aside>\n\n {mobileDrawerMounted ? (\n <>\n <div\n className={cn(\n \"fixed inset-0 z-40 bg-black/50 md:hidden\",\n \"transition-opacity ease-in-out motion-reduce:transition-none\",\n mobileDrawerVisible\n ? \"opacity-100\"\n : \"pointer-events-none opacity-0\",\n )}\n style={{ transitionDuration: `${MOBILE_DRAWER_TRANSITION_MS}ms` }}\n onClick={closeMobileNav}\n aria-hidden={!mobileDrawerVisible}\n />\n <aside\n aria-label={t(I18nKey.SIDEBAR$NAVIGATION_LABEL)}\n data-testid=\"sidebar-mobile-drawer\"\n aria-hidden={!mobileDrawerVisible}\n className={cn(\n \"fixed inset-y-0 left-0 z-50 flex min-h-0 w-[min(300px,85vw)] flex-col bg-base\",\n \"border-r border-[var(--oh-border)] pb-2 pl-2.5 pr-0 md:hidden\",\n \"transition-transform ease-in-out motion-reduce:transition-none\",\n mobileDrawerVisible ? \"translate-x-0\" : \"-translate-x-full\",\n )}\n style={{ transitionDuration: `${MOBILE_DRAWER_TRANSITION_MS}ms` }}\n >\n <SidebarRailBody\n collapsed={false}\n showCollapseToggle={false}\n showMobileCloseButton\n onCloseMobile={closeMobileNav}\n {...railBodyProps}\n />\n </aside>\n </>\n ) : null}\n\n {settingsModalIsOpen && (\n <React.Suspense fallback={null}>\n <SettingsModal\n settings={settings}\n onClose={() => setSettingsModalIsOpen(false)}\n />\n </React.Suspense>\n )}\n {addBackendModalOpen && (\n <React.Suspense fallback={null}>\n <AddBackendModal onClose={() => setAddBackendModalOpen(false)} />\n </React.Suspense>\n )}\n {manageBackendsModalOpen && (\n <React.Suspense fallback={null}>\n <ManageBackendsModal\n onClose={() => setManageBackendsModalOpen(false)}\n />\n </React.Suspense>\n )}\n </>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../../node_modules/react-i18next/dist/es/I18nextProvider.cjs"),n=require("../../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs"),r=require("../../i18n/index.cjs"),i=require("../../query-client-config.cjs"),a=require("../../contexts/active-backend-context.cjs"),o=require("./telemetry-provider.cjs"),
|
|
1
|
+
const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../../node_modules/react-i18next/dist/es/I18nextProvider.cjs"),n=require("../../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs"),r=require("../../i18n/index.cjs"),i=require("../../query-client-config.cjs"),a=require("../../contexts/active-backend-context.cjs"),o=require("../../hooks/query/use-free-models.cjs"),s=require("./telemetry-provider.cjs"),c=require("./agent-server-ui-root.cjs");let l=require("react");l=e.__toESM(l,1);let u=require("react/jsx-runtime");var d={provider:`posthog`};function f(){return o.useHydrateFreeModels(),null}function p({children:e,queryClient:o,analytics:d,i18n:p,className:m,contentClassName:h,style:g,styleOverrides:_,theme:v,withStyleRoot:y=!0}){let b=l.default.useMemo(()=>o??i.getDefaultQueryClient(),[o]),x=l.default.useMemo(()=>p??r.getDefaultI18n(),[p]),S=l.default.useRef(null);S.current||={queryClient:i.getQueryClient(),i18n:r.getI18n()},i.setQueryClient(b),r.setI18n(x),l.default.useEffect(()=>()=>{S.current&&(i.setQueryClient(S.current.queryClient),r.setI18n(S.current.i18n))},[]);let C=(0,u.jsxs)(s.TelemetryProvider,{config:d&&d.provider===`posthog`?{apiKey:d.apiKey,apiHost:d.apiHost,uiHost:d.uiHost}:!1,children:[(0,u.jsx)(f,{}),e]});return(0,u.jsx)(t.I18nextProvider,{i18n:x,defaultNS:r.OPENHANDS_I18N_NAMESPACE,children:(0,u.jsx)(n.QueryClientProvider,{client:b,children:(0,u.jsx)(a.ActiveBackendProvider,{children:y?(0,u.jsx)(c.AgentServerUIRoot,{className:m,contentClassName:h,style:g,styleOverrides:_,theme:v,children:C}):C})})})}exports.AgentServerUIProviders=p,exports.DEFAULT_AGENT_SERVER_ANALYTICS=d;
|
|
2
2
|
//# sourceMappingURL=agent-server-ui-providers.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-server-ui-providers.cjs","names":[],"sources":["../../../src/components/providers/agent-server-ui-providers.tsx"],"sourcesContent":["import React from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { I18nextProvider } from \"react-i18next\";\nimport { type i18n as I18nInstance } from \"i18next\";\nimport {\n getDefaultQueryClient,\n getQueryClient,\n setQueryClient,\n} from \"#/query-client-config\";\nimport {\n OPENHANDS_I18N_NAMESPACE,\n getDefaultI18n,\n getI18n,\n setI18n,\n} from \"#/i18n\";\nimport { ActiveBackendProvider } from \"#/contexts/active-backend-context\";\nimport type { TelemetryConfig } from \"#/services/telemetry\";\nimport { TelemetryProvider } from \"./telemetry-provider\";\nimport {\n AgentServerUIRoot,\n type AgentServerUIRootProps,\n} from \"./agent-server-ui-root\";\n\nexport interface AgentServerUIPostHogAnalyticsConfig extends TelemetryConfig {\n provider: \"posthog\";\n}\n\nexport type AgentServerUIAnalyticsConfig =\n | AgentServerUIPostHogAnalyticsConfig\n | false\n | null;\n\nexport const DEFAULT_AGENT_SERVER_ANALYTICS: AgentServerUIAnalyticsConfig = {\n provider: \"posthog\",\n};\n\nexport interface AgentServerUIProvidersProps extends Pick<\n AgentServerUIRootProps,\n \"className\" | \"contentClassName\" | \"style\" | \"styleOverrides\" | \"theme\"\n> {\n children: React.ReactNode;\n queryClient?: QueryClient;\n analytics?: AgentServerUIAnalyticsConfig;\n i18n?: I18nInstance;\n withStyleRoot?: boolean;\n}\n\nexport function AgentServerUIProviders({\n children,\n queryClient,\n analytics,\n i18n,\n className,\n contentClassName,\n style,\n styleOverrides,\n theme,\n withStyleRoot = true,\n}: AgentServerUIProvidersProps) {\n const resolvedQueryClient = React.useMemo(\n () => queryClient ?? getDefaultQueryClient(),\n [queryClient],\n );\n const resolvedI18n = React.useMemo(() => i18n ?? getDefaultI18n(), [i18n]);\n const previousProvidersRef = React.useRef<{\n queryClient: QueryClient;\n i18n: I18nInstance;\n } | null>(null);\n\n if (!previousProvidersRef.current) {\n previousProvidersRef.current = {\n queryClient: getQueryClient(),\n i18n: getI18n(),\n };\n }\n\n setQueryClient(resolvedQueryClient);\n setI18n(resolvedI18n);\n\n React.useEffect(\n () => () => {\n if (previousProvidersRef.current) {\n setQueryClient(previousProvidersRef.current.queryClient);\n setI18n(previousProvidersRef.current.i18n);\n }\n },\n [],\n );\n\n const posthogConfig =\n analytics && analytics.provider === \"posthog\"\n ? {\n apiKey: analytics.apiKey,\n apiHost: analytics.apiHost,\n uiHost: analytics.uiHost,\n }\n : false;\n const content = (\n <TelemetryProvider config={posthogConfig}
|
|
1
|
+
{"version":3,"file":"agent-server-ui-providers.cjs","names":[],"sources":["../../../src/components/providers/agent-server-ui-providers.tsx"],"sourcesContent":["import React from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { I18nextProvider } from \"react-i18next\";\nimport { type i18n as I18nInstance } from \"i18next\";\nimport {\n getDefaultQueryClient,\n getQueryClient,\n setQueryClient,\n} from \"#/query-client-config\";\nimport {\n OPENHANDS_I18N_NAMESPACE,\n getDefaultI18n,\n getI18n,\n setI18n,\n} from \"#/i18n\";\nimport { ActiveBackendProvider } from \"#/contexts/active-backend-context\";\nimport { useHydrateFreeModels } from \"#/hooks/query/use-free-models\";\nimport type { TelemetryConfig } from \"#/services/telemetry\";\nimport { TelemetryProvider } from \"./telemetry-provider\";\nimport {\n AgentServerUIRoot,\n type AgentServerUIRootProps,\n} from \"./agent-server-ui-root\";\n\nexport interface AgentServerUIPostHogAnalyticsConfig extends TelemetryConfig {\n provider: \"posthog\";\n}\n\nexport type AgentServerUIAnalyticsConfig =\n | AgentServerUIPostHogAnalyticsConfig\n | false\n | null;\n\nexport const DEFAULT_AGENT_SERVER_ANALYTICS: AgentServerUIAnalyticsConfig = {\n provider: \"posthog\",\n};\n\nexport interface AgentServerUIProvidersProps extends Pick<\n AgentServerUIRootProps,\n \"className\" | \"contentClassName\" | \"style\" | \"styleOverrides\" | \"theme\"\n> {\n children: React.ReactNode;\n queryClient?: QueryClient;\n analytics?: AgentServerUIAnalyticsConfig;\n i18n?: I18nInstance;\n withStyleRoot?: boolean;\n}\n\n/**\n * Fetches the DB-driven free / default model flags once and mirrors them into\n * the free-models store. Rendered inside the query provider so leaf components\n * can read the flags synchronously without a QueryClientProvider in scope.\n */\nfunction FreeModelsHydrator() {\n useHydrateFreeModels();\n return null;\n}\n\nexport function AgentServerUIProviders({\n children,\n queryClient,\n analytics,\n i18n,\n className,\n contentClassName,\n style,\n styleOverrides,\n theme,\n withStyleRoot = true,\n}: AgentServerUIProvidersProps) {\n const resolvedQueryClient = React.useMemo(\n () => queryClient ?? getDefaultQueryClient(),\n [queryClient],\n );\n const resolvedI18n = React.useMemo(() => i18n ?? getDefaultI18n(), [i18n]);\n const previousProvidersRef = React.useRef<{\n queryClient: QueryClient;\n i18n: I18nInstance;\n } | null>(null);\n\n if (!previousProvidersRef.current) {\n previousProvidersRef.current = {\n queryClient: getQueryClient(),\n i18n: getI18n(),\n };\n }\n\n setQueryClient(resolvedQueryClient);\n setI18n(resolvedI18n);\n\n React.useEffect(\n () => () => {\n if (previousProvidersRef.current) {\n setQueryClient(previousProvidersRef.current.queryClient);\n setI18n(previousProvidersRef.current.i18n);\n }\n },\n [],\n );\n\n const posthogConfig =\n analytics && analytics.provider === \"posthog\"\n ? {\n apiKey: analytics.apiKey,\n apiHost: analytics.apiHost,\n uiHost: analytics.uiHost,\n }\n : false;\n const content = (\n <TelemetryProvider config={posthogConfig}>\n <FreeModelsHydrator />\n {children}\n </TelemetryProvider>\n );\n\n const wrappedContent = withStyleRoot ? (\n <AgentServerUIRoot\n className={className}\n contentClassName={contentClassName}\n style={style}\n styleOverrides={styleOverrides}\n theme={theme}\n >\n {content}\n </AgentServerUIRoot>\n ) : (\n content\n );\n\n return (\n <I18nextProvider i18n={resolvedI18n} defaultNS={OPENHANDS_I18N_NAMESPACE}>\n <QueryClientProvider client={resolvedQueryClient}>\n <ActiveBackendProvider>{wrappedContent}</ActiveBackendProvider>\n </QueryClientProvider>\n </I18nextProvider>\n );\n}\n"],"mappings":"6iBAiCA,IAAa,EAA+D,CAC1E,SAAU,SACZ,EAkBA,SAAS,GAAqB,CAE5B,OADA,EAAA,qBAAqB,EACd,IACT,CAEA,SAAgB,EAAuB,CACrC,WACA,cACA,YACA,OACA,YACA,mBACA,QACA,iBACA,QACA,gBAAgB,IACc,CAC9B,IAAM,EAAsB,EAAA,QAAM,YAC1B,GAAe,EAAA,sBAAsB,EAC3C,CAAC,CAAW,CACd,EACM,EAAe,EAAA,QAAM,YAAc,GAAQ,EAAA,eAAe,EAAG,CAAC,CAAI,CAAC,EACnE,EAAuB,EAAA,QAAM,OAGzB,IAAI,EAEd,AACE,EAAqB,UAAU,CAC7B,YAAa,EAAA,eAAe,EAC5B,KAAM,EAAA,QAAQ,CAChB,EAGF,EAAA,eAAe,CAAmB,EAClC,EAAA,QAAQ,CAAY,EAEpB,EAAA,QAAM,kBACQ,CACN,EAAqB,UACvB,EAAA,eAAe,EAAqB,QAAQ,WAAW,EACvD,EAAA,QAAQ,EAAqB,QAAQ,IAAI,EAE7C,EACA,CAAC,CACH,EAUA,IAAM,GACJ,EAAA,EAAA,MAAC,EAAA,kBAAD,CAAmB,OARnB,GAAa,EAAU,WAAa,UAChC,CACE,OAAQ,EAAU,OAClB,QAAS,EAAU,QACnB,OAAQ,EAAU,MACpB,EACA,YAEJ,EACE,EAAA,EAAA,KAAC,EAAD,CAAqB,CAAA,EACpB,CACgB,IAiBrB,OACE,EAAA,EAAA,KAAC,EAAA,gBAAD,CAAiB,KAAM,EAAc,UAAW,EAAA,mCAC9C,EAAA,EAAA,KAAC,EAAA,oBAAD,CAAqB,OAAQ,YAC3B,EAAA,EAAA,KAAC,EAAA,sBAAD,CAAA,SAjBiB,GACrB,EAAA,EAAA,KAAC,EAAA,kBAAD,CACa,YACO,mBACX,QACS,iBACT,iBAEN,CACgB,CAAA,EAEnB,CAMkE,CAAA,CAC3C,CAAA,CACN,CAAA,CAErB"}
|
|
@@ -3,45 +3,49 @@ import { QueryClientProvider as t } from "../../node_modules/@tanstack/react-que
|
|
|
3
3
|
import { OPENHANDS_I18N_NAMESPACE as n, getDefaultI18n as r, getI18n as i, setI18n as a } from "../../i18n/index.js";
|
|
4
4
|
import { getDefaultQueryClient as o, getQueryClient as s, setQueryClient as c } from "../../query-client-config.js";
|
|
5
5
|
import { ActiveBackendProvider as l } from "../../contexts/active-backend-context.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import f from "
|
|
9
|
-
import
|
|
6
|
+
import { useHydrateFreeModels as u } from "../../hooks/query/use-free-models.js";
|
|
7
|
+
import { TelemetryProvider as d } from "./telemetry-provider.js";
|
|
8
|
+
import { AgentServerUIRoot as f } from "./agent-server-ui-root.js";
|
|
9
|
+
import p from "react";
|
|
10
|
+
import { jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
10
11
|
//#region src/components/providers/agent-server-ui-providers.tsx
|
|
11
|
-
var
|
|
12
|
-
function
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
var g = { provider: "posthog" };
|
|
13
|
+
function _() {
|
|
14
|
+
return u(), null;
|
|
15
|
+
}
|
|
16
|
+
function v({ children: u, queryClient: g, analytics: v, i18n: y, className: b, contentClassName: x, style: S, styleOverrides: C, theme: w, withStyleRoot: T = !0 }) {
|
|
17
|
+
let E = p.useMemo(() => g ?? o(), [g]), D = p.useMemo(() => y ?? r(), [y]), O = p.useRef(null);
|
|
18
|
+
O.current ||= {
|
|
15
19
|
queryClient: s(),
|
|
16
20
|
i18n: i()
|
|
17
|
-
}, c(
|
|
18
|
-
|
|
21
|
+
}, c(E), a(D), p.useEffect(() => () => {
|
|
22
|
+
O.current && (c(O.current.queryClient), a(O.current.i18n));
|
|
19
23
|
}, []);
|
|
20
|
-
let
|
|
21
|
-
config:
|
|
22
|
-
apiKey:
|
|
23
|
-
apiHost:
|
|
24
|
-
uiHost:
|
|
24
|
+
let k = /* @__PURE__ */ h(d, {
|
|
25
|
+
config: v && v.provider === "posthog" ? {
|
|
26
|
+
apiKey: v.apiKey,
|
|
27
|
+
apiHost: v.apiHost,
|
|
28
|
+
uiHost: v.uiHost
|
|
25
29
|
} : !1,
|
|
26
|
-
children: m
|
|
30
|
+
children: [/* @__PURE__ */ m(_, {}), u]
|
|
27
31
|
});
|
|
28
|
-
return /* @__PURE__ */
|
|
29
|
-
i18n:
|
|
32
|
+
return /* @__PURE__ */ m(e, {
|
|
33
|
+
i18n: D,
|
|
30
34
|
defaultNS: n,
|
|
31
|
-
children: /* @__PURE__ */
|
|
32
|
-
client:
|
|
33
|
-
children: /* @__PURE__ */
|
|
34
|
-
className:
|
|
35
|
-
contentClassName:
|
|
36
|
-
style:
|
|
37
|
-
styleOverrides:
|
|
38
|
-
theme:
|
|
39
|
-
children:
|
|
40
|
-
}) :
|
|
35
|
+
children: /* @__PURE__ */ m(t, {
|
|
36
|
+
client: E,
|
|
37
|
+
children: /* @__PURE__ */ m(l, { children: T ? /* @__PURE__ */ m(f, {
|
|
38
|
+
className: b,
|
|
39
|
+
contentClassName: x,
|
|
40
|
+
style: S,
|
|
41
|
+
styleOverrides: C,
|
|
42
|
+
theme: w,
|
|
43
|
+
children: k
|
|
44
|
+
}) : k })
|
|
41
45
|
})
|
|
42
46
|
});
|
|
43
47
|
}
|
|
44
48
|
//#endregion
|
|
45
|
-
export {
|
|
49
|
+
export { v as AgentServerUIProviders, g as DEFAULT_AGENT_SERVER_ANALYTICS };
|
|
46
50
|
|
|
47
51
|
//# sourceMappingURL=agent-server-ui-providers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-server-ui-providers.js","names":[],"sources":["../../../src/components/providers/agent-server-ui-providers.tsx"],"sourcesContent":["import React from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { I18nextProvider } from \"react-i18next\";\nimport { type i18n as I18nInstance } from \"i18next\";\nimport {\n getDefaultQueryClient,\n getQueryClient,\n setQueryClient,\n} from \"#/query-client-config\";\nimport {\n OPENHANDS_I18N_NAMESPACE,\n getDefaultI18n,\n getI18n,\n setI18n,\n} from \"#/i18n\";\nimport { ActiveBackendProvider } from \"#/contexts/active-backend-context\";\nimport type { TelemetryConfig } from \"#/services/telemetry\";\nimport { TelemetryProvider } from \"./telemetry-provider\";\nimport {\n AgentServerUIRoot,\n type AgentServerUIRootProps,\n} from \"./agent-server-ui-root\";\n\nexport interface AgentServerUIPostHogAnalyticsConfig extends TelemetryConfig {\n provider: \"posthog\";\n}\n\nexport type AgentServerUIAnalyticsConfig =\n | AgentServerUIPostHogAnalyticsConfig\n | false\n | null;\n\nexport const DEFAULT_AGENT_SERVER_ANALYTICS: AgentServerUIAnalyticsConfig = {\n provider: \"posthog\",\n};\n\nexport interface AgentServerUIProvidersProps extends Pick<\n AgentServerUIRootProps,\n \"className\" | \"contentClassName\" | \"style\" | \"styleOverrides\" | \"theme\"\n> {\n children: React.ReactNode;\n queryClient?: QueryClient;\n analytics?: AgentServerUIAnalyticsConfig;\n i18n?: I18nInstance;\n withStyleRoot?: boolean;\n}\n\nexport function AgentServerUIProviders({\n children,\n queryClient,\n analytics,\n i18n,\n className,\n contentClassName,\n style,\n styleOverrides,\n theme,\n withStyleRoot = true,\n}: AgentServerUIProvidersProps) {\n const resolvedQueryClient = React.useMemo(\n () => queryClient ?? getDefaultQueryClient(),\n [queryClient],\n );\n const resolvedI18n = React.useMemo(() => i18n ?? getDefaultI18n(), [i18n]);\n const previousProvidersRef = React.useRef<{\n queryClient: QueryClient;\n i18n: I18nInstance;\n } | null>(null);\n\n if (!previousProvidersRef.current) {\n previousProvidersRef.current = {\n queryClient: getQueryClient(),\n i18n: getI18n(),\n };\n }\n\n setQueryClient(resolvedQueryClient);\n setI18n(resolvedI18n);\n\n React.useEffect(\n () => () => {\n if (previousProvidersRef.current) {\n setQueryClient(previousProvidersRef.current.queryClient);\n setI18n(previousProvidersRef.current.i18n);\n }\n },\n [],\n );\n\n const posthogConfig =\n analytics && analytics.provider === \"posthog\"\n ? {\n apiKey: analytics.apiKey,\n apiHost: analytics.apiHost,\n uiHost: analytics.uiHost,\n }\n : false;\n const content = (\n <TelemetryProvider config={posthogConfig}
|
|
1
|
+
{"version":3,"file":"agent-server-ui-providers.js","names":[],"sources":["../../../src/components/providers/agent-server-ui-providers.tsx"],"sourcesContent":["import React from \"react\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { I18nextProvider } from \"react-i18next\";\nimport { type i18n as I18nInstance } from \"i18next\";\nimport {\n getDefaultQueryClient,\n getQueryClient,\n setQueryClient,\n} from \"#/query-client-config\";\nimport {\n OPENHANDS_I18N_NAMESPACE,\n getDefaultI18n,\n getI18n,\n setI18n,\n} from \"#/i18n\";\nimport { ActiveBackendProvider } from \"#/contexts/active-backend-context\";\nimport { useHydrateFreeModels } from \"#/hooks/query/use-free-models\";\nimport type { TelemetryConfig } from \"#/services/telemetry\";\nimport { TelemetryProvider } from \"./telemetry-provider\";\nimport {\n AgentServerUIRoot,\n type AgentServerUIRootProps,\n} from \"./agent-server-ui-root\";\n\nexport interface AgentServerUIPostHogAnalyticsConfig extends TelemetryConfig {\n provider: \"posthog\";\n}\n\nexport type AgentServerUIAnalyticsConfig =\n | AgentServerUIPostHogAnalyticsConfig\n | false\n | null;\n\nexport const DEFAULT_AGENT_SERVER_ANALYTICS: AgentServerUIAnalyticsConfig = {\n provider: \"posthog\",\n};\n\nexport interface AgentServerUIProvidersProps extends Pick<\n AgentServerUIRootProps,\n \"className\" | \"contentClassName\" | \"style\" | \"styleOverrides\" | \"theme\"\n> {\n children: React.ReactNode;\n queryClient?: QueryClient;\n analytics?: AgentServerUIAnalyticsConfig;\n i18n?: I18nInstance;\n withStyleRoot?: boolean;\n}\n\n/**\n * Fetches the DB-driven free / default model flags once and mirrors them into\n * the free-models store. Rendered inside the query provider so leaf components\n * can read the flags synchronously without a QueryClientProvider in scope.\n */\nfunction FreeModelsHydrator() {\n useHydrateFreeModels();\n return null;\n}\n\nexport function AgentServerUIProviders({\n children,\n queryClient,\n analytics,\n i18n,\n className,\n contentClassName,\n style,\n styleOverrides,\n theme,\n withStyleRoot = true,\n}: AgentServerUIProvidersProps) {\n const resolvedQueryClient = React.useMemo(\n () => queryClient ?? getDefaultQueryClient(),\n [queryClient],\n );\n const resolvedI18n = React.useMemo(() => i18n ?? getDefaultI18n(), [i18n]);\n const previousProvidersRef = React.useRef<{\n queryClient: QueryClient;\n i18n: I18nInstance;\n } | null>(null);\n\n if (!previousProvidersRef.current) {\n previousProvidersRef.current = {\n queryClient: getQueryClient(),\n i18n: getI18n(),\n };\n }\n\n setQueryClient(resolvedQueryClient);\n setI18n(resolvedI18n);\n\n React.useEffect(\n () => () => {\n if (previousProvidersRef.current) {\n setQueryClient(previousProvidersRef.current.queryClient);\n setI18n(previousProvidersRef.current.i18n);\n }\n },\n [],\n );\n\n const posthogConfig =\n analytics && analytics.provider === \"posthog\"\n ? {\n apiKey: analytics.apiKey,\n apiHost: analytics.apiHost,\n uiHost: analytics.uiHost,\n }\n : false;\n const content = (\n <TelemetryProvider config={posthogConfig}>\n <FreeModelsHydrator />\n {children}\n </TelemetryProvider>\n );\n\n const wrappedContent = withStyleRoot ? (\n <AgentServerUIRoot\n className={className}\n contentClassName={contentClassName}\n style={style}\n styleOverrides={styleOverrides}\n theme={theme}\n >\n {content}\n </AgentServerUIRoot>\n ) : (\n content\n );\n\n return (\n <I18nextProvider i18n={resolvedI18n} defaultNS={OPENHANDS_I18N_NAMESPACE}>\n <QueryClientProvider client={resolvedQueryClient}>\n <ActiveBackendProvider>{wrappedContent}</ActiveBackendProvider>\n </QueryClientProvider>\n </I18nextProvider>\n );\n}\n"],"mappings":";;;;;;;;;;;AAiCA,IAAa,IAA+D,EAC1E,UAAU,UACZ;AAkBA,SAAS,IAAqB;CAE5B,OADA,EAAqB,GACd;AACT;AAEA,SAAgB,EAAuB,EACrC,aACA,gBACA,cACA,SACA,cACA,qBACA,UACA,mBACA,UACA,mBAAgB,MACc;CAC9B,IAAM,IAAsB,EAAM,cAC1B,KAAe,EAAsB,GAC3C,CAAC,CAAW,CACd,GACM,IAAe,EAAM,cAAc,KAAQ,EAAe,GAAG,CAAC,CAAI,CAAC,GACnE,IAAuB,EAAM,OAGzB,IAAI;CAYd,AAVA,AACE,EAAqB,YAAU;EAC7B,aAAa,EAAe;EAC5B,MAAM,EAAQ;CAChB,GAGF,EAAe,CAAmB,GAClC,EAAQ,CAAY,GAEpB,EAAM,sBACQ;EACV,AAAI,EAAqB,YACvB,EAAe,EAAqB,QAAQ,WAAW,GACvD,EAAQ,EAAqB,QAAQ,IAAI;CAE7C,GACA,CAAC,CACH;CAUA,IAAM,IACJ,kBAAC,GAAD;EAAmB,QARnB,KAAa,EAAU,aAAa,YAChC;GACE,QAAQ,EAAU;GAClB,SAAS,EAAU;GACnB,QAAQ,EAAU;EACpB,IACA;YAEJ,CACE,kBAAC,GAAD,CAAqB,CAAA,GACpB,CACgB;;CAiBrB,OACE,kBAAC,GAAD;EAAiB,MAAM;EAAc,WAAW;YAC9C,kBAAC,GAAD;GAAqB,QAAQ;aAC3B,kBAAC,GAAD,EAAA,UAjBiB,IACrB,kBAAC,GAAD;IACa;IACO;IACX;IACS;IACT;cAEN;GACgB,CAAA,IAEnB,EAMkE,CAAA;EAC3C,CAAA;CACN,CAAA;AAErB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../utils/utils.cjs"),t=require("../../../icons/close.cjs");let n=require("react/jsx-runtime");function r({onClick:r,className:i}){return(0,n.jsx)(`button`,{type:`button`,onClick:r,className:e.cn(`bg-[var(--oh-muted)] rounded-full w-5 h-5 flex items-center justify-center cursor-pointer`,i),children:(0,n.jsx)(t.default,{width:18,height:18})})}exports.RemoveButton=r;
|
|
1
|
+
require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../utils/utils.cjs"),t=require("../../../icons/close.cjs");let n=require("react/jsx-runtime");function r({onClick:r,className:i,"aria-label":a}){return(0,n.jsx)(`button`,{type:`button`,onClick:r,"aria-label":a,className:e.cn(`bg-[var(--oh-muted)] rounded-full w-5 h-5 flex items-center justify-center cursor-pointer`,i),children:(0,n.jsx)(t.default,{width:18,height:18})})}exports.RemoveButton=r;
|
|
2
2
|
//# sourceMappingURL=remove-button.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove-button.cjs","names":[],"sources":["../../../../src/components/shared/buttons/remove-button.tsx"],"sourcesContent":["import { cn } from \"#/utils/utils\";\nimport CloseIcon from \"#/icons/close.svg?react\";\n\ninterface RemoveButtonProps {\n onClick: () => void;\n className?: React.HTMLAttributes<HTMLDivElement>[\"className\"];\n}\n\nexport function RemoveButton({
|
|
1
|
+
{"version":3,"file":"remove-button.cjs","names":[],"sources":["../../../../src/components/shared/buttons/remove-button.tsx"],"sourcesContent":["import { cn } from \"#/utils/utils\";\nimport CloseIcon from \"#/icons/close.svg?react\";\n\ninterface RemoveButtonProps {\n onClick: () => void;\n className?: React.HTMLAttributes<HTMLDivElement>[\"className\"];\n \"aria-label\"?: string;\n}\n\nexport function RemoveButton({\n onClick,\n className,\n \"aria-label\": ariaLabel,\n}: RemoveButtonProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={ariaLabel}\n className={cn(\n \"bg-[var(--oh-muted)] rounded-full w-5 h-5 flex items-center justify-center cursor-pointer\",\n className,\n )}\n >\n <CloseIcon width={18} height={18} />\n </button>\n );\n}\n"],"mappings":"wKASA,SAAgB,EAAa,CAC3B,UACA,YACA,aAAc,GACM,CACpB,OACE,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACI,UACT,aAAY,EACZ,UAAW,EAAA,GACT,4FACA,CACF,YAEA,EAAA,EAAA,KAAC,EAAA,QAAD,CAAW,MAAO,GAAI,OAAQ,EAAK,CAAA,CAC7B,CAAA,CAEZ"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
interface RemoveButtonProps {
|
|
2
2
|
onClick: () => void;
|
|
3
3
|
className?: React.HTMLAttributes<HTMLDivElement>["className"];
|
|
4
|
+
"aria-label"?: string;
|
|
4
5
|
}
|
|
5
|
-
export declare function RemoveButton({ onClick, className }: RemoveButtonProps): import("react").JSX.Element;
|
|
6
|
+
export declare function RemoveButton({ onClick, className, "aria-label": ariaLabel, }: RemoveButtonProps): import("react").JSX.Element;
|
|
6
7
|
export {};
|
|
@@ -2,10 +2,11 @@ import { cn as e } from "../../../utils/utils.js";
|
|
|
2
2
|
import t from "../../../icons/close.js";
|
|
3
3
|
import { jsx as n } from "react/jsx-runtime";
|
|
4
4
|
//#region src/components/shared/buttons/remove-button.tsx
|
|
5
|
-
function r({ onClick: r, className: i }) {
|
|
5
|
+
function r({ onClick: r, className: i, "aria-label": a }) {
|
|
6
6
|
return /* @__PURE__ */ n("button", {
|
|
7
7
|
type: "button",
|
|
8
8
|
onClick: r,
|
|
9
|
+
"aria-label": a,
|
|
9
10
|
className: e("bg-[var(--oh-muted)] rounded-full w-5 h-5 flex items-center justify-center cursor-pointer", i),
|
|
10
11
|
children: /* @__PURE__ */ n(t, {
|
|
11
12
|
width: 18,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove-button.js","names":[],"sources":["../../../../src/components/shared/buttons/remove-button.tsx"],"sourcesContent":["import { cn } from \"#/utils/utils\";\nimport CloseIcon from \"#/icons/close.svg?react\";\n\ninterface RemoveButtonProps {\n onClick: () => void;\n className?: React.HTMLAttributes<HTMLDivElement>[\"className\"];\n}\n\nexport function RemoveButton({
|
|
1
|
+
{"version":3,"file":"remove-button.js","names":[],"sources":["../../../../src/components/shared/buttons/remove-button.tsx"],"sourcesContent":["import { cn } from \"#/utils/utils\";\nimport CloseIcon from \"#/icons/close.svg?react\";\n\ninterface RemoveButtonProps {\n onClick: () => void;\n className?: React.HTMLAttributes<HTMLDivElement>[\"className\"];\n \"aria-label\"?: string;\n}\n\nexport function RemoveButton({\n onClick,\n className,\n \"aria-label\": ariaLabel,\n}: RemoveButtonProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={ariaLabel}\n className={cn(\n \"bg-[var(--oh-muted)] rounded-full w-5 h-5 flex items-center justify-center cursor-pointer\",\n className,\n )}\n >\n <CloseIcon width={18} height={18} />\n </button>\n );\n}\n"],"mappings":";;;;AASA,SAAgB,EAAa,EAC3B,YACA,cACA,cAAc,KACM;CACpB,OACE,kBAAC,UAAD;EACE,MAAK;EACI;EACT,cAAY;EACZ,WAAW,EACT,6FACA,CACF;YAEA,kBAAC,GAAD;GAAW,OAAO;GAAI,QAAQ;EAAK,CAAA;CAC7B,CAAA;AAEZ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../i18n/declaration.cjs"),n=require("../../node_modules/lucide-react/dist/esm/icons/info.cjs");let r=require("react/jsx-runtime");function i({modelIds:i}){let{t:a}=e.useTranslation(`openhands`);return(0,r.jsxs)(`p`,{"data-testid":`openhands-free-models-note`,className:`flex items-start gap-2 text-xs text-warning`,children:[(0,r.jsx)(n.Info,{className:`mt-0.5 size-4 shrink-0 text-warning`,"aria-hidden":!0}),(0,r.jsx)(`span`,{children:a(t.I18nKey.SETTINGS$OPENHANDS_FREE_MODELS_NOTE,{ids:[...i].join(`, `)})})]})}exports.FreeOpenHandsModelsNote=i;
|
|
2
|
+
//# sourceMappingURL=free-models-note.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"free-models-note.cjs","names":[],"sources":["../../../src/components/shared/free-models-note.tsx"],"sourcesContent":["import { Info } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\n\nexport function FreeOpenHandsModelsNote({\n modelIds,\n}: {\n modelIds: Iterable<string>;\n}) {\n const { t } = useTranslation(\"openhands\");\n\n return (\n <p\n data-testid=\"openhands-free-models-note\"\n className=\"flex items-start gap-2 text-xs text-warning\"\n >\n <Info className=\"mt-0.5 size-4 shrink-0 text-warning\" aria-hidden />\n <span>\n {t(I18nKey.SETTINGS$OPENHANDS_FREE_MODELS_NOTE, {\n ids: [...modelIds].join(\", \"),\n })}\n </span>\n </p>\n );\n}\n"],"mappings":"+QAIA,SAAgB,EAAwB,CACtC,YAGC,CACD,GAAM,CAAE,KAAM,EAAA,eAAe,WAAW,EAExC,OACE,EAAA,EAAA,MAAC,IAAD,CACE,cAAY,6BACZ,UAAU,uDAFZ,EAIE,EAAA,EAAA,KAAC,EAAA,KAAD,CAAM,UAAU,sCAAsC,cAAA,EAAa,CAAA,GACnE,EAAA,EAAA,KAAC,OAAD,CAAA,SACG,EAAE,EAAA,QAAQ,oCAAqC,CAC9C,IAAK,CAAC,GAAG,CAAQ,EAAE,KAAK,IAAI,CAC9B,CAAC,CACG,CAAA,CACL,GAEP"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { useTranslation as e } from "../../node_modules/react-i18next/dist/es/useTranslation.js";
|
|
2
|
+
import { I18nKey as t } from "../../i18n/declaration.js";
|
|
3
|
+
import { Info as n } from "../../node_modules/lucide-react/dist/esm/icons/info.js";
|
|
4
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
5
|
+
//#region src/components/shared/free-models-note.tsx
|
|
6
|
+
function a({ modelIds: a }) {
|
|
7
|
+
let { t: o } = e("openhands");
|
|
8
|
+
return /* @__PURE__ */ i("p", {
|
|
9
|
+
"data-testid": "openhands-free-models-note",
|
|
10
|
+
className: "flex items-start gap-2 text-xs text-warning",
|
|
11
|
+
children: [/* @__PURE__ */ r(n, {
|
|
12
|
+
className: "mt-0.5 size-4 shrink-0 text-warning",
|
|
13
|
+
"aria-hidden": !0
|
|
14
|
+
}), /* @__PURE__ */ r("span", { children: o(t.SETTINGS$OPENHANDS_FREE_MODELS_NOTE, { ids: [...a].join(", ") }) })]
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { a as FreeOpenHandsModelsNote };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=free-models-note.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"free-models-note.js","names":[],"sources":["../../../src/components/shared/free-models-note.tsx"],"sourcesContent":["import { Info } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport { I18nKey } from \"#/i18n/declaration\";\n\nexport function FreeOpenHandsModelsNote({\n modelIds,\n}: {\n modelIds: Iterable<string>;\n}) {\n const { t } = useTranslation(\"openhands\");\n\n return (\n <p\n data-testid=\"openhands-free-models-note\"\n className=\"flex items-start gap-2 text-xs text-warning\"\n >\n <Info className=\"mt-0.5 size-4 shrink-0 text-warning\" aria-hidden />\n <span>\n {t(I18nKey.SETTINGS$OPENHANDS_FREE_MODELS_NOTE, {\n ids: [...modelIds].join(\", \"),\n })}\n </span>\n </p>\n );\n}\n"],"mappings":";;;;;AAIA,SAAgB,EAAwB,EACtC,eAGC;CACD,IAAM,EAAE,SAAM,EAAe,WAAW;CAExC,OACE,kBAAC,KAAD;EACE,eAAY;EACZ,WAAU;YAFZ,CAIE,kBAAC,GAAD;GAAM,WAAU;GAAsC,eAAA;EAAa,CAAA,GACnE,kBAAC,QAAD,EAAA,UACG,EAAE,EAAQ,qCAAqC,EAC9C,KAAK,CAAC,GAAG,CAAQ,EAAE,KAAK,IAAI,EAC9B,CAAC,EACG,CAAA,CACL;;AAEP"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),n=require("../../../../i18n/declaration.cjs"),r=require("../../../../
|
|
1
|
+
const e=require("../../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),n=require("../../../../i18n/declaration.cjs"),r=require("../../../../utils/constants.cjs"),i=require("../../../../utils/utils.cjs"),a=require("../../../../node_modules/@heroui/listbox/dist/chunk-BJFJ4DRR.cjs"),o=require("../../../../node_modules/@heroui/listbox/dist/chunk-ANTZPR32.cjs"),s=require("../../../../node_modules/@heroui/autocomplete/dist/chunk-3QKDXXDY.cjs"),c=require("../../../../utils/form-control-classes.cjs"),l=require("../../../../utils/format-model-name.cjs"),u=require("../../../../ui/combobox-caret.cjs"),d=require("../../../../utils/map-provider.cjs"),f=require("../../../../utils/extract-model-and-provider.cjs"),p=require("../../../../ui/help-link.cjs"),m=require("../../../../hooks/query/use-search-providers.cjs"),h=require("../../../../hooks/query/use-provider-models.cjs"),g=require("../../free-models-note.cjs");let _=require("react");_=e.__toESM(_,1);let v=require("react/jsx-runtime");var y=`shrink-0 rounded-full border border-warning/40 bg-warning/10 px-1.5 py-0.5 text-[10px] leading-none text-warning`;function b({isDisabled:e,currentModel:b,onChange:x,onDefaultValuesChanged:S,wrapperClassName:C,labelClassName:w}){let[,T]=_.default.useState(null),[E,D]=_.default.useState(null),[O,k]=_.default.useState(null),{data:A=[]}=m.useSearchProviders(),{data:j=[],isLoading:M,error:N}=h.useProviderModels(E),P=_.default.useMemo(()=>A.filter(e=>e.verified),[A]),F=_.default.useMemo(()=>A.filter(e=>!e.verified),[A]),I=_.default.useMemo(()=>j.filter(e=>e.verified),[j]),L=_.default.useMemo(()=>j.filter(e=>!e.verified),[j]),R=_.default.useMemo(()=>j.filter(e=>e.free).map(e=>e.name),[j]),z=_.default.useMemo(()=>new Set(R),[R]);_.default.useEffect(()=>{if(b){let{provider:e,model:t}=f.extractModelAndProvider(b);T(b),D(e||null),k(t),S?.(e||null,t)}},[b]);let B=e=>{D(e),k(null),T(`${e}/`),x?.(e,null)},V=e=>{let t=`${E}/${e}`;E===`openai`&&(t=e),T(t),k(e),x?.(E,e)},H=()=>{D(null),T(null)},U=!!(O&&z.has(O)),W=_.default.useRef(null),[G,K]=_.default.useState(0);_.default.useLayoutEffect(()=>{if(!U||!W.current){K(0);return}let e=()=>{K(Math.ceil(W.current?.getBoundingClientRect().width??0))};if(e(),typeof ResizeObserver>`u`)return;let t=new ResizeObserver(e);return t.observe(W.current),()=>t.disconnect()},[U,O]);let{t:q}=t.useTranslation(`openhands`);return(0,v.jsxs)(`div`,{className:i.cn(`flex flex-col md:flex-row w-full min-w-0 justify-between gap-4 md:gap-[46px]`,C),children:[(0,v.jsxs)(`fieldset`,{className:`flex flex-col gap-2.5 w-full`,children:[(0,v.jsx)(`label`,{className:i.cn(`text-sm`,w),children:q(n.I18nKey.LLM$PROVIDER)}),(0,v.jsxs)(s.autocomplete_default,{"data-testid":`llm-provider-input`,isRequired:!0,isVirtualized:!1,name:`llm-provider-input`,isDisabled:e,"aria-label":q(n.I18nKey.LLM$PROVIDER),isClearable:!1,onSelectionChange:e=>{e?.toString()&&B(e.toString())},onInputChange:e=>!e&&H(),defaultSelectedKey:E??void 0,selectedKey:E,classNames:{popoverContent:`bg-content1 rounded-xl border border-[var(--oh-border)]`,selectorButton:u.heroUiAutocompleteSelectorButtonClassName},selectorButtonProps:{disableRipple:!0},inputProps:{classNames:{inputWrapper:c.formControlSettingsFieldClassName}},children:[(0,v.jsx)(o.listbox_section_base_default,{title:q(n.I18nKey.MODEL_SELECTOR$VERIFIED),classNames:{heading:`text-[var(--oh-muted)]`},children:P.map(e=>(0,v.jsx)(a.listbox_item_base_default,{"data-testid":`provider-item-${e.name}`,children:d.mapProvider(e.name)},e.name))}),F.length>0?(0,v.jsx)(o.listbox_section_base_default,{title:q(n.I18nKey.MODEL_SELECTOR$OTHERS),classNames:{heading:`text-[var(--oh-muted)]`},children:F.map(e=>(0,v.jsx)(a.listbox_item_base_default,{children:d.mapProvider(e.name)},e.name))}):null]})]}),E===`openhands`&&(0,v.jsx)(`div`,{className:`flex flex-col gap-2`,children:(0,v.jsx)(p.HelpLink,{testId:`openhands-account-help`,text:q(n.I18nKey.SETTINGS$NEED_OPENHANDS_ACCOUNT),linkText:q(n.I18nKey.SETTINGS$CLICK_HERE),href:r.PRODUCT_URL.PRODUCTION,size:`settings`,linkColor:`white`})}),(0,v.jsxs)(`fieldset`,{className:`flex flex-col gap-2.5 w-full`,children:[(0,v.jsx)(`label`,{className:i.cn(`text-sm`,w),children:q(n.I18nKey.LLM$MODEL)}),(0,v.jsxs)(`div`,{className:`relative`,children:[(0,v.jsxs)(s.autocomplete_default,{"data-testid":`llm-model-input`,isRequired:!0,isVirtualized:!1,isLoading:M,name:`llm-model-input`,"aria-label":q(n.I18nKey.LLM$MODEL),isClearable:!1,onSelectionChange:e=>{e?.toString()&&V(e.toString())},isDisabled:e||!E,selectedKey:O,defaultSelectedKey:O??void 0,classNames:{popoverContent:`bg-content1 rounded-xl border border-[var(--oh-border)]`,selectorButton:u.heroUiAutocompleteSelectorButtonClassName},selectorButtonProps:{disableRipple:!0},inputProps:{classNames:{inputWrapper:c.formControlSettingsFieldClassName}},children:[(0,v.jsx)(o.listbox_section_base_default,{title:q(n.I18nKey.MODEL_SELECTOR$VERIFIED),classNames:{heading:`text-[var(--oh-muted)]`},children:I.map(e=>(0,v.jsx)(a.listbox_item_base_default,{textValue:e.name,children:(0,v.jsxs)(`span`,{className:`flex min-w-0 items-center gap-2`,children:[(0,v.jsx)(`span`,{className:`truncate`,children:e.name}),e.free?(0,v.jsx)(`span`,{className:y,children:l.FREE_MODEL_BADGE_LABEL}):null]})},e.name))}),L.length>0?(0,v.jsx)(o.listbox_section_base_default,{title:q(n.I18nKey.MODEL_SELECTOR$OTHERS),classNames:{heading:`text-[var(--oh-muted)]`},children:L.map(e=>(0,v.jsx)(a.listbox_item_base_default,{"data-testid":`model-item-${e.name}`,textValue:e.name,children:e.name},e.name))}):null]}),U&&O?(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`span`,{ref:W,className:`pointer-events-none absolute left-3 top-1/2 whitespace-pre text-sm opacity-0`,"aria-hidden":!0,children:O}),(0,v.jsx)(`span`,{"data-testid":`selected-free-model-badge`,className:i.cn(y,`pointer-events-none absolute top-1/2 z-10 -translate-y-1/2`),style:{left:`calc(0.75rem + ${G}px + 0.5rem)`},children:l.FREE_MODEL_BADGE_LABEL})]}):null]}),N&&(0,v.jsx)(`p`,{"data-testid":`models-error`,className:`text-danger text-xs`,children:q(n.I18nKey.CONFIGURATION$ERROR_FETCH_MODELS)}),E===`openhands`&&R.length>0?(0,v.jsx)(g.FreeOpenHandsModelsNote,{modelIds:R.map(e=>`${E}/${e}`)}):null]})]})}exports.ModelSelector=b;
|
|
2
2
|
//# sourceMappingURL=model-selector.cjs.map
|