@openhands/agent-canvas 1.0.0-beta.6 → 1.0.0-beta.7
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 +24 -7
- package/README.windows.md +27 -0
- package/bin/agent-canvas.mjs +26 -3
- package/build/assets/{QueryClientProvider-CkGuhXg-.js → QueryClientProvider-Cnr-Yl3j.js} +1 -1
- package/build/assets/{Trans-Cvm_-SMi.js → Trans-4jmk54WC.js} +1 -1
- package/build/assets/acp-providers-CPdgcp13.js +1 -0
- package/build/assets/{acp-route-guard-B2yoBZ_4.js → acp-route-guard-BoVmCn0e.js} +1 -1
- package/build/assets/active-backend-context-Beu-LZL-.js +1 -0
- package/build/assets/add-backend-modal-BheqYXHK.js +1 -0
- package/build/assets/agent-server-client-options-HEOwGVIU.js +1 -0
- package/build/assets/agent-server-compatibility-CdI3N7dr.js +1 -0
- package/build/assets/agent-server-conversation-service.api-CORdqJZg.js +5 -0
- package/build/assets/{agent-settings-CnGSCmK8.js → agent-settings-UFvcGjoI.js} +1 -1
- package/build/assets/{alert-banner-DtzAX654.js → alert-banner-DFnn_lC6.js} +1 -1
- package/build/assets/{analytics-consent-form-modal-CHZ3I37v.js → analytics-consent-form-modal-CVNugqzu.js} +1 -1
- package/build/assets/api-key-entry-screen-M6su2VSf.js +1 -0
- package/build/assets/{app-settings-Db9ITeJH.js → app-settings-BlvBhBdc.js} +1 -1
- package/build/assets/automation-detail-BWrQk4Oa.js +1 -0
- package/build/assets/automations-list-ux9KvYsU.js +1 -0
- package/build/assets/back-nav-button-7dQJ2k3O.js +1 -0
- package/build/assets/backend-form-modal-CDnEYjaU.js +1 -0
- package/build/assets/{backend-synced-settings-badge-Dc6c7GT4.js → backend-synced-settings-badge-BTIj-Ffq.js} +1 -1
- package/build/assets/base-modal-C2oy2EBG.js +1 -0
- package/build/assets/brand-button-DJ_S16rO.js +1 -0
- package/build/assets/{browser-D810xUYt.js → browser-CGM-k-sH.js} +2 -2
- package/build/assets/browser-store-DAsixKdU.js +1 -0
- package/build/assets/{browser-tab-B-aIqXRl.js → browser-tab-dvSPdvkm.js} +1 -1
- package/build/assets/{checkmark-DL7acQA7.js → checkmark-Dus0b6jt.js} +1 -1
- package/build/assets/{chevron-left-small-CVWf8TI6.js → chevron-left-small-_uvG7RVM.js} +1 -1
- package/build/assets/{circle-plus-check-toggle-P7ZZToV4.js → circle-plus-check-toggle-DKS8MAVV.js} +1 -1
- package/build/assets/{close-B5LROHR3.js → close-BU5iTc66.js} +1 -1
- package/build/assets/code-tag-BzyqOtPD.js +1 -0
- package/build/assets/combobox-caret-BJC7XJsz.js +1 -0
- package/build/assets/{command-store-DFN_17p1.js → command-store-CE1weJy8.js} +1 -1
- package/build/assets/{condenser-settings-wnEKhBof.js → condenser-settings-BolbDvm5.js} +1 -1
- package/build/assets/{confirmation-modal-Dau3w_sa.js → confirmation-modal-B5Ca6qFE.js} +1 -1
- package/build/assets/context-menu-list-item-7tAcm2c3.js +1 -0
- package/build/assets/conversation-D0N4dw_p.js +19 -0
- package/build/assets/conversation-DhRJuZLG.js +1 -0
- package/build/assets/conversation-panel-CNqHbS_Z.js +1 -0
- package/build/assets/conversation-service.api-BsJy6uuL.js +1 -0
- package/build/assets/conversation-state-store-D-w0uurj.js +1 -0
- package/build/assets/conversation-store-CC-isCnP.js +1 -0
- package/build/assets/{conversation-tab-empty-state-DyssnnWa.js → conversation-tab-empty-state-CStQLPVW.js} +1 -1
- package/build/assets/conversation-websocket-context-DvHgx_FE.js +3 -0
- package/build/assets/{copy-DYgmUdIw.js → copy-Chg-sFu3.js} +1 -1
- package/build/assets/{custom-toast-handlers-C-SZFmto.js → custom-toast-handlers-ufGJ6_Rc.js} +1 -1
- package/build/assets/declaration-CR6HMp29.js +1 -0
- package/build/assets/{device-verify-DqDlphsG.js → device-verify-C6mj28zv.js} +1 -1
- package/build/assets/dist-DNeWJ2bh.js +1 -0
- package/build/assets/dropdown-classes-BsVmxlNG.js +1 -0
- package/build/assets/edit-automation-modal-BpX-t-HD.js +1 -0
- package/build/assets/ellipsis-button-Vh5MvRZa.js +1 -0
- package/build/assets/entry.client-Ck9rQCg-.js +2 -0
- package/build/assets/enum-filter-dropdown-5JeF2RLb.js +1 -0
- package/build/assets/{environment-switch-overlay-XL8yCGP6.js → environment-switch-overlay-Tf_BIfeR.js} +1 -1
- package/build/assets/extensions-hub-CE9QOb5n.js +1 -0
- package/build/assets/{extensions-navigation-BYR8Giqq.js → extensions-navigation-DSLGNGbS.js} +1 -1
- package/build/assets/file-BTY6Gyy9.js +1 -0
- package/build/assets/files-tab-cL668j1I.js +1 -0
- package/build/assets/files-tab-store-m0ARqX_E.js +1 -0
- package/build/assets/{folder-ZZJVGgd7.js → folder-D1T2W1cj.js} +1 -1
- package/build/assets/git-control-bar-branch-button-DtIrOrie.js +27 -0
- package/build/assets/git-provider-icon-CHdGBdU2.js +1 -0
- package/build/assets/globe-Bzj_0oXT.js +1 -0
- package/build/assets/home-Cz2Veg56.js +1 -0
- package/build/assets/{i18n-CTohRuoO.js → i18n-DET2iOyh.js} +1 -1
- package/build/assets/install-server-modal-B9nXCS3u.js +1 -0
- package/build/assets/launch-CWz0dm4o.js +1 -0
- package/build/assets/{lesson-plan-dH5Bj0pN.js → lesson-plan-duSsqWVs.js} +1 -1
- package/build/assets/link-external-DGxVm4Ps.js +1 -0
- package/build/assets/{llm-client-DaH1TuyR.js → llm-client-CYEaUjGx.js} +1 -1
- package/build/assets/llm-settings-DFkXHuvT.js +1 -0
- package/build/assets/llm-settings-DhrdCXqX.js +1 -0
- package/build/assets/{loading-spinner-BPtYORNK.js → loading-spinner-5GT9q1xy.js} +1 -1
- package/build/assets/manage-backends-modal-DpBD_vR9.js +1 -0
- package/build/assets/manage-workspaces-modal-CtRbxREx.js +1 -0
- package/build/assets/manifest-eed90ff5.js +1 -0
- package/build/assets/{markdown-renderer-DMzf2i4x.js → markdown-renderer-B3IAVfv4.js} +1 -1
- package/build/assets/mcp-BUe7kiYM.js +9 -0
- package/build/assets/messages-dqp_KYyl.js +36 -0
- package/build/assets/{modal-backdrop-BAbgYsqB.js → modal-backdrop-RfNCrSpK.js} +1 -1
- package/build/assets/{modal-body-BI6Ru2Qr.js → modal-body-aoa2fx5W.js} +1 -1
- package/build/assets/modal-classes-6YqcqA6y.js +1 -0
- package/build/assets/{modal-close-button-t1Gh3qmL.js → modal-close-button-CtWOUMmw.js} +1 -1
- package/build/assets/{model-selector-SM9IUz-q.js → model-selector-BvSTrkhT.js} +1 -1
- package/build/assets/{navigation-context-D0YWpT8d.js → navigation-context-BdKYH32C.js} +1 -1
- package/build/assets/{navigation-link-Cn7KP3c5.js → navigation-link-U4vY9i_C.js} +1 -1
- package/build/assets/{openhands-logo-CnrF6LKb.js → openhands-logo-CCo0wJZX.js} +1 -1
- package/build/assets/{option-service.api-KvY_mZMY.js → option-service.api-DmNVxAvS.js} +1 -1
- package/build/assets/{organization-service.api-DzYTHTYC.js → organization-service.api-DbnougaQ.js} +1 -1
- package/build/assets/{path-utils-C3bQf6lJ.js → path-utils-onx24uF5.js} +1 -1
- package/build/assets/{plan-components-atxXCF0R.js → plan-components-CRDMQzsS.js} +1 -1
- package/build/assets/{planner-tab-BlrCpv-7.js → planner-tab-CmIjLz7q.js} +1 -1
- package/build/assets/{profiles-client-D6IkTJof.js → profiles-client-fEmgWkCW.js} +1 -1
- package/build/assets/{providers-Bx6EfrzZ.js → providers-CbD7fiic.js} +1 -1
- package/build/assets/proxy-BAdHH8QB.js +1 -0
- package/build/assets/{query-client-config-B7u9asM0.js → query-client-config-CRnGSujB.js} +1 -1
- package/build/assets/{recommended-automations-launcher-CgV8FyPK.js → recommended-automations-launcher-uTyODuzB.js} +3 -3
- package/build/assets/{root-dNntxffj.js → root-DmjpFpTu.js} +2 -2
- package/build/assets/root-Z2VHU4R3.css +1 -0
- package/build/assets/root-layout-DejMsKhy.js +2 -0
- package/build/assets/{sdk-section-page-DOIKvwSL.js → sdk-section-page-BgDlMhcq.js} +1 -1
- package/build/assets/{sdk-settings-schema-DsUf9wu1.js → sdk-settings-schema-CLmJ9sho.js} +1 -1
- package/build/assets/{search-27Owlc3A.js → search-SuJctqNJ.js} +1 -1
- package/build/assets/secrets-service-B7CxNinp.js +1 -0
- package/build/assets/secrets-settings-yK7CqIpm.js +1 -0
- package/build/assets/{server-client-DyAQ3NZ_.js → server-client-Kh4QSwDJ.js} +1 -1
- package/build/assets/{settings-BYkVX7vW.js → settings-DN5PpgRD.js} +1 -1
- package/build/assets/{settings-dropdown-input-BJYvGdg-.js → settings-dropdown-input-BtoovFre.js} +1 -1
- package/build/assets/{settings-gear-C77PgE_O.js → settings-gear-Dd8K2_8B.js} +1 -1
- package/build/assets/settings-index-DKC8IY1P.js +1 -0
- package/build/assets/{settings-input-Bn7F5C75.js → settings-input-CehsXnb3.js} +1 -1
- package/build/assets/settings-list-classes-E3v_f6QG.js +1 -0
- package/build/assets/settings-modal-DJ4kGzUx.js +1 -0
- package/build/assets/{settings-section-header-context-BgZe5YkE.js → settings-section-header-context-DewwJ0-F.js} +1 -1
- package/build/assets/settings-service.api-C3rxTtPj.js +1 -0
- package/build/assets/{settings-switch-BeIKrWms.js → settings-switch-BiBuS3xa.js} +1 -1
- package/build/assets/{settings-utils-B6Nl07io.js → settings-utils-DY04tWG1.js} +1 -1
- package/build/assets/{shared-conversation-AMyqXvpk.js → shared-conversation-h9YnBtCU.js} +1 -1
- package/build/assets/sidebar-mobile-menu-toggle-D0-AvsnT.js +1 -0
- package/build/assets/{sidebar-nav-link-BGjiJq-4.js → sidebar-nav-link-OhIeFyna.js} +1 -1
- package/build/assets/{sidebar-store-Uy3v0AOV.js → sidebar-store-DnQAJAE5.js} +1 -1
- package/build/assets/{skill-card-pill-row-DF1axQCG.js → skill-card-pill-row-BW9qvhoK.js} +1 -1
- package/build/assets/{skills-ChIKZPK4.js → skills-0GRKX5Xj.js} +1 -1
- package/build/assets/{skills-plugins-CcI_19lM.js → skills-plugins-DNcsNF88.js} +1 -1
- package/build/assets/skills-settings-7liFiSY6.js +2 -0
- package/build/assets/{styled-tooltip-CBzrri6o.js → styled-tooltip-hdfMXPQC.js} +1 -1
- package/build/assets/{switch-skeleton-DnC9wLp7.js → switch-skeleton-DSKqSx2A.js} +1 -1
- package/build/assets/{task-list-tab-DUJn1sgz.js → task-list-tab-DT6_zfUs.js} +1 -1
- package/build/assets/{terminal-DgQk1Ay6.js → terminal-CDhQGDua.js} +2 -2
- package/build/assets/{terminal-RmuaSdhJ.js → terminal-CPYWdo4j.js} +1 -1
- package/build/assets/{toggle-switch-Pvyp2RAN.js → toggle-switch-T2v6sJ6l.js} +1 -1
- package/build/assets/{typography-gpuWmrQO.js → typography-BDgnT7Yp.js} +1 -1
- package/build/assets/{u-check-circle-IUIfACQQ.js → u-check-circle-DOauqQKb.js} +1 -1
- package/build/assets/{u-check-circle-half-C1YxB6py.js → u-check-circle-half-steSK_JB.js} +1 -1
- package/build/assets/{u-circuit-BmVikJHu.js → u-circuit-x3ExjBbU.js} +1 -1
- package/build/assets/{u-edit-CFvXHqZk.js → u-edit-BbrptMCa.js} +1 -1
- package/build/assets/{use-active-conversation-BEFNwnFk.js → use-active-conversation-DHGcmjCK.js} +1 -1
- package/build/assets/use-agent-settings-schema-CLoTOSJI.js +1 -0
- package/build/assets/{use-agent-state-Bkrd1FZq.js → use-agent-state-PKrUPMJ3.js} +1 -1
- package/build/assets/{use-cloud-current-user-id-CvkXFnTT.js → use-cloud-current-user-id-Ddr75hEz.js} +1 -1
- package/build/assets/{use-config-Co1O8-Ey.js → use-config-OIMQLQ2s.js} +1 -1
- package/build/assets/{use-create-conversation-CEgXpkfH.js → use-create-conversation-Bszyp13O.js} +1 -1
- package/build/assets/{use-event-store-BT_gV3ut.js → use-event-store-BomO7ywK.js} +1 -1
- package/build/assets/{use-get-secrets-DuhdIA59.js → use-get-secrets-8Jby8ele.js} +1 -1
- package/build/assets/{use-handle-plan-click-Ckkm5eIY.js → use-handle-plan-click-CohJPvvW.js} +1 -1
- package/build/assets/use-is-authed-dw2026rR.js +1 -0
- package/build/assets/{use-is-creating-conversation-BZ5hB_Bg.js → use-is-creating-conversation-DX2qSlfL.js} +1 -1
- package/build/assets/{use-launch-skill-in-chat-fNN_xGZG.js → use-launch-skill-in-chat-sQNEOLGD.js} +1 -1
- package/build/assets/use-llm-profiles-C861aFAq.js +1 -0
- package/build/assets/use-runtime-is-ready-Do2h_hRl.js +1 -0
- package/build/assets/{use-save-settings-VUrj_QNG.js → use-save-settings-DkAOEfD9.js} +1 -1
- package/build/assets/use-settings-D5hbTS9t.js +1 -0
- package/build/assets/{use-settings-nav-items-1ZvovKSr.js → use-settings-nav-items-BcSbo02d.js} +1 -1
- package/build/assets/{use-skills-DAMLFjKU.js → use-skills-D7PS0fH0.js} +1 -1
- package/build/assets/{use-task-list-CLJbuJgM.js → use-task-list-CsT10CBb.js} +1 -1
- package/build/assets/{use-unified-vscode-url-DdSRw-6P.js → use-unified-vscode-url-DEoe-NRI.js} +1 -1
- package/build/assets/use-user-conversation-Cs5H1pUF.js +1 -0
- package/build/assets/{useMutation-DqrumCWD.js → useMutation-GSSKKebK.js} +1 -1
- package/build/assets/{useTranslation-DCOdSSMl.js → useTranslation-B6voJV4y.js} +1 -1
- package/build/assets/utils-DCVfKFRt.js +1 -0
- package/build/assets/{vendor~browser-BNjNhjFU.js → vendor~browser-BrOJLj3y.js} +1 -1
- package/build/assets/vendor~conversation-panel~conversation-C9o-K1hW.js +1 -0
- package/build/assets/vendor~conversation-panel~conversation~index-RXYdJYxU.js +1 -0
- package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jfc6hidu-VnmIZrq3.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jfc6hidu-DJS-rJdI.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DpAdkv8m.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-6ByzelMS.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-B92czPCF.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BED5W_c4.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-By5W2oHN.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CCbqAFiI.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BbFOrAjI.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CG96FCly.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-smY2r837.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-E4d6IEfI.js} +1 -1
- package/build/assets/{vendor~home~mcp~automations-list-Cs-TO3fK.js → vendor~home~mcp~automations-list-CZSK-lT2.js} +1 -1
- package/build/assets/{vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-Z3nsiNNq.js → vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-CjJdFLoM.js} +1 -1
- package/build/assets/{vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-DbfELDJu.js → vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-m8dOii0J.js} +2 -2
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation-DjAjXS5J.js → vendor~root-layout~home~conversation-panel~conversation-B5WNMnt4.js} +1 -1
- package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-CbAhtEMv.js +1 -0
- package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-6Rm8U_Sr.js +9 -0
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-BkQGKpye.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-tTR8C6m0.js} +1 -1
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~k776hupu-Bbs7UJ5U.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~k776hupu-BJbu9kpL.js} +2 -2
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~dp08i1qy-DTwbEEcX.js → vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~dp08i1qy-hTzSytKK.js} +1 -1
- package/build/assets/{vendor~root~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-s~f2l2lr17-CDXvdvb2.js → vendor~root~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-s~f2l2lr17-DYXOLEck.js} +1 -1
- package/build/assets/{verification-settings-CsbvQcYS.js → verification-settings-Dlt8pINd.js} +1 -1
- package/build/assets/{vscode-tab-DjNArCgY.js → vscode-tab-DgepcYtF.js} +1 -1
- package/build/assets/{waiting-for-runtime-message-CntjExbU.js → waiting-for-runtime-message-CdK3btDZ.js} +1 -1
- package/build/assets/{x-mark-CrpjscNc.js → x-mark-BrkSPIiT.js} +1 -1
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +20 -2
- package/build/locales/ca/openhands.json +20 -2
- package/build/locales/de/openhands.json +20 -2
- package/build/locales/en/openhands.json +20 -2
- package/build/locales/es/openhands.json +20 -2
- package/build/locales/fr/openhands.json +20 -2
- package/build/locales/it/openhands.json +20 -2
- package/build/locales/ja/openhands.json +20 -2
- package/build/locales/ko-KR/openhands.json +20 -2
- package/build/locales/no/openhands.json +20 -2
- package/build/locales/pt/openhands.json +20 -2
- package/build/locales/tr/openhands.json +20 -2
- package/build/locales/uk/openhands.json +20 -2
- package/build/locales/zh-CN/openhands.json +20 -2
- package/build/locales/zh-TW/openhands.json +20 -2
- package/dist/api/acp-service/acp-service.api.d.ts +18 -0
- package/dist/api/agent-server-adapter.cjs +3 -3
- package/dist/api/agent-server-adapter.cjs.map +1 -1
- package/dist/api/agent-server-adapter.js +54 -55
- package/dist/api/agent-server-adapter.js.map +1 -1
- package/dist/api/agent-server-client-options.cjs +1 -1
- package/dist/api/agent-server-client-options.cjs.map +1 -1
- package/dist/api/agent-server-client-options.d.ts +4 -0
- package/dist/api/agent-server-client-options.js +18 -12
- package/dist/api/agent-server-client-options.js.map +1 -1
- package/dist/api/agent-server-compatibility.cjs +1 -1
- package/dist/api/agent-server-compatibility.cjs.map +1 -1
- package/dist/api/agent-server-compatibility.d.ts +1 -1
- package/dist/api/agent-server-compatibility.js +30 -25
- package/dist/api/agent-server-compatibility.js.map +1 -1
- package/dist/api/agent-server-config.cjs +1 -1
- package/dist/api/agent-server-config.cjs.map +1 -1
- package/dist/api/agent-server-config.d.ts +1 -51
- package/dist/api/agent-server-config.js +20 -70
- package/dist/api/agent-server-config.js.map +1 -1
- package/dist/api/backend-registry/active-store.cjs +1 -1
- package/dist/api/backend-registry/active-store.cjs.map +1 -1
- package/dist/api/backend-registry/active-store.d.ts +11 -5
- package/dist/api/backend-registry/active-store.js +36 -27
- package/dist/api/backend-registry/active-store.js.map +1 -1
- package/dist/api/backend-registry/auth.cjs +1 -1
- package/dist/api/backend-registry/auth.cjs.map +1 -1
- package/dist/api/backend-registry/auth.js +3 -9
- package/dist/api/backend-registry/auth.js.map +1 -1
- package/dist/api/backend-registry/default-backend.cjs +1 -1
- package/dist/api/backend-registry/default-backend.cjs.map +1 -1
- package/dist/api/backend-registry/default-backend.d.ts +9 -16
- package/dist/api/backend-registry/default-backend.js +5 -4
- package/dist/api/backend-registry/default-backend.js.map +1 -1
- package/dist/api/backend-registry/storage.cjs +1 -1
- package/dist/api/backend-registry/storage.cjs.map +1 -1
- package/dist/api/backend-registry/storage.js +67 -34
- package/dist/api/backend-registry/storage.js.map +1 -1
- package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
- package/dist/api/cloud/conversation-service.api.d.ts +8 -13
- package/dist/api/cloud/conversation-service.api.js.map +1 -1
- package/dist/api/cloud/organization-service.api.cjs.map +1 -1
- package/dist/api/cloud/organization-service.api.d.ts +1 -2
- package/dist/api/cloud/organization-service.api.js.map +1 -1
- package/dist/api/cloud/proxy.cjs +1 -1
- package/dist/api/cloud/proxy.cjs.map +1 -1
- package/dist/api/cloud/proxy.d.ts +6 -6
- package/dist/api/cloud/proxy.js +33 -24
- package/dist/api/cloud/proxy.js.map +1 -1
- package/dist/api/cloud/sandbox-service.api.cjs.map +1 -1
- package/dist/api/cloud/sandbox-service.api.d.ts +3 -3
- package/dist/api/cloud/sandbox-service.api.js.map +1 -1
- package/dist/api/cloud/secrets-service.api.cjs.map +1 -1
- package/dist/api/cloud/secrets-service.api.d.ts +3 -4
- package/dist/api/cloud/secrets-service.api.js.map +1 -1
- package/dist/api/cloud/settings-service.api.cjs +1 -1
- package/dist/api/cloud/settings-service.api.cjs.map +1 -1
- package/dist/api/cloud/settings-service.api.js +5 -1
- package/dist/api/cloud/settings-service.api.js.map +1 -1
- package/dist/api/cloud/skills-service.api.cjs.map +1 -1
- package/dist/api/cloud/skills-service.api.d.ts +5 -5
- package/dist/api/cloud/skills-service.api.js.map +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.js +115 -108
- package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
- package/dist/api/device-flow-client.cjs +1 -1
- package/dist/api/device-flow-client.cjs.map +1 -1
- package/dist/api/device-flow-client.d.ts +3 -5
- package/dist/api/device-flow-client.js +55 -66
- package/dist/api/device-flow-client.js.map +1 -1
- package/dist/api/event-service/event-service.api.cjs +1 -1
- package/dist/api/event-service/event-service.api.cjs.map +1 -1
- package/dist/api/event-service/event-service.api.d.ts +3 -3
- package/dist/api/event-service/event-service.api.js +17 -17
- package/dist/api/event-service/event-service.api.js.map +1 -1
- package/dist/api/git-service/agent-server-git-service.api.cjs +1 -1
- package/dist/api/git-service/agent-server-git-service.api.js +11 -11
- package/dist/api/runtime-service/agent-server-runtime-service.cjs +1 -1
- package/dist/api/runtime-service/agent-server-runtime-service.js +6 -6
- package/dist/components/conversation-events/chat/event-content-helpers/get-action-content.cjs +2 -2
- package/dist/components/conversation-events/chat/event-content-helpers/get-action-content.js +10 -10
- package/dist/components/conversation-events/chat/event-content-helpers/get-observation-result.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-observation-result.d.ts +5 -5
- package/dist/components/conversation-events/chat/event-content-helpers/get-observation-result.js.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js.map +1 -1
- package/dist/components/features/automations/automation-action-button-classes.d.ts +2 -2
- package/dist/components/features/backends/backend-form-modal.cjs +1 -1
- package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
- package/dist/components/features/backends/backend-form-modal.d.ts +1 -0
- package/dist/components/features/backends/backend-form-modal.js +203 -140
- package/dist/components/features/backends/backend-form-modal.js.map +1 -1
- package/dist/components/features/backends/backend-selector.cjs +1 -1
- package/dist/components/features/backends/backend-selector.cjs.map +1 -1
- package/dist/components/features/backends/backend-selector.js +117 -105
- package/dist/components/features/backends/backend-selector.js.map +1 -1
- package/dist/components/features/backends/backend-status-dot.cjs +1 -1
- package/dist/components/features/backends/backend-status-dot.cjs.map +1 -1
- package/dist/components/features/backends/backend-status-dot.d.ts +1 -1
- package/dist/components/features/backends/backend-status-dot.js +1 -1
- package/dist/components/features/backends/backend-status-dot.js.map +1 -1
- package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
- package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
- package/dist/components/features/backends/manage-backends-modal.js +81 -70
- package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
- package/dist/components/features/chat/change-agent-button.cjs +1 -1
- package/dist/components/features/chat/change-agent-button.cjs.map +1 -1
- package/dist/components/features/chat/change-agent-button.js +59 -57
- package/dist/components/features/chat/change-agent-button.js.map +1 -1
- package/dist/components/features/chat/change-agent-context-menu.cjs +1 -1
- package/dist/components/features/chat/change-agent-context-menu.cjs.map +1 -1
- package/dist/components/features/chat/change-agent-context-menu.d.ts +3 -1
- package/dist/components/features/chat/change-agent-context-menu.js +30 -25
- package/dist/components/features/chat/change-agent-context-menu.js.map +1 -1
- package/dist/components/features/chat/chat-add-file-button.cjs +1 -1
- package/dist/components/features/chat/chat-add-file-button.cjs.map +1 -1
- package/dist/components/features/chat/chat-add-file-button.js +39 -38
- package/dist/components/features/chat/chat-add-file-button.js.map +1 -1
- package/dist/components/features/chat/chat-message.cjs +1 -1
- package/dist/components/features/chat/chat-message.cjs.map +1 -1
- package/dist/components/features/chat/chat-message.d.ts +2 -1
- package/dist/components/features/chat/chat-message.js +185 -57
- package/dist/components/features/chat/chat-message.js.map +1 -1
- package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
- package/dist/components/features/chat/components/chat-input-actions.js +113 -113
- package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
- package/dist/components/features/chat/components/chat-input-model.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-model.cjs.map +1 -1
- package/dist/components/features/chat/components/chat-input-model.js +52 -51
- package/dist/components/features/chat/components/chat-input-model.js.map +1 -1
- package/dist/components/features/chat/components/slash-command-menu.cjs +2 -2
- package/dist/components/features/chat/components/slash-command-menu.cjs.map +1 -1
- package/dist/components/features/chat/components/slash-command-menu.js +38 -34
- package/dist/components/features/chat/components/slash-command-menu.js.map +1 -1
- package/dist/components/features/chat/git-control-bar-pr-button.cjs +1 -1
- package/dist/components/features/chat/git-control-bar-pr-button.cjs.map +1 -1
- package/dist/components/features/chat/git-control-bar-pr-button.js +16 -15
- package/dist/components/features/chat/git-control-bar-pr-button.js.map +1 -1
- package/dist/components/features/chat/git-control-bar-pull-button.cjs +1 -1
- package/dist/components/features/chat/git-control-bar-pull-button.cjs.map +1 -1
- package/dist/components/features/chat/git-control-bar-pull-button.js +16 -15
- package/dist/components/features/chat/git-control-bar-pull-button.js.map +1 -1
- package/dist/components/features/chat/git-control-bar-push-button.cjs +1 -1
- package/dist/components/features/chat/git-control-bar-push-button.cjs.map +1 -1
- package/dist/components/features/chat/git-control-bar-push-button.js +16 -15
- package/dist/components/features/chat/git-control-bar-push-button.js.map +1 -1
- package/dist/components/features/chat/git-control-bar.cjs +1 -1
- package/dist/components/features/chat/git-control-bar.cjs.map +1 -1
- package/dist/components/features/chat/git-control-bar.js +63 -62
- package/dist/components/features/chat/git-control-bar.js.map +1 -1
- package/dist/components/features/chat/pending-user-messages.cjs +1 -1
- package/dist/components/features/chat/pending-user-messages.cjs.map +1 -1
- package/dist/components/features/chat/pending-user-messages.js +27 -23
- package/dist/components/features/chat/pending-user-messages.js.map +1 -1
- package/dist/components/features/chat/switch-profile-button.cjs +1 -1
- package/dist/components/features/chat/switch-profile-button.cjs.map +1 -1
- package/dist/components/features/chat/switch-profile-button.js +26 -25
- package/dist/components/features/chat/switch-profile-button.js.map +1 -1
- package/dist/components/features/chat/switch-profile-context-menu.cjs +1 -1
- package/dist/components/features/chat/switch-profile-context-menu.cjs.map +1 -1
- package/dist/components/features/chat/switch-profile-context-menu.js +77 -67
- package/dist/components/features/chat/switch-profile-context-menu.js.map +1 -1
- package/dist/components/features/context-menu/context-menu-icon-text-with-description.cjs +1 -1
- package/dist/components/features/context-menu/context-menu-icon-text-with-description.cjs.map +1 -1
- package/dist/components/features/context-menu/context-menu-icon-text-with-description.d.ts +2 -1
- package/dist/components/features/context-menu/context-menu-icon-text-with-description.js +3 -2
- package/dist/components/features/context-menu/context-menu-icon-text-with-description.js.map +1 -1
- package/dist/components/features/context-menu/context-menu-icon-text.cjs +1 -1
- package/dist/components/features/context-menu/context-menu-icon-text.cjs.map +1 -1
- package/dist/components/features/context-menu/context-menu-icon-text.d.ts +2 -1
- package/dist/components/features/context-menu/context-menu-icon-text.js +20 -10
- package/dist/components/features/context-menu/context-menu-icon-text.js.map +1 -1
- package/dist/components/features/context-menu/context-menu-list-item.cjs +1 -1
- package/dist/components/features/context-menu/context-menu-list-item.cjs.map +1 -1
- package/dist/components/features/context-menu/context-menu-list-item.js +10 -9
- package/dist/components/features/context-menu/context-menu-list-item.js.map +1 -1
- package/dist/components/features/controls/agent-status.cjs +1 -1
- package/dist/components/features/controls/agent-status.js +12 -12
- package/dist/components/features/controls/git-tools-submenu.cjs +1 -1
- package/dist/components/features/controls/git-tools-submenu.cjs.map +1 -1
- package/dist/components/features/controls/git-tools-submenu.js +1 -1
- package/dist/components/features/controls/git-tools-submenu.js.map +1 -1
- package/dist/components/features/controls/macros-submenu.cjs +1 -1
- package/dist/components/features/controls/macros-submenu.cjs.map +1 -1
- package/dist/components/features/controls/macros-submenu.js +1 -1
- package/dist/components/features/controls/macros-submenu.js.map +1 -1
- package/dist/components/features/controls/server-status-context-menu-icon-text.cjs +1 -1
- package/dist/components/features/controls/server-status-context-menu-icon-text.cjs.map +1 -1
- package/dist/components/features/controls/server-status-context-menu-icon-text.js +14 -15
- package/dist/components/features/controls/server-status-context-menu-icon-text.js.map +1 -1
- package/dist/components/features/controls/server-status-context-menu.cjs +1 -1
- package/dist/components/features/controls/server-status-context-menu.js +4 -4
- package/dist/components/features/controls/server-status.cjs +1 -1
- package/dist/components/features/controls/server-status.js +7 -7
- package/dist/components/features/controls/tools-context-menu-icon-text.cjs +1 -1
- package/dist/components/features/controls/tools-context-menu-icon-text.cjs.map +1 -1
- package/dist/components/features/controls/tools-context-menu-icon-text.js +16 -16
- package/dist/components/features/controls/tools-context-menu-icon-text.js.map +1 -1
- package/dist/components/features/conversation/conversation-name-context-menu-icon-text.cjs +1 -1
- package/dist/components/features/conversation/conversation-name-context-menu-icon-text.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-name-context-menu-icon-text.js +11 -11
- package/dist/components/features/conversation/conversation-name-context-menu-icon-text.js.map +1 -1
- package/dist/components/features/conversation/conversation-name-with-status.cjs +1 -1
- package/dist/components/features/conversation/conversation-name-with-status.js +11 -11
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +60 -47
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
- package/dist/components/features/conversation-panel/cloud-new-conversation-menu.cjs +1 -1
- package/dist/components/features/conversation-panel/cloud-new-conversation-menu.cjs.map +1 -1
- package/dist/components/features/conversation-panel/cloud-new-conversation-menu.js +86 -82
- package/dist/components/features/conversation-panel/cloud-new-conversation-menu.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +4 -4
- 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.js +9 -9
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +93 -93
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.js +177 -177
- package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
- package/dist/components/features/conversation-panel/ellipsis-button.cjs +1 -1
- package/dist/components/features/conversation-panel/ellipsis-button.cjs.map +1 -1
- package/dist/components/features/conversation-panel/ellipsis-button.js +13 -13
- package/dist/components/features/conversation-panel/ellipsis-button.js.map +1 -1
- package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs +1 -1
- package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs.map +1 -1
- package/dist/components/features/conversation-panel/local-new-conversation-menu.js +57 -53
- package/dist/components/features/conversation-panel/local-new-conversation-menu.js.map +1 -1
- package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.cjs +1 -1
- package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.cjs.map +1 -1
- package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.js +3 -2
- package/dist/components/features/conversation-panel/new-conversation-dropdown-styles.js.map +1 -1
- package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.cjs +1 -1
- package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.cjs.map +1 -1
- package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.js +11 -8
- package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.js.map +1 -1
- package/dist/components/features/conversation-panel/system-message-modal/tab-content.cjs.map +1 -1
- package/dist/components/features/conversation-panel/system-message-modal/tab-content.d.ts +2 -5
- package/dist/components/features/conversation-panel/system-message-modal/tab-content.js.map +1 -1
- package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
- package/dist/components/features/files-tab/file-content-viewer.cjs.map +1 -1
- package/dist/components/features/files-tab/file-content-viewer.js +45 -42
- package/dist/components/features/files-tab/file-content-viewer.js.map +1 -1
- package/dist/components/features/home/llm-not-configured-banner.d.ts +11 -0
- package/dist/components/features/home/shared/dropdown-item.cjs +1 -1
- package/dist/components/features/home/shared/dropdown-item.cjs.map +1 -1
- package/dist/components/features/home/shared/dropdown-item.js +20 -16
- package/dist/components/features/home/shared/dropdown-item.js.map +1 -1
- package/dist/components/features/home/shared/generic-dropdown-menu.cjs +1 -1
- package/dist/components/features/home/shared/generic-dropdown-menu.cjs.map +1 -1
- package/dist/components/features/home/shared/generic-dropdown-menu.js +23 -22
- package/dist/components/features/home/shared/generic-dropdown-menu.js.map +1 -1
- package/dist/components/features/home/workspace-dropdown/folder-browser-modal.cjs +1 -1
- package/dist/components/features/home/workspace-dropdown/folder-browser-modal.cjs.map +1 -1
- package/dist/components/features/home/workspace-dropdown/folder-browser-modal.js +103 -102
- package/dist/components/features/home/workspace-dropdown/folder-browser-modal.js.map +1 -1
- package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.cjs +1 -1
- package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.cjs.map +1 -1
- package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.js +68 -67
- package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.js.map +1 -1
- package/dist/components/features/mcp-page/custom-server-editor.cjs +1 -1
- package/dist/components/features/mcp-page/custom-server-editor.cjs.map +1 -1
- package/dist/components/features/mcp-page/custom-server-editor.js +62 -60
- package/dist/components/features/mcp-page/custom-server-editor.js.map +1 -1
- package/dist/components/features/mcp-page/index.cjs +1 -1
- package/dist/components/features/mcp-page/index.d.ts +1 -0
- package/dist/components/features/mcp-page/index.js +1 -0
- package/dist/components/features/mcp-page/install-server-modal.cjs +1 -1
- package/dist/components/features/mcp-page/install-server-modal.cjs.map +1 -1
- package/dist/components/features/mcp-page/install-server-modal.js +141 -121
- package/dist/components/features/mcp-page/install-server-modal.js.map +1 -1
- package/dist/components/features/mcp-page/save-as-secret-toggle.cjs +2 -0
- package/dist/components/features/mcp-page/save-as-secret-toggle.cjs.map +1 -0
- package/dist/components/features/mcp-page/save-as-secret-toggle.d.ts +7 -0
- package/dist/components/features/mcp-page/save-as-secret-toggle.js +50 -0
- package/dist/components/features/mcp-page/save-as-secret-toggle.js.map +1 -0
- package/dist/components/features/onboarding/onboarding-modal.d.ts +2 -2
- package/dist/components/features/onboarding/steps/check-backend-step.d.ts +1 -1
- package/dist/components/features/onboarding/steps/choose-agent-step.d.ts +2 -1
- package/dist/components/features/onboarding/steps/setup-acp-secrets-step.d.ts +19 -10
- 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.d.ts +5 -0
- package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +2 -0
- package/dist/components/features/settings/llm-profiles/profile-actions-menu.cjs +1 -1
- package/dist/components/features/settings/llm-profiles/profile-actions-menu.js +1 -0
- package/dist/components/features/skills/extensions-navigation.cjs +1 -1
- package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
- package/dist/components/features/skills/extensions-navigation.js +1 -1
- package/dist/components/features/skills/extensions-navigation.js.map +1 -1
- package/dist/components/shared/buttons/back-nav-button.cjs +2 -0
- package/dist/components/shared/buttons/back-nav-button.cjs.map +1 -0
- package/dist/components/shared/buttons/back-nav-button.d.ts +17 -0
- package/dist/components/shared/buttons/back-nav-button.js +33 -0
- package/dist/components/shared/buttons/back-nav-button.js.map +1 -0
- package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs +1 -1
- package/dist/components/shared/buttons/conversation-confirmation-buttons.js +5 -5
- package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
- package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
- package/dist/components/shared/filters/enum-filter-dropdown.js +32 -31
- package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
- package/dist/components/shared/modals/confirmation-modals/base-modal.cjs +1 -1
- package/dist/components/shared/modals/confirmation-modals/base-modal.cjs.map +1 -1
- package/dist/components/shared/modals/confirmation-modals/base-modal.js +14 -13
- package/dist/components/shared/modals/confirmation-modals/base-modal.js.map +1 -1
- package/dist/components/shared/modals/settings/settings-modal.cjs +1 -1
- package/dist/components/shared/modals/settings/settings-modal.cjs.map +1 -1
- package/dist/components/shared/modals/settings/settings-modal.js +17 -16
- package/dist/components/shared/modals/settings/settings-modal.js.map +1 -1
- package/dist/components/shared/text-shimmer.cjs +2 -0
- package/dist/components/shared/text-shimmer.cjs.map +1 -0
- package/dist/components/shared/text-shimmer.d.ts +11 -0
- package/dist/components/shared/text-shimmer.js +43 -0
- package/dist/components/shared/text-shimmer.js.map +1 -0
- package/dist/constants/acp-providers.cjs +1 -1
- package/dist/constants/acp-providers.cjs.map +1 -1
- package/dist/constants/acp-providers.d.ts +16 -3
- package/dist/constants/acp-providers.js +0 -1
- package/dist/constants/acp-providers.js.map +1 -1
- package/dist/contexts/active-backend-context.cjs +1 -1
- package/dist/contexts/active-backend-context.cjs.map +1 -1
- package/dist/contexts/active-backend-context.js +32 -32
- package/dist/contexts/active-backend-context.js.map +1 -1
- package/dist/hooks/chat/use-chat-input-logic.cjs +1 -1
- package/dist/hooks/chat/use-chat-input-logic.cjs.map +1 -1
- package/dist/hooks/chat/use-chat-input-logic.js +13 -6
- package/dist/hooks/chat/use-chat-input-logic.js.map +1 -1
- package/dist/hooks/mutation/use-save-fields-as-secrets.cjs +2 -0
- package/dist/hooks/mutation/use-save-fields-as-secrets.cjs.map +1 -0
- package/dist/hooks/mutation/use-save-fields-as-secrets.d.ts +9 -0
- package/dist/hooks/mutation/use-save-fields-as-secrets.js +24 -0
- package/dist/hooks/mutation/use-save-fields-as-secrets.js.map +1 -0
- package/dist/hooks/mutation/use-unified-start-conversation.cjs +1 -1
- package/dist/hooks/mutation/use-unified-start-conversation.js +8 -8
- package/dist/hooks/mutation/use-unified-stop-conversation.cjs +1 -1
- package/dist/hooks/mutation/use-unified-stop-conversation.js +15 -15
- package/dist/hooks/query/use-acp-auth-status.d.ts +36 -0
- package/dist/hooks/query/use-agent-settings-schema.cjs +1 -1
- package/dist/hooks/query/use-agent-settings-schema.cjs.map +1 -1
- package/dist/hooks/query/use-agent-settings-schema.js +26 -16
- package/dist/hooks/query/use-agent-settings-schema.js.map +1 -1
- package/dist/hooks/query/use-backends-health.cjs +1 -1
- package/dist/hooks/query/use-backends-health.cjs.map +1 -1
- package/dist/hooks/query/use-backends-health.d.ts +2 -0
- package/dist/hooks/query/use-backends-health.js +31 -21
- package/dist/hooks/query/use-backends-health.js.map +1 -1
- package/dist/hooks/query/use-paginated-conversations.cjs +1 -1
- package/dist/hooks/query/use-paginated-conversations.cjs.map +1 -1
- package/dist/hooks/query/use-paginated-conversations.js +15 -14
- package/dist/hooks/query/use-paginated-conversations.js.map +1 -1
- package/dist/hooks/query/use-settings.cjs +1 -1
- package/dist/hooks/query/use-settings.cjs.map +1 -1
- package/dist/hooks/query/use-settings.js +65 -52
- package/dist/hooks/query/use-settings.js.map +1 -1
- package/dist/hooks/query/use-user-conversation.cjs +1 -1
- package/dist/hooks/query/use-user-conversation.cjs.map +1 -1
- package/dist/hooks/query/use-user-conversation.js +20 -11
- package/dist/hooks/query/use-user-conversation.js.map +1 -1
- package/dist/hooks/use-agent-state.cjs +1 -1
- package/dist/hooks/use-agent-state.js +13 -13
- package/dist/hooks/use-conversation-name-context-menu.cjs +1 -1
- package/dist/hooks/use-conversation-name-context-menu.js +10 -10
- package/dist/hooks/use-conversation-name-context-menu.js.map +1 -1
- package/dist/hooks/use-llm-configured.d.ts +25 -0
- package/dist/hooks/use-runtime-is-ready.cjs +1 -1
- package/dist/hooks/use-runtime-is-ready.js +5 -5
- package/dist/i18n/declaration.cjs +1 -1
- package/dist/i18n/declaration.cjs.map +1 -1
- package/dist/i18n/declaration.d.ts +19 -1
- 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 +321 -15
- package/dist/i18n/translation.js.map +1 -1
- package/dist/icons/stop-circle.cjs +1 -1
- package/dist/icons/stop-circle.cjs.map +1 -1
- package/dist/icons/stop-circle.js +7 -10
- package/dist/icons/stop-circle.js.map +1 -1
- package/dist/locales/ar/openhands.json +20 -2
- package/dist/locales/ca/openhands.json +20 -2
- package/dist/locales/de/openhands.json +20 -2
- package/dist/locales/en/openhands.json +20 -2
- package/dist/locales/es/openhands.json +20 -2
- package/dist/locales/fr/openhands.json +20 -2
- package/dist/locales/it/openhands.json +20 -2
- package/dist/locales/ja/openhands.json +20 -2
- package/dist/locales/ko-KR/openhands.json +20 -2
- package/dist/locales/no/openhands.json +20 -2
- package/dist/locales/pt/openhands.json +20 -2
- package/dist/locales/tr/openhands.json +20 -2
- package/dist/locales/uk/openhands.json +20 -2
- package/dist/locales/zh-CN/openhands.json +20 -2
- package/dist/locales/zh-TW/openhands.json +20 -2
- package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.cjs +2 -0
- package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.cjs.map +1 -0
- package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js +15 -0
- package/dist/node_modules/framer-motion/dist/es/utils/reduced-motion/use-reduced-motion.js.map +1 -0
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/dist/routes/conversation.cjs +1 -1
- package/dist/routes/conversation.cjs.map +1 -1
- package/dist/routes/conversation.js +1 -1
- package/dist/routes/conversation.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 +55 -54
- package/dist/routes/llm-settings.js.map +1 -1
- package/dist/routes/secrets-settings.cjs +1 -1
- package/dist/routes/secrets-settings.cjs.map +1 -1
- package/dist/routes/secrets-settings.js +19 -27
- package/dist/routes/secrets-settings.js.map +1 -1
- package/dist/stores/conversation-store.cjs +1 -1
- package/dist/stores/conversation-store.cjs.map +1 -1
- package/dist/stores/conversation-store.d.ts +4 -0
- package/dist/stores/conversation-store.js +6 -0
- package/dist/stores/conversation-store.js.map +1 -1
- package/dist/types/agent-server/core/events/acp-tool-call-event.d.ts +6 -4
- package/dist/types/agent-server/core/events/system-event.d.ts +5 -0
- package/dist/types/automation.d.ts +15 -0
- package/dist/types/settings.d.ts +3 -1
- package/dist/ui/combobox-caret.cjs +1 -1
- package/dist/ui/combobox-caret.cjs.map +1 -1
- package/dist/ui/combobox-caret.d.ts +1 -1
- package/dist/ui/combobox-caret.js +9 -8
- package/dist/ui/combobox-caret.js.map +1 -1
- package/dist/ui/context-menu.cjs +1 -1
- package/dist/ui/context-menu.cjs.map +1 -1
- package/dist/ui/context-menu.js +9 -8
- package/dist/ui/context-menu.js.map +1 -1
- package/dist/ui/dropdown/dropdown-menu.cjs +1 -1
- package/dist/ui/dropdown/dropdown-menu.cjs.map +1 -1
- package/dist/ui/dropdown/dropdown-menu.js +21 -17
- package/dist/ui/dropdown/dropdown-menu.js.map +1 -1
- package/dist/ui/dropdown/dropdown.cjs +1 -1
- package/dist/ui/dropdown/dropdown.cjs.map +1 -1
- package/dist/ui/dropdown/dropdown.js +2 -2
- package/dist/ui/dropdown/dropdown.js.map +1 -1
- package/dist/utils/automation-schedule.d.ts +1 -0
- package/dist/utils/dropdown-classes.cjs +2 -0
- package/dist/utils/dropdown-classes.cjs.map +1 -0
- package/dist/utils/dropdown-classes.d.ts +32 -0
- package/dist/utils/dropdown-classes.js +8 -0
- package/dist/utils/dropdown-classes.js.map +1 -0
- package/dist/utils/form-control-classes.cjs +1 -1
- package/dist/utils/form-control-classes.cjs.map +1 -1
- package/dist/utils/form-control-classes.d.ts +18 -2
- package/dist/utils/form-control-classes.js +4 -3
- package/dist/utils/form-control-classes.js.map +1 -1
- package/dist/utils/git-control-bar-classes.cjs +2 -0
- package/dist/utils/git-control-bar-classes.cjs.map +1 -0
- package/dist/utils/git-control-bar-classes.d.ts +4 -0
- package/dist/utils/git-control-bar-classes.js +14 -0
- package/dist/utils/git-control-bar-classes.js.map +1 -0
- package/dist/utils/handle-event-for-ui.cjs.map +1 -1
- package/dist/utils/handle-event-for-ui.d.ts +6 -3
- package/dist/utils/handle-event-for-ui.js.map +1 -1
- package/dist/utils/mobile-top-bar-icon-button-classes.cjs +1 -1
- package/dist/utils/mobile-top-bar-icon-button-classes.cjs.map +1 -1
- package/dist/utils/mobile-top-bar-icon-button-classes.js +3 -3
- package/dist/utils/mobile-top-bar-icon-button-classes.js.map +1 -1
- package/dist/utils/modal-classes.cjs +2 -0
- package/dist/utils/modal-classes.cjs.map +1 -0
- package/dist/utils/modal-classes.d.ts +8 -0
- package/dist/utils/modal-classes.js +7 -0
- package/dist/utils/modal-classes.js.map +1 -0
- package/dist/utils/openhands-llm.cjs +2 -0
- package/dist/utils/openhands-llm.cjs.map +1 -0
- package/dist/utils/openhands-llm.d.ts +2 -0
- package/dist/utils/openhands-llm.js +9 -0
- package/dist/utils/openhands-llm.js.map +1 -0
- package/dist/utils/redact-custom-secrets.cjs +2 -0
- package/dist/utils/redact-custom-secrets.cjs.map +1 -0
- package/dist/utils/redact-custom-secrets.d.ts +6 -0
- package/dist/utils/redact-custom-secrets.js +10 -0
- package/dist/utils/redact-custom-secrets.js.map +1 -0
- package/dist/utils/status.cjs +1 -1
- package/dist/utils/status.cjs.map +1 -1
- package/dist/utils/status.d.ts +2 -1
- package/dist/utils/status.js +9 -8
- package/dist/utils/status.js.map +1 -1
- package/dist/utils/system-message-adapter.cjs +1 -1
- package/dist/utils/system-message-adapter.cjs.map +1 -1
- package/dist/utils/system-message-adapter.js +10 -7
- package/dist/utils/system-message-adapter.js.map +1 -1
- package/dist/utils/utils.cjs +1 -1
- package/dist/utils/utils.cjs.map +1 -1
- package/dist/utils/utils.d.ts +2 -1
- package/dist/utils/utils.js +21 -20
- package/dist/utils/utils.js.map +1 -1
- package/package.json +1 -1
- package/scripts/dev-safe.mjs +3 -1
- package/scripts/dev-static.mjs +2 -2
- package/scripts/dev-with-automation.mjs +283 -108
- package/scripts/static-build.mjs +20 -19
- package/scripts/static-server.mjs +50 -3
- package/build/assets/acp-providers-CbiRekh9.js +0 -1
- package/build/assets/active-backend-context-cCM1vYYZ.js +0 -1
- package/build/assets/add-backend-modal-DIUQzMPa.js +0 -1
- package/build/assets/agent-server-client-options-Bc5ZorQZ.js +0 -1
- package/build/assets/agent-server-compatibility-BlkUsrX2.js +0 -1
- package/build/assets/agent-server-conversation-service.api-C2V5SlHu.js +0 -5
- package/build/assets/api-key-entry-screen-B2gynaCp.js +0 -1
- package/build/assets/automation-detail-DJvbVSYK.js +0 -1
- package/build/assets/automations-list-6FDbI5dc.js +0 -1
- package/build/assets/backend-form-modal-Dnk33xA_.js +0 -1
- package/build/assets/base-modal-_dYTw1ri.js +0 -1
- package/build/assets/brand-button-Br7f0kZJ.js +0 -1
- package/build/assets/browser-store-Couc4S5D.js +0 -1
- package/build/assets/clock-BRjCgHTc.js +0 -1
- package/build/assets/combobox-caret-to1O8irE.js +0 -1
- package/build/assets/context-menu-list-item-CWNFpuiC.js +0 -1
- package/build/assets/conversation-DVrKU0oz.js +0 -19
- package/build/assets/conversation-Dlys-D5A.js +0 -1
- package/build/assets/conversation-panel-iF09WjZ4.js +0 -1
- package/build/assets/conversation-service.api-CCfztilW.js +0 -1
- package/build/assets/conversation-state-store-u5jepov0.js +0 -1
- package/build/assets/conversation-store-Z5iMCRpc.js +0 -1
- package/build/assets/conversation-websocket-context-DhJhqUna.js +0 -3
- package/build/assets/declaration-BNMqORFE.js +0 -1
- package/build/assets/dist-BxBP7tFD.js +0 -1
- package/build/assets/edit-automation-modal-BGzR3nfZ.js +0 -1
- package/build/assets/ellipsis-button-ZyLMPURn.js +0 -1
- package/build/assets/entry.client-1VMHpktY.js +0 -2
- package/build/assets/enum-filter-dropdown-CEgCdu4A.js +0 -1
- package/build/assets/extensions-hub-C651jsVh.js +0 -1
- package/build/assets/files-tab-R5z0lLdY.js +0 -1
- package/build/assets/files-tab-store-CDyVTXNT.js +0 -1
- package/build/assets/git-control-bar-branch-button-COdRAYHb.js +0 -27
- package/build/assets/git-provider-icon-BzLbc0yC.js +0 -1
- package/build/assets/home-e-egNUXZ.js +0 -1
- package/build/assets/install-server-modal-DHlbgqVH.js +0 -1
- package/build/assets/launch-CshDse3e.js +0 -1
- package/build/assets/link-external-D2POYx4c.js +0 -1
- package/build/assets/llm-settings-Bql-vydt.js +0 -1
- package/build/assets/llm-settings-C_tal6Ds.js +0 -1
- package/build/assets/manage-backends-modal-l7RkKfwX.js +0 -1
- package/build/assets/manage-workspaces-modal-DhKF_8z3.js +0 -1
- package/build/assets/manifest-3bf30d69.js +0 -1
- package/build/assets/mcp-ByeBfdfU.js +0 -9
- package/build/assets/messages-D0rWot7s.js +0 -36
- package/build/assets/proxy-CxydCnis.js +0 -1
- package/build/assets/root-DHeCXo9N.css +0 -1
- package/build/assets/root-layout-Czo9Ma6Q.js +0 -2
- package/build/assets/secrets-service-BsnKFc2x.js +0 -1
- package/build/assets/secrets-settings-Bz_UohPJ.js +0 -1
- package/build/assets/settings-client-C73C7IgV.js +0 -1
- package/build/assets/settings-index-Dz0BmdJD.js +0 -1
- package/build/assets/settings-list-classes-Bf80tWtc.js +0 -1
- package/build/assets/settings-modal-Brzgh5Yw.js +0 -1
- package/build/assets/settings-service.api-CZ3uWx4v.js +0 -1
- package/build/assets/sidebar-mobile-menu-toggle-Do_aA9Zm.js +0 -1
- package/build/assets/skills-settings-DlA5hlXw.js +0 -2
- package/build/assets/status-hp6M6E7E.js +0 -1
- package/build/assets/use-agent-settings-schema-33Un7UF2.js +0 -1
- package/build/assets/use-is-authed-BggE5wPj.js +0 -1
- package/build/assets/use-llm-profiles-DDOol3gK.js +0 -1
- package/build/assets/use-runtime-is-ready-B7EF4BKU.js +0 -1
- package/build/assets/use-settings-DQIZmIov.js +0 -1
- package/build/assets/use-user-conversation-C6hrMMtn.js +0 -1
- package/build/assets/utils-i18rdUj2.js +0 -1
- package/build/assets/vendor~conversation-panel~conversation-a9SyrrhV.js +0 -1
- package/build/assets/vendor~conversation-panel~conversation~index-C23ZXO4R.js +0 -1
- package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-BebWhFNT.js +0 -1
- package/build/assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-DzIXV3Ui.js +0 -9
- /package/build/assets/{automation-IdgZq6ZK.js → automation-XDPAjiZi.js} +0 -0
- /package/build/assets/{color-themes-DSaoIL6A.js → color-themes-B9pm9c-R.js} +0 -0
- /package/build/assets/{common-DR1t-EeP.js → common-DqjLSBOt.js} +0 -0
- /package/build/assets/{conversation-local-storage-UYl-SX-r.js → conversation-local-storage-YmOVXxxW.js} +0 -0
- /package/build/assets/{dist-C6t0EXL7.js → dist-C3NfioQC.js} +0 -0
- /package/build/assets/{environment-switch-store-C4ulFJKp.js → environment-switch-store-CiurvTtK.js} +0 -0
- /package/build/assets/{health-store-BDC2rM-X.js → health-store-B5f0S2FY.js} +0 -0
- /package/build/assets/{map-provider-COBVzZYo.js → map-provider-BJ_8KZKU.js} +0 -0
- /package/build/assets/{middleware-BC9EwbB9.js → middleware-CfatjPYZ.js} +0 -0
- /package/build/assets/{objectWithoutPropertiesLoose-Du6eBn-V.js → objectWithoutPropertiesLoose-DSQKyRhw.js} +0 -0
- /package/build/assets/{react-Do0CT17Y.js → react-Dy05vyj5.js} +0 -0
- /package/build/assets/{sdk-settings-field-metadata-CBPmeqYa.js → sdk-settings-field-metadata-DQiaIBie.js} +0 -0
- /package/build/assets/{settings-D_H-qsRm.js → settings-DGY6n4J2.js} +0 -0
- /package/build/assets/{settings-like-page-layout-classes-I0BDBEoq.js → settings-like-page-layout-classes-D7YjdTd0.js} +0 -0
- /package/build/assets/{use-breakpoint-DbJ6FkQ-.js → use-breakpoint-DF_RiQ6s.js} +0 -0
- /package/build/assets/{use-click-outside-element-DffgWWoZ.js → use-click-outside-element-DhxCUyWl.js} +0 -0
- /package/build/assets/{v4-CNn21NXa.js → v4-khGvL7i2.js} +0 -0
- /package/build/assets/{vendor~browser-DDiZgqD3.js → vendor~browser-DisFGEp9.js} +0 -0
- /package/build/assets/{vendor~browser-tab-BgwV1mxF.js → vendor~browser-tab-BxhTtM9_.js} +0 -0
- /package/build/assets/{vendor~conversation-panel~conversation~alert-banner-DbvX3OcM.js → vendor~conversation-panel~conversation~alert-banner-w-I2sY6c.js} +0 -0
- /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~zm51vy4j-iOsylxCS.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~zm51vy4j-BClAMeFe.js} +0 -0
- /package/build/assets/{vendor~files-tab-BGKayPiK.js → vendor~files-tab-BtkpAiMX.js} +0 -0
- /package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BW6261Sb.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CyZ-3lDQ.js} +0 -0
- /package/build/assets/{vendor~home~mcp~automations-list-DoPfwaXj.js → vendor~home~mcp~automations-list-BgV86Sti.js} +0 -0
- /package/build/assets/{vendor~launch-vdeRTWFu.js → vendor~launch-BXgl67Re.js} +0 -0
- /package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~ninslayh-D9P8e98a.js → vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~ninslayh-CLlsvdNP.js} +0 -0
- /package/build/assets/{vendor~terminal-DUrOWGFE.js → vendor~terminal-DZaJIY8A.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","names":[],"sources":["../../../src/api/backend-registry/auth.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"auth.js","names":[],"sources":["../../../src/api/backend-registry/auth.ts"],"sourcesContent":["import type { Backend } from \"./types\";\n\n/**\n * Build the auth headers to send to a backend.\n *\n * Local agent-server uses `X-Session-API-Key`. Cloud expects a bearer\n * token in the `Authorization` header.\n */\nexport function buildAuthHeaders(backend: Backend): Record<string, string> {\n if (!backend.apiKey) return {};\n\n if (backend.kind === \"cloud\") {\n return { Authorization: `Bearer ${backend.apiKey}` };\n }\n\n return { \"X-Session-API-Key\": backend.apiKey };\n}\n"],"mappings":";AAQA,SAAgB,EAAiB,GAA0C;AAOzE,QANK,EAAQ,SAET,EAAQ,SAAS,UACZ,EAAE,eAAe,UAAU,EAAQ,UAAU,GAG/C,EAAE,qBAAqB,EAAQ,QAAQ,GANlB,EAAE"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../agent-server-config.cjs`);var t=`default-local`,n=`Local`;function r(){return{id:t,name:n,host:
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../agent-server-config.cjs`);var t=`default-local`,n=`Local`;function r(){let r=e.getAgentServerBaseUrl(),i=e.getAgentServerSessionApiKey();return!r||!i?null:{id:t,name:n,host:r,apiKey:i,kind:`local`}}exports.DEFAULT_LOCAL_BACKEND_ID=t,exports.DEFAULT_LOCAL_BACKEND_NAME=n,exports.makeDefaultLocalBackend=r;
|
|
2
2
|
//# sourceMappingURL=default-backend.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-backend.cjs","names":[],"sources":["../../../src/api/backend-registry/default-backend.ts"],"sourcesContent":["import {\n getAgentServerBaseUrl,\n getAgentServerSessionApiKey,\n} from \"../agent-server-config\";\nimport type { Backend } from \"./types\";\n\n/**\n * Stable id for the default local backend that is auto-seeded into the\n * registry
|
|
1
|
+
{"version":3,"file":"default-backend.cjs","names":[],"sources":["../../../src/api/backend-registry/default-backend.ts"],"sourcesContent":["import {\n getAgentServerBaseUrl,\n getAgentServerSessionApiKey,\n} from \"../agent-server-config\";\nimport type { Backend } from \"./types\";\n\n/**\n * Stable id for the default local backend that is auto-seeded into the\n * registry when the launcher provides both a backend host and API key.\n * After seeding, this backend is a normal registered entry — the user can\n * rename it, edit its host/api key, or remove it like any other backend.\n */\nexport const DEFAULT_LOCAL_BACKEND_ID = \"default-local\";\n\nexport const DEFAULT_LOCAL_BACKEND_NAME = \"Local\";\n\n/**\n * Construct the default local backend from environment/runtime config.\n * Returns null unless both a backend location and API key are available.\n *\n * Used as the seed entry written to `openhands-backends` on first load;\n * if it returns null, onboarding is responsible for collecting backend\n * connection details from the user.\n */\nexport function makeDefaultLocalBackend(): Backend | null {\n const host = getAgentServerBaseUrl();\n const apiKey = getAgentServerSessionApiKey();\n\n if (!host || !apiKey) return null;\n\n return {\n id: DEFAULT_LOCAL_BACKEND_ID,\n name: DEFAULT_LOCAL_BACKEND_NAME,\n host,\n apiKey,\n kind: \"local\",\n };\n}\n"],"mappings":"8FAYA,IAAa,EAA2B,gBAE3B,EAA6B,QAU1C,SAAgB,GAA0C,CACxD,IAAM,EAAO,EAAA,uBAAuB,CAC9B,EAAS,EAAA,6BAA6B,CAI5C,MAFI,CAAC,GAAQ,CAAC,EAAe,KAEtB,CACL,GAAI,EACJ,KAAM,EACN,OACA,SACA,KAAM,QACP"}
|
|
@@ -1,25 +1,18 @@
|
|
|
1
1
|
import type { Backend } from "./types";
|
|
2
2
|
/**
|
|
3
3
|
* Stable id for the default local backend that is auto-seeded into the
|
|
4
|
-
* registry
|
|
5
|
-
*
|
|
6
|
-
* remove it like any other backend.
|
|
7
|
-
*
|
|
8
|
-
* The id is also used by `saveAgentServerConfig` to keep the registry
|
|
9
|
-
* entry in sync with the legacy `openhands-agent-server-config` storage
|
|
10
|
-
* that the recovery / agent-server settings page edits.
|
|
4
|
+
* registry when the launcher provides both a backend host and API key.
|
|
5
|
+
* After seeding, this backend is a normal registered entry — the user can
|
|
6
|
+
* rename it, edit its host/api key, or remove it like any other backend.
|
|
11
7
|
*/
|
|
12
8
|
export declare const DEFAULT_LOCAL_BACKEND_ID = "default-local";
|
|
13
9
|
export declare const DEFAULT_LOCAL_BACKEND_NAME = "Local";
|
|
14
10
|
/**
|
|
15
|
-
* Construct the default local backend from environment
|
|
16
|
-
*
|
|
17
|
-
* `openhands-agent-server-config` localStorage overrides).
|
|
11
|
+
* Construct the default local backend from environment/runtime config.
|
|
12
|
+
* Returns null unless both a backend location and API key are available.
|
|
18
13
|
*
|
|
19
|
-
* Used
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* registry has no local backend at all (e.g. the user removed
|
|
23
|
-
* every entry). The synthetic fallback is never persisted.
|
|
14
|
+
* Used as the seed entry written to `openhands-backends` on first load;
|
|
15
|
+
* if it returns null, onboarding is responsible for collecting backend
|
|
16
|
+
* connection details from the user.
|
|
24
17
|
*/
|
|
25
|
-
export declare function makeDefaultLocalBackend(): Backend;
|
|
18
|
+
export declare function makeDefaultLocalBackend(): Backend | null;
|
|
@@ -2,15 +2,16 @@ import { getAgentServerBaseUrl as e, getAgentServerSessionApiKey as t } from "..
|
|
|
2
2
|
//#region src/api/backend-registry/default-backend.ts
|
|
3
3
|
var n = "default-local", r = "Local";
|
|
4
4
|
function i() {
|
|
5
|
-
|
|
5
|
+
let i = e(), a = t();
|
|
6
|
+
return !i || !a ? null : {
|
|
6
7
|
id: n,
|
|
7
8
|
name: r,
|
|
8
|
-
host:
|
|
9
|
-
apiKey:
|
|
9
|
+
host: i,
|
|
10
|
+
apiKey: a,
|
|
10
11
|
kind: "local"
|
|
11
12
|
};
|
|
12
13
|
}
|
|
13
14
|
//#endregion
|
|
14
|
-
export { n as DEFAULT_LOCAL_BACKEND_ID, i as makeDefaultLocalBackend };
|
|
15
|
+
export { n as DEFAULT_LOCAL_BACKEND_ID, r as DEFAULT_LOCAL_BACKEND_NAME, i as makeDefaultLocalBackend };
|
|
15
16
|
|
|
16
17
|
//# sourceMappingURL=default-backend.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-backend.js","names":[],"sources":["../../../src/api/backend-registry/default-backend.ts"],"sourcesContent":["import {\n getAgentServerBaseUrl,\n getAgentServerSessionApiKey,\n} from \"../agent-server-config\";\nimport type { Backend } from \"./types\";\n\n/**\n * Stable id for the default local backend that is auto-seeded into the\n * registry
|
|
1
|
+
{"version":3,"file":"default-backend.js","names":[],"sources":["../../../src/api/backend-registry/default-backend.ts"],"sourcesContent":["import {\n getAgentServerBaseUrl,\n getAgentServerSessionApiKey,\n} from \"../agent-server-config\";\nimport type { Backend } from \"./types\";\n\n/**\n * Stable id for the default local backend that is auto-seeded into the\n * registry when the launcher provides both a backend host and API key.\n * After seeding, this backend is a normal registered entry — the user can\n * rename it, edit its host/api key, or remove it like any other backend.\n */\nexport const DEFAULT_LOCAL_BACKEND_ID = \"default-local\";\n\nexport const DEFAULT_LOCAL_BACKEND_NAME = \"Local\";\n\n/**\n * Construct the default local backend from environment/runtime config.\n * Returns null unless both a backend location and API key are available.\n *\n * Used as the seed entry written to `openhands-backends` on first load;\n * if it returns null, onboarding is responsible for collecting backend\n * connection details from the user.\n */\nexport function makeDefaultLocalBackend(): Backend | null {\n const host = getAgentServerBaseUrl();\n const apiKey = getAgentServerSessionApiKey();\n\n if (!host || !apiKey) return null;\n\n return {\n id: DEFAULT_LOCAL_BACKEND_ID,\n name: DEFAULT_LOCAL_BACKEND_NAME,\n host,\n apiKey,\n kind: \"local\",\n };\n}\n"],"mappings":";;AAYA,IAAa,IAA2B,iBAE3B,IAA6B;AAU1C,SAAgB,IAA0C;CACxD,IAAM,IAAO,GAAuB,EAC9B,IAAS,GAA6B;AAI5C,QAFI,CAAC,KAAQ,CAAC,IAAe,OAEtB;EACL,IAAI;EACJ,MAAM;EACN;EACA;EACA,MAAM;EACP"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`./default-backend.cjs`);var t=`openhands-backends`,n=`openhands-active-backend`,r=`openhands-agent-server-config`;function i(e){return e===`local`||e===`cloud`}function a(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.id==`string`&&t.id.length>0&&typeof t.name==`string`&&typeof t.host==`string`&&typeof t.apiKey==`string`&&i(t.kind)}function o(e){if(typeof e!=`string`)return null;let t=e.trim().replace(/\/+$/,``);return t?/^https?:\/\//i.test(t)?t:`http://${t}`:null}function s(){let t=window.localStorage.getItem(r);if(!t)return null;try{let n=JSON.parse(t),r=o(n.baseUrl),i=typeof n.sessionApiKey==`string`?n.sessionApiKey.trim():``;return!r||!i?null:{id:e.DEFAULT_LOCAL_BACKEND_ID,name:e.DEFAULT_LOCAL_BACKEND_NAME,host:r,apiKey:i,kind:`local`}}catch{return null}}function c(){window.localStorage.removeItem(r)}function l(e){return p(e),c(),e}function u(e){try{let{hostname:t}=new URL(e);return t===`localhost`||t===`127.0.0.1`||t===`::1`||t===`[::1]`}catch{return!1}}function d(e,t){return e.id!==`default-local`||e.kind!==`local`?!1:e.host===t.host||u(e.host)&&u(t.host)}function f(t){let n=e.makeDefaultLocalBackend();if(!n)return t;let r=!1,i=t.map(e=>!d(e,n)||e.apiKey===n.apiKey?e:(r=!0,{...e,apiKey:n.apiKey}));return r?(p(i),i):t}function p(e){if(!(typeof window>`u`))try{window.localStorage.setItem(t,JSON.stringify(e))}catch{}}function m(){if(typeof window>`u`)return[];try{let n=window.localStorage.getItem(t);if(n===null){let t=s();if(t)return l([t]);let n=e.makeDefaultLocalBackend();return n?l([n]):[]}let r=JSON.parse(n);if(!Array.isArray(r))return[];let i=r.filter(a);if(i.length===0){let t=e.makeDefaultLocalBackend();return t?l([t]):[]}let o=f(i);return c(),o}catch{return[]}}function h(){if(typeof window>`u`)return null;try{let e=window.localStorage.getItem(n);if(!e)return null;let t=JSON.parse(e);if(typeof t!=`object`||!t||typeof t.backendId!=`string`)return null;let r=t.orgId;return{backendId:t.backendId,orgId:typeof r==`string`&&r.length>0?r:null}}catch{return null}}function g(e){if(!(typeof window>`u`))try{if(!e){window.localStorage.removeItem(n);return}window.localStorage.setItem(n,JSON.stringify({backendId:e.backendId,orgId:e.orgId??null}))}catch{}}exports.readStoredActiveBackend=h,exports.readStoredBackends=m,exports.writeStoredActiveBackend=g,exports.writeStoredBackends=p;
|
|
2
2
|
//# sourceMappingURL=storage.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.cjs","names":[],"sources":["../../../src/api/backend-registry/storage.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"storage.cjs","names":[],"sources":["../../../src/api/backend-registry/storage.ts"],"sourcesContent":["import {\n DEFAULT_LOCAL_BACKEND_ID,\n DEFAULT_LOCAL_BACKEND_NAME,\n makeDefaultLocalBackend,\n} from \"./default-backend\";\nimport type { Backend, BackendKind, BackendSelection } from \"./types\";\n\nexport const BACKENDS_STORAGE_KEY = \"openhands-backends\";\nexport const ACTIVE_BACKEND_STORAGE_KEY = \"openhands-active-backend\";\n\nconst LEGACY_AGENT_SERVER_CONFIG_STORAGE_KEY = \"openhands-agent-server-config\";\n\nfunction isValidKind(value: unknown): value is BackendKind {\n return value === \"local\" || value === \"cloud\";\n}\n\nfunction isValidBackend(value: unknown): value is Backend {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Partial<Backend>;\n return (\n typeof v.id === \"string\" &&\n v.id.length > 0 &&\n typeof v.name === \"string\" &&\n typeof v.host === \"string\" &&\n typeof v.apiKey === \"string\" &&\n isValidKind(v.kind)\n );\n}\n\nfunction normalizeLegacyBaseUrl(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim().replace(/\\/+$/, \"\");\n if (!trimmed) return null;\n if (/^https?:\\/\\//i.test(trimmed)) return trimmed;\n return `http://${trimmed}`;\n}\n\nfunction readLegacyBackend(): Backend | null {\n const raw = window.localStorage.getItem(\n LEGACY_AGENT_SERVER_CONFIG_STORAGE_KEY,\n );\n if (!raw) return null;\n\n try {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const host = normalizeLegacyBaseUrl(parsed.baseUrl);\n const apiKey =\n typeof parsed.sessionApiKey === \"string\"\n ? parsed.sessionApiKey.trim()\n : \"\";\n\n if (!host || !apiKey) return null;\n\n return {\n id: DEFAULT_LOCAL_BACKEND_ID,\n name: DEFAULT_LOCAL_BACKEND_NAME,\n host,\n apiKey,\n kind: \"local\",\n };\n } catch {\n return null;\n }\n}\n\nfunction clearLegacyBackendConfig(): void {\n window.localStorage.removeItem(LEGACY_AGENT_SERVER_CONFIG_STORAGE_KEY);\n}\n\nfunction seedBackends(backends: Backend[]): Backend[] {\n writeStoredBackends(backends);\n clearLegacyBackendConfig();\n return backends;\n}\n\nfunction isLoopbackUrl(value: string): boolean {\n try {\n const { hostname } = new URL(value);\n return (\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"::1\" ||\n hostname === \"[::1]\"\n );\n } catch {\n return false;\n }\n}\n\nfunction shouldSyncLauncherDefaultLocalBackend(\n backend: Backend,\n defaultBackend: Backend,\n): boolean {\n if (backend.id !== DEFAULT_LOCAL_BACKEND_ID || backend.kind !== \"local\") {\n return false;\n }\n\n return (\n backend.host === defaultBackend.host ||\n (isLoopbackUrl(backend.host) && isLoopbackUrl(defaultBackend.host))\n );\n}\n\nfunction syncLauncherDefaultLocalBackend(backends: Backend[]): Backend[] {\n const defaultBackend = makeDefaultLocalBackend();\n if (!defaultBackend) return backends;\n\n let didSync = false;\n const syncedBackends = backends.map((backend) => {\n if (!shouldSyncLauncherDefaultLocalBackend(backend, defaultBackend)) {\n return backend;\n }\n\n if (backend.apiKey === defaultBackend.apiKey) return backend;\n\n didSync = true;\n return {\n ...backend,\n apiKey: defaultBackend.apiKey,\n };\n });\n\n if (!didSync) return backends;\n\n writeStoredBackends(syncedBackends);\n return syncedBackends;\n}\n\nexport function writeStoredBackends(backends: Backend[]): void {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(BACKENDS_STORAGE_KEY, JSON.stringify(backends));\n } catch {\n /* ignore quota / serialization errors */\n }\n}\n\nexport function readStoredBackends(): Backend[] {\n if (typeof window === \"undefined\") return [];\n\n try {\n const raw = window.localStorage.getItem(BACKENDS_STORAGE_KEY);\n\n // First install: migrate one legacy local backend if present, otherwise\n // seed only when the launcher supplied enough information for a usable\n // local backend.\n if (raw === null) {\n const legacyBackend = readLegacyBackend();\n if (legacyBackend) return seedBackends([legacyBackend]);\n\n const defaultBackend = makeDefaultLocalBackend();\n if (!defaultBackend) return [];\n\n return seedBackends([defaultBackend]);\n }\n\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return [];\n const valid = parsed.filter(isValidBackend);\n\n // If the stored array is empty (or everything in it failed validation),\n // only re-seed when the launcher supplied both a host and API key.\n if (valid.length === 0) {\n const defaultBackend = makeDefaultLocalBackend();\n if (!defaultBackend) return [];\n\n return seedBackends([defaultBackend]);\n }\n\n const synced = syncLauncherDefaultLocalBackend(valid);\n clearLegacyBackendConfig();\n return synced;\n } catch {\n return [];\n }\n}\n\nexport function readStoredActiveBackend(): BackendSelection | null {\n if (typeof window === \"undefined\") return null;\n try {\n const raw = window.localStorage.getItem(ACTIVE_BACKEND_STORAGE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n typeof (parsed as BackendSelection).backendId !== \"string\"\n ) {\n return null;\n }\n const orgIdRaw = (parsed as BackendSelection).orgId;\n return {\n backendId: (parsed as BackendSelection).backendId,\n orgId:\n typeof orgIdRaw === \"string\" && orgIdRaw.length > 0 ? orgIdRaw : null,\n };\n } catch {\n return null;\n }\n}\n\nexport function writeStoredActiveBackend(\n selection: BackendSelection | null,\n): void {\n if (typeof window === \"undefined\") return;\n try {\n if (!selection) {\n window.localStorage.removeItem(ACTIVE_BACKEND_STORAGE_KEY);\n return;\n }\n window.localStorage.setItem(\n ACTIVE_BACKEND_STORAGE_KEY,\n JSON.stringify({\n backendId: selection.backendId,\n orgId: selection.orgId ?? null,\n }),\n );\n } catch {\n /* ignore */\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,60 +1,93 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { makeDefaultLocalBackend as t } from "./default-backend.js";
|
|
1
|
+
import { DEFAULT_LOCAL_BACKEND_ID as e, DEFAULT_LOCAL_BACKEND_NAME as t, makeDefaultLocalBackend as n } from "./default-backend.js";
|
|
3
2
|
//#region src/api/backend-registry/storage.ts
|
|
4
|
-
var
|
|
5
|
-
function
|
|
3
|
+
var r = "openhands-backends", i = "openhands-active-backend", a = "openhands-agent-server-config";
|
|
4
|
+
function o(e) {
|
|
6
5
|
return e === "local" || e === "cloud";
|
|
7
6
|
}
|
|
8
|
-
function
|
|
7
|
+
function s(e) {
|
|
9
8
|
if (typeof e != "object" || !e) return !1;
|
|
10
9
|
let t = e;
|
|
11
|
-
return typeof t.id == "string" && t.id.length > 0 && typeof t.name == "string" && typeof t.host == "string" && typeof t.apiKey == "string" &&
|
|
10
|
+
return typeof t.id == "string" && t.id.length > 0 && typeof t.name == "string" && typeof t.host == "string" && typeof t.apiKey == "string" && o(t.kind);
|
|
12
11
|
}
|
|
13
|
-
function
|
|
12
|
+
function c(e) {
|
|
13
|
+
if (typeof e != "string") return null;
|
|
14
|
+
let t = e.trim().replace(/\/+$/, "");
|
|
15
|
+
return t ? /^https?:\/\//i.test(t) ? t : `http://${t}` : null;
|
|
16
|
+
}
|
|
17
|
+
function l() {
|
|
18
|
+
let n = window.localStorage.getItem(a);
|
|
19
|
+
if (!n) return null;
|
|
14
20
|
try {
|
|
15
|
-
|
|
21
|
+
let r = JSON.parse(n), i = c(r.baseUrl), a = typeof r.sessionApiKey == "string" ? r.sessionApiKey.trim() : "";
|
|
22
|
+
return !i || !a ? null : {
|
|
23
|
+
id: e,
|
|
24
|
+
name: t,
|
|
25
|
+
host: i,
|
|
26
|
+
apiKey: a,
|
|
27
|
+
kind: "local"
|
|
28
|
+
};
|
|
16
29
|
} catch {
|
|
17
|
-
return
|
|
30
|
+
return null;
|
|
18
31
|
}
|
|
19
32
|
}
|
|
20
|
-
function
|
|
21
|
-
|
|
22
|
-
|
|
33
|
+
function u() {
|
|
34
|
+
window.localStorage.removeItem(a);
|
|
35
|
+
}
|
|
36
|
+
function d(e) {
|
|
37
|
+
return h(e), u(), e;
|
|
38
|
+
}
|
|
39
|
+
function f(e) {
|
|
40
|
+
try {
|
|
41
|
+
let { hostname: t } = new URL(e);
|
|
42
|
+
return t === "localhost" || t === "127.0.0.1" || t === "::1" || t === "[::1]";
|
|
43
|
+
} catch {
|
|
44
|
+
return !1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function p(e, t) {
|
|
48
|
+
return e.id !== "default-local" || e.kind !== "local" ? !1 : e.host === t.host || f(e.host) && f(t.host);
|
|
49
|
+
}
|
|
50
|
+
function m(e) {
|
|
51
|
+
let t = n();
|
|
52
|
+
if (!t) return e;
|
|
53
|
+
let r = !1, i = e.map((e) => !p(e, t) || e.apiKey === t.apiKey ? e : (r = !0, {
|
|
23
54
|
...e,
|
|
24
|
-
apiKey:
|
|
25
|
-
};
|
|
55
|
+
apiKey: t.apiKey
|
|
56
|
+
}));
|
|
57
|
+
return r ? (h(i), i) : e;
|
|
26
58
|
}
|
|
27
|
-
function
|
|
59
|
+
function h(e) {
|
|
28
60
|
if (!(typeof window > "u")) try {
|
|
29
|
-
window.localStorage.setItem(
|
|
61
|
+
window.localStorage.setItem(r, JSON.stringify(e));
|
|
30
62
|
} catch {}
|
|
31
63
|
}
|
|
32
|
-
function
|
|
64
|
+
function g() {
|
|
33
65
|
if (typeof window > "u") return [];
|
|
34
|
-
e();
|
|
35
66
|
try {
|
|
36
|
-
let e = window.localStorage.getItem(
|
|
67
|
+
let e = window.localStorage.getItem(r);
|
|
37
68
|
if (e === null) {
|
|
38
|
-
let e =
|
|
39
|
-
|
|
69
|
+
let e = l();
|
|
70
|
+
if (e) return d([e]);
|
|
71
|
+
let t = n();
|
|
72
|
+
return t ? d([t]) : [];
|
|
40
73
|
}
|
|
41
|
-
let
|
|
42
|
-
if (!Array.isArray(
|
|
43
|
-
let i =
|
|
74
|
+
let t = JSON.parse(e);
|
|
75
|
+
if (!Array.isArray(t)) return [];
|
|
76
|
+
let i = t.filter(s);
|
|
44
77
|
if (i.length === 0) {
|
|
45
|
-
let e =
|
|
46
|
-
return
|
|
78
|
+
let e = n();
|
|
79
|
+
return e ? d([e]) : [];
|
|
47
80
|
}
|
|
48
|
-
let
|
|
49
|
-
return
|
|
81
|
+
let a = m(i);
|
|
82
|
+
return u(), a;
|
|
50
83
|
} catch {
|
|
51
84
|
return [];
|
|
52
85
|
}
|
|
53
86
|
}
|
|
54
|
-
function
|
|
87
|
+
function _() {
|
|
55
88
|
if (typeof window > "u") return null;
|
|
56
89
|
try {
|
|
57
|
-
let e = window.localStorage.getItem(
|
|
90
|
+
let e = window.localStorage.getItem(i);
|
|
58
91
|
if (!e) return null;
|
|
59
92
|
let t = JSON.parse(e);
|
|
60
93
|
if (typeof t != "object" || !t || typeof t.backendId != "string") return null;
|
|
@@ -67,19 +100,19 @@ function u() {
|
|
|
67
100
|
return null;
|
|
68
101
|
}
|
|
69
102
|
}
|
|
70
|
-
function
|
|
103
|
+
function v(e) {
|
|
71
104
|
if (!(typeof window > "u")) try {
|
|
72
105
|
if (!e) {
|
|
73
|
-
window.localStorage.removeItem(
|
|
106
|
+
window.localStorage.removeItem(i);
|
|
74
107
|
return;
|
|
75
108
|
}
|
|
76
|
-
window.localStorage.setItem(
|
|
109
|
+
window.localStorage.setItem(i, JSON.stringify({
|
|
77
110
|
backendId: e.backendId,
|
|
78
111
|
orgId: e.orgId ?? null
|
|
79
112
|
}));
|
|
80
113
|
} catch {}
|
|
81
114
|
}
|
|
82
115
|
//#endregion
|
|
83
|
-
export {
|
|
116
|
+
export { _ as readStoredActiveBackend, g as readStoredBackends, v as writeStoredActiveBackend, h as writeStoredBackends };
|
|
84
117
|
|
|
85
118
|
//# sourceMappingURL=storage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","names":[],"sources":["../../../src/api/backend-registry/storage.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"storage.js","names":[],"sources":["../../../src/api/backend-registry/storage.ts"],"sourcesContent":["import {\n DEFAULT_LOCAL_BACKEND_ID,\n DEFAULT_LOCAL_BACKEND_NAME,\n makeDefaultLocalBackend,\n} from \"./default-backend\";\nimport type { Backend, BackendKind, BackendSelection } from \"./types\";\n\nexport const BACKENDS_STORAGE_KEY = \"openhands-backends\";\nexport const ACTIVE_BACKEND_STORAGE_KEY = \"openhands-active-backend\";\n\nconst LEGACY_AGENT_SERVER_CONFIG_STORAGE_KEY = \"openhands-agent-server-config\";\n\nfunction isValidKind(value: unknown): value is BackendKind {\n return value === \"local\" || value === \"cloud\";\n}\n\nfunction isValidBackend(value: unknown): value is Backend {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Partial<Backend>;\n return (\n typeof v.id === \"string\" &&\n v.id.length > 0 &&\n typeof v.name === \"string\" &&\n typeof v.host === \"string\" &&\n typeof v.apiKey === \"string\" &&\n isValidKind(v.kind)\n );\n}\n\nfunction normalizeLegacyBaseUrl(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim().replace(/\\/+$/, \"\");\n if (!trimmed) return null;\n if (/^https?:\\/\\//i.test(trimmed)) return trimmed;\n return `http://${trimmed}`;\n}\n\nfunction readLegacyBackend(): Backend | null {\n const raw = window.localStorage.getItem(\n LEGACY_AGENT_SERVER_CONFIG_STORAGE_KEY,\n );\n if (!raw) return null;\n\n try {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const host = normalizeLegacyBaseUrl(parsed.baseUrl);\n const apiKey =\n typeof parsed.sessionApiKey === \"string\"\n ? parsed.sessionApiKey.trim()\n : \"\";\n\n if (!host || !apiKey) return null;\n\n return {\n id: DEFAULT_LOCAL_BACKEND_ID,\n name: DEFAULT_LOCAL_BACKEND_NAME,\n host,\n apiKey,\n kind: \"local\",\n };\n } catch {\n return null;\n }\n}\n\nfunction clearLegacyBackendConfig(): void {\n window.localStorage.removeItem(LEGACY_AGENT_SERVER_CONFIG_STORAGE_KEY);\n}\n\nfunction seedBackends(backends: Backend[]): Backend[] {\n writeStoredBackends(backends);\n clearLegacyBackendConfig();\n return backends;\n}\n\nfunction isLoopbackUrl(value: string): boolean {\n try {\n const { hostname } = new URL(value);\n return (\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"::1\" ||\n hostname === \"[::1]\"\n );\n } catch {\n return false;\n }\n}\n\nfunction shouldSyncLauncherDefaultLocalBackend(\n backend: Backend,\n defaultBackend: Backend,\n): boolean {\n if (backend.id !== DEFAULT_LOCAL_BACKEND_ID || backend.kind !== \"local\") {\n return false;\n }\n\n return (\n backend.host === defaultBackend.host ||\n (isLoopbackUrl(backend.host) && isLoopbackUrl(defaultBackend.host))\n );\n}\n\nfunction syncLauncherDefaultLocalBackend(backends: Backend[]): Backend[] {\n const defaultBackend = makeDefaultLocalBackend();\n if (!defaultBackend) return backends;\n\n let didSync = false;\n const syncedBackends = backends.map((backend) => {\n if (!shouldSyncLauncherDefaultLocalBackend(backend, defaultBackend)) {\n return backend;\n }\n\n if (backend.apiKey === defaultBackend.apiKey) return backend;\n\n didSync = true;\n return {\n ...backend,\n apiKey: defaultBackend.apiKey,\n };\n });\n\n if (!didSync) return backends;\n\n writeStoredBackends(syncedBackends);\n return syncedBackends;\n}\n\nexport function writeStoredBackends(backends: Backend[]): void {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(BACKENDS_STORAGE_KEY, JSON.stringify(backends));\n } catch {\n /* ignore quota / serialization errors */\n }\n}\n\nexport function readStoredBackends(): Backend[] {\n if (typeof window === \"undefined\") return [];\n\n try {\n const raw = window.localStorage.getItem(BACKENDS_STORAGE_KEY);\n\n // First install: migrate one legacy local backend if present, otherwise\n // seed only when the launcher supplied enough information for a usable\n // local backend.\n if (raw === null) {\n const legacyBackend = readLegacyBackend();\n if (legacyBackend) return seedBackends([legacyBackend]);\n\n const defaultBackend = makeDefaultLocalBackend();\n if (!defaultBackend) return [];\n\n return seedBackends([defaultBackend]);\n }\n\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return [];\n const valid = parsed.filter(isValidBackend);\n\n // If the stored array is empty (or everything in it failed validation),\n // only re-seed when the launcher supplied both a host and API key.\n if (valid.length === 0) {\n const defaultBackend = makeDefaultLocalBackend();\n if (!defaultBackend) return [];\n\n return seedBackends([defaultBackend]);\n }\n\n const synced = syncLauncherDefaultLocalBackend(valid);\n clearLegacyBackendConfig();\n return synced;\n } catch {\n return [];\n }\n}\n\nexport function readStoredActiveBackend(): BackendSelection | null {\n if (typeof window === \"undefined\") return null;\n try {\n const raw = window.localStorage.getItem(ACTIVE_BACKEND_STORAGE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw);\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n typeof (parsed as BackendSelection).backendId !== \"string\"\n ) {\n return null;\n }\n const orgIdRaw = (parsed as BackendSelection).orgId;\n return {\n backendId: (parsed as BackendSelection).backendId,\n orgId:\n typeof orgIdRaw === \"string\" && orgIdRaw.length > 0 ? orgIdRaw : null,\n };\n } catch {\n return null;\n }\n}\n\nexport function writeStoredActiveBackend(\n selection: BackendSelection | null,\n): void {\n if (typeof window === \"undefined\") return;\n try {\n if (!selection) {\n window.localStorage.removeItem(ACTIVE_BACKEND_STORAGE_KEY);\n return;\n }\n window.localStorage.setItem(\n ACTIVE_BACKEND_STORAGE_KEY,\n JSON.stringify({\n backendId: selection.backendId,\n orgId: selection.orgId ?? null,\n }),\n );\n } catch {\n /* ignore */\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-service.api.cjs","names":[],"sources":["../../../src/api/cloud/conversation-service.api.ts"],"sourcesContent":["import { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { getStoredConversationMetadata } from \"../conversation-metadata-store\";\nimport type {\n AppConversation,\n AppConversationPage,\n AppConversationStartRequest,\n AppConversationStartTask,\n} from \"../conversation-service/agent-server-conversation-service.types\";\nimport { callCloudProxy } from \"./proxy\";\n\n/**\n * The cloud backend does not always echo `selected_repository` /\n * `selected_branch` / `git_provider` back from\n * `GET /api/v1/app-conversations` until its own background hydration\n * completes. We persist the selection to local storage at connect time\n * (see `AgentServerConversationService.updateConversationRepository`)\n * and overlay it here so the chat-page git control bar reflects the\n * connection immediately, instead of snapping back to the empty\n * \"Connect Repo\" state on every refetch.\n *\n * Server values take precedence whenever they're populated; the\n * local-storage fallback only fills in fields the server returned as\n * `null`/`undefined`.\n */\nfunction overlayStoredRepoSelection(\n conversation: AppConversation | null,\n): AppConversation | null {\n if (!conversation?.id) return conversation;\n const stored = getStoredConversationMetadata(conversation.id);\n if (!stored) return conversation;\n\n return {\n ...conversation,\n selected_repository:\n conversation.selected_repository ?? stored.selected_repository ?? null,\n selected_branch:\n conversation.selected_branch ?? stored.selected_branch ?? null,\n git_provider: conversation.git_provider ?? stored.git_provider ?? null,\n selected_workspace:\n conversation.selected_workspace ?? stored.selected_workspace ?? null,\n };\n}\n\nfunction getActiveCloudBackend(): Backend {\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\"Cloud conversations call requires a cloud backend.\");\n }\n return active;\n}\n\n/**\n * Search the cloud app-conversations list. Mirrors the local\n * `AgentServerConversationService.searchConversations` interface but routes\n * through the bundled agent-server's cloud proxy and hits the cloud\n * endpoint `/api/v1/app-conversations/search`.\n */\nexport async function searchCloudConversations(\n limit: number = 20,\n pageId?: string,\n): Promise<AppConversationPage> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"limit\", String(limit));\n if (pageId) params.set(\"page_id\", pageId);\n params.set(\"sort_order\", \"UPDATED_AT_DESC\");\n\n const data = await callCloudProxy<{\n items: AppConversation[];\n next_page_id: string | null;\n }>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/search?${params.toString()}`,\n });\n\n return {\n items: (data?.items ?? []).map(\n (item) => overlayStoredRepoSelection(item) as AppConversation,\n ),\n next_page_id: data?.next_page_id ?? null,\n };\n}\n\n/**\n * Batch-fetch cloud app-conversations by id. Mirrors the local\n * `AgentServerConversationService.batchGetAppConversations` interface.\n */\nexport async function batchGetCloudConversations(\n ids: string[],\n): Promise<(AppConversation | null)[]> {\n if (ids.length === 0) return [];\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n for (const id of ids) params.append(\"ids\", id);\n const data = await callCloudProxy<(AppConversation | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations?${params.toString()}`,\n });\n return (data ?? []).map(overlayStoredRepoSelection);\n}\n\n/**\n * Create a v1 app-conversation on the cloud backend.\n *\n * Mirrors OpenHands' cloud flow: POST /api/v1/app-conversations with the\n * `AppConversationStartRequest` payload, returning a\n * `AppConversationStartTask`. The task is initially WORKING; the caller\n * polls `getCloudAppConversationStartTask` (3s cadence per OpenHands)\n * until status is READY (then `app_conversation_id`, `agent_server_url`,\n * and `session_api_key` are populated) or ERROR.\n *\n * This path does NOT use encrypted-settings round-tripping. Secrets stay\n * server-side on the cloud backend — the only auth carried is the cloud bearer\n * token (via the proxy's headers), and the conversation runtime is\n * provisioned with its own ephemeral session_api_key returned in the\n * task.\n */\nexport async function createCloudAppConversation(\n request: AppConversationStartRequest,\n): Promise<AppConversationStartTask> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversationStartTask>({\n backend,\n method: \"POST\",\n path: \"/api/v1/app-conversations\",\n body: request as unknown as Record<string, unknown>,\n });\n return data;\n}\n\n/**\n * Download a v1 app-conversation as a ZIP from the cloud backend. Mirrors\n * the local `AgentServerConversationService.downloadConversation` interface but\n * routes through the bundled agent-server's cloud proxy and hits\n * `GET /api/v1/app-conversations/{id}/download`, which returns\n * `application/zip` with `Content-Disposition` set by the cloud backend.\n */\nexport async function downloadCloudConversation(\n conversationId: string,\n): Promise<Blob> {\n const backend = getActiveCloudBackend();\n return callCloudProxy<Blob>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/download`,\n responseType: \"blob\",\n });\n}\n\n/**\n * Delete a v1 app-conversation on the cloud backend. Mirrors the local\n * `AgentServerConversationService.deleteConversation` interface but routes\n * through the bundled agent-server's cloud proxy and hits\n * `DELETE /api/v1/app-conversations/{id}`, which returns a JSON\n * `Success` envelope (discarded here — the caller only needs to know\n * the request didn't error).\n */\nexport async function deleteCloudConversation(\n conversationId: string,\n): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"DELETE\",\n path: `/api/v1/app-conversations/${conversationId}`,\n });\n}\n\n/**\n * Toggle the public-sharing flag on a cloud v1 app-conversation. Mirrors\n * OpenHands' `AgentServerConversationService.updateConversationPublicFlag` —\n * routes through the bundled agent-server's cloud proxy and hits\n * `PATCH /api/v1/app-conversations/{id}` with `{ public }`, returning\n * the updated conversation.\n */\nexport async function updateCloudConversationPublicFlag(\n conversationId: string,\n isPublic: boolean,\n): Promise<AppConversation> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversation>({\n backend,\n method: \"PATCH\",\n path: `/api/v1/app-conversations/${conversationId}`,\n body: { public: isPublic },\n });\n return data;\n}\n\n/**\n * Pause the cloud sandbox backing a v1 app-conversation. Mirrors\n * OpenHands' `SandboxService.pauseSandbox` — routes through the\n * bundled agent-server's cloud proxy and hits\n * `POST /api/v1/sandboxes/{sandboxId}/pause` on the cloud backend, which stops\n * the runtime owning the conversation.\n */\nexport async function pauseCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/pause`,\n });\n}\n\n/**\n * Resume a paused cloud sandbox. Mirrors OpenHands' `SandboxService.resumeSandbox`\n * — routes through the bundled agent-server's cloud proxy and hits\n * `POST /api/v1/sandboxes/{sandboxId}/resume` on the SaaS.\n *\n * This is the correct endpoint for waking a PAUSED sandbox. It is a\n * lightweight unpause — NOT the same as creating a new start task via\n * `POST /api/v1/app-conversations`, which provisions a fresh conversation\n * and is subject to the 120-second sandbox-start timeout.\n */\nexport async function resumeCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/resume`,\n });\n}\n\n/**\n * Read a file from a cloud conversation's sandbox workspace. Mirrors\n * OpenHands' `AgentServerConversationService.readConversationFile` — hits\n * `GET /api/v1/app-conversations/{id}/file?file_path=...` on the cloud backend\n * and returns the file content as a string.\n */\nexport async function readCloudConversationFile(\n conversationId: string,\n filePath: string,\n): Promise<string> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.append(\"file_path\", filePath);\n const data = await callCloudProxy<string>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/file?${params.toString()}`,\n });\n return data ?? \"\";\n}\n\n/**\n * Fetch a single v1 app-conversation start task. Mirrors OpenHands'\n * `AgentServerConversationService.getStartTask` — uses the batch search endpoint\n * with a single id and unwraps the first result.\n */\nexport async function getCloudAppConversationStartTask(\n taskId: string,\n): Promise<AppConversationStartTask | null> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"ids\", taskId);\n const data = await callCloudProxy<(AppConversationStartTask | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/start-tasks?${params.toString()}`,\n });\n return data?.[0] ?? null;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conversation-service.api.cjs","names":[],"sources":["../../../src/api/cloud/conversation-service.api.ts"],"sourcesContent":["import { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { getStoredConversationMetadata } from \"../conversation-metadata-store\";\nimport type {\n AppConversation,\n AppConversationPage,\n AppConversationStartRequest,\n AppConversationStartTask,\n} from \"../conversation-service/agent-server-conversation-service.types\";\nimport { callCloudProxy } from \"./proxy\";\n\n/**\n * The cloud backend does not always echo `selected_repository` /\n * `selected_branch` / `git_provider` back from\n * `GET /api/v1/app-conversations` until its own background hydration\n * completes. We persist the selection to local storage at connect time\n * (see `AgentServerConversationService.updateConversationRepository`)\n * and overlay it here so the chat-page git control bar reflects the\n * connection immediately, instead of snapping back to the empty\n * \"Connect Repo\" state on every refetch.\n *\n * Server values take precedence whenever they're populated; the\n * local-storage fallback only fills in fields the server returned as\n * `null`/`undefined`.\n */\nfunction overlayStoredRepoSelection(\n conversation: AppConversation | null,\n): AppConversation | null {\n if (!conversation?.id) return conversation;\n const stored = getStoredConversationMetadata(conversation.id);\n if (!stored) return conversation;\n\n return {\n ...conversation,\n selected_repository:\n conversation.selected_repository ?? stored.selected_repository ?? null,\n selected_branch:\n conversation.selected_branch ?? stored.selected_branch ?? null,\n git_provider: conversation.git_provider ?? stored.git_provider ?? null,\n selected_workspace:\n conversation.selected_workspace ?? stored.selected_workspace ?? null,\n };\n}\n\nfunction getActiveCloudBackend(): Backend {\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\"Cloud conversations call requires a cloud backend.\");\n }\n return active;\n}\n\n/**\n * Search the cloud app-conversations list. Mirrors the local\n * `AgentServerConversationService.searchConversations` interface but calls\n * the cloud endpoint `/api/v1/app-conversations/search`.\n */\nexport async function searchCloudConversations(\n limit: number = 20,\n pageId?: string,\n): Promise<AppConversationPage> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"limit\", String(limit));\n if (pageId) params.set(\"page_id\", pageId);\n params.set(\"sort_order\", \"UPDATED_AT_DESC\");\n\n const data = await callCloudProxy<{\n items: AppConversation[];\n next_page_id: string | null;\n }>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/search?${params.toString()}`,\n });\n\n return {\n items: (data?.items ?? []).map(\n (item) => overlayStoredRepoSelection(item) as AppConversation,\n ),\n next_page_id: data?.next_page_id ?? null,\n };\n}\n\n/**\n * Batch-fetch cloud app-conversations by id. Mirrors the local\n * `AgentServerConversationService.batchGetAppConversations` interface.\n */\nexport async function batchGetCloudConversations(\n ids: string[],\n): Promise<(AppConversation | null)[]> {\n if (ids.length === 0) return [];\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n for (const id of ids) params.append(\"ids\", id);\n const data = await callCloudProxy<(AppConversation | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations?${params.toString()}`,\n });\n return (data ?? []).map(overlayStoredRepoSelection);\n}\n\n/**\n * Create a v1 app-conversation on the cloud backend.\n *\n * Mirrors OpenHands' cloud flow: POST /api/v1/app-conversations with the\n * `AppConversationStartRequest` payload, returning a\n * `AppConversationStartTask`. The task is initially WORKING; the caller\n * polls `getCloudAppConversationStartTask` (3s cadence per OpenHands)\n * until status is READY (then `app_conversation_id`, `agent_server_url`,\n * and `session_api_key` are populated) or ERROR.\n *\n * This path does NOT use encrypted-settings round-tripping. Secrets stay\n * server-side on the cloud backend — the only auth carried is the cloud bearer\n * token, and the conversation runtime is\n * provisioned with its own ephemeral session_api_key returned in the\n * task.\n */\nexport async function createCloudAppConversation(\n request: AppConversationStartRequest,\n): Promise<AppConversationStartTask> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversationStartTask>({\n backend,\n method: \"POST\",\n path: \"/api/v1/app-conversations\",\n body: request as unknown as Record<string, unknown>,\n });\n return data;\n}\n\n/**\n * Download a v1 app-conversation as a ZIP from the cloud backend. Mirrors\n * the local `AgentServerConversationService.downloadConversation` interface but\n * calls\n * `GET /api/v1/app-conversations/{id}/download`, which returns\n * `application/zip` with `Content-Disposition` set by the cloud backend.\n */\nexport async function downloadCloudConversation(\n conversationId: string,\n): Promise<Blob> {\n const backend = getActiveCloudBackend();\n return callCloudProxy<Blob>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/download`,\n responseType: \"blob\",\n });\n}\n\n/**\n * Delete a v1 app-conversation on the cloud backend. Mirrors the local\n * `AgentServerConversationService.deleteConversation` interface but calls\n * `DELETE /api/v1/app-conversations/{id}`, which returns a JSON\n * `Success` envelope (discarded here — the caller only needs to know\n * the request didn't error).\n */\nexport async function deleteCloudConversation(\n conversationId: string,\n): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"DELETE\",\n path: `/api/v1/app-conversations/${conversationId}`,\n });\n}\n\n/**\n * Toggle the public-sharing flag on a cloud v1 app-conversation. Mirrors\n * OpenHands' `AgentServerConversationService.updateConversationPublicFlag`:\n * `PATCH /api/v1/app-conversations/{id}` with `{ public }`, returning\n * the updated conversation.\n */\nexport async function updateCloudConversationPublicFlag(\n conversationId: string,\n isPublic: boolean,\n): Promise<AppConversation> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversation>({\n backend,\n method: \"PATCH\",\n path: `/api/v1/app-conversations/${conversationId}`,\n body: { public: isPublic },\n });\n return data;\n}\n\n/**\n * Pause the cloud sandbox backing a v1 app-conversation. Mirrors\n * OpenHands' `SandboxService.pauseSandbox`:\n * `POST /api/v1/sandboxes/{sandboxId}/pause` on the cloud backend, which stops\n * the runtime owning the conversation.\n */\nexport async function pauseCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/pause`,\n });\n}\n\n/**\n * Resume a paused cloud sandbox. Mirrors OpenHands' `SandboxService.resumeSandbox`\n * by calling `POST /api/v1/sandboxes/{sandboxId}/resume` on the SaaS.\n *\n * This is the correct endpoint for waking a PAUSED sandbox. It is a\n * lightweight unpause — NOT the same as creating a new start task via\n * `POST /api/v1/app-conversations`, which provisions a fresh conversation\n * and is subject to the 120-second sandbox-start timeout.\n */\nexport async function resumeCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/resume`,\n });\n}\n\n/**\n * Read a file from a cloud conversation's sandbox workspace. Mirrors\n * OpenHands' `AgentServerConversationService.readConversationFile` — hits\n * `GET /api/v1/app-conversations/{id}/file?file_path=...` on the cloud backend\n * and returns the file content as a string.\n */\nexport async function readCloudConversationFile(\n conversationId: string,\n filePath: string,\n): Promise<string> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.append(\"file_path\", filePath);\n const data = await callCloudProxy<string>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/file?${params.toString()}`,\n });\n return data ?? \"\";\n}\n\n/**\n * Fetch a single v1 app-conversation start task. Mirrors OpenHands'\n * `AgentServerConversationService.getStartTask` — uses the batch search endpoint\n * with a single id and unwraps the first result.\n */\nexport async function getCloudAppConversationStartTask(\n taskId: string,\n): Promise<AppConversationStartTask | null> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"ids\", taskId);\n const data = await callCloudProxy<(AppConversationStartTask | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/start-tasks?${params.toString()}`,\n });\n return data?.[0] ?? null;\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import type { AppConversation, AppConversationPage, AppConversationStartRequest, AppConversationStartTask } from "../conversation-service/agent-server-conversation-service.types";
|
|
2
2
|
/**
|
|
3
3
|
* Search the cloud app-conversations list. Mirrors the local
|
|
4
|
-
* `AgentServerConversationService.searchConversations` interface but
|
|
5
|
-
*
|
|
6
|
-
* endpoint `/api/v1/app-conversations/search`.
|
|
4
|
+
* `AgentServerConversationService.searchConversations` interface but calls
|
|
5
|
+
* the cloud endpoint `/api/v1/app-conversations/search`.
|
|
7
6
|
*/
|
|
8
7
|
export declare function searchCloudConversations(limit?: number, pageId?: string): Promise<AppConversationPage>;
|
|
9
8
|
/**
|
|
@@ -23,7 +22,7 @@ export declare function batchGetCloudConversations(ids: string[]): Promise<(AppC
|
|
|
23
22
|
*
|
|
24
23
|
* This path does NOT use encrypted-settings round-tripping. Secrets stay
|
|
25
24
|
* server-side on the cloud backend — the only auth carried is the cloud bearer
|
|
26
|
-
* token
|
|
25
|
+
* token, and the conversation runtime is
|
|
27
26
|
* provisioned with its own ephemeral session_api_key returned in the
|
|
28
27
|
* task.
|
|
29
28
|
*/
|
|
@@ -31,15 +30,14 @@ export declare function createCloudAppConversation(request: AppConversationStart
|
|
|
31
30
|
/**
|
|
32
31
|
* Download a v1 app-conversation as a ZIP from the cloud backend. Mirrors
|
|
33
32
|
* the local `AgentServerConversationService.downloadConversation` interface but
|
|
34
|
-
*
|
|
33
|
+
* calls
|
|
35
34
|
* `GET /api/v1/app-conversations/{id}/download`, which returns
|
|
36
35
|
* `application/zip` with `Content-Disposition` set by the cloud backend.
|
|
37
36
|
*/
|
|
38
37
|
export declare function downloadCloudConversation(conversationId: string): Promise<Blob>;
|
|
39
38
|
/**
|
|
40
39
|
* Delete a v1 app-conversation on the cloud backend. Mirrors the local
|
|
41
|
-
* `AgentServerConversationService.deleteConversation` interface but
|
|
42
|
-
* through the bundled agent-server's cloud proxy and hits
|
|
40
|
+
* `AgentServerConversationService.deleteConversation` interface but calls
|
|
43
41
|
* `DELETE /api/v1/app-conversations/{id}`, which returns a JSON
|
|
44
42
|
* `Success` envelope (discarded here — the caller only needs to know
|
|
45
43
|
* the request didn't error).
|
|
@@ -47,24 +45,21 @@ export declare function downloadCloudConversation(conversationId: string): Promi
|
|
|
47
45
|
export declare function deleteCloudConversation(conversationId: string): Promise<void>;
|
|
48
46
|
/**
|
|
49
47
|
* Toggle the public-sharing flag on a cloud v1 app-conversation. Mirrors
|
|
50
|
-
* OpenHands' `AgentServerConversationService.updateConversationPublicFlag
|
|
51
|
-
* routes through the bundled agent-server's cloud proxy and hits
|
|
48
|
+
* OpenHands' `AgentServerConversationService.updateConversationPublicFlag`:
|
|
52
49
|
* `PATCH /api/v1/app-conversations/{id}` with `{ public }`, returning
|
|
53
50
|
* the updated conversation.
|
|
54
51
|
*/
|
|
55
52
|
export declare function updateCloudConversationPublicFlag(conversationId: string, isPublic: boolean): Promise<AppConversation>;
|
|
56
53
|
/**
|
|
57
54
|
* Pause the cloud sandbox backing a v1 app-conversation. Mirrors
|
|
58
|
-
* OpenHands' `SandboxService.pauseSandbox
|
|
59
|
-
* bundled agent-server's cloud proxy and hits
|
|
55
|
+
* OpenHands' `SandboxService.pauseSandbox`:
|
|
60
56
|
* `POST /api/v1/sandboxes/{sandboxId}/pause` on the cloud backend, which stops
|
|
61
57
|
* the runtime owning the conversation.
|
|
62
58
|
*/
|
|
63
59
|
export declare function pauseCloudSandbox(sandboxId: string): Promise<void>;
|
|
64
60
|
/**
|
|
65
61
|
* Resume a paused cloud sandbox. Mirrors OpenHands' `SandboxService.resumeSandbox`
|
|
66
|
-
*
|
|
67
|
-
* `POST /api/v1/sandboxes/{sandboxId}/resume` on the SaaS.
|
|
62
|
+
* by calling `POST /api/v1/sandboxes/{sandboxId}/resume` on the SaaS.
|
|
68
63
|
*
|
|
69
64
|
* This is the correct endpoint for waking a PAUSED sandbox. It is a
|
|
70
65
|
* lightweight unpause — NOT the same as creating a new start task via
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-service.api.js","names":[],"sources":["../../../src/api/cloud/conversation-service.api.ts"],"sourcesContent":["import { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { getStoredConversationMetadata } from \"../conversation-metadata-store\";\nimport type {\n AppConversation,\n AppConversationPage,\n AppConversationStartRequest,\n AppConversationStartTask,\n} from \"../conversation-service/agent-server-conversation-service.types\";\nimport { callCloudProxy } from \"./proxy\";\n\n/**\n * The cloud backend does not always echo `selected_repository` /\n * `selected_branch` / `git_provider` back from\n * `GET /api/v1/app-conversations` until its own background hydration\n * completes. We persist the selection to local storage at connect time\n * (see `AgentServerConversationService.updateConversationRepository`)\n * and overlay it here so the chat-page git control bar reflects the\n * connection immediately, instead of snapping back to the empty\n * \"Connect Repo\" state on every refetch.\n *\n * Server values take precedence whenever they're populated; the\n * local-storage fallback only fills in fields the server returned as\n * `null`/`undefined`.\n */\nfunction overlayStoredRepoSelection(\n conversation: AppConversation | null,\n): AppConversation | null {\n if (!conversation?.id) return conversation;\n const stored = getStoredConversationMetadata(conversation.id);\n if (!stored) return conversation;\n\n return {\n ...conversation,\n selected_repository:\n conversation.selected_repository ?? stored.selected_repository ?? null,\n selected_branch:\n conversation.selected_branch ?? stored.selected_branch ?? null,\n git_provider: conversation.git_provider ?? stored.git_provider ?? null,\n selected_workspace:\n conversation.selected_workspace ?? stored.selected_workspace ?? null,\n };\n}\n\nfunction getActiveCloudBackend(): Backend {\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\"Cloud conversations call requires a cloud backend.\");\n }\n return active;\n}\n\n/**\n * Search the cloud app-conversations list. Mirrors the local\n * `AgentServerConversationService.searchConversations` interface but routes\n * through the bundled agent-server's cloud proxy and hits the cloud\n * endpoint `/api/v1/app-conversations/search`.\n */\nexport async function searchCloudConversations(\n limit: number = 20,\n pageId?: string,\n): Promise<AppConversationPage> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"limit\", String(limit));\n if (pageId) params.set(\"page_id\", pageId);\n params.set(\"sort_order\", \"UPDATED_AT_DESC\");\n\n const data = await callCloudProxy<{\n items: AppConversation[];\n next_page_id: string | null;\n }>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/search?${params.toString()}`,\n });\n\n return {\n items: (data?.items ?? []).map(\n (item) => overlayStoredRepoSelection(item) as AppConversation,\n ),\n next_page_id: data?.next_page_id ?? null,\n };\n}\n\n/**\n * Batch-fetch cloud app-conversations by id. Mirrors the local\n * `AgentServerConversationService.batchGetAppConversations` interface.\n */\nexport async function batchGetCloudConversations(\n ids: string[],\n): Promise<(AppConversation | null)[]> {\n if (ids.length === 0) return [];\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n for (const id of ids) params.append(\"ids\", id);\n const data = await callCloudProxy<(AppConversation | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations?${params.toString()}`,\n });\n return (data ?? []).map(overlayStoredRepoSelection);\n}\n\n/**\n * Create a v1 app-conversation on the cloud backend.\n *\n * Mirrors OpenHands' cloud flow: POST /api/v1/app-conversations with the\n * `AppConversationStartRequest` payload, returning a\n * `AppConversationStartTask`. The task is initially WORKING; the caller\n * polls `getCloudAppConversationStartTask` (3s cadence per OpenHands)\n * until status is READY (then `app_conversation_id`, `agent_server_url`,\n * and `session_api_key` are populated) or ERROR.\n *\n * This path does NOT use encrypted-settings round-tripping. Secrets stay\n * server-side on the cloud backend — the only auth carried is the cloud bearer\n * token (via the proxy's headers), and the conversation runtime is\n * provisioned with its own ephemeral session_api_key returned in the\n * task.\n */\nexport async function createCloudAppConversation(\n request: AppConversationStartRequest,\n): Promise<AppConversationStartTask> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversationStartTask>({\n backend,\n method: \"POST\",\n path: \"/api/v1/app-conversations\",\n body: request as unknown as Record<string, unknown>,\n });\n return data;\n}\n\n/**\n * Download a v1 app-conversation as a ZIP from the cloud backend. Mirrors\n * the local `AgentServerConversationService.downloadConversation` interface but\n * routes through the bundled agent-server's cloud proxy and hits\n * `GET /api/v1/app-conversations/{id}/download`, which returns\n * `application/zip` with `Content-Disposition` set by the cloud backend.\n */\nexport async function downloadCloudConversation(\n conversationId: string,\n): Promise<Blob> {\n const backend = getActiveCloudBackend();\n return callCloudProxy<Blob>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/download`,\n responseType: \"blob\",\n });\n}\n\n/**\n * Delete a v1 app-conversation on the cloud backend. Mirrors the local\n * `AgentServerConversationService.deleteConversation` interface but routes\n * through the bundled agent-server's cloud proxy and hits\n * `DELETE /api/v1/app-conversations/{id}`, which returns a JSON\n * `Success` envelope (discarded here — the caller only needs to know\n * the request didn't error).\n */\nexport async function deleteCloudConversation(\n conversationId: string,\n): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"DELETE\",\n path: `/api/v1/app-conversations/${conversationId}`,\n });\n}\n\n/**\n * Toggle the public-sharing flag on a cloud v1 app-conversation. Mirrors\n * OpenHands' `AgentServerConversationService.updateConversationPublicFlag` —\n * routes through the bundled agent-server's cloud proxy and hits\n * `PATCH /api/v1/app-conversations/{id}` with `{ public }`, returning\n * the updated conversation.\n */\nexport async function updateCloudConversationPublicFlag(\n conversationId: string,\n isPublic: boolean,\n): Promise<AppConversation> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversation>({\n backend,\n method: \"PATCH\",\n path: `/api/v1/app-conversations/${conversationId}`,\n body: { public: isPublic },\n });\n return data;\n}\n\n/**\n * Pause the cloud sandbox backing a v1 app-conversation. Mirrors\n * OpenHands' `SandboxService.pauseSandbox` — routes through the\n * bundled agent-server's cloud proxy and hits\n * `POST /api/v1/sandboxes/{sandboxId}/pause` on the cloud backend, which stops\n * the runtime owning the conversation.\n */\nexport async function pauseCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/pause`,\n });\n}\n\n/**\n * Resume a paused cloud sandbox. Mirrors OpenHands' `SandboxService.resumeSandbox`\n * — routes through the bundled agent-server's cloud proxy and hits\n * `POST /api/v1/sandboxes/{sandboxId}/resume` on the SaaS.\n *\n * This is the correct endpoint for waking a PAUSED sandbox. It is a\n * lightweight unpause — NOT the same as creating a new start task via\n * `POST /api/v1/app-conversations`, which provisions a fresh conversation\n * and is subject to the 120-second sandbox-start timeout.\n */\nexport async function resumeCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/resume`,\n });\n}\n\n/**\n * Read a file from a cloud conversation's sandbox workspace. Mirrors\n * OpenHands' `AgentServerConversationService.readConversationFile` — hits\n * `GET /api/v1/app-conversations/{id}/file?file_path=...` on the cloud backend\n * and returns the file content as a string.\n */\nexport async function readCloudConversationFile(\n conversationId: string,\n filePath: string,\n): Promise<string> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.append(\"file_path\", filePath);\n const data = await callCloudProxy<string>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/file?${params.toString()}`,\n });\n return data ?? \"\";\n}\n\n/**\n * Fetch a single v1 app-conversation start task. Mirrors OpenHands'\n * `AgentServerConversationService.getStartTask` — uses the batch search endpoint\n * with a single id and unwraps the first result.\n */\nexport async function getCloudAppConversationStartTask(\n taskId: string,\n): Promise<AppConversationStartTask | null> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"ids\", taskId);\n const data = await callCloudProxy<(AppConversationStartTask | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/start-tasks?${params.toString()}`,\n });\n return data?.[0] ?? null;\n}\n"],"mappings":";;;;AAyBA,SAAS,EACP,GACwB;AACxB,KAAI,CAAC,GAAc,GAAI,QAAO;CAC9B,IAAM,IAAS,EAA8B,EAAa,GAAG;AAG7D,QAFK,IAEE;EACL,GAAG;EACH,qBACE,EAAa,uBAAuB,EAAO,uBAAuB;EACpE,iBACE,EAAa,mBAAmB,EAAO,mBAAmB;EAC5D,cAAc,EAAa,gBAAgB,EAAO,gBAAgB;EAClE,oBACE,EAAa,sBAAsB,EAAO,sBAAsB;EACnE,GAXmB;;AActB,SAAS,IAAiC;CACxC,IAAM,IAAS,GAAkB,CAAC;AAClC,KAAI,EAAO,SAAS,QAClB,OAAU,MAAM,qDAAqD;AAEvE,QAAO;;AAST,eAAsB,EACpB,IAAgB,IAChB,GAC8B;CAC9B,IAAM,IAAU,GAAuB,EACjC,IAAS,IAAI,iBAAiB;AAGpC,CAFA,EAAO,IAAI,SAAS,OAAO,EAAM,CAAC,EAC9B,KAAQ,EAAO,IAAI,WAAW,EAAO,EACzC,EAAO,IAAI,cAAc,kBAAkB;CAE3C,IAAM,IAAO,MAAM,EAGhB;EACD;EACA,QAAQ;EACR,MAAM,oCAAoC,EAAO,UAAU;EAC5D,CAAC;AAEF,QAAO;EACL,QAAQ,GAAM,SAAS,EAAE,EAAE,KACxB,MAAS,EAA2B,EAAK,CAC3C;EACD,cAAc,GAAM,gBAAgB;EACrC;;AAOH,eAAsB,EACpB,GACqC;AACrC,KAAI,EAAI,WAAW,EAAG,QAAO,EAAE;CAC/B,IAAM,IAAU,GAAuB,EACjC,IAAS,IAAI,iBAAiB;AACpC,MAAK,IAAM,KAAM,EAAK,GAAO,OAAO,OAAO,EAAG;AAM9C,SAAQ,MALW,EAA2C;EAC5D;EACA,QAAQ;EACR,MAAM,6BAA6B,EAAO,UAAU;EACrD,CAAC,IACc,EAAE,EAAE,IAAI,EAA2B;;AAmBrD,eAAsB,EACpB,GACmC;AAQnC,QAAO,MANY,EAAyC;EAC1D,SAFc,GAEd;EACA,QAAQ;EACR,MAAM;EACN,MAAM;EACP,CAAC;;AAWJ,eAAsB,EACpB,GACe;AAEf,QAAO,EAAqB;EAC1B,SAFc,GAEd;EACA,QAAQ;EACR,MAAM,6BAA6B,EAAe;EAClD,cAAc;EACf,CAAC;;AAWJ,eAAsB,EACpB,GACe;AAEf,OAAM,EAAwB;EAC5B,SAFc,GAEd;EACA,QAAQ;EACR,MAAM,6BAA6B;EACpC,CAAC;;AAUJ,eAAsB,EACpB,GACA,GAC0B;AAQ1B,QAAO,MANY,EAAgC;EACjD,SAFc,GAEd;EACA,QAAQ;EACR,MAAM,6BAA6B;EACnC,MAAM,EAAE,QAAQ,GAAU;EAC3B,CAAC;;AAWJ,eAAsB,EAAkB,GAAkC;AAExE,OAAM,EAAwB;EAC5B,SAFc,GAEd;EACA,QAAQ;EACR,MAAM,qBAAqB,EAAU;EACtC,CAAC;;AAaJ,eAAsB,EAAmB,GAAkC;AAEzE,OAAM,EAAwB;EAC5B,SAFc,GAEd;EACA,QAAQ;EACR,MAAM,qBAAqB,EAAU;EACtC,CAAC;;AASJ,eAAsB,EACpB,GACA,GACiB;CACjB,IAAM,IAAU,GAAuB,EACjC,IAAS,IAAI,iBAAiB;AAOpC,QANA,EAAO,OAAO,aAAa,EAAS,EAM7B,MALY,EAAuB;EACxC;EACA,QAAQ;EACR,MAAM,6BAA6B,EAAe,QAAQ,EAAO,UAAU;EAC5E,CAAC,IACa;;AAQjB,eAAsB,EACpB,GAC0C;CAC1C,IAAM,IAAU,GAAuB,EACjC,IAAS,IAAI,iBAAiB;AAOpC,QANA,EAAO,IAAI,OAAO,EAAO,GAMlB,MALY,EAAoD;EACrE;EACA,QAAQ;EACR,MAAM,yCAAyC,EAAO,UAAU;EACjE,CAAC,IACY,MAAM"}
|
|
1
|
+
{"version":3,"file":"conversation-service.api.js","names":[],"sources":["../../../src/api/cloud/conversation-service.api.ts"],"sourcesContent":["import { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { getStoredConversationMetadata } from \"../conversation-metadata-store\";\nimport type {\n AppConversation,\n AppConversationPage,\n AppConversationStartRequest,\n AppConversationStartTask,\n} from \"../conversation-service/agent-server-conversation-service.types\";\nimport { callCloudProxy } from \"./proxy\";\n\n/**\n * The cloud backend does not always echo `selected_repository` /\n * `selected_branch` / `git_provider` back from\n * `GET /api/v1/app-conversations` until its own background hydration\n * completes. We persist the selection to local storage at connect time\n * (see `AgentServerConversationService.updateConversationRepository`)\n * and overlay it here so the chat-page git control bar reflects the\n * connection immediately, instead of snapping back to the empty\n * \"Connect Repo\" state on every refetch.\n *\n * Server values take precedence whenever they're populated; the\n * local-storage fallback only fills in fields the server returned as\n * `null`/`undefined`.\n */\nfunction overlayStoredRepoSelection(\n conversation: AppConversation | null,\n): AppConversation | null {\n if (!conversation?.id) return conversation;\n const stored = getStoredConversationMetadata(conversation.id);\n if (!stored) return conversation;\n\n return {\n ...conversation,\n selected_repository:\n conversation.selected_repository ?? stored.selected_repository ?? null,\n selected_branch:\n conversation.selected_branch ?? stored.selected_branch ?? null,\n git_provider: conversation.git_provider ?? stored.git_provider ?? null,\n selected_workspace:\n conversation.selected_workspace ?? stored.selected_workspace ?? null,\n };\n}\n\nfunction getActiveCloudBackend(): Backend {\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\"Cloud conversations call requires a cloud backend.\");\n }\n return active;\n}\n\n/**\n * Search the cloud app-conversations list. Mirrors the local\n * `AgentServerConversationService.searchConversations` interface but calls\n * the cloud endpoint `/api/v1/app-conversations/search`.\n */\nexport async function searchCloudConversations(\n limit: number = 20,\n pageId?: string,\n): Promise<AppConversationPage> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"limit\", String(limit));\n if (pageId) params.set(\"page_id\", pageId);\n params.set(\"sort_order\", \"UPDATED_AT_DESC\");\n\n const data = await callCloudProxy<{\n items: AppConversation[];\n next_page_id: string | null;\n }>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/search?${params.toString()}`,\n });\n\n return {\n items: (data?.items ?? []).map(\n (item) => overlayStoredRepoSelection(item) as AppConversation,\n ),\n next_page_id: data?.next_page_id ?? null,\n };\n}\n\n/**\n * Batch-fetch cloud app-conversations by id. Mirrors the local\n * `AgentServerConversationService.batchGetAppConversations` interface.\n */\nexport async function batchGetCloudConversations(\n ids: string[],\n): Promise<(AppConversation | null)[]> {\n if (ids.length === 0) return [];\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n for (const id of ids) params.append(\"ids\", id);\n const data = await callCloudProxy<(AppConversation | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations?${params.toString()}`,\n });\n return (data ?? []).map(overlayStoredRepoSelection);\n}\n\n/**\n * Create a v1 app-conversation on the cloud backend.\n *\n * Mirrors OpenHands' cloud flow: POST /api/v1/app-conversations with the\n * `AppConversationStartRequest` payload, returning a\n * `AppConversationStartTask`. The task is initially WORKING; the caller\n * polls `getCloudAppConversationStartTask` (3s cadence per OpenHands)\n * until status is READY (then `app_conversation_id`, `agent_server_url`,\n * and `session_api_key` are populated) or ERROR.\n *\n * This path does NOT use encrypted-settings round-tripping. Secrets stay\n * server-side on the cloud backend — the only auth carried is the cloud bearer\n * token, and the conversation runtime is\n * provisioned with its own ephemeral session_api_key returned in the\n * task.\n */\nexport async function createCloudAppConversation(\n request: AppConversationStartRequest,\n): Promise<AppConversationStartTask> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversationStartTask>({\n backend,\n method: \"POST\",\n path: \"/api/v1/app-conversations\",\n body: request as unknown as Record<string, unknown>,\n });\n return data;\n}\n\n/**\n * Download a v1 app-conversation as a ZIP from the cloud backend. Mirrors\n * the local `AgentServerConversationService.downloadConversation` interface but\n * calls\n * `GET /api/v1/app-conversations/{id}/download`, which returns\n * `application/zip` with `Content-Disposition` set by the cloud backend.\n */\nexport async function downloadCloudConversation(\n conversationId: string,\n): Promise<Blob> {\n const backend = getActiveCloudBackend();\n return callCloudProxy<Blob>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/download`,\n responseType: \"blob\",\n });\n}\n\n/**\n * Delete a v1 app-conversation on the cloud backend. Mirrors the local\n * `AgentServerConversationService.deleteConversation` interface but calls\n * `DELETE /api/v1/app-conversations/{id}`, which returns a JSON\n * `Success` envelope (discarded here — the caller only needs to know\n * the request didn't error).\n */\nexport async function deleteCloudConversation(\n conversationId: string,\n): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"DELETE\",\n path: `/api/v1/app-conversations/${conversationId}`,\n });\n}\n\n/**\n * Toggle the public-sharing flag on a cloud v1 app-conversation. Mirrors\n * OpenHands' `AgentServerConversationService.updateConversationPublicFlag`:\n * `PATCH /api/v1/app-conversations/{id}` with `{ public }`, returning\n * the updated conversation.\n */\nexport async function updateCloudConversationPublicFlag(\n conversationId: string,\n isPublic: boolean,\n): Promise<AppConversation> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversation>({\n backend,\n method: \"PATCH\",\n path: `/api/v1/app-conversations/${conversationId}`,\n body: { public: isPublic },\n });\n return data;\n}\n\n/**\n * Pause the cloud sandbox backing a v1 app-conversation. Mirrors\n * OpenHands' `SandboxService.pauseSandbox`:\n * `POST /api/v1/sandboxes/{sandboxId}/pause` on the cloud backend, which stops\n * the runtime owning the conversation.\n */\nexport async function pauseCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/pause`,\n });\n}\n\n/**\n * Resume a paused cloud sandbox. Mirrors OpenHands' `SandboxService.resumeSandbox`\n * by calling `POST /api/v1/sandboxes/{sandboxId}/resume` on the SaaS.\n *\n * This is the correct endpoint for waking a PAUSED sandbox. It is a\n * lightweight unpause — NOT the same as creating a new start task via\n * `POST /api/v1/app-conversations`, which provisions a fresh conversation\n * and is subject to the 120-second sandbox-start timeout.\n */\nexport async function resumeCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/resume`,\n });\n}\n\n/**\n * Read a file from a cloud conversation's sandbox workspace. Mirrors\n * OpenHands' `AgentServerConversationService.readConversationFile` — hits\n * `GET /api/v1/app-conversations/{id}/file?file_path=...` on the cloud backend\n * and returns the file content as a string.\n */\nexport async function readCloudConversationFile(\n conversationId: string,\n filePath: string,\n): Promise<string> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.append(\"file_path\", filePath);\n const data = await callCloudProxy<string>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/file?${params.toString()}`,\n });\n return data ?? \"\";\n}\n\n/**\n * Fetch a single v1 app-conversation start task. Mirrors OpenHands'\n * `AgentServerConversationService.getStartTask` — uses the batch search endpoint\n * with a single id and unwraps the first result.\n */\nexport async function getCloudAppConversationStartTask(\n taskId: string,\n): Promise<AppConversationStartTask | null> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"ids\", taskId);\n const data = await callCloudProxy<(AppConversationStartTask | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/start-tasks?${params.toString()}`,\n });\n return data?.[0] ?? null;\n}\n"],"mappings":";;;;AAyBA,SAAS,EACP,GACwB;AACxB,KAAI,CAAC,GAAc,GAAI,QAAO;CAC9B,IAAM,IAAS,EAA8B,EAAa,GAAG;AAG7D,QAFK,IAEE;EACL,GAAG;EACH,qBACE,EAAa,uBAAuB,EAAO,uBAAuB;EACpE,iBACE,EAAa,mBAAmB,EAAO,mBAAmB;EAC5D,cAAc,EAAa,gBAAgB,EAAO,gBAAgB;EAClE,oBACE,EAAa,sBAAsB,EAAO,sBAAsB;EACnE,GAXmB;;AActB,SAAS,IAAiC;CACxC,IAAM,IAAS,GAAkB,CAAC;AAClC,KAAI,EAAO,SAAS,QAClB,OAAU,MAAM,qDAAqD;AAEvE,QAAO;;AAQT,eAAsB,EACpB,IAAgB,IAChB,GAC8B;CAC9B,IAAM,IAAU,GAAuB,EACjC,IAAS,IAAI,iBAAiB;AAGpC,CAFA,EAAO,IAAI,SAAS,OAAO,EAAM,CAAC,EAC9B,KAAQ,EAAO,IAAI,WAAW,EAAO,EACzC,EAAO,IAAI,cAAc,kBAAkB;CAE3C,IAAM,IAAO,MAAM,EAGhB;EACD;EACA,QAAQ;EACR,MAAM,oCAAoC,EAAO,UAAU;EAC5D,CAAC;AAEF,QAAO;EACL,QAAQ,GAAM,SAAS,EAAE,EAAE,KACxB,MAAS,EAA2B,EAAK,CAC3C;EACD,cAAc,GAAM,gBAAgB;EACrC;;AAOH,eAAsB,EACpB,GACqC;AACrC,KAAI,EAAI,WAAW,EAAG,QAAO,EAAE;CAC/B,IAAM,IAAU,GAAuB,EACjC,IAAS,IAAI,iBAAiB;AACpC,MAAK,IAAM,KAAM,EAAK,GAAO,OAAO,OAAO,EAAG;AAM9C,SAAQ,MALW,EAA2C;EAC5D;EACA,QAAQ;EACR,MAAM,6BAA6B,EAAO,UAAU;EACrD,CAAC,IACc,EAAE,EAAE,IAAI,EAA2B;;AAmBrD,eAAsB,EACpB,GACmC;AAQnC,QAAO,MANY,EAAyC;EAC1D,SAFc,GAEd;EACA,QAAQ;EACR,MAAM;EACN,MAAM;EACP,CAAC;;AAWJ,eAAsB,EACpB,GACe;AAEf,QAAO,EAAqB;EAC1B,SAFc,GAEd;EACA,QAAQ;EACR,MAAM,6BAA6B,EAAe;EAClD,cAAc;EACf,CAAC;;AAUJ,eAAsB,EACpB,GACe;AAEf,OAAM,EAAwB;EAC5B,SAFc,GAEd;EACA,QAAQ;EACR,MAAM,6BAA6B;EACpC,CAAC;;AASJ,eAAsB,EACpB,GACA,GAC0B;AAQ1B,QAAO,MANY,EAAgC;EACjD,SAFc,GAEd;EACA,QAAQ;EACR,MAAM,6BAA6B;EACnC,MAAM,EAAE,QAAQ,GAAU;EAC3B,CAAC;;AAUJ,eAAsB,EAAkB,GAAkC;AAExE,OAAM,EAAwB;EAC5B,SAFc,GAEd;EACA,QAAQ;EACR,MAAM,qBAAqB,EAAU;EACtC,CAAC;;AAYJ,eAAsB,EAAmB,GAAkC;AAEzE,OAAM,EAAwB;EAC5B,SAFc,GAEd;EACA,QAAQ;EACR,MAAM,qBAAqB,EAAU;EACtC,CAAC;;AASJ,eAAsB,EACpB,GACA,GACiB;CACjB,IAAM,IAAU,GAAuB,EACjC,IAAS,IAAI,iBAAiB;AAOpC,QANA,EAAO,OAAO,aAAa,EAAS,EAM7B,MALY,EAAuB;EACxC;EACA,QAAQ;EACR,MAAM,6BAA6B,EAAe,QAAQ,EAAO,UAAU;EAC5E,CAAC,IACa;;AAQjB,eAAsB,EACpB,GAC0C;CAC1C,IAAM,IAAU,GAAuB,EACjC,IAAS,IAAI,iBAAiB;AAOpC,QANA,EAAO,IAAI,OAAO,EAAO,GAMlB,MALY,EAAoD;EACrE;EACA,QAAQ;EACR,MAAM,yCAAyC,EAAO,UAAU;EACjE,CAAC,IACY,MAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"organization-service.api.cjs","names":[],"sources":["../../../src/api/cloud/organization-service.api.ts"],"sourcesContent":["import axios from \"axios\";\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 *
|
|
1
|
+
{"version":3,"file":"organization-service.api.cjs","names":[],"sources":["../../../src/api/cloud/organization-service.api.ts"],"sourcesContent":["import axios from \"axios\";\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 (axios.isAxiosError(e) && e.response?.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 */\nexport async function getCloudOrganizationMe(\n orgId: string,\n backend?: Backend,\n): Promise<{ orgId: string; userId: string }> {\n const target = resolveBackend(backend);\n const data = await callCloudProxy<{ org_id: string; user_id: string }>({\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 };\n}\n"],"mappings":"qLAeA,SAAS,EACP,EACqB,CACrB,MAAO,CACL,MAAO,GAAM,OAAS,EAAE,CACxB,aAAc,GAAM,gBAAkB,KACvC,CAGH,SAAS,EAAe,EAA4B,CAClD,GAAI,EAAS,OAAO,EACpB,IAAM,EAAS,EAAA,kBAAkB,CAAC,QAClC,GAAI,EAAO,OAAS,QAClB,MAAU,MACR,6EACD,CAEH,OAAO,EAUT,eAAsB,EACpB,EAC8B,CAO9B,OAAO,EAAgB,MALJ,EAAA,eAA2C,CAC5D,QAFa,EAAe,EAEnB,CACT,OAAQ,MACR,KAAM,qBACP,CAAC,CAC0B,CAc9B,eAAsB,EACpB,EACyD,CACzD,IAAM,EAAS,EAAe,EAAQ,CACtC,GAAI,CAMF,MAAO,CAAE,OAAO,MALG,EAAA,eAAoC,CACrD,QAAS,EACT,OAAQ,MACR,KAAM,oBACP,CAAC,GACoB,QAAU,KAAM,YAAa,GAAO,OACnD,EAAG,CACV,GAAI,EAAA,QAAM,aAAa,EAAE,EAAI,EAAE,UAAU,SAAW,IAClD,MAAO,CAAE,MAAO,KAAM,YAAa,GAAM,CAE3C,MAAM,GAWV,eAAsB,EACpB,EACA,EAC4C,CAE5C,IAAM,EAAO,MAAM,EAAA,eAAoD,CACrE,QAFa,EAAe,EAEnB,CACT,OAAQ,MACR,KAAM,sBAAsB,mBAAmB,EAAM,CAAC,KACvD,CAAC,CACF,MAAO,CACL,MAAO,GAAM,QAAU,EACvB,OAAQ,GAAM,SAAW,GAC1B"}
|
|
@@ -9,8 +9,7 @@ interface OrganizationsResult {
|
|
|
9
9
|
* cloud backend; pass `backend` explicitly to fetch for an inactive cloud
|
|
10
10
|
* (used by the selector to flatten all cloud rows).
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
* cross-origin browser calls.
|
|
12
|
+
* Calls the cloud API directly with the backend's bearer token.
|
|
14
13
|
*/
|
|
15
14
|
export declare function getCloudOrganizations(backend?: Backend): Promise<OrganizationsResult>;
|
|
16
15
|
/**
|