@openhands/agent-canvas 1.0.0-beta.8 → 1.0.0-rc.1
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 +2 -2
- package/README.windows.md +2 -2
- package/build/assets/{QueryClientProvider-Cnr-Yl3j.js → QueryClientProvider-w1cZWY41.js} +1 -1
- package/build/assets/{Trans-4jmk54WC.js → Trans-BJeYqz2A.js} +1 -1
- package/build/assets/{acp-providers-BAX8OU5C.js → acp-providers-DJr8DlNG.js} +1 -1
- package/build/assets/{acp-route-guard-HPk6TV-L.js → acp-route-guard-A__sWgbc.js} +1 -1
- package/build/assets/{active-backend-context-BSPE-W72.js → active-backend-context-I2w666XY.js} +1 -1
- package/build/assets/add-backend-modal-BDBDBXsJ.js +1 -0
- package/build/assets/agent-server-conversation-service.api-Cagoqq1V.js +5 -0
- package/build/assets/agent-settings-BXBaybB_.js +2 -0
- package/build/assets/{alert-banner-DFnn_lC6.js → alert-banner-NeUl1-PQ.js} +1 -1
- package/build/assets/analytics-consent-form-modal-DxkThW4K.js +1 -0
- package/build/assets/{api-key-entry-screen-myuWMqzW.js → api-key-entry-screen-ByXA4hXH.js} +1 -1
- package/build/assets/{app-settings-CCcX8ZEH.js → app-settings-C-U6jONZ.js} +1 -1
- package/build/assets/automation-detail-Dbmgt974.js +1 -0
- package/build/assets/automations-list-BLJzAd-p.js +1 -0
- package/build/assets/{back-nav-button-7dQJ2k3O.js → back-nav-button-DgkK0Ka6.js} +1 -1
- package/build/assets/{backend-form-modal-D3bDMO3C.js → backend-form-modal-CeB983Sj.js} +1 -1
- package/build/assets/{backend-synced-settings-badge-BkW5evM0.js → backend-synced-settings-badge-BktJcGgH.js} +1 -1
- package/build/assets/{base-modal-C2oy2EBG.js → base-modal-DZCNv0A4.js} +1 -1
- package/build/assets/{brand-button-DJ_S16rO.js → brand-button-LBFNic99.js} +1 -1
- package/build/assets/browser-D08Sp3ZY.js +5 -0
- package/build/assets/{browser-tab-dvSPdvkm.js → browser-tab-be3QvXg9.js} +1 -1
- package/build/assets/chat-send-button-5qz0zj6R.js +1 -0
- package/build/assets/{checkmark-Dus0b6jt.js → checkmark-Rmpruj7q.js} +1 -1
- package/build/assets/{chevron-left-small-_uvG7RVM.js → chevron-left-small-6nyFCWVQ.js} +1 -1
- package/build/assets/{circle-plus-check-toggle-DKS8MAVV.js → circle-plus-check-toggle-DquBwJ_6.js} +1 -1
- package/build/assets/{close-BU5iTc66.js → close-D_o3d8QM.js} +1 -1
- package/build/assets/{code-tag-BzyqOtPD.js → code-tag-DhsjDB-v.js} +1 -1
- package/build/assets/{combobox-caret-BJC7XJsz.js → combobox-caret-CO7eozIY.js} +1 -1
- package/build/assets/{condenser-settings-DCTulgLO.js → condenser-settings-BulzYEuW.js} +1 -1
- package/build/assets/{confirmation-modal-B5Ca6qFE.js → confirmation-modal-CMAtd9R0.js} +1 -1
- package/build/assets/{context-menu-list-item-7tAcm2c3.js → context-menu-list-item-D0swnhFt.js} +1 -1
- package/build/assets/conversation-BrjF2-Ky.js +1 -0
- package/build/assets/conversation-HgR_TTPE.js +19 -0
- package/build/assets/conversation-panel-BlRcO5AC.js +1 -0
- package/build/assets/conversation-service.api-B_Pdmwsa.js +1 -0
- package/build/assets/{conversation-tab-empty-state-CStQLPVW.js → conversation-tab-empty-state-DYjKsg_c.js} +1 -1
- package/build/assets/conversation-websocket-context-G95yfL81.js +3 -0
- package/build/assets/{copy-Chg-sFu3.js → copy-BM0RpLez.js} +1 -1
- package/build/assets/{custom-toast-handlers-ufGJ6_Rc.js → custom-toast-handlers-BohXx7uh.js} +1 -1
- package/build/assets/{declaration-CR6HMp29.js → declaration-DaUdB2Wg.js} +1 -1
- package/build/assets/{device-verify-C6mj28zv.js → device-verify-DiEJqpJb.js} +1 -1
- package/build/assets/dist-Bl-1K5Tv.js +1 -0
- package/build/assets/{dist-C3NfioQC.js → dist-xtCm0O6P.js} +1 -1
- package/build/assets/{dropdown-classes-BsVmxlNG.js → dropdown-classes-Vqz86I0R.js} +1 -1
- package/build/assets/{edit-automation-modal-DamwL0s0.js → edit-automation-modal-CNZgSSiH.js} +1 -1
- package/build/assets/{entry.client-Cn71WM8q.js → entry.client-BvKgdCQ9.js} +2 -2
- package/build/assets/{enum-filter-dropdown-5JeF2RLb.js → enum-filter-dropdown-DdFgk0EM.js} +1 -1
- package/build/assets/{environment-switch-overlay-Tf_BIfeR.js → environment-switch-overlay-CuBuZOaa.js} +1 -1
- package/build/assets/{extensions-hub-CUEmfvGy.js → extensions-hub-Dayqvv0n.js} +1 -1
- package/build/assets/{extensions-navigation-VQ-3umJ7.js → extensions-navigation-yFLAU06N.js} +1 -1
- package/build/assets/{file-BTY6Gyy9.js → file-DwHCkWZT.js} +1 -1
- package/build/assets/files-tab-CMredyYX.js +1 -0
- package/build/assets/{folder-D1T2W1cj.js → folder-2h1hR1Qb.js} +1 -1
- package/build/assets/git-control-bar-branch-button-D8blTNXh.js +27 -0
- package/build/assets/{globe-Bzj_0oXT.js → globe-qFjFNG6J.js} +1 -1
- package/build/assets/home-CWw845Rz.js +1 -0
- package/build/assets/{i18n-DET2iOyh.js → i18n-zDndR1Ne.js} +1 -1
- package/build/assets/install-server-modal-D8Q0xZcN.js +1 -0
- package/build/assets/{launch-DGghLfGx.js → launch-I00QV8YT.js} +1 -1
- package/build/assets/{lesson-plan-duSsqWVs.js → lesson-plan-C18uB_56.js} +1 -1
- package/build/assets/{link-external-DGxVm4Ps.js → link-external-DtcdPFbw.js} +1 -1
- package/build/assets/llm-settings-CAnFYAEG.js +1 -0
- package/build/assets/llm-settings-DotqpmCF.js +1 -0
- package/build/assets/{loading-spinner-5GT9q1xy.js → loading-spinner-DNwR4--Z.js} +1 -1
- package/build/assets/{manage-backends-modal-CRMwyU0t.js → manage-backends-modal-Ceo_SOcf.js} +1 -1
- package/build/assets/manifest-61ec2d68.js +1 -0
- package/build/assets/{markdown-renderer-B3IAVfv4.js → markdown-renderer-D6B-u2nM.js} +1 -1
- package/build/assets/{mcp-CfDRAmPn.js → mcp-EvrLVTla.js} +1 -1
- package/build/assets/messages-Bz9TWjlh.js +36 -0
- package/build/assets/modal-backdrop-BDqI1zBV.js +1 -0
- package/build/assets/{modal-body-aoa2fx5W.js → modal-body-CCLCqX1J.js} +1 -1
- package/build/assets/{modal-classes-6YqcqA6y.js → modal-classes-DwTdT3IK.js} +1 -1
- package/build/assets/{modal-close-button-CtWOUMmw.js → modal-close-button-gQgKqUf-.js} +1 -1
- package/build/assets/model-selector-CZOi4V7r.js +1 -0
- package/build/assets/{mutation-D0OogFCz.js → mutation-CaJwPR9O.js} +1 -1
- package/build/assets/{navigation-context-BdKYH32C.js → navigation-context-aNGUUtdq.js} +1 -1
- package/build/assets/{navigation-link-U4vY9i_C.js → navigation-link-CYkF2y3K.js} +1 -1
- package/build/assets/onboarding-CPCKYvFh.js +1 -0
- package/build/assets/{openhands-logo-CCo0wJZX.js → openhands-logo-CHmtDV-t.js} +1 -1
- package/build/assets/{organization-service.api-BeuMC9QL.js → organization-service.api-Dn74hBTH.js} +1 -1
- package/build/assets/path-utils-BjxzIGLp.js +1 -0
- package/build/assets/{plan-components-CRDMQzsS.js → plan-components--aLlpASH.js} +1 -1
- package/build/assets/{planner-tab-Dte6Vzza.js → planner-tab-B-5EeCEm.js} +1 -1
- package/build/assets/{providers-eUyo6pgr.js → providers-DknP6O2g.js} +1 -1
- package/build/assets/{proxy-BqDMnUY-.js → proxy-sRh0WKI7.js} +1 -1
- package/build/assets/{query-client-config-CRnGSujB.js → query-client-config-CWWGQWvw.js} +1 -1
- package/build/assets/{recommended-automations-launcher-D5ADbXao.js → recommended-automations-launcher-BIul0osB.js} +3 -3
- package/build/assets/{root-Z2VHU4R3.css → root-CN7qsvxg.css} +1 -1
- package/build/assets/root-CklXEh3W.js +2 -0
- package/build/assets/root-layout-BCA_X8XL.js +2 -0
- package/build/assets/{sdk-section-page-CRCRY3PG.js → sdk-section-page-VmtJWH3A.js} +1 -1
- package/build/assets/{sdk-settings-schema-CLmJ9sho.js → sdk-settings-schema-DFievvEK.js} +1 -1
- package/build/assets/{search-SuJctqNJ.js → search-BeVRXvX7.js} +1 -1
- package/build/assets/{secrets-service-B9AFn9OE.js → secrets-service-DVtlLWY8.js} +1 -1
- package/build/assets/{secrets-settings-0UrKMS60.js → secrets-settings-BLMvCkKm.js} +1 -1
- package/build/assets/{settings-6t6LGW04.js → settings-CXvJUx_j.js} +1 -1
- package/build/assets/{settings-dropdown-input-BtoovFre.js → settings-dropdown-input-DA_pzHWE.js} +1 -1
- package/build/assets/{settings-gear-Dd8K2_8B.js → settings-gear-aNebYlCy.js} +1 -1
- package/build/assets/{settings-index-CR6Ou73o.js → settings-index-CycvkOoq.js} +1 -1
- package/build/assets/{settings-input-CehsXnb3.js → settings-input-8y5p4kze.js} +1 -1
- package/build/assets/{settings-list-classes-E3v_f6QG.js → settings-list-classes-Qk7zl0Wu.js} +1 -1
- package/build/assets/settings-modal-DdntdOGP.js +1 -0
- package/build/assets/{settings-section-header-context-DewwJ0-F.js → settings-section-header-context-B77tsYlx.js} +1 -1
- package/build/assets/{settings-service.api-DwtyDeGh.js → settings-service.api-DxIEtvx6.js} +1 -1
- package/build/assets/{settings-switch-BiBuS3xa.js → settings-switch-ba4DuiNO.js} +1 -1
- package/build/assets/{settings-utils-DY04tWG1.js → settings-utils-BxzHqLmZ.js} +1 -1
- package/build/assets/{shared-conversation-BzccsVej.js → shared-conversation-x41nZQi7.js} +1 -1
- package/build/assets/{sidebar-mobile-menu-toggle-DGlRg6jG.js → sidebar-mobile-menu-toggle-C0mmabKj.js} +1 -1
- package/build/assets/{sidebar-nav-link-dgVb8Fpy.js → sidebar-nav-link-BsYdDFfb.js} +1 -1
- package/build/assets/{skill-card-pill-row-BW9qvhoK.js → skill-card-pill-row-BhUlGcYB.js} +1 -1
- package/build/assets/{skills-0GRKX5Xj.js → skills-TYjOUQ2d.js} +1 -1
- package/build/assets/{skills-plugins-DctDrZ8Y.js → skills-plugins-D0pdqgKa.js} +1 -1
- package/build/assets/{skills-settings-rvxImDj_.js → skills-settings-VqKTkmVl.js} +2 -2
- package/build/assets/{styled-tooltip-hdfMXPQC.js → styled-tooltip-TCp7svY3.js} +1 -1
- package/build/assets/{switch-skeleton-DSKqSx2A.js → switch-skeleton-cKrdaYGj.js} +1 -1
- package/build/assets/{task-list-tab-DT6_zfUs.js → task-list-tab-BiizRsY3.js} +1 -1
- package/build/assets/telemetry-fQFd-8V3.js +2 -0
- package/build/assets/{terminal-CPYWdo4j.js → terminal-BSYITdM0.js} +1 -1
- package/build/assets/{terminal-KldRPIRT.js → terminal-CpgZx6go.js} +1 -1
- package/build/assets/{toggle-switch-T2v6sJ6l.js → toggle-switch-CUgOZqZu.js} +1 -1
- package/build/assets/{typography-BDgnT7Yp.js → typography-Bvw0IxaN.js} +1 -1
- package/build/assets/{u-check-circle-half-steSK_JB.js → u-check-circle-half-DjpjzWu3.js} +1 -1
- package/build/assets/{u-check-circle-DOauqQKb.js → u-check-circle-u9QiS4Fr.js} +1 -1
- package/build/assets/{u-circuit-x3ExjBbU.js → u-circuit-DlBlOwx9.js} +1 -1
- package/build/assets/{u-edit-BbrptMCa.js → u-edit-BIYzjs3v.js} +1 -1
- package/build/assets/{use-active-conversation-sPgfSkql.js → use-active-conversation-q1wT8LI5.js} +1 -1
- package/build/assets/{use-agent-settings-schema-B66kGIi_.js → use-agent-settings-schema-Yxf7KGyG.js} +1 -1
- package/build/assets/{use-agent-state-Dp3pD1h3.js → use-agent-state-CCHlVqvY.js} +1 -1
- package/build/assets/{use-cloud-current-user-id-ClKFPjFz.js → use-cloud-current-user-id-BAKf91Zx.js} +1 -1
- package/build/assets/{use-config-C9pvb0Sm.js → use-config-DwfigQ_Y.js} +1 -1
- package/build/assets/use-create-conversation-BEzddjXn.js +1 -0
- package/build/assets/{use-get-secrets-oyC7PFRz.js → use-get-secrets-BlO1BfUo.js} +1 -1
- package/build/assets/{use-handle-plan-click-DP6Rs-YP.js → use-handle-plan-click-Bfl0zIBr.js} +1 -1
- package/build/assets/use-is-authed-hHndEep7.js +1 -0
- package/build/assets/{use-launch-skill-in-chat-sQNEOLGD.js → use-launch-skill-in-chat-3ydwpi_M.js} +1 -1
- package/build/assets/use-llm-profiles-E-jjZMZw.js +1 -0
- package/build/assets/use-runtime-is-ready-DBWzvAmc.js +1 -0
- package/build/assets/use-save-settings-rE9aA29R.js +1 -0
- package/build/assets/{use-settings-DeO7nvpM.js → use-settings-BPTbE7lg.js} +1 -1
- package/build/assets/{use-settings-nav-items-BGMFn25b.js → use-settings-nav-items-C7MOWj09.js} +1 -1
- package/build/assets/{use-skills-DWIK3l3a.js → use-skills-QhoaIYGF.js} +1 -1
- package/build/assets/{use-task-list-CsT10CBb.js → use-task-list-YMkSzdDv.js} +1 -1
- package/build/assets/use-tracking-DQYdZpxi.js +1 -0
- package/build/assets/{use-unified-vscode-url-DXPtB317.js → use-unified-vscode-url-DFtNIC1Q.js} +1 -1
- package/build/assets/{use-user-conversation-DJen4YIP.js → use-user-conversation-BRAseenw.js} +1 -1
- package/build/assets/{useMutation-GSSKKebK.js → useMutation-DDo48A8t.js} +1 -1
- package/build/assets/{useTranslation-B6voJV4y.js → useTranslation-CEcjrme-.js} +1 -1
- package/build/assets/{utils-DCVfKFRt.js → utils-CdgBzLA7.js} +1 -1
- package/build/assets/{vendor~browser-BrOJLj3y.js → vendor~browser-DWk6fNtJ.js} +1 -1
- package/build/assets/{vendor~browser-tab-BxhTtM9_.js → vendor~browser-tab-NZdVoI2Z.js} +1 -1
- package/build/assets/{vendor~conversation-panel~conversation-C9o-K1hW.js → vendor~conversation-panel~conversation-gp03cWZW.js} +1 -1
- package/build/assets/{vendor~conversation-panel~conversation~index-RXYdJYxU.js → vendor~conversation-panel~conversation~index-BZ5C6Xpz.js} +1 -1
- package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jfc6hidu-DJS-rJdI.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~oli4dvxu-BodGsxSf.js} +1 -1
- package/build/assets/{vendor~files-tab-BtkpAiMX.js → vendor~files-tab-Buz36Y-q.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation-PK1-gtXU.js → vendor~home~conversation-panel~conversation-DG0H5SkJ.js} +2 -2
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-6ByzelMS.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-1pTajrpX.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BED5W_c4.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-9Il_wz8U.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CCbqAFiI.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-B7I1ZxCx.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-E4d6IEfI.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-Ceeqkj0k.js} +1 -1
- package/build/assets/{vendor~launch-BXgl67Re.js → vendor~launch-DXL78kBf.js} +1 -1
- package/build/assets/{vendor~root-layout~conversation-panel~conversation~shared-conversation-DW31UyBp.js → vendor~root-layout~conversation-panel~conversation~shared-conversation-CfAc3nMS.js} +1 -1
- package/build/assets/vendor~root-layout~home~conversation-panel~conversation-DkwcKRtv.js +1 -0
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-tTR8C6m0.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-BC9XTECT.js} +1 -1
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-6Rm8U_Sr.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-DSqEbr0N.js} +1 -1
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~k776hupu-BJbu9kpL.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~k776hupu-D0XUSHNN.js} +2 -2
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-d2oallMa.js → vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-CcFtthyg.js} +1 -1
- package/build/assets/vendor~root-layout~home~mcp~automations-list-BnIlGhjl.js +1 -0
- package/build/assets/{vendor~home~mcp~automations-list-BgV86Sti.js → vendor~root-layout~home~mcp~automations-list-cNHi83v_.js} +1 -1
- package/build/assets/{vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-CjJdFLoM.js → vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~o7tv66sg-BGWUbqUq.js} +1 -1
- package/build/assets/{vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-m8dOii0J.js → vendor~root-layout~home~mcp~llm-settings~agent-settings~condenser-settings~verification-set~o7tv66sg-BuCSnjsW.js} +2 -2
- package/build/assets/{vendor~root~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-s~f2l2lr17-DYXOLEck.js → vendor~root~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-s~jaomi49z-Cw89stA6.js} +1 -1
- package/build/assets/{verification-settings-C_zHuDx9.js → verification-settings-CIqtxWat.js} +1 -1
- package/build/assets/{vscode-tab-DH9x7xXS.js → vscode-tab-DEt72yJX.js} +1 -1
- package/build/assets/{waiting-for-runtime-message-CdK3btDZ.js → waiting-for-runtime-message-DSjJfeoj.js} +1 -1
- package/build/assets/{x-mark-BrkSPIiT.js → x-mark-DsJ9tDD0.js} +1 -1
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +4 -2
- package/build/locales/ca/openhands.json +4 -2
- package/build/locales/de/openhands.json +4 -2
- package/build/locales/en/openhands.json +4 -2
- package/build/locales/es/openhands.json +4 -2
- package/build/locales/fr/openhands.json +4 -2
- package/build/locales/it/openhands.json +4 -2
- package/build/locales/ja/openhands.json +4 -2
- package/build/locales/ko-KR/openhands.json +4 -2
- package/build/locales/no/openhands.json +4 -2
- package/build/locales/pt/openhands.json +4 -2
- package/build/locales/tr/openhands.json +4 -2
- package/build/locales/uk/openhands.json +4 -2
- package/build/locales/zh-CN/openhands.json +4 -2
- package/build/locales/zh-TW/openhands.json +4 -2
- package/config/defaults.json +1 -1
- package/dist/api/agent-server-home.cjs +2 -0
- package/dist/api/agent-server-home.cjs.map +1 -0
- package/dist/api/agent-server-home.d.ts +34 -0
- package/dist/api/agent-server-home.js +33 -0
- package/dist/api/agent-server-home.js.map +1 -0
- package/dist/api/config-service/config-service.api.cjs +1 -1
- package/dist/api/config-service/config-service.api.cjs.map +1 -1
- package/dist/api/config-service/config-service.api.d.ts +12 -0
- package/dist/api/config-service/config-service.api.js +55 -18
- package/dist/api/config-service/config-service.api.js.map +1 -1
- package/dist/api/conversation-file-upload.api.cjs +1 -1
- package/dist/api/conversation-file-upload.api.cjs.map +1 -1
- package/dist/api/conversation-file-upload.api.js +4 -1
- package/dist/api/conversation-file-upload.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 +101 -100
- package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
- package/dist/api/option-service/option-service.api.cjs.map +1 -1
- package/dist/api/option-service/option-service.api.js.map +1 -1
- package/dist/api/workspace-upload-path.cjs +1 -1
- package/dist/api/workspace-upload-path.cjs.map +1 -1
- package/dist/api/workspace-upload-path.d.ts +44 -2
- package/dist/api/workspace-upload-path.js +16 -14
- package/dist/api/workspace-upload-path.js.map +1 -1
- package/dist/components/features/automations/recommended-automations-launcher.d.ts +3 -1
- package/dist/components/features/automations/recommended-automations-section.d.ts +3 -1
- 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 +7 -1
- package/dist/components/features/backends/backend-form-modal.js +94 -91
- package/dist/components/features/backends/backend-form-modal.js.map +1 -1
- package/dist/components/features/chat/chat-interface.cjs +2 -2
- package/dist/components/features/chat/chat-interface.cjs.map +1 -1
- package/dist/components/features/chat/chat-interface.js +66 -66
- package/dist/components/features/chat/chat-interface.js.map +1 -1
- package/dist/components/features/chat/confirmation-mode-enabled.cjs +1 -1
- package/dist/components/features/chat/confirmation-mode-enabled.js +4 -4
- package/dist/components/features/chat/switch-profile-button.cjs +1 -1
- package/dist/components/features/chat/switch-profile-button.js +3 -3
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.js +5 -5
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map +1 -1
- package/dist/components/features/onboarding/index.d.ts +1 -0
- package/dist/components/features/onboarding/onboarding-host.d.ts +3 -1
- package/dist/components/features/onboarding/onboarding-modal.d.ts +7 -3
- package/dist/components/features/onboarding/onboarding-preview.d.ts +4 -0
- package/dist/components/features/onboarding/steps/say-hello-step.d.ts +3 -1
- package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
- package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +1 -1
- package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs +1 -1
- package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs.map +1 -1
- package/dist/components/features/settings/sdk-settings/sdk-section-page.d.ts +3 -1
- package/dist/components/features/settings/sdk-settings/sdk-section-page.js +56 -56
- package/dist/components/features/settings/sdk-settings/sdk-section-page.js.map +1 -1
- package/dist/components/features/skills/extensions-navigation.cjs +1 -1
- package/dist/components/features/skills/extensions-navigation.js +7 -7
- package/dist/components/shared/modals/modal-backdrop.cjs +1 -1
- package/dist/components/shared/modals/modal-backdrop.cjs.map +1 -1
- package/dist/components/shared/modals/modal-backdrop.d.ts +3 -1
- package/dist/components/shared/modals/modal-backdrop.js +3 -3
- package/dist/components/shared/modals/modal-backdrop.js.map +1 -1
- package/dist/components/shared/modals/settings/settings-form.cjs +1 -1
- package/dist/components/shared/modals/settings/settings-form.cjs.map +1 -1
- package/dist/components/shared/modals/settings/settings-form.js +7 -7
- package/dist/components/shared/modals/settings/settings-form.js.map +1 -1
- package/dist/hooks/chat/use-model-interceptor.cjs +1 -1
- package/dist/hooks/chat/use-model-interceptor.js +4 -4
- package/dist/hooks/mutation/use-save-settings.cjs +1 -1
- package/dist/hooks/mutation/use-save-settings.cjs.map +1 -1
- package/dist/hooks/mutation/use-save-settings.js +13 -14
- package/dist/hooks/mutation/use-save-settings.js.map +1 -1
- package/dist/hooks/query/use-llm-profiles.cjs +1 -1
- package/dist/hooks/query/use-llm-profiles.js +5 -5
- package/dist/hooks/query/use-verified-models.cjs +1 -1
- package/dist/hooks/query/use-verified-models.cjs.map +1 -1
- package/dist/hooks/query/use-verified-models.js +7 -6
- package/dist/hooks/query/use-verified-models.js.map +1 -1
- package/dist/hooks/use-download-conversation.cjs +1 -1
- package/dist/hooks/use-download-conversation.cjs.map +1 -1
- package/dist/hooks/use-download-conversation.js +4 -4
- package/dist/hooks/use-download-conversation.js.map +1 -1
- package/dist/hooks/use-tracking.cjs +1 -1
- package/dist/hooks/use-tracking.cjs.map +1 -1
- package/dist/hooks/use-tracking.d.ts +31 -0
- package/dist/hooks/use-tracking.js +51 -14
- package/dist/hooks/use-tracking.js.map +1 -1
- package/dist/i18n/declaration.cjs +1 -1
- package/dist/i18n/declaration.cjs.map +1 -1
- package/dist/i18n/declaration.d.ts +2 -0
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/translation.cjs +1 -1
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +64 -30
- package/dist/i18n/translation.js.map +1 -1
- package/dist/locales/ar/openhands.json +4 -2
- package/dist/locales/ca/openhands.json +4 -2
- package/dist/locales/de/openhands.json +4 -2
- package/dist/locales/en/openhands.json +4 -2
- package/dist/locales/es/openhands.json +4 -2
- package/dist/locales/fr/openhands.json +4 -2
- package/dist/locales/it/openhands.json +4 -2
- package/dist/locales/ja/openhands.json +4 -2
- package/dist/locales/ko-KR/openhands.json +4 -2
- package/dist/locales/no/openhands.json +4 -2
- package/dist/locales/pt/openhands.json +4 -2
- package/dist/locales/tr/openhands.json +4 -2
- package/dist/locales/uk/openhands.json +4 -2
- package/dist/locales/zh-CN/openhands.json +4 -2
- package/dist/locales/zh-TW/openhands.json +4 -2
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/dist/routes/llm-settings.cjs +1 -1
- package/dist/routes/llm-settings.cjs.map +1 -1
- package/dist/routes/llm-settings.d.ts +3 -1
- package/dist/routes/llm-settings.js +17 -16
- package/dist/routes/llm-settings.js.map +1 -1
- package/package.json +1 -1
- package/scripts/dev-static.mjs +0 -2
- package/scripts/dev-with-automation.mjs +0 -2
- package/scripts/static-server.mjs +13 -3
- package/build/assets/add-backend-modal-mXKmfMI2.js +0 -1
- package/build/assets/agent-server-conversation-service.api-B9TUYJon.js +0 -5
- package/build/assets/agent-settings-g3F623RJ.js +0 -2
- package/build/assets/analytics-consent-form-modal-BQCNeNVt.js +0 -1
- package/build/assets/automation-detail-BDHLHSJd.js +0 -1
- package/build/assets/automations-list-CiNtQhq_.js +0 -1
- package/build/assets/browser-CGM-k-sH.js +0 -5
- package/build/assets/conversation-BKhikfYl.js +0 -1
- package/build/assets/conversation-DTn8jN8L.js +0 -19
- package/build/assets/conversation-panel-DfHR42mG.js +0 -1
- package/build/assets/conversation-service.api-B6CkzaKD.js +0 -1
- package/build/assets/conversation-websocket-context-DShEuLjh.js +0 -3
- package/build/assets/dist-DNeWJ2bh.js +0 -1
- package/build/assets/ellipsis-button-Vh5MvRZa.js +0 -1
- package/build/assets/files-tab-C47fQEeL.js +0 -1
- package/build/assets/git-branch-DQS2nMK4.js +0 -1
- package/build/assets/git-control-bar-branch-button-BT0aWH-o.js +0 -27
- package/build/assets/git-provider-icon-Pi-Cxpgv.js +0 -1
- package/build/assets/home-C3k6sFvB.js +0 -1
- package/build/assets/install-server-modal-6fuq-TU6.js +0 -1
- package/build/assets/llm-settings-BKraGtOu.js +0 -1
- package/build/assets/llm-settings-DRQTgOF1.js +0 -1
- package/build/assets/manage-workspaces-modal-BYmGD1W7.js +0 -1
- package/build/assets/manifest-99b06a11.js +0 -1
- package/build/assets/messages-Ba1vaw6t.js +0 -36
- package/build/assets/modal-backdrop-RfNCrSpK.js +0 -1
- package/build/assets/model-selector-DcztJSxT.js +0 -1
- package/build/assets/path-utils-z12iCrQO.js +0 -1
- package/build/assets/root-BmhaEJJ8.js +0 -2
- package/build/assets/root-layout-CNggm0d8.js +0 -2
- package/build/assets/settings-modal-T_Yk1Zfo.js +0 -1
- package/build/assets/use-create-conversation-B-lwTnfE.js +0 -1
- package/build/assets/use-is-authed-dw2026rR.js +0 -1
- package/build/assets/use-is-creating-conversation-DX2qSlfL.js +0 -1
- package/build/assets/use-llm-profiles-Bh5JqZUZ.js +0 -1
- package/build/assets/use-runtime-is-ready-BakOUVU-.js +0 -1
- package/build/assets/use-save-settings-uXXkqvD7.js +0 -1
- package/build/assets/vendor~home~mcp~automations-list-CZSK-lT2.js +0 -1
- package/build/assets/vendor~root-layout~home~conversation-panel~conversation-B5WNMnt4.js +0 -1
- /package/build/assets/{automation-XDPAjiZi.js → automation-DJ_3GeXD.js} +0 -0
- /package/build/assets/{browser-store-DAsixKdU.js → browser-store-JRrcGdlk.js} +0 -0
- /package/build/assets/{check-CYxAHs85.js → check-CZhEL6rP.js} +0 -0
- /package/build/assets/{chevron-down-Bnmd5iG-.js → chevron-down-KhWYEjeW.js} +0 -0
- /package/build/assets/{color-themes-B9pm9c-R.js → color-themes-0biOprdo.js} +0 -0
- /package/build/assets/{command-store-CE1weJy8.js → command-store-UzKGSUC2.js} +0 -0
- /package/build/assets/{files-tab-store-m0ARqX_E.js → files-tab-store-DLU28g8C.js} +0 -0
- /package/build/assets/{iconBase-DE30Zj_-.js → iconBase-BVhFI-0E.js} +0 -0
- /package/build/assets/{map-provider-BJ_8KZKU.js → map-provider-C3Z5Dx2J.js} +0 -0
- /package/build/assets/{sdk-settings-field-metadata-DQiaIBie.js → sdk-settings-field-metadata-C6KMD-jZ.js} +0 -0
- /package/build/assets/{settings-like-page-layout-classes-D7YjdTd0.js → settings-like-page-layout-classes-DNg2vKSM.js} +0 -0
- /package/build/assets/{use-breakpoint-DF_RiQ6s.js → use-breakpoint-DpxHDmuH.js} +0 -0
- /package/build/assets/{use-event-store-BomO7ywK.js → use-event-store-Cxqc45Sw.js} +0 -0
- /package/build/assets/{vendor~browser-DisFGEp9.js → vendor~browser-BDNLFng6.js} +0 -0
- /package/build/assets/{vendor~conversation-panel~conversation~alert-banner-w-I2sY6c.js → vendor~conversation-panel~conversation~alert-banner-D_hRW_zc.js} +0 -0
- /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~g56ukk6u-DsSvIDZQ.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~h07fzaqi-D15MEcqi.js} +0 -0
- /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~hkqzh1hb-BZ0HXuHD.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~j8sdb9mk-OFpe9fX_.js} +0 -0
- /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~zm51vy4j-BClAMeFe.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~lpdshwee-BPuuVEqr.js} +0 -0
- /package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CG96FCly.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CXivI4Ym.js} +0 -0
- /package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CyZ-3lDQ.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-Dr3Ow7Ms.js} +0 -0
- /package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-CbAhtEMv.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-B1TKKuuH.js} +0 -0
- /package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~ninslayh-CLlsvdNP.js → vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~e9ykmtgh-Fa-nXZ4M.js} +0 -0
- /package/build/assets/{vendor~terminal-DZaJIY8A.js → vendor~terminal-0ObOedYm.js} +0 -0
- /package/build/assets/{vscode-url-helper-Cwy1A62q.js → vscode-url-helper-BMq8JBhB.js} +0 -0
|
@@ -1623,7 +1623,9 @@
|
|
|
1623
1623
|
"ONBOARDING$BACKEND_TITLE": "バックエンドを確認",
|
|
1624
1624
|
"ONBOARDING$BACKEND_SUBTITLE": "OpenHands はエージェントサーバーと通信します。デフォルトのバックエンドに接続できることを確認してください。",
|
|
1625
1625
|
"ONBOARDING$BACKEND_CONNECTED_TITLE": "接続できました! 🎉",
|
|
1626
|
-
"ONBOARDING$BACKEND_CONNECTED_BODY": "
|
|
1626
|
+
"ONBOARDING$BACKEND_CONNECTED_BODY": "エージェント実行用のデフォルトバックエンドを起動しましたが、エージェントバックエンドは必要な数だけ接続できます。ノートPC上、Dockerでサンドボックス化したもの、リモートVM上など、複数を使い分けられます。",
|
|
1627
|
+
"ONBOARDING$BACKEND_SHOW_CONFIGURATION": "設定を表示",
|
|
1628
|
+
"ONBOARDING$BACKEND_HIDE_CONFIGURATION": "設定を非表示",
|
|
1627
1629
|
"ONBOARDING$BACKEND_CHECKING": "バックエンドの接続を確認しています…",
|
|
1628
1630
|
"ONBOARDING$BACKEND_DISCONNECTED_TITLE": "バックエンドに接続できません",
|
|
1629
1631
|
"ONBOARDING$BACKEND_DISCONNECTED_BODY": "下の接続情報を更新し、保存して再試行してください。",
|
|
@@ -1634,7 +1636,7 @@
|
|
|
1634
1636
|
"ONBOARDING$LLM_SUBTITLE": "プロバイダーとモデルを選択してください。Anthropic Claude Opus を事前に選択しています。",
|
|
1635
1637
|
"ONBOARDING$HELLO_TITLE": "ハローと挨拶 👋",
|
|
1636
1638
|
"ONBOARDING$HELLO_SUBTITLE": "OpenHands に最初のメッセージを送信しましょう。ワークスペースなしの新しい会話を開始します。",
|
|
1637
|
-
"ONBOARDING$HELLO_DEFAULT_MESSAGE": "OpenHands でできることを説明する簡単な Web
|
|
1639
|
+
"ONBOARDING$HELLO_DEFAULT_MESSAGE": "OpenHands でできることを説明する簡単な Web ページを作成して。",
|
|
1638
1640
|
"ONBOARDING$HELLO_LAUNCH": "送信",
|
|
1639
1641
|
"ONBOARDING$HELLO_LAUNCHING": "会話を開始しています…",
|
|
1640
1642
|
"ONBOARDING$ACP_SECRETS_TITLE": "API キーを追加",
|
|
@@ -1623,7 +1623,9 @@
|
|
|
1623
1623
|
"ONBOARDING$BACKEND_TITLE": "백엔드 확인",
|
|
1624
1624
|
"ONBOARDING$BACKEND_SUBTITLE": "OpenHands는 에이전트 서버와 통신합니다. 기본 백엔드에 접근할 수 있는지 확인하세요.",
|
|
1625
1625
|
"ONBOARDING$BACKEND_CONNECTED_TITLE": "연결되었습니다! 🎉",
|
|
1626
|
-
"ONBOARDING$BACKEND_CONNECTED_BODY": "에이전트
|
|
1626
|
+
"ONBOARDING$BACKEND_CONNECTED_BODY": "에이전트를 실행할 기본 백엔드를 시작했지만, 원하는 만큼 많은 에이전트 백엔드를 연결할 수 있습니다. 노트북, Docker 샌드박스, 원격 VM에 각각 하나씩 둘 수 있습니다.",
|
|
1627
|
+
"ONBOARDING$BACKEND_SHOW_CONFIGURATION": "구성 표시",
|
|
1628
|
+
"ONBOARDING$BACKEND_HIDE_CONFIGURATION": "구성 숨기기",
|
|
1627
1629
|
"ONBOARDING$BACKEND_CHECKING": "백엔드 연결을 확인 중입니다…",
|
|
1628
1630
|
"ONBOARDING$BACKEND_DISCONNECTED_TITLE": "백엔드에 연결할 수 없습니다",
|
|
1629
1631
|
"ONBOARDING$BACKEND_DISCONNECTED_BODY": "아래 연결 정보를 수정한 뒤 저장하여 다시 시도하세요.",
|
|
@@ -1634,7 +1636,7 @@
|
|
|
1634
1636
|
"ONBOARDING$LLM_SUBTITLE": "공급자와 모델을 선택하세요. 기본값으로 Anthropic Claude Opus가 선택되어 있습니다.",
|
|
1635
1637
|
"ONBOARDING$HELLO_TITLE": "인사하기 👋",
|
|
1636
1638
|
"ONBOARDING$HELLO_SUBTITLE": "OpenHands에 첫 메시지를 보내세요. 작업 공간 없이 새 대화를 시작합니다.",
|
|
1637
|
-
"ONBOARDING$HELLO_DEFAULT_MESSAGE": "OpenHands가 무엇을 할 수 있는지 설명하는 간단한 웹페이지를 만들어
|
|
1639
|
+
"ONBOARDING$HELLO_DEFAULT_MESSAGE": "OpenHands가 무엇을 할 수 있는지 설명하는 간단한 웹페이지를 만들어 줘.",
|
|
1638
1640
|
"ONBOARDING$HELLO_LAUNCH": "보내기",
|
|
1639
1641
|
"ONBOARDING$HELLO_LAUNCHING": "대화를 시작하는 중…",
|
|
1640
1642
|
"ONBOARDING$ACP_SECRETS_TITLE": "API 키 추가",
|
|
@@ -1623,7 +1623,9 @@
|
|
|
1623
1623
|
"ONBOARDING$BACKEND_TITLE": "Sjekk backend",
|
|
1624
1624
|
"ONBOARDING$BACKEND_SUBTITLE": "OpenHands kommuniserer med en agent-server. Sjekk at standard backend er tilgjengelig.",
|
|
1625
1625
|
"ONBOARDING$BACKEND_CONNECTED_TITLE": "Du er tilkoblet! 🎉",
|
|
1626
|
-
"ONBOARDING$BACKEND_CONNECTED_BODY": "
|
|
1626
|
+
"ONBOARDING$BACKEND_CONNECTED_BODY": "Vi har startet en standard backend for å kjøre agentene dine, men du kan koble til så mange agent-backends du vil. Du kan ha én på laptopen, én i Docker-sandbox og én på en ekstern VM.",
|
|
1627
|
+
"ONBOARDING$BACKEND_SHOW_CONFIGURATION": "Vis konfigurasjon",
|
|
1628
|
+
"ONBOARDING$BACKEND_HIDE_CONFIGURATION": "Skjul konfigurasjon",
|
|
1627
1629
|
"ONBOARDING$BACKEND_CHECKING": "Sjekker backend-tilkoblingen din…",
|
|
1628
1630
|
"ONBOARDING$BACKEND_DISCONNECTED_TITLE": "Vi når ikke backend-en din",
|
|
1629
1631
|
"ONBOARDING$BACKEND_DISCONNECTED_BODY": "Oppdater tilkoblingsdetaljene under og lagre for å prøve igjen.",
|
|
@@ -1634,7 +1636,7 @@
|
|
|
1634
1636
|
"ONBOARDING$LLM_SUBTITLE": "Velg en leverandør og modell. Vi har forhåndsvalgt Anthropic Claude Opus.",
|
|
1635
1637
|
"ONBOARDING$HELLO_TITLE": "Si hei 👋",
|
|
1636
1638
|
"ONBOARDING$HELLO_SUBTITLE": "Send din første melding til OpenHands. Vi starter en ny samtale uten arbeidsområde.",
|
|
1637
|
-
"ONBOARDING$HELLO_DEFAULT_MESSAGE": "Lag en enkel nettside som forklarer hva OpenHands kan gjøre",
|
|
1639
|
+
"ONBOARDING$HELLO_DEFAULT_MESSAGE": "Lag en enkel nettside som forklarer hva OpenHands kan gjøre.",
|
|
1638
1640
|
"ONBOARDING$HELLO_LAUNCH": "Send",
|
|
1639
1641
|
"ONBOARDING$HELLO_LAUNCHING": "Starter samtale…",
|
|
1640
1642
|
"ONBOARDING$ACP_SECRETS_TITLE": "Legg til API-nøklene dine",
|
|
@@ -1623,7 +1623,9 @@
|
|
|
1623
1623
|
"ONBOARDING$BACKEND_TITLE": "Verifique seu backend",
|
|
1624
1624
|
"ONBOARDING$BACKEND_SUBTITLE": "O OpenHands se comunica com um servidor de agente. Verifique se o backend padrão está acessível.",
|
|
1625
1625
|
"ONBOARDING$BACKEND_CONNECTED_TITLE": "Conectado! 🎉",
|
|
1626
|
-
"ONBOARDING$BACKEND_CONNECTED_BODY": "
|
|
1626
|
+
"ONBOARDING$BACKEND_CONNECTED_BODY": "Iniciamos um backend padrão para executar seus agentes, mas você pode conectar quantos backends de agente quiser. Você pode ter um no laptop, um em sandbox no Docker e um em uma VM remota.",
|
|
1627
|
+
"ONBOARDING$BACKEND_SHOW_CONFIGURATION": "Mostrar configuração",
|
|
1628
|
+
"ONBOARDING$BACKEND_HIDE_CONFIGURATION": "Ocultar configuração",
|
|
1627
1629
|
"ONBOARDING$BACKEND_CHECKING": "Verificando a conexão com o backend…",
|
|
1628
1630
|
"ONBOARDING$BACKEND_DISCONNECTED_TITLE": "Não foi possível conectar ao seu backend",
|
|
1629
1631
|
"ONBOARDING$BACKEND_DISCONNECTED_BODY": "Atualize os detalhes de conexão abaixo e salve para tentar novamente.",
|
|
@@ -1634,7 +1636,7 @@
|
|
|
1634
1636
|
"ONBOARDING$LLM_SUBTITLE": "Escolha um provedor e modelo. Já selecionamos o Anthropic Claude Opus.",
|
|
1635
1637
|
"ONBOARDING$HELLO_TITLE": "Diga olá 👋",
|
|
1636
1638
|
"ONBOARDING$HELLO_SUBTITLE": "Envie sua primeira mensagem ao OpenHands. Vamos iniciar uma nova conversa sem workspace.",
|
|
1637
|
-
"ONBOARDING$HELLO_DEFAULT_MESSAGE": "Crie uma página web básica explicando o que o OpenHands pode fazer",
|
|
1639
|
+
"ONBOARDING$HELLO_DEFAULT_MESSAGE": "Crie uma página web básica explicando o que o OpenHands pode fazer.",
|
|
1638
1640
|
"ONBOARDING$HELLO_LAUNCH": "Enviar",
|
|
1639
1641
|
"ONBOARDING$HELLO_LAUNCHING": "Iniciando conversa…",
|
|
1640
1642
|
"ONBOARDING$ACP_SECRETS_TITLE": "Adicione suas chaves de API",
|
|
@@ -1623,7 +1623,9 @@
|
|
|
1623
1623
|
"ONBOARDING$BACKEND_TITLE": "Sunucu tarafını kontrol edin",
|
|
1624
1624
|
"ONBOARDING$BACKEND_SUBTITLE": "OpenHands bir aracı sunucusuyla iletişim kurar. Varsayılan sunucuya erişilebildiğinden emin olun.",
|
|
1625
1625
|
"ONBOARDING$BACKEND_CONNECTED_TITLE": "Bağlandınız! 🎉",
|
|
1626
|
-
"ONBOARDING$BACKEND_CONNECTED_BODY": "
|
|
1626
|
+
"ONBOARDING$BACKEND_CONNECTED_BODY": "Ajanlarınızı çalıştırmak için varsayılan bir backend başlattık, ancak istediğiniz kadar ajan backend'i bağlayabilirsiniz. Dizüstü bilgisayarınızda bir tane, Docker'da sandbox'lanmış bir tane ve uzak bir VM'de bir tane olabilir.",
|
|
1627
|
+
"ONBOARDING$BACKEND_SHOW_CONFIGURATION": "Yapılandırmayı göster",
|
|
1628
|
+
"ONBOARDING$BACKEND_HIDE_CONFIGURATION": "Yapılandırmayı gizle",
|
|
1627
1629
|
"ONBOARDING$BACKEND_CHECKING": "Sunucu bağlantınız kontrol ediliyor…",
|
|
1628
1630
|
"ONBOARDING$BACKEND_DISCONNECTED_TITLE": "Sunucunuza ulaşılamıyor",
|
|
1629
1631
|
"ONBOARDING$BACKEND_DISCONNECTED_BODY": "Aşağıdaki bağlantı bilgilerini güncelleyin ve yeniden denemek için kaydedin.",
|
|
@@ -1634,7 +1636,7 @@
|
|
|
1634
1636
|
"ONBOARDING$LLM_SUBTITLE": "Bir sağlayıcı ve model seçin. Anthropic Claude Opus'u önceden seçtik.",
|
|
1635
1637
|
"ONBOARDING$HELLO_TITLE": "Selam ver 👋",
|
|
1636
1638
|
"ONBOARDING$HELLO_SUBTITLE": "OpenHands'e ilk mesajınızı gönderin. Çalışma alanı olmadan yeni bir sohbet başlatacağız.",
|
|
1637
|
-
"ONBOARDING$HELLO_DEFAULT_MESSAGE": "OpenHands'in neler yapabileceğini anlatan basit bir web sayfası oluştur",
|
|
1639
|
+
"ONBOARDING$HELLO_DEFAULT_MESSAGE": "OpenHands'in neler yapabileceğini anlatan basit bir web sayfası oluştur.",
|
|
1638
1640
|
"ONBOARDING$HELLO_LAUNCH": "Gönder",
|
|
1639
1641
|
"ONBOARDING$HELLO_LAUNCHING": "Sohbet başlatılıyor…",
|
|
1640
1642
|
"ONBOARDING$ACP_SECRETS_TITLE": "API anahtarlarınızı ekleyin",
|
|
@@ -1623,7 +1623,9 @@
|
|
|
1623
1623
|
"ONBOARDING$BACKEND_TITLE": "Перевірте бекенд",
|
|
1624
1624
|
"ONBOARDING$BACKEND_SUBTITLE": "OpenHands взаємодіє з агент-сервером. Переконайтеся, що типовий бекенд доступний.",
|
|
1625
1625
|
"ONBOARDING$BACKEND_CONNECTED_TITLE": "З'єднання встановлено! 🎉",
|
|
1626
|
-
"ONBOARDING$BACKEND_CONNECTED_BODY": "
|
|
1626
|
+
"ONBOARDING$BACKEND_CONNECTED_BODY": "Ми запустили типовий бекенд для ваших агентів, але ви можете підключити скільки завгодно бекендів агентів. Один може бути на ноутбуці, один у Docker sandbox і один на віддаленій VM.",
|
|
1627
|
+
"ONBOARDING$BACKEND_SHOW_CONFIGURATION": "Показати конфігурацію",
|
|
1628
|
+
"ONBOARDING$BACKEND_HIDE_CONFIGURATION": "Приховати конфігурацію",
|
|
1627
1629
|
"ONBOARDING$BACKEND_CHECKING": "Перевірка з'єднання з бекендом…",
|
|
1628
1630
|
"ONBOARDING$BACKEND_DISCONNECTED_TITLE": "Не вдається з'єднатися з бекендом",
|
|
1629
1631
|
"ONBOARDING$BACKEND_DISCONNECTED_BODY": "Оновіть нижче параметри з'єднання та збережіть, щоб повторити спробу.",
|
|
@@ -1634,7 +1636,7 @@
|
|
|
1634
1636
|
"ONBOARDING$LLM_SUBTITLE": "Виберіть провайдера та модель. Anthropic Claude Opus уже обрано.",
|
|
1635
1637
|
"ONBOARDING$HELLO_TITLE": "Привітайтеся 👋",
|
|
1636
1638
|
"ONBOARDING$HELLO_SUBTITLE": "Надішліть перше повідомлення до OpenHands. Почнемо нову розмову без робочого простору.",
|
|
1637
|
-
"ONBOARDING$HELLO_DEFAULT_MESSAGE": "Створи просту вебсторінку, що пояснює, на що здатний OpenHands",
|
|
1639
|
+
"ONBOARDING$HELLO_DEFAULT_MESSAGE": "Створи просту вебсторінку, що пояснює, на що здатний OpenHands.",
|
|
1638
1640
|
"ONBOARDING$HELLO_LAUNCH": "Надіслати",
|
|
1639
1641
|
"ONBOARDING$HELLO_LAUNCHING": "Розпочинаємо розмову…",
|
|
1640
1642
|
"ONBOARDING$ACP_SECRETS_TITLE": "Додайте свої ключі API",
|
|
@@ -1623,7 +1623,9 @@
|
|
|
1623
1623
|
"ONBOARDING$BACKEND_TITLE": "检查后端",
|
|
1624
1624
|
"ONBOARDING$BACKEND_SUBTITLE": "OpenHands 通过智能体服务器进行通信。请确认默认后端可访问。",
|
|
1625
1625
|
"ONBOARDING$BACKEND_CONNECTED_TITLE": "已连接!🎉",
|
|
1626
|
-
"ONBOARDING$BACKEND_CONNECTED_BODY": "
|
|
1626
|
+
"ONBOARDING$BACKEND_CONNECTED_BODY": "我们已启动默认后端来运行您的智能体,但您可以连接任意数量的智能体后端。例如,您可以在笔记本电脑、Docker 沙箱或远程 VM 上各运行一个。",
|
|
1627
|
+
"ONBOARDING$BACKEND_SHOW_CONFIGURATION": "显示配置",
|
|
1628
|
+
"ONBOARDING$BACKEND_HIDE_CONFIGURATION": "隐藏配置",
|
|
1627
1629
|
"ONBOARDING$BACKEND_CHECKING": "正在检查后端连接…",
|
|
1628
1630
|
"ONBOARDING$BACKEND_DISCONNECTED_TITLE": "无法连接到后端",
|
|
1629
1631
|
"ONBOARDING$BACKEND_DISCONNECTED_BODY": "请更新下方的连接信息并保存以重试。",
|
|
@@ -1634,7 +1636,7 @@
|
|
|
1634
1636
|
"ONBOARDING$LLM_SUBTITLE": "选择提供商和模型。我们已为你预先选择 Anthropic Claude Opus。",
|
|
1635
1637
|
"ONBOARDING$HELLO_TITLE": "打个招呼 👋",
|
|
1636
1638
|
"ONBOARDING$HELLO_SUBTITLE": "向 OpenHands 发送你的第一条消息。我们将启动一个无工作区的新对话。",
|
|
1637
|
-
"ONBOARDING$HELLO_DEFAULT_MESSAGE": "创建一个简单的网页,说明 OpenHands
|
|
1639
|
+
"ONBOARDING$HELLO_DEFAULT_MESSAGE": "创建一个简单的网页,说明 OpenHands 能做什么。",
|
|
1638
1640
|
"ONBOARDING$HELLO_LAUNCH": "发送",
|
|
1639
1641
|
"ONBOARDING$HELLO_LAUNCHING": "正在开始对话…",
|
|
1640
1642
|
"ONBOARDING$ACP_SECRETS_TITLE": "添加你的 API 密钥",
|
|
@@ -1623,7 +1623,9 @@
|
|
|
1623
1623
|
"ONBOARDING$BACKEND_TITLE": "檢查後端",
|
|
1624
1624
|
"ONBOARDING$BACKEND_SUBTITLE": "OpenHands 透過代理伺服器溝通。請確認預設後端可連線。",
|
|
1625
1625
|
"ONBOARDING$BACKEND_CONNECTED_TITLE": "已連線!🎉",
|
|
1626
|
-
"ONBOARDING$BACKEND_CONNECTED_BODY": "
|
|
1626
|
+
"ONBOARDING$BACKEND_CONNECTED_BODY": "我們已啟動預設後端來執行您的代理,但您可以連接任意數量的代理後端。您可以在筆記型電腦、Docker 沙箱或遠端 VM 上各執行一個。",
|
|
1627
|
+
"ONBOARDING$BACKEND_SHOW_CONFIGURATION": "顯示設定",
|
|
1628
|
+
"ONBOARDING$BACKEND_HIDE_CONFIGURATION": "隱藏設定",
|
|
1627
1629
|
"ONBOARDING$BACKEND_CHECKING": "正在檢查後端連線…",
|
|
1628
1630
|
"ONBOARDING$BACKEND_DISCONNECTED_TITLE": "無法連線到後端",
|
|
1629
1631
|
"ONBOARDING$BACKEND_DISCONNECTED_BODY": "請更新下方連線資訊並儲存以重試。",
|
|
@@ -1634,7 +1636,7 @@
|
|
|
1634
1636
|
"ONBOARDING$LLM_SUBTITLE": "選擇供應商與模型。我們已預先選好 Anthropic Claude Opus。",
|
|
1635
1637
|
"ONBOARDING$HELLO_TITLE": "打個招呼 👋",
|
|
1636
1638
|
"ONBOARDING$HELLO_SUBTITLE": "向 OpenHands 傳送第一則訊息。我們會開始一個沒有工作區的新對話。",
|
|
1637
|
-
"ONBOARDING$HELLO_DEFAULT_MESSAGE": "建立一個簡單的網頁,說明 OpenHands
|
|
1639
|
+
"ONBOARDING$HELLO_DEFAULT_MESSAGE": "建立一個簡單的網頁,說明 OpenHands 能做什麼。",
|
|
1638
1640
|
"ONBOARDING$HELLO_LAUNCH": "傳送",
|
|
1639
1641
|
"ONBOARDING$HELLO_LAUNCHING": "對話開始中…",
|
|
1640
1642
|
"ONBOARDING$ACP_SECRETS_TITLE": "新增你的 API 金鑰",
|
package/config/defaults.json
CHANGED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../node_modules/@openhands/typescript-client/dist/client/file-client.cjs`),t=require(`./agent-server-client-options.cjs`);var n=new Map;function r(e){return/^([/\\]|[a-zA-Z]:[/\\])/.test(e)}function i(e,t){return`${e.replace(/[/\\]+$/,``)}/${t.replace(/^[/\\]+/,``)}`}async function a(r={}){let i=t.getAgentServerClientOptions(r),a=i.host,o=n.get(a);if(o)return o;let s=(async()=>{let{home:t}=await new e.FileClient(i).getHome();if(!t||typeof t!=`string`)throw Error(`Agent server returned an empty home directory`);return t.replace(/[/\\]+$/,``)})();n.set(a,s);try{return await s}catch(e){throw n.delete(a),e}}async function o(e,t={}){let n=e.replace(/[/\\]+$/,``);return n?r(n)?n:i(await a(t),n):a(t)}exports.resolveAbsoluteAgentServerPath=o;
|
|
2
|
+
//# sourceMappingURL=agent-server-home.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-server-home.cjs","names":[],"sources":["../../src/api/agent-server-home.ts"],"sourcesContent":["// @spec WUP-001 — Resolve relative working dirs against /api/file/home\nimport { FileClient } from \"@openhands/typescript-client/clients\";\nimport {\n getAgentServerClientOptions,\n type AgentServerClientOverrides,\n} from \"./agent-server-client-options\";\n\n/**\n * Cache the agent-server's home directory per host so we only round-trip\n * `/api/file/home` once per backend. The home dir is effectively static for\n * the lifetime of a running agent-server (it's `Path.home()` on the host),\n * so caching is safe and avoids hammering the endpoint on every upload.\n *\n * The cache holds `Promise<string>` rather than `string` so concurrent\n * callers share a single in-flight request.\n */\nconst homeDirCache = new Map<string, Promise<string>>();\n\nfunction isAbsolutePath(path: string): boolean {\n // Treat POSIX-style and Windows-style absolute paths as absolute.\n // The agent-server itself is POSIX on Linux/macOS and uses `\\\\` style\n // on Windows; we just need to know whether `Path(path).is_absolute()`\n // would return true on the server.\n //\n // Patterns covered:\n // POSIX absolute: /foo/bar\n // Windows drive: C:\\foo or C:/foo\n // Windows UNC: \\\\server\\share (starts with `\\`, matches `[/\\\\]`)\n return /^([/\\\\]|[a-zA-Z]:[/\\\\])/.test(path);\n}\n\n/**\n * Join a parent directory and a relative child segment with a forward slash,\n * collapsing any duplicate separators that result from the join.\n */\nfunction joinPath(parent: string, child: string): string {\n const left = parent.replace(/[/\\\\]+$/, \"\");\n const right = child.replace(/^[/\\\\]+/, \"\");\n return `${left}/${right}`;\n}\n\n/**\n * Fetch and cache the agent-server's home directory via `GET /api/file/home`.\n *\n * The result is the absolute path returned by `Path.home()` on the\n * agent-server host (e.g. `/Users/foo`, `/root`, or `C:\\\\Users\\\\Foo`). This\n * is the most reliable absolute, writable anchor the agent-server API\n * currently exposes — `/server_info` doesn't include the process CWD.\n *\n * @param overrides Same shape as `getAgentServerClientOptions` — lets cloud\n * sandboxes pass a `conversationUrl` + `sessionApiKey` so the lookup goes\n * to the per-conversation runtime rather than the bundled local backend.\n */\nexport async function getAgentServerHomeDir(\n overrides: AgentServerClientOverrides = {},\n): Promise<string> {\n const options = getAgentServerClientOptions(overrides);\n const cacheKey = options.host;\n const cached = homeDirCache.get(cacheKey);\n if (cached) return cached;\n\n const lookup = (async () => {\n const { home } = await new FileClient(options).getHome();\n if (!home || typeof home !== \"string\") {\n throw new Error(\"Agent server returned an empty home directory\");\n }\n return home.replace(/[/\\\\]+$/, \"\");\n })();\n\n homeDirCache.set(cacheKey, lookup);\n try {\n return await lookup;\n } catch (error) {\n // Don't cache failures — let the next call retry.\n homeDirCache.delete(cacheKey);\n throw error;\n }\n}\n\n/** Test-only helper. */\nexport function clearAgentServerHomeDirCache(): void {\n homeDirCache.clear();\n}\n\n/**\n * Resolve a (possibly relative) working dir to an absolute path the\n * agent-server's file APIs will accept.\n *\n * - If `workingDir` is already absolute, returns it unchanged.\n * - Otherwise prepends the agent-server's home dir (looked up via\n * `/api/file/home` and cached). This matches how the published binary\n * and Docker entrypoint expect to anchor relative working dirs: under\n * `~/workspace/project` rather than the filesystem root.\n *\n * Why this matters: the agent-server's `/api/file/upload` endpoint requires\n * an absolute path and `mkdir -p`s the parent. Naively prepending `/` to a\n * relative dir like `workspace/project/<hex>` produces `/workspace/...`,\n * which on macOS lives under the SIP-protected read-only root and fails\n * with `Errno 30: Read-only file system: '/workspace'`. Resolving against\n * `Path.home()` instead puts the path somewhere reliably writable.\n */\nexport async function resolveAbsoluteAgentServerPath(\n workingDir: string,\n overrides: AgentServerClientOverrides = {},\n): Promise<string> {\n const trimmed = workingDir.replace(/[/\\\\]+$/, \"\");\n if (!trimmed) {\n return getAgentServerHomeDir(overrides);\n }\n if (isAbsolutePath(trimmed)) return trimmed;\n\n const home = await getAgentServerHomeDir(overrides);\n return joinPath(home, trimmed);\n}\n"],"mappings":"wLAgBA,IAAM,EAAe,IAAI,IAEzB,SAAS,EAAe,EAAuB,CAU7C,MAAO,0BAA0B,KAAK,EAAK,CAO7C,SAAS,EAAS,EAAgB,EAAuB,CAGvD,MAAO,GAFM,EAAO,QAAQ,UAAW,GAE7B,CAAK,GADD,EAAM,QAAQ,UAAW,GACrB,GAepB,eAAsB,EACpB,EAAwC,EAAE,CACzB,CACjB,IAAM,EAAU,EAAA,4BAA4B,EAAU,CAChD,EAAW,EAAQ,KACnB,EAAS,EAAa,IAAI,EAAS,CACzC,GAAI,EAAQ,OAAO,EAEnB,IAAM,GAAU,SAAY,CAC1B,GAAM,CAAE,QAAS,MAAM,IAAI,EAAA,WAAW,EAAQ,CAAC,SAAS,CACxD,GAAI,CAAC,GAAQ,OAAO,GAAS,SAC3B,MAAU,MAAM,gDAAgD,CAElE,OAAO,EAAK,QAAQ,UAAW,GAAG,IAChC,CAEJ,EAAa,IAAI,EAAU,EAAO,CAClC,GAAI,CACF,OAAO,MAAM,QACN,EAAO,CAGd,MADA,EAAa,OAAO,EAAS,CACvB,GA0BV,eAAsB,EACpB,EACA,EAAwC,EAAE,CACzB,CACjB,IAAM,EAAU,EAAW,QAAQ,UAAW,GAAG,CAOjD,OANK,EAGD,EAAe,EAAQ,CAAS,EAG7B,EAAS,MADG,EAAsB,EAAU,CAC7B,EAAQ,CALrB,EAAsB,EAAU"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type AgentServerClientOverrides } from "./agent-server-client-options";
|
|
2
|
+
/**
|
|
3
|
+
* Fetch and cache the agent-server's home directory via `GET /api/file/home`.
|
|
4
|
+
*
|
|
5
|
+
* The result is the absolute path returned by `Path.home()` on the
|
|
6
|
+
* agent-server host (e.g. `/Users/foo`, `/root`, or `C:\\Users\\Foo`). This
|
|
7
|
+
* is the most reliable absolute, writable anchor the agent-server API
|
|
8
|
+
* currently exposes — `/server_info` doesn't include the process CWD.
|
|
9
|
+
*
|
|
10
|
+
* @param overrides Same shape as `getAgentServerClientOptions` — lets cloud
|
|
11
|
+
* sandboxes pass a `conversationUrl` + `sessionApiKey` so the lookup goes
|
|
12
|
+
* to the per-conversation runtime rather than the bundled local backend.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getAgentServerHomeDir(overrides?: AgentServerClientOverrides): Promise<string>;
|
|
15
|
+
/** Test-only helper. */
|
|
16
|
+
export declare function clearAgentServerHomeDirCache(): void;
|
|
17
|
+
/**
|
|
18
|
+
* Resolve a (possibly relative) working dir to an absolute path the
|
|
19
|
+
* agent-server's file APIs will accept.
|
|
20
|
+
*
|
|
21
|
+
* - If `workingDir` is already absolute, returns it unchanged.
|
|
22
|
+
* - Otherwise prepends the agent-server's home dir (looked up via
|
|
23
|
+
* `/api/file/home` and cached). This matches how the published binary
|
|
24
|
+
* and Docker entrypoint expect to anchor relative working dirs: under
|
|
25
|
+
* `~/workspace/project` rather than the filesystem root.
|
|
26
|
+
*
|
|
27
|
+
* Why this matters: the agent-server's `/api/file/upload` endpoint requires
|
|
28
|
+
* an absolute path and `mkdir -p`s the parent. Naively prepending `/` to a
|
|
29
|
+
* relative dir like `workspace/project/<hex>` produces `/workspace/...`,
|
|
30
|
+
* which on macOS lives under the SIP-protected read-only root and fails
|
|
31
|
+
* with `Errno 30: Read-only file system: '/workspace'`. Resolving against
|
|
32
|
+
* `Path.home()` instead puts the path somewhere reliably writable.
|
|
33
|
+
*/
|
|
34
|
+
export declare function resolveAbsoluteAgentServerPath(workingDir: string, overrides?: AgentServerClientOverrides): Promise<string>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { FileClient as e } from "../node_modules/@openhands/typescript-client/dist/client/file-client.js";
|
|
2
|
+
import { getAgentServerClientOptions as t } from "./agent-server-client-options.js";
|
|
3
|
+
//#region src/api/agent-server-home.ts
|
|
4
|
+
var n = /* @__PURE__ */ new Map();
|
|
5
|
+
function r(e) {
|
|
6
|
+
return /^([/\\]|[a-zA-Z]:[/\\])/.test(e);
|
|
7
|
+
}
|
|
8
|
+
function i(e, t) {
|
|
9
|
+
return `${e.replace(/[/\\]+$/, "")}/${t.replace(/^[/\\]+/, "")}`;
|
|
10
|
+
}
|
|
11
|
+
async function a(r = {}) {
|
|
12
|
+
let i = t(r), a = i.host, o = n.get(a);
|
|
13
|
+
if (o) return o;
|
|
14
|
+
let s = (async () => {
|
|
15
|
+
let { home: t } = await new e(i).getHome();
|
|
16
|
+
if (!t || typeof t != "string") throw Error("Agent server returned an empty home directory");
|
|
17
|
+
return t.replace(/[/\\]+$/, "");
|
|
18
|
+
})();
|
|
19
|
+
n.set(a, s);
|
|
20
|
+
try {
|
|
21
|
+
return await s;
|
|
22
|
+
} catch (e) {
|
|
23
|
+
throw n.delete(a), e;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async function o(e, t = {}) {
|
|
27
|
+
let n = e.replace(/[/\\]+$/, "");
|
|
28
|
+
return n ? r(n) ? n : i(await a(t), n) : a(t);
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
export { o as resolveAbsoluteAgentServerPath };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=agent-server-home.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-server-home.js","names":[],"sources":["../../src/api/agent-server-home.ts"],"sourcesContent":["// @spec WUP-001 — Resolve relative working dirs against /api/file/home\nimport { FileClient } from \"@openhands/typescript-client/clients\";\nimport {\n getAgentServerClientOptions,\n type AgentServerClientOverrides,\n} from \"./agent-server-client-options\";\n\n/**\n * Cache the agent-server's home directory per host so we only round-trip\n * `/api/file/home` once per backend. The home dir is effectively static for\n * the lifetime of a running agent-server (it's `Path.home()` on the host),\n * so caching is safe and avoids hammering the endpoint on every upload.\n *\n * The cache holds `Promise<string>` rather than `string` so concurrent\n * callers share a single in-flight request.\n */\nconst homeDirCache = new Map<string, Promise<string>>();\n\nfunction isAbsolutePath(path: string): boolean {\n // Treat POSIX-style and Windows-style absolute paths as absolute.\n // The agent-server itself is POSIX on Linux/macOS and uses `\\\\` style\n // on Windows; we just need to know whether `Path(path).is_absolute()`\n // would return true on the server.\n //\n // Patterns covered:\n // POSIX absolute: /foo/bar\n // Windows drive: C:\\foo or C:/foo\n // Windows UNC: \\\\server\\share (starts with `\\`, matches `[/\\\\]`)\n return /^([/\\\\]|[a-zA-Z]:[/\\\\])/.test(path);\n}\n\n/**\n * Join a parent directory and a relative child segment with a forward slash,\n * collapsing any duplicate separators that result from the join.\n */\nfunction joinPath(parent: string, child: string): string {\n const left = parent.replace(/[/\\\\]+$/, \"\");\n const right = child.replace(/^[/\\\\]+/, \"\");\n return `${left}/${right}`;\n}\n\n/**\n * Fetch and cache the agent-server's home directory via `GET /api/file/home`.\n *\n * The result is the absolute path returned by `Path.home()` on the\n * agent-server host (e.g. `/Users/foo`, `/root`, or `C:\\\\Users\\\\Foo`). This\n * is the most reliable absolute, writable anchor the agent-server API\n * currently exposes — `/server_info` doesn't include the process CWD.\n *\n * @param overrides Same shape as `getAgentServerClientOptions` — lets cloud\n * sandboxes pass a `conversationUrl` + `sessionApiKey` so the lookup goes\n * to the per-conversation runtime rather than the bundled local backend.\n */\nexport async function getAgentServerHomeDir(\n overrides: AgentServerClientOverrides = {},\n): Promise<string> {\n const options = getAgentServerClientOptions(overrides);\n const cacheKey = options.host;\n const cached = homeDirCache.get(cacheKey);\n if (cached) return cached;\n\n const lookup = (async () => {\n const { home } = await new FileClient(options).getHome();\n if (!home || typeof home !== \"string\") {\n throw new Error(\"Agent server returned an empty home directory\");\n }\n return home.replace(/[/\\\\]+$/, \"\");\n })();\n\n homeDirCache.set(cacheKey, lookup);\n try {\n return await lookup;\n } catch (error) {\n // Don't cache failures — let the next call retry.\n homeDirCache.delete(cacheKey);\n throw error;\n }\n}\n\n/** Test-only helper. */\nexport function clearAgentServerHomeDirCache(): void {\n homeDirCache.clear();\n}\n\n/**\n * Resolve a (possibly relative) working dir to an absolute path the\n * agent-server's file APIs will accept.\n *\n * - If `workingDir` is already absolute, returns it unchanged.\n * - Otherwise prepends the agent-server's home dir (looked up via\n * `/api/file/home` and cached). This matches how the published binary\n * and Docker entrypoint expect to anchor relative working dirs: under\n * `~/workspace/project` rather than the filesystem root.\n *\n * Why this matters: the agent-server's `/api/file/upload` endpoint requires\n * an absolute path and `mkdir -p`s the parent. Naively prepending `/` to a\n * relative dir like `workspace/project/<hex>` produces `/workspace/...`,\n * which on macOS lives under the SIP-protected read-only root and fails\n * with `Errno 30: Read-only file system: '/workspace'`. Resolving against\n * `Path.home()` instead puts the path somewhere reliably writable.\n */\nexport async function resolveAbsoluteAgentServerPath(\n workingDir: string,\n overrides: AgentServerClientOverrides = {},\n): Promise<string> {\n const trimmed = workingDir.replace(/[/\\\\]+$/, \"\");\n if (!trimmed) {\n return getAgentServerHomeDir(overrides);\n }\n if (isAbsolutePath(trimmed)) return trimmed;\n\n const home = await getAgentServerHomeDir(overrides);\n return joinPath(home, trimmed);\n}\n"],"mappings":";;;AAgBA,IAAM,oBAAe,IAAI,KAA8B;AAEvD,SAAS,EAAe,GAAuB;AAU7C,QAAO,0BAA0B,KAAK,EAAK;;AAO7C,SAAS,EAAS,GAAgB,GAAuB;AAGvD,QAAO,GAFM,EAAO,QAAQ,WAAW,GAE7B,CAAK,GADD,EAAM,QAAQ,WAAW,GACrB;;AAepB,eAAsB,EACpB,IAAwC,EAAE,EACzB;CACjB,IAAM,IAAU,EAA4B,EAAU,EAChD,IAAW,EAAQ,MACnB,IAAS,EAAa,IAAI,EAAS;AACzC,KAAI,EAAQ,QAAO;CAEnB,IAAM,KAAU,YAAY;EAC1B,IAAM,EAAE,YAAS,MAAM,IAAI,EAAW,EAAQ,CAAC,SAAS;AACxD,MAAI,CAAC,KAAQ,OAAO,KAAS,SAC3B,OAAU,MAAM,gDAAgD;AAElE,SAAO,EAAK,QAAQ,WAAW,GAAG;KAChC;AAEJ,GAAa,IAAI,GAAU,EAAO;AAClC,KAAI;AACF,SAAO,MAAM;UACN,GAAO;AAGd,QADA,EAAa,OAAO,EAAS,EACvB;;;AA0BV,eAAsB,EACpB,GACA,IAAwC,EAAE,EACzB;CACjB,IAAM,IAAU,EAAW,QAAQ,WAAW,GAAG;AAOjD,QANK,IAGD,EAAe,EAAQ,GAAS,IAG7B,EAAS,MADG,EAAsB,EAAU,EAC7B,EAAQ,GALrB,EAAsB,EAAU"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../node_modules/@openhands/typescript-client/dist/client/llm-client.cjs`),
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../backend-registry/active-store.cjs`),t=require(`../../node_modules/@openhands/typescript-client/dist/client/llm-client.cjs`),n=require(`../agent-server-client-options.cjs`),r=require(`../cloud/proxy.cjs`);function i(e,t){if(!t)return e;let n=t.toLowerCase();return e.filter(e=>e.name.toLowerCase().includes(n))}function a(e,t){return t===void 0?e:e.filter(e=>e.verified===t)}function o(e,t){return!t||t<=0?e:e.slice(0,t)}function s(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e))r!==void 0&&t.set(n,String(r));let n=t.toString();return n?`?${n}`:``}var c=class{static async searchModels(c={},l){let u=e.getActiveBackend();if(u.backend.kind===`cloud`){let e=s({page_id:c.page_id,limit:c.limit,query:c.query,verified__eq:c.verified__eq,provider__eq:c.provider__eq});return r.callCloudProxy({backend:u.backend,method:`GET`,path:`/api/v1/config/models/search${e}`})}let d=new t.LLMMetadataClient(n.getAgentServerClientOptions()),f=l===void 0?d.getVerifiedModels():Promise.resolve(l),[p,m]=await Promise.all([d.getModels(),f]),h=c.provider__eq??null,g=new Set(h?m?.[h]??[]:[]),_=[...g].map(e=>({provider:h,name:e,verified:!0})),v=h?(p??[]).filter(e=>e.startsWith(`${h}/`)).map(e=>e.slice(h.length+1)).filter(e=>e.length>0&&!g.has(e)).map(e=>({provider:h,name:e,verified:!1})):[];return{items:o(a(i([..._,...v],c.query),c.verified__eq),c.limit),next_page_id:null}}static async searchProviders(c={},l){let u=e.getActiveBackend();if(u.backend.kind===`cloud`){let e=s({page_id:c.page_id,limit:c.limit,query:c.query,verified__eq:c.verified__eq});return r.callCloudProxy({backend:u.backend,method:`GET`,path:`/api/v1/config/providers/search${e}`})}let d=new t.LLMMetadataClient(n.getAgentServerClientOptions()),f=l===void 0?d.getVerifiedModels():Promise.resolve(l),[p,m]=await Promise.all([d.getProviders(),f]),h=new Set(Object.keys(m??{}));return{items:o(a(i([...new Set([...h,...p??[]])].map(e=>({name:e,verified:h.has(e)})),c.query),c.verified__eq),c.limit),next_page_id:null}}};exports.default=c;
|
|
2
2
|
//# sourceMappingURL=config-service.api.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-service.api.cjs","names":[],"sources":["../../../src/api/config-service/config-service.api.ts"],"sourcesContent":["import { LLMMetadataClient } from \"@openhands/typescript-client/clients\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\nimport type {\n LLMModel,\n LLMModelPage,\n LLMProvider,\n ProviderPage,\n SearchModelsParams,\n SearchProvidersParams,\n} from \"./config-service.types\";\n\nfunction filterByQuery<T extends { name: string }>(\n items: T[],\n query?: string,\n): T[] {\n if (!query) {\n return items;\n }\n\n const normalizedQuery = query.toLowerCase();\n return items.filter((item) =>\n item.name.toLowerCase().includes(normalizedQuery),\n );\n}\n\nfunction filterByVerified<T extends { verified: boolean }>(\n items: T[],\n verified?: boolean,\n): T[] {\n if (verified === undefined) {\n return items;\n }\n\n return items.filter((item) => item.verified === verified);\n}\n\nfunction limitItems<T>(items: T[], limit?: number): T[] {\n if (!limit || limit <= 0) {\n return items;\n }\n\n return items.slice(0, limit);\n}\n\nclass ConfigService {\n static async searchModels(\n params: SearchModelsParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<LLMModelPage> {\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [models, verifiedMap] = await Promise.all([\n llmClient.getModels(),\n verifiedFetch,\n ]);\n\n const provider = params.provider__eq ?? null;\n const verifiedNames = new Set(\n provider ? (verifiedMap?.[provider] ?? []) : [],\n );\n const verifiedItems: LLMModel[] = [...verifiedNames].map((name) => ({\n provider,\n name,\n verified: true,\n }));\n\n const prefixedItems: LLMModel[] = provider\n ? (models ?? [])\n .filter((model) => model.startsWith(`${provider}/`))\n .map((model) => model.slice(provider.length + 1))\n .filter((name) => name.length > 0 && !verifiedNames.has(name))\n .map((name) => ({\n provider,\n name,\n verified: false,\n }))\n : [];\n\n const items = limitItems(\n filterByVerified(\n filterByQuery([...verifiedItems, ...prefixedItems], params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return {
|
|
1
|
+
{"version":3,"file":"config-service.api.cjs","names":[],"sources":["../../../src/api/config-service/config-service.api.ts"],"sourcesContent":["import { LLMMetadataClient } from \"@openhands/typescript-client/clients\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport type {\n LLMModel,\n LLMModelPage,\n LLMProvider,\n ProviderPage,\n SearchModelsParams,\n SearchProvidersParams,\n} from \"./config-service.types\";\n\nfunction filterByQuery<T extends { name: string }>(\n items: T[],\n query?: string,\n): T[] {\n if (!query) {\n return items;\n }\n\n const normalizedQuery = query.toLowerCase();\n return items.filter((item) =>\n item.name.toLowerCase().includes(normalizedQuery),\n );\n}\n\nfunction filterByVerified<T extends { verified: boolean }>(\n items: T[],\n verified?: boolean,\n): T[] {\n if (verified === undefined) {\n return items;\n }\n\n return items.filter((item) => item.verified === verified);\n}\n\nfunction limitItems<T>(items: T[], limit?: number): T[] {\n if (!limit || limit <= 0) {\n return items;\n }\n\n return items.slice(0, limit);\n}\n\nfunction buildCloudQueryString(\n params: Record<string, string | number | boolean | undefined>,\n): string {\n const qs = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) qs.set(key, String(value));\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\nclass ConfigService {\n /**\n * @param verifiedByProvider - Pre-fetched verified-models map used by the\n * local reconstruction path. Ignored for cloud backends, which call\n * `/api/v1/config/models/search` directly (verified status is embedded in\n * each returned item).\n */\n static async searchModels(\n params: SearchModelsParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<LLMModelPage> {\n const active = getActiveBackend();\n\n if (active.backend.kind === \"cloud\") {\n // Cloud exposes /api/v1/config/models/search which returns LLMModelPage directly.\n // verifiedByProvider is not needed — the cloud API embeds verified status natively.\n const qs = buildCloudQueryString({\n page_id: params.page_id,\n limit: params.limit,\n query: params.query,\n verified__eq: params.verified__eq,\n provider__eq: params.provider__eq,\n });\n return callCloudProxy<LLMModelPage>({\n backend: active.backend,\n method: \"GET\",\n path: `/api/v1/config/models/search${qs}`,\n });\n }\n\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [models, verifiedMap] = await Promise.all([\n llmClient.getModels(),\n verifiedFetch,\n ]);\n\n const provider = params.provider__eq ?? null;\n const verifiedNames = new Set(\n provider ? (verifiedMap?.[provider] ?? []) : [],\n );\n const verifiedItems: LLMModel[] = [...verifiedNames].map((name) => ({\n provider,\n name,\n verified: true,\n }));\n\n const prefixedItems: LLMModel[] = provider\n ? (models ?? [])\n .filter((model) => model.startsWith(`${provider}/`))\n .map((model) => model.slice(provider.length + 1))\n .filter((name) => name.length > 0 && !verifiedNames.has(name))\n .map((name) => ({\n provider,\n name,\n verified: false,\n }))\n : [];\n\n const items = limitItems(\n filterByVerified(\n filterByQuery([...verifiedItems, ...prefixedItems], params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return { items, next_page_id: null };\n }\n\n /**\n * @param verifiedByProvider - Pre-fetched verified-models map used by the\n * local reconstruction path. Ignored for cloud backends, which call\n * `/api/v1/config/providers/search` directly (verified status is embedded in\n * each returned item).\n */\n static async searchProviders(\n params: SearchProvidersParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<ProviderPage> {\n const active = getActiveBackend();\n\n if (active.backend.kind === \"cloud\") {\n // Cloud exposes /api/v1/config/providers/search which returns ProviderPage directly.\n // verifiedByProvider is not needed — the cloud API embeds verified status natively.\n const qs = buildCloudQueryString({\n page_id: params.page_id,\n limit: params.limit,\n query: params.query,\n verified__eq: params.verified__eq,\n });\n return callCloudProxy<ProviderPage>({\n backend: active.backend,\n method: \"GET\",\n path: `/api/v1/config/providers/search${qs}`,\n });\n }\n\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [providers, verifiedMap] = await Promise.all([\n llmClient.getProviders(),\n verifiedFetch,\n ]);\n\n const verifiedProviders = new Set(Object.keys(verifiedMap ?? {}));\n const names = new Set<string>([...verifiedProviders, ...(providers ?? [])]);\n const providerItems: LLMProvider[] = [...names].map((name) => ({\n name,\n verified: verifiedProviders.has(name),\n }));\n\n const items = limitItems(\n filterByVerified(\n filterByQuery(providerItems, params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return { items, next_page_id: null };\n }\n}\n\nexport default ConfigService;\n"],"mappings":"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"}
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
import type { LLMModelPage, ProviderPage, SearchModelsParams, SearchProvidersParams } from "./config-service.types";
|
|
2
2
|
declare class ConfigService {
|
|
3
|
+
/**
|
|
4
|
+
* @param verifiedByProvider - Pre-fetched verified-models map used by the
|
|
5
|
+
* local reconstruction path. Ignored for cloud backends, which call
|
|
6
|
+
* `/api/v1/config/models/search` directly (verified status is embedded in
|
|
7
|
+
* each returned item).
|
|
8
|
+
*/
|
|
3
9
|
static searchModels(params?: SearchModelsParams, verifiedByProvider?: Record<string, string[]>): Promise<LLMModelPage>;
|
|
10
|
+
/**
|
|
11
|
+
* @param verifiedByProvider - Pre-fetched verified-models map used by the
|
|
12
|
+
* local reconstruction path. Ignored for cloud backends, which call
|
|
13
|
+
* `/api/v1/config/providers/search` directly (verified status is embedded in
|
|
14
|
+
* each returned item).
|
|
15
|
+
*/
|
|
4
16
|
static searchProviders(params?: SearchProvidersParams, verifiedByProvider?: Record<string, string[]>): Promise<ProviderPage>;
|
|
5
17
|
}
|
|
6
18
|
export default ConfigService;
|
|
@@ -1,45 +1,82 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { getActiveBackend as e } from "../backend-registry/active-store.js";
|
|
2
|
+
import { LLMMetadataClient as t } from "../../node_modules/@openhands/typescript-client/dist/client/llm-client.js";
|
|
3
|
+
import { getAgentServerClientOptions as n } from "../agent-server-client-options.js";
|
|
4
|
+
import { callCloudProxy as r } from "../cloud/proxy.js";
|
|
3
5
|
//#region src/api/config-service/config-service.api.ts
|
|
4
|
-
function
|
|
6
|
+
function i(e, t) {
|
|
5
7
|
if (!t) return e;
|
|
6
8
|
let n = t.toLowerCase();
|
|
7
9
|
return e.filter((e) => e.name.toLowerCase().includes(n));
|
|
8
10
|
}
|
|
9
|
-
function
|
|
11
|
+
function a(e, t) {
|
|
10
12
|
return t === void 0 ? e : e.filter((e) => e.verified === t);
|
|
11
13
|
}
|
|
12
|
-
function
|
|
14
|
+
function o(e, t) {
|
|
13
15
|
return !t || t <= 0 ? e : e.slice(0, t);
|
|
14
16
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
function s(e) {
|
|
18
|
+
let t = new URLSearchParams();
|
|
19
|
+
for (let [n, r] of Object.entries(e)) r !== void 0 && t.set(n, String(r));
|
|
20
|
+
let n = t.toString();
|
|
21
|
+
return n ? `?${n}` : "";
|
|
22
|
+
}
|
|
23
|
+
var c = class {
|
|
24
|
+
static async searchModels(c = {}, l) {
|
|
25
|
+
let u = e();
|
|
26
|
+
if (u.backend.kind === "cloud") {
|
|
27
|
+
let e = s({
|
|
28
|
+
page_id: c.page_id,
|
|
29
|
+
limit: c.limit,
|
|
30
|
+
query: c.query,
|
|
31
|
+
verified__eq: c.verified__eq,
|
|
32
|
+
provider__eq: c.provider__eq
|
|
33
|
+
});
|
|
34
|
+
return r({
|
|
35
|
+
backend: u.backend,
|
|
36
|
+
method: "GET",
|
|
37
|
+
path: `/api/v1/config/models/search${e}`
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
let d = new t(n()), f = l === void 0 ? d.getVerifiedModels() : Promise.resolve(l), [p, m] = await Promise.all([d.getModels(), f]), h = c.provider__eq ?? null, g = new Set(h ? m?.[h] ?? [] : []), _ = [...g].map((e) => ({
|
|
41
|
+
provider: h,
|
|
19
42
|
name: e,
|
|
20
43
|
verified: !0
|
|
21
|
-
})),
|
|
22
|
-
provider:
|
|
44
|
+
})), v = h ? (p ?? []).filter((e) => e.startsWith(`${h}/`)).map((e) => e.slice(h.length + 1)).filter((e) => e.length > 0 && !g.has(e)).map((e) => ({
|
|
45
|
+
provider: h,
|
|
23
46
|
name: e,
|
|
24
47
|
verified: !1
|
|
25
48
|
})) : [];
|
|
26
49
|
return {
|
|
27
|
-
items:
|
|
50
|
+
items: o(a(i([..._, ...v], c.query), c.verified__eq), c.limit),
|
|
28
51
|
next_page_id: null
|
|
29
52
|
};
|
|
30
53
|
}
|
|
31
|
-
static async searchProviders(
|
|
32
|
-
let
|
|
54
|
+
static async searchProviders(c = {}, l) {
|
|
55
|
+
let u = e();
|
|
56
|
+
if (u.backend.kind === "cloud") {
|
|
57
|
+
let e = s({
|
|
58
|
+
page_id: c.page_id,
|
|
59
|
+
limit: c.limit,
|
|
60
|
+
query: c.query,
|
|
61
|
+
verified__eq: c.verified__eq
|
|
62
|
+
});
|
|
63
|
+
return r({
|
|
64
|
+
backend: u.backend,
|
|
65
|
+
method: "GET",
|
|
66
|
+
path: `/api/v1/config/providers/search${e}`
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
let d = new t(n()), f = l === void 0 ? d.getVerifiedModels() : Promise.resolve(l), [p, m] = await Promise.all([d.getProviders(), f]), h = new Set(Object.keys(m ?? {}));
|
|
33
70
|
return {
|
|
34
|
-
items:
|
|
71
|
+
items: o(a(i([...new Set([...h, ...p ?? []])].map((e) => ({
|
|
35
72
|
name: e,
|
|
36
|
-
verified:
|
|
37
|
-
})),
|
|
73
|
+
verified: h.has(e)
|
|
74
|
+
})), c.query), c.verified__eq), c.limit),
|
|
38
75
|
next_page_id: null
|
|
39
76
|
};
|
|
40
77
|
}
|
|
41
78
|
};
|
|
42
79
|
//#endregion
|
|
43
|
-
export {
|
|
80
|
+
export { c as default };
|
|
44
81
|
|
|
45
82
|
//# sourceMappingURL=config-service.api.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-service.api.js","names":[],"sources":["../../../src/api/config-service/config-service.api.ts"],"sourcesContent":["import { LLMMetadataClient } from \"@openhands/typescript-client/clients\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\nimport type {\n LLMModel,\n LLMModelPage,\n LLMProvider,\n ProviderPage,\n SearchModelsParams,\n SearchProvidersParams,\n} from \"./config-service.types\";\n\nfunction filterByQuery<T extends { name: string }>(\n items: T[],\n query?: string,\n): T[] {\n if (!query) {\n return items;\n }\n\n const normalizedQuery = query.toLowerCase();\n return items.filter((item) =>\n item.name.toLowerCase().includes(normalizedQuery),\n );\n}\n\nfunction filterByVerified<T extends { verified: boolean }>(\n items: T[],\n verified?: boolean,\n): T[] {\n if (verified === undefined) {\n return items;\n }\n\n return items.filter((item) => item.verified === verified);\n}\n\nfunction limitItems<T>(items: T[], limit?: number): T[] {\n if (!limit || limit <= 0) {\n return items;\n }\n\n return items.slice(0, limit);\n}\n\nclass ConfigService {\n static async searchModels(\n params: SearchModelsParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<LLMModelPage> {\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [models, verifiedMap] = await Promise.all([\n llmClient.getModels(),\n verifiedFetch,\n ]);\n\n const provider = params.provider__eq ?? null;\n const verifiedNames = new Set(\n provider ? (verifiedMap?.[provider] ?? []) : [],\n );\n const verifiedItems: LLMModel[] = [...verifiedNames].map((name) => ({\n provider,\n name,\n verified: true,\n }));\n\n const prefixedItems: LLMModel[] = provider\n ? (models ?? [])\n .filter((model) => model.startsWith(`${provider}/`))\n .map((model) => model.slice(provider.length + 1))\n .filter((name) => name.length > 0 && !verifiedNames.has(name))\n .map((name) => ({\n provider,\n name,\n verified: false,\n }))\n : [];\n\n const items = limitItems(\n filterByVerified(\n filterByQuery([...verifiedItems, ...prefixedItems], params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return {
|
|
1
|
+
{"version":3,"file":"config-service.api.js","names":[],"sources":["../../../src/api/config-service/config-service.api.ts"],"sourcesContent":["import { LLMMetadataClient } from \"@openhands/typescript-client/clients\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport type {\n LLMModel,\n LLMModelPage,\n LLMProvider,\n ProviderPage,\n SearchModelsParams,\n SearchProvidersParams,\n} from \"./config-service.types\";\n\nfunction filterByQuery<T extends { name: string }>(\n items: T[],\n query?: string,\n): T[] {\n if (!query) {\n return items;\n }\n\n const normalizedQuery = query.toLowerCase();\n return items.filter((item) =>\n item.name.toLowerCase().includes(normalizedQuery),\n );\n}\n\nfunction filterByVerified<T extends { verified: boolean }>(\n items: T[],\n verified?: boolean,\n): T[] {\n if (verified === undefined) {\n return items;\n }\n\n return items.filter((item) => item.verified === verified);\n}\n\nfunction limitItems<T>(items: T[], limit?: number): T[] {\n if (!limit || limit <= 0) {\n return items;\n }\n\n return items.slice(0, limit);\n}\n\nfunction buildCloudQueryString(\n params: Record<string, string | number | boolean | undefined>,\n): string {\n const qs = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) qs.set(key, String(value));\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\nclass ConfigService {\n /**\n * @param verifiedByProvider - Pre-fetched verified-models map used by the\n * local reconstruction path. Ignored for cloud backends, which call\n * `/api/v1/config/models/search` directly (verified status is embedded in\n * each returned item).\n */\n static async searchModels(\n params: SearchModelsParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<LLMModelPage> {\n const active = getActiveBackend();\n\n if (active.backend.kind === \"cloud\") {\n // Cloud exposes /api/v1/config/models/search which returns LLMModelPage directly.\n // verifiedByProvider is not needed — the cloud API embeds verified status natively.\n const qs = buildCloudQueryString({\n page_id: params.page_id,\n limit: params.limit,\n query: params.query,\n verified__eq: params.verified__eq,\n provider__eq: params.provider__eq,\n });\n return callCloudProxy<LLMModelPage>({\n backend: active.backend,\n method: \"GET\",\n path: `/api/v1/config/models/search${qs}`,\n });\n }\n\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [models, verifiedMap] = await Promise.all([\n llmClient.getModels(),\n verifiedFetch,\n ]);\n\n const provider = params.provider__eq ?? null;\n const verifiedNames = new Set(\n provider ? (verifiedMap?.[provider] ?? []) : [],\n );\n const verifiedItems: LLMModel[] = [...verifiedNames].map((name) => ({\n provider,\n name,\n verified: true,\n }));\n\n const prefixedItems: LLMModel[] = provider\n ? (models ?? [])\n .filter((model) => model.startsWith(`${provider}/`))\n .map((model) => model.slice(provider.length + 1))\n .filter((name) => name.length > 0 && !verifiedNames.has(name))\n .map((name) => ({\n provider,\n name,\n verified: false,\n }))\n : [];\n\n const items = limitItems(\n filterByVerified(\n filterByQuery([...verifiedItems, ...prefixedItems], params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return { items, next_page_id: null };\n }\n\n /**\n * @param verifiedByProvider - Pre-fetched verified-models map used by the\n * local reconstruction path. Ignored for cloud backends, which call\n * `/api/v1/config/providers/search` directly (verified status is embedded in\n * each returned item).\n */\n static async searchProviders(\n params: SearchProvidersParams = {},\n verifiedByProvider?: Record<string, string[]>,\n ): Promise<ProviderPage> {\n const active = getActiveBackend();\n\n if (active.backend.kind === \"cloud\") {\n // Cloud exposes /api/v1/config/providers/search which returns ProviderPage directly.\n // verifiedByProvider is not needed — the cloud API embeds verified status natively.\n const qs = buildCloudQueryString({\n page_id: params.page_id,\n limit: params.limit,\n query: params.query,\n verified__eq: params.verified__eq,\n });\n return callCloudProxy<ProviderPage>({\n backend: active.backend,\n method: \"GET\",\n path: `/api/v1/config/providers/search${qs}`,\n });\n }\n\n const llmClient = new LLMMetadataClient(getAgentServerClientOptions());\n const verifiedFetch =\n verifiedByProvider !== undefined\n ? Promise.resolve(verifiedByProvider)\n : llmClient.getVerifiedModels();\n const [providers, verifiedMap] = await Promise.all([\n llmClient.getProviders(),\n verifiedFetch,\n ]);\n\n const verifiedProviders = new Set(Object.keys(verifiedMap ?? {}));\n const names = new Set<string>([...verifiedProviders, ...(providers ?? [])]);\n const providerItems: LLMProvider[] = [...names].map((name) => ({\n name,\n verified: verifiedProviders.has(name),\n }));\n\n const items = limitItems(\n filterByVerified(\n filterByQuery(providerItems, params.query),\n params.verified__eq,\n ),\n params.limit,\n );\n\n return { items, next_page_id: null };\n }\n}\n\nexport default ConfigService;\n"],"mappings":";;;;;AAaA,SAAS,EACP,GACA,GACK;AACL,KAAI,CAAC,EACH,QAAO;CAGT,IAAM,IAAkB,EAAM,aAAa;AAC3C,QAAO,EAAM,QAAQ,MACnB,EAAK,KAAK,aAAa,CAAC,SAAS,EAAgB,CAClD;;AAGH,SAAS,EACP,GACA,GACK;AAKL,QAJI,MAAa,KAAA,IACR,IAGF,EAAM,QAAQ,MAAS,EAAK,aAAa,EAAS;;AAG3D,SAAS,EAAc,GAAY,GAAqB;AAKtD,QAJI,CAAC,KAAS,KAAS,IACd,IAGF,EAAM,MAAM,GAAG,EAAM;;AAG9B,SAAS,EACP,GACQ;CACR,IAAM,IAAK,IAAI,iBAAiB;AAChC,MAAK,IAAM,CAAC,GAAK,MAAU,OAAO,QAAQ,EAAO,CAC/C,CAAI,MAAU,KAAA,KAAW,EAAG,IAAI,GAAK,OAAO,EAAM,CAAC;CAErD,IAAM,IAAM,EAAG,UAAU;AACzB,QAAO,IAAM,IAAI,MAAQ;;AAG3B,IAAM,IAAN,MAAoB;CAOlB,aAAa,aACX,IAA6B,EAAE,EAC/B,GACuB;EACvB,IAAM,IAAS,GAAkB;AAEjC,MAAI,EAAO,QAAQ,SAAS,SAAS;GAGnC,IAAM,IAAK,EAAsB;IAC/B,SAAS,EAAO;IAChB,OAAO,EAAO;IACd,OAAO,EAAO;IACd,cAAc,EAAO;IACrB,cAAc,EAAO;IACtB,CAAC;AACF,UAAO,EAA6B;IAClC,SAAS,EAAO;IAChB,QAAQ;IACR,MAAM,+BAA+B;IACtC,CAAC;;EAGJ,IAAM,IAAY,IAAI,EAAkB,GAA6B,CAAC,EAChE,IACJ,MAAuB,KAAA,IAEnB,EAAU,mBAAmB,GAD7B,QAAQ,QAAQ,EAAmB,EAEnC,CAAC,GAAQ,KAAe,MAAM,QAAQ,IAAI,CAC9C,EAAU,WAAW,EACrB,EACD,CAAC,EAEI,IAAW,EAAO,gBAAgB,MAClC,IAAgB,IAAI,IACxB,IAAY,IAAc,MAAa,EAAE,GAAI,EAAE,CAChD,EACK,IAA4B,CAAC,GAAG,EAAc,CAAC,KAAK,OAAU;GAClE;GACA;GACA,UAAU;GACX,EAAE,EAEG,IAA4B,KAC7B,KAAU,EAAE,EACV,QAAQ,MAAU,EAAM,WAAW,GAAG,EAAS,GAAG,CAAC,CACnD,KAAK,MAAU,EAAM,MAAM,EAAS,SAAS,EAAE,CAAC,CAChD,QAAQ,MAAS,EAAK,SAAS,KAAK,CAAC,EAAc,IAAI,EAAK,CAAC,CAC7D,KAAK,OAAU;GACd;GACA;GACA,UAAU;GACX,EAAE,GACL,EAAE;AAUN,SAAO;GAAE,OARK,EACZ,EACE,EAAc,CAAC,GAAG,GAAe,GAAG,EAAc,EAAE,EAAO,MAAM,EACjE,EAAO,aACR,EACD,EAAO,MAGA;GAAO,cAAc;GAAM;;CAStC,aAAa,gBACX,IAAgC,EAAE,EAClC,GACuB;EACvB,IAAM,IAAS,GAAkB;AAEjC,MAAI,EAAO,QAAQ,SAAS,SAAS;GAGnC,IAAM,IAAK,EAAsB;IAC/B,SAAS,EAAO;IAChB,OAAO,EAAO;IACd,OAAO,EAAO;IACd,cAAc,EAAO;IACtB,CAAC;AACF,UAAO,EAA6B;IAClC,SAAS,EAAO;IAChB,QAAQ;IACR,MAAM,kCAAkC;IACzC,CAAC;;EAGJ,IAAM,IAAY,IAAI,EAAkB,GAA6B,CAAC,EAChE,IACJ,MAAuB,KAAA,IAEnB,EAAU,mBAAmB,GAD7B,QAAQ,QAAQ,EAAmB,EAEnC,CAAC,GAAW,KAAe,MAAM,QAAQ,IAAI,CACjD,EAAU,cAAc,EACxB,EACD,CAAC,EAEI,IAAoB,IAAI,IAAI,OAAO,KAAK,KAAe,EAAE,CAAC,CAAC;AAejE,SAAO;GAAE,OARK,EACZ,EACE,EAPiC,CAAC,GAAG,IADvB,IAAY,CAAC,GAAG,GAAmB,GAAI,KAAa,EAAE,CAAE,CACjC,CAAM,CAAC,KAAK,OAAU;IAC7D;IACA,UAAU,EAAkB,IAAI,EAAK;IACtC,EAIiB,EAAe,EAAO,MAAM,EAC1C,EAAO,aACR,EACD,EAAO,MAGA;GAAO,cAAc;GAAM"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./backend-registry/active-store.cjs`),t=require(`./agent-server-client-options.cjs`),n=require(`../node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.cjs`),r=require(`./cloud/conversation-service.api.cjs`),i=require(`./workspace-upload-path.cjs`);var a=5;async function o(t,n){if(n?.id===t&&n.conversation_url?.trim()&&n.session_api_key?.trim())return{conversationUrl:n.conversation_url.trim(),sessionApiKey:n.session_api_key.trim()};if(e.getActiveBackend().backend.kind===`cloud`){let[e]=await r.batchGetCloudConversations([t]);return{conversationUrl:e?.conversation_url?.trim()??null,sessionApiKey:e?.session_api_key?.trim()??null}}return{conversationUrl:null,sessionApiKey:null}}function s(e){if(!e.conversationUrl||!e.sessionApiKey)throw Error(`Conversation sandbox is still starting. Wait for it to finish, then try again.`);return{conversationUrl:e.conversationUrl,sessionApiKey:e.sessionApiKey}}async function c(t,n,r){let a=await i.resolveConversationUploadWorkingDir(t,r),c=await o(t,r),u=e.getActiveBackend().backend.kind===`cloud`,d=r?.id===t?r.session_api_key??c.sessionApiKey:c.sessionApiKey,f=r?.id===t?r.conversation_url??c.conversationUrl:c.conversationUrl;if(u){let e=s({conversationUrl:f,sessionApiKey:d});return l({files:n,workingDir:a,conversationUrl:e.conversationUrl,sessionApiKey:e.sessionApiKey})}return l({files:n,workingDir:a,conversationUrl:f,sessionApiKey:d})}async function l(e){let{files:r,workingDir:o,conversationUrl:s,sessionApiKey:c}=e,l=new n.RemoteWorkspace(t.getAgentServerClientOptions({conversationUrl:s,sessionApiKey:c,workingDir:o})),u=async e=>{try{let t=i.getSafeUploadFileName(e.name),n=i.buildWorkspaceUploadPath(e.name,o);return await l.fileUpload(e,n),{uploadedFile:t,skippedFile:null}}catch(t){return{uploadedFile:null,skippedFile:{name:e.name,reason:t instanceof Error?t.message:`Upload failed`}}}},d=[];for(let e=0;e<r.length;e+=a){let t=r.slice(e,e+a);d.push(...await Promise.all(t.map(u)))}return{uploaded_files:d.flatMap(e=>e.uploadedFile?[e.uploadedFile]:[]),skipped_files:d.flatMap(e=>e.skippedFile?[e.skippedFile]:[])}}exports.resolveConversationRuntime=o,exports.uploadFilesToConversation=c;
|
|
1
|
+
require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`./backend-registry/active-store.cjs`),t=require(`./agent-server-client-options.cjs`),n=require(`../node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.cjs`),r=require(`./cloud/conversation-service.api.cjs`),i=require(`./workspace-upload-path.cjs`);var a=5;async function o(t,n){if(n?.id===t&&n.conversation_url?.trim()&&n.session_api_key?.trim())return{conversationUrl:n.conversation_url.trim(),sessionApiKey:n.session_api_key.trim()};if(e.getActiveBackend().backend.kind===`cloud`){let[e]=await r.batchGetCloudConversations([t]);return{conversationUrl:e?.conversation_url?.trim()??null,sessionApiKey:e?.session_api_key?.trim()??null}}return{conversationUrl:null,sessionApiKey:null}}function s(e){if(!e.conversationUrl||!e.sessionApiKey)throw Error(`Conversation sandbox is still starting. Wait for it to finish, then try again.`);return{conversationUrl:e.conversationUrl,sessionApiKey:e.sessionApiKey}}async function c(t,n,r){let a=await i.resolveConversationUploadWorkingDir(t,r),c=await o(t,r),u=e.getActiveBackend().backend.kind===`cloud`,d=r?.id===t?r.session_api_key??c.sessionApiKey:c.sessionApiKey,f=r?.id===t?r.conversation_url??c.conversationUrl:c.conversationUrl;if(u){let e=s({conversationUrl:f,sessionApiKey:d});return l({files:n,workingDir:a,conversationUrl:e.conversationUrl,sessionApiKey:e.sessionApiKey})}return l({files:n,workingDir:a,conversationUrl:f,sessionApiKey:d})}async function l(e){let{files:r,workingDir:o,conversationUrl:s,sessionApiKey:c}=e,l=new n.RemoteWorkspace(t.getAgentServerClientOptions({conversationUrl:s,sessionApiKey:c,workingDir:o})),u=async e=>{try{let t=i.getSafeUploadFileName(e.name),n=await i.buildWorkspaceUploadPath(e.name,o,{conversationUrl:s,sessionApiKey:c});return await l.fileUpload(e,n),{uploadedFile:t,skippedFile:null}}catch(t){return{uploadedFile:null,skippedFile:{name:e.name,reason:t instanceof Error?t.message:`Upload failed`}}}},d=[];for(let e=0;e<r.length;e+=a){let t=r.slice(e,e+a);d.push(...await Promise.all(t.map(u)))}return{uploaded_files:d.flatMap(e=>e.uploadedFile?[e.uploadedFile]:[]),skipped_files:d.flatMap(e=>e.skippedFile?[e.skippedFile]:[])}}exports.resolveConversationRuntime=o,exports.uploadFilesToConversation=c;
|
|
2
2
|
//# sourceMappingURL=conversation-file-upload.api.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-file-upload.api.cjs","names":[],"sources":["../../src/api/conversation-file-upload.api.ts"],"sourcesContent":["import { RemoteWorkspace } from \"@openhands/typescript-client/workspace/remote-workspace\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport { getActiveBackend } from \"#/api/backend-registry/active-store\";\nimport { batchGetCloudConversations } from \"#/api/cloud/conversation-service.api\";\nimport type { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport type { FileUploadSuccessResponse } from \"#/api/open-hands.types\";\nimport {\n buildWorkspaceUploadPath,\n getSafeUploadFileName,\n resolveConversationUploadWorkingDir,\n} from \"#/api/workspace-upload-path\";\n\nconst FILE_UPLOAD_CONCURRENCY = 5;\n\nexport interface ConversationRuntimeContext {\n conversationUrl: string | null;\n sessionApiKey: string | null;\n}\n\n/**\n * Resolve the sandbox runtime URL + session key needed for file upload and\n * send-event calls. Cloud conversations only exist on the provisioned runtime,\n * not on the bundled local agent-server.\n */\nexport async function resolveConversationRuntime(\n conversationId: string,\n currentConversation?: AppConversation | null,\n): Promise<ConversationRuntimeContext> {\n if (\n currentConversation?.id === conversationId &&\n currentConversation.conversation_url?.trim() &&\n currentConversation.session_api_key?.trim()\n ) {\n return {\n conversationUrl: currentConversation.conversation_url.trim(),\n sessionApiKey: currentConversation.session_api_key.trim(),\n };\n }\n\n if (getActiveBackend().backend.kind === \"cloud\") {\n const [conversation] = await batchGetCloudConversations([conversationId]);\n return {\n conversationUrl: conversation?.conversation_url?.trim() ?? null,\n sessionApiKey: conversation?.session_api_key?.trim() ?? null,\n };\n }\n\n return { conversationUrl: null, sessionApiKey: null };\n}\n\nfunction requireCloudRuntime(\n runtime: ConversationRuntimeContext,\n): ConversationRuntimeContext & {\n conversationUrl: string;\n sessionApiKey: string;\n} {\n if (!runtime.conversationUrl || !runtime.sessionApiKey) {\n throw new Error(\n \"Conversation sandbox is still starting. Wait for it to finish, then try again.\",\n );\n }\n return {\n conversationUrl: runtime.conversationUrl,\n sessionApiKey: runtime.sessionApiKey,\n };\n}\n\n/**\n * Upload attachments into the conversation workspace. Local conversations use\n * the bundled agent-server; cloud conversations target the provisioned runtime.\n */\nexport async function uploadFilesToConversation(\n conversationId: string,\n files: File[],\n currentConversation?: AppConversation | null,\n): Promise<FileUploadSuccessResponse> {\n const workingDir = await resolveConversationUploadWorkingDir(\n conversationId,\n currentConversation,\n );\n const runtime = await resolveConversationRuntime(\n conversationId,\n currentConversation,\n );\n const isCloud = getActiveBackend().backend.kind === \"cloud\";\n\n const sessionApiKey =\n currentConversation?.id === conversationId\n ? (currentConversation.session_api_key ?? runtime.sessionApiKey)\n : runtime.sessionApiKey;\n const conversationUrl =\n currentConversation?.id === conversationId\n ? (currentConversation.conversation_url ?? runtime.conversationUrl)\n : runtime.conversationUrl;\n\n if (isCloud) {\n const cloudRuntime = requireCloudRuntime({\n conversationUrl,\n sessionApiKey,\n });\n return uploadFilesToRuntime({\n files,\n workingDir,\n conversationUrl: cloudRuntime.conversationUrl,\n sessionApiKey: cloudRuntime.sessionApiKey,\n });\n }\n\n return uploadFilesToRuntime({\n files,\n workingDir,\n conversationUrl,\n sessionApiKey,\n });\n}\n\nasync function uploadFilesToRuntime(options: {\n files: File[];\n workingDir: string;\n conversationUrl: string | null;\n sessionApiKey: string | null;\n}): Promise<FileUploadSuccessResponse> {\n const { files, workingDir, conversationUrl, sessionApiKey } = options;\n const workspace = new RemoteWorkspace(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n workingDir,\n }),\n );\n\n const uploadFile = async (file: File) => {\n try {\n const safeName = getSafeUploadFileName(file.name);\n const uploadPath = buildWorkspaceUploadPath(file.name, workingDir);\n await workspace.fileUpload(file, uploadPath);\n return { uploadedFile: safeName, skippedFile: null };\n } catch (error) {\n return {\n uploadedFile: null,\n skippedFile: {\n name: file.name,\n reason: error instanceof Error ? error.message : \"Upload failed\",\n },\n };\n }\n };\n\n const results: Awaited<ReturnType<typeof uploadFile>>[] = [];\n for (let index = 0; index < files.length; index += FILE_UPLOAD_CONCURRENCY) {\n const batch = files.slice(index, index + FILE_UPLOAD_CONCURRENCY);\n results.push(...(await Promise.all(batch.map(uploadFile))));\n }\n\n return {\n uploaded_files: results.flatMap((result) =>\n result.uploadedFile ? [result.uploadedFile] : [],\n ),\n skipped_files: results.flatMap((result) =>\n result.skippedFile ? [result.skippedFile] : [],\n ),\n };\n}\n"],"mappings":"4UAYA,IAAM,EAA0B,EAYhC,eAAsB,EACpB,EACA,EACqC,CACrC,GACE,GAAqB,KAAO,GAC5B,EAAoB,kBAAkB,MAAM,EAC5C,EAAoB,iBAAiB,MAAM,CAE3C,MAAO,CACL,gBAAiB,EAAoB,iBAAiB,MAAM,CAC5D,cAAe,EAAoB,gBAAgB,MAAM,CAC1D,CAGH,GAAI,EAAA,kBAAkB,CAAC,QAAQ,OAAS,QAAS,CAC/C,GAAM,CAAC,GAAgB,MAAM,EAAA,2BAA2B,CAAC,EAAe,CAAC,CACzE,MAAO,CACL,gBAAiB,GAAc,kBAAkB,MAAM,EAAI,KAC3D,cAAe,GAAc,iBAAiB,MAAM,EAAI,KACzD,CAGH,MAAO,CAAE,gBAAiB,KAAM,cAAe,KAAM,CAGvD,SAAS,EACP,EAIA,CACA,GAAI,CAAC,EAAQ,iBAAmB,CAAC,EAAQ,cACvC,MAAU,MACR,iFACD,CAEH,MAAO,CACL,gBAAiB,EAAQ,gBACzB,cAAe,EAAQ,cACxB,CAOH,eAAsB,EACpB,EACA,EACA,EACoC,CACpC,IAAM,EAAa,MAAM,EAAA,oCACvB,EACA,EACD,CACK,EAAU,MAAM,EACpB,EACA,EACD,CACK,EAAU,EAAA,kBAAkB,CAAC,QAAQ,OAAS,QAE9C,EACJ,GAAqB,KAAO,EACvB,EAAoB,iBAAmB,EAAQ,cAChD,EAAQ,cACR,EACJ,GAAqB,KAAO,EACvB,EAAoB,kBAAoB,EAAQ,gBACjD,EAAQ,gBAEd,GAAI,EAAS,CACX,IAAM,EAAe,EAAoB,CACvC,kBACA,gBACD,CAAC,CACF,OAAO,EAAqB,CAC1B,QACA,aACA,gBAAiB,EAAa,gBAC9B,cAAe,EAAa,cAC7B,CAAC,CAGJ,OAAO,EAAqB,CAC1B,QACA,aACA,kBACA,gBACD,CAAC,CAGJ,eAAe,EAAqB,EAKG,CACrC,GAAM,CAAE,QAAO,aAAY,kBAAiB,iBAAkB,EACxD,EAAY,IAAI,EAAA,gBACpB,EAAA,4BAA4B,CAC1B,kBACA,gBACA,aACD,CAAC,CACH,CAEK,EAAa,KAAO,IAAe,CACvC,GAAI,CACF,IAAM,EAAW,EAAA,sBAAsB,EAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"conversation-file-upload.api.cjs","names":[],"sources":["../../src/api/conversation-file-upload.api.ts"],"sourcesContent":["import { RemoteWorkspace } from \"@openhands/typescript-client/workspace/remote-workspace\";\nimport { getAgentServerClientOptions } from \"#/api/agent-server-client-options\";\nimport { getActiveBackend } from \"#/api/backend-registry/active-store\";\nimport { batchGetCloudConversations } from \"#/api/cloud/conversation-service.api\";\nimport type { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport type { FileUploadSuccessResponse } from \"#/api/open-hands.types\";\nimport {\n buildWorkspaceUploadPath,\n getSafeUploadFileName,\n resolveConversationUploadWorkingDir,\n} from \"#/api/workspace-upload-path\";\n\nconst FILE_UPLOAD_CONCURRENCY = 5;\n\nexport interface ConversationRuntimeContext {\n conversationUrl: string | null;\n sessionApiKey: string | null;\n}\n\n/**\n * Resolve the sandbox runtime URL + session key needed for file upload and\n * send-event calls. Cloud conversations only exist on the provisioned runtime,\n * not on the bundled local agent-server.\n */\nexport async function resolveConversationRuntime(\n conversationId: string,\n currentConversation?: AppConversation | null,\n): Promise<ConversationRuntimeContext> {\n if (\n currentConversation?.id === conversationId &&\n currentConversation.conversation_url?.trim() &&\n currentConversation.session_api_key?.trim()\n ) {\n return {\n conversationUrl: currentConversation.conversation_url.trim(),\n sessionApiKey: currentConversation.session_api_key.trim(),\n };\n }\n\n if (getActiveBackend().backend.kind === \"cloud\") {\n const [conversation] = await batchGetCloudConversations([conversationId]);\n return {\n conversationUrl: conversation?.conversation_url?.trim() ?? null,\n sessionApiKey: conversation?.session_api_key?.trim() ?? null,\n };\n }\n\n return { conversationUrl: null, sessionApiKey: null };\n}\n\nfunction requireCloudRuntime(\n runtime: ConversationRuntimeContext,\n): ConversationRuntimeContext & {\n conversationUrl: string;\n sessionApiKey: string;\n} {\n if (!runtime.conversationUrl || !runtime.sessionApiKey) {\n throw new Error(\n \"Conversation sandbox is still starting. Wait for it to finish, then try again.\",\n );\n }\n return {\n conversationUrl: runtime.conversationUrl,\n sessionApiKey: runtime.sessionApiKey,\n };\n}\n\n/**\n * Upload attachments into the conversation workspace. Local conversations use\n * the bundled agent-server; cloud conversations target the provisioned runtime.\n */\nexport async function uploadFilesToConversation(\n conversationId: string,\n files: File[],\n currentConversation?: AppConversation | null,\n): Promise<FileUploadSuccessResponse> {\n const workingDir = await resolveConversationUploadWorkingDir(\n conversationId,\n currentConversation,\n );\n const runtime = await resolveConversationRuntime(\n conversationId,\n currentConversation,\n );\n const isCloud = getActiveBackend().backend.kind === \"cloud\";\n\n const sessionApiKey =\n currentConversation?.id === conversationId\n ? (currentConversation.session_api_key ?? runtime.sessionApiKey)\n : runtime.sessionApiKey;\n const conversationUrl =\n currentConversation?.id === conversationId\n ? (currentConversation.conversation_url ?? runtime.conversationUrl)\n : runtime.conversationUrl;\n\n if (isCloud) {\n const cloudRuntime = requireCloudRuntime({\n conversationUrl,\n sessionApiKey,\n });\n return uploadFilesToRuntime({\n files,\n workingDir,\n conversationUrl: cloudRuntime.conversationUrl,\n sessionApiKey: cloudRuntime.sessionApiKey,\n });\n }\n\n return uploadFilesToRuntime({\n files,\n workingDir,\n conversationUrl,\n sessionApiKey,\n });\n}\n\nasync function uploadFilesToRuntime(options: {\n files: File[];\n workingDir: string;\n conversationUrl: string | null;\n sessionApiKey: string | null;\n}): Promise<FileUploadSuccessResponse> {\n const { files, workingDir, conversationUrl, sessionApiKey } = options;\n const workspace = new RemoteWorkspace(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n workingDir,\n }),\n );\n\n const uploadFile = async (file: File) => {\n try {\n const safeName = getSafeUploadFileName(file.name);\n // @spec WUP-001 — Build an absolute upload path that's anchored against\n // the agent-server's home dir (when `workingDir` is relative) instead\n // of the filesystem root. Without this, default conversations whose\n // working_dir is `workspace/project/<hex>` (relative) land at\n // `/workspace/project/<hex>/...` on the agent-server, which on macOS\n // and fresh containers is a read-only mount.\n const uploadPath = await buildWorkspaceUploadPath(file.name, workingDir, {\n conversationUrl,\n sessionApiKey,\n });\n await workspace.fileUpload(file, uploadPath);\n return { uploadedFile: safeName, skippedFile: null };\n } catch (error) {\n return {\n uploadedFile: null,\n skippedFile: {\n name: file.name,\n reason: error instanceof Error ? error.message : \"Upload failed\",\n },\n };\n }\n };\n\n const results: Awaited<ReturnType<typeof uploadFile>>[] = [];\n for (let index = 0; index < files.length; index += FILE_UPLOAD_CONCURRENCY) {\n const batch = files.slice(index, index + FILE_UPLOAD_CONCURRENCY);\n results.push(...(await Promise.all(batch.map(uploadFile))));\n }\n\n return {\n uploaded_files: results.flatMap((result) =>\n result.uploadedFile ? [result.uploadedFile] : [],\n ),\n skipped_files: results.flatMap((result) =>\n result.skippedFile ? [result.skippedFile] : [],\n ),\n };\n}\n"],"mappings":"4UAYA,IAAM,EAA0B,EAYhC,eAAsB,EACpB,EACA,EACqC,CACrC,GACE,GAAqB,KAAO,GAC5B,EAAoB,kBAAkB,MAAM,EAC5C,EAAoB,iBAAiB,MAAM,CAE3C,MAAO,CACL,gBAAiB,EAAoB,iBAAiB,MAAM,CAC5D,cAAe,EAAoB,gBAAgB,MAAM,CAC1D,CAGH,GAAI,EAAA,kBAAkB,CAAC,QAAQ,OAAS,QAAS,CAC/C,GAAM,CAAC,GAAgB,MAAM,EAAA,2BAA2B,CAAC,EAAe,CAAC,CACzE,MAAO,CACL,gBAAiB,GAAc,kBAAkB,MAAM,EAAI,KAC3D,cAAe,GAAc,iBAAiB,MAAM,EAAI,KACzD,CAGH,MAAO,CAAE,gBAAiB,KAAM,cAAe,KAAM,CAGvD,SAAS,EACP,EAIA,CACA,GAAI,CAAC,EAAQ,iBAAmB,CAAC,EAAQ,cACvC,MAAU,MACR,iFACD,CAEH,MAAO,CACL,gBAAiB,EAAQ,gBACzB,cAAe,EAAQ,cACxB,CAOH,eAAsB,EACpB,EACA,EACA,EACoC,CACpC,IAAM,EAAa,MAAM,EAAA,oCACvB,EACA,EACD,CACK,EAAU,MAAM,EACpB,EACA,EACD,CACK,EAAU,EAAA,kBAAkB,CAAC,QAAQ,OAAS,QAE9C,EACJ,GAAqB,KAAO,EACvB,EAAoB,iBAAmB,EAAQ,cAChD,EAAQ,cACR,EACJ,GAAqB,KAAO,EACvB,EAAoB,kBAAoB,EAAQ,gBACjD,EAAQ,gBAEd,GAAI,EAAS,CACX,IAAM,EAAe,EAAoB,CACvC,kBACA,gBACD,CAAC,CACF,OAAO,EAAqB,CAC1B,QACA,aACA,gBAAiB,EAAa,gBAC9B,cAAe,EAAa,cAC7B,CAAC,CAGJ,OAAO,EAAqB,CAC1B,QACA,aACA,kBACA,gBACD,CAAC,CAGJ,eAAe,EAAqB,EAKG,CACrC,GAAM,CAAE,QAAO,aAAY,kBAAiB,iBAAkB,EACxD,EAAY,IAAI,EAAA,gBACpB,EAAA,4BAA4B,CAC1B,kBACA,gBACA,aACD,CAAC,CACH,CAEK,EAAa,KAAO,IAAe,CACvC,GAAI,CACF,IAAM,EAAW,EAAA,sBAAsB,EAAK,KAAK,CAO3C,EAAa,MAAM,EAAA,yBAAyB,EAAK,KAAM,EAAY,CACvE,kBACA,gBACD,CAAC,CAEF,OADA,MAAM,EAAU,WAAW,EAAM,EAAW,CACrC,CAAE,aAAc,EAAU,YAAa,KAAM,OAC7C,EAAO,CACd,MAAO,CACL,aAAc,KACd,YAAa,CACX,KAAM,EAAK,KACX,OAAQ,aAAiB,MAAQ,EAAM,QAAU,gBAClD,CACF,GAIC,EAAoD,EAAE,CAC5D,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAM,OAAQ,GAAS,EAAyB,CAC1E,IAAM,EAAQ,EAAM,MAAM,EAAO,EAAQ,EAAwB,CACjE,EAAQ,KAAK,GAAI,MAAM,QAAQ,IAAI,EAAM,IAAI,EAAW,CAAC,CAAE,CAG7D,MAAO,CACL,eAAgB,EAAQ,QAAS,GAC/B,EAAO,aAAe,CAAC,EAAO,aAAa,CAAG,EAAE,CACjD,CACD,cAAe,EAAQ,QAAS,GAC9B,EAAO,YAAc,CAAC,EAAO,YAAY,CAAG,EAAE,CAC/C,CACF"}
|
|
@@ -57,7 +57,10 @@ async function d(e) {
|
|
|
57
57
|
workingDir: o
|
|
58
58
|
})), d = async (e) => {
|
|
59
59
|
try {
|
|
60
|
-
let t = a(e.name), n = i(e.name, o
|
|
60
|
+
let t = a(e.name), n = await i(e.name, o, {
|
|
61
|
+
conversationUrl: c,
|
|
62
|
+
sessionApiKey: l
|
|
63
|
+
});
|
|
61
64
|
return await u.fileUpload(e, n), {
|
|
62
65
|
uploadedFile: t,
|
|
63
66
|
skippedFile: null
|