@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
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { create as e } from "../node_modules/zustand/esm/react.js";
|
|
2
|
+
//#region src/stores/free-models-store.ts
|
|
3
|
+
var t = /* @__PURE__ */ new Set(), n = e()((e) => ({
|
|
4
|
+
freeModels: t,
|
|
5
|
+
defaultModel: null,
|
|
6
|
+
defaultModelReady: !1,
|
|
7
|
+
setFlags: (t) => e({
|
|
8
|
+
freeModels: t.freeModels,
|
|
9
|
+
defaultModel: t.defaultModel,
|
|
10
|
+
defaultModelReady: !0
|
|
11
|
+
}),
|
|
12
|
+
markDefaultModelReady: () => e({ defaultModelReady: !0 }),
|
|
13
|
+
resetFlags: () => e({
|
|
14
|
+
freeModels: t,
|
|
15
|
+
defaultModel: null,
|
|
16
|
+
defaultModelReady: !1
|
|
17
|
+
})
|
|
18
|
+
}));
|
|
19
|
+
//#endregion
|
|
20
|
+
export { n as useFreeModelsStore };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=free-models-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"free-models-store.js","names":[],"sources":["../../src/stores/free-models-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport type { FreeModelSet } from \"#/utils/format-model-name\";\n\ninterface FreeModelsState {\n /**\n * DB-driven set of free ``provider/model`` ids (the same channel that carries\n * `verified`). Empty on backends without free metadata (e.g. the local\n * agent-server), so consumers uniformly treat \"not in set\" as paid.\n */\n freeModels: FreeModelSet;\n /** DB-driven default OpenHands model id (``openhands/<model>``), or null. */\n defaultModel: string | null;\n /** True once the backend flags query has settled at least once. */\n defaultModelReady: boolean;\n}\n\ninterface FreeModelsActions {\n /**\n * Replaces the DB-driven flags. Called once by the app-level hydrator\n * ({@link useHydrateFreeModels}) after the backend model list is fetched, so\n * leaf components can read the flags synchronously via zustand selectors\n * without needing a QueryClientProvider in scope.\n */\n setFlags: (flags: {\n freeModels: FreeModelSet;\n defaultModel: string | null;\n }) => void;\n markDefaultModelReady: () => void;\n resetFlags: () => void;\n}\n\ntype FreeModelsStore = FreeModelsState & FreeModelsActions;\n\nconst EMPTY_FREE_MODELS: FreeModelSet = new Set<string>();\n\nexport const useFreeModelsStore = create<FreeModelsStore>()((set) => ({\n freeModels: EMPTY_FREE_MODELS,\n defaultModel: null,\n defaultModelReady: false,\n setFlags: (flags) =>\n set({\n freeModels: flags.freeModels,\n defaultModel: flags.defaultModel,\n defaultModelReady: true,\n }),\n markDefaultModelReady: () => set({ defaultModelReady: true }),\n resetFlags: () =>\n set({\n freeModels: EMPTY_FREE_MODELS,\n defaultModel: null,\n defaultModelReady: false,\n }),\n}));\n"],"mappings":";;AAiCA,IAAM,oBAAkC,IAAI,IAAY,GAE3C,IAAqB,EAAwB,GAAG,OAAS;CACpE,YAAY;CACZ,cAAc;CACd,mBAAmB;CACnB,WAAW,MACT,EAAI;EACF,YAAY,EAAM;EAClB,cAAc,EAAM;EACpB,mBAAmB;CACrB,CAAC;CACH,6BAA6B,EAAI,EAAE,mBAAmB,GAAK,CAAC;CAC5D,kBACE,EAAI;EACF,YAAY;EACZ,cAAc;EACd,mBAAmB;CACrB,CAAC;AACL,EAAE"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../_virtual/_rolldown/runtime.cjs");var e=`Free`,t={"openhands/deepseek-v4-flash":`OpenHands DeepSeek V4 Flash
|
|
1
|
+
require("../_virtual/_rolldown/runtime.cjs");var e=`Free`,t=` (free)`,n={"openhands/deepseek-v4-flash":`OpenHands DeepSeek V4 Flash`},r=new Set,i=e=>!!e?.startsWith(`openhands/`),a=(e,t=r)=>!!(e&&t.has(e));function o(e,n){return n?`${e}${t}`:e}function s(e,t=r){return e?o(e,a(e,t)):null}function c(e,t=r){if(!e)return null;let n=a(e,t);return o(e.split(`/`).pop()||e,n)}function l(e,t=r){return e?o(e in n?n[e]:e,a(e,t)):null}exports.FREE_MODEL_BADGE_LABEL=e,exports.formatModelNameForDisplay=s,exports.formatModelPillLabel=l,exports.formatNativeModelName=c,exports.isFreeOpenHandsModel=a,exports.isOpenHandsProviderModel=i;
|
|
2
2
|
//# sourceMappingURL=format-model-name.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-model-name.cjs","names":[],"sources":["../../src/utils/format-model-name.ts"],"sourcesContent":["export const FREE_MODEL_BADGE_LABEL = \"Free\";\n\nexport const FREE_OPENHANDS_MODELS = {\n \"openhands/deepseek-v4-flash\": \"OpenHands DeepSeek V4 Flash
|
|
1
|
+
{"version":3,"file":"format-model-name.cjs","names":[],"sources":["../../src/utils/format-model-name.ts"],"sourcesContent":["export const FREE_MODEL_BADGE_LABEL = \"Free\";\n\n/** Suffix appended to a display name for a DB-flagged free OpenHands model. */\nexport const FREE_MODEL_SUFFIX = \" (free)\";\n\n/**\n * Static pretty-print labels for OpenHands models known at build time. Free\n * status still comes only from the backend-provided `freeModels` set.\n */\nexport const FREE_OPENHANDS_MODELS = {\n \"openhands/deepseek-v4-flash\": \"OpenHands DeepSeek V4 Flash\",\n} as const;\n\nexport const FREE_OPENHANDS_MODEL_IDS = Object.keys(FREE_OPENHANDS_MODELS);\n\n/**\n * Set of free ``provider/model`` ids. The frontend no longer hardcodes which\n * OpenHands models are free — the set is sourced from the backend model list\n * (DB-driven), the same channel that carries `verified`. See\n * {@link useFreeModels}. Callers that lack the set treat every model as paid.\n */\nexport type FreeModelSet = ReadonlySet<string>;\n\nconst EMPTY_FREE_MODELS: FreeModelSet = new Set<string>();\n\n/**\n * Whether a model id routes through the OpenHands provider (the `openhands/`\n * prefix). On cloud the OpenHands provider is backed by a server-minted LLM\n * key rather than a user-supplied one, so callers use this to hide the inline\n * API key / base URL inputs and strip those fields from the save payload.\n */\nexport const isOpenHandsProviderModel = (\n model: string | null | undefined,\n): boolean => Boolean(model?.startsWith(\"openhands/\"));\n\nexport const isFreeOpenHandsModel = (\n model: string | null | undefined,\n freeModels: FreeModelSet = EMPTY_FREE_MODELS,\n): boolean => Boolean(model && freeModels.has(model));\n\nfunction appendFreeSuffix(display: string, isFree: boolean): string {\n return isFree ? `${display}${FREE_MODEL_SUFFIX}` : display;\n}\n\nexport function formatModelNameForDisplay(\n model: string | null | undefined,\n freeModels: FreeModelSet = EMPTY_FREE_MODELS,\n): string | null {\n if (!model) return null;\n return appendFreeSuffix(model, isFreeOpenHandsModel(model, freeModels));\n}\n\nexport function formatProviderModelNameForDisplay(\n provider: string | null | undefined,\n model: string | null | undefined,\n freeModels: FreeModelSet = EMPTY_FREE_MODELS,\n): string | null {\n if (!model) return null;\n const fullModel = provider ? `${provider}/${model}` : model;\n return appendFreeSuffix(model, isFreeOpenHandsModel(fullModel, freeModels));\n}\n\n/**\n * Format a native (OpenHands-kind) routing model string for display, stripping\n * the provider route prefix (e.g. ``\"anthropic/claude-sonnet-4-5-20250929\"`` →\n * ``\"claude-sonnet-4-5-20250929\"``, ``\"litellm_proxy/openai/gpt-4o\"`` →\n * ``\"gpt-4o\"``) so a conversation chip shows a meaningful model name rather than\n * the full routing path.\n *\n * Returns ``null`` for an empty/nullish input, and falls back to the original\n * string when stripping the prefix would leave nothing (e.g. a trailing slash)\n * — never an empty string, which would collapse the chip text.\n *\n * A DB-flagged free model (matched against ``freeModels`` on its full id) keeps\n * the free suffix so the chip still signals it is free.\n *\n * Display-only: unlike {@link deriveProfileNameFromModel} this does not sanitize\n * to an identifier, so it keeps the real model id intact for the chip.\n */\nexport function formatNativeModelName(\n model: string | null | undefined,\n freeModels: FreeModelSet = EMPTY_FREE_MODELS,\n): string | null {\n if (!model) return null;\n const isFree = isFreeOpenHandsModel(model, freeModels);\n const lastSegment = model.split(\"/\").pop();\n return appendFreeSuffix(lastSegment || model, isFree);\n}\n\n/**\n * Display label used by the LLM-profile picker sub-line. Looks up the model in\n * the static label table for a prettier name, but appends `(free)` only when the\n * backend-provided `freeModels` set marks the concrete model free.\n */\nexport function formatModelPillLabel(\n model: string | null | undefined,\n freeModels: FreeModelSet = EMPTY_FREE_MODELS,\n): string | null {\n if (!model) return null;\n const display =\n model in FREE_OPENHANDS_MODELS\n ? FREE_OPENHANDS_MODELS[model as keyof typeof FREE_OPENHANDS_MODELS]\n : model;\n return appendFreeSuffix(display, isFreeOpenHandsModel(model, freeModels));\n}\n"],"mappings":"6CAAA,IAAa,EAAyB,OAGzB,EAAoB,UAMpB,EAAwB,CACnC,8BAA+B,6BACjC,EAYM,EAAkC,IAAI,IAQ/B,EACX,GACY,EAAQ,GAAO,WAAW,YAAY,EAEvC,GACX,EACA,EAA2B,IACf,GAAQ,GAAS,EAAW,IAAI,CAAK,GAEnD,SAAS,EAAiB,EAAiB,EAAyB,CAClE,OAAO,EAAS,GAAG,IAAU,IAAsB,CACrD,CAEA,SAAgB,EACd,EACA,EAA2B,EACZ,CAEf,OADK,EACE,EAAiB,EAAO,EAAqB,EAAO,CAAU,CAAC,EADnD,IAErB,CA6BA,SAAgB,EACd,EACA,EAA2B,EACZ,CACf,GAAI,CAAC,EAAO,OAAO,KACnB,IAAM,EAAS,EAAqB,EAAO,CAAU,EAErD,OAAO,EADa,EAAM,MAAM,GAAG,EAAE,IACb,GAAe,EAAO,CAAM,CACtD,CAOA,SAAgB,EACd,EACA,EAA2B,EACZ,CAMf,OALK,EAKE,EAHL,KAAS,EACL,EAAsB,GACtB,EAC2B,EAAqB,EAAO,CAAU,CAAC,EALrD,IAMrB"}
|
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
export declare const FREE_MODEL_BADGE_LABEL = "Free";
|
|
2
|
+
/** Suffix appended to a display name for a DB-flagged free OpenHands model. */
|
|
3
|
+
export declare const FREE_MODEL_SUFFIX = " (free)";
|
|
4
|
+
/**
|
|
5
|
+
* Static pretty-print labels for OpenHands models known at build time. Free
|
|
6
|
+
* status still comes only from the backend-provided `freeModels` set.
|
|
7
|
+
*/
|
|
2
8
|
export declare const FREE_OPENHANDS_MODELS: {
|
|
3
|
-
readonly "openhands/deepseek-v4-flash": "OpenHands DeepSeek V4 Flash
|
|
9
|
+
readonly "openhands/deepseek-v4-flash": "OpenHands DeepSeek V4 Flash";
|
|
4
10
|
};
|
|
5
11
|
export declare const FREE_OPENHANDS_MODEL_IDS: string[];
|
|
12
|
+
/**
|
|
13
|
+
* Set of free ``provider/model`` ids. The frontend no longer hardcodes which
|
|
14
|
+
* OpenHands models are free — the set is sourced from the backend model list
|
|
15
|
+
* (DB-driven), the same channel that carries `verified`. See
|
|
16
|
+
* {@link useFreeModels}. Callers that lack the set treat every model as paid.
|
|
17
|
+
*/
|
|
18
|
+
export type FreeModelSet = ReadonlySet<string>;
|
|
6
19
|
/**
|
|
7
20
|
* Whether a model id routes through the OpenHands provider (the `openhands/`
|
|
8
21
|
* prefix). On cloud the OpenHands provider is backed by a server-minted LLM
|
|
@@ -10,10 +23,9 @@ export declare const FREE_OPENHANDS_MODEL_IDS: string[];
|
|
|
10
23
|
* API key / base URL inputs and strip those fields from the save payload.
|
|
11
24
|
*/
|
|
12
25
|
export declare const isOpenHandsProviderModel: (model: string | null | undefined) => boolean;
|
|
13
|
-
export declare const
|
|
14
|
-
export declare
|
|
15
|
-
export declare function
|
|
16
|
-
export declare function formatProviderModelNameForDisplay(provider: string | null | undefined, model: string | null | undefined): string | null;
|
|
26
|
+
export declare const isFreeOpenHandsModel: (model: string | null | undefined, freeModels?: FreeModelSet) => boolean;
|
|
27
|
+
export declare function formatModelNameForDisplay(model: string | null | undefined, freeModels?: FreeModelSet): string | null;
|
|
28
|
+
export declare function formatProviderModelNameForDisplay(provider: string | null | undefined, model: string | null | undefined, freeModels?: FreeModelSet): string | null;
|
|
17
29
|
/**
|
|
18
30
|
* Format a native (OpenHands-kind) routing model string for display, stripping
|
|
19
31
|
* the provider route prefix (e.g. ``"anthropic/claude-sonnet-4-5-20250929"`` →
|
|
@@ -25,7 +37,16 @@ export declare function formatProviderModelNameForDisplay(provider: string | nul
|
|
|
25
37
|
* string when stripping the prefix would leave nothing (e.g. a trailing slash)
|
|
26
38
|
* — never an empty string, which would collapse the chip text.
|
|
27
39
|
*
|
|
40
|
+
* A DB-flagged free model (matched against ``freeModels`` on its full id) keeps
|
|
41
|
+
* the free suffix so the chip still signals it is free.
|
|
42
|
+
*
|
|
28
43
|
* Display-only: unlike {@link deriveProfileNameFromModel} this does not sanitize
|
|
29
44
|
* to an identifier, so it keeps the real model id intact for the chip.
|
|
30
45
|
*/
|
|
31
|
-
export declare function formatNativeModelName(model: string | null | undefined): string | null;
|
|
46
|
+
export declare function formatNativeModelName(model: string | null | undefined, freeModels?: FreeModelSet): string | null;
|
|
47
|
+
/**
|
|
48
|
+
* Display label used by the LLM-profile picker sub-line. Looks up the model in
|
|
49
|
+
* the static label table for a prettier name, but appends `(free)` only when the
|
|
50
|
+
* backend-provided `freeModels` set marks the concrete model free.
|
|
51
|
+
*/
|
|
52
|
+
export declare function formatModelPillLabel(model: string | null | undefined, freeModels?: FreeModelSet): string | null;
|
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
//#region src/utils/format-model-name.ts
|
|
2
|
-
var e = "Free", t = { "openhands/deepseek-v4-flash": "OpenHands DeepSeek V4 Flash
|
|
3
|
-
function o(e) {
|
|
4
|
-
return
|
|
2
|
+
var e = "Free", t = " (free)", n = { "openhands/deepseek-v4-flash": "OpenHands DeepSeek V4 Flash" }, r = /* @__PURE__ */ new Set(), i = (e) => !!e?.startsWith("openhands/"), a = (e, t = r) => !!(e && t.has(e));
|
|
3
|
+
function o(e, n) {
|
|
4
|
+
return n ? `${e}${t}` : e;
|
|
5
5
|
}
|
|
6
|
-
function s(e) {
|
|
7
|
-
return e ? a(e
|
|
6
|
+
function s(e, t = r) {
|
|
7
|
+
return e ? o(e, a(e, t)) : null;
|
|
8
|
+
}
|
|
9
|
+
function c(e, t = r) {
|
|
10
|
+
if (!e) return null;
|
|
11
|
+
let n = a(e, t);
|
|
12
|
+
return o(e.split("/").pop() || e, n);
|
|
13
|
+
}
|
|
14
|
+
function l(e, t = r) {
|
|
15
|
+
return e ? o(e in n ? n[e] : e, a(e, t)) : null;
|
|
8
16
|
}
|
|
9
17
|
//#endregion
|
|
10
|
-
export { e as FREE_MODEL_BADGE_LABEL,
|
|
18
|
+
export { e as FREE_MODEL_BADGE_LABEL, s as formatModelNameForDisplay, l as formatModelPillLabel, c as formatNativeModelName, a as isFreeOpenHandsModel, i as isOpenHandsProviderModel };
|
|
11
19
|
|
|
12
20
|
//# sourceMappingURL=format-model-name.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-model-name.js","names":[],"sources":["../../src/utils/format-model-name.ts"],"sourcesContent":["export const FREE_MODEL_BADGE_LABEL = \"Free\";\n\nexport const FREE_OPENHANDS_MODELS = {\n \"openhands/deepseek-v4-flash\": \"OpenHands DeepSeek V4 Flash
|
|
1
|
+
{"version":3,"file":"format-model-name.js","names":[],"sources":["../../src/utils/format-model-name.ts"],"sourcesContent":["export const FREE_MODEL_BADGE_LABEL = \"Free\";\n\n/** Suffix appended to a display name for a DB-flagged free OpenHands model. */\nexport const FREE_MODEL_SUFFIX = \" (free)\";\n\n/**\n * Static pretty-print labels for OpenHands models known at build time. Free\n * status still comes only from the backend-provided `freeModels` set.\n */\nexport const FREE_OPENHANDS_MODELS = {\n \"openhands/deepseek-v4-flash\": \"OpenHands DeepSeek V4 Flash\",\n} as const;\n\nexport const FREE_OPENHANDS_MODEL_IDS = Object.keys(FREE_OPENHANDS_MODELS);\n\n/**\n * Set of free ``provider/model`` ids. The frontend no longer hardcodes which\n * OpenHands models are free — the set is sourced from the backend model list\n * (DB-driven), the same channel that carries `verified`. See\n * {@link useFreeModels}. Callers that lack the set treat every model as paid.\n */\nexport type FreeModelSet = ReadonlySet<string>;\n\nconst EMPTY_FREE_MODELS: FreeModelSet = new Set<string>();\n\n/**\n * Whether a model id routes through the OpenHands provider (the `openhands/`\n * prefix). On cloud the OpenHands provider is backed by a server-minted LLM\n * key rather than a user-supplied one, so callers use this to hide the inline\n * API key / base URL inputs and strip those fields from the save payload.\n */\nexport const isOpenHandsProviderModel = (\n model: string | null | undefined,\n): boolean => Boolean(model?.startsWith(\"openhands/\"));\n\nexport const isFreeOpenHandsModel = (\n model: string | null | undefined,\n freeModels: FreeModelSet = EMPTY_FREE_MODELS,\n): boolean => Boolean(model && freeModels.has(model));\n\nfunction appendFreeSuffix(display: string, isFree: boolean): string {\n return isFree ? `${display}${FREE_MODEL_SUFFIX}` : display;\n}\n\nexport function formatModelNameForDisplay(\n model: string | null | undefined,\n freeModels: FreeModelSet = EMPTY_FREE_MODELS,\n): string | null {\n if (!model) return null;\n return appendFreeSuffix(model, isFreeOpenHandsModel(model, freeModels));\n}\n\nexport function formatProviderModelNameForDisplay(\n provider: string | null | undefined,\n model: string | null | undefined,\n freeModels: FreeModelSet = EMPTY_FREE_MODELS,\n): string | null {\n if (!model) return null;\n const fullModel = provider ? `${provider}/${model}` : model;\n return appendFreeSuffix(model, isFreeOpenHandsModel(fullModel, freeModels));\n}\n\n/**\n * Format a native (OpenHands-kind) routing model string for display, stripping\n * the provider route prefix (e.g. ``\"anthropic/claude-sonnet-4-5-20250929\"`` →\n * ``\"claude-sonnet-4-5-20250929\"``, ``\"litellm_proxy/openai/gpt-4o\"`` →\n * ``\"gpt-4o\"``) so a conversation chip shows a meaningful model name rather than\n * the full routing path.\n *\n * Returns ``null`` for an empty/nullish input, and falls back to the original\n * string when stripping the prefix would leave nothing (e.g. a trailing slash)\n * — never an empty string, which would collapse the chip text.\n *\n * A DB-flagged free model (matched against ``freeModels`` on its full id) keeps\n * the free suffix so the chip still signals it is free.\n *\n * Display-only: unlike {@link deriveProfileNameFromModel} this does not sanitize\n * to an identifier, so it keeps the real model id intact for the chip.\n */\nexport function formatNativeModelName(\n model: string | null | undefined,\n freeModels: FreeModelSet = EMPTY_FREE_MODELS,\n): string | null {\n if (!model) return null;\n const isFree = isFreeOpenHandsModel(model, freeModels);\n const lastSegment = model.split(\"/\").pop();\n return appendFreeSuffix(lastSegment || model, isFree);\n}\n\n/**\n * Display label used by the LLM-profile picker sub-line. Looks up the model in\n * the static label table for a prettier name, but appends `(free)` only when the\n * backend-provided `freeModels` set marks the concrete model free.\n */\nexport function formatModelPillLabel(\n model: string | null | undefined,\n freeModels: FreeModelSet = EMPTY_FREE_MODELS,\n): string | null {\n if (!model) return null;\n const display =\n model in FREE_OPENHANDS_MODELS\n ? FREE_OPENHANDS_MODELS[model as keyof typeof FREE_OPENHANDS_MODELS]\n : model;\n return appendFreeSuffix(display, isFreeOpenHandsModel(model, freeModels));\n}\n"],"mappings":";AAAA,IAAa,IAAyB,QAGzB,IAAoB,WAMpB,IAAwB,EACnC,+BAA+B,8BACjC,GAYM,oBAAkC,IAAI,IAAY,GAQ3C,KACX,MACY,EAAQ,GAAO,WAAW,YAAY,GAEvC,KACX,GACA,IAA2B,MACf,GAAQ,KAAS,EAAW,IAAI,CAAK;AAEnD,SAAS,EAAiB,GAAiB,GAAyB;CAClE,OAAO,IAAS,GAAG,IAAU,MAAsB;AACrD;AAEA,SAAgB,EACd,GACA,IAA2B,GACZ;CAEf,OADK,IACE,EAAiB,GAAO,EAAqB,GAAO,CAAU,CAAC,IADnD;AAErB;AA6BA,SAAgB,EACd,GACA,IAA2B,GACZ;CACf,IAAI,CAAC,GAAO,OAAO;CACnB,IAAM,IAAS,EAAqB,GAAO,CAAU;CAErD,OAAO,EADa,EAAM,MAAM,GAAG,EAAE,IACb,KAAe,GAAO,CAAM;AACtD;AAOA,SAAgB,EACd,GACA,IAA2B,GACZ;CAMf,OALK,IAKE,EAHL,KAAS,IACL,EAAsB,KACtB,GAC2B,EAAqB,GAAO,CAAU,CAAC,IALrD;AAMrB"}
|
package/package.json
CHANGED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor~module-DyG7x7JT.js","assets/rolldown-runtime-Cyuzqnbw.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{a as e}from"./rolldown-runtime-Cyuzqnbw.js";import{St as t,xt as n,yt as r}from"./vendor-styling-Ck5D_A2Q.js";import{r as i}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~i58xkef6-cHFhpUBq.js";import{a,f as o,m as s,n as c,o as ee,p as te,r as ne,s as re,u as ie}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BfkNGovw.js";import{K as l,W as ae,t as oe}from"./utils-BOco8mxR.js";import{A as se,B as ce,D as le,H as ue,I as de,L as fe,N as pe,b as me,c as he,d as u,f as d,g as ge,h as _e,l as ve,m as ye,n as be,p as xe,s as Se,u as Ce,z as we}from"./agent-server-client-options-BikiNwTa.js";import{f as Te,x as Ee}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-Z0lly3FE.js";var f=e(t(),1),De=`__AGENT_CANVAS_BASE_PATH__`;function Oe(e){let t=e?.trim();return!t||t===`/`?``:(t.startsWith(`/`)?t:`/${t}`).replace(/\/+$/,``)}function ke(){let e=Oe(void 0);if(e)return e;if(typeof window<`u`){let e=window[De];if(typeof e==`string`)return Oe(e)}return``}function Ae(e){let t=ke();return t?`${t}${e.startsWith(`/`)?e:`/${e}`}`:e.startsWith(`/`)?e:`/${e}`}var p=`openhands`,je=[{label:`English`,value:`en`},{label:`日本語`,value:`ja`},{label:`简体中文`,value:`zh-CN`},{label:`繁體中文`,value:`zh-TW`},{label:`한국어`,value:`ko-KR`},{label:`Norsk`,value:`no`},{label:`Arabic`,value:`ar`},{label:`Deutsch`,value:`de`},{label:`Français`,value:`fr`},{label:`Italiano`,value:`it`},{label:`Português`,value:`pt`},{label:`Español`,value:`es`},{label:`Català`,value:`ca`},{label:`Türkçe`,value:`tr`},{label:`Українська`,value:`uk`}],m=new WeakMap,Me=e=>{if(!m.has(e)){let t=e.use(ee).use(a).use(i).init({fallbackLng:`en`,debug:!1,supportedLngs:je.map(e=>e.value),nonExplicitSupportedLngs:!1,ns:[p],defaultNS:p,fallbackNS:p,backend:{loadPath:Ae(`/locales/{{lng}}/{{ns}}.json`)},interpolation:{escapeValue:!1}});m.set(e,t)}return e},Ne=()=>Me(ie()),Pe=null,h=null,g=()=>(Pe||=Ne(),Pe),Fe=()=>h??g(),Ie=e=>(h=e??g(),h),Le=async(e=g())=>(await m.get(e),e),Re=e=>e?typeof e==`object`&&!Array.isArray(e)?{ns:p,...e}:e:{ns:p},_=new Proxy({},{get:(e,t)=>{let n=Fe();if(t===`t`)return(e,t)=>n.t(e,Re(t));if(t===`exists`)return(e,t)=>n.exists(e,Re(t));let r=Reflect.get(n,t,n);return typeof r==`function`?r.bind(n):r},set:(e,t,n)=>{let r=Fe();return Reflect.set(r,t,n,r)}}),ze=e=>typeof e.response?.data==`object`&&e.response?.data!==null&&`error`in e.response.data&&typeof e.response?.data?.error==`string`,Be=e=>typeof e.response?.data==`object`&&e.response?.data!==null&&`message`in e.response.data&&typeof e.response?.data?.message==`string`;function Ve(e){return typeof e==`object`&&!!e&&`isAxiosError`in e&&e.isAxiosError===!0}var He=e=>{let t=null,n=!1;return Ve(e)?(n=!0,t=ze(e)&&e.response?.data.error?e.response?.data.error:Be(e)&&e.response?.data.message?e.response?.data.message:e.message):t=e instanceof Error?e.message:typeof e==`string`?e:null,we(n?t??e:e)??t??``},v=(e,t=5e3,n=1e4)=>{if(!e)return t;let r=e.length/(1e3/60)*1e3*1.5;return Math.min(Math.max(r,t),n)},y=r(),Ue={background:`var(--oh-color-tertiary)`,border:`1px solid var(--oh-border-input)`,color:`#fff`,borderRadius:`var(--oh-radius)`,maxWidth:`400px`,wordBreak:`break-word`,overflowWrap:`anywhere`,whiteSpace:`pre-wrap`},b={position:`top-right`,style:Ue},We={...Ue,color:`var(--oh-muted)`};function Ge({message:e}){let t=f.useRef(null),[n,r]=f.useState(!1);return f.useLayoutEffect(()=>{let e=t.current;if(!e)return;let n=()=>{let t=Number.parseFloat(getComputedStyle(e).lineHeight);if(!Number.isFinite(t)||t<=0){r(!1);return}r(e.getBoundingClientRect().height>t*1.5)};n();let i=new ResizeObserver(n);return i.observe(e),()=>i.disconnect()},[e]),(0,y.jsxs)(`div`,{className:oe(`flex min-w-0 gap-2`,n?`items-start`:`items-center`),children:[(0,y.jsx)(ne,{"aria-hidden":!0,className:`h-4 w-4 shrink-0`,strokeWidth:2,style:{color:ae}}),(0,y.jsx)(`span`,{ref:t,className:`min-w-0 flex-1 text-sm leading-5 [word-break:break-word] [overflow-wrap:anywhere]`,children:e})]})}var Ke={...b,icon:null,style:We},qe=e=>{let t=e||_.t(l.STATUS$ERROR);ue(t)?t=_.t(l.ERROR$CORS_OR_NETWORK):ce(t)&&(t=_.t(l.ERROR$BACKEND_REQUEST_TIMEOUT));let n=v(t,4e3);c((0,y.jsx)(Ge,{message:t}),{...Ke,duration:n})},Je=e=>{let t=v(e,5e3);c.success((0,y.jsx)(`span`,{className:`[word-break:break-word] [overflow-wrap:anywhere]`,children:e}),{...b,duration:t})},Ye=(e,t,n)=>{let r=v(`${e} ${t}`,5e3);c.success((0,y.jsxs)(`span`,{className:`[word-break:break-word] [overflow-wrap:anywhere]`,children:[e,` `,(0,y.jsx)(`a`,{className:`underline hover:no-underline`,href:n,children:t})]}),{...b,duration:r})},Xe=e=>{let t=v(e,6e3);c((0,y.jsx)(`span`,{className:`[word-break:break-word] [overflow-wrap:anywhere]`,children:e}),{...b,icon:`⚠️`,duration:t})},Ze=(e,t)=>{(e?.response?.status===401||e?.status===401)&&t.invalidateQueries({queryKey:[`user`,`authenticated`]})},Qe=e=>{if(!(e instanceof re)||e.response?.status!==401&&e.status!==401)return!1;let t=he().backend;if(t.kind!==`cloud`)return!1;let n=e.config?.url;return!n||n.startsWith(t.host.replace(/\/+$/,``))},x=new Set,$e=()=>{let e=new o({queryCache:new te({onSuccess:(e,t)=>{let n=t.meta?.backendId??t.options.meta?.backendId;typeof n==`string`&&de(n)},onError:(t,n)=>{if(n.queryKey[0]===`user`&&n.queryKey[1]===`authenticated`||Ze(t,e),!(n.meta?.disableToast??n.options.meta?.disableToast)&&!Qe(t)){let e=He(t);x.has(e||``)||(qe(e||_.t(l.ERROR$GENERIC)),x.add(e||``),setTimeout(()=>{x.delete(e||``)},3e3))}}}),mutationCache:new s({onError:(t,n,r,i)=>{Ze(t,e),!(i?.meta?.disableToast??i?.options.meta?.disableToast)&&!Qe(t)&&qe(He(t)||_.t(l.ERROR$GENERIC))}})});return e},et=null,S=null,tt=()=>(et||=$e(),et),nt=()=>S??tt(),rt=e=>(S=e??tt(),S),it=new Proxy({},{get:(e,t)=>{let n=nt(),r=Reflect.get(n,t,n);return typeof r==`function`?r.bind(n):r},set:(e,t,n)=>{let r=nt();return Reflect.set(r,t,n,r)}}),at={_comment:`Single source of truth for version pins, ports, paths, and defaults shared across the npm and Docker install paths. Read by scripts/dev-safe.mjs, scripts/dev-with-automation.mjs, docker/entrypoint.sh (via generated defaults.env), and .github/workflows/docker.yml.`,versions:{agentServer:`1.46.0`,agentCanvas:`1.17.0`,automation:`1.11.1`},compatibility:{minimumAgentServer:`1.28.0`},constraints:{_comment:`Temporary upper bound on the agent-client-protocol (acp) transitive dependency. openhands-sdk 1.35.0 requires agent-client-protocol>=0.10.1 with no upper bound, but acp 0.11.0 reordered the ACP prompt() arguments and breaks the SDK's ACP client (a PromptRequest validation error surfaces as 'ACP error: 2 validation errors for PromptRequest'). Pin acp <0.11 until a fixed openhands-sdk ships. Consumed by scripts/dev-safe.mjs (agent-server uvx install) and .github/workflows/mock-llm-e2e.yml (mock ACP server venv).`,agentClientProtocol:`agent-client-protocol<0.11`},images:{agentServer:`ghcr.io/openhands/agent-server`,agentCanvas:`ghcr.io/openhands/agent-canvas`},ports:{agentServer:18e3,automation:18001,proxy:8e3,_vscodeComment:`Port the bundled editor binds to inside the container; agent-server's own default. Only the Docker entrypoint reads this — the npm launchers derive the editor port from the agent-server port so several stacks can run side by side. It is never published: the editor is reached through paths.vscodeBasePath on the proxy port.`,vscode:8001},paths:{stateSubdir:`agent-canvas`,conversations:`agent-canvas/conversations`,bashEvents:`agent-canvas/bash_events`,automationDb:`automation/automations.db`,canvasBasePath:`/canvas`,_vscodeBasePathComment:`Path prefix the bundled editor is served under, on the same origin as the canvas. Passed to agent-server as OH_VSCODE_BASE_PATH (it launches openvscode-server with --server-base-path and advertises the prefix in /api/vscode/url), and registered as an ingress route to the VSCode port. Keeping one value on both sides is what lets a single-origin deployment reach the editor without publishing a second port. Tradeoff: a path prefix routes but does not isolate, so the editor shares the canvas's browser origin and therefore its localStorage — see docs/SELF_HOSTING.md and OpenHands/OpenHands#16492.`,vscodeBasePath:`/vscode`},packages:{agentServer:`openhands-agent-server`,automation:`openhands-automation`,tools:`openhands-tools`,workspace:`openhands-workspace`},telemetry:{posthogApiKey:`phc_kBtz5nKmxVRRQ7HtPwr2QX9eMC5j65zE86QKocVNwb4U`,posthogHost:`https://us.i.posthog.com`}},ot=5e3,st=`unknown`,C=at.compatibility.minimumAgentServer,ct=`AGENT_SERVER_UNSUPPORTED_VERSION`,lt=`AGENT_SERVER_UNKNOWN_VERSION`,ut=`Invalid API key`,w=null,dt=null,ft=e=>Array.isArray(e?.usable_tools)?e.usable_tools:null,T=class extends Error{details;noBackendConfigured;constructor(e,t){let n=t?.noBackendConfigured??!1;super(n?`No agent server backend is configured yet. Add a backend to get started.`:`Could not connect to the configured agent server. Make sure it is running and reachable, then reload the page.`),this.name=`AgentServerUnavailableError`,this.details=e??null,this.noBackendConfigured=n}},pt=e=>e instanceof T||typeof e==`object`&&!!e&&`name`in e&&(e.name===`AgentServerUnavailableError`||e.name===`AgentServerUnsupportedVersionError`||e.name===`AgentServerUnknownVersionError`),mt=class extends T{code=ct;actualVersion;requiredVersion=C;constructor(e){let t=`Agent Canvas requires agent-server ${C} or newer; this backend is running ${e}. Please upgrade the agent-server backend.`;super(t),this.name=`AgentServerUnsupportedVersionError`,this.message=t,this.actualVersion=e}},ht=class extends T{code=lt;actualVersion;requiredVersion=C;constructor(e){let t=`Could not determine this backend's agent-server version.${e?` It reported "${e}".`:``} Agent Canvas requires agent-server ${C} or newer, but this backend did not return a valid version from /server_info. Restart or rebuild the agent-server backend, then try again.`;super(t),this.name=`AgentServerUnknownVersionError`,this.message=t,this.actualVersion=e}},gt=e=>se()&&D(e,401);function E(){w=null,dt=null}function _t(e){return e?.host&&e.host!==dt?null:w}function vt(e){let t=ft(w);return Array.isArray(t)?t.includes(e):!0}function yt(e){return e instanceof Error&&e.name===`HttpError`&&`status`in e&&typeof e.status==`number`}function D(e,t){return yt(e)&&e.status===t}function bt(e){return typeof e==`string`&&e.trim()||null}function xt(e){return bt(e.sdk_version)}function St(e){return bt(e.version)??xt(e)}function Ct(e){let t=St(e);return!t||t.toLowerCase()===st?null:t}function wt(e){let t=Ct(e);return!t||!Dt(t)?null:t}function Tt(e){return!w||e&&Ce()?.host!==e?null:wt(w)}function Et(e,t){let n=Dt(e),r=Dt(t);if(!n||!r)return null;for(let e of[`major`,`minor`,`patch`]){if(n[e]>r[e])return 1;if(n[e]<r[e])return-1}return n.prerelease&&!r.prerelease?-1:!n.prerelease&&r.prerelease?1:n.prerelease&&r.prerelease?n.prerelease.localeCompare(r.prerelease):0}function Dt(e){let[t]=e.trim().replace(/^v/,``).split(`+`),[n,r]=t.split(`-`,2),i=n.split(`.`);if(i.length!==3)return null;let[a,o,s]=i.map(e=>Number(e));return[a,o,s].every(e=>Number.isInteger(e)&&e>=0)?{major:a,minor:o,patch:s,prerelease:r}:null}function Ot(e){let t=Ct(e);if(!t)throw E(),new ht(St(e));let n=Et(t,C);if(n===null)throw E(),new ht(t);if(n<0)throw E(),new mt(t)}async function kt(e,t){let n=be({host:e.host,sessionApiKey:e.apiKey||null,timeout:t});try{await new Te(n).getSettings();let e=await new Ee(n).getServerInfo();return Ot(e),wt(e)}catch(e){throw D(e,401)?Error(ut):e}}async function At(){let e=Ce();if(!e){if(E(),xe(he().backend))throw new T(`No backend configured`,{noBackendConfigured:!0});return null}let t=be({host:e.host,sessionApiKey:e.apiKey||null,timeout:ot}),n;try{n=await new Ee(t).getServerInfo()}catch(e){throw E(),D(e,401)?e:new T(e instanceof Error?e.message:null)}if(Ot(n),se())try{await new Te(t).getSettings()}catch(e){if(D(e,401))throw e;console.warn(`[agent-server] getSettings() probe failed (non-401):`,e)}return w=n,dt=t.host,n}var jt={WEB_CLIENT_CONFIG:[`web-client-config`],MAIN_APP_COOKIE_AUTH:[`main-app-cookie-auth`]},Mt={all:[`settings`],byScope:e=>[`settings`,e],personal:()=>[`settings`,`personal`]},Nt={all:[`llm-profiles`]},Pt={all:[`agent-profiles`]},Ft={all:[`provider-connections`]},It={retry:!1},Lt={all:[`llm-subscription`],openaiStatus:[`llm-subscription`,`openai`,`status`],openaiModels:[`llm-subscription`,`openai`,`models`]},Rt={all:[`local-workspaces`]},zt={marketplace:[`plugins-marketplace`],installed:[`plugins-installed`],local:[`plugins-local`]},Bt={all:[`canvas-extensions`],installed:(e,t,n)=>[`canvas-extensions`,`installed`,e,t,n]},Vt={capabilities:()=>[`setup-capabilities`]},Ht={latestVersion:[`agent-canvas-latest-version`]},Ut={subConversations:[`v1`,`sub-conversations`]},Wt={create:[`create-local-planning-conversation`]},Gt={staleTime:1e3*60*5,gcTime:1e3*60*15},O={name:`@openhands/agent-canvas`,version:`1.17.0`,description:`Agent Canvas UI for OpenHands - run AI coding agents with a visual interface`,license:`MIT`,private:!1,type:`module`,repository:{type:`git`,url:`https://github.com/OpenHands/OpenHands`},homepage:`https://github.com/OpenHands/OpenHands#readme`,bugs:{url:`https://github.com/OpenHands/OpenHands/issues`},bin:{"agent-canvas":`bin/agent-canvas.mjs`},engines:{node:`>=24`},dependencies:{"@heroui/react":`2.8.10`,"@microlink/react-json-view":`1.31.25`,"@monaco-editor/react":`4.7.0`,"@openhands/extensions":`0.20.0`,"@openhands/typescript-client":`1.39.0`,"@react-router/node":`7.18.2`,"@react-router/serve":`7.18.2`,"@tailwindcss/vite":`4.3.3`,"@tanstack/react-query":`5.101.4`,"@types/shell-quote":`1.7.5`,"@uidotdev/usehooks":`2.4.1`,"@xterm/addon-fit":`0.11.0`,"@xterm/xterm":`6.0.0`,axios:`1.18.0`,"class-variance-authority":`0.7.1`,clsx:`2.1.1`,downshift:`9.3.2`,"framer-motion":`12.38.0`,httpxy:`0.5.3`,i18next:`26.3.6`,"i18next-browser-languagedetector":`8.2.1`,"i18next-http-backend":`4.0.1`,isbot:`5.1.39`,"lucide-react":`1.25.0`,"monaco-editor":`0.56.0`,"posthog-js":`1.380.0`,react:`19.2.8`,"react-dom":`19.2.8`,"react-hot-toast":`2.6.0`,"react-i18next":`17.0.11`,"react-icons":`5.6.0`,"react-markdown":`10.1.0`,"react-router":`7.18.2`,"react-syntax-highlighter":`16.1.1`,"rehype-raw":`7.0.0`,"rehype-sanitize":`6.0.0`,"remark-breaks":`4.0.0`,"remark-gfm":`4.0.1`,"shell-quote":`1.9.0`,sirv:`3.0.2`,"sirv-cli":`3.0.1`,"socket.io-client":`4.8.3`,"tailwind-merge":`3.6.0`,"tailwind-scrollbar":`4.0.2`,"unist-util-visit":`5.1.0`,uuid:`14.0.0`,vite:`8.0.16`,winston:`3.19.0`,"winston-daily-rotate-file":`5.0.0`,zustand:`5.0.14`},scripts:{dev:`node --env-file-if-exists=.env scripts/dev-with-automation.mjs`,"dev:static":`node --env-file-if-exists=.env scripts/dev-static.mjs`,"dev:extra-backend":`node --env-file-if-exists=.env scripts/dev-extra-backend.mjs`,"dev:minimal":`node --env-file-if-exists=.env scripts/dev-safe.mjs`,"dev:frontend":`npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev`,"dev:mock":`npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev`,build:`npm run build:app`,"build:mock":`npm run make-i18n && cross-env VITE_MOCK_API=true react-router build`,start:`npx sirv-cli build/ --single`,test:`npm run make-i18n && vitest run`,"test:e2e":`playwright test --pass-with-no-tests`,"test:e2e:live":`node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs`,"test:e2e:mock-llm":`playwright test --config=playwright.mock-llm.config.ts`,"test:e2e:mock-llm:docker":`playwright test --config=playwright.mock-llm-docker.config.ts`,"test:coverage":`npm run make-i18n && vitest run --coverage`,"test:mutation":`npm run make-i18n && stryker run`,"test:mutation:diff":`npm run make-i18n && node scripts/stryker-diff.mjs`,"test:mutation:incremental":`npm run make-i18n && stryker run --incremental`,dev_wsl:`VITE_WATCH_USE_POLLING=true vite`,preview:`vite preview`,"make-i18n":`node scripts/make-i18n-translations.cjs`,prelint:`npm run make-i18n`,lint:`npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}`,"lint:fix":`eslint src --fix && prettier --write src/**/*.{ts,tsx}`,postinstall:`node -e "if (process.env.npm_config_global === 'true') { console.log('\\n\\x1b[32m\\x1b[1m\\u2713 @openhands/agent-canvas installed!\\x1b[0m\\n\\nTo start Agent Canvas, run:\\n\\n \\x1b[36m\\x1b[1magent-canvas\\x1b[0m\\n\\nThis launches the full stack at \\x1b[36mhttp://localhost:8000\\x1b[0m.\\n\\nDocs: https://docs.openhands.dev/openhands/usage/agent-canvas/setup\\n') }"`,prepare:`husky`,typecheck:`react-router typegen && tsc`,"typecheck:staged":`react-router typegen && npx tsc --noEmit --skipLibCheck`,"check-translation-completeness":`node scripts/check-translation-completeness.cjs`,"build:app":`npm run make-i18n && react-router build`,"build:lib":`npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true vite build && tsc -p tsconfig.lib.json`,"build:docker":`node scripts/docker-build.mjs`,"example:acp-docker:env":`node scripts/gen-acp-docker-env.mjs`,predesktop:`node scripts/brand-dev-electron.mjs`,desktop:`npm run build:app && electron electron`,"build:desktop":`npm run build:app && node scripts/download-uv.mjs && node scripts/download-node.mjs && electron-builder --config electron-builder.config.mjs --publish never`,"build:desktop:universal":`npm run build:app && node scripts/download-uv.mjs && node scripts/download-node.mjs && cross-env ELECTRON_ARCH=universal electron-builder --config electron-builder.config.mjs --publish never`,"download-uv":`node scripts/download-uv.mjs`,"download-node":`node scripts/download-node.mjs`,"generate-icons":`node scripts/generate-icons.mjs`},"lint-staged":{"src/**/*.{ts,tsx,js}":[`eslint --fix`,`prettier --write`],"src/**/*.{ts,tsx}":[`node scripts/run-staged-typecheck.mjs`],"src/**/*":[`npm run check-translation-completeness`]},devDependencies:{"@eslint/eslintrc":`3.3.6`,"@eslint/js":`9.39.4`,"@mswjs/socket.io-binding":`0.2.0`,"@playwright/test":`1.62.1`,"@react-router/dev":`7.18.2`,"@stryker-mutator/core":`9.6.1`,"@stryker-mutator/vitest-runner":`9.6.1`,"@tailwindcss/typography":`0.5.20`,"@tanstack/eslint-plugin-query":`5.101.4`,"@testing-library/dom":`10.4.1`,"@testing-library/jest-dom":`7.0.0`,"@testing-library/react":`16.3.2`,"@testing-library/user-event":`14.6.1`,"@types/mdast":`4.0.4`,"@types/node":`26.1.2`,"@types/react":`19.2.18`,"@types/react-dom":`19.2.4`,"@types/react-syntax-highlighter":`15.5.13`,"@typescript-eslint/eslint-plugin":`8.65.0`,"@typescript-eslint/parser":`8.65.0`,"@vercel/react-router":`1.3.0`,"@vitest/coverage-v8":`4.1.10`,"cross-env":`10.1.0`,electron:`42.3.3`,"electron-builder":`26.15.3`,eslint:`9.39.5`,"eslint-config-prettier":`10.1.8`,"eslint-import-resolver-typescript":`4.4.5`,"eslint-plugin-i18next":`6.1.5`,"eslint-plugin-import-x":`4.17.1`,"eslint-plugin-jsx-a11y":`6.10.2`,"eslint-plugin-prettier":`5.5.6`,"eslint-plugin-react":`7.37.5`,"eslint-plugin-react-hooks":`7.1.1`,"eslint-plugin-unused-imports":`4.4.1`,globals:`16.5.0`,husky:`9.1.7`,jsdom:`30.0.1`,"lint-staged":`17.3.0`,msw:`2.15.0`,png2icons:`2.0.1`,"postcss-prefix-selector":`2.1.1`,prettier:`3.8.3`,tailwindcss:`4.3.3`,typescript:`6.0.3`,"vite-plugin-svgr":`5.2.0`,vitest:`4.1.10`},packageManager:`npm@10.5.0`,volta:{node:`22.12.0`},msw:{workerDirectory:[`public`]},overrides:{"@vercel/static-config":{ajv:`8.20.0`},dompurify:`3.4.14`,"typed-rest-client":{qs:`6.15.3`}},main:`./dist/index.cjs`,module:`./dist/index.js`,types:`./dist/index.d.ts`,files:[`dist`,`bin`,`build`,`config`,`scripts`,`tools`],exports:{".":{types:`./dist/index.d.ts`,import:`./dist/index.js`,require:`./dist/index.cjs`},"./browser":{types:`./dist/components/browser/index.d.ts`,import:`./dist/components/browser/index.js`,require:`./dist/components/browser/index.cjs`},"./conversation":{types:`./dist/components/conversation/index.d.ts`,import:`./dist/components/conversation/index.js`,require:`./dist/components/conversation/index.cjs`},"./files":{types:`./dist/components/files/index.d.ts`,import:`./dist/components/files/index.js`,require:`./dist/components/files/index.cjs`},"./settings":{types:`./dist/components/settings/index.d.ts`,import:`./dist/components/settings/index.js`,require:`./dist/components/settings/index.cjs`},"./sidebar":{types:`./dist/components/sidebar/index.d.ts`,import:`./dist/components/sidebar/index.js`,require:`./dist/components/sidebar/index.cjs`},"./terminal":{types:`./dist/components/terminal/index.d.ts`,import:`./dist/components/terminal/index.js`,require:`./dist/components/terminal/index.cjs`},"./i18n":{types:`./dist/i18n/index.d.ts`,import:`./dist/i18n/index.js`,require:`./dist/i18n/index.cjs`},"./package.json":`./package.json`},peerDependencies:{react:`19.2.8`,"react-dom":`19.2.8`,"react-router":`7.18.2`}},k=`agent_canvas`,A=O.version,Kt=`X-OpenHands-Client`,qt=`X-OpenHands-Client-Version`,Jt=`X-OpenHands-Telemetry-Distinct-Id`,Yt={[Kt]:k,[qt]:A};function j(e){return e?.trim()||`unknown`}function M(e){return e?.trim()||null}function N({backendKind:e,agentServerVersion:t,automationSdkVersion:n,backendVersion:r,connectionMethod:i}){let a=j(t??r),o=j(n),s=j(r??t);return{backend_kind:e??null,agent_server_version:a,automation_sdk_version:o,backend_version:s,...i?{connection_method:i}:{}}}function P(e=null){return{cloud_user_id:M(e?.userId),cloud_user_email:M(e?.email),cloud_org_id:M(e?.orgId)}}var F=`openhands-telemetry-consent`,I=`openhands-telemetry-consent-pending-cloud-sync`,L=`openhands-telemetry-consent-pending-local-revocation`,Xt=`openhands-telemetry-consent-change`,Zt=`openhands-telemetry-first-use`,Qt=`openhands-telemetry-session`,$t=`agent-canvas`,en=`history_change`,tn=`phc_BgzfxKdgsYMLFTmJqt424ZoyVHvKFfrwttLimzdYTKFK`,nn=`https://z.openhands.dev`,rn=`https://us.posthog.com`,R=null,z=null,an,B={},V=!1;function on(){return typeof window<`u`&&window.__AGENT_CANVAS_DO_NOT_TRACK__===!0}function sn(){return V||on()}var H,U=0,W=-1,cn=Object.freeze({client_source:k,client_version:A,package_name:O.name,package_version:O.version}),ln=N({}),un=P();function dn(e){ln=N(e)}function G(e){un=P(e)}function fn(e){return e?{...e,properties:{...ln,...un,...e.properties,...cn}}:null}function pn(e){V||X()!==`granted`?e.opt_out_capturing():e.opt_in_capturing()}function mn(e,t=!1){e.reset(t),W=-1,pn(e)}function K(e){if(H===void 0||!$())return;let t=H?.distinctId,n=e.get_property(`$user_id`);if(n!=null&&n!==t&&mn(e),H===null){W=U;return}(e.get_property(`$user_id`)!==H.distinctId||W!==U)&&(e.identify(H.distinctId,H.properties),W=U)}function hn(e,t){let n=Object.keys(e);return n.length===Object.keys(t).length&&n.every(n=>e[n]===t[n])}function gn(e){if(e===!1){if(V)return;V=!0,R?.opt_out_capturing(),Z();return}let t=V;if(V=!1,!R&&!z){let t=Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0));B={...B,...t}}t&&(R&&(pn(R),K(R)),Z())}function _n(){return sn()?null:{apiKey:B.apiKey||tn,apiHost:B.apiHost||nn,uiHost:B.uiHost||rn}}function q(){return typeof window<`u`&&typeof localStorage<`u`}async function vn(){if(!q())return null;if(R)return R;try{let{default:e}=await n(async()=>{let{default:e}=await import(`./vendor~module-DyG7x7JT.js`).then(e=>e.t);return{default:e}},__vite__mapDeps([0,1]));return e}catch{return null}}function J(){return!!(V||on()||typeof process<`u`&&{}.DO_NOT_TRACK===`1`||typeof navigator<`u`&&(navigator.doNotTrack===`1`||typeof window<`u`&&window.doNotTrack===`1`))}function yn(e){R||(an=e)}async function Y(e=!1){if(R)return R;if(z)return z;z=(async()=>{let t=_n();if(!t)return null;let n=await vn();if(!n)return null;let r=n.init(t.apiKey,{api_host:t.apiHost,ui_host:t.uiHost,opt_out_capturing_by_default:!e,persistence:`localStorage`,persistence_name:$t,consent_persistence_name:`${$t}-consent`,person_profiles:`always`,capture_pageview:en,autocapture:!0,disable_session_recording:!0,bootstrap:an,before_send:fn},$t);return r?(R=r,an=void 0,V?R.opt_out_capturing():X()===`granted`?(R.opt_in_capturing(),K(R)):e||R.opt_out_capturing(),R):null})();try{return await z}finally{R||(z=null)}}function X(){if(!q())return`pending`;if(J())return`denied`;if(le()===`cookie`)return`granted`;try{let e=localStorage.getItem(F);if(e===`granted`||e===`denied`)return e}catch{}return`pending`}function bn(){if(!q())return null;try{let e=localStorage.getItem(I);return e===`granted`||e===`denied`?e:null}catch{return null}}function xn(){if(!q())return null;try{return localStorage.getItem(L)}catch{return null}}function Sn(e){if(!q())return()=>{};let t=t=>{(t.key===F||t.key===I)&&e()};return window.addEventListener(Xt,e),window.addEventListener(`storage`,t),()=>{window.removeEventListener(Xt,e),window.removeEventListener(`storage`,t)}}function Z(){q()&&window.dispatchEvent(new Event(Xt))}function Cn(e){if(q())try{localStorage.setItem(I,e)}catch{}}function wn(e){if(!(!q()||!e))try{localStorage.setItem(L,e)}catch{}}function Tn(e){if(q())try{if(localStorage.getItem(L)!==e)return;localStorage.removeItem(L)}catch{}}function En(e){if(q())try{if(e!==void 0&&localStorage.getItem(I)!==e)return;localStorage.removeItem(I),Z()}catch{}}async function Dn(e,{syncToCloud:t=!0}={}){if(q())try{let t=X()===e;if(localStorage.setItem(F,e),sn()||t)return;let n=R??await Y();if(!n)return;e===`granted`?(n.opt_in_capturing(),K(n)):(wn(n.get_distinct_id?.()??null),n.get_property?.(`$user_id`)==null?n.opt_out_capturing():mn(n))}catch{}finally{t&&Cn(e),Z()}}async function Q(e,t={}){let n=e===null?null:{distinctId:e,properties:t};if(H===n||H!=null&&n!==null&&H.distinctId===n.distinctId&&hn(H.properties,t)||(H=n,U+=1,W=-1,!$()))return;let r=R??await Y();r&&$()&&K(r)}function $(){return X()===`granted`}function On(){if(!q())return!1;try{return localStorage.getItem(Zt)===`true`}catch{return!1}}function kn(){if(q())try{localStorage.setItem(Zt,`true`)}catch{}}async function An(){if(J()||On())return;let e=await Y(!0);!e||J()||((e.has_opted_out_capturing?.()??!1)&&e.opt_in_capturing(),e.capture(`canvas_install`,{platform:typeof navigator<`u`?navigator.platform:`unknown`,user_agent:typeof navigator<`u`?navigator.userAgent:`unknown`,referrer:typeof document<`u`?document.referrer:``,url_origin:typeof window<`u`?window.location.origin:``,embedded:typeof window<`u`&&window.self!==window.top}),kn(),X()!==`granted`&&e.opt_out_capturing())}function jn(){if(!q())return!1;try{return sessionStorage.getItem(Qt)===`true`}catch{return!1}}function Mn(){if(q())try{sessionStorage.setItem(Qt,`true`)}catch{}}async function Nn(){if(!$()||X()!==`granted`)return null;let e=await Y();return!e||!$()?null:(e.has_opted_out_capturing?.()&&e.opt_in_capturing(),K(e),e)}async function Pn(){if(jn())return;let e=await Nn();e&&(e.capture(`canvas_new_session`,{is_first_use:!On()}),Mn())}async function Fn(){return(await Nn())?.get_distinct_id?.()??null}async function In(){if(!q())return null;if(X()!==`granted`){let e=xn();if(e)return e}return V||J()?null:(await Y())?.get_distinct_id?.()??null}async function Ln(e,t={}){let n=await Nn();n&&n.capture(e,t)}async function Rn(){if(q()){try{wn(R?.get_distinct_id?.()??null),localStorage.removeItem(F),localStorage.removeItem(Zt)}catch{}En();try{sessionStorage.removeItem(Qt)}catch{}ln=N({}),un=P(),H=null,U+=1,W=-1;try{R&&mn(R,!0)}catch{try{R?.opt_out_capturing()}catch{}}finally{Z()}}}var zn=f.createContext(null);function Bn(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID():`backend-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function Vn(e,t){let n=e.backend.kind===`cloud`,r=t.backend.kind===`cloud`;!n&&!r||(G(null),r&&(!n||e.backend.id!==t.backend.id)&&Q(null))}function Hn({children:e}){let t=f.useSyncExternalStore(ge,d,d),n=f.useCallback(()=>{E(),it.invalidateQueries({queryKey:jt.WEB_CLIENT_CONFIG})},[]),r=f.useCallback((e,t)=>{let r=d(),i=ve()?.backendId??null,a=ve()?.orgId??null,o=t??null;if(e===i&&o===a)return;let s=u(),c=s.find(t=>t.id===e),ee={backend:c??s[0]??Se,orgId:c?o:null};Vn(r.active,ee),ye({backendId:e,orgId:o}),n()},[n]),i=f.useCallback(e=>{let t=d().active,r={...e,id:Bn()},i=[...u(),r];return Vn(t,{backend:r,orgId:null}),_e(i),ye({backendId:r.id}),n(),r},[n]),a=f.useCallback((e,t)=>{let r=u().find(t=>t.id===e),i=d().active.backend.id,a=t.host!==void 0&&r!==void 0&&t.host!==r.host,o=t.apiKey!==void 0&&r!==void 0&&t.apiKey!==r.apiKey;_e(u().map(n=>n.id===e?{...n,...t,connectionRevision:a||o?(n.connectionRevision??0)+1:n.connectionRevision}:n)),(a||o)&&(fe(e),i===e&&(r?.kind===`cloud`&&(G(null),Q(null)),n()))},[n]),o=f.useCallback(e=>{let t=u().find(t=>t.id===e),r=t?.kind===`cloud`&&d().active.backend.id===t.id;_e(u().filter(t=>t.id!==e)),r&&(G(null),Q(null)),pe(e),n()},[n]),s=f.useMemo(()=>({backends:t.backends,active:t.active,setActive:r,addBackend:i,updateBackend:a,removeBackend:o}),[t,r,i,a,o]);return(0,y.jsx)(zn.Provider,{value:s,children:e})}function Un(){let e=f.useContext(zn);if(!e)throw Error(`useActiveBackendContext must be used inside <ActiveBackendProvider>`);return e}function Wn(){let e=f.useContext(zn);return e?e.active:{backend:me()??Se,orgId:null}}export{D as $,Ht as A,jt as B,N as C,Jt as D,A as E,Lt as F,Et as G,Vt as H,Wt as I,wt as J,_t as K,Rt as L,Gt as M,Ut as N,Pt as O,Nt as P,yt as Q,zt as R,Pn as S,k as T,ut as U,Mt as V,E as W,vt as X,gt as Y,pt as Z,Dn as _,Ie as _t,Tn as a,rt as at,Ln as b,gn as c,Je as ct,X as d,He as dt,At as et,Fn as f,je as ft,G as g,_ as gt,dn as h,Fe as ht,En as i,it,Bt as j,It as k,bn as l,Ye as lt,Y as m,g as mt,Wn as n,tt as nt,Rn as o,b as ot,In as p,p as pt,Tt as q,Un as r,nt as rt,yn as s,qe as st,Hn as t,kt as tt,xn as u,Xe as ut,Q as v,Le as vt,Yt as w,An as x,Sn as y,Ae as yt,Ft as z};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-Cyuzqnbw.js";import{St as t,bt as n,yt as r}from"./vendor-styling-Ck5D_A2Q.js";import{U as i}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~i58xkef6-cHFhpUBq.js";import{r as a}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-DnDoaYNi.js";import{t as o}from"./vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-CV850oio.js";import{t as s}from"./useMutation-CJuK90oc.js";import{O as c,ct as l,dt as u,st as d}from"./active-backend-context-rZiLJRUc.js";import{K as f,t as p}from"./utils-BOco8mxR.js";import{t as m}from"./back-nav-button-B8tH0BEp.js";import{t as h}from"./loading-spinner-DfHI77BA.js";import{t as g}from"./brand-button-DxPO4Lf8.js";import{i as _}from"./dropdown-classes-B9kJVDIk.js";import{t as v}from"./settings-dropdown-input-DVpyD87C.js";import{t as y}from"./use-llm-profiles-BTTtpW4z.js";import{t as b}from"./agent-profiles-service.api-Biieml2L.js";import{t as x}from"./use-agent-profiles-1P91KSXz.js";import{i as S,n as C,t as w}from"./use-can-manage-org-profiles-BbN6KfDr.js";import{t as T}from"./u-edit-DAkcF52u.js";import{r as E}from"./typography-HLLg_FAn.js";import{o as D}from"./extension-module-card-classes-DpeaYhYo.js";import{i as O,n as k,o as A,r as j,t as M}from"./badge-CcGx2TaV.js";import{t as N}from"./u-check-circle-BKn1spCL.js";import{i as P,n as F,r as I,t as L}from"./settings-list-classes-Ds4jPBHK.js";import{n as ee}from"./settings-section-header-context-BOJ_Fbak.js";import{t as R}from"./use-save-agent-profile-CxyO9YG-.js";import{n as z}from"./use-activate-agent-profile-BLKML6vQ.js";import{t as B}from"./merge-agent-profile-save-input-WcFmQVKK.js";import{i as V,t as H}from"./agent-settings-CpY3zObk.js";var U=e(t(),1),W=e(n(),1),G=r();function K({onEdit:e,onSetActive:t,onDelete:n,isActive:r,isActivating:i,onClose:a,anchorRef:s}){let{t:c}=o(`openhands`),l=(0,U.useRef)(null),u=(0,U.useRef)([]),d=s?.current??null,[m,h]=(0,U.useState)();(0,U.useLayoutEffect)(()=>{if(!d)return;let e=()=>{let e=d.getBoundingClientRect();e&&h({position:`fixed`,zIndex:9999,top:e.bottom+8,right:window.innerWidth-e.right,width:`max-content`})};return e(),window.addEventListener(`resize`,e),window.addEventListener(`scroll`,e,!0),()=>{window.removeEventListener(`resize`,e),window.removeEventListener(`scroll`,e,!0)}},[d]),(0,U.useEffect)(()=>{u.current[0]?.focus()},[]),(0,U.useEffect)(()=>{let e=e=>{let t=e.target;l.current?.contains(t)||d?.contains(t)||a()},t=e=>{e.key===`Escape`&&a()};return document.addEventListener(`mousedown`,e),document.addEventListener(`keydown`,t),()=>{document.removeEventListener(`mousedown`,e),document.removeEventListener(`keydown`,t)}},[d,a]);let g=e=>{e(),a()},v=(0,U.useCallback)((e,t)=>{if(e.key===`Tab`){a();return}let n=u.current.filter(Boolean).length;if(e.key===`ArrowDown`){e.preventDefault();let r=(t+1)%n;u.current[r]?.focus()}else if(e.key===`ArrowUp`){e.preventDefault();let r=(t-1+n)%n;u.current[r]?.focus()}},[a]),y=r||i,b=!!d,x=(0,G.jsxs)(`div`,{ref:l,className:p(`absolute right-0 top-full z-10 mt-2 w-[160px] rounded-md border border-[var(--oh-border-subtle)] bg-tertiary px-1 py-1 shadow-lg`,_,b&&`!static !top-auto !bottom-auto !left-auto !right-auto !mt-0`),role:`menu`,"aria-orientation":`vertical`,"data-testid":`agent-profile-actions-menu`,children:[(0,G.jsx)(k,{index:0,icon:(0,G.jsx)(T,{width:16,height:16}),label:c(f.SETTINGS$PROFILE_EDIT),onClick:()=>g(e),onKeyDown:v,menuItemsRef:u,testId:`agent-profile-edit`}),(0,G.jsx)(k,{index:1,icon:(0,G.jsx)(N,{width:16,height:16}),label:c(f.SETTINGS$PROFILE_SET_ACTIVE),onClick:()=>g(t),onKeyDown:v,menuItemsRef:u,disabled:y,testId:`agent-profile-set-active`}),(0,G.jsx)(k,{index:2,icon:(0,G.jsx)(S,{width:16,height:16}),label:c(f.BUTTON$DELETE),onClick:()=>g(n),onKeyDown:v,menuItemsRef:u,testId:`agent-profile-delete`})]});return b?typeof document>`u`||!m?null:W.createPortal((0,G.jsx)(`div`,{style:m,children:x}),document.body):x}function q({profile:e,isActive:t,canManage:n,onActivate:r,onEdit:i,onDelete:a,isActivating:s}){let{t:c}=o(`openhands`),[l,u]=(0,U.useState)(!1),d=(0,U.useRef)(null),m=e.agent_kind===`openhands`?e.llm_profile_ref:c(f.SETTINGS$AGENT_TYPE_ACP);return(0,G.jsxs)(`div`,{"data-testid":`agent-profile-row`,className:p(P,`justify-between gap-3`),children:[(0,G.jsxs)(`div`,{className:`flex min-w-0 flex-1 items-center gap-3`,children:[(0,G.jsx)(`span`,{className:`min-w-0 max-w-full truncate text-sm font-medium text-white`,title:e.name,children:e.name}),m?(0,G.jsx)(`span`,{className:`min-w-0 max-w-full truncate text-sm text-[var(--oh-muted)]`,title:m,children:m}):null,t&&(0,G.jsx)(M,{className:`shrink-0 whitespace-nowrap px-2.5 py-1 text-xs`,"data-testid":`agent-profile-active-badge`,children:c(f.SETTINGS$PROFILE_DEFAULT)})]}),n&&(0,G.jsxs)(`div`,{className:`relative shrink-0`,children:[(0,G.jsx)(C,{ref:d,onClick:()=>u(e=>!e),ariaLabel:c(f.SETTINGS$PROFILE_MENU),testId:`agent-profile-menu-trigger`,className:I}),l&&(0,G.jsx)(K,{anchorRef:d,onEdit:()=>i(e),onSetActive:()=>r(e),onDelete:()=>a(e),isActive:t,isActivating:s,onClose:()=>u(!1)})]})]})}function J({isLoading:e,loadError:t,profiles:n,activeId:r,canManage:i,onActivate:a,onEdit:s,onDelete:c,isActivating:l}){let{t:u}=o(`openhands`);return e?(0,G.jsx)(`div`,{className:`flex justify-center p-4`,children:(0,G.jsx)(h,{size:`large`})}):t?(0,G.jsx)(`div`,{"data-testid":`agent-profiles-load-error`,className:D,children:(0,G.jsx)(`p`,{className:`text-sm text-red-400`,children:u(f.SETTINGS$PROFILES_LOAD_ERROR)})}):n.length===0?(0,G.jsx)(`div`,{"data-testid":`agent-profiles-empty`,className:D,children:(0,G.jsx)(`p`,{className:`text-sm text-[var(--oh-muted)]`,children:u(f.SETTINGS$PROFILES_EMPTY)})}):(0,G.jsx)(`div`,{className:p(L,F),children:n.map(e=>(0,G.jsx)(q,{profile:e,isActive:!!e.id&&e.id===r,canManage:i,onActivate:a,onEdit:s,onDelete:c,isActivating:l},e.name))})}function Y(){let e=a();return s({mutationFn:e=>b.deleteProfile(e),onSuccess:async()=>{await e.invalidateQueries({queryKey:c.all})},meta:{disableToast:!0}})}function X({profile:e,onClose:t}){let{t:n}=o(`openhands`),r=Y(),i=(0,U.useRef)(null);if(!e)return null;let a=async()=>{try{await r.mutateAsync(e.name),l(n(f.SETTINGS$PROFILE_DELETED,{name:e.name})),t()}catch(e){d(e instanceof Error?e.message:n(f.ERROR$GENERIC))}},s=()=>{r.isPending||t()},c=(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(g,{ref:i,type:`button`,variant:`tertiary`,onClick:s,isDisabled:r.isPending,children:n(f.BUTTON$CANCEL)}),(0,G.jsx)(g,{testId:`delete-agent-profile-confirm`,type:`button`,variant:`danger`,onClick:a,isDisabled:r.isPending,"aria-busy":r.isPending,children:r.isPending?(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(h,{size:`small`}),(0,G.jsx)(`span`,{className:`sr-only`,children:n(f.BUTTON$DELETE)})]}):n(f.BUTTON$DELETE)})]});return(0,G.jsx)(j,{isOpen:!0,title:n(f.SETTINGS$PROFILE_DELETE_TITLE),footer:c,onClose:s,initialFocusRef:i,children:(0,G.jsx)(`p`,{className:`text-sm break-all`,children:n(f.SETTINGS$PROFILE_DELETE_CONFIRMATION,{name:e.name})})})}function te({onAddProfile:e,onEditProfile:t}){let{t:n}=o(`openhands`),{data:r,isLoading:i,error:a}=x(),s=z(),c=w(),[u,d]=(0,U.useState)(null),p=r?.profiles??[],m=r?.active_agent_profile_id??null;return(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,G.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,G.jsx)(`h2`,{className:`text-base font-medium text-white`,children:n(f.SETTINGS$AVAILABLE_PROFILES)}),e&&c?(0,G.jsx)(g,{testId:`add-agent-profile`,type:`button`,variant:`secondary`,className:`ml-auto`,onClick:e,children:n(f.SETTINGS$ADD_AGENT_PROFILE)}):null]}),(0,G.jsx)(J,{isLoading:i,loadError:a??null,profiles:p,activeId:m,canManage:c,onActivate:async e=>{if(e.id)try{await s.mutateAsync(e.id),l(n(f.SETTINGS$PROFILE_ACTIVATED,{name:e.name}))}catch(e){console.error(`Failed to activate agent profile:`,e)}},onEdit:e=>t?.(e),onDelete:d,isActivating:s.isPending})]}),(0,G.jsx)(X,{profile:u,onClose:()=>d(null)})]})}function ne(){let e=a();return s({mutationFn:({name:e,newName:t})=>b.renameProfile(e,t),onSuccess:async()=>{await e.invalidateQueries({queryKey:c.all})},meta:{disableToast:!0}})}function re(e){if(e.agent_kind===`acp`)return{agent_kind:`acp`,acp_server:e.acp_server,acp_command:e.acp_command?V(e.acp_command):[],acp_args:e.acp_args??[],acp_model:e.acp_model??``};let t=e.enable_switch_llm_tool??!0;return{agent_kind:`openhands`,enable_sub_agents:e.enable_sub_agents,enable_switch_llm_tool:t,tool_concurrency_limit:e.tool_concurrency_limit}}function Z(){let{t:e}=o(`openhands`),{setHideSectionHeader:t}=ee(),n=R(),r=ne(),{data:i}=x(),{data:a,isLoading:s}=y(),[c,p]=(0,U.useState)(`list`),[h,_]=(0,U.useState)(``),[S,C]=(0,U.useState)(null),[w,T]=(0,U.useState)(null),[D,k]=(0,U.useState)(``),[j,M]=(0,U.useState)(null),[N,P]=(0,U.useState)(!1);(0,U.useEffect)(()=>(t(c!==`list`),()=>t(!1)),[c,t]);let F=a?.profiles??[],I=a?.active_profile??F[0]?.name??``,L=(0,U.useMemo)(()=>new Set(i?.profiles?.map(e=>e.name)??[]),[i]),z=(0,U.useMemo)(()=>!(!A(h,{isRequired:!0})||c===`create`&&L.has(h)||c===`edit`&&h!==S?.name&&L.has(h)),[h,c,L,S?.name]),V=(0,U.useCallback)(()=>{_(``),C(null),T({agent_kind:`openhands`}),k(I),M(null),p(`create`)},[I]),W=(0,U.useCallback)(async t=>{try{let e=(await b.getProfile(t.name,`encrypted`)).profile;C(e),T(re(e)),e.agent_kind===`openhands`?k(s||F.some(t=>t.name===e.llm_profile_ref)?e.llm_profile_ref:I):k(``),_(e.name),M(null),p(`edit`)}catch(t){console.error(`Failed to fetch agent profile:`,t),d(e(f.ERROR$GENERIC))}},[e,F,s,I]),K=(0,U.useCallback)(()=>{p(`list`),C(null),_(``),T(null),M(null)},[]),q=(0,U.useCallback)(async()=>{if(!j||!z)return;let t;try{let n=j.buildAgentProfileFields();if(n.agent_kind===`openhands`){if(!D){d(e(f.SETTINGS$AGENT_PROFILE_LLM_REQUIRED));return}t={...n,llm_profile_ref:D}}else t=n}catch(t){d(t instanceof Error?t.message:e(f.ERROR$GENERIC));return}let i=h.trim(),a=S?.name,o=c===`edit`&&a&&a!==i;P(!0);try{if(j.credentials.isDirty){if(!await j.credentials.save({silent:!0}))return;j.credentials.reset()}o&&await r.mutateAsync({name:a,newName:i});let s=B(c===`edit`?S:null,t);await n.mutateAsync({name:i,profile:s}),l(e(c===`create`?f.SETTINGS$PROFILE_CREATED:f.SETTINGS$PROFILE_UPDATED,{name:i})),K()}catch(t){d(u(t)||e(f.ERROR$GENERIC))}finally{P(!1)}},[j,z,D,h,c,S,n,r,e,K]);if(c===`list`)return(0,G.jsx)(te,{onAddProfile:V,onEditProfile:W});let J=e(c===`edit`?f.SETTINGS$EDIT_AGENT_PROFILE:f.SETTINGS$ADD_AGENT_PROFILE),Y=c===`edit`&&S?e(f.SETTINGS$PROFILE_LOADED,{name:S.name}):e(f.SETTINGS$PROFILE_SAVE_HINT),X=j?.agentType!==`acp`,Z=c===`edit`&&h!==S?.name,Q=S?.agent_kind===`openhands`?S.llm_profile_ref:``,$=c===`edit`&&X&&D!==Q,ie=c===`create`||!!j?.isDirty||Z||$;return(0,G.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,G.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,G.jsx)(m,{testId:`back-to-agent-profiles`,onClick:K,children:e(f.BUTTON$BACK)}),(0,G.jsx)(E.H2,{testId:`agent-profile-editor-title`,children:J}),(0,G.jsx)(`p`,{"data-testid":`agent-profile-editor-description`,className:`text-sm leading-5 text-tertiary-light`,children:Y})]}),(0,G.jsx)(O,{testId:`agent-profile-name-input`,value:h,onChange:_,isRequired:!0}),(0,G.jsx)(H,{embedded:!0,agentSettingsOverride:w,onSaveControlChange:M},c===`edit`?`edit-${S?.id}`:`new-profile`),X&&(F.length>0?(0,G.jsx)(v,{testId:`agent-profile-llm-selector`,name:`agent-profile-llm`,label:e(f.SETTINGS$AGENT_PROFILE_LLM_LABEL),items:F.map(e=>({key:e.name,label:e.model?`${e.name} (${e.model})`:e.name})),selectedKey:D,onSelectionChange:e=>e&&k(String(e))}):(0,G.jsx)(`p`,{"data-testid":`agent-profile-no-llm`,className:`text-sm text-red-400`,children:e(f.SETTINGS$AGENT_PROFILE_NO_LLM)})),(0,G.jsxs)(`div`,{className:`flex justify-start gap-3 pt-4`,children:[(0,G.jsx)(g,{testId:`cancel-agent-profile-btn`,type:`button`,variant:`secondary`,onClick:K,children:e(f.BUTTON$CANCEL)}),(0,G.jsx)(g,{testId:`save-agent-profile-btn`,type:`button`,variant:`primary`,onClick:q,isDisabled:!z||N||!j?.isValid||!ie,"aria-busy":N,children:e(N?f.SETTINGS$SAVING:f.BUTTON$SAVE)})]})]})}var Q={hideTitle:!1},$=i(function(){return(0,G.jsx)(Z,{})});export{$ as default,Q as handle};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e=`Disconnected (check URL or network). Check that the backend URL is correct and the backend server is reachable. If the backend is on another origin, check that it allows this frontend origin.`,t=`Disconnected (request timed out). Check that the backend URL is correct and reachable.`,n=4;function r(e){return typeof e==`object`&&!!e}function i(e){let t=[],i=new Set,a=e,o=0;for(;a!=null&&o<n&&!i.has(a);){if(i.add(a),a instanceof Error)a.message&&t.push(a.message),a=a.cause;else if(typeof a==`string`){a&&t.push(a);break}else if(r(a)){let e=a.message;typeof e==`string`&&e&&t.push(e),a=a.cause}else break;o+=1}return t}function a(e){if(!e)return!1;let t=e.toLowerCase();return t.includes(`disconnected (check cors or network)`)||t.includes(`disconnected (check url or network)`)||t.includes(`blocked by cors`)||t.includes(`failed to fetch`)||t.includes(`network error`)||t.includes(`load failed`)||t.includes(`networkerror when attempting to fetch resource`)||t.includes(`cors`)&&t.includes(`blocked`)}function o(e){return i(e).some(a)}function s(e){if(!e)return!1;let t=e.toLowerCase();return t.includes(`request timeout`)||t.includes(`timeout after`)||t.includes(`backend request timed out`)}function c(n){let r=i(n);return r.some(a)?e:r.some(s)?t:r[0]??null}var l=`openhands-backend-health`,u=500;function ee(e){if(typeof e!=`object`||!e)return!1;let t=e;return Number.isInteger(t.consecutiveFailures)&&t.consecutiveFailures>=0&&t.consecutiveFailures<=5&&(t.lastError===null||typeof t.lastError==`string`)&&(t.lastFailureAt===null||typeof t.lastFailureAt==`number`)&&typeof t.disabled==`boolean`}function te(){if(typeof window>`u`)return{};try{let e=window.localStorage.getItem(l);if(!e)return{};let t=JSON.parse(e);if(typeof t!=`object`||!t)return{};let n={};for(let[e,r]of Object.entries(t))typeof e==`string`&&e.length>0&&ee(r)&&(n[e]=r);return n}catch{return{}}}function ne(e){if(!(typeof window>`u`))try{if(Object.keys(e).length===0){window.localStorage.removeItem(l);return}window.localStorage.setItem(l,JSON.stringify(e))}catch{}}function re(e){let t=c(e)??`Unknown error`;return t.length>u?`${t.slice(0,u)}…`:t}var d=te(),f=new Set;function ie(){f.forEach(e=>e())}function p(e){d=e,ne(e),ie()}function ae(){return d}function oe(e){return d[e]??null}function se(e){return f.add(e),()=>{f.delete(e)}}function ce(e,t){let n=d[e],r=Math.min((n?.consecutiveFailures??0)+1,5),i=n?.disabled===!0||r>=5,a={consecutiveFailures:r,lastError:re(t),lastFailureAt:Date.now(),disabled:i};p({...d,[e]:a})}function le(e){if(!(e in d))return;let{[e]:t,...n}=d;p(n)}function ue(e){if(!(e in d))return;let{[e]:t,...n}=d;p(n)}function de(e){if(!(e in d))return;let{[e]:t,...n}=d;p(n)}var m=`workspace/project`,fe=`__AGENT_CANVAS_LOCK_TO_CLOUD__`,h=`all-hands.dev`,g=`openhands.dev`,pe=`app.${h}`,me=g,he=`app.${g}`;function _(e){return e?.trim()||null}function v(e){if(!e)return null;let t=e.trim().replace(/\/$/,``);return t?/^https?:\/\//i.test(t)?t:typeof window<`u`?`${window.location.protocol}//${t}`:`http://${t}`:null}function y(e){if(!e)return null;let t=e.trim().replace(/\/+$/,``);return t?/^https?:\/\//i.test(t)?t:`https://${t}`:null}function ge(e){let t=e.toLowerCase();return t===pe||t===he?me:t===h?g:t.endsWith(`.${h}`)?`${t.slice(0,-13)}${g}`:t}function b(e){let t=y(e);if(!t)return null;try{let e=new URL(t),n=e.port?`:${e.port}`:``;return`${e.protocol}//${ge(e.hostname)}${n}`}catch{return t.toLowerCase()}}function x(){let e=S();return!e||typeof window>`u`||!C(window.location.origin,e)?null:window.location.origin}function _e(){return v(void 0)}function ve(){let e=_(void 0);if(e)return e;if(typeof window<`u`){let e=window.__AGENT_CANVAS_SESSION_API_KEY__;if(typeof e==`string`)return _(e)}return null}function ye(){return{baseUrl:w()??``,sessionApiKey:T()??``}}function S(){let e=y(void 0);if(e)return e;if(typeof window<`u`){let e=window[fe];if(typeof e==`string`)return y(e)}return null}function C(e,t){let n=b(e),r=b(t);return!n||!r?!1:n===r}function be(){return x()?`cookie`:`api-key`}function w(){return _e()||(typeof window<`u`?window.location.origin:null)}function T(){return ve()}function E(){return m}function D(e,t){return`${e.replace(/\/+$/,``)}/${t.replace(/-/g,``)}`}function xe(e){return D(E(),e)}function Se(e){return D(m,e)}function Ce(e){let t=v(w()),n=v(e);return!t||!n?!1:t===n}function we(e,t){return Ce(t)?xe(e):Se(e)}function Te(e){return Ce(e)?E():m}function Ee(){let e=T();return e?{"X-Session-API-Key":e}:{}}function O(){return typeof window<`u`&&window.__AGENT_CANVAS_AUTH_REQUIRED__===!0}function De(){return O()?!T():!1}var k=`default-local`,A=`Local`,Oe=`locked-cloud`,ke=`OpenHands Cloud`;function Ae(){if(!S())return null;let e=x();return e?{id:Oe,name:ke,host:e,apiKey:``,kind:`cloud`,authMode:`cookie`}:null}function j(){if(S())return null;let e=w(),t=T();return!e||!t?null:{id:k,name:A,host:e,apiKey:t,kind:`local`}}var je=`openhands-backends`,M=`openhands-active-backend`;function Me(e){return e===`local`||e===`cloud`}function Ne(e){return e===void 0||e===`api-key`||e===`cookie`}function Pe(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.id==`string`&&t.id.length>0&&typeof t.name==`string`&&typeof t.host==`string`&&typeof t.apiKey==`string`&&Me(t.kind)&&Ne(t.authMode)&&(t.connectionRevision===void 0||typeof t.connectionRevision==`number`&&Number.isSafeInteger(t.connectionRevision)&&t.connectionRevision>=0)}function Fe(e){try{let{hostname:t}=new URL(e);return t===`localhost`||t===`127.0.0.1`||t===`::1`||t===`[::1]`}catch{return!1}}function Ie(e,t){return e.id!==`default-local`||e.kind!==`local`?!1:e.host===t.host||Fe(e.host)&&Fe(t.host)}function Le(e){let t=j();if(!t)return e;let n=!1,r=e.map(e=>!Ie(e,t)||e.apiKey===t.apiKey?e:(n=!0,{...e,apiKey:t.apiKey}));return n?(N(r),r):e}function N(e){if(!(typeof window>`u`))try{window.localStorage.setItem(je,JSON.stringify(e))}catch{}}function Re(){if(typeof window>`u`)return[];try{let e=Ae();if(e)return N([e]),R()?.backendId!==e.id&&z({backendId:e.id}),[e];let t=window.localStorage.getItem(je);if(t===null){let e=j();return e?(N([e]),[e]):[]}let n=JSON.parse(t);if(!Array.isArray(n))return[];let r=n.filter(Pe);if(r.length===0){let e=j();return e?(N([e]),[e]):[]}return Le(r)}catch{return[]}}function P(e){if(!e)return null;try{let t=JSON.parse(e);if(typeof t!=`object`||!t||typeof t.backendId!=`string`)return null;let n=t.orgId;return{backendId:t.backendId,orgId:typeof n==`string`&&n.length>0?n:null}}catch{return null}}function F(e,t){try{return e?.getItem(t)??null}catch{return null}}function I(e,t,n){try{e?.setItem(t,n)}catch{}}function L(e,t){try{e?.removeItem(t)}catch{}}function R(){return typeof window>`u`?null:P(F(window.sessionStorage,M))||P(F(window.localStorage,M))}function z(e){if(typeof window>`u`)return;if(!e){L(window.sessionStorage,M),L(window.localStorage,M);return}let t=JSON.stringify({backendId:e.backendId,orgId:e.orgId??null});I(window.sessionStorage,M,t),I(window.localStorage,M,t)}var B=`backend`;function ze(e,t){let{backend:n,orgId:r}=t;if(!n.id)return e;let i=e.indexOf(`#`),a=i===-1?``:e.slice(i),o=i===-1?e:e.slice(0,i),s=o.indexOf(`?`),c=s===-1?o:o.slice(0,s),l=s===-1?``:o.slice(s+1),u=new URLSearchParams(l);return u.set(B,n.id),r&&u.set(`org`,r),`${c}?${u.toString()}${a}`}function Be(e,t){if(!t)return null;let n;try{n=new URLSearchParams(t)}catch{return null}let r=n.get(B);return!r||!e.some(e=>e.id===r)?null:{backendId:r,orgId:n.get(`org`)||null}}function Ve(){return typeof window>`u`?``:window.location.search}var V=`no-backend`,H={id:V,name:`No Backend Available`,host:``,apiKey:``,kind:`local`};function U(e){return e.id===V}function He(e){return e.find(e=>e.kind===`local`&&oe(e.id)?.disabled!==!0)||(e.find(e=>e.kind===`local`)??e[0]??H)}function W(e,t){let n=null,r=null;if(t){let i=e.find(e=>e.id===t.backendId);i&&(n=i,r=t.orgId??null)}return n||(n=He(e),r=null),{backends:e,selection:t,active:{backend:n,orgId:r}}}function Ue(e){let t=Be(e,Ve());return t?(z(t),t):R()}var G=Re(),K=W(G,Ue(G)),q=new Set;function J(){q.forEach(e=>e())}function We(){return K.active}function Y(){let e=K.active.backend;return e.kind===`local`&&!U(e)?e:null}function Ge(){return K.backends}function Ke(){return K.selection}function qe(){return K}function Je(e){z(e),K=W(K.backends,e),J()}function Ye(e){N(e);let t=K.selection;t&&!e.some(e=>e.id===t.backendId)&&(t=null,z(null)),K=W(e,t),J()}function Xe(e){return q.add(e),()=>{q.delete(e)}}function X(e){if(e&&!e.startsWith(`/`))try{let t=new URL(e),n=t.hostname,r=window.location.hostname??window.location.host?.split(`:`)[0];return r&&(n===`localhost`||n===`127.0.0.1`)&&r!==`localhost`&&r!==`127.0.0.1`?`${r}:${t.port}`:t.host}catch{return window.location.host}return window.location.host}function Z(e){if(e&&!e.startsWith(`/`))try{return(new URL(e).pathname.split(`/api/conversations`)[0]||``).replace(/\/$/,``)}catch{return``}return``}function Ze(e){let t=X(e),n=Z(e),r=window.location.protocol===`https:`,i=Q(e)===`https:`;return`${r||i?`https:`:`http:`}//${t}${n}`}function Q(e){if(!e||e.startsWith(`/`))return null;try{return new URL(e).protocol}catch{return null}}function Qe(e){let t=X(e),n=Z(e),r=window.location.protocol===`https:`,i=Q(e)===`https:`;return`${r||i?`wss:`:`ws:`}//${t}${n}/sockets/bash-events`}function $e(e,t){if(!e)return null;let n=X(t),r=Z(t),i=window.location.protocol===`https:`,a=Q(t)===`https:`;return`${i||a?`wss:`:`ws:`}//${n}${r}/sockets/events/${e}`}var et=class extends Error{constructor(){super(`No backend is configured.`),this.name=`NoBackendAvailableError`}};function $(e){return e.replace(/\/+$/,``)}function tt(e,t){return e.host?$(e.host):e.conversationUrl?$(Ze(e.conversationUrl)):$(t?.host??``)}function nt(e={}){let t=Y();if(!t&&!e.host&&!e.conversationUrl)throw new et;let n=e.sessionApiKey??e.apiKey??t?.apiKey??void 0;return{host:tt(e,t),...n?{apiKey:n}:{},workingDir:e.workingDir??E(),...e.timeout===void 0?{}:{timeout:e.timeout}}}function rt(e){let{host:t,apiKey:n,timeout:r}=nt(e);return{baseUrl:t,...n?{apiKey:n}:{},timeout:r??6e4}}export{O as A,s as B,w as C,be as D,E,ce as F,a as H,le as I,ue as L,C as M,de as N,S as O,ae as P,se as R,we as S,Ee as T,o as V,ze as _,Ze as a,j as b,We as c,Ge as d,qe as f,Xe as g,Ye as h,Qe as i,De as j,Te as k,Ke as l,Je as m,nt as n,$e as o,U as p,rt as r,H as s,et as t,Y as u,A as v,ye as w,m as x,k as y,c as z};
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/profiles-service.api-BbOK0EkF.js","assets/rolldown-runtime-Cyuzqnbw.js","assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-Z0lly3FE.js","assets/vendor-styling-Ck5D_A2Q.js","assets/agent-server-client-options-BikiNwTa.js","assets/proxy-CBgMd2zf.js","assets/agent-profiles-service.api-Biieml2L.js","assets/secrets-service-Cr8g8xuv.js","assets/active-backend-context-rZiLJRUc.js","assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BfkNGovw.js","assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-DnDoaYNi.js","assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~i58xkef6-cHFhpUBq.js","assets/utils-BOco8mxR.js","assets/hooks-service-C6dpRtZM.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{xt as e}from"./vendor-styling-Ck5D_A2Q.js";import{K as t,X as n,f as r,w as i}from"./active-backend-context-rZiLJRUc.js";import{D as a}from"./utils-BOco8mxR.js";import{E as o,S as s,a as c,c as l,d as u,k as ee,n as d,t as te,u as ne}from"./agent-server-client-options-BikiNwTa.js";import{l as f,p as re,v as p,x as ie,y as m}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-Z0lly3FE.js";import{r as h,t as g}from"./vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~inibp4qe-CnsDDzeE.js";import{t as _}from"./proxy-CBgMd2zf.js";import{n as ae}from"./vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-C7HiY4Ae.js";import{t as v}from"./settings-CKqk8ZnH.js";import{t as oe}from"./settings-service.api-9_xdv_mh.js";import{t as se}from"./profiles-service.api-BbOK0EkF.js";import{f as y,o as ce,s as b}from"./acp-providers-DrjNsPOH.js";import{c as x,n as S,r as C}from"./skill-enablement-DXeaImBz.js";import{d as w,f as le,r as ue}from"./llm-subscription-DTqtBCWz.js";import{t as de}from"./llm-subscription-service-aDNBQ7Gq.js";var T=[];for(let e=0;e<256;++e)T.push((e+256).toString(16).slice(1));function fe(e,t=0){return(T[e[t+0]]+T[e[t+1]]+T[e[t+2]]+T[e[t+3]]+`-`+T[e[t+4]]+T[e[t+5]]+`-`+T[e[t+6]]+T[e[t+7]]+`-`+T[e[t+8]]+T[e[t+9]]+`-`+T[e[t+10]]+T[e[t+11]]+T[e[t+12]]+T[e[t+13]]+T[e[t+14]]+T[e[t+15]]).toLowerCase()}var pe=new Uint8Array(16);function me(){return crypto.getRandomValues(pe)}function E(e,t,n){return!t&&!e&&crypto.randomUUID?crypto.randomUUID():he(e,t,n)}function he(e,t,n){e||={};let r=e.random??e.rng?.()??me();if(r.length<16)throw Error(`Random bytes length must be >= 16`);if(r[6]=r[6]&15|64,r[8]=r[8]&63|128,t){if(n||=0,n<0||n+16>t.length)throw RangeError(`UUID byte range ${n}:${n+15} is out of buffer bounds`);for(let e=0;e<16;++e)t[n+e]=r[e];return t}return fe(r)}var D=new Map;function ge(e){return/^([/\\]|[a-zA-Z]:[/\\])/.test(e)}function _e(e,t){return`${e.replace(/[/\\]+$/,``)}/${t.replace(/^[/\\]+/,``)}`}async function ve(e={}){let t=d(e),n=t.host,r=D.get(n);if(r)return r;let i=(async()=>{let{home:e}=await new p(t).getHome();if(!e||typeof e!=`string`)throw Error(`Agent server returned an empty home directory`);return e.replace(/[/\\]+$/,``)})();D.set(n,i);try{return await i}catch(e){throw D.delete(n),e}}async function O(e,t={}){let n=e.replace(/[/\\]+$/,``);return n?ge(n)?n:_e(await ve(t),n):ve(t)}var k=`openhands-agent-server-conversation-metadata`,ye=e=>({source:e.source,ref:e.ref??null,repo_path:e.repo_path??null}),A=()=>{if(typeof window>`u`)return{};try{let e=window.localStorage.getItem(k);if(!e)return{};let t=JSON.parse(e);return!t||typeof t!=`object`?{}:t}catch{return{}}},be=e=>{if(!(typeof window>`u`)){if(Object.keys(e).length===0){window.localStorage.removeItem(k);return}window.localStorage.setItem(k,JSON.stringify(e))}},j=e=>A()[e]??null,M=(e,t)=>{let n=A();n[e]=t,be(n)},xe=(e,t)=>{M(e,{selected_repository:null,selected_branch:null,git_provider:null,...j(e)??{},...t})},N=e=>{let t=A();e in t&&(delete t[e],be(t))};function Se(e){if(!e?.id)return e;let t=j(e.id);return t?{...e,selected_repository:e.selected_repository??t.selected_repository??null,selected_branch:e.selected_branch??t.selected_branch??null,git_provider:e.git_provider??t.git_provider??null,selected_workspace:e.selected_workspace??t.selected_workspace??null}:e}function P(){let e=l().backend;if(e.kind!==`cloud`)throw Error(`Cloud conversations call requires a cloud backend.`);return e}function Ce(){let e=l().backend;return e.kind===`cloud`?e:u().find(e=>e.kind===`cloud`&&!!e.apiKey)??null}async function we(e=20,t){let n=P(),r=new URLSearchParams;r.set(`limit`,String(e)),t&&r.set(`page_id`,t),r.set(`sort_order`,`UPDATED_AT_DESC`);let i=await _({backend:n,method:`GET`,path:`/api/v1/app-conversations/search?${r.toString()}`});return{items:(i?.items??[]).map(e=>Se(e)),next_page_id:i?.next_page_id??null}}async function F(e){if(e.length===0)return[];let t=P(),n=new URLSearchParams;for(let t of e)n.append(`ids`,t);return(await _({backend:t,method:`GET`,path:`/api/v1/app-conversations?${n.toString()}`})??[]).map(Se)}async function Te(e,t){return await _({backend:t??P(),method:`POST`,path:`/api/v1/app-conversations`,body:e,headers:i})}async function Ee(e){return _({backend:P(),method:`GET`,path:`/api/v1/app-conversations/${e}/download`,responseType:`blob`})}async function De(e){await _({backend:P(),method:`DELETE`,path:`/api/v1/app-conversations/${e}`})}async function Oe(e,t){return await _({backend:P(),method:`PATCH`,path:`/api/v1/app-conversations/${e}`,body:{public:t}})}async function ke(e,t){return _({backend:P(),method:`PATCH`,path:`/api/v1/app-conversations/${e}`,body:{title:t}})}async function Ae(e){await _({backend:P(),method:`POST`,path:`/api/v1/sandboxes/${e}/pause`})}async function je(e){await _({backend:P(),method:`POST`,path:`/api/v1/sandboxes/${e}/resume`})}async function Me(e,t){let n=P(),r=new URLSearchParams;return r.append(`file_path`,t),await _({backend:n,method:`GET`,path:`/api/v1/app-conversations/${e}/file?${r.toString()}`})??``}async function Ne(e,t){let n=P(),r=new URLSearchParams;r.append(`path`,t);let i=await _({backend:n,method:`GET`,path:`/api/v1/app-conversations/${e}/files?${r.toString()}`});return Array.isArray(i)?i:[]}async function Pe(e,t){let n=t??P(),r=new URLSearchParams;return r.set(`ids`,e),(await _({backend:n,method:`GET`,path:`/api/v1/app-conversations/start-tasks?${r.toString()}`}))?.[0]??null}function Fe(e){return e.kind===`cloud`&&e.authMode===`cookie`||!e.apiKey?{}:e.kind===`cloud`?{Authorization:`Bearer ${e.apiKey}`}:{"X-Session-API-Key":e.apiKey}}function Ie(e){if(!e?.usage_to_metrics)return{accumulated_cost:0,max_budget_per_task:null,accumulated_token_usage:null};let t=0,n=null,r=null;for(let i of Object.values(e.usage_to_metrics))t+=i.accumulated_cost,n===null&&i.max_budget_per_task!==null&&(n=i.max_budget_per_task),i.accumulated_token_usage&&(r=r===null?{...i.accumulated_token_usage}:{prompt_tokens:r.prompt_tokens+i.accumulated_token_usage.prompt_tokens,completion_tokens:r.completion_tokens+i.accumulated_token_usage.completion_tokens,cache_read_tokens:r.cache_read_tokens+i.accumulated_token_usage.cache_read_tokens,cache_write_tokens:r.cache_write_tokens+i.accumulated_token_usage.cache_write_tokens,context_window:Math.max(r.context_window,i.accumulated_token_usage.context_window),per_turn_token:Math.max(r.per_turn_token,i.accumulated_token_usage.per_turn_token)});return{accumulated_cost:t,max_budget_per_task:n,accumulated_token_usage:r}}function Le(e){return Ie(e.stats)}var Re=`canvas_ui`,I=`canvas_ui_control`,ze=`ClientAction_${I}`,Be={name:I,description:`The user is interacting with you inside Agent Canvas — a web UI with a chat panel on the left and a tabbed right-side panel (files, terminal, browser, vscode, planner, tasklist). This tool lets you drive that right-side panel so the user sees what you just produced.
|
|
3
|
-
|
|
4
|
-
They will NOT see the files you wrote, the terminal output, or the browser
|
|
5
|
-
unless you call this tool to switch the right-side panel to the relevant
|
|
6
|
-
tab. Call this every time you finish work that produces something the user
|
|
7
|
-
should look at — don't rely on them noticing on their own.
|
|
8
|
-
|
|
9
|
-
When to call (pick the most specific option that matches your last action):
|
|
10
|
-
|
|
11
|
-
* You wrote or modified a single file (ANY language, ANY size — including
|
|
12
|
-
small scripts like a hello-world bash file) →
|
|
13
|
-
command="navigate_to_file", path=<workspace-relative path of that file>
|
|
14
|
-
|
|
15
|
-
* You generated an HTML page, image, SVG, PDF, markdown report, or other
|
|
16
|
-
previewable artifact →
|
|
17
|
-
command="show_preview", path=<that file>
|
|
18
|
-
|
|
19
|
-
* You finished editing multiple files in one logical step →
|
|
20
|
-
command="open_tab", tab="files"
|
|
21
|
-
(The Files tab automatically renders a diff view when the workspace has
|
|
22
|
-
uncommitted git changes, which covers the "highlight changes" case.)
|
|
23
|
-
|
|
24
|
-
* You ran a long-running terminal command, or one whose output the user
|
|
25
|
-
should inspect →
|
|
26
|
-
command="open_tab", tab="terminal"
|
|
27
|
-
|
|
28
|
-
* You browsed to a URL the user should see →
|
|
29
|
-
First call browser_get_state(include_screenshot=true) after your final
|
|
30
|
-
browser interaction so Agent Canvas has a screenshot to display, then call
|
|
31
|
-
command="open_tab", tab="browser"
|
|
32
|
-
(browser_navigate alone only updates the URL; without browser_get_state,
|
|
33
|
-
the Browser tab will open without a screenshot.)
|
|
34
|
-
|
|
35
|
-
Call this BEFORE writing your chat-message summary of the change, so the
|
|
36
|
-
artifact is visible while the user reads what you did. One canvas_ui_control
|
|
37
|
-
call per logical step is enough — don't repeat it for the same file or tab in
|
|
38
|
-
the same turn.`,parameters:{type:`object`,additionalProperties:!1,properties:{command:{type:`string`,enum:[`navigate_to_file`,`open_tab`,`show_preview`],description:`UI command to dispatch.`},path:{type:`string`,description:`Workspace-relative file path. Required for navigate_to_file and show_preview; ignored otherwise.`},tab:{type:`string`,enum:[`files`,`browser`,`vscode`,`terminal`,`planner`,`tasklist`],description:`Tab to open. Required for open_tab; ignored otherwise.`}},required:[`command`]},annotations:{readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1}},L=`launch_child_conversation`,Ve=`ClientAction_${L}`,He=`[child-conversation] `,Ue=[`local`,`cloud`],We=[`worktree`,`shared`],Ge=`1.37.1`,Ke={name:L,description:`Start a NEW, independent conversation to work on a well-scoped task in parallel with this one, without the user having to run any CLI command. The new conversation is recorded as a child of this one.
|
|
39
|
-
|
|
40
|
-
The child runs on its own. It does not block you, you do not see its output,
|
|
41
|
-
and it cannot see this conversation's history — everything it needs must be in
|
|
42
|
-
the task brief.
|
|
43
|
-
|
|
44
|
-
Choosing target:
|
|
45
|
-
|
|
46
|
-
* target="local" — runs on the same machine, in this conversation's workspace.
|
|
47
|
-
Fast, no repository clone, no sandbox provisioning. Use this by default when
|
|
48
|
-
the work is on code that is already checked out here.
|
|
49
|
-
|
|
50
|
-
* target="cloud" — runs on OpenHands Cloud in its own isolated sandbox, from a
|
|
51
|
-
git repository. Use this when the work should not touch the user's machine or
|
|
52
|
-
when it needs a repository that is not checked out locally. Requires the user
|
|
53
|
-
to have an OpenHands Cloud backend connected in Agent Canvas; if none is
|
|
54
|
-
connected you will be told so and should fall back to target="local".
|
|
55
|
-
|
|
56
|
-
Writing the task brief:
|
|
57
|
-
|
|
58
|
-
* Put everything the child needs in "task": the goal, the relevant file paths,
|
|
59
|
-
the constraints, the expected deliverable, and how it should report back.
|
|
60
|
-
* Keep each child's scope independent of its siblings so parallel children do
|
|
61
|
-
not fight over the same files.
|
|
62
|
-
* One call per delegated task. Do NOT call this tool twice for the same task.
|
|
63
|
-
|
|
64
|
-
Parameter rules (a call that breaks one of these launches nothing and comes
|
|
65
|
-
back with corrective guidance):
|
|
66
|
-
|
|
67
|
-
* "repository" and "branch" apply to target="cloud" only. A local child always
|
|
68
|
-
inherits this conversation's workspace, so do not pass them with
|
|
69
|
-
target="local".
|
|
70
|
-
* "isolation" applies to target="local" only. Cloud sandboxes are always
|
|
71
|
-
isolated, so do not pass it with target="cloud".
|
|
72
|
-
* isolation="worktree" (the default) gives the child its own git worktree and
|
|
73
|
-
branch, cut from the repository's default branch — it will NOT see this
|
|
74
|
-
conversation's uncommitted or committed work. isolation="shared" puts the
|
|
75
|
-
child in this conversation's exact directory; only choose it when the child
|
|
76
|
-
genuinely must see work in progress, and expect the two agents to conflict.
|
|
77
|
-
|
|
78
|
-
What comes back: this tool is acknowledged immediately, before the conversation
|
|
79
|
-
exists. The real outcome arrives moments later as a follow-up message starting
|
|
80
|
-
with "${He.trim()}" that carries the child's
|
|
81
|
-
conversation id, URL, target and initial status — or an error with guidance.
|
|
82
|
-
Wait for it, then tell the user what you launched and give them the URL. If it
|
|
83
|
-
reports an error, fix the parameters and call this tool again.`,parameters:{type:`object`,additionalProperties:!1,properties:{target:{type:`string`,enum:[...Ue],description:`Where the child runs. 'local' reuses this machine and this conversation's workspace; 'cloud' runs in an isolated OpenHands Cloud sandbox.`},task:{type:`string`,description:`Self-contained task brief, sent as the child's first message. The child cannot see this conversation, so state the goal, constraints, expected output and handoff criteria.`},title:{type:`string`,description:`Optional short title for the child conversation. Omit to let it title itself from the task.`},repository:{type:`string`,description:`target='cloud' only. Repository to clone into the sandbox, as 'owner/repo'. Defaults to this conversation's repository when it has one.`},branch:{type:`string`,description:`target='cloud' only, and only together with 'repository'. Defaults to the repository's default branch.`},isolation:{type:`string`,enum:[...We],description:`target='local' only. 'worktree' (default) gives the child its own git worktree and branch; 'shared' runs it in this conversation's exact directory.`}},required:[`target`,`task`]},annotations:{readOnlyHint:!1,destructiveHint:!1,idempotentHint:!1,openWorldHint:!0}},qe=`.agents_tmp/PLAN.md`,Je=`system_prompt_planning.j2`,Ye=`planning_file_editor`,R=`plannerparent`,Xe=`PLAN.MD`,Ze=[`The plan must follow this structure exactly:`,``,`1. OBJECTIVE`,` * Summarize the goal of the plan in one or two sentences.`,` * Restate the problem in clear operational terms.`,``,`2. CONTEXT SUMMARY`,` * Briefly describe the relevant system components, files, or data involved.`,` * Mention any dependencies or constraints (technical, organizational, or external).`,``,`3. APPROACH OVERVIEW`,` * Outline the chosen approach at a high level.`,` * Mention why it was selected (short rationale) if alternatives were considered.`,``,`4. IMPLEMENTATION STEPS`,` * Provide a step-by-step plan for execution.`,` * Each step should include:`,` - a **goal** (what this step accomplishes),`,` - a **method** (how to do it, briefly),`,` - and optionally a **reference** (file, module, or function impacted).`,``,`5. TESTING AND VALIDATION`,` * Describe how the implementation can be verified or validated.`,` * This section should describe what success looks like — expected outputs, behaviors, or conditions.`].join(`
|
|
84
|
-
`),Qe=[`<IMPORTANT_PLANNING_BOUNDARIES>`,`You are a Planning Agent that can ONLY create plans - you CANNOT execute code or make changes.`,``,`Create or update the plan for the current task in the configured PLAN.md file.`,``,`After you finalize the plan in PLAN.md:`,`- Do NOT ask "Ready to proceed?" or offer to execute the plan`,`- Do NOT attempt to run any implementation commands`,`- Instead, tell the user they can click the **Build** button below the plan preview to switch to the code agent and execute the plan.`,``,`Your role ends when the plan is finalized. Implementation is handled by the code agent.`,`</IMPORTANT_PLANNING_BOUNDARIES>`].join(`
|
|
85
|
-
`);function $e(e){return`${e.replace(/\/+$/,``)}/${qe}`}function et(e){if(!e)return!1;let t=e.replace(/\\/g,`/`).toUpperCase();return t===Xe||t.endsWith(`/${Xe}`)}function tt(e,t){return e?.tags?.[R]===t}function nt(e,t){return t?e?.find(e=>tt(e,t))?.id??null:null}var rt=[`terminal`,`file_editor`,`task_tracker`],it=`browser_tool_set`,at=`task_tool_set`,ot=500;function st(e){return typeof e==`number`?e:ot}function ct(){return!0}function z(e){if(typeof e==`string`){let t=e.trim();if(!t)return null;try{return z(JSON.parse(t))}catch{return null}}if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e;return!t.services||typeof t.services!=`object`?null:t}async function lt(){let e;try{e=d({timeout:3e3})}catch{return null}let n=z(t({host:e.host})?.runtime_services);if(n)return n;try{return z((await new ie(e).getServerInfo()).runtime_services)}catch{return null}}function ut(e){let t=z(e);if(!t?.services)return;let n=[];n.push(`<RUNTIME_SERVICES>`),t.mode?n.push(`You are running inside an agent-canvas dev stack started in '${t.mode}' mode.`):n.push(`You are running inside an agent-canvas dev stack.`),n.push(`The following services are reachable from your sandbox. URLs are written`,`from your point of view (i.e., as you should curl/fetch them).`,``);let{agent_server:r,ingress:i,automation:a}=t.services,{frontend:o}=t.services;r?.url_from_agent&&n.push(`* Agent Server (you): ${r.url_from_agent}`,` ${r.description??`The agent-server hosting your tool calls.`}`),i?.url_from_agent&&n.push(`* Ingress: ${i.url_from_agent}`,` ${i.description??`Unified entry point for browser-facing traffic.`}`),o?.url_from_agent&&n.push(`* Frontend: ${o.url_from_agent}`,` ${o.description??`Frontend dev server.`}`),a?.url_from_agent?(n.push(`* Automation backend: ${a.url_from_agent}`,` ${a.description??`OpenHands Automations service.`}`),a.docs_url&&n.push(` Docs: ${a.docs_url}`),a.openapi_url&&n.push(` OpenAPI: ${a.openapi_url}`),a.auth_env_var&&n.push(` Auth: header 'X-Session-API-Key: $${a.auth_env_var}'`)):n.push(`* Automation backend: not running in this dev mode (skip /api/automation calls).`);let s=r?.url_from_agent;return n.push(``,`Trust this block over guessing: do not assume any other URLs are running.`),s&&n.push(`In particular, ${s} inside your sandbox is the Agent Server`,`you are running inside of — NOT the automation backend.`),n.push(`</RUNTIME_SERVICES>`),n.join(`
|
|
86
|
-
`)}function dt(e){let{host:t}=d();return`${t}/api/conversations/${e}`}function ft(e){return`Conversation ${e.slice(0,5)}`}function B(e){let t=j(e.id),n=e.agent?.kind===`ACPAgent`,r=n?e.tags?.acpserver??e.agent?.acp_server??null:null;return{id:e.id,created_by_user_id:null,selected_repository:t?.selected_repository??null,selected_branch:t?.selected_branch??null,git_provider:t?.git_provider??null,selected_workspace:t?.selected_workspace??null,active_profile:t?.active_profile??null,title:e.title?.trim()?e.title:ft(e.id),trigger:null,pr_number:[],agent_kind:n?`acp`:`openhands`,acp_server:r,tags:e.tags??null,launched_agent_profile:e.launched_agent_profile??null,llm_model:n?y({runtimeName:e.current_model_name,runtimeId:e.current_model_id,configured:e.agent?.acp_model,sdkLlm:e.agent?.llm?.model}):e.agent?.llm?.model??v.llm_model,metrics:e.metrics?{accumulated_cost:e.metrics.accumulated_cost??null,max_budget_per_task:e.metrics.max_budget_per_task??null,accumulated_token_usage:e.metrics.accumulated_token_usage?{prompt_tokens:e.metrics.accumulated_token_usage.prompt_tokens??0,completion_tokens:e.metrics.accumulated_token_usage.completion_tokens??0,cache_read_tokens:e.metrics.accumulated_token_usage.cache_read_tokens??0,cache_write_tokens:e.metrics.accumulated_token_usage.cache_write_tokens??0,context_window:e.metrics.accumulated_token_usage.context_window??0,per_turn_token:e.metrics.accumulated_token_usage.per_turn_token??0}:null}:Ie(e.stats),created_at:e.created_at,updated_at:e.updated_at,execution_status:e.execution_status??a.IDLE,sandbox_status:e.sandbox_status??null,conversation_url:dt(e.id),session_api_key:d().apiKey??null,sandbox_id:null,workspace:{working_dir:e.workspace?.working_dir??o()},public:!1,sub_conversation_ids:e.sub_conversation_ids??[]}}function pt(e){return{items:e.items.filter(e=>!e.tags?.[R]).map(B),next_page_id:e.next_page_id??null}}var mt=`acpserver`,V=`clientsource`,ht=`agentcanvas`,gt=`automationtrigger`,_t=`automationid`,H=`automationname`,vt=`automationrunid`,yt=[gt,_t,H,vt],bt=new Set([mt,V,gt,_t,H,vt,`title`,`git_provider`,`repo_name`,`repo`,`repository`,`selected_branch`,`branch`,`archiveworkspacepath`,`workspace`,`working_dir`,R]),xt=[`origin`];function St(e){if(!e)return[];let t=e=>{let t=xt.indexOf(e.trim().toLowerCase());return t===-1?1/0:t};return Object.entries(e).filter(([e,t])=>!bt.has(e.trim().toLowerCase())&&typeof t==`string`&&(t===``||t.trim().length>0)).sort(([e],[n])=>{let r=t(e),i=t(n);return r===i?e.localeCompare(n):r-i})}var Ct=`gAAAAA`,wt=new Set([`schema_version`,`agent_settings`,`workspace`,`conversation_id`,`initial_message`,`plugins`]);function U(e){return!e||typeof e!=`object`||Array.isArray(e)?{}:structuredClone(e)}function Tt(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function Et(e){let t=U(e);t.model=typeof t.model==`string`&&t.model.trim().length>0?t.model:v.llm_model;let n=Tt(t.api_key);n?t.api_key=n:delete t.api_key;let r=Tt(t.base_url);return r?t.base_url=r:delete t.base_url,le(t)?(t.auth_type=ue,t.subscription_vendor=w,delete t.api_key):(delete t.auth_type,delete t.subscription_vendor),t}function W(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function G(e){return typeof e==`string`?e.startsWith(Ct):Array.isArray(e)?e.some(G):W(e)?Object.values(e).some(G):!1}function Dt(e){return W(e)?Object.values(e).some(G):!1}function Ot(e){return e.confirmation_mode===!0?e.security_analyzer===`llm`?{kind:`ConfirmRisky`,threshold:`HIGH`,confirm_unknown:!0}:{kind:`AlwaysConfirm`}:{kind:`NeverConfirm`}}function kt(e){switch(e.security_analyzer){case`llm`:return{kind:`LLMSecurityAnalyzer`};case`pattern`:return{kind:`PatternSecurityAnalyzer`};case`policy_rail`:return{kind:`PolicyRailSecurityAnalyzer`};default:return}}function At(e){return!!e&&typeof e==`object`&&!Array.isArray(e)&&typeof e.name==`string`}function K(e,t){return e===it?ct()&&n(e):e===at?t.enable_sub_agents===!0&&n(e):!0}function jt(e){let t=new Map;for(let n of rt)K(n,e)&&t.set(n,{name:n,params:{}});for(let n of[it,at])K(n,e)&&t.set(n,{name:n,params:{}});let n=e.tools;if(Array.isArray(n)&&n.every(e=>At(e)))for(let r of n)K(r.name,e)&&t.set(r.name,{name:r.name,params:U(r.params)});return Array.from(t.values())}function Mt(e,t){let n=[e?.trim(),t?.trim()].filter(Boolean);return n.length===0?null:{role:`user`,content:[{type:`text`,text:n.join(`
|
|
87
|
-
|
|
88
|
-
`)}],run:!0}}function Nt(){return ae.map(e=>{let t=e.triggers?.length>0?{type:`keyword`,keywords:e.triggers}:null,n=`/home/runner/work/OpenHands/OpenHands/node_modules/@openhands/extensions/skills/${e.name}/SKILL.md`;return{name:e.name,content:e.content,trigger:t,source:n,description:e.description??null,is_agentskills_format:!0,...e.license?{license:e.license}:{},...e.compatibility?{compatibility:e.compatibility}:{}}})}function q(e,t,n={},r){let i=ut(t),a=U(e.agent_context),o=Array.isArray(a.skills)?a.skills:[],s=n.disabledSkills??[],c=new Set(s),l=S(n),u=[...o.filter(e=>typeof e.name!=`string`||!c.has(e.name)),...Nt().filter(e=>e.name===r||l(e.name))];return{...a,skills:u,load_public_skills:!1,load_user_skills:!0,load_project_skills:!0,disabled_skills:s,...i?{system_message_suffix:i}:{}}}function Pt(e){return U(e.agent_settings).agent_kind===`acp`}function Ft(e){let t=U(e.agent_settings).acp_server;return typeof t==`string`&&t.length>0?t:void 0}function It(e){let t=e.acp_command;if(!(Array.isArray(t)&&t.length===0)&&t!==void 0)return t;let n=b(typeof e.acp_server==`string`?e.acp_server:void 0);return n?[...n.default_command]:t}function Lt(e,t,n){let r=U(e.agent_settings),i={agent_kind:`acp`,agent_context:q(r,t,x(e),C(n))};for(let e of g){if(e===`acp_model`||e===`acp_env`)continue;let t=e===`acp_command`?It(r):r[e];t!=null&&(i[e]=t)}let a=U(r.mcp_config);Object.keys(a).length>0&&(i.mcp_config=a);let o=typeof r.acp_server==`string`?r.acp_server:void 0,s=y({configured:r.acp_model,providerDefault:ce(o)});return s&&(i.acp_model=s),i}function Rt(e,t,n){let r=U(e.agent_settings),i=Et(r.llm);i.stream=!0;let a=U(r.mcp_config);Object.keys(a).length===0&&delete r.mcp_config,delete r.acp_server;for(let e of g)delete r[e];return delete r.acp_env,{...r,llm:i,agent_context:q(r,t,x(e),C(n)),tools:jt(r)}}function zt(e,t,n){return Pt(e)?Lt(e,t,n):Rt(e,t,n)}function Bt(e){let{settings:t,query:n,conversationInstructions:r,plugins:i,workingDir:a}=e,s=U(t.conversation_settings),c=Mt(n,r);return wt.forEach(e=>delete s[e]),{...s,workspace:{kind:`LocalWorkspace`,working_dir:a??o()},...c?{initial_message:c}:{},...i?.length?{plugins:i.map(e=>({source:e.source,...e.ref?{ref:e.ref}:{},...e.repo_path?{repo_path:e.repo_path}:{}}))}:{}}}function Vt(e){if(!e?.length)return;let t=ne(),n=t?Fe(t):{},r={};for(let t of e){let e={kind:`LookupSecret`,url:`/api/settings/secrets/${encodeURIComponent(t.name)}`,description:t.description};Object.keys(n).length>0&&(e.headers=n),r[t.name]=e}return r}function Ht(e){let t=e.encryptedAgentSettings?{...e.settings,agent_settings:e.encryptedAgentSettings}:e.settings,n=Pt(t),r=e.agentProfileId?e.agentProfileKind:n?`acp`:`openhands`,i=zt(t,e.runtimeServicesInfo,e.query),a=n?Ft(t):void 0,o=Bt(e.encryptedConversationSettings?{...e,settings:{...e.settings,conversation_settings:e.encryptedConversationSettings}}:e),s={...e.agentProfileId?{agent_profile_id:e.agentProfileId}:{agent_settings:i},workspace:o.workspace,client_tools:r===`openhands`?[Be,Ke]:[],confirmation_policy:Ot(o),max_iterations:st(o.max_iterations),stuck_detection:!0,autotitle:!0,...e.titleLlmProfile?{title_llm_profile:e.titleLlmProfile}:{},worktree:e.worktree??!0};!e.agentProfileId&&a?s.tags={[mt]:a,[V]:ht}:s.tags={[V]:ht},!e.agentProfileId&&e.secretsEncrypted&&(!n||Dt(i.mcp_config))&&(s.secrets_encrypted=!0),e.conversationId&&(s.conversation_id=e.conversationId),e.parentConversationId&&(s.parent_conversation_id=e.parentConversationId);let c=kt(o);c&&(s.security_analyzer=c),o.initial_message&&(s.initial_message=o.initial_message),o.plugins&&(s.plugins=o.plugins),o.hook_config?s.hook_config=o.hook_config:e.workspaceHookConfig&&(s.hook_config=e.workspaceHookConfig);let l={...o.tool_module_qualnames??{}};delete l[Re],delete l[I],delete l[L],Object.keys(l).length>0&&(s.tool_module_qualnames=l),o.agent_definitions&&(s.agent_definitions=o.agent_definitions);let u=Vt(e.customSecrets);return u&&(s.secrets=u),s}function Ut(e){let t=U(e.encryptedAgentSettings),n=Et(t.llm);n.stream=!0;let r=$e(e.workingDir),i=q(t,void 0,e.skillEnablement),a=i.system_message_suffix;i.system_message_suffix=typeof a==`string`?`${Qe}\n\n${a}`:Qe;let o=Mt(e.initialMessage),s={agent:{kind:`Agent`,llm:n,tools:[{name:`glob`,params:{}},{name:`grep`,params:{}},{name:Ye,params:{plan_path:r}}],system_prompt_filename:Je,system_prompt_kwargs:{plan_structure:Ze},agent_context:i,condenser:{kind:`LLMSummarizingCondenser`,llm:{...n,usage_id:`planning_condenser`},max_size:100,keep_first:6}},workspace:{kind:`LocalWorkspace`,working_dir:e.workingDir},client_tools:[],confirmation_policy:{kind:`NeverConfirm`},max_iterations:e.maxIterations??ot,stuck_detection:!0,autotitle:!1,worktree:!1,parent_conversation_id:e.parentConversationId,tags:{[R]:e.parentConversationId},...o?{initial_message:o}:{}};e.secretsEncrypted&&(s.secrets_encrypted=!0);let c=Vt(e.customSecrets);return c&&(s.secrets=c),s}async function Wt(t){try{let{default:n}=await e(async()=>{let{default:e}=await import(`./profiles-service.api-BbOK0EkF.js`).then(e=>e.n);return{default:e}},__vite__mapDeps([0,1,2,3,4,5])),r=await n.getProfile(t,`encrypted`);return W(r.config)?r.config:null}catch(e){return console.warn(`Falling back: could not resolve LLM profile ${t}`,e),null}}async function Gt(t){try{let{default:n}=await e(async()=>{let{default:e}=await import(`./agent-profiles-service.api-Biieml2L.js`).then(e=>e.r);return{default:e}},__vite__mapDeps([6,1,2,3,4,5])),{profiles:r}=await n.listProfiles(),i=r.find(e=>e.id===t&&e.llm_profile_ref);return i?.llm_profile_ref?await Wt(i.llm_profile_ref):null}catch(e){return console.warn(`Falling back to global agent settings: could not resolve the LLM for agent profile ${t}`,e),null}}async function Kt(t){let{SecretsService:n}=await e(async()=>{let{SecretsService:e}=await import(`./secrets-service-Cr8g8xuv.js`).then(e=>e.n);return{SecretsService:e}},__vite__mapDeps([7,1,8,3,2,9,10,11,4,12,5])),[r,i]=await Promise.all([oe.getSettingsForConversation(),n.getSecrets()]),a=(t.parentActiveProfileName?await Wt(t.parentActiveProfileName):null)??(t.parentAgentProfileId?await Gt(t.parentAgentProfileId):null),o=a?{...r.agentSettings,llm:a}:r.agentSettings;await J(o);let s=st(r.conversationSettings.max_iterations);return Ut({...t,encryptedAgentSettings:o,secretsEncrypted:r.secretsEncrypted,customSecrets:i,maxIterations:s,skillEnablement:r.skillEnablement})}var qt=`Connect your ChatGPT subscription before starting a conversation with this LLM profile.`;async function J(e){if(le(U(e.llm))&&!(await de.getOpenAIStatus()).connected)throw Error(qt)}async function Jt(t){let[{SecretsService:n},{default:r}]=await Promise.all([e(()=>import(`./secrets-service-Cr8g8xuv.js`).then(e=>e.n),__vite__mapDeps([7,1,8,3,2,9,10,11,4,12,5])),e(()=>import(`./hooks-service-C6dpRtZM.js`),__vite__mapDeps([13,2,1,3,4]))]),[i,a,o,s]=await Promise.all([oe.getSettingsForConversation(),n.getSecrets(),lt(),r.loadWorkspaceHooks(t.hooksProjectDir)]),{agentSettings:c,conversationSettings:l,secretsEncrypted:u}=i;return t.agentProfileId||await J(c),Ht({...t,encryptedAgentSettings:c,encryptedConversationSettings:l,secretsEncrypted:u,customSecrets:a,runtimeServicesInfo:o,workspaceHookConfig:s})}function Yt(){return{hooks:[]}}function Xt(e,t){if(!t)return;let n=new Set(t.profiles.map(e=>e.name));if(e&&n.has(e))return e;if(t.active_profile&&n.has(t.active_profile))return t.active_profile}var Zt=`1970-01-01T00:00:00.000Z`,Qt=300*1e3,$t=`Unable to load conversations because the selected agent server returned data this UI does not understand. Check the backend URL/session key and update the agent server if needed.`;function Y(){return Error($t)}function X(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function en(e){return typeof e==`number`?e:null}function Z(e){return typeof e==`number`?e:0}function Q(e){return typeof e==`string`?e:null}function tn(e,t,n){let r=e[t]??e[n];return typeof r==`string`&&r.trim()?r:Zt}function nn(e){return X(e)?{prompt_tokens:Z(e.prompt_tokens),completion_tokens:Z(e.completion_tokens),cache_read_tokens:Z(e.cache_read_tokens),cache_write_tokens:Z(e.cache_write_tokens),context_window:Z(e.context_window),per_turn_token:Z(e.per_turn_token)}:null}function rn(e){return X(e)?{accumulated_cost:en(e.accumulated_cost),max_budget_per_task:en(e.max_budget_per_task),accumulated_token_usage:nn(e.accumulated_token_usage)}:null}function an(e){return X(e)?e:null}function on(e){if(!X(e))return null;let t=X(e.llm)?{model:Q(e.llm.model)}:null;return{kind:Q(e.kind),acp_server:Q(e.acp_server),acp_model:Q(e.acp_model),llm:t}}function sn(e){return X(e)?{working_dir:Q(e.working_dir)}:null}function cn(e){if(!X(e))return null;let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return t}function ln(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):null}function un(e){if(!X(e))return null;let{agent_profile_id:t,revision:n}=e;return typeof t!=`string`||typeof n!=`number`?null:{agent_profile_id:t,revision:n}}function dn(e){if(!e.startsWith(`/`))return null;let t=[];for(let n of e.split(`/`))if(n&&n!==`.`)if(n===`..`){if(!t.length)return null;t.pop()}else t.push(n);return`/${t.join(`/`)}`}function fn(e,t){let n=dn(e),r=dn(t);if(!n||!r||n!==r&&!n.startsWith(`${r}/`))throw Error(`Conversation file path must stay inside the workspace`);return n}function pn(e){if(!X(e)||typeof e.id!=`string`||!e.id.trim())throw Y();return{id:e.id.trim(),title:Q(e.title),created_at:tn(e,`created_at`,`createdAt`),updated_at:tn(e,`updated_at`,`updatedAt`),execution_status:Q(e.execution_status),sandbox_status:Q(e.sandbox_status),metrics:rn(e.metrics),stats:an(e.stats),agent:on(e.agent),workspace:sn(e.workspace),tags:cn(e.tags),launched_agent_profile:un(e.launched_agent_profile),sub_conversation_ids:ln(e.sub_conversation_ids),current_model_id:Q(e.current_model_id),current_model_name:Q(e.current_model_name)}}function mn(e){if(!Array.isArray(e))throw Y();return e.map(pn)}function hn(e){if(Array.isArray(e))return{items:mn(e),next_page_id:null};if(!X(e))throw Y();return{items:mn(e.items),next_page_id:typeof e.next_page_id==`string`?e.next_page_id:null}}var gn=new Set([`idle`,`running`,`paused`,`waiting_for_confirmation`,`finished`,`error`,`stuck`]);function _n(e){let t=e??`idle`;return gn.has(t)?t:`idle`}function $(e,t){if(!e)throw Error(`Conversation ${t} was not found`);return e}var vn=class{static async sendMessage(e,t,n){let r=l().backend,i=n?.conversationUrl??null,a=n?.sessionApiKey??null;if(r.kind===`cloud`){if(!i||!a){let[t]=await F([e]);i=t?.conversation_url?.trim()??null,a=t?.session_api_key?.trim()??null}if(!i||!a)throw Error(`Conversation sandbox is still starting. Wait for it to finish, then try again.`);return await _({backend:r,method:`POST`,hostOverride:c(i),path:`/api/conversations/${e}/events`,body:{...t,run:!0},authMode:`session-api-key`,sessionApiKey:a}),t}return await new m(d({conversationUrl:i,sessionApiKey:a})).sendEvent(e,t,{run:!0}),t}static async createConversation(e={}){let{initialUserMsg:t,conversationInstructions:n,plugins:i,metadata:a,workingDirOverride:o,workspaceMode:c,parentConversationId:u,agentType:f,sandboxId:re,agentProfileId:p,agentProfileKind:ie}=e;if(l().backend.kind===`cloud`)return Te({initial_message:t?{role:`user`,content:[{type:`text`,text:t}]}:null,title:n??null,selected_repository:a?.selected_repository??null,selected_branch:a?.selected_branch??null,git_provider:a?.git_provider??null,plugins:i??null,parent_conversation_id:u??null,agent_type:f,sandbox_id:re??null,agent_profile_id:p??null,trigger:`gui`});let[h,g]=await Promise.all([oe.getSettings(),se.listProfiles().catch(()=>void 0)]),_=Xt(h.title_llm_profile,g),ae=E(),v=l().backend.host,y=await O(o??s(ae,v)),ce=o?y:await O(ee(v)),b=c??(o?`local_repo`:`new_worktree`),x=await Jt({settings:h,query:t,conversationInstructions:n,plugins:i,conversationId:ae,parentConversationId:u,workingDir:y,hooksProjectDir:ce,worktree:b===`new_worktree`,agentProfileId:p,agentProfileKind:ie,titleLlmProfile:_}),S=await r(),C=await new m(d({timeout:Qt})).createConversation({...x,...S?{user_id:S}:{}}),w=ne();if(!w)throw new te;return(a?.selected_repository||o)&&M(C.id,{selected_repository:a?.selected_repository??null,selected_branch:a?.selected_branch??null,git_provider:a?.git_provider??null,selected_workspace:o??null,workspace_mode:b}),{id:C.id,created_by_user_id:null,status:`READY`,detail:null,app_conversation_id:C.id,agent_server_url:w.host,request:{initial_message:x.initial_message,plugins:i??null},created_at:C.created_at,updated_at:C.updated_at}}static async createLocalPlanningConversation(e,t){if(l().backend.kind===`cloud`)throw Error(`Local planning conversations require a local backend.`);let[n]=await this.batchGetAppConversations([e]),r=await Kt({workingDir:n?.workspace?.working_dir??o(),parentConversationId:e,parentActiveProfileName:n?.agent_kind===`openhands`?n?.active_profile??null:null,parentAgentProfileId:n?.launched_agent_profile?.agent_profile_id??null,initialMessage:t}),i=await new m(d()).createConversation(r);return xe(e,{local_planning_conversation_id:i.id}),B(i)}static async getLocalPlanningConversationIds(e){if(l().backend.kind===`cloud`)return[];let t=new Set;try{let[n]=await this.batchGetAppConversations([e]),r=n?.sub_conversation_ids??[];if(r.length>0){let n=await this.batchGetAppConversations(r);for(let r of n)r&&tt(r,e)&&t.add(r.id)}}catch(t){console.warn(`Failed to read sub-conversations of ${e}`,t)}let n=j(e)?.local_planning_conversation_id;return n&&t.add(n),[...t]}static async getStartTask(e){return l().backend.kind===`cloud`?Pe(e):null}static async getVSCodeUrl(e,t,n){let r=await this.resolveConversationWorkingDir(e);return{vscode_url:await new f(d({conversationUrl:t,sessionApiKey:n})).getUrl({baseUrl:typeof window<`u`?window.location.origin:void 0,workspaceDir:r})}}static async getVSCodeStatus(e,t){return new f(d({conversationUrl:e,sessionApiKey:t})).getStatus()}static async resolveConversationWorkingDir(e){let[t]=await this.batchGetAppConversations([e]);return t?.workspace?.working_dir??o()}static async batchGetAppConversations(e){return e.length===0?[]:l().backend.kind===`cloud`?F(e):mn(await new m(d()).getConversations(e)).map(e=>B(e))}static async updateConversationPublicFlag(e,t){if(l().backend.kind!==`cloud`)throw Error(`Public sharing requires a cloud backend.`);return Oe(e,t)}static async updateConversationRepository(e,t,n,r){t?M(e,{...j(e)??{},selected_repository:t,selected_branch:n??null,git_provider:r??null}):N(e);let[i]=await this.batchGetAppConversations([e]);return $(i,e)}static async readConversationFile(e,t){if(l().backend.kind===`cloud`)return Me(e,fn(t??`/workspace/project/.agents_tmp/PLAN.md`,`/workspace/project`));let n=await this.resolveConversationWorkingDir(e),r=fn(t??`${n}/.agents_tmp/PLAN.md`,n);return new p(d()).downloadTextFile(r)}static async downloadConversation(e){return l().backend.kind===`cloud`?Ee(e):new p(d()).downloadTrajectory(e)}static async getHooks(e){return Yt()}static async getRuntimeConversation(e,t,n){let r=pn(await new m(d({conversationUrl:t,sessionApiKey:n})).getConversation(e));return{id:r.id,title:r.title?.trim()?r.title:ft(r.id),metrics:rn(r.metrics),created_at:r.created_at,updated_at:r.updated_at,status:_n(r.execution_status),stats:r.stats??{usage_to_metrics:{}}}}static async condenseConversation(e,t,n){let r=l().backend;if(r.kind===`cloud`&&t){await _({backend:r,method:`POST`,hostOverride:c(t),path:`/api/conversations/${e}/condense`,authMode:`session-api-key`,sessionApiKey:n});return}await new m(d({conversationUrl:t,sessionApiKey:n})).condenseConversation(e)}static async searchConversations(e=20,t){return l().backend.kind===`cloud`?we(e,t):pt(hn(await new m(d()).searchConversations({limit:e,page_id:t,sort_order:h.UPDATED_AT_DESC})))}static async deleteConversation(e){if(l().backend.kind===`cloud`){await De(e),N(e);return}let t=await this.getLocalPlanningConversationIds(e),n=new m(d());await Promise.all(t.map(async e=>{try{await n.deleteConversation(e)}catch(t){console.warn(`Failed to delete planning conversation ${e}`,t)}N(e)})),await n.deleteConversation(e),N(e)}static async updateConversationTitle(e,t){if(l().backend.kind===`cloud`)return ke(e,t);await new m(d()).updateConversation(e,{title:t});let[n]=await this.batchGetAppConversations([e]);return $(n,e)}static async updateConversationTags(e,t){await new m(d()).updateConversation(e,{tags:t});let[n]=await this.batchGetAppConversations([e]);return $(n,e)}static async forkConversation(e,t,n){if(l().backend.kind===`cloud`)throw Error(`Branching a conversation isn't supported on the cloud backend yet.`);let r=await new m(d()).forkConversation(e,{from_event_id:t,...n?{title:n}:{}}),i=j(e);return i&&M(r.id,i),r}static async getEventParentId(e,t){return(await new m(d()).getEvent(e,t)).parent_id??void 0}static async switchProfile(e,t){let{backend:n}=l();if(n.kind===`cloud`){if(!e){await se.activateProfile(t);return}await _({backend:n,method:`POST`,path:`/api/v1/app-conversations/${e}/switch_profile`,body:{profile_name:t}});return}if(!e){await new re(d()).activateProfile(t);return}let r=d(),i=new m(r),a=await new re(r).getProfile(t,{exposeSecrets:`encrypted`}),o=typeof a.config.model==`string`?a.config.model:``;if(!o)throw Error(`Profile '${t}' has no model.`);await J({llm:a.config}),await i.switchLLM(e,{...a.config,model:o,stream:!0,usage_id:`profile:${t}:${E()}`})}static async switchAcpModel(e,t){let{backend:n}=l();if(n.kind===`cloud`){await _({backend:n,method:`POST`,path:`/api/v1/app-conversations/${e}/switch_acp_model`,body:{model:t}});return}await new m(d()).switchAcpModel(e,t)}};export{O as A,Ce as C,xe as D,j as E,M as O,Ae as S,je as T,Le as _,St as a,Pe as b,We as c,Ve as d,L as f,Re as g,I as h,bt as i,E as j,ye as k,He as l,ze as m,H as n,nt as o,Ge as p,yt as r,et as s,vn as t,Ue as u,F as v,Me as w,Ne as x,Te as y};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e,r as t}from"./agent-settings-CpY3zObk.js";export{e as default,t as handle};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-Cyuzqnbw.js";import{St as t,yt as n}from"./vendor-styling-Ck5D_A2Q.js";import{t as r}from"./vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-CV850oio.js";import{K as i,t as a}from"./utils-BOco8mxR.js";import{t as o}from"./vendor~root-layout~index-home~home~conversation-panel~conversation-DgQ564nC.js";import{n as s}from"./navigation-context-CQZwH_tC.js";import{c}from"./vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-DXqM7vqB.js";import{t as l}from"./close-ScPlnwyq.js";import{r as u}from"./typography-HLLg_FAn.js";var d=e(t(),1),f=n();function p({maintenanceStartTime:e,faultyModels:t,errorMessage:n,updatedAt:p}){let{t:m}=r(`openhands`),[h,g]=o(`alert_banner_dismissed_at`,null),{currentPath:_}=s(),v=e?(e=>new Date(e).toLocaleString(void 0,{year:`numeric`,month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`,timeZoneName:`short`}))(e):null,y=!!e,b=t&&t.length>0,x=n&&n.trim().length>0,S=y||b||x,C=(0,d.useMemo)(()=>S?h!==p:!1,[h,p,S]),w=(0,d.useMemo)(()=>{if(!n)return null;let e=m(n);return e===n?n:e},[n,m]);return C?(0,f.jsxs)(`div`,{"data-testid":`alert-banner`,className:a(`bg-base border border-primary text-white p-4 rounded`,`flex flex-row items-center justify-between m-1`,_===`/`&&`mt-3 mr-3`),children:[(0,f.jsxs)(`div`,{className:`flex items-center`,children:[(0,f.jsx)(`div`,{className:`flex-shrink-0`,children:(0,f.jsx)(c,{className:`text-primary align-middle`})}),(0,f.jsx)(`div`,{className:`ml-3 flex flex-col gap-1`,children:(()=>{let e=[];return y&&v&&e.push((0,f.jsx)(u.Paragraph,{className:`text-sm font-medium`,children:m(i.MAINTENANCE$SCHEDULED_MESSAGE,{time:v})},`maintenance`)),b&&e.push((0,f.jsxs)(u.Paragraph,{className:`text-sm font-medium`,children:[m(i.ALERT$FAULTY_MODELS_MESSAGE),` `,t.join(`, `)]},`faulty-models`)),x&&w&&e.push((0,f.jsx)(u.Paragraph,{className:`text-sm font-medium`,children:w},`error-message`)),e})()})]}),(0,f.jsx)(`button`,{type:`button`,"data-testid":`dismiss-button`,onClick:()=>g(p),className:a(`bg-base rounded-full w-5 h-5 flex items-center justify-center cursor-pointer`),children:(0,f.jsx)(l,{})})]}):null}export{p as AlertBanner};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-Cyuzqnbw.js";import{St as t,yt as n}from"./vendor-styling-Ck5D_A2Q.js";import{t as r}from"./vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-CV850oio.js";import{$ as i,r as a}from"./active-backend-context-rZiLJRUc.js";import{K as o,t as s}from"./utils-BOco8mxR.js";import{n as c,p as l}from"./agent-server-client-options-BikiNwTa.js";import{n as u,o as d}from"./backend-form-modal-0aJmWdsa.js";import{f}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-Z0lly3FE.js";import{r as p,t as m}from"./modal-body-DJw4xBki.js";import{t as h}from"./brand-button-DxPO4Lf8.js";var g=e(t(),1),_=n();function v(){let{t:e}=r(`openhands`),{active:t,addBackend:n,updateBackend:v}=a(),y=window.location.origin,[b,x]=g.useState(!1),[S,C]=g.useState(`idle`),[w,T]=g.useState(null),E=g.useCallback(async r=>{x(!0),C(`idle`),T(null);try{await new f(c({host:r.host,sessionApiKey:r.apiKey,timeout:5e3})).getSettings(),C(`success`),l(t.backend)?n(r):v(t.backend.id,r),window.location.reload()}catch(t){if(C(`error`),i(t,401))T(e(o.AUTH$INVALID_KEY));else{let n=t instanceof Error?t.message:String(t);T(`${e(o.AUTH$CONNECTION_FAILED)}${n?`: ${n}`:``}`)}x(!1)}},[t.backend,n,v,e]);return(0,_.jsx)(`div`,{"data-testid":`api-key-entry-screen`,className:`flex min-h-screen items-center justify-center bg-base px-6`,children:(0,_.jsxs)(`div`,{className:s(`relative rounded-xl border border-[var(--oh-border)] bg-base-secondary`,p(`md`),m),children:[(0,_.jsx)(`div`,{className:`px-6 pt-6 pb-2 pr-12`,children:(0,_.jsx)(`h2`,{className:`text-lg font-semibold`,children:e(o.BACKEND$ADD_TITLE)})}),(0,_.jsx)(`div`,{className:`px-6 pb-6 pt-2`,children:(0,_.jsx)(u,{mode:`add`,backend:{...t.backend,host:y,apiKey:``,name:``},onSubmitted:()=>{},testIdRoot:`api-key-entry`,hostReadOnly:!0,requireApiKey:!0,onSubmitOverride:E,renderActions:({canSubmit:t,testIdRoot:n})=>(0,_.jsxs)(_.Fragment,{children:[S!==`idle`&&(0,_.jsxs)(`div`,{className:`flex items-center gap-3 text-sm`,children:[(0,_.jsx)(d,{isConnected:S===`success`}),(0,_.jsx)(`span`,{"data-testid":`${n}-status`,className:S===`error`?`text-red-400`:`text-green-400`,children:S===`error`?w:e(o.ONBOARDING$BACKEND_STATUS_CONNECTED)})]}),(0,_.jsx)(h,{type:`submit`,variant:`secondary`,isDisabled:!t||b,testId:`${n}-submit`,className:`w-full text-center`,children:e(b?o.ONBOARDING$BACKEND_STATUS_CHECKING:o.BACKEND$CONNECT)})]})})})]})})}export{v as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-Cyuzqnbw.js";import{St as t,yt as n}from"./vendor-styling-Ck5D_A2Q.js";import{U as r}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~i58xkef6-cHFhpUBq.js";import{t as i}from"./vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-CV850oio.js";import{_ as a,ct as o,dt as s,ft as c,n as l,st as u}from"./active-backend-context-rZiLJRUc.js";import{K as d}from"./utils-BOco8mxR.js";import{t as f}from"./settings-CKqk8ZnH.js";import{n as p}from"./use-settings-Dn00UISA.js";import{t as m}from"./use-save-settings-3U5K9-8x.js";import{t as h}from"./brand-button-DxPO4Lf8.js";import{i as g,n as _,r as v,t as y}from"./color-themes-DTj5Ylbr.js";import{t as b}from"./navigation-link-Bxo3-4vo.js";import{t as x}from"./settings-dropdown-input-DVpyD87C.js";import{t as S}from"./settings-input-C0dd8Utu.js";import{t as C}from"./use-llm-profiles-BTTtpW4z.js";import{r as w}from"./format-model-name-CasAP3nd.js";import{c as T,o as E,t as D}from"./sidebar-onboarding-checklist-storage-DbDX-Wvj.js";import{n as O,t as k}from"./switch-skeleton-DwOoCqaL.js";import{t as A}from"./settings-switch-B78Khmyz.js";var j=e(t(),1),M=n();function N({defaultKey:e,onChange:t,name:n}){let{t:r}=i(`openhands`);return(0,M.jsx)(x,{testId:n,name:n,onInputChange:t,label:r(d.SETTINGS$LANGUAGE),items:c.map(e=>({key:e.value,label:e.label})),defaultSelectedKey:e,isClearable:!1,wrapperClassName:`w-full min-w-0`})}function P(){let{t:e}=i(`openhands`),t=j.useCallback(e=>{if(!e)return;let t=e;_(t),v(t)},[]);return(0,M.jsx)(x,{testId:`color-theme-input`,name:`color-theme-input`,label:e(d.SETTINGS$COLOR_THEME),items:y.map(e=>({key:e.key,label:e.label})),defaultSelectedKey:g(),onSelectionChange:t,isClearable:!1,wrapperClassName:`w-full min-w-0`})}function F(){return(0,j.useSyncExternalStore)(E,D,()=>!1)}function ee(){let{t:e}=i(`openhands`),t=F();return(0,M.jsx)(A,{testId:`show-getting-started-checklist-switch`,isToggled:!t,onToggle:e=>{T(!e)},children:e(d.SETTINGS$SHOW_GETTING_STARTED_CHECKLIST)})}function I(){return(0,M.jsxs)(`div`,{"data-testid":`app-settings-skeleton`,className:`px-11 py-9 flex flex-col gap-6`,children:[(0,M.jsx)(O,{}),(0,M.jsx)(k,{}),(0,M.jsx)(k,{})]})}var L=`__automatic__`;function R(){let{t:e}=i(`openhands`),{mutate:t,isPending:n}=m(),{data:r,isLoading:g}=p(),_=l().backend.kind===`cloud`,{data:v,isLoading:y}=C(),[T,E]=j.useState(!1),[D,O]=j.useState(!1),[k,F]=j.useState(!1),[R,z]=j.useState(!1),[B,V]=j.useState(!1),[H,U]=j.useState(void 0),W=j.useMemo(()=>{let e=r?.title_llm_profile??null;return!e||!v||v.profiles.some(t=>t.name===e)?e:null},[v,r?.title_llm_profile]),G=H===void 0?W:H,K=j.useMemo(()=>[{key:L,label:e(d.SETTINGS$TITLE_GENERATION_AUTOMATIC)},...v?.profiles.map(t=>({key:t.name,label:t.model?e(d.SETTINGS$TITLE_GENERATION_PROFILE_OPTION,{name:t.name,model:w(t.model)??t.model}):t.name}))??[]],[v?.profiles,e]),q=n=>{let r=n.get(`language-input`)?.toString(),i=c.find(({label:e})=>e===r)?.value||f.language,l=_?!0:n.get(`enable-analytics-switch`)?.toString()===`on`,p=n.get(`enable-sound-notifications-switch`)?.toString()===`on`,m=n.get(`git-user-name-input`)?.toString()||f.git_user_name,h=n.get(`git-user-email-input`)?.toString()||f.git_user_email;t({language:i,...!_&&{user_consents_to_analytics:l},enable_sound_notifications:p,git_user_name:m,git_user_email:h,title_llm_profile:G},{onSuccess:()=>{a(l?`granted`:`denied`),o(e(d.SETTINGS$SAVED))},onError:t=>{u(s(t)||e(d.ERROR$GENERIC))},onSettled:()=>{E(!1),O(!1),F(!1),z(!1),V(!1),U(void 0)}})},J=e=>{let t=c.find(({label:t})=>t===e)?.label,n=c.find(({value:e})=>e===r?.language)?.label;E(t!==n)},Y=e=>{O(e!==(r?.user_consents_to_analytics??!0))},X=e=>{F(e!==!!r?.enable_sound_notifications)},Z=e=>{let t=r?.git_user_name;z(e!==t)},Q=e=>{let t=r?.git_user_email;V(e!==t)},te=!T&&!D&&!k&&G===W&&!R&&!B,$=!r||g||y||n;return(0,M.jsxs)(`form`,{"data-testid":`app-settings-screen`,action:q,className:`flex flex-col gap-6`,children:[$&&(0,M.jsx)(I,{}),!$&&(0,M.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,M.jsx)(N,{name:`language-input`,defaultKey:r.language,onChange:J}),(0,M.jsx)(P,{}),(0,M.jsx)(A,{testId:`enable-analytics-switch`,name:_?void 0:`enable-analytics-switch`,defaultIsToggled:_?!0:r.user_consents_to_analytics??!0,isToggled:_?!0:void 0,isDisabled:_,onToggle:_?void 0:Y,children:e(d.ANALYTICS$SEND_ANONYMOUS_DATA)}),(0,M.jsx)(A,{testId:`enable-sound-notifications-switch`,name:`enable-sound-notifications-switch`,defaultIsToggled:!!r.enable_sound_notifications,onToggle:X,children:e(d.SETTINGS$SOUND_NOTIFICATIONS)}),(0,M.jsx)(ee,{}),(0,M.jsxs)(`div`,{className:`border-t border-[var(--oh-border)] pt-6 mt-2`,children:[(0,M.jsx)(`h3`,{className:`text-lg font-medium mb-2`,children:e(d.SETTINGS$CONVERSATION_TITLES)}),(0,M.jsx)(`p`,{className:`mb-4 text-sm leading-5 text-tertiary-light`,children:e(d.SETTINGS$TITLE_GENERATION_DESCRIPTION)}),(0,M.jsx)(x,{testId:`title-llm-profile-input`,name:`title-llm-profile-input`,label:e(d.SETTINGS$TITLE_GENERATION_MODEL),items:K,selectedKey:G??L,onSelectionChange:e=>{let t=e?.toString();U(!t||t===L?null:t)}}),(0,M.jsx)(b,{to:`/settings/llm`,className:`mt-3 inline-block text-sm text-primary hover:underline`,children:e(d.SETTINGS$MANAGE_LLM_PROFILES)})]}),(0,M.jsxs)(`div`,{className:`border-t border-[var(--oh-border)] pt-6 mt-2`,children:[(0,M.jsx)(`h3`,{className:`text-lg font-medium mb-2`,children:e(d.SETTINGS$GIT_SETTINGS)}),(0,M.jsx)(`p`,{className:`mb-4 text-sm leading-5 text-tertiary-light`,children:e(d.SETTINGS$GIT_SETTINGS_DESCRIPTION)}),(0,M.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,M.jsx)(S,{testId:`git-user-name-input`,name:`git-user-name-input`,type:`text`,label:e(d.SETTINGS$GIT_USERNAME),defaultValue:r.git_user_name||``,onChange:Z,placeholder:e(d.SETTINGS$GIT_USERNAME_PLACEHOLDER),className:`w-full min-w-0`}),(0,M.jsx)(S,{testId:`git-user-email-input`,name:`git-user-email-input`,type:`email`,label:e(d.SETTINGS$GIT_EMAIL),defaultValue:r.git_user_email||``,onChange:Q,placeholder:e(d.SETTINGS$GIT_EMAIL_PLACEHOLDER),className:`w-full min-w-0`})]}),(0,M.jsx)(`div`,{className:`flex justify-start pt-4`,children:(0,M.jsxs)(h,{testId:`submit-button`,variant:`primary`,type:`submit`,isDisabled:n||te,children:[!n&&e(d.SETTINGS$SAVE_CHANGES),n&&e(d.SETTINGS$SAVING)]})})]})]})]})}var z=r(R);export{z as default};
|