@openhands/agent-canvas 1.17.0 → 1.19.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-BQ4o4vqy.js +1 -0
- package/build/assets/active-backend-context-BsLfwrXB.js +2 -0
- package/build/assets/{agent-context-settings-CJUrcBut.js → agent-context-settings-D9i6ezoJ.js} +1 -1
- package/build/assets/{agent-profiles-service.api-Biieml2L.js → agent-profiles-service.api-U-9YzDFU.js} +1 -1
- package/build/assets/agent-profiles-settings-D-bUV2PX.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-BaVQ6NpE.js +88 -0
- package/build/assets/agent-settings-BZJHtaIK.js +2 -0
- package/build/assets/agent-settings-D4snDd6u.js +1 -0
- package/build/assets/alert-banner-BkVt_8Or.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-fAIld-n7.js +1 -0
- package/build/assets/app-settings-DITbrM2u.js +1 -0
- package/build/assets/automation-detail-DawHmaOl.js +3 -0
- package/build/assets/automation-disabled-reason-DtgC8Ppt.js +1 -0
- package/build/assets/{automation-export-DxY47m3T.js → automation-export-Kv6e0bHx.js} +1 -1
- package/build/assets/automation-git-sync-Dd98G_Oz.js +1 -0
- package/build/assets/automation-setup-route-Cdc109ZD.js +3 -0
- package/build/assets/{automation-templates-4C4PM8K7.js → automation-templates-Xhr-FDAB.js} +1 -1
- package/build/assets/automations-list-BeP1LuzQ.js +1 -0
- package/build/assets/{back-nav-button-B8tH0BEp.js → back-nav-button-DWNiN277.js} +1 -1
- package/build/assets/backend-form-modal-DeaUJIik.js +1 -0
- package/build/assets/backend-synced-settings-badge-Br85iWIY.js +1 -0
- package/build/assets/badge-Cdnei7Ly.js +1 -0
- package/build/assets/{base-modal-DTULovNc.js → base-modal-Ds7grR67.js} +1 -1
- package/build/assets/{bot-CLMxGFaq.js → bot-ByolqPEr.js} +1 -1
- package/build/assets/{brand-button-DxPO4Lf8.js → brand-button-mQq2Ld1I.js} +1 -1
- package/build/assets/browser-Bfum8fkE.js +46 -0
- package/build/assets/browser-tab-CmYT4j_r.js +1 -0
- package/build/assets/canvas-extension-page-CokKSVRG.js +1 -0
- package/build/assets/canvas-extensions-BoQEYG-2.js +1 -0
- package/build/assets/{canvas-extensions-runtime-DdnkgJXV.js → canvas-extensions-runtime-Du2M5iEX.js} +1 -1
- package/build/assets/{chat-send-button-B3SFSIg5.js → chat-send-button-DM3JgMc2.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-BbYBiUwv.js +1 -0
- package/build/assets/{cloud-funnel-analytics-BQanUEEC.js → cloud-funnel-analytics-D02kgq1s.js} +1 -1
- package/build/assets/{cog-VBlRo6iw.js → cog-Dy1eWbSZ.js} +1 -1
- package/build/assets/command-menu-mehU3Evb.js +1 -0
- package/build/assets/commits-tab-DhQW8CXi.js +1 -0
- package/build/assets/{condenser-settings-eVKFMvap.js → condenser-settings-eRk6Fkx6.js} +1 -1
- package/build/assets/confirmation-modal-BmVt_c0I.js +1 -0
- package/build/assets/{context-menu-list-item-DDROe12Z.js → context-menu-list-item-lx2zk9G7.js} +1 -1
- package/build/assets/{conversation-BnjJSFf5.js → conversation-BOj0ENI6.js} +8 -8
- package/build/assets/conversation-SouWlGvs.js +1 -0
- package/build/assets/conversation-panel-SouWlGvs.js +1 -0
- package/build/assets/conversation-state-store-C6YncQNo.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-DIhwCC2J.js} +1 -1
- package/build/assets/copy-to-clipboard-button-DVNXLylP.js +1 -0
- package/build/assets/device-verify-LP-x7nra.js +1 -0
- package/build/assets/{dropdown-classes-B9kJVDIk.js → dropdown-classes-goDldkiu.js} +1 -1
- package/build/assets/edit-automation-modal-BJJR9wSW.js +1 -0
- package/build/assets/empty-state-Cd-TFe7i.js +1 -0
- package/build/assets/{entry.client-Ds8LVp-E.js → entry.client-CJdjIvMZ.js} +2 -2
- package/build/assets/enum-filter-dropdown-pocrz9AL.js +1 -0
- package/build/assets/environment-switch-overlay-Dwe78wRl.js +1 -0
- package/build/assets/error-state-SuWwztxV.js +1 -0
- package/build/assets/extensions-hub-O0esK3Er.js +1 -0
- package/build/assets/extensions-navigation-CgCVSXje.js +1 -0
- package/build/assets/{external-link-DQtv7eTh.js → external-link-Bd7Tga-1.js} +1 -1
- package/build/assets/files-tab-B_6t8ljw.js +1 -0
- package/build/assets/{form-control-classes-B-z85REi.js → form-control-classes-lQfLxzH4.js} +1 -1
- package/build/assets/format-model-name-Dfh9Udrx.js +1 -0
- package/build/assets/get-git-path-Bp5rsUkl.js +1 -0
- package/build/assets/git-repo-dropdown-CbD0_LPN.js +1 -0
- package/build/assets/git-repo-dropdown-DPQVumZg.js +1 -0
- package/build/assets/highlighted-source-view-Bp0sgK-f.js +1 -0
- package/build/assets/home-BghzJd-D.js +1 -0
- package/build/assets/home-CXZ8zawS.js +1 -0
- package/build/assets/home-automation-run-tooltip-BdpCckKO.js +1 -0
- package/build/assets/home-store-DNQpfIEO.js +1 -0
- package/build/assets/hooks-service-DkxnQa4N.js +1 -0
- package/build/assets/index-home-Ca6Q5CtT.js +1 -0
- package/build/assets/info-BcajzHn1.js +1 -0
- package/build/assets/install-server-modal-DvxxYKia.js +1 -0
- package/build/assets/{key-CfXbJa8w.js → key-CwTE6XJj.js} +1 -1
- package/build/assets/launch-jsRGPRBx.js +1 -0
- package/build/assets/link-external-B4gx3EeM.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-DMdL1vaX.js +27 -0
- package/build/assets/llm-settings-dkQ5Oq7W.js +1 -0
- package/build/assets/llm-settings-lNDerSlu.js +1 -0
- package/build/assets/{llm-subscription-service-aDNBQ7Gq.js → llm-subscription-service-BiQaZbvv.js} +1 -1
- package/build/assets/loader-circle-BxJgk73D.js +1 -0
- package/build/assets/{loading-spinner-DfHI77BA.js → loading-spinner-DK1sAwVg.js} +1 -1
- package/build/assets/manage-backends-modal-DqCJohsX.js +1 -0
- package/build/assets/manifest-ff93dc8c.js +1 -0
- package/build/assets/manifest-subpage-layout-sxuPqfUr.js +1 -0
- package/build/assets/{map-provider-DXvssjw9.js → map-provider-iRs80q_6.js} +1 -1
- package/build/assets/markdown-renderer-BH5pqDuJ.js +8 -0
- package/build/assets/mcp-BtaJDXnP.js +1 -0
- package/build/assets/mcp-installed-servers-Br4ZLsjr.js +1 -0
- package/build/assets/mcp-marketplace-utils-BwEnDYqm.js +1 -0
- package/build/assets/mcp-page-DwbnQpVs.js +9 -0
- package/build/assets/messages-DmFJlW6c.js +41 -0
- package/build/assets/{modal-body-DJw4xBki.js → modal-body-DBweM2EN.js} +1 -1
- package/build/assets/{modal-classes-Dg0ngBPO.js → modal-classes-jvG85nkU.js} +1 -1
- package/build/assets/modal-close-button-BrM5fNnn.js +1 -0
- package/build/assets/{mouse-pointer-click-DEhsSUpu.js → mouse-pointer-click-BXlRN92t.js} +1 -1
- package/build/assets/onboarding-CQ8T6T0U.js +1 -0
- package/build/assets/onboarding-modal-CnliiaSN.js +1 -0
- package/build/assets/{organization-service.api-Cyg1Tn03.js → organization-service.api-DmFUEmu5.js} +1 -1
- package/build/assets/parse-git-remote-url-BG8pcKL8.js +1 -0
- 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-CXph_C9F.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-CcEpfNKz.js} +1 -1
- package/build/assets/plus-C2e21TFC.js +1 -0
- package/build/assets/{profiles-service.api-BbOK0EkF.js → profiles-service.api-DdF_4Zhe.js} +1 -1
- package/build/assets/providers-BWRnl31s.js +1 -0
- package/build/assets/proxy-DbEf3Nqr.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-r0oI91HN.js +1 -0
- package/build/assets/{refresh-cw-DEQdPCpH.js → refresh-cw-BtdC3T8P.js} +1 -1
- package/build/assets/root-j2fFRlWS.js +2 -0
- package/build/assets/root-layout-CfGgm2lo.js +2 -0
- package/build/assets/root-sEWn3ha1.css +1 -0
- package/build/assets/schema-field-c3Ncgm4x.js +1 -0
- package/build/assets/sdk-section-page-DFEiuiFQ.js +1 -0
- package/build/assets/secret-form-WXXNFqTM.js +1 -0
- package/build/assets/{secrets-service-Cr8g8xuv.js → secrets-service-DU6wh3wX.js} +1 -1
- package/build/assets/secrets-settings-BEqbPvjy.js +1 -0
- package/build/assets/settings-DjaSQwFh.js +1 -0
- package/build/assets/settings-dropdown-input-BRR2OZwi.js +1 -0
- package/build/assets/settings-index-DHv4XFcM.js +1 -0
- package/build/assets/settings-input-Cm4VxUon.js +1 -0
- package/build/assets/{settings-list-classes-Ds4jPBHK.js → settings-list-classes-CaUfKZ33.js} +1 -1
- package/build/assets/settings-modal-djXuAnBO.js +1 -0
- package/build/assets/settings-nav-DFb3hBMr.js +16 -0
- package/build/assets/{settings-service.api-9_xdv_mh.js → settings-service.api-Q9lKW1TX.js} +1 -1
- package/build/assets/settings-switch-seaSJc7t.js +1 -0
- package/build/assets/{settings-utils-8GIIgOQL.js → settings-utils-BTaaRhLZ.js} +1 -1
- package/build/assets/shared-conversation-x3rxVCon.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-B6mcvvdV.js} +1 -1
- package/build/assets/sidebar-mobile-menu-toggle-CEqS8KnA.js +1 -0
- package/build/assets/{sidebar-nav-link-_t4_Ef-9.js → sidebar-nav-link-BTHX11LG.js} +1 -1
- package/build/assets/{sidebar-onboarding-checklist-storage-DbDX-Wvj.js → sidebar-onboarding-checklist-storage-BP1kzn6p.js} +1 -1
- package/build/assets/sidebar-store-DAZVH-DR.js +1 -0
- package/build/assets/skill-card-pill-row-TD39nfP3.js +1 -0
- package/build/assets/{skill-filter-BBeZ4JEP.js → skill-filter-CdBbbwjm.js} +2 -2
- package/build/assets/{skill-icon-badge-BDhQ-tQ0.js → skill-icon-badge-vUEp7gsC.js} +1 -1
- package/build/assets/skill-scope-BTRBQt0-.js +1 -0
- package/build/assets/skills-plugins-k1tUNAw4.js +1 -0
- package/build/assets/skills-settings-CENviPT7.js +1 -0
- package/build/assets/{styled-tooltip-Pd22BIvr.js → styled-tooltip-DVAlWYnL.js} +1 -1
- package/build/assets/task-list-tab-BLKF_x9f.js +1 -0
- package/build/assets/{terminal-onXx0_Qz.js → terminal-Ckbnqb23.js} +1 -1
- package/build/assets/{toggle-switch-lwQtxDcm.js → toggle-switch-DeiG9Mf6.js} +1 -1
- package/build/assets/{trash-2-ZhKuTLiz.js → trash-2-Bb40zQzs.js} +1 -1
- package/build/assets/trash-CXN2R54L.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-NarNyelM.js} +1 -1
- package/build/assets/usage-tab-Drd3O006.js +1 -0
- package/build/assets/use-acp-credential-form-CJ5wPsQm.js +1 -0
- package/build/assets/{use-activate-agent-profile-BLKML6vQ.js → use-activate-agent-profile-iQZ0U3qV.js} +1 -1
- package/build/assets/use-agent-profiles-LCvb5OXT.js +1 -0
- package/build/assets/{use-automation-health-BZkQNEA8.js → use-automation-health-DdgSa8sA.js} +1 -1
- package/build/assets/{use-automation-permissions-B_RpvL-s.js → use-automation-permissions-D3kEeieu.js} +1 -1
- package/build/assets/{use-automations-Cg0PDIZr.js → use-automations-CEubcYTD.js} +1 -1
- package/build/assets/{use-can-manage-org-profiles-BbN6KfDr.js → use-can-manage-org-profiles-CB8ybxFK.js} +1 -1
- package/build/assets/{use-canvas-extensions-CFUpHat6.js → use-canvas-extensions-BMacwi2v.js} +1 -1
- package/build/assets/{use-cloud-current-user-id-Dk0rjr63.js → use-cloud-current-user-id-BEKRd6XZ.js} +1 -1
- package/build/assets/{use-config-DpafU_QP.js → use-config-3WYcJsgC.js} +1 -1
- package/build/assets/{use-create-conversation-1YgmAHt-.js → use-create-conversation-Be-eVpFp.js} +1 -1
- package/build/assets/use-create-secret-Bk9ZxTjl.js +1 -0
- package/build/assets/use-free-models-Ci3FkKEm.js +1 -0
- package/build/assets/{use-get-secrets-CQ4b0qK8.js → use-get-secrets-fqS0kxt6.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-B71ZEVg2.js +1 -0
- package/build/assets/use-llm-profiles-xtCBMbef.js +1 -0
- package/build/assets/{use-manifest-capabilities-AOWGcu0j.js → use-manifest-capabilities-Bso6A_-A.js} +1 -1
- package/build/assets/{use-onboarding-completion-CoINurkm.js → use-onboarding-completion-CEgjL02y.js} +1 -1
- package/build/assets/{use-pinned-home-route-D6krwXjy.js → use-pinned-home-route-pK4IlJ-p.js} +1 -1
- package/build/assets/{use-plugins-marketplace-mLsIDhBv.js → use-plugins-marketplace-B8-ZEB34.js} +1 -1
- package/build/assets/use-save-agent-profile-D7hJuW_u.js +1 -0
- package/build/assets/{use-save-settings-3U5K9-8x.js → use-save-settings-CikTu5xV.js} +1 -1
- package/build/assets/{use-settings-Dn00UISA.js → use-settings-BWIH5EuN.js} +1 -1
- package/build/assets/use-settings-nav-items-DSKwLDnd.js +1 -0
- package/build/assets/use-tracking-ChnSFChv.js +3 -0
- package/build/assets/{use-user-conversation-ZWlXtbZb.js → use-user-conversation-C_l65DqW.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-D-gOfhmN.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~b0x1wrp2-D6owle9R.js +2 -0
- 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~extensions-h~inibp4qe-BFRW8wt-.js +48 -0
- 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-PKtoIUUY.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 +16 -2
- package/build/locales/ca/openhands.json +16 -2
- package/build/locales/de/openhands.json +16 -2
- package/build/locales/en/openhands.json +16 -2
- package/build/locales/es/openhands.json +16 -2
- package/build/locales/fr/openhands.json +16 -2
- package/build/locales/it/openhands.json +16 -2
- package/build/locales/ja/openhands.json +16 -2
- package/build/locales/ko-KR/openhands.json +16 -2
- package/build/locales/no/openhands.json +16 -2
- package/build/locales/pt/openhands.json +16 -2
- package/build/locales/tr/openhands.json +16 -2
- package/build/locales/uk/openhands.json +16 -2
- package/build/locales/zh-CN/openhands.json +16 -2
- package/build/locales/zh-TW/openhands.json +16 -2
- package/config/defaults.json +3 -3
- 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/conversation-events/chat/event-content-helpers/get-skill-ready-content.cjs +3 -3
- package/dist/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.js +12 -16
- package/dist/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.js.map +1 -1
- package/dist/components/features/automations/automation-card.cjs +1 -1
- package/dist/components/features/automations/automation-card.cjs.map +1 -1
- package/dist/components/features/automations/automation-card.js +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/automations/detail/disabled-reason-banner.d.ts +16 -0
- 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/home/featured-automations/home-automation-run-tooltip.cjs +1 -1
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs.map +1 -1
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js +38 -29
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js.map +1 -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/agent-profiles/profile-scope-list.d.ts +20 -0
- 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 +3 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/constants/acp-providers.cjs +1 -1
- package/dist/constants/acp-providers.cjs.map +1 -1
- package/dist/constants/acp-providers.d.ts +7 -0
- package/dist/constants/acp-providers.js +20 -16
- package/dist/constants/acp-providers.js.map +1 -1
- package/dist/constants/profile-scope.d.ts +21 -0
- 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-automation-sdk-version.cjs +1 -1
- package/dist/hooks/query/use-automation-sdk-version.cjs.map +1 -1
- package/dist/hooks/query/use-automation-sdk-version.js +3 -1
- package/dist/hooks/query/use-automation-sdk-version.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-drag-resize.cjs +1 -1
- package/dist/hooks/use-drag-resize.cjs.map +1 -1
- package/dist/hooks/use-drag-resize.js +8 -9
- package/dist/hooks/use-drag-resize.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 +16 -2
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/translation.cjs +3 -3
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +255 -17
- package/dist/i18n/translation.js.map +1 -1
- package/dist/locales/ar/openhands.json +16 -2
- package/dist/locales/ca/openhands.json +16 -2
- package/dist/locales/de/openhands.json +16 -2
- package/dist/locales/en/openhands.json +16 -2
- package/dist/locales/es/openhands.json +16 -2
- package/dist/locales/fr/openhands.json +16 -2
- package/dist/locales/it/openhands.json +16 -2
- package/dist/locales/ja/openhands.json +16 -2
- package/dist/locales/ko-KR/openhands.json +16 -2
- package/dist/locales/no/openhands.json +16 -2
- package/dist/locales/pt/openhands.json +16 -2
- package/dist/locales/tr/openhands.json +16 -2
- package/dist/locales/uk/openhands.json +16 -2
- package/dist/locales/zh-CN/openhands.json +16 -2
- package/dist/locales/zh-TW/openhands.json +16 -2
- package/dist/manifests/manifest-validation.cjs +1 -1
- package/dist/manifests/manifest-validation.cjs.map +1 -1
- package/dist/manifests/manifest-validation.js +2 -2
- package/dist/manifests/manifest-validation.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.js +15 -8
- package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.js +11 -13
- package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.js +6 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js +3 -6
- package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/file-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/file-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/file-client.js +9 -12
- package/dist/node_modules/@openhands/typescript-client/dist/client/file-client.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/runtime-transport.cjs +2 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/runtime-transport.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/runtime-transport.js +41 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/runtime-transport.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/vscode-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/vscode-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/vscode-client.js +3 -6
- package/dist/node_modules/@openhands/typescript-client/dist/client/vscode-client.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/clients.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/clients.js +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js +199 -61
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.js +9 -8
- package/dist/node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.js.map +1 -1
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +2 -2
- package/dist/package.js.map +1 -1
- package/dist/routes/agent-settings.d.ts +5 -0
- 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/types/automation.cjs.map +1 -1
- package/dist/types/automation.d.ts +23 -1
- package/dist/types/automation.js.map +1 -1
- package/dist/utils/automation-disabled-reason.cjs +2 -0
- package/dist/utils/automation-disabled-reason.cjs.map +1 -0
- package/dist/utils/automation-disabled-reason.d.ts +32 -0
- package/dist/utils/automation-disabled-reason.js +19 -0
- package/dist/utils/automation-disabled-reason.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/dist/utils/parse-git-remote-url.cjs +1 -1
- package/dist/utils/parse-git-remote-url.cjs.map +1 -1
- package/dist/utils/parse-git-remote-url.d.ts +5 -1
- package/dist/utils/parse-git-remote-url.js +20 -13
- package/dist/utils/parse-git-remote-url.js.map +1 -1
- package/package.json +2 -2
- package/scripts/check-sdk-version-sync.mjs +79 -8
- package/scripts/dev-safe.mjs +1 -1
- package/scripts/static-server.mjs +24 -7
- package/build/assets/acp-providers-DrjNsPOH.js +0 -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/agent-settings-CpY3zObk.js +0 -2
- 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-C-_qBasq.js +0 -46
- 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/link-external-BNZzCM1I.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-marketplace-utils-Cn_NIMWM.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/parse-git-remote-url-DpDM9bK6.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/use-tracking-B9prBsrq.js +0 -3
- 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~b0x1wrp2-Z0lly3FE.js +0 -2
- 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~inibp4qe-CnsDDzeE.js +0 -48
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-CV850oio.js +0 -1
|
@@ -321,6 +321,13 @@
|
|
|
321
321
|
"SETTINGS$AGENT_PAGE_DESCRIPTION": "Оберіть між вбудованим агентом OpenHands і зовнішнім підпроцесом ACP (Agent Client Protocol), як-от Claude Code, Codex або Gemini CLI.",
|
|
322
322
|
"SETTINGS$AGENT_TYPE_OPENHANDS": "OpenHands",
|
|
323
323
|
"SETTINGS$AGENT_TYPE_ACP": "ACP (зовнішній підпроцес)",
|
|
324
|
+
"SETTINGS$AGENT_PROFILE_MCP": "Сервери MCP",
|
|
325
|
+
"SETTINGS$AGENT_PROFILE_MCP_ALL": "Усі сервери",
|
|
326
|
+
"SETTINGS$AGENT_PROFILE_MCP_CHOOSE": "Вибрати сервери",
|
|
327
|
+
"SETTINGS$AGENT_PROFILE_MCP_ALL_HINT": "Цей агент може використовувати всі налаштовані вами сервери MCP, зокрема ті, що здатні вносити зміни.",
|
|
328
|
+
"SETTINGS$AGENT_PROFILE_MCP_CHOOSE_HINT": "Цей агент може використовувати лише вибрані вами сервери. Усі інші сервери MCP залишаються прихованими від нього.",
|
|
329
|
+
"SETTINGS$AGENT_PROFILE_MCP_NONE": "Ви ще не налаштували жодного сервера MCP.",
|
|
330
|
+
"SETTINGS$AGENT_PROFILE_MCP_DANGLING": "{{names}} більше не налаштовано. Якщо зберегти з цим вибором, агент не запуститься — зніміть позначку або додайте сервер знову.",
|
|
324
331
|
"SETTINGS$AGENT_PRESET": "Пресет",
|
|
325
332
|
"SETTINGS$AGENT_PRESET_CUSTOM": "Власний",
|
|
326
333
|
"SETTINGS$AGENT_COMMAND": "Команда",
|
|
@@ -693,6 +700,7 @@
|
|
|
693
700
|
"SETTINGS$RESET": "Скидання налаштувань",
|
|
694
701
|
"SETTINGS$API_KEYS": "API ключі",
|
|
695
702
|
"SETTINGS$API_KEYS_DESCRIPTION": "Ключі API дозволяють вам програмно автентифікуватися за допомогою API OpenHands. Зберігайте свої ключі API в безпеці; будь-хто, хто має ваш ключ API, може отримати доступ до вашого облікового запису. Для отримання додаткової інформації про використання API, перегляньте нашу <a>документацію API</a>.",
|
|
703
|
+
"SETTINGS$OPENHANDS_FREE_MODELS_NOTE": "Безкоштовні моделі OpenHands: {{ids}}. Кінцеві точки інших постачальників зі схожими назвами моделей можуть потребувати окремої оплати.",
|
|
696
704
|
"SETTINGS$OPENHANDS_API_KEY_HELP_TEXT": "Ви можете знайти свій OpenHands Provider LLM Key у",
|
|
697
705
|
"SETTINGS$OPENHANDS_API_KEY_HELP_LINK": "OpenHands LLM Key",
|
|
698
706
|
"SETTINGS$OPENHANDS_API_KEY_HELP_SUFFIX": "розділі OpenHands Cloud -",
|
|
@@ -839,6 +847,9 @@
|
|
|
839
847
|
"AUTOMATIONS$DETAIL$PHASE_PREPARING": "Підготовка",
|
|
840
848
|
"AUTOMATIONS$DETAIL$PHASE_RUNNING_AGENT": "Агент виконується",
|
|
841
849
|
"AUTOMATIONS$DETAIL$INACTIVE": "Неактивний",
|
|
850
|
+
"AUTOMATIONS$DETAIL$DISABLED_MANUAL": "Вимкнено вручну",
|
|
851
|
+
"AUTOMATIONS$DETAIL$DISABLED_REASON_HEADING": "Чому призупинено",
|
|
852
|
+
"AUTOMATIONS$DETAIL$DISABLED_AT": "Призупинено {{time}}",
|
|
842
853
|
"AUTOMATIONS$DETAIL$LAST_RUN": "Останнє виконання",
|
|
843
854
|
"AUTOMATIONS$DETAIL$LOAD_MORE_RUNS": "Завантажити більше",
|
|
844
855
|
"AUTOMATIONS$DETAIL$EXPORT_JSON": "Експортувати JSON",
|
|
@@ -875,6 +886,7 @@
|
|
|
875
886
|
"AUTOMATIONS$DETAIL$PLUGINS": "Плагіни",
|
|
876
887
|
"AUTOMATIONS$DETAIL$PROMPT": "Запит",
|
|
877
888
|
"AUTOMATIONS$DETAIL$REPOSITORIES": "Репозиторії",
|
|
889
|
+
"AUTOMATIONS$DETAIL$RUNS_AS": "Автоматизація виконується від імені",
|
|
878
890
|
"AUTOMATIONS$DETAIL$SCHEDULE": "Розклад",
|
|
879
891
|
"AUTOMATIONS$DETAIL$SUCCESSFUL": "Успішно",
|
|
880
892
|
"AUTOMATIONS$DETAIL$TRIGGER": "Тригер",
|
|
@@ -1147,7 +1159,6 @@
|
|
|
1147
1159
|
"CONVERSATION$TOTAL_COST": "Загальна вартість",
|
|
1148
1160
|
"CONVERSATION$BUDGET": "Бюджет",
|
|
1149
1161
|
"CONVERSATION$BUDGET_USAGE": "% використано",
|
|
1150
|
-
"CONVERSATION$NO_BUDGET_LIMIT": "Без обмеження бюджету",
|
|
1151
1162
|
"CONVERSATION$INPUT": "Вхідні дані",
|
|
1152
1163
|
"CONVERSATION$OUTPUT": "Результат",
|
|
1153
1164
|
"CONVERSATION$TOTAL": "Всього",
|
|
@@ -2451,5 +2462,8 @@
|
|
|
2451
2462
|
"SETTINGS$PROVIDER_CONNECTION_PROVIDER": "Постачальник",
|
|
2452
2463
|
"SETTINGS$PROVIDER_CONNECTION_ROTATE_HINT": "Залиште порожнім, щоб зберегти поточний ключ.",
|
|
2453
2464
|
"SETTINGS$PROVIDER_CONNECTION_SELECT_LABEL": "Підключення постачальника",
|
|
2454
|
-
"SETTINGS$PROVIDER_CONNECTION_UPDATED": "Підключення \"{{name}}\" оновлено"
|
|
2465
|
+
"SETTINGS$PROVIDER_CONNECTION_UPDATED": "Підключення \"{{name}}\" оновлено",
|
|
2466
|
+
"BUTTON$VIEW_FULL_SIZE_IMAGE": "Переглянути зображення в повному розмірі",
|
|
2467
|
+
"BUTTON$REMOVE_IMAGE": "Видалити зображення",
|
|
2468
|
+
"IMAGE$FULL_SIZE_PREVIEW": "Попередній перегляд зображення в повному розмірі"
|
|
2455
2469
|
}
|
|
@@ -321,6 +321,13 @@
|
|
|
321
321
|
"SETTINGS$AGENT_PAGE_DESCRIPTION": "在内置的 OpenHands 代理和外部 ACP(Agent Client Protocol)子进程(如 Claude Code、Codex 或 Gemini CLI)之间进行选择。",
|
|
322
322
|
"SETTINGS$AGENT_TYPE_OPENHANDS": "OpenHands",
|
|
323
323
|
"SETTINGS$AGENT_TYPE_ACP": "ACP(外部子进程)",
|
|
324
|
+
"SETTINGS$AGENT_PROFILE_MCP": "MCP 服务器",
|
|
325
|
+
"SETTINGS$AGENT_PROFILE_MCP_ALL": "全部服务器",
|
|
326
|
+
"SETTINGS$AGENT_PROFILE_MCP_CHOOSE": "自选服务器",
|
|
327
|
+
"SETTINGS$AGENT_PROFILE_MCP_ALL_HINT": "该代理可以使用你配置的所有 MCP 服务器,其中也包括能够进行修改的服务器。",
|
|
328
|
+
"SETTINGS$AGENT_PROFILE_MCP_CHOOSE_HINT": "该代理只能使用你选择的服务器。其他 MCP 服务器对它不可见。",
|
|
329
|
+
"SETTINGS$AGENT_PROFILE_MCP_NONE": "你还没有配置任何 MCP 服务器。",
|
|
330
|
+
"SETTINGS$AGENT_PROFILE_MCP_DANGLING": "{{names}} 已不再配置。保持选中并保存会导致该代理无法启动——请取消选择或重新添加该服务器。",
|
|
324
331
|
"SETTINGS$AGENT_PRESET": "预设",
|
|
325
332
|
"SETTINGS$AGENT_PRESET_CUSTOM": "自定义",
|
|
326
333
|
"SETTINGS$AGENT_COMMAND": "命令",
|
|
@@ -693,6 +700,7 @@
|
|
|
693
700
|
"SETTINGS$RESET": "设置已重置",
|
|
694
701
|
"SETTINGS$API_KEYS": "API密钥",
|
|
695
702
|
"SETTINGS$API_KEYS_DESCRIPTION": "API密钥允许您以编程方式验证OpenHands API。请确保您的API密钥安全;任何拥有您API密钥的人都可以访问您的账户。有关如何使用API的更多信息,请参阅我们的<a>API文档</a>。",
|
|
703
|
+
"SETTINGS$OPENHANDS_FREE_MODELS_NOTE": "免费的 OpenHands 模型:{{ids}}。其他提供商中名称相似的模型端点可能需要单独付费。",
|
|
696
704
|
"SETTINGS$OPENHANDS_API_KEY_HELP_TEXT": "您可以在",
|
|
697
705
|
"SETTINGS$OPENHANDS_API_KEY_HELP_LINK": "OpenHands LLM Key",
|
|
698
706
|
"SETTINGS$OPENHANDS_API_KEY_HELP_SUFFIX": "部分中找到您的 OpenHands Provider LLM Key -",
|
|
@@ -839,6 +847,9 @@
|
|
|
839
847
|
"AUTOMATIONS$DETAIL$PHASE_PREPARING": "正在准备",
|
|
840
848
|
"AUTOMATIONS$DETAIL$PHASE_RUNNING_AGENT": "代理运行中",
|
|
841
849
|
"AUTOMATIONS$DETAIL$INACTIVE": "非活动",
|
|
850
|
+
"AUTOMATIONS$DETAIL$DISABLED_MANUAL": "已手动关闭",
|
|
851
|
+
"AUTOMATIONS$DETAIL$DISABLED_REASON_HEADING": "暂停原因",
|
|
852
|
+
"AUTOMATIONS$DETAIL$DISABLED_AT": "{{time}} 暂停",
|
|
842
853
|
"AUTOMATIONS$DETAIL$LAST_RUN": "上次运行",
|
|
843
854
|
"AUTOMATIONS$DETAIL$LOAD_MORE_RUNS": "加载更多",
|
|
844
855
|
"AUTOMATIONS$DETAIL$EXPORT_JSON": "导出 JSON",
|
|
@@ -875,6 +886,7 @@
|
|
|
875
886
|
"AUTOMATIONS$DETAIL$PLUGINS": "插件",
|
|
876
887
|
"AUTOMATIONS$DETAIL$PROMPT": "提示",
|
|
877
888
|
"AUTOMATIONS$DETAIL$REPOSITORIES": "仓库",
|
|
889
|
+
"AUTOMATIONS$DETAIL$RUNS_AS": "自动化运行身份",
|
|
878
890
|
"AUTOMATIONS$DETAIL$SCHEDULE": "计划",
|
|
879
891
|
"AUTOMATIONS$DETAIL$SUCCESSFUL": "成功",
|
|
880
892
|
"AUTOMATIONS$DETAIL$TRIGGER": "触发器",
|
|
@@ -1147,7 +1159,6 @@
|
|
|
1147
1159
|
"CONVERSATION$TOTAL_COST": "总成本",
|
|
1148
1160
|
"CONVERSATION$BUDGET": "预算",
|
|
1149
1161
|
"CONVERSATION$BUDGET_USAGE": "% 已使用",
|
|
1150
|
-
"CONVERSATION$NO_BUDGET_LIMIT": "无预算限制",
|
|
1151
1162
|
"CONVERSATION$INPUT": "输入",
|
|
1152
1163
|
"CONVERSATION$OUTPUT": "输出",
|
|
1153
1164
|
"CONVERSATION$TOTAL": "总计",
|
|
@@ -2451,5 +2462,8 @@
|
|
|
2451
2462
|
"SETTINGS$PROVIDER_CONNECTION_PROVIDER": "提供商",
|
|
2452
2463
|
"SETTINGS$PROVIDER_CONNECTION_ROTATE_HINT": "留空以保留当前密钥。",
|
|
2453
2464
|
"SETTINGS$PROVIDER_CONNECTION_SELECT_LABEL": "提供商连接",
|
|
2454
|
-
"SETTINGS$PROVIDER_CONNECTION_UPDATED": "已更新连接“{{name}}”"
|
|
2465
|
+
"SETTINGS$PROVIDER_CONNECTION_UPDATED": "已更新连接“{{name}}”",
|
|
2466
|
+
"BUTTON$VIEW_FULL_SIZE_IMAGE": "查看原始尺寸图片",
|
|
2467
|
+
"BUTTON$REMOVE_IMAGE": "移除图片",
|
|
2468
|
+
"IMAGE$FULL_SIZE_PREVIEW": "原始尺寸图片预览"
|
|
2455
2469
|
}
|
|
@@ -321,6 +321,13 @@
|
|
|
321
321
|
"SETTINGS$AGENT_PAGE_DESCRIPTION": "在內建的 OpenHands 代理和外部 ACP(Agent Client Protocol)子處理程序(如 Claude Code、Codex 或 Gemini CLI)之間進行選擇。",
|
|
322
322
|
"SETTINGS$AGENT_TYPE_OPENHANDS": "OpenHands",
|
|
323
323
|
"SETTINGS$AGENT_TYPE_ACP": "ACP(外部子處理程序)",
|
|
324
|
+
"SETTINGS$AGENT_PROFILE_MCP": "MCP 伺服器",
|
|
325
|
+
"SETTINGS$AGENT_PROFILE_MCP_ALL": "全部伺服器",
|
|
326
|
+
"SETTINGS$AGENT_PROFILE_MCP_CHOOSE": "自選伺服器",
|
|
327
|
+
"SETTINGS$AGENT_PROFILE_MCP_ALL_HINT": "該代理可以使用你設定的所有 MCP 伺服器,其中也包括能夠進行修改的伺服器。",
|
|
328
|
+
"SETTINGS$AGENT_PROFILE_MCP_CHOOSE_HINT": "該代理只能使用你選擇的伺服器。其他 MCP 伺服器對它不可見。",
|
|
329
|
+
"SETTINGS$AGENT_PROFILE_MCP_NONE": "你還沒有設定任何 MCP 伺服器。",
|
|
330
|
+
"SETTINGS$AGENT_PROFILE_MCP_DANGLING": "{{names}} 已不再設定。保持選取並儲存會導致該代理無法啟動——請取消選取或重新新增該伺服器。",
|
|
324
331
|
"SETTINGS$AGENT_PRESET": "預設集",
|
|
325
332
|
"SETTINGS$AGENT_PRESET_CUSTOM": "自訂",
|
|
326
333
|
"SETTINGS$AGENT_COMMAND": "命令",
|
|
@@ -693,6 +700,7 @@
|
|
|
693
700
|
"SETTINGS$RESET": "設置已重置",
|
|
694
701
|
"SETTINGS$API_KEYS": "API金鑰",
|
|
695
702
|
"SETTINGS$API_KEYS_DESCRIPTION": "API密鑰允許您以編程方式驗證OpenHands API。請確保您的API密鑰安全;任何擁有您API密鑰的人都可以訪問您的賬戶。有關如何使用API的更多信息,請參閱我們的<a>API文檔</a>。",
|
|
703
|
+
"SETTINGS$OPENHANDS_FREE_MODELS_NOTE": "免費的 OpenHands 模型:{{ids}}。其他供應商中名稱相似的模型端點可能需要另外付費。",
|
|
696
704
|
"SETTINGS$OPENHANDS_API_KEY_HELP_TEXT": "您可以在",
|
|
697
705
|
"SETTINGS$OPENHANDS_API_KEY_HELP_LINK": "OpenHands LLM Key",
|
|
698
706
|
"SETTINGS$OPENHANDS_API_KEY_HELP_SUFFIX": "區塊中找到您的 OpenHands Provider LLM Key -",
|
|
@@ -839,6 +847,9 @@
|
|
|
839
847
|
"AUTOMATIONS$DETAIL$PHASE_PREPARING": "正在準備",
|
|
840
848
|
"AUTOMATIONS$DETAIL$PHASE_RUNNING_AGENT": "代理執行中",
|
|
841
849
|
"AUTOMATIONS$DETAIL$INACTIVE": "非作用中",
|
|
850
|
+
"AUTOMATIONS$DETAIL$DISABLED_MANUAL": "已手動關閉",
|
|
851
|
+
"AUTOMATIONS$DETAIL$DISABLED_REASON_HEADING": "暫停原因",
|
|
852
|
+
"AUTOMATIONS$DETAIL$DISABLED_AT": "{{time}} 暫停",
|
|
842
853
|
"AUTOMATIONS$DETAIL$LAST_RUN": "上次執行",
|
|
843
854
|
"AUTOMATIONS$DETAIL$LOAD_MORE_RUNS": "載入更多",
|
|
844
855
|
"AUTOMATIONS$DETAIL$EXPORT_JSON": "匯出 JSON",
|
|
@@ -875,6 +886,7 @@
|
|
|
875
886
|
"AUTOMATIONS$DETAIL$PLUGINS": "外掛",
|
|
876
887
|
"AUTOMATIONS$DETAIL$PROMPT": "提示",
|
|
877
888
|
"AUTOMATIONS$DETAIL$REPOSITORIES": "存放庫",
|
|
889
|
+
"AUTOMATIONS$DETAIL$RUNS_AS": "自動化執行身分",
|
|
878
890
|
"AUTOMATIONS$DETAIL$SCHEDULE": "排程",
|
|
879
891
|
"AUTOMATIONS$DETAIL$SUCCESSFUL": "成功",
|
|
880
892
|
"AUTOMATIONS$DETAIL$TRIGGER": "觸發器",
|
|
@@ -1147,7 +1159,6 @@
|
|
|
1147
1159
|
"CONVERSATION$TOTAL_COST": "總成本",
|
|
1148
1160
|
"CONVERSATION$BUDGET": "預算",
|
|
1149
1161
|
"CONVERSATION$BUDGET_USAGE": "% 已使用",
|
|
1150
|
-
"CONVERSATION$NO_BUDGET_LIMIT": "無預算限制",
|
|
1151
1162
|
"CONVERSATION$INPUT": "輸入",
|
|
1152
1163
|
"CONVERSATION$OUTPUT": "輸出",
|
|
1153
1164
|
"CONVERSATION$TOTAL": "總計",
|
|
@@ -2451,5 +2462,8 @@
|
|
|
2451
2462
|
"SETTINGS$PROVIDER_CONNECTION_PROVIDER": "提供者",
|
|
2452
2463
|
"SETTINGS$PROVIDER_CONNECTION_ROTATE_HINT": "留空以保留目前的金鑰。",
|
|
2453
2464
|
"SETTINGS$PROVIDER_CONNECTION_SELECT_LABEL": "提供者連線",
|
|
2454
|
-
"SETTINGS$PROVIDER_CONNECTION_UPDATED": "已更新連線「{{name}}」"
|
|
2465
|
+
"SETTINGS$PROVIDER_CONNECTION_UPDATED": "已更新連線「{{name}}」",
|
|
2466
|
+
"BUTTON$VIEW_FULL_SIZE_IMAGE": "檢視原始尺寸圖片",
|
|
2467
|
+
"BUTTON$REMOVE_IMAGE": "移除圖片",
|
|
2468
|
+
"IMAGE$FULL_SIZE_PREVIEW": "原始尺寸圖片預覽"
|
|
2455
2469
|
}
|
package/config/defaults.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_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.",
|
|
3
3
|
"versions": {
|
|
4
|
-
"agentServer": "1.
|
|
5
|
-
"agentCanvas": "1.
|
|
6
|
-
"automation": "1.
|
|
4
|
+
"agentServer": "1.48.0",
|
|
5
|
+
"agentCanvas": "1.19.0",
|
|
6
|
+
"automation": "1.12.1"
|
|
7
7
|
},
|
|
8
8
|
"compatibility": {
|
|
9
9
|
"minimumAgentServer": "1.28.0"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"organization-service.api.cjs","names":[],"sources":["../../../src/api/cloud/organization-service.api.ts"],"sourcesContent":["import { HttpError } from \"@openhands/typescript-client\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { callCloudProxy } from \"./proxy\";\nimport type {\n CloudApiKeyMetadata,\n CloudOrganization,\n CloudOrganizationsResponse,\n} from \"./types\";\n\ninterface OrganizationsResult {\n items: CloudOrganization[];\n currentOrgId: string | null;\n}\n\nfunction normalizeResult(\n data: CloudOrganizationsResponse | undefined | null,\n): OrganizationsResult {\n return {\n items: data?.items ?? [],\n currentOrgId: data?.current_org_id ?? null,\n };\n}\n\nfunction resolveBackend(backend?: Backend): Backend {\n if (backend) return backend;\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\n \"Cloud organization calls require a cloud backend. Active backend is local.\",\n );\n }\n return active;\n}\n\n/**\n * Fetch the org list for a cloud backend. With no argument, uses the active\n * cloud backend; pass `backend` explicitly to fetch for an inactive cloud\n * (used by the selector to flatten all cloud rows).\n *\n * Calls the cloud API directly with the backend's bearer token.\n */\nexport async function getCloudOrganizations(\n backend?: Backend,\n): Promise<OrganizationsResult> {\n const target = resolveBackend(backend);\n const data = await callCloudProxy<CloudOrganizationsResponse>({\n backend: target,\n method: \"GET\",\n path: \"/api/organizations\",\n });\n return normalizeResult(data);\n}\n\n/**\n * Fetch metadata for the API key used to authenticate this cloud backend.\n * The returned `orgId` is the single org the key is authorized to act on\n * (the cloud contract: one key → one org).\n *\n * Legacy keys minted before per-key org binding existed cause the upstream\n * to return HTTP 400 — we surface that as `isLegacyKey: true` with a null\n * `orgId` so the caller can fall back to the unfiltered behavior. Other\n * statuses (401 revoked, 5xx outage) propagate so React Query can mark\n * the query as failed and the selector can render the no-org-known row.\n */\nexport async function getCurrentCloudApiKey(\n backend?: Backend,\n): Promise<{ orgId: string | null; isLegacyKey: boolean }> {\n const target = resolveBackend(backend);\n try {\n const data = await callCloudProxy<CloudApiKeyMetadata>({\n backend: target,\n method: \"GET\",\n path: \"/api/keys/current\",\n });\n return { orgId: data?.org_id ?? null, isLegacyKey: false };\n } catch (e) {\n if (e instanceof HttpError && e.status === 400) {\n return { orgId: null, isLegacyKey: true };\n }\n throw e;\n }\n}\n\n/**\n * Fetch `GET /api/organizations/{orgId}/me`. Identifies the calling user as\n * a member of `orgId`. The GUI uses `me.org_id === me.user_id` to decide\n * whether `orgId` is the user's personal workspace — that's the cloud\n * contract (the auto-generated personal-workspace org has the same id as\n * the user).\n *\n * `role` is the caller's role in the org (`owner` | `admin` | `member`, or\n * `null` if the upstream omits it). `permissions` is the server-defined\n * permission set for that role (e.g. `edit_org_settings`); it is `null` on\n * older app-servers that don't return it, so callers fall back to the role.\n * See `useCanManageOrgProfiles`.\n */\nexport async function getCloudOrganizationMe(\n orgId: string,\n backend?: Backend,\n): Promise<{\n orgId: string;\n userId: string;\n role: string | null;\n permissions?: string[] | null;\n}> {\n const target = resolveBackend(backend);\n const data = await callCloudProxy<{\n org_id: string;\n user_id: string;\n role?: string;\n permissions?: string[];\n }>({\n backend: target,\n method: \"GET\",\n path: `/api/organizations/${encodeURIComponent(orgId)}/me`,\n });\n return {\n orgId: data?.org_id ?? orgId,\n userId: data?.user_id ?? \"\",\n role: data?.role ?? null,\n // `null` when the field is absent (older app-server) so callers can fall\n // back to a role check; a present array is the server's source of truth.\n permissions: Array.isArray(data?.permissions) ? data.permissions : null,\n };\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"organization-service.api.cjs","names":[],"sources":["../../../src/api/cloud/organization-service.api.ts"],"sourcesContent":["import { HttpError } from \"@openhands/typescript-client\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { callCloudProxy } from \"./proxy\";\nimport type {\n CloudApiKeyMetadata,\n CloudOrganization,\n CloudOrganizationMember,\n CloudOrganizationsResponse,\n} from \"./types\";\n\ninterface OrganizationsResult {\n items: CloudOrganization[];\n currentOrgId: string | null;\n}\n\nfunction normalizeResult(\n data: CloudOrganizationsResponse | undefined | null,\n): OrganizationsResult {\n return {\n items: data?.items ?? [],\n currentOrgId: data?.current_org_id ?? null,\n };\n}\n\nfunction resolveBackend(backend?: Backend): Backend {\n if (backend) return backend;\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\n \"Cloud organization calls require a cloud backend. Active backend is local.\",\n );\n }\n return active;\n}\n\n/**\n * Fetch the org list for a cloud backend. With no argument, uses the active\n * cloud backend; pass `backend` explicitly to fetch for an inactive cloud\n * (used by the selector to flatten all cloud rows).\n *\n * Calls the cloud API directly with the backend's bearer token.\n */\nexport async function getCloudOrganizations(\n backend?: Backend,\n): Promise<OrganizationsResult> {\n const target = resolveBackend(backend);\n const data = await callCloudProxy<CloudOrganizationsResponse>({\n backend: target,\n method: \"GET\",\n path: \"/api/organizations\",\n });\n return normalizeResult(data);\n}\n\n/**\n * Fetch metadata for the API key used to authenticate this cloud backend.\n * The returned `orgId` is the single org the key is authorized to act on\n * (the cloud contract: one key → one org).\n *\n * Legacy keys minted before per-key org binding existed cause the upstream\n * to return HTTP 400 — we surface that as `isLegacyKey: true` with a null\n * `orgId` so the caller can fall back to the unfiltered behavior. Other\n * statuses (401 revoked, 5xx outage) propagate so React Query can mark\n * the query as failed and the selector can render the no-org-known row.\n */\nexport async function getCurrentCloudApiKey(\n backend?: Backend,\n): Promise<{ orgId: string | null; isLegacyKey: boolean }> {\n const target = resolveBackend(backend);\n try {\n const data = await callCloudProxy<CloudApiKeyMetadata>({\n backend: target,\n method: \"GET\",\n path: \"/api/keys/current\",\n });\n return { orgId: data?.org_id ?? null, isLegacyKey: false };\n } catch (e) {\n if (e instanceof HttpError && e.status === 400) {\n return { orgId: null, isLegacyKey: true };\n }\n throw e;\n }\n}\n\n/**\n * Fetch `GET /api/organizations/{orgId}/me`. Identifies the calling user as\n * a member of `orgId`. The GUI uses `me.org_id === me.user_id` to decide\n * whether `orgId` is the user's personal workspace — that's the cloud\n * contract (the auto-generated personal-workspace org has the same id as\n * the user).\n *\n * `role` is the caller's role in the org (`owner` | `admin` | `member`, or\n * `null` if the upstream omits it). `permissions` is the server-defined\n * permission set for that role (e.g. `edit_org_settings`); it is `null` on\n * older app-servers that don't return it, so callers fall back to the role.\n * See `useCanManageOrgProfiles`.\n */\nexport async function getCloudOrganizationMe(\n orgId: string,\n backend?: Backend,\n): Promise<{\n orgId: string;\n userId: string;\n role: string | null;\n permissions?: string[] | null;\n}> {\n const target = resolveBackend(backend);\n const data = await callCloudProxy<{\n org_id: string;\n user_id: string;\n role?: string;\n permissions?: string[];\n }>({\n backend: target,\n method: \"GET\",\n path: `/api/organizations/${encodeURIComponent(orgId)}/me`,\n });\n return {\n orgId: data?.org_id ?? orgId,\n userId: data?.user_id ?? \"\",\n role: data?.role ?? null,\n // `null` when the field is absent (older app-server) so callers can fall\n // back to a role check; a present array is the server's source of truth.\n permissions: Array.isArray(data?.permissions) ? data.permissions : null,\n };\n}\n\n/**\n * Fetch `GET /api/organizations/{orgId}/members/{userId}`: one member of\n * `orgId` by user id. Any org member may read it (same permission as the\n * members list). The upstream responds 404 when `userId` is not (or no\n * longer) a member of the org, and older app-servers that predate the route\n * 404 as well, so callers should treat a failure as \"identity unresolved\".\n */\nexport async function getCloudOrganizationMember(\n orgId: string,\n userId: string,\n backend?: Backend,\n): Promise<CloudOrganizationMember> {\n const target = resolveBackend(backend);\n return callCloudProxy<CloudOrganizationMember>({\n backend: target,\n method: \"GET\",\n path: `/api/organizations/${encodeURIComponent(orgId)}/members/${encodeURIComponent(userId)}`,\n });\n}\n"],"mappings":"oSAgBA,SAAS,EACP,EACqB,CACrB,MAAO,CACL,MAAO,GAAM,OAAS,CAAC,EACvB,aAAc,GAAM,gBAAkB,IACxC,CACF,CAEA,SAAS,EAAe,EAA4B,CAClD,GAAI,EAAS,OAAO,EACpB,IAAM,EAAS,EAAA,iBAAiB,EAAE,QAClC,GAAI,EAAO,OAAS,QAClB,MAAU,MACR,4EACF,EAEF,OAAO,CACT,CASA,eAAsB,EACpB,EAC8B,CAO9B,OAAO,EAAgB,MALJ,EAAA,eAA2C,CAC5D,QAFa,EAAe,CAEnB,EACT,OAAQ,MACR,KAAM,oBACR,CAAC,CAC0B,CAC7B,CAaA,eAAsB,EACpB,EACyD,CACzD,IAAM,EAAS,EAAe,CAAO,EACrC,GAAI,CAMF,MAAO,CAAE,OAAO,MALG,EAAA,eAAoC,CACrD,QAAS,EACT,OAAQ,MACR,KAAM,mBACR,CAAC,IACqB,QAAU,KAAM,YAAa,EAAM,CAC3D,OAAS,EAAG,CACV,GAAI,aAAa,EAAA,WAAa,EAAE,SAAW,IACzC,MAAO,CAAE,MAAO,KAAM,YAAa,EAAK,EAE1C,MAAM,CACR,CACF,CAeA,eAAsB,EACpB,EACA,EAMC,CAED,IAAM,EAAO,MAAM,EAAA,eAKhB,CACD,QAPa,EAAe,CAOnB,EACT,OAAQ,MACR,KAAM,sBAAsB,mBAAmB,CAAK,EAAE,IACxD,CAAC,EACD,MAAO,CACL,MAAO,GAAM,QAAU,EACvB,OAAQ,GAAM,SAAW,GACzB,KAAM,GAAM,MAAQ,KAGpB,YAAa,MAAM,QAAQ,GAAM,WAAW,EAAI,EAAK,YAAc,IACrE,CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Backend } from "../backend-registry/types";
|
|
2
|
-
import type { CloudOrganization } from "./types";
|
|
2
|
+
import type { CloudOrganization, CloudOrganizationMember } from "./types";
|
|
3
3
|
interface OrganizationsResult {
|
|
4
4
|
items: CloudOrganization[];
|
|
5
5
|
currentOrgId: string | null;
|
|
@@ -46,4 +46,12 @@ export declare function getCloudOrganizationMe(orgId: string, backend?: Backend)
|
|
|
46
46
|
role: string | null;
|
|
47
47
|
permissions?: string[] | null;
|
|
48
48
|
}>;
|
|
49
|
+
/**
|
|
50
|
+
* Fetch `GET /api/organizations/{orgId}/members/{userId}`: one member of
|
|
51
|
+
* `orgId` by user id. Any org member may read it (same permission as the
|
|
52
|
+
* members list). The upstream responds 404 when `userId` is not (or no
|
|
53
|
+
* longer) a member of the org, and older app-servers that predate the route
|
|
54
|
+
* 404 as well, so callers should treat a failure as "identity unresolved".
|
|
55
|
+
*/
|
|
56
|
+
export declare function getCloudOrganizationMember(orgId: string, userId: string, backend?: Backend): Promise<CloudOrganizationMember>;
|
|
49
57
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"organization-service.api.js","names":[],"sources":["../../../src/api/cloud/organization-service.api.ts"],"sourcesContent":["import { HttpError } from \"@openhands/typescript-client\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { callCloudProxy } from \"./proxy\";\nimport type {\n CloudApiKeyMetadata,\n CloudOrganization,\n CloudOrganizationsResponse,\n} from \"./types\";\n\ninterface OrganizationsResult {\n items: CloudOrganization[];\n currentOrgId: string | null;\n}\n\nfunction normalizeResult(\n data: CloudOrganizationsResponse | undefined | null,\n): OrganizationsResult {\n return {\n items: data?.items ?? [],\n currentOrgId: data?.current_org_id ?? null,\n };\n}\n\nfunction resolveBackend(backend?: Backend): Backend {\n if (backend) return backend;\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\n \"Cloud organization calls require a cloud backend. Active backend is local.\",\n );\n }\n return active;\n}\n\n/**\n * Fetch the org list for a cloud backend. With no argument, uses the active\n * cloud backend; pass `backend` explicitly to fetch for an inactive cloud\n * (used by the selector to flatten all cloud rows).\n *\n * Calls the cloud API directly with the backend's bearer token.\n */\nexport async function getCloudOrganizations(\n backend?: Backend,\n): Promise<OrganizationsResult> {\n const target = resolveBackend(backend);\n const data = await callCloudProxy<CloudOrganizationsResponse>({\n backend: target,\n method: \"GET\",\n path: \"/api/organizations\",\n });\n return normalizeResult(data);\n}\n\n/**\n * Fetch metadata for the API key used to authenticate this cloud backend.\n * The returned `orgId` is the single org the key is authorized to act on\n * (the cloud contract: one key → one org).\n *\n * Legacy keys minted before per-key org binding existed cause the upstream\n * to return HTTP 400 — we surface that as `isLegacyKey: true` with a null\n * `orgId` so the caller can fall back to the unfiltered behavior. Other\n * statuses (401 revoked, 5xx outage) propagate so React Query can mark\n * the query as failed and the selector can render the no-org-known row.\n */\nexport async function getCurrentCloudApiKey(\n backend?: Backend,\n): Promise<{ orgId: string | null; isLegacyKey: boolean }> {\n const target = resolveBackend(backend);\n try {\n const data = await callCloudProxy<CloudApiKeyMetadata>({\n backend: target,\n method: \"GET\",\n path: \"/api/keys/current\",\n });\n return { orgId: data?.org_id ?? null, isLegacyKey: false };\n } catch (e) {\n if (e instanceof HttpError && e.status === 400) {\n return { orgId: null, isLegacyKey: true };\n }\n throw e;\n }\n}\n\n/**\n * Fetch `GET /api/organizations/{orgId}/me`. Identifies the calling user as\n * a member of `orgId`. The GUI uses `me.org_id === me.user_id` to decide\n * whether `orgId` is the user's personal workspace — that's the cloud\n * contract (the auto-generated personal-workspace org has the same id as\n * the user).\n *\n * `role` is the caller's role in the org (`owner` | `admin` | `member`, or\n * `null` if the upstream omits it). `permissions` is the server-defined\n * permission set for that role (e.g. `edit_org_settings`); it is `null` on\n * older app-servers that don't return it, so callers fall back to the role.\n * See `useCanManageOrgProfiles`.\n */\nexport async function getCloudOrganizationMe(\n orgId: string,\n backend?: Backend,\n): Promise<{\n orgId: string;\n userId: string;\n role: string | null;\n permissions?: string[] | null;\n}> {\n const target = resolveBackend(backend);\n const data = await callCloudProxy<{\n org_id: string;\n user_id: string;\n role?: string;\n permissions?: string[];\n }>({\n backend: target,\n method: \"GET\",\n path: `/api/organizations/${encodeURIComponent(orgId)}/me`,\n });\n return {\n orgId: data?.org_id ?? orgId,\n userId: data?.user_id ?? \"\",\n role: data?.role ?? null,\n // `null` when the field is absent (older app-server) so callers can fall\n // back to a role check; a present array is the server's source of truth.\n permissions: Array.isArray(data?.permissions) ? data.permissions : null,\n };\n}\n"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"organization-service.api.js","names":[],"sources":["../../../src/api/cloud/organization-service.api.ts"],"sourcesContent":["import { HttpError } from \"@openhands/typescript-client\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { callCloudProxy } from \"./proxy\";\nimport type {\n CloudApiKeyMetadata,\n CloudOrganization,\n CloudOrganizationMember,\n CloudOrganizationsResponse,\n} from \"./types\";\n\ninterface OrganizationsResult {\n items: CloudOrganization[];\n currentOrgId: string | null;\n}\n\nfunction normalizeResult(\n data: CloudOrganizationsResponse | undefined | null,\n): OrganizationsResult {\n return {\n items: data?.items ?? [],\n currentOrgId: data?.current_org_id ?? null,\n };\n}\n\nfunction resolveBackend(backend?: Backend): Backend {\n if (backend) return backend;\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\n \"Cloud organization calls require a cloud backend. Active backend is local.\",\n );\n }\n return active;\n}\n\n/**\n * Fetch the org list for a cloud backend. With no argument, uses the active\n * cloud backend; pass `backend` explicitly to fetch for an inactive cloud\n * (used by the selector to flatten all cloud rows).\n *\n * Calls the cloud API directly with the backend's bearer token.\n */\nexport async function getCloudOrganizations(\n backend?: Backend,\n): Promise<OrganizationsResult> {\n const target = resolveBackend(backend);\n const data = await callCloudProxy<CloudOrganizationsResponse>({\n backend: target,\n method: \"GET\",\n path: \"/api/organizations\",\n });\n return normalizeResult(data);\n}\n\n/**\n * Fetch metadata for the API key used to authenticate this cloud backend.\n * The returned `orgId` is the single org the key is authorized to act on\n * (the cloud contract: one key → one org).\n *\n * Legacy keys minted before per-key org binding existed cause the upstream\n * to return HTTP 400 — we surface that as `isLegacyKey: true` with a null\n * `orgId` so the caller can fall back to the unfiltered behavior. Other\n * statuses (401 revoked, 5xx outage) propagate so React Query can mark\n * the query as failed and the selector can render the no-org-known row.\n */\nexport async function getCurrentCloudApiKey(\n backend?: Backend,\n): Promise<{ orgId: string | null; isLegacyKey: boolean }> {\n const target = resolveBackend(backend);\n try {\n const data = await callCloudProxy<CloudApiKeyMetadata>({\n backend: target,\n method: \"GET\",\n path: \"/api/keys/current\",\n });\n return { orgId: data?.org_id ?? null, isLegacyKey: false };\n } catch (e) {\n if (e instanceof HttpError && e.status === 400) {\n return { orgId: null, isLegacyKey: true };\n }\n throw e;\n }\n}\n\n/**\n * Fetch `GET /api/organizations/{orgId}/me`. Identifies the calling user as\n * a member of `orgId`. The GUI uses `me.org_id === me.user_id` to decide\n * whether `orgId` is the user's personal workspace — that's the cloud\n * contract (the auto-generated personal-workspace org has the same id as\n * the user).\n *\n * `role` is the caller's role in the org (`owner` | `admin` | `member`, or\n * `null` if the upstream omits it). `permissions` is the server-defined\n * permission set for that role (e.g. `edit_org_settings`); it is `null` on\n * older app-servers that don't return it, so callers fall back to the role.\n * See `useCanManageOrgProfiles`.\n */\nexport async function getCloudOrganizationMe(\n orgId: string,\n backend?: Backend,\n): Promise<{\n orgId: string;\n userId: string;\n role: string | null;\n permissions?: string[] | null;\n}> {\n const target = resolveBackend(backend);\n const data = await callCloudProxy<{\n org_id: string;\n user_id: string;\n role?: string;\n permissions?: string[];\n }>({\n backend: target,\n method: \"GET\",\n path: `/api/organizations/${encodeURIComponent(orgId)}/me`,\n });\n return {\n orgId: data?.org_id ?? orgId,\n userId: data?.user_id ?? \"\",\n role: data?.role ?? null,\n // `null` when the field is absent (older app-server) so callers can fall\n // back to a role check; a present array is the server's source of truth.\n permissions: Array.isArray(data?.permissions) ? data.permissions : null,\n };\n}\n\n/**\n * Fetch `GET /api/organizations/{orgId}/members/{userId}`: one member of\n * `orgId` by user id. Any org member may read it (same permission as the\n * members list). The upstream responds 404 when `userId` is not (or no\n * longer) a member of the org, and older app-servers that predate the route\n * 404 as well, so callers should treat a failure as \"identity unresolved\".\n */\nexport async function getCloudOrganizationMember(\n orgId: string,\n userId: string,\n backend?: Backend,\n): Promise<CloudOrganizationMember> {\n const target = resolveBackend(backend);\n return callCloudProxy<CloudOrganizationMember>({\n backend: target,\n method: \"GET\",\n path: `/api/organizations/${encodeURIComponent(orgId)}/members/${encodeURIComponent(userId)}`,\n });\n}\n"],"mappings":";;;;;AAgBA,SAAS,EACP,GACqB;CACrB,OAAO;EACL,OAAO,GAAM,SAAS,CAAC;EACvB,cAAc,GAAM,kBAAkB;CACxC;AACF;AAEA,SAAS,EAAe,GAA4B;CAClD,IAAI,GAAS,OAAO;CACpB,IAAM,IAAS,EAAiB,EAAE;CAClC,IAAI,EAAO,SAAS,SAClB,MAAU,MACR,4EACF;CAEF,OAAO;AACT;AASA,eAAsB,EACpB,GAC8B;CAO9B,OAAO,EAAgB,MALJ,EAA2C;EAC5D,SAFa,EAAe,CAEnB;EACT,QAAQ;EACR,MAAM;CACR,CAAC,CAC0B;AAC7B;AAaA,eAAsB,EACpB,GACyD;CACzD,IAAM,IAAS,EAAe,CAAO;CACrC,IAAI;EAMF,OAAO;GAAE,QAAO,MALG,EAAoC;IACrD,SAAS;IACT,QAAQ;IACR,MAAM;GACR,CAAC,IACqB,UAAU;GAAM,aAAa;EAAM;CAC3D,SAAS,GAAG;EACV,IAAI,aAAa,KAAa,EAAE,WAAW,KACzC,OAAO;GAAE,OAAO;GAAM,aAAa;EAAK;EAE1C,MAAM;CACR;AACF;AAeA,eAAsB,EACpB,GACA,GAMC;CAED,IAAM,IAAO,MAAM,EAKhB;EACD,SAPa,EAAe,CAOnB;EACT,QAAQ;EACR,MAAM,sBAAsB,mBAAmB,CAAK,EAAE;CACxD,CAAC;CACD,OAAO;EACL,OAAO,GAAM,UAAU;EACvB,QAAQ,GAAM,WAAW;EACzB,MAAM,GAAM,QAAQ;EAGpB,aAAa,MAAM,QAAQ,GAAM,WAAW,IAAI,EAAK,cAAc;CACrE;AACF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../node_modules/@openhands/typescript-client/dist/client/llm-client.cjs");require("../../node_modules/@openhands/typescript-client/dist/clients.cjs");const t=require("../backend-registry/active-store.cjs"),n=require("../agent-server-client-options.cjs"),r=require("../cloud/proxy.cjs");function i(e,t){if(!t)return e;let n=t.toLowerCase();return e.filter(e=>e.name.toLowerCase().includes(n))}function a(e,t){return t===void 0?e:e.filter(e=>e.verified===t)}function o(e,t){return!t||t<=0?e:e.slice(0,t)}function s(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e))r!==void 0&&t.set(n,String(r));let n=t.toString();return n?`?${n}`:``}var c=class{static async searchModels(c={},l){let u=t.getActiveBackend();if(u.backend.kind===`cloud`){let e=s({page_id:c.page_id,limit:c.limit,query:c.query,verified__eq:c.verified__eq,provider__eq:c.provider__eq});return r.callCloudProxy({backend:u.backend,method:`GET`,path:`/api/v1/config/models/search${e}`})}let d=new e.LLMMetadataClient(n.getAgentServerClientOptions()),f=l===void 0?d.getVerifiedModels():Promise.resolve(l),[p,m]=await Promise.all([d.getModels(),f]),h=c.provider__eq??null,g=new Set(h?m?.[h]??[]:[]),_=[...g].map(e=>({provider:h,name:e,verified:!0})),v=h?(p??[]).filter(e=>e.startsWith(`${h}/`)).map(e=>e.slice(h.length+1)).filter(e=>e.length>0&&!g.has(e)).map(e=>({provider:h,name:e,verified:!1})):[];return{items:o(a(i([..._,...v],c.query),c.verified__eq),c.limit),next_page_id:null}}static async searchProviders(c={},l){let u=t.getActiveBackend();if(u.backend.kind===`cloud`){let e=s({page_id:c.page_id,limit:c.limit,query:c.query,verified__eq:c.verified__eq});return r.callCloudProxy({backend:u.backend,method:`GET`,path:`/api/v1/config/providers/search${e}`})}let d=new e.LLMMetadataClient(n.getAgentServerClientOptions()),f=l===void 0?d.getVerifiedModels():Promise.resolve(l),[p,m]=await Promise.all([d.getProviders(),f]),h=new Set(Object.keys(m??{}));return{items:o(a(i([...new Set([...h,...p??[]])].map(e=>({name:e,verified:h.has(e)})),c.query),c.verified__eq),c.limit),next_page_id:null}}};exports.default=c;
|
|
1
|
+
require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../node_modules/@openhands/typescript-client/dist/client/llm-client.cjs");require("../../node_modules/@openhands/typescript-client/dist/clients.cjs");const t=require("../backend-registry/active-store.cjs"),n=require("../agent-server-client-options.cjs"),r=require("../cloud/proxy.cjs");function i(e,t){if(!t)return e;let n=t.toLowerCase();return e.filter(e=>e.name.toLowerCase().includes(n))}function a(e,t){return t===void 0?e:e.filter(e=>e.verified===t)}function o(e,t){return!t||t<=0?e:e.slice(0,t)}function s(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e))r!==void 0&&t.set(n,String(r));let n=t.toString();return n?`?${n}`:``}var c=class{static async searchModels(c={},l){let u=t.getActiveBackend();if(u.backend.kind===`cloud`){let e=s({page_id:c.page_id,limit:c.limit,query:c.query,verified__eq:c.verified__eq,provider__eq:c.provider__eq});return r.callCloudProxy({backend:u.backend,method:`GET`,path:`/api/v1/config/models/search${e}`})}let d=new e.LLMMetadataClient(n.getAgentServerClientOptions()),f=l===void 0?d.getVerifiedModels():Promise.resolve(l),[p,m]=await Promise.all([d.getModels(),f]),h=c.provider__eq??null,g=new Set(h?m?.[h]??[]:[]),_=[...g].map(e=>({provider:h,name:e,verified:!0,free:!1,default:!1})),v=h?(p??[]).filter(e=>e.startsWith(`${h}/`)).map(e=>e.slice(h.length+1)).filter(e=>e.length>0&&!g.has(e)).map(e=>({provider:h,name:e,verified:!1,free:!1,default:!1})):[];return{items:o(a(i([..._,...v],c.query),c.verified__eq),c.limit),next_page_id:null}}static async searchProviders(c={},l){let u=t.getActiveBackend();if(u.backend.kind===`cloud`){let e=s({page_id:c.page_id,limit:c.limit,query:c.query,verified__eq:c.verified__eq});return r.callCloudProxy({backend:u.backend,method:`GET`,path:`/api/v1/config/providers/search${e}`})}let d=new e.LLMMetadataClient(n.getAgentServerClientOptions()),f=l===void 0?d.getVerifiedModels():Promise.resolve(l),[p,m]=await Promise.all([d.getProviders(),f]),h=new Set(Object.keys(m??{}));return{items:o(a(i([...new Set([...h,...p??[]])].map(e=>({name:e,verified:h.has(e)})),c.query),c.verified__eq),c.limit),next_page_id:null}}};exports.default=c;
|
|
2
2
|
//# sourceMappingURL=config-service.api.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-service.api.cjs","names":[],"sources":["../../../src/api/config-service/config-service.api.ts"],"sourcesContent":["import { LLMMetadataClient } from \"@openhands/typescript-client/clients\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport type {\n LLMModel,\n LLMModelPage,\n LLMProvider,\n ProviderPage,\n SearchModelsParams,\n SearchProvidersParams,\n} from \"./config-service.types\";\n\nfunction filterByQuery<T extends { name: string }>(\n items: T[],\n query?: string,\n): T[] {\n if (!query) {\n return items;\n }\n\n const normalizedQuery = query.toLowerCase();\n return items.filter((item) =>\n item.name.toLowerCase().includes(normalizedQuery),\n );\n}\n\nfunction filterByVerified<T extends { verified: boolean }>(\n items: T[],\n verified?: boolean,\n): T[] {\n if (verified === undefined) {\n return items;\n }\n\n return items.filter((item) => item.verified === verified);\n}\n\nfunction limitItems<T>(items: T[], limit?: number): T[] {\n if (!limit || limit <= 0) {\n return items;\n }\n\n return items.slice(0, limit);\n}\n\nfunction buildCloudQueryString(\n params: Record<string, string | number | boolean | undefined>,\n): string {\n const qs = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) qs.set(key, String(value));\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\nclass ConfigService {\n /**\n * @param verifiedByProvider - Pre-fetched verified-models map used by the\n * local reconstruction path. Ignored for cloud backends, which call\n * `/api/v1/config/models/search` directly (verified status is embedded in\n * each returned item).\n */\n static async searchModels(\n params: SearchModelsParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<LLMModelPage> {\n const active = getActiveBackend();\n\n if (active.backend.kind === \"cloud\") {\n // Cloud exposes /api/v1/config/models/search which returns LLMModelPage directly.\n // verifiedByProvider is not needed — the cloud API embeds verified status natively.\n const qs = buildCloudQueryString({\n page_id: params.page_id,\n limit: params.limit,\n query: params.query,\n verified__eq: params.verified__eq,\n provider__eq: params.provider__eq,\n });\n return callCloudProxy<LLMModelPage>({\n backend: active.backend,\n method: \"GET\",\n path: `/api/v1/config/models/search${qs}`,\n });\n }\n\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [models, verifiedMap] = await Promise.all([\n llmClient.getModels(),\n verifiedFetch,\n ]);\n\n const provider = params.provider__eq ?? null;\n const verifiedNames = new Set(\n provider ? (verifiedMap?.[provider] ?? []) : [],\n );\n const verifiedItems: LLMModel[] = [...verifiedNames].map((name) => ({\n provider,\n name,\n verified: true,\n }));\n\n const prefixedItems: LLMModel[] = provider\n ? (models ?? [])\n .filter((model) => model.startsWith(`${provider}/`))\n .map((model) => model.slice(provider.length + 1))\n .filter((name) => name.length > 0 && !verifiedNames.has(name))\n .map((name) => ({\n provider,\n name,\n verified: false,\n }))\n : [];\n\n const items = limitItems(\n filterByVerified(\n filterByQuery([...verifiedItems, ...prefixedItems], params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return { items, next_page_id: null };\n }\n\n /**\n * @param verifiedByProvider - Pre-fetched verified-models map used by the\n * local reconstruction path. Ignored for cloud backends, which call\n * `/api/v1/config/providers/search` directly (verified status is embedded in\n * each returned item).\n */\n static async searchProviders(\n params: SearchProvidersParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<ProviderPage> {\n const active = getActiveBackend();\n\n if (active.backend.kind === \"cloud\") {\n // Cloud exposes /api/v1/config/providers/search which returns ProviderPage directly.\n // verifiedByProvider is not needed — the cloud API embeds verified status natively.\n const qs = buildCloudQueryString({\n page_id: params.page_id,\n limit: params.limit,\n query: params.query,\n verified__eq: params.verified__eq,\n });\n return callCloudProxy<ProviderPage>({\n backend: active.backend,\n method: \"GET\",\n path: `/api/v1/config/providers/search${qs}`,\n });\n }\n\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [providers, verifiedMap] = await Promise.all([\n llmClient.getProviders(),\n verifiedFetch,\n ]);\n\n const verifiedProviders = new Set(Object.keys(verifiedMap ?? {}));\n const names = new Set<string>([...verifiedProviders, ...(providers ?? [])]);\n const providerItems: LLMProvider[] = [...names].map((name) => ({\n name,\n verified: verifiedProviders.has(name),\n }));\n\n const items = limitItems(\n filterByVerified(\n filterByQuery(providerItems, params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return { items, next_page_id: null };\n }\n}\n\nexport default ConfigService;\n"],"mappings":"kWAaA,SAAS,EACP,EACA,EACK,CACL,GAAI,CAAC,EACH,OAAO,EAGT,IAAM,EAAkB,EAAM,YAAY,EAC1C,OAAO,EAAM,OAAQ,GACnB,EAAK,KAAK,YAAY,EAAE,SAAS,CAAe,CAClD,CACF,CAEA,SAAS,EACP,EACA,EACK,CAKL,OAJI,IAAa,IAAA,GACR,EAGF,EAAM,OAAQ,GAAS,EAAK,WAAa,CAAQ,CAC1D,CAEA,SAAS,EAAc,EAAY,EAAqB,CAKtD,MAJI,CAAC,GAAS,GAAS,EACd,EAGF,EAAM,MAAM,EAAG,CAAK,CAC7B,CAEA,SAAS,EACP,EACQ,CACR,IAAM,EAAK,IAAI,gBACf,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,CAAM,EAC1C,IAAU,IAAA,IAAW,EAAG,IAAI,EAAK,OAAO,CAAK,CAAC,EAEpD,IAAM,EAAM,EAAG,SAAS,EACxB,OAAO,EAAM,IAAI,IAAQ,EAC3B,CAEA,IAAM,EAAN,KAAoB,CAOlB,aAAa,aACX,EAA6B,CAAC,EAC9B,EACuB,CACvB,IAAM,EAAS,EAAA,iBAAiB,EAEhC,GAAI,EAAO,QAAQ,OAAS,QAAS,CAGnC,IAAM,EAAK,EAAsB,CAC/B,QAAS,EAAO,QAChB,MAAO,EAAO,MACd,MAAO,EAAO,MACd,aAAc,EAAO,aACrB,aAAc,EAAO,YACvB,CAAC,EACD,OAAO,EAAA,eAA6B,CAClC,QAAS,EAAO,QAChB,OAAQ,MACR,KAAM,+BAA+B,GACvC,CAAC,CACH,CAEA,IAAM,EAAY,IAAI,EAAA,kBAAkB,EAAA,4BAA4B,CAAC,EAC/D,EACJ,IAAuB,IAAA,GAEnB,EAAU,kBAAkB,EAD5B,QAAQ,QAAQ,CAAkB,EAElC,CAAC,EAAQ,GAAe,MAAM,QAAQ,IAAI,CAC9C,EAAU,UAAU,EACpB,CACF,CAAC,EAEK,EAAW,EAAO,cAAgB,KAClC,EAAgB,IAAI,IACxB,EAAY,IAAc,IAAa,CAAC,EAAK,CAAC,CAChD,
|
|
1
|
+
{"version":3,"file":"config-service.api.cjs","names":[],"sources":["../../../src/api/config-service/config-service.api.ts"],"sourcesContent":["import { LLMMetadataClient } from \"@openhands/typescript-client/clients\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport type {\n LLMModel,\n LLMModelPage,\n LLMProvider,\n ProviderPage,\n SearchModelsParams,\n SearchProvidersParams,\n} from \"./config-service.types\";\n\nfunction filterByQuery<T extends { name: string }>(\n items: T[],\n query?: string,\n): T[] {\n if (!query) {\n return items;\n }\n\n const normalizedQuery = query.toLowerCase();\n return items.filter((item) =>\n item.name.toLowerCase().includes(normalizedQuery),\n );\n}\n\nfunction filterByVerified<T extends { verified: boolean }>(\n items: T[],\n verified?: boolean,\n): T[] {\n if (verified === undefined) {\n return items;\n }\n\n return items.filter((item) => item.verified === verified);\n}\n\nfunction limitItems<T>(items: T[], limit?: number): T[] {\n if (!limit || limit <= 0) {\n return items;\n }\n\n return items.slice(0, limit);\n}\n\nfunction buildCloudQueryString(\n params: Record<string, string | number | boolean | undefined>,\n): string {\n const qs = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) qs.set(key, String(value));\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\nclass ConfigService {\n /**\n * @param verifiedByProvider - Pre-fetched verified-models map used by the\n * local reconstruction path. Ignored for cloud backends, which call\n * `/api/v1/config/models/search` directly (verified status is embedded in\n * each returned item).\n */\n static async searchModels(\n params: SearchModelsParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<LLMModelPage> {\n const active = getActiveBackend();\n\n if (active.backend.kind === \"cloud\") {\n // Cloud exposes /api/v1/config/models/search which returns LLMModelPage directly.\n // verifiedByProvider is not needed — the cloud API embeds verified status natively.\n const qs = buildCloudQueryString({\n page_id: params.page_id,\n limit: params.limit,\n query: params.query,\n verified__eq: params.verified__eq,\n provider__eq: params.provider__eq,\n });\n return callCloudProxy<LLMModelPage>({\n backend: active.backend,\n method: \"GET\",\n path: `/api/v1/config/models/search${qs}`,\n });\n }\n\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [models, verifiedMap] = await Promise.all([\n llmClient.getModels(),\n verifiedFetch,\n ]);\n\n const provider = params.provider__eq ?? null;\n const verifiedNames = new Set(\n provider ? (verifiedMap?.[provider] ?? []) : [],\n );\n // The local agent-server has no model database, so it exposes no free /\n // default metadata; both are always false here. Cloud backends embed the\n // DB-driven flags natively on each item (handled above).\n const verifiedItems: LLMModel[] = [...verifiedNames].map((name) => ({\n provider,\n name,\n verified: true,\n free: false,\n default: false,\n }));\n\n const prefixedItems: LLMModel[] = provider\n ? (models ?? [])\n .filter((model) => model.startsWith(`${provider}/`))\n .map((model) => model.slice(provider.length + 1))\n .filter((name) => name.length > 0 && !verifiedNames.has(name))\n .map((name) => ({\n provider,\n name,\n verified: false,\n free: false,\n default: false,\n }))\n : [];\n\n const items = limitItems(\n filterByVerified(\n filterByQuery([...verifiedItems, ...prefixedItems], params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return { items, next_page_id: null };\n }\n\n /**\n * @param verifiedByProvider - Pre-fetched verified-models map used by the\n * local reconstruction path. Ignored for cloud backends, which call\n * `/api/v1/config/providers/search` directly (verified status is embedded in\n * each returned item).\n */\n static async searchProviders(\n params: SearchProvidersParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<ProviderPage> {\n const active = getActiveBackend();\n\n if (active.backend.kind === \"cloud\") {\n // Cloud exposes /api/v1/config/providers/search which returns ProviderPage directly.\n // verifiedByProvider is not needed — the cloud API embeds verified status natively.\n const qs = buildCloudQueryString({\n page_id: params.page_id,\n limit: params.limit,\n query: params.query,\n verified__eq: params.verified__eq,\n });\n return callCloudProxy<ProviderPage>({\n backend: active.backend,\n method: \"GET\",\n path: `/api/v1/config/providers/search${qs}`,\n });\n }\n\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [providers, verifiedMap] = await Promise.all([\n llmClient.getProviders(),\n verifiedFetch,\n ]);\n\n const verifiedProviders = new Set(Object.keys(verifiedMap ?? {}));\n const names = new Set<string>([...verifiedProviders, ...(providers ?? [])]);\n const providerItems: LLMProvider[] = [...names].map((name) => ({\n name,\n verified: verifiedProviders.has(name),\n }));\n\n const items = limitItems(\n filterByVerified(\n filterByQuery(providerItems, params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return { items, next_page_id: null };\n }\n}\n\nexport default ConfigService;\n"],"mappings":"kWAaA,SAAS,EACP,EACA,EACK,CACL,GAAI,CAAC,EACH,OAAO,EAGT,IAAM,EAAkB,EAAM,YAAY,EAC1C,OAAO,EAAM,OAAQ,GACnB,EAAK,KAAK,YAAY,EAAE,SAAS,CAAe,CAClD,CACF,CAEA,SAAS,EACP,EACA,EACK,CAKL,OAJI,IAAa,IAAA,GACR,EAGF,EAAM,OAAQ,GAAS,EAAK,WAAa,CAAQ,CAC1D,CAEA,SAAS,EAAc,EAAY,EAAqB,CAKtD,MAJI,CAAC,GAAS,GAAS,EACd,EAGF,EAAM,MAAM,EAAG,CAAK,CAC7B,CAEA,SAAS,EACP,EACQ,CACR,IAAM,EAAK,IAAI,gBACf,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,CAAM,EAC1C,IAAU,IAAA,IAAW,EAAG,IAAI,EAAK,OAAO,CAAK,CAAC,EAEpD,IAAM,EAAM,EAAG,SAAS,EACxB,OAAO,EAAM,IAAI,IAAQ,EAC3B,CAEA,IAAM,EAAN,KAAoB,CAOlB,aAAa,aACX,EAA6B,CAAC,EAC9B,EACuB,CACvB,IAAM,EAAS,EAAA,iBAAiB,EAEhC,GAAI,EAAO,QAAQ,OAAS,QAAS,CAGnC,IAAM,EAAK,EAAsB,CAC/B,QAAS,EAAO,QAChB,MAAO,EAAO,MACd,MAAO,EAAO,MACd,aAAc,EAAO,aACrB,aAAc,EAAO,YACvB,CAAC,EACD,OAAO,EAAA,eAA6B,CAClC,QAAS,EAAO,QAChB,OAAQ,MACR,KAAM,+BAA+B,GACvC,CAAC,CACH,CAEA,IAAM,EAAY,IAAI,EAAA,kBAAkB,EAAA,4BAA4B,CAAC,EAC/D,EACJ,IAAuB,IAAA,GAEnB,EAAU,kBAAkB,EAD5B,QAAQ,QAAQ,CAAkB,EAElC,CAAC,EAAQ,GAAe,MAAM,QAAQ,IAAI,CAC9C,EAAU,UAAU,EACpB,CACF,CAAC,EAEK,EAAW,EAAO,cAAgB,KAClC,EAAgB,IAAI,IACxB,EAAY,IAAc,IAAa,CAAC,EAAK,CAAC,CAChD,EAIM,EAA4B,CAAC,GAAG,CAAa,EAAE,IAAK,IAAU,CAClE,WACA,OACA,SAAU,GACV,KAAM,GACN,QAAS,EACX,EAAE,EAEI,EAA4B,GAC7B,GAAU,CAAC,GACT,OAAQ,GAAU,EAAM,WAAW,GAAG,EAAS,EAAE,CAAC,EAClD,IAAK,GAAU,EAAM,MAAM,EAAS,OAAS,CAAC,CAAC,EAC/C,OAAQ,GAAS,EAAK,OAAS,GAAK,CAAC,EAAc,IAAI,CAAI,CAAC,EAC5D,IAAK,IAAU,CACd,WACA,OACA,SAAU,GACV,KAAM,GACN,QAAS,EACX,EAAE,EACJ,CAAC,EAUL,MAAO,CAAE,MARK,EACZ,EACE,EAAc,CAAC,GAAG,EAAe,GAAG,CAAa,EAAG,EAAO,KAAK,EAChE,EAAO,YACT,EACA,EAAO,KAGA,EAAO,aAAc,IAAK,CACrC,CAQA,aAAa,gBACX,EAAgC,CAAC,EACjC,EACuB,CACvB,IAAM,EAAS,EAAA,iBAAiB,EAEhC,GAAI,EAAO,QAAQ,OAAS,QAAS,CAGnC,IAAM,EAAK,EAAsB,CAC/B,QAAS,EAAO,QAChB,MAAO,EAAO,MACd,MAAO,EAAO,MACd,aAAc,EAAO,YACvB,CAAC,EACD,OAAO,EAAA,eAA6B,CAClC,QAAS,EAAO,QAChB,OAAQ,MACR,KAAM,kCAAkC,GAC1C,CAAC,CACH,CAEA,IAAM,EAAY,IAAI,EAAA,kBAAkB,EAAA,4BAA4B,CAAC,EAC/D,EACJ,IAAuB,IAAA,GAEnB,EAAU,kBAAkB,EAD5B,QAAQ,QAAQ,CAAkB,EAElC,CAAC,EAAW,GAAe,MAAM,QAAQ,IAAI,CACjD,EAAU,aAAa,EACvB,CACF,CAAC,EAEK,EAAoB,IAAI,IAAI,OAAO,KAAK,GAAe,CAAC,CAAC,CAAC,EAehE,MAAO,CAAE,MARK,EACZ,EACE,EAPiC,CAAC,GAAG,IADvB,IAAY,CAAC,GAAG,EAAmB,GAAI,GAAa,CAAC,CAAE,CAChC,CAAK,EAAE,IAAK,IAAU,CAC7D,OACA,SAAU,EAAkB,IAAI,CAAI,CACtC,EAIkB,EAAe,EAAO,KAAK,EACzC,EAAO,YACT,EACA,EAAO,KAGA,EAAO,aAAc,IAAK,CACrC,CACF"}
|
|
@@ -41,11 +41,15 @@ var c = class {
|
|
|
41
41
|
let d = new e(n()), f = l === void 0 ? d.getVerifiedModels() : Promise.resolve(l), [p, m] = await Promise.all([d.getModels(), f]), h = c.provider__eq ?? null, g = new Set(h ? m?.[h] ?? [] : []), _ = [...g].map((e) => ({
|
|
42
42
|
provider: h,
|
|
43
43
|
name: e,
|
|
44
|
-
verified: !0
|
|
44
|
+
verified: !0,
|
|
45
|
+
free: !1,
|
|
46
|
+
default: !1
|
|
45
47
|
})), v = h ? (p ?? []).filter((e) => e.startsWith(`${h}/`)).map((e) => e.slice(h.length + 1)).filter((e) => e.length > 0 && !g.has(e)).map((e) => ({
|
|
46
48
|
provider: h,
|
|
47
49
|
name: e,
|
|
48
|
-
verified: !1
|
|
50
|
+
verified: !1,
|
|
51
|
+
free: !1,
|
|
52
|
+
default: !1
|
|
49
53
|
})) : [];
|
|
50
54
|
return {
|
|
51
55
|
items: o(a(i([..._, ...v], c.query), c.verified__eq), c.limit),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-service.api.js","names":[],"sources":["../../../src/api/config-service/config-service.api.ts"],"sourcesContent":["import { LLMMetadataClient } from \"@openhands/typescript-client/clients\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport type {\n LLMModel,\n LLMModelPage,\n LLMProvider,\n ProviderPage,\n SearchModelsParams,\n SearchProvidersParams,\n} from \"./config-service.types\";\n\nfunction filterByQuery<T extends { name: string }>(\n items: T[],\n query?: string,\n): T[] {\n if (!query) {\n return items;\n }\n\n const normalizedQuery = query.toLowerCase();\n return items.filter((item) =>\n item.name.toLowerCase().includes(normalizedQuery),\n );\n}\n\nfunction filterByVerified<T extends { verified: boolean }>(\n items: T[],\n verified?: boolean,\n): T[] {\n if (verified === undefined) {\n return items;\n }\n\n return items.filter((item) => item.verified === verified);\n}\n\nfunction limitItems<T>(items: T[], limit?: number): T[] {\n if (!limit || limit <= 0) {\n return items;\n }\n\n return items.slice(0, limit);\n}\n\nfunction buildCloudQueryString(\n params: Record<string, string | number | boolean | undefined>,\n): string {\n const qs = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) qs.set(key, String(value));\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\nclass ConfigService {\n /**\n * @param verifiedByProvider - Pre-fetched verified-models map used by the\n * local reconstruction path. Ignored for cloud backends, which call\n * `/api/v1/config/models/search` directly (verified status is embedded in\n * each returned item).\n */\n static async searchModels(\n params: SearchModelsParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<LLMModelPage> {\n const active = getActiveBackend();\n\n if (active.backend.kind === \"cloud\") {\n // Cloud exposes /api/v1/config/models/search which returns LLMModelPage directly.\n // verifiedByProvider is not needed — the cloud API embeds verified status natively.\n const qs = buildCloudQueryString({\n page_id: params.page_id,\n limit: params.limit,\n query: params.query,\n verified__eq: params.verified__eq,\n provider__eq: params.provider__eq,\n });\n return callCloudProxy<LLMModelPage>({\n backend: active.backend,\n method: \"GET\",\n path: `/api/v1/config/models/search${qs}`,\n });\n }\n\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [models, verifiedMap] = await Promise.all([\n llmClient.getModels(),\n verifiedFetch,\n ]);\n\n const provider = params.provider__eq ?? null;\n const verifiedNames = new Set(\n provider ? (verifiedMap?.[provider] ?? []) : [],\n );\n const verifiedItems: LLMModel[] = [...verifiedNames].map((name) => ({\n provider,\n name,\n verified: true,\n }));\n\n const prefixedItems: LLMModel[] = provider\n ? (models ?? [])\n .filter((model) => model.startsWith(`${provider}/`))\n .map((model) => model.slice(provider.length + 1))\n .filter((name) => name.length > 0 && !verifiedNames.has(name))\n .map((name) => ({\n provider,\n name,\n verified: false,\n }))\n : [];\n\n const items = limitItems(\n filterByVerified(\n filterByQuery([...verifiedItems, ...prefixedItems], params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return { items, next_page_id: null };\n }\n\n /**\n * @param verifiedByProvider - Pre-fetched verified-models map used by the\n * local reconstruction path. Ignored for cloud backends, which call\n * `/api/v1/config/providers/search` directly (verified status is embedded in\n * each returned item).\n */\n static async searchProviders(\n params: SearchProvidersParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<ProviderPage> {\n const active = getActiveBackend();\n\n if (active.backend.kind === \"cloud\") {\n // Cloud exposes /api/v1/config/providers/search which returns ProviderPage directly.\n // verifiedByProvider is not needed — the cloud API embeds verified status natively.\n const qs = buildCloudQueryString({\n page_id: params.page_id,\n limit: params.limit,\n query: params.query,\n verified__eq: params.verified__eq,\n });\n return callCloudProxy<ProviderPage>({\n backend: active.backend,\n method: \"GET\",\n path: `/api/v1/config/providers/search${qs}`,\n });\n }\n\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [providers, verifiedMap] = await Promise.all([\n llmClient.getProviders(),\n verifiedFetch,\n ]);\n\n const verifiedProviders = new Set(Object.keys(verifiedMap ?? {}));\n const names = new Set<string>([...verifiedProviders, ...(providers ?? [])]);\n const providerItems: LLMProvider[] = [...names].map((name) => ({\n name,\n verified: verifiedProviders.has(name),\n }));\n\n const items = limitItems(\n filterByVerified(\n filterByQuery(providerItems, params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return { items, next_page_id: null };\n }\n}\n\nexport default ConfigService;\n"],"mappings":";;;;;;AAaA,SAAS,EACP,GACA,GACK;CACL,IAAI,CAAC,GACH,OAAO;CAGT,IAAM,IAAkB,EAAM,YAAY;CAC1C,OAAO,EAAM,QAAQ,MACnB,EAAK,KAAK,YAAY,EAAE,SAAS,CAAe,CAClD;AACF;AAEA,SAAS,EACP,GACA,GACK;CAKL,OAJI,MAAa,KAAA,IACR,IAGF,EAAM,QAAQ,MAAS,EAAK,aAAa,CAAQ;AAC1D;AAEA,SAAS,EAAc,GAAY,GAAqB;CAKtD,OAJI,CAAC,KAAS,KAAS,IACd,IAGF,EAAM,MAAM,GAAG,CAAK;AAC7B;AAEA,SAAS,EACP,GACQ;CACR,IAAM,IAAK,IAAI,gBAAgB;CAC/B,KAAK,IAAM,CAAC,GAAK,MAAU,OAAO,QAAQ,CAAM,GAC9C,AAAI,MAAU,KAAA,KAAW,EAAG,IAAI,GAAK,OAAO,CAAK,CAAC;CAEpD,IAAM,IAAM,EAAG,SAAS;CACxB,OAAO,IAAM,IAAI,MAAQ;AAC3B;AAEA,IAAM,IAAN,MAAoB;CAOlB,aAAa,aACX,IAA6B,CAAC,GAC9B,GACuB;EACvB,IAAM,IAAS,EAAiB;EAEhC,IAAI,EAAO,QAAQ,SAAS,SAAS;GAGnC,IAAM,IAAK,EAAsB;IAC/B,SAAS,EAAO;IAChB,OAAO,EAAO;IACd,OAAO,EAAO;IACd,cAAc,EAAO;IACrB,cAAc,EAAO;GACvB,CAAC;GACD,OAAO,EAA6B;IAClC,SAAS,EAAO;IAChB,QAAQ;IACR,MAAM,+BAA+B;GACvC,CAAC;EACH;EAEA,IAAM,IAAY,IAAI,EAAkB,EAA4B,CAAC,GAC/D,IACJ,MAAuB,KAAA,IAEnB,EAAU,kBAAkB,IAD5B,QAAQ,QAAQ,CAAkB,GAElC,CAAC,GAAQ,KAAe,MAAM,QAAQ,IAAI,CAC9C,EAAU,UAAU,GACpB,CACF,CAAC,GAEK,IAAW,EAAO,gBAAgB,MAClC,IAAgB,IAAI,IACxB,IAAY,IAAc,MAAa,CAAC,IAAK,CAAC,CAChD,
|
|
1
|
+
{"version":3,"file":"config-service.api.js","names":[],"sources":["../../../src/api/config-service/config-service.api.ts"],"sourcesContent":["import { LLMMetadataClient } from \"@openhands/typescript-client/clients\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport type {\n LLMModel,\n LLMModelPage,\n LLMProvider,\n ProviderPage,\n SearchModelsParams,\n SearchProvidersParams,\n} from \"./config-service.types\";\n\nfunction filterByQuery<T extends { name: string }>(\n items: T[],\n query?: string,\n): T[] {\n if (!query) {\n return items;\n }\n\n const normalizedQuery = query.toLowerCase();\n return items.filter((item) =>\n item.name.toLowerCase().includes(normalizedQuery),\n );\n}\n\nfunction filterByVerified<T extends { verified: boolean }>(\n items: T[],\n verified?: boolean,\n): T[] {\n if (verified === undefined) {\n return items;\n }\n\n return items.filter((item) => item.verified === verified);\n}\n\nfunction limitItems<T>(items: T[], limit?: number): T[] {\n if (!limit || limit <= 0) {\n return items;\n }\n\n return items.slice(0, limit);\n}\n\nfunction buildCloudQueryString(\n params: Record<string, string | number | boolean | undefined>,\n): string {\n const qs = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) qs.set(key, String(value));\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\nclass ConfigService {\n /**\n * @param verifiedByProvider - Pre-fetched verified-models map used by the\n * local reconstruction path. Ignored for cloud backends, which call\n * `/api/v1/config/models/search` directly (verified status is embedded in\n * each returned item).\n */\n static async searchModels(\n params: SearchModelsParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<LLMModelPage> {\n const active = getActiveBackend();\n\n if (active.backend.kind === \"cloud\") {\n // Cloud exposes /api/v1/config/models/search which returns LLMModelPage directly.\n // verifiedByProvider is not needed — the cloud API embeds verified status natively.\n const qs = buildCloudQueryString({\n page_id: params.page_id,\n limit: params.limit,\n query: params.query,\n verified__eq: params.verified__eq,\n provider__eq: params.provider__eq,\n });\n return callCloudProxy<LLMModelPage>({\n backend: active.backend,\n method: \"GET\",\n path: `/api/v1/config/models/search${qs}`,\n });\n }\n\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [models, verifiedMap] = await Promise.all([\n llmClient.getModels(),\n verifiedFetch,\n ]);\n\n const provider = params.provider__eq ?? null;\n const verifiedNames = new Set(\n provider ? (verifiedMap?.[provider] ?? []) : [],\n );\n // The local agent-server has no model database, so it exposes no free /\n // default metadata; both are always false here. Cloud backends embed the\n // DB-driven flags natively on each item (handled above).\n const verifiedItems: LLMModel[] = [...verifiedNames].map((name) => ({\n provider,\n name,\n verified: true,\n free: false,\n default: false,\n }));\n\n const prefixedItems: LLMModel[] = provider\n ? (models ?? [])\n .filter((model) => model.startsWith(`${provider}/`))\n .map((model) => model.slice(provider.length + 1))\n .filter((name) => name.length > 0 && !verifiedNames.has(name))\n .map((name) => ({\n provider,\n name,\n verified: false,\n free: false,\n default: false,\n }))\n : [];\n\n const items = limitItems(\n filterByVerified(\n filterByQuery([...verifiedItems, ...prefixedItems], params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return { items, next_page_id: null };\n }\n\n /**\n * @param verifiedByProvider - Pre-fetched verified-models map used by the\n * local reconstruction path. Ignored for cloud backends, which call\n * `/api/v1/config/providers/search` directly (verified status is embedded in\n * each returned item).\n */\n static async searchProviders(\n params: SearchProvidersParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<ProviderPage> {\n const active = getActiveBackend();\n\n if (active.backend.kind === \"cloud\") {\n // Cloud exposes /api/v1/config/providers/search which returns ProviderPage directly.\n // verifiedByProvider is not needed — the cloud API embeds verified status natively.\n const qs = buildCloudQueryString({\n page_id: params.page_id,\n limit: params.limit,\n query: params.query,\n verified__eq: params.verified__eq,\n });\n return callCloudProxy<ProviderPage>({\n backend: active.backend,\n method: \"GET\",\n path: `/api/v1/config/providers/search${qs}`,\n });\n }\n\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [providers, verifiedMap] = await Promise.all([\n llmClient.getProviders(),\n verifiedFetch,\n ]);\n\n const verifiedProviders = new Set(Object.keys(verifiedMap ?? {}));\n const names = new Set<string>([...verifiedProviders, ...(providers ?? [])]);\n const providerItems: LLMProvider[] = [...names].map((name) => ({\n name,\n verified: verifiedProviders.has(name),\n }));\n\n const items = limitItems(\n filterByVerified(\n filterByQuery(providerItems, params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return { items, next_page_id: null };\n }\n}\n\nexport default ConfigService;\n"],"mappings":";;;;;;AAaA,SAAS,EACP,GACA,GACK;CACL,IAAI,CAAC,GACH,OAAO;CAGT,IAAM,IAAkB,EAAM,YAAY;CAC1C,OAAO,EAAM,QAAQ,MACnB,EAAK,KAAK,YAAY,EAAE,SAAS,CAAe,CAClD;AACF;AAEA,SAAS,EACP,GACA,GACK;CAKL,OAJI,MAAa,KAAA,IACR,IAGF,EAAM,QAAQ,MAAS,EAAK,aAAa,CAAQ;AAC1D;AAEA,SAAS,EAAc,GAAY,GAAqB;CAKtD,OAJI,CAAC,KAAS,KAAS,IACd,IAGF,EAAM,MAAM,GAAG,CAAK;AAC7B;AAEA,SAAS,EACP,GACQ;CACR,IAAM,IAAK,IAAI,gBAAgB;CAC/B,KAAK,IAAM,CAAC,GAAK,MAAU,OAAO,QAAQ,CAAM,GAC9C,AAAI,MAAU,KAAA,KAAW,EAAG,IAAI,GAAK,OAAO,CAAK,CAAC;CAEpD,IAAM,IAAM,EAAG,SAAS;CACxB,OAAO,IAAM,IAAI,MAAQ;AAC3B;AAEA,IAAM,IAAN,MAAoB;CAOlB,aAAa,aACX,IAA6B,CAAC,GAC9B,GACuB;EACvB,IAAM,IAAS,EAAiB;EAEhC,IAAI,EAAO,QAAQ,SAAS,SAAS;GAGnC,IAAM,IAAK,EAAsB;IAC/B,SAAS,EAAO;IAChB,OAAO,EAAO;IACd,OAAO,EAAO;IACd,cAAc,EAAO;IACrB,cAAc,EAAO;GACvB,CAAC;GACD,OAAO,EAA6B;IAClC,SAAS,EAAO;IAChB,QAAQ;IACR,MAAM,+BAA+B;GACvC,CAAC;EACH;EAEA,IAAM,IAAY,IAAI,EAAkB,EAA4B,CAAC,GAC/D,IACJ,MAAuB,KAAA,IAEnB,EAAU,kBAAkB,IAD5B,QAAQ,QAAQ,CAAkB,GAElC,CAAC,GAAQ,KAAe,MAAM,QAAQ,IAAI,CAC9C,EAAU,UAAU,GACpB,CACF,CAAC,GAEK,IAAW,EAAO,gBAAgB,MAClC,IAAgB,IAAI,IACxB,IAAY,IAAc,MAAa,CAAC,IAAK,CAAC,CAChD,GAIM,IAA4B,CAAC,GAAG,CAAa,EAAE,KAAK,OAAU;GAClE;GACA;GACA,UAAU;GACV,MAAM;GACN,SAAS;EACX,EAAE,GAEI,IAA4B,KAC7B,KAAU,CAAC,GACT,QAAQ,MAAU,EAAM,WAAW,GAAG,EAAS,EAAE,CAAC,EAClD,KAAK,MAAU,EAAM,MAAM,EAAS,SAAS,CAAC,CAAC,EAC/C,QAAQ,MAAS,EAAK,SAAS,KAAK,CAAC,EAAc,IAAI,CAAI,CAAC,EAC5D,KAAK,OAAU;GACd;GACA;GACA,UAAU;GACV,MAAM;GACN,SAAS;EACX,EAAE,IACJ,CAAC;EAUL,OAAO;GAAE,OARK,EACZ,EACE,EAAc,CAAC,GAAG,GAAe,GAAG,CAAa,GAAG,EAAO,KAAK,GAChE,EAAO,YACT,GACA,EAAO,KAGA;GAAO,cAAc;EAAK;CACrC;CAQA,aAAa,gBACX,IAAgC,CAAC,GACjC,GACuB;EACvB,IAAM,IAAS,EAAiB;EAEhC,IAAI,EAAO,QAAQ,SAAS,SAAS;GAGnC,IAAM,IAAK,EAAsB;IAC/B,SAAS,EAAO;IAChB,OAAO,EAAO;IACd,OAAO,EAAO;IACd,cAAc,EAAO;GACvB,CAAC;GACD,OAAO,EAA6B;IAClC,SAAS,EAAO;IAChB,QAAQ;IACR,MAAM,kCAAkC;GAC1C,CAAC;EACH;EAEA,IAAM,IAAY,IAAI,EAAkB,EAA4B,CAAC,GAC/D,IACJ,MAAuB,KAAA,IAEnB,EAAU,kBAAkB,IAD5B,QAAQ,QAAQ,CAAkB,GAElC,CAAC,GAAW,KAAe,MAAM,QAAQ,IAAI,CACjD,EAAU,aAAa,GACvB,CACF,CAAC,GAEK,IAAoB,IAAI,IAAI,OAAO,KAAK,KAAe,CAAC,CAAC,CAAC;EAehE,OAAO;GAAE,OARK,EACZ,EACE,EAPiC,CAAC,GAAG,IADvB,IAAY,CAAC,GAAG,GAAmB,GAAI,KAAa,CAAC,CAAE,CAChC,CAAK,EAAE,KAAK,OAAU;IAC7D;IACA,UAAU,EAAkB,IAAI,CAAI;GACtC,EAIkB,GAAe,EAAO,KAAK,GACzC,EAAO,YACT,GACA,EAAO,KAGA;GAAO,cAAc;EAAK;CACrC;AACF"}
|
|
@@ -3,6 +3,19 @@ export interface LLMModel {
|
|
|
3
3
|
provider: string | null;
|
|
4
4
|
name: string;
|
|
5
5
|
verified: boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Whether the model is free to use on the OpenHands provider. Mirrors
|
|
8
|
+
* `verified`: it is populated by the backend model list (DB-driven on
|
|
9
|
+
* cloud) and defaults to `false` where no free metadata exists (e.g. the
|
|
10
|
+
* local agent-server reconstruction path, which has no model database).
|
|
11
|
+
*/
|
|
12
|
+
free: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Whether this is the provider's default model. Mirrors `free`: DB-driven on
|
|
15
|
+
* cloud, `false` where no default metadata exists. Used to preselect the
|
|
16
|
+
* model on onboarding and when creating a new model for the provider.
|
|
17
|
+
*/
|
|
18
|
+
default: boolean;
|
|
6
19
|
}
|
|
7
20
|
export interface LLMModelPage {
|
|
8
21
|
items: LLMModel[];
|
package/dist/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
require("../../../../_virtual/_rolldown/runtime.cjs");
|
|
1
|
+
require("../../../../_virtual/_rolldown/runtime.cjs");function e(e){return e.filter(e=>e.type===`text`).map(e=>e.text).join(``)}var t=e=>Array.from(e.matchAll(/<EXTRA_INFO>([\s\S]*?)<\/EXTRA_INFO>/gi),e=>e[1].trim()).filter(Boolean),n=(e,t)=>{let n=`\n\n- **${e}**`;return t&&(n+=`\n\n${t}`),n},r=(e,t)=>{let r=`
|
|
2
2
|
|
|
3
|
-
**Triggered Skill Knowledge:**`;return e.forEach((e,i)=>{let a=
|
|
3
|
+
**Triggered Skill Knowledge:**`;return e.forEach((e,i)=>{let a=t[i];r+=n(e,a)}),r},i=e=>{let t=`
|
|
4
4
|
|
|
5
|
-
**Extended Content:**`;return e.forEach(e=>{
|
|
5
|
+
**Extended Content:**`;return e.forEach(e=>{t+=`\n\n${e}`}),t},a=n=>n?t(e(n)):[],o=(e,t)=>{let n=a(t);return e&&e.length>0?r(e,n):n.length>0?i(n):``},s=(e,t)=>{let n=a(t);return e&&e.length>0?e.map((e,t)=>({name:e,content:n[t]??``})):n.map((e,t)=>({name:`Extended Content ${t+1}`,content:e}))};exports.getSkillReadyContent=o,exports.getSkillReadyItems=s;
|
|
6
6
|
//# sourceMappingURL=get-skill-ready-content.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-skill-ready-content.cjs","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.ts"],"sourcesContent":["import { TextContent } from \"#/types/agent-server/core/base/common\";\n\n/**\n * Represents a single activated skill with its name and associated content.\n */\nexport interface SkillReadyItem {\n name: string;\n content: string;\n}\n\n/**\n * Extracts all text content from an array of TextContent items.\n */\
|
|
1
|
+
{"version":3,"file":"get-skill-ready-content.cjs","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.ts"],"sourcesContent":["import { TextContent } from \"#/types/agent-server/core/base/common\";\n\n/**\n * Represents a single activated skill with its name and associated content.\n */\nexport interface SkillReadyItem {\n name: string;\n content: string;\n}\n\n/**\n * Extracts all text content from an array of TextContent items.\n */\nfunction extractAllText(extendedContent: TextContent[]): string {\n return extendedContent\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\");\n}\n\n/**\n * Extracts all <EXTRA_INFO> blocks from the given text.\n * Returns an array of content strings (without the wrapper tags).\n */\nconst extractExtraInfoBlocks = (text: string): string[] => {\n const blockRegex = /<EXTRA_INFO>([\\s\\S]*?)<\\/EXTRA_INFO>/gi;\n return Array.from(text.matchAll(blockRegex), (match) =>\n match[1].trim(),\n ).filter(Boolean);\n};\n\n/**\n * Formats a single skill with its corresponding content block.\n */\nconst formatSkillWithContent = (\n skill: string,\n contentBlock: string | undefined,\n): string => {\n let formatted = `\\n\\n- **${skill}**`;\n\n if (contentBlock) {\n formatted += `\\n\\n${contentBlock}`;\n }\n\n return formatted;\n};\n\n/**\n * Formats skills paired with their corresponding extended content blocks.\n */\nconst formatSkillKnowledge = (\n activatedSkills: string[],\n extraInfoBlocks: string[],\n): string => {\n let content = `\\n\\n**Triggered Skill Knowledge:**`;\n\n activatedSkills.forEach((skill, index) => {\n const contentBlock = extraInfoBlocks[index];\n content += formatSkillWithContent(skill, contentBlock);\n });\n\n return content;\n};\n\n/**\n * Formats extended content blocks when no skills are present.\n */\nconst formatExtendedContentOnly = (extraInfoBlocks: string[]): string => {\n let content = `\\n\\n**Extended Content:**`;\n\n extraInfoBlocks.forEach((block) => {\n content += `\\n\\n${block}`;\n });\n\n return content;\n};\n\n/**\n * Extracts EXTRA_INFO blocks from extended content.\n */\nconst getExtraInfoBlocks = (extendedContent?: TextContent[]): string[] => {\n if (!extendedContent) return [];\n return extractExtraInfoBlocks(extractAllText(extendedContent));\n};\n\n/**\n * Formats activated skills and extended content into markdown for display.\n * Each skill is paired with its corresponding <EXTRA_INFO> block by index.\n */\nexport const getSkillReadyContent = (\n activatedSkills: string[],\n extendedContent: TextContent[],\n): string => {\n const extraInfoBlocks = getExtraInfoBlocks(extendedContent);\n\n if (activatedSkills && activatedSkills.length > 0) {\n return formatSkillKnowledge(activatedSkills, extraInfoBlocks);\n }\n\n if (extraInfoBlocks.length > 0) {\n return formatExtendedContentOnly(extraInfoBlocks);\n }\n\n return \"\";\n};\n\n/**\n * Returns structured skill items with their names and associated content.\n * Each skill is paired with its corresponding <EXTRA_INFO> block by index.\n */\nexport const getSkillReadyItems = (\n activatedSkills: string[],\n extendedContent: TextContent[],\n): SkillReadyItem[] => {\n const extraInfoBlocks = getExtraInfoBlocks(extendedContent);\n\n if (activatedSkills && activatedSkills.length > 0) {\n return activatedSkills.map((skill, index) => ({\n name: skill,\n content: extraInfoBlocks[index] ?? \"\",\n }));\n }\n\n return extraInfoBlocks.map((block, index) => ({\n name: `Extended Content ${index + 1}`,\n content: block,\n }));\n};\n"],"mappings":"sDAaA,SAAS,EAAe,EAAwC,CAC9D,OAAO,EACJ,OAAQ,GAAM,EAAE,OAAS,MAAM,EAC/B,IAAK,GAAM,EAAE,IAAI,EACjB,KAAK,EAAE,CACZ,CAMA,IAAM,EAA0B,GAEvB,MAAM,KAAK,EAAK,SAAS,wCAAU,EAAI,GAC5C,EAAM,GAAG,KAAK,CAChB,EAAE,OAAO,OAAO,EAMZ,GACJ,EACA,IACW,CACX,IAAI,EAAY,WAAW,EAAM,IAMjC,OAJI,IACF,GAAa,OAAO,KAGf,CACT,EAKM,GACJ,EACA,IACW,CACX,IAAI,EAAU;;gCAOd,OALA,EAAgB,SAAS,EAAO,IAAU,CACxC,IAAM,EAAe,EAAgB,GACrC,GAAW,EAAuB,EAAO,CAAY,CACvD,CAAC,EAEM,CACT,EAKM,EAA6B,GAAsC,CACvE,IAAI,EAAU;;uBAMd,OAJA,EAAgB,QAAS,GAAU,CACjC,GAAW,OAAO,GACpB,CAAC,EAEM,CACT,EAKM,EAAsB,GACrB,EACE,EAAuB,EAAe,CAAe,CAAC,EADhC,CAAC,EAQnB,GACX,EACA,IACW,CACX,IAAM,EAAkB,EAAmB,CAAe,EAU1D,OARI,GAAmB,EAAgB,OAAS,EACvC,EAAqB,EAAiB,CAAe,EAG1D,EAAgB,OAAS,EACpB,EAA0B,CAAe,EAG3C,EACT,EAMa,GACX,EACA,IACqB,CACrB,IAAM,EAAkB,EAAmB,CAAe,EAS1D,OAPI,GAAmB,EAAgB,OAAS,EACvC,EAAgB,KAAK,EAAO,KAAW,CAC5C,KAAM,EACN,QAAS,EAAgB,IAAU,EACrC,EAAE,EAGG,EAAgB,KAAK,EAAO,KAAW,CAC5C,KAAM,oBAAoB,EAAQ,IAClC,QAAS,CACX,EAAE,CACJ"}
|
package/dist/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.js
CHANGED
|
@@ -1,37 +1,33 @@
|
|
|
1
1
|
//#region src/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.ts
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
i.length > 0 && t.push(i), r = n.exec(e);
|
|
7
|
-
}
|
|
8
|
-
return t;
|
|
9
|
-
}, n = (e, t) => {
|
|
2
|
+
function e(e) {
|
|
3
|
+
return e.filter((e) => e.type === "text").map((e) => e.text).join("");
|
|
4
|
+
}
|
|
5
|
+
var t = (e) => Array.from(e.matchAll(/<EXTRA_INFO>([\s\S]*?)<\/EXTRA_INFO>/gi), (e) => e[1].trim()).filter(Boolean), n = (e, t) => {
|
|
10
6
|
let n = `\n\n- **${e}**`;
|
|
11
|
-
return t &&
|
|
7
|
+
return t && (n += `\n\n${t}`), n;
|
|
12
8
|
}, r = (e, t) => {
|
|
13
9
|
let r = "\n\n**Triggered Skill Knowledge:**";
|
|
14
10
|
return e.forEach((e, i) => {
|
|
15
|
-
let a =
|
|
11
|
+
let a = t[i];
|
|
16
12
|
r += n(e, a);
|
|
17
13
|
}), r;
|
|
18
14
|
}, i = (e) => {
|
|
19
15
|
let t = "\n\n**Extended Content:**";
|
|
20
16
|
return e.forEach((e) => {
|
|
21
|
-
|
|
17
|
+
t += `\n\n${e}`;
|
|
22
18
|
}), t;
|
|
23
|
-
}, a = (n) =>
|
|
19
|
+
}, a = (n) => n ? t(e(n)) : [], o = (e, t) => {
|
|
24
20
|
let n = a(t);
|
|
25
21
|
return e && e.length > 0 ? r(e, n) : n.length > 0 ? i(n) : "";
|
|
26
22
|
}, s = (e, t) => {
|
|
27
23
|
let n = a(t);
|
|
28
24
|
return e && e.length > 0 ? e.map((e, t) => ({
|
|
29
25
|
name: e,
|
|
30
|
-
content:
|
|
31
|
-
})) : n.
|
|
26
|
+
content: n[t] ?? ""
|
|
27
|
+
})) : n.map((e, t) => ({
|
|
32
28
|
name: `Extended Content ${t + 1}`,
|
|
33
|
-
content: e
|
|
34
|
-
}))
|
|
29
|
+
content: e
|
|
30
|
+
}));
|
|
35
31
|
};
|
|
36
32
|
//#endregion
|
|
37
33
|
export { o as getSkillReadyContent, s as getSkillReadyItems };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-skill-ready-content.js","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.ts"],"sourcesContent":["import { TextContent } from \"#/types/agent-server/core/base/common\";\n\n/**\n * Represents a single activated skill with its name and associated content.\n */\nexport interface SkillReadyItem {\n name: string;\n content: string;\n}\n\n/**\n * Extracts all text content from an array of TextContent items.\n */\
|
|
1
|
+
{"version":3,"file":"get-skill-ready-content.js","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.ts"],"sourcesContent":["import { TextContent } from \"#/types/agent-server/core/base/common\";\n\n/**\n * Represents a single activated skill with its name and associated content.\n */\nexport interface SkillReadyItem {\n name: string;\n content: string;\n}\n\n/**\n * Extracts all text content from an array of TextContent items.\n */\nfunction extractAllText(extendedContent: TextContent[]): string {\n return extendedContent\n .filter((c) => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\");\n}\n\n/**\n * Extracts all <EXTRA_INFO> blocks from the given text.\n * Returns an array of content strings (without the wrapper tags).\n */\nconst extractExtraInfoBlocks = (text: string): string[] => {\n const blockRegex = /<EXTRA_INFO>([\\s\\S]*?)<\\/EXTRA_INFO>/gi;\n return Array.from(text.matchAll(blockRegex), (match) =>\n match[1].trim(),\n ).filter(Boolean);\n};\n\n/**\n * Formats a single skill with its corresponding content block.\n */\nconst formatSkillWithContent = (\n skill: string,\n contentBlock: string | undefined,\n): string => {\n let formatted = `\\n\\n- **${skill}**`;\n\n if (contentBlock) {\n formatted += `\\n\\n${contentBlock}`;\n }\n\n return formatted;\n};\n\n/**\n * Formats skills paired with their corresponding extended content blocks.\n */\nconst formatSkillKnowledge = (\n activatedSkills: string[],\n extraInfoBlocks: string[],\n): string => {\n let content = `\\n\\n**Triggered Skill Knowledge:**`;\n\n activatedSkills.forEach((skill, index) => {\n const contentBlock = extraInfoBlocks[index];\n content += formatSkillWithContent(skill, contentBlock);\n });\n\n return content;\n};\n\n/**\n * Formats extended content blocks when no skills are present.\n */\nconst formatExtendedContentOnly = (extraInfoBlocks: string[]): string => {\n let content = `\\n\\n**Extended Content:**`;\n\n extraInfoBlocks.forEach((block) => {\n content += `\\n\\n${block}`;\n });\n\n return content;\n};\n\n/**\n * Extracts EXTRA_INFO blocks from extended content.\n */\nconst getExtraInfoBlocks = (extendedContent?: TextContent[]): string[] => {\n if (!extendedContent) return [];\n return extractExtraInfoBlocks(extractAllText(extendedContent));\n};\n\n/**\n * Formats activated skills and extended content into markdown for display.\n * Each skill is paired with its corresponding <EXTRA_INFO> block by index.\n */\nexport const getSkillReadyContent = (\n activatedSkills: string[],\n extendedContent: TextContent[],\n): string => {\n const extraInfoBlocks = getExtraInfoBlocks(extendedContent);\n\n if (activatedSkills && activatedSkills.length > 0) {\n return formatSkillKnowledge(activatedSkills, extraInfoBlocks);\n }\n\n if (extraInfoBlocks.length > 0) {\n return formatExtendedContentOnly(extraInfoBlocks);\n }\n\n return \"\";\n};\n\n/**\n * Returns structured skill items with their names and associated content.\n * Each skill is paired with its corresponding <EXTRA_INFO> block by index.\n */\nexport const getSkillReadyItems = (\n activatedSkills: string[],\n extendedContent: TextContent[],\n): SkillReadyItem[] => {\n const extraInfoBlocks = getExtraInfoBlocks(extendedContent);\n\n if (activatedSkills && activatedSkills.length > 0) {\n return activatedSkills.map((skill, index) => ({\n name: skill,\n content: extraInfoBlocks[index] ?? \"\",\n }));\n }\n\n return extraInfoBlocks.map((block, index) => ({\n name: `Extended Content ${index + 1}`,\n content: block,\n }));\n};\n"],"mappings":";AAaA,SAAS,EAAe,GAAwC;CAC9D,OAAO,EACJ,QAAQ,MAAM,EAAE,SAAS,MAAM,EAC/B,KAAK,MAAM,EAAE,IAAI,EACjB,KAAK,EAAE;AACZ;AAMA,IAAM,KAA0B,MAEvB,MAAM,KAAK,EAAK,SAAS,wCAAU,IAAI,MAC5C,EAAM,GAAG,KAAK,CAChB,EAAE,OAAO,OAAO,GAMZ,KACJ,GACA,MACW;CACX,IAAI,IAAY,WAAW,EAAM;CAMjC,OAJI,MACF,KAAa,OAAO,MAGf;AACT,GAKM,KACJ,GACA,MACW;CACX,IAAI,IAAU;CAOd,OALA,EAAgB,SAAS,GAAO,MAAU;EACxC,IAAM,IAAe,EAAgB;EACrC,KAAW,EAAuB,GAAO,CAAY;CACvD,CAAC,GAEM;AACT,GAKM,KAA6B,MAAsC;CACvE,IAAI,IAAU;CAMd,OAJA,EAAgB,SAAS,MAAU;EACjC,KAAW,OAAO;CACpB,CAAC,GAEM;AACT,GAKM,KAAsB,MACrB,IACE,EAAuB,EAAe,CAAe,CAAC,IADhC,CAAC,GAQnB,KACX,GACA,MACW;CACX,IAAM,IAAkB,EAAmB,CAAe;CAU1D,OARI,KAAmB,EAAgB,SAAS,IACvC,EAAqB,GAAiB,CAAe,IAG1D,EAAgB,SAAS,IACpB,EAA0B,CAAe,IAG3C;AACT,GAMa,KACX,GACA,MACqB;CACrB,IAAM,IAAkB,EAAmB,CAAe;CAS1D,OAPI,KAAmB,EAAgB,SAAS,IACvC,EAAgB,KAAK,GAAO,OAAW;EAC5C,MAAM;EACN,SAAS,EAAgB,MAAU;CACrC,EAAE,IAGG,EAAgB,KAAK,GAAO,OAAW;EAC5C,MAAM,oBAAoB,IAAQ;EAClC,SAAS;CACX,EAAE;AACJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../i18n/declaration.cjs"),n=require("../../../utils/utils.cjs"),r=require("../../../context/navigation-context.cjs"),i=require("../../../utils/automation-catalog.cjs"),a=require("../../../node_modules/@heroui/tooltip/dist/chunk-AUA5GDXN.cjs"),o=require("../../shared/buttons/styled-tooltip.cjs"),s=require("../../../utils/extension-module-card-classes.cjs"),c=require("../../../utils/automation-run-display.cjs"),
|
|
1
|
+
require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),t=require("../../../i18n/declaration.cjs"),n=require("../../../utils/utils.cjs"),r=require("../../../context/navigation-context.cjs"),i=require("../../../utils/automation-catalog.cjs"),a=require("../../../node_modules/@heroui/tooltip/dist/chunk-AUA5GDXN.cjs"),o=require("../../shared/buttons/styled-tooltip.cjs"),s=require("../../../utils/extension-module-card-classes.cjs"),c=require("../../../utils/automation-run-display.cjs"),ee=require("./automation-action-button-classes.cjs"),l=require("./kebab-menu.cjs"),u=require("../../../hooks/use-automation-permissions.cjs"),d=require("../../../icons/play.cjs"),f=require("../skills/skill-card-pill-row.cjs"),p=require("../../../utils/format-relative-time.cjs"),m=require("../home/featured-automations/automation-run-health.cjs"),h=require("./build-automation-pills.cjs"),g=require("./build-automation-menu-items.cjs"),_=require("./automation-run-insights.cjs"),v=require("./automation-view-mode.cjs"),y=require("./to-latest-run-state.cjs"),b=require("./detail/run-phase.cjs"),x=require("./detail/run-status-badge.cjs"),S=require("../home/featured-automations/automation-run-activity-sparkline.cjs");let C=require("react"),w=require("react/jsx-runtime");function T({automation:T,onToggle:E,onRunNow:D,isRunPending:O=!1,onDelete:k,onExport:A,onEdit:j,insights:M}){let{navigate:N}=r.useNavigation(),{t:P,i18n:F}=e.useTranslation(`openhands`),{canManage:I}=u.useAutomationPermissions(),L=u.useIsAutomationOwner(T),R=I||L,z=T.enabled?R:L,B=T.trigger.schedule_human||T.trigger.type,V=(0,C.useMemo)(()=>h.buildAutomationMetadataPills(T,B),[T,B]),H=()=>{N?.(`/automations/${T.id}`)},U=g.buildAutomationMenuItems({automation:T,t:P,canManage:R,canToggle:z,onRunNow:D,isRunPending:O,onView:H,onExport:A,onEdit:j,onToggle:E,onDelete:k}),W=y.toLatestRunState(M?.state),G=i.resolveAutomationImpactStatement(T,M?.state?.summary?.completedTotal??null),{latestRun:K,recentRuns:q,isLoading:J,isError:Y}=W,X=K?m.getLastRunTimestamp(K):null,Z=K?c.getAutomationRunDisplay(K):null,Q=Z?.summary??null,$=Q?m.shortenAutomationRunSummary(Q):null,te=Q!=null&&$!=null&&m.shouldShowAutomationRunSummaryHovercard(Q,$),ne=b.shouldShowRunPhase(K?.status);return(0,w.jsxs)(`div`,{role:`link`,tabIndex:0,"data-testid":`automation-card-${T.id}`,onClick:H,onKeyDown:e=>{e.key===`Enter`&&H()},className:n.cn(`group relative flex min-w-0 flex-col overflow-hidden p-4 text-left`,s.extensionModuleCardSurfaceClassName,s.extensionModuleCardInteractiveClassName),children:[(0,w.jsxs)(`header`,{className:`flex flex-col gap-1.5`,children:[(0,w.jsxs)(`div`,{className:`flex h-8 items-center justify-between gap-3`,children:[(0,w.jsx)(`h3`,{className:`min-w-0 flex-1 truncate text-sm font-semibold leading-none text-[var(--oh-foreground)]`,children:T.name}),(0,w.jsxs)(`div`,{className:`flex shrink-0 items-center gap-0.5`,children:[R?(0,w.jsx)(o.StyledTooltip,{content:P(t.I18nKey.AUTOMATIONS$RUN_NOW),placement:`top`,children:(0,w.jsx)(`button`,{type:`button`,"data-testid":`automation-run-now-${T.id}`,"aria-label":P(t.I18nKey.AUTOMATIONS$RUN_NOW),"aria-busy":O,disabled:O||!T.enabled,onClick:e=>{e.stopPropagation(),D(T.id)},className:ee.automationIconActionButtonClassName,children:(0,w.jsx)(d.default,{className:`size-4 shrink-0`,"aria-hidden":!0})})}):null,(0,w.jsx)(l.KebabMenu,{items:U,triggerClassName:`opacity-70 group-hover:opacity-100`})]})]}),T.prompt?(0,w.jsx)(`p`,{className:`line-clamp-2 text-xs leading-relaxed text-[var(--oh-text-secondary)]`,children:T.prompt}):null]}),V.length>0||q.length>0?(0,w.jsxs)(`div`,{className:n.cn(`mt-3 flex items-center gap-3`,V.length>0?`justify-between`:`justify-end`),children:[V.length>0?(0,w.jsx)(`div`,{className:`min-w-0 flex-1 overflow-hidden`,children:(0,w.jsx)(f.SkillCardPillRow,{pills:V,testId:`automation-pills-${T.id}`})}):null,q.length>0?(0,w.jsx)(S.AutomationRunActivitySparkline,{automationId:T.id,runs:q,testId:`automation-activity-${T.id}`}):null]}):null,M?(0,w.jsxs)(`div`,{className:v.automationCardStatusStripClassName,children:[(0,w.jsxs)(`div`,{className:`flex min-w-0 flex-1 items-center gap-2 overflow-hidden`,children:[J?(0,w.jsx)(`div`,{className:`h-3.5 w-3/4 animate-pulse rounded bg-surface-raised motion-reduce:animate-none`,"aria-hidden":`true`}):null,!J&&Y?(0,w.jsx)(`p`,{className:`truncate text-[var(--oh-text-secondary)]`,children:P(t.I18nKey.FEATURED_AUTOMATIONS$STATUS_UNAVAILABLE)}):null,!J&&!Y&&!K?(0,w.jsx)(`p`,{className:`truncate text-[var(--oh-text-secondary)]`,children:P(t.I18nKey.AUTOMATIONS$DETAIL$NO_RUNS)}):null,K?(0,w.jsxs)(w.Fragment,{children:[(0,w.jsx)(x.RunStatusBadge,{status:Z?.badgeStatus??K.status,iconOnly:!0,showLabel:!0}),ne?(0,w.jsx)(b.RunPhase,{status:K.status,code:K.phase_code,label:K.phase_label,updatedAt:K.phase_updated_at}):null,$?te&&Q?(0,w.jsx)(a.tooltip_default,{content:(0,w.jsx)(`p`,{className:`max-w-xs whitespace-pre-wrap break-words p-2 text-xs`,children:Q}),placement:`top`,closeDelay:100,disableAnimation:!1,className:`rounded-xl border border-[var(--oh-border)] bg-base-secondary p-0 text-white shadow-xl`,children:(0,w.jsx)(`span`,{className:`min-w-0 flex-1 cursor-default truncate text-[var(--oh-text-secondary)]`,children:$})}):(0,w.jsx)(`p`,{className:`min-w-0 flex-1 truncate text-[var(--oh-text-secondary)]`,children:$}):null]}):null]}),X?(0,w.jsx)(`span`,{"data-testid":`automation-last-run-${T.id}`,className:`shrink-0 text-[var(--oh-text-secondary)]`,children:p.formatRelativeTime(X,F.language,P)}):null]}):null,G?(0,w.jsx)(`p`,{"data-testid":`automation-impact-${T.id}`,className:`mt-3 truncate text-xs text-[var(--oh-text-secondary)]`,children:G}):null,M?(0,w.jsx)(`div`,{className:`mt-3`,children:(0,w.jsx)(_.AutomationRunStats,{state:M.state,copy:M.spec.stats})}):null]})}exports.AutomationCard=T;
|
|
2
2
|
//# sourceMappingURL=automation-card.cjs.map
|