@openhands/agent-canvas 1.4.0 → 1.5.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 +11 -12
- package/README.windows.md +4 -2
- package/build/assets/{Trans-Ch-OVWEA.js → Trans-DqF_OEZB.js} +1 -1
- package/build/assets/{acp-providers-Sy2LKyMa.js → acp-providers-DerAmTyY.js} +1 -1
- package/build/assets/active-backend-context-B8rMv0X9.js +1 -0
- package/build/assets/{add-backend-modal-Bgy8anoR.js → add-backend-modal-CxC7BNEc.js} +1 -1
- package/build/assets/{agent-profiles-settings-3mmXljZX.js → agent-profiles-settings-BJb8YXR1.js} +1 -1
- package/build/assets/agent-server-compatibility-BWN-EIQn.js +1 -0
- package/build/assets/agent-server-conversation-service.api-DSPIkMwJ.js +41 -0
- package/build/assets/{agent-settings-B-W10B4E.js → agent-settings-CgCnqaAA.js} +2 -2
- package/build/assets/agent-settings-DDkSavD7.js +1 -0
- package/build/assets/{alert-banner-Bpf2NQJq.js → alert-banner-Dh51WURQ.js} +1 -1
- package/build/assets/api-key-entry-screen-iZc7n8AI.js +1 -0
- package/build/assets/app-settings-B5zyipxJ.js +1 -0
- package/build/assets/automation-detail-CZsu2CoM.js +2 -0
- package/build/assets/automation-export-BwRX6H32.js +2 -0
- package/build/assets/automations-list-lHAVzMoA.js +1 -0
- package/build/assets/{back-nav-button-CUS2mi-U.js → back-nav-button-DVknCcSP.js} +1 -1
- package/build/assets/backend-form-modal-RGcu909r.js +1 -0
- package/build/assets/{backend-synced-settings-badge-D9hZx05w.js → backend-synced-settings-badge-BSfN0AZA.js} +1 -1
- package/build/assets/{base-modal-BuF2f0YL.js → base-modal-CIF_785P.js} +1 -1
- package/build/assets/{bot-D7eUAuSB.js → bot-C-EA6685.js} +1 -1
- package/build/assets/{brand-button-vMVuyDXu.js → brand-button-B1izLAdR.js} +1 -1
- package/build/assets/{browser-BifzWIBd.js → browser-DKaeq_sT.js} +3 -3
- package/build/assets/{browser-tab-CkkqJnqw.js → browser-tab-qb_ftCxW.js} +1 -1
- package/build/assets/canvas-ui-COgjltGz.js +1 -0
- package/build/assets/{chat-send-button-B_jc5z5C.js → chat-send-button-BZHG2hAW.js} +1 -1
- package/build/assets/check-TbOEtHKj.js +1 -0
- package/build/assets/{chevron-down-CI8A6tet.js → chevron-down-D7IvFMBM.js} +1 -1
- package/build/assets/{circle-plus-check-toggle-C5YxjxvI.js → circle-plus-check-toggle-DoFIjVE0.js} +1 -1
- package/build/assets/client-source-BZK8vRs2.js +1 -0
- package/build/assets/cloud-funnel-analytics-Zcv57hfT.js +1 -0
- package/build/assets/{color-themes-DPBzNtVg.js → color-themes-CHizm1xF.js} +1 -1
- package/build/assets/{combobox-caret-DoObzqf4.js → combobox-caret-CxZpqoSR.js} +1 -1
- package/build/assets/{command-menu-D-JV3Wqm.js → command-menu-oTvKDU3Y.js} +1 -1
- package/build/assets/condenser-settings-BGlWn93P.js +1 -0
- package/build/assets/{confirmation-modal-BGLu6XJN.js → confirmation-modal-DGBWM2Ls.js} +1 -1
- package/build/assets/{context-menu-list-item-BD5_EaKN.js → context-menu-list-item-6psNyl7X.js} +1 -1
- package/build/assets/conversation-BoCYx8n2.js +89 -0
- package/build/assets/conversation-DgHqMjnY.js +1 -0
- package/build/assets/conversation-panel-78Rxh_-I.js +1 -0
- package/build/assets/conversation-service.api-_f9GlIEi.js +1 -0
- package/build/assets/{conversation-tab-empty-state-B2dDYEwf.js → conversation-tab-empty-state-CNUmIms2.js} +1 -1
- package/build/assets/{copy-3JCw_XFB.js → copy-D1YGjP-C.js} +1 -1
- package/build/assets/{copy-to-clipboard-button-CaR52OnA.js → copy-to-clipboard-button-CFzH_NOX.js} +1 -1
- package/build/assets/declaration-BGsHjPEW.js +1 -0
- package/build/assets/{device-verify-Dj6I4Iqe.js → device-verify-WBSjJBLH.js} +1 -1
- package/build/assets/{dropdown-classes-DJSXeLqc.js → dropdown-classes-D3wMJlXT.js} +1 -1
- package/build/assets/{ellipsis-button-C5Z-tPFp.js → ellipsis-button-CbNnHlIq.js} +1 -1
- package/build/assets/{entry.client-2_3ePAm0.js → entry.client-DNlPGxsu.js} +2 -2
- package/build/assets/{enum-filter-dropdown-DXbVwiNZ.js → enum-filter-dropdown-JLYv1t8L.js} +1 -1
- package/build/assets/{environment-switch-overlay-DZQfRGTx.js → environment-switch-overlay-B1PFO8P8.js} +1 -1
- package/build/assets/{extensions-hub-CLjmOGqS.js → extensions-hub-CCbLA7IM.js} +1 -1
- package/build/assets/{extensions-navigation-B5MeUiMq.js → extensions-navigation-CPNjMNvR.js} +1 -1
- package/build/assets/{external-link-D2zJjE9G.js → external-link-lhdITPqq.js} +1 -1
- package/build/assets/files-tab-y4K7EXBO.js +1 -0
- package/build/assets/{form-control-classes-ChpNBe9n.js → form-control-classes-CbdN5aO3.js} +1 -1
- package/build/assets/format-time-delta-DhDbkD7V.js +1 -0
- package/build/assets/git-provider-icon-ITvsH4Ko.js +1 -0
- package/build/assets/home-BwbeOWwU.js +1 -0
- package/build/assets/home-DKPGQ5P3.js +1 -0
- package/build/assets/index-home-Bko2Itv5.js +1 -0
- package/build/assets/install-server-modal-Qk1gwyI8.js +1 -0
- package/build/assets/{launch-V_3Rp7WS.js → launch-CAGavYl-.js} +1 -1
- package/build/assets/lesson-plan-DMCPdtrf.js +4 -0
- package/build/assets/{list-todo-BfH6yYUK.js → list-todo-CAtvkzcy.js} +1 -1
- package/build/assets/llm-not-configured-banner-C1ktyb3C.js +27 -0
- package/build/assets/llm-settings-BBsZFi9l.js +1 -0
- package/build/assets/llm-settings-DFkJQr_w.js +1 -0
- package/build/assets/llm-subscription-service-Casyzgn1.js +1 -0
- package/build/assets/loader-circle-CsAsfLIs.js +1 -0
- package/build/assets/{loading-spinner-BLdswi6q.js → loading-spinner-BcdnT0mN.js} +1 -1
- package/build/assets/manage-backends-modal-CKQ46rvw.js +1 -0
- package/build/assets/manifest-03478bbf.js +1 -0
- package/build/assets/{map-provider-BM2SJarp.js → map-provider-BbIb12oh.js} +1 -1
- package/build/assets/{markdown-renderer-DMT7Zkpd.js → markdown-renderer-B4V2OMFP.js} +1 -1
- package/build/assets/{mcp-BQufNPZ6.js → mcp-BapoJsDc.js} +2 -2
- package/build/assets/{messages-BnJCqnFf.js → messages-CUBFMY5o.js} +26 -26
- package/build/assets/{modal-body-DouOE5KH.js → modal-body-Cc2zp0xb.js} +1 -1
- package/build/assets/{modal-classes-Cf-4tbHz.js → modal-classes-3qT9Ap7Q.js} +1 -1
- package/build/assets/{modal-close-button-B6CfxxJj.js → modal-close-button-BcIBUdSq.js} +1 -1
- package/build/assets/model-selector-DJrMrFAr.js +1 -0
- package/build/assets/onboarding-6NMkdNxV.js +1 -0
- package/build/assets/onboarding-modal-Q4AnpIdg.js +1 -0
- package/build/assets/organization-service.api-vrRNwOma.js +1 -0
- package/build/assets/path-utils-PNfCKQDV.js +1 -0
- package/build/assets/{pencil-Dj2XjKmI.js → pencil-CWhApFIT.js} +1 -1
- package/build/assets/{plan-components-CcCBmCzW.js → plan-components-BdZXPyZU.js} +1 -1
- package/build/assets/{planner-tab-Dhyqcqmb.js → planner-tab-ByOw1he8.js} +1 -1
- package/build/assets/plugins-management-service-B75jyC56.js +1 -0
- package/build/assets/profiles-service.api-BQTklD5D.js +1 -0
- package/build/assets/providers-DfTB2gPd.js +1 -0
- package/build/assets/proxy-B3tCGf0X.js +1 -0
- package/build/assets/{recommended-automations-launcher-CTcGTl4d.js → recommended-automations-launcher-Bj7PuHY1.js} +1 -1
- package/build/assets/{refresh-cw-DM82EIyx.js → refresh-cw-B9B7-vsy.js} +1 -1
- package/build/assets/root-CDnuTToz.js +2 -0
- package/build/assets/root-CYWeTrWE.css +1 -0
- package/build/assets/root-layout-DfYVlcRG.js +2 -0
- package/build/assets/{runtime-waiting-state-BsXLElvN.js → runtime-waiting-state-CnyVhX4T.js} +1 -1
- package/build/assets/schema-field-CUwk4wrQ.js +1 -0
- package/build/assets/sdk-section-page-DLLNrYjI.js +1 -0
- package/build/assets/{sdk-settings-schema-Cv7M9eSe.js → sdk-settings-schema-CLR01YIK.js} +1 -1
- package/build/assets/search-dIQ09UY2.js +1 -0
- package/build/assets/secrets-service-CvyPWJhg.js +1 -0
- package/build/assets/{secrets-settings-Cx6yJlyb.js → secrets-settings-CHy72A5C.js} +1 -1
- package/build/assets/{segmented-toggle-DyQqPhoD.js → segmented-toggle-kzwZkLaj.js} +1 -1
- package/build/assets/settings-B9S8UVQr.js +1 -0
- package/build/assets/{settings-dropdown-input-BjunGXJb.js → settings-dropdown-input-Dhx9ErGd.js} +1 -1
- package/build/assets/{settings-index-D6sxWSRk.js → settings-index-BKDl2CQ-.js} +1 -1
- package/build/assets/{settings-input-bD6npsDm.js → settings-input-BsgQWS5R.js} +1 -1
- package/build/assets/{settings-list-classes-Dp_OgzN0.js → settings-list-classes-DSJJX99U.js} +1 -1
- package/build/assets/settings-modal-DeK11CyT.js +1 -0
- package/build/assets/settings-service.api-DXk5TdeJ.js +1 -0
- package/build/assets/{settings-switch-5cuxl8Dc.js → settings-switch-Bes8dIlV.js} +1 -1
- package/build/assets/{settings-utils-BMdG65By.js → settings-utils-DzCVfiR3.js} +1 -1
- package/build/assets/shared-conversation-9atDzTR4.js +1 -0
- package/build/assets/{sidebar-layout-DuzJMMw-.js → sidebar-layout-Bm7pa3Vk.js} +1 -1
- package/build/assets/{sidebar-mobile-menu-toggle-VvvX32iF.js → sidebar-mobile-menu-toggle-giMMZctn.js} +1 -1
- package/build/assets/{sidebar-nav-link-5AlTT5-j.js → sidebar-nav-link-CHqyFXwV.js} +1 -1
- package/build/assets/{sidebar-store-CZuE8AH5.js → sidebar-store-uiUXBU1N.js} +1 -1
- package/build/assets/{skill-card-pill-row-eTIkE4nz.js → skill-card-pill-row-BPYKQ3IN.js} +1 -1
- package/build/assets/skills-plugins-Tropusio.js +1 -0
- package/build/assets/{skills-settings-BUv04tSc.js → skills-settings-BvzBBCWk.js} +2 -2
- package/build/assets/{square-chevron-right-Czw3FFWc.js → square-chevron-right-DE-JN-2Z.js} +1 -1
- package/build/assets/{styled-tooltip-CgX2oRaK.js → styled-tooltip-B14i_Uac.js} +1 -1
- package/build/assets/{suspense-BO1Tl_Vf.js → suspense-DmZ3MSSh.js} +1 -1
- package/build/assets/{task-list-tab-0k9PhuqO.js → task-list-tab-DyfgG4MC.js} +1 -1
- package/build/assets/telemetry-C5JMEfqB.js +2 -0
- package/build/assets/{terminal-B61WrJdS.js → terminal-DRXt2Lr4.js} +1 -1
- package/build/assets/{toggle-switch-2j5wwR85.js → toggle-switch-DX_k418f.js} +1 -1
- package/build/assets/{trash-2-Be_7y3Mn.js → trash-2-BU6BlW4i.js} +1 -1
- package/build/assets/{typography-D8mHDeNG.js → typography-CzfoD9DY.js} +1 -1
- package/build/assets/use-acp-credential-form-Bm8qXdlc.js +1 -0
- package/build/assets/{use-activate-agent-profile-20v1xU0H.js → use-activate-agent-profile-DlykqEfN.js} +1 -1
- package/build/assets/{use-active-agent-profile-BkJN7Xsy.js → use-active-agent-profile-hI-x-UBa.js} +1 -1
- package/build/assets/{use-active-conversation-DOZVSVtU.js → use-active-conversation-2qeez40F.js} +1 -1
- package/build/assets/use-agent-profiles-0pr5bLS7.js +1 -0
- package/build/assets/{use-agent-state-DHZO1obC.js → use-agent-state-C6peDXUm.js} +1 -1
- package/build/assets/use-backends-health-CLHPitJM.js +1 -0
- package/build/assets/{use-can-manage-org-profiles-C-OhWVBS.js → use-can-manage-org-profiles-Ck_bsNbH.js} +1 -1
- package/build/assets/use-cloud-current-user-id-DUCSxNjY.js +1 -0
- package/build/assets/use-config-B5r8erYt.js +1 -0
- package/build/assets/use-create-conversation-r1JHfKO5.js +1 -0
- package/build/assets/{use-create-secret-D0HCOZFu.js → use-create-secret-Cf2N11d2.js} +1 -1
- package/build/assets/{use-event-store-DjgU4wfO.js → use-event-store-Bbaz51GR.js} +1 -1
- package/build/assets/{use-handle-plan-click-DyRASKMC.js → use-handle-plan-click-CsAW3FlH.js} +1 -1
- package/build/assets/use-is-authed-BezEyfeh.js +1 -0
- package/build/assets/use-llm-profiles-Dr5__SlZ.js +1 -0
- package/build/assets/use-plugins-marketplace-BplU65ae.js +1 -0
- package/build/assets/use-runtime-is-ready-vCFOcLFa.js +1 -0
- package/build/assets/use-save-agent-profile-RqUGqTv6.js +1 -0
- package/build/assets/use-save-settings-Chvzeu2s.js +1 -0
- package/build/assets/use-settings-CyxSlyTQ.js +1 -0
- package/build/assets/use-settings-nav-items-zEkSO_Bf.js +16 -0
- package/build/assets/use-skills-xrVoKYrF.js +1 -0
- package/build/assets/{use-task-list-AVBLbbcR.js → use-task-list-CfisapBW.js} +1 -1
- package/build/assets/use-tracking-D2Qg5Lpd.js +1 -0
- package/build/assets/{use-user-conversation-zpx7I18x.js → use-user-conversation-CnE4zhOA.js} +1 -1
- package/build/assets/{useMutation-DrCAVg5w.js → useMutation-u8UgRgDK.js} +1 -1
- package/build/assets/{useMutationState-D8QN0ZCy.js → useMutationState-OnAsCLA_.js} +1 -1
- package/build/assets/{useQueries-DClgUTc7.js → useQueries-BpIlT8Mt.js} +1 -1
- package/build/assets/{useQuery-CRBP8vIS.js → useQuery-D5pEZbY0.js} +1 -1
- package/build/assets/{useTranslation-CDRCKC9-.js → useTranslation-Cbf5AGg_.js} +1 -1
- package/build/assets/{utils-D3U3rlqr.js → utils-DB9LsAzA.js} +1 -1
- package/build/assets/{vendor~browser-tab-Di0kh5Zw.js → vendor~browser-tab-CsMb-pta.js} +1 -1
- package/build/assets/{vendor~browser-Cvg7jXCP.js → vendor~browser-wXQ-WZEC.js} +1 -1
- package/build/assets/{vendor~entry.client-9tWQ_Ugw.js → vendor~entry.client-DDuH4--y.js} +1 -1
- package/build/assets/{vendor~entry.client-D6BtSOtn.js → vendor~entry.client-DQGrNspu.js} +1 -1
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~dhilvkxv-eGLBu60s.js +2 -0
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~iztiaf2o-rqo6vRFz.js +185 -0
- package/build/assets/{vendor~files-tab-B02k3xvx.js → vendor~files-tab-B-5fBohe.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation-CYMF9JYB.js → vendor~index-home~home~conversation-panel~conversation-ChmYLVgz.js} +1 -1
- package/build/assets/vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BD7v71DM.js +2 -0
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BD0GaRGa.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BT05Osu4.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-D7EUmQ8Y.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DgzWSMRc.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-d8aETPbZ.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DqZatR3B.js} +1 -1
- package/build/assets/{vendor~launch-CHXA9cJu.js → vendor~launch-_Km3J77E.js} +1 -1
- package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~ivvrgjsa-BlIZPCXX.js → vendor~module-D5a_AClf.js} +1 -1
- package/build/assets/{vendor~root-layout~conversation-panel~conversation-CpiTHpHl.js → vendor~root-layout~conversation-panel~conversation-8tIsyrPj.js} +1 -1
- package/build/assets/{vendor~root-layout~conversation-panel~conversation~shared-conversation-_TdZcNMD.js → vendor~root-layout~conversation-panel~conversation~shared-conversation-BrguKXCn.js} +1 -1
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation-Cn2jwSga.js → vendor~root-layout~index-home~home~conversation-panel~conversation-BTvhGHHG.js} +1 -1
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-CZM4hwUT.js → vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation~aler~gfu7qdtz-BOKQkbc6.js} +1 -1
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~settings~settings-index~agen~enjl5xdm-B0EIDu4M.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~ftka0fnu-cFNmfAE6.js} +2 -2
- package/build/assets/{verification-settings-D576N2xa.js → verification-settings-CfkrXoSa.js} +1 -1
- package/build/assets/x-ZE4iplpF.js +1 -0
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +9 -0
- package/build/locales/ca/openhands.json +9 -0
- package/build/locales/de/openhands.json +9 -0
- package/build/locales/en/openhands.json +9 -0
- package/build/locales/es/openhands.json +9 -0
- package/build/locales/fr/openhands.json +9 -0
- package/build/locales/it/openhands.json +9 -0
- package/build/locales/ja/openhands.json +9 -0
- package/build/locales/ko-KR/openhands.json +9 -0
- package/build/locales/no/openhands.json +9 -0
- package/build/locales/pt/openhands.json +9 -0
- package/build/locales/tr/openhands.json +9 -0
- package/build/locales/uk/openhands.json +9 -0
- package/build/locales/zh-CN/openhands.json +9 -0
- package/build/locales/zh-TW/openhands.json +9 -0
- package/config/defaults.json +5 -4
- package/dist/api/agent-server-adapter.cjs +3 -3
- package/dist/api/agent-server-adapter.cjs.map +1 -1
- package/dist/api/agent-server-adapter.d.ts +9 -1
- package/dist/api/agent-server-adapter.js +105 -102
- package/dist/api/agent-server-adapter.js.map +1 -1
- package/dist/api/agent-server-config.cjs +1 -1
- package/dist/api/agent-server-config.cjs.map +1 -1
- package/dist/api/agent-server-config.d.ts +3 -0
- package/dist/api/agent-server-config.js +45 -23
- package/dist/api/agent-server-config.js.map +1 -1
- package/dist/api/backend-registry/auth.cjs +1 -1
- package/dist/api/backend-registry/auth.cjs.map +1 -1
- package/dist/api/backend-registry/auth.js +1 -1
- package/dist/api/backend-registry/auth.js.map +1 -1
- package/dist/api/backend-registry/default-backend.cjs +1 -1
- package/dist/api/backend-registry/default-backend.cjs.map +1 -1
- package/dist/api/backend-registry/default-backend.d.ts +3 -0
- package/dist/api/backend-registry/default-backend.js +22 -10
- package/dist/api/backend-registry/default-backend.js.map +1 -1
- package/dist/api/backend-registry/storage.cjs +1 -1
- package/dist/api/backend-registry/storage.cjs.map +1 -1
- package/dist/api/backend-registry/storage.js +38 -33
- package/dist/api/backend-registry/storage.js.map +1 -1
- package/dist/api/backend-registry/types.d.ts +2 -0
- package/dist/api/canvas-ui-client-tool.cjs +38 -0
- package/dist/api/canvas-ui-client-tool.cjs.map +1 -0
- package/dist/api/canvas-ui-client-tool.d.ts +14 -0
- package/dist/api/canvas-ui-client-tool.js +47 -0
- package/dist/api/canvas-ui-client-tool.js.map +1 -0
- package/dist/api/client-source.cjs +2 -0
- package/dist/api/client-source.cjs.map +1 -0
- package/dist/api/client-source.d.ts +9 -0
- package/dist/api/client-source.js +10 -0
- package/dist/api/client-source.js.map +1 -0
- package/dist/api/cloud/client.cjs +2 -0
- package/dist/api/cloud/client.cjs.map +1 -0
- package/dist/api/cloud/client.d.ts +4 -0
- package/dist/api/cloud/client.js +38 -0
- package/dist/api/cloud/client.js.map +1 -0
- package/dist/api/cloud/conversation-service.api.cjs +1 -1
- package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
- package/dist/api/cloud/conversation-service.api.js +35 -33
- package/dist/api/cloud/conversation-service.api.js.map +1 -1
- package/dist/api/cloud/organization-service.api.cjs +1 -1
- package/dist/api/cloud/organization-service.api.cjs.map +1 -1
- package/dist/api/cloud/organization-service.api.js +11 -10
- package/dist/api/cloud/organization-service.api.js.map +1 -1
- package/dist/api/cloud/proxy.cjs +1 -1
- package/dist/api/cloud/proxy.cjs.map +1 -1
- package/dist/api/cloud/proxy.d.ts +2 -40
- package/dist/api/cloud/proxy.js +14 -39
- package/dist/api/cloud/proxy.js.map +1 -1
- package/dist/api/conversation-metadata-store.cjs +1 -1
- package/dist/api/conversation-metadata-store.cjs.map +1 -1
- package/dist/api/conversation-metadata-store.d.ts +2 -9
- package/dist/api/conversation-metadata-store.js +13 -9
- package/dist/api/conversation-metadata-store.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.d.ts +2 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.js +98 -88
- package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.types.d.ts +5 -0
- package/dist/api/device-flow-client.cjs +1 -1
- package/dist/api/device-flow-client.cjs.map +1 -1
- package/dist/api/device-flow-client.d.ts +4 -58
- package/dist/api/device-flow-client.js +8 -98
- package/dist/api/device-flow-client.js.map +1 -1
- package/dist/api/git-service/agent-server-git-service.api.cjs +1 -1
- package/dist/api/git-service/agent-server-git-service.api.cjs.map +1 -1
- package/dist/api/git-service/agent-server-git-service.api.d.ts +10 -2
- package/dist/api/git-service/agent-server-git-service.api.js +107 -40
- package/dist/api/git-service/agent-server-git-service.api.js.map +1 -1
- package/dist/api/open-hands.types.d.ts +11 -0
- package/dist/api/option-service/option-service.api.cjs +1 -1
- package/dist/api/option-service/option-service.api.cjs.map +1 -1
- package/dist/api/option-service/option-service.api.js +0 -1
- package/dist/api/option-service/option-service.api.js.map +1 -1
- package/dist/api/option-service/option.types.d.ts +0 -1
- package/dist/api/secrets-service.cjs +1 -1
- package/dist/api/secrets-service.cjs.map +1 -1
- package/dist/api/secrets-service.js +15 -14
- package/dist/api/secrets-service.js.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +73 -64
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.cjs +2 -2
- package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.js +2 -0
- package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.js.map +1 -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 +4 -2
- package/dist/components/features/backends/backend-form-modal.js +108 -101
- package/dist/components/features/backends/backend-form-modal.js.map +1 -1
- package/dist/components/features/backends/backend-row.cjs +1 -1
- package/dist/components/features/backends/backend-row.cjs.map +1 -1
- package/dist/components/features/backends/backend-row.js +2 -1
- package/dist/components/features/backends/backend-row.js.map +1 -1
- package/dist/components/features/backends/backend-selector.cjs +1 -1
- package/dist/components/features/backends/backend-selector.cjs.map +1 -1
- package/dist/components/features/backends/backend-selector.js +51 -51
- package/dist/components/features/backends/backend-selector.js.map +1 -1
- package/dist/components/features/backends/device-flow-auth.cjs +1 -1
- package/dist/components/features/backends/device-flow-auth.cjs.map +1 -1
- package/dist/components/features/backends/device-flow-auth.d.ts +4 -1
- package/dist/components/features/backends/device-flow-auth.js +38 -38
- package/dist/components/features/backends/device-flow-auth.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 +173 -165
- package/dist/components/features/chat/chat-interface.js.map +1 -1
- package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
- package/dist/components/features/chat/components/chat-input-actions.d.ts +2 -1
- package/dist/components/features/chat/components/chat-input-actions.js +44 -43
- package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
- package/dist/components/features/chat/components/chat-input-container.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-container.cjs.map +1 -1
- package/dist/components/features/chat/components/chat-input-container.d.ts +2 -1
- package/dist/components/features/chat/components/chat-input-container.js +20 -19
- package/dist/components/features/chat/components/chat-input-container.js.map +1 -1
- package/dist/components/features/chat/components/chat-input-profile-picker.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-profile-picker.cjs.map +1 -1
- package/dist/components/features/chat/components/chat-input-profile-picker.js +44 -32
- package/dist/components/features/chat/components/chat-input-profile-picker.js.map +1 -1
- package/dist/components/features/chat/components/resolve-picker-kind.cjs +1 -1
- package/dist/components/features/chat/components/resolve-picker-kind.cjs.map +1 -1
- package/dist/components/features/chat/components/resolve-picker-kind.d.ts +10 -22
- package/dist/components/features/chat/components/resolve-picker-kind.js +6 -3
- package/dist/components/features/chat/components/resolve-picker-kind.js.map +1 -1
- package/dist/components/features/chat/custom-chat-input.cjs +1 -1
- package/dist/components/features/chat/custom-chat-input.cjs.map +1 -1
- package/dist/components/features/chat/custom-chat-input.d.ts +2 -1
- package/dist/components/features/chat/custom-chat-input.js +52 -51
- package/dist/components/features/chat/custom-chat-input.js.map +1 -1
- package/dist/components/features/chat/interactive-chat-box.cjs +1 -1
- package/dist/components/features/chat/interactive-chat-box.cjs.map +1 -1
- package/dist/components/features/chat/interactive-chat-box.d.ts +2 -1
- package/dist/components/features/chat/interactive-chat-box.js +9 -8
- package/dist/components/features/chat/interactive-chat-box.js.map +1 -1
- package/dist/components/features/diff-viewer/commit-list.cjs +2 -0
- package/dist/components/features/diff-viewer/commit-list.cjs.map +1 -0
- package/dist/components/features/diff-viewer/commit-list.d.ts +13 -0
- package/dist/components/features/diff-viewer/commit-list.js +27 -0
- package/dist/components/features/diff-viewer/commit-list.js.map +1 -0
- package/dist/components/features/diff-viewer/commit-row.cjs +2 -0
- package/dist/components/features/diff-viewer/commit-row.cjs.map +1 -0
- package/dist/components/features/diff-viewer/commit-row.d.ts +14 -0
- package/dist/components/features/diff-viewer/commit-row.js +59 -0
- package/dist/components/features/diff-viewer/commit-row.js.map +1 -0
- package/dist/components/features/diff-viewer/file-diff-viewer.cjs +1 -1
- package/dist/components/features/diff-viewer/file-diff-viewer.cjs.map +1 -1
- package/dist/components/features/diff-viewer/file-diff-viewer.d.ts +7 -1
- package/dist/components/features/diff-viewer/file-diff-viewer.js +40 -39
- package/dist/components/features/diff-viewer/file-diff-viewer.js.map +1 -1
- package/dist/components/features/plugins/plugin-detail-modal.d.ts +2 -1
- package/dist/components/providers/agent-server-ui-providers.cjs +1 -1
- package/dist/components/providers/agent-server-ui-providers.cjs.map +1 -1
- package/dist/components/providers/agent-server-ui-providers.d.ts +4 -2
- package/dist/components/providers/agent-server-ui-providers.js +9 -2
- package/dist/components/providers/agent-server-ui-providers.js.map +1 -1
- package/dist/components/providers/index.cjs +1 -1
- package/dist/components/providers/index.d.ts +1 -2
- package/dist/components/providers/index.js +0 -1
- package/dist/components/providers/telemetry-provider.cjs +2 -0
- package/dist/components/providers/telemetry-provider.cjs.map +1 -0
- package/dist/components/providers/telemetry-provider.d.ts +6 -0
- package/dist/components/providers/telemetry-provider.js +64 -0
- package/dist/components/providers/telemetry-provider.js.map +1 -0
- package/dist/components/shared/modals/settings/settings-modal.cjs +1 -1
- package/dist/components/shared/modals/settings/settings-modal.cjs.map +1 -1
- package/dist/components/shared/modals/settings/settings-modal.js +23 -22
- package/dist/components/shared/modals/settings/settings-modal.js.map +1 -1
- package/dist/config/defaults.cjs +1 -1
- package/dist/config/defaults.cjs.map +1 -1
- package/dist/config/defaults.js +5 -4
- package/dist/config/defaults.js.map +1 -1
- package/dist/constants/acp-providers.cjs.map +1 -1
- package/dist/constants/acp-providers.d.ts +1 -1
- package/dist/constants/acp-providers.js.map +1 -1
- package/dist/constants/canvas-ui.cjs +2 -0
- package/dist/constants/canvas-ui.cjs.map +1 -0
- package/dist/constants/canvas-ui.d.ts +8 -0
- package/dist/constants/canvas-ui.js +6 -0
- package/dist/constants/canvas-ui.js.map +1 -0
- package/dist/contexts/conversation-websocket-context.cjs +3 -3
- package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
- package/dist/contexts/conversation-websocket-context.js +197 -204
- package/dist/contexts/conversation-websocket-context.js.map +1 -1
- package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
- package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
- package/dist/hooks/mutation/use-create-conversation.d.ts +2 -1
- package/dist/hooks/mutation/use-create-conversation.js +52 -52
- package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
- 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.d.ts +3 -1
- package/dist/hooks/mutation/use-save-settings.js +6 -5
- package/dist/hooks/mutation/use-save-settings.js.map +1 -1
- package/dist/hooks/query/query-keys.cjs +1 -1
- package/dist/hooks/query/query-keys.cjs.map +1 -1
- package/dist/hooks/query/query-keys.d.ts +2 -0
- package/dist/hooks/query/query-keys.js +4 -1
- package/dist/hooks/query/query-keys.js.map +1 -1
- package/dist/hooks/query/use-backends-health.cjs +1 -1
- package/dist/hooks/query/use-backends-health.cjs.map +1 -1
- package/dist/hooks/query/use-backends-health.js +50 -48
- package/dist/hooks/query/use-backends-health.js.map +1 -1
- package/dist/hooks/query/use-cloud-organizations.cjs +1 -1
- package/dist/hooks/query/use-cloud-organizations.cjs.map +1 -1
- package/dist/hooks/query/use-cloud-organizations.d.ts +1 -0
- package/dist/hooks/query/use-cloud-organizations.js +5 -2
- package/dist/hooks/query/use-cloud-organizations.js.map +1 -1
- package/dist/hooks/query/use-commit-changes.cjs +2 -0
- package/dist/hooks/query/use-commit-changes.cjs.map +1 -0
- package/dist/hooks/query/use-commit-changes.d.ts +5 -0
- package/dist/hooks/query/use-commit-changes.js +34 -0
- package/dist/hooks/query/use-commit-changes.js.map +1 -0
- package/dist/hooks/query/use-task-polling.cjs +1 -1
- package/dist/hooks/query/use-task-polling.cjs.map +1 -1
- package/dist/hooks/query/use-task-polling.d.ts +3 -2
- package/dist/hooks/query/use-task-polling.js +53 -40
- package/dist/hooks/query/use-task-polling.js.map +1 -1
- package/dist/hooks/query/use-unified-git-commits.cjs +2 -0
- package/dist/hooks/query/use-unified-git-commits.cjs.map +1 -0
- package/dist/hooks/query/use-unified-git-commits.d.ts +10 -0
- package/dist/hooks/query/use-unified-git-commits.js +41 -0
- package/dist/hooks/query/use-unified-git-commits.js.map +1 -0
- package/dist/hooks/query/use-unified-git-diff.cjs +1 -1
- package/dist/hooks/query/use-unified-git-diff.cjs.map +1 -1
- package/dist/hooks/query/use-unified-git-diff.d.ts +5 -0
- package/dist/hooks/query/use-unified-git-diff.js +11 -4
- package/dist/hooks/query/use-unified-git-diff.js.map +1 -1
- package/dist/hooks/use-acp-model-context.cjs +1 -1
- package/dist/hooks/use-acp-model-context.cjs.map +1 -1
- package/dist/hooks/use-acp-model-context.d.ts +4 -1
- package/dist/hooks/use-acp-model-context.js +9 -8
- package/dist/hooks/use-acp-model-context.js.map +1 -1
- package/dist/hooks/use-auto-refresh-files-on-edit.cjs +1 -1
- package/dist/hooks/use-auto-refresh-files-on-edit.cjs.map +1 -1
- package/dist/hooks/use-auto-refresh-files-on-edit.js +1 -1
- package/dist/hooks/use-auto-refresh-files-on-edit.js.map +1 -1
- package/dist/hooks/use-chat-input-model-state.cjs.map +1 -1
- package/dist/hooks/use-chat-input-model-state.d.ts +2 -1
- package/dist/hooks/use-chat-input-model-state.js.map +1 -1
- package/dist/hooks/use-chat-input-profile-state.cjs +1 -1
- package/dist/hooks/use-chat-input-profile-state.cjs.map +1 -1
- package/dist/hooks/use-chat-input-profile-state.d.ts +1 -10
- package/dist/hooks/use-chat-input-profile-state.js +42 -15
- package/dist/hooks/use-chat-input-profile-state.js.map +1 -1
- package/dist/hooks/use-device-flow.cjs +1 -1
- package/dist/hooks/use-device-flow.cjs.map +1 -1
- package/dist/hooks/use-device-flow.d.ts +4 -1
- package/dist/hooks/use-device-flow.js +42 -40
- package/dist/hooks/use-device-flow.js.map +1 -1
- package/dist/hooks/use-telemetry.cjs +1 -1
- package/dist/hooks/use-telemetry.cjs.map +1 -1
- package/dist/hooks/use-telemetry.d.ts +3 -3
- package/dist/hooks/use-telemetry.js +16 -22
- package/dist/hooks/use-telemetry.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 +5 -5
- package/dist/hooks/use-tracking.js +37 -37
- 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 +9 -0
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/index.cjs +1 -1
- package/dist/i18n/index.cjs.map +1 -1
- package/dist/i18n/index.js +19 -18
- package/dist/i18n/index.js.map +1 -1
- package/dist/i18n/translation.cjs +2 -2
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +153 -0
- package/dist/i18n/translation.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +32 -32
- package/dist/lib/index.cjs +1 -1
- package/dist/lib/index.d.ts +2 -2
- package/dist/lib/index.js +1 -1
- package/dist/locales/ar/openhands.json +9 -0
- package/dist/locales/ca/openhands.json +9 -0
- package/dist/locales/de/openhands.json +9 -0
- package/dist/locales/en/openhands.json +9 -0
- package/dist/locales/es/openhands.json +9 -0
- package/dist/locales/fr/openhands.json +9 -0
- package/dist/locales/it/openhands.json +9 -0
- package/dist/locales/ja/openhands.json +9 -0
- package/dist/locales/ko-KR/openhands.json +9 -0
- package/dist/locales/no/openhands.json +9 -0
- package/dist/locales/pt/openhands.json +9 -0
- package/dist/locales/tr/openhands.json +9 -0
- package/dist/locales/uk/openhands.json +9 -0
- package/dist/locales/zh-CN/openhands.json +9 -0
- package/dist/locales/zh-TW/openhands.json +9 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.cjs +2 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.js +351 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.cjs +2 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.js +106 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs +2 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js +69 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/clients.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/clients.js +3 -0
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js +18 -2
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp.js.map +1 -1
- package/dist/node_modules/axios/index.cjs +1 -1
- package/dist/node_modules/axios/index.js +1 -1
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +3 -3
- package/dist/package.js.map +1 -1
- package/dist/routes/app-settings.cjs +1 -1
- package/dist/routes/app-settings.cjs.map +1 -1
- package/dist/routes/app-settings.js +59 -60
- package/dist/routes/app-settings.js.map +1 -1
- package/dist/routes/commits-tab.cjs +2 -0
- package/dist/routes/commits-tab.cjs.map +1 -0
- package/dist/routes/commits-tab.d.ts +8 -0
- package/dist/routes/commits-tab.js +45 -0
- package/dist/routes/commits-tab.js.map +1 -0
- package/dist/routes/files-tab.cjs +1 -1
- package/dist/routes/files-tab.cjs.map +1 -1
- package/dist/routes/files-tab.js +148 -127
- package/dist/routes/files-tab.js.map +1 -1
- package/dist/routes/llm-settings.cjs +1 -1
- package/dist/routes/llm-settings.cjs.map +1 -1
- package/dist/routes/llm-settings.js +4 -1
- package/dist/routes/llm-settings.js.map +1 -1
- package/dist/services/cloud-funnel-analytics.cjs +2 -0
- package/dist/services/cloud-funnel-analytics.cjs.map +1 -0
- package/dist/services/cloud-funnel-analytics.d.ts +4 -0
- package/dist/services/cloud-funnel-analytics.js +39 -0
- package/dist/services/cloud-funnel-analytics.js.map +1 -0
- package/dist/services/telemetry.cjs +1 -1
- package/dist/services/telemetry.cjs.map +1 -1
- package/dist/services/telemetry.d.ts +46 -9
- package/dist/services/telemetry.js +182 -71
- package/dist/services/telemetry.js.map +1 -1
- package/dist/themes/color-themes.cjs.map +1 -1
- package/dist/themes/color-themes.d.ts +3 -6
- package/dist/themes/color-themes.js.map +1 -1
- package/dist/types/agent-server/core/base/action.d.ts +5 -4
- package/dist/types/agent-server/core/base/base.d.ts +3 -2
- package/dist/types/agent-server/core/base/observation.d.ts +1 -1
- package/dist/types/agent-server/type-guards.cjs +1 -1
- package/dist/types/agent-server/type-guards.cjs.map +1 -1
- package/dist/types/agent-server/type-guards.d.ts +3 -5
- package/dist/types/agent-server/type-guards.js +2 -1
- package/dist/types/agent-server/type-guards.js.map +1 -1
- package/dist/types/automation.d.ts +5 -0
- package/dist/utils/api-error-message.d.ts +11 -0
- package/dist/utils/automation-timeout.d.ts +19 -0
- package/dist/utils/base-path.cjs +2 -0
- package/dist/utils/base-path.cjs.map +1 -0
- package/dist/utils/base-path.d.ts +2 -0
- package/dist/utils/base-path.js +23 -0
- package/dist/utils/base-path.js.map +1 -0
- package/dist/utils/error-handler.cjs +1 -1
- package/dist/utils/error-handler.cjs.map +1 -1
- package/dist/utils/error-handler.d.ts +1 -4
- package/dist/utils/error-handler.js +6 -7
- package/dist/utils/error-handler.js.map +1 -1
- package/dist/utils/map-provider.cjs +1 -1
- package/dist/utils/map-provider.cjs.map +1 -1
- package/dist/utils/map-provider.d.ts +1 -0
- package/dist/utils/map-provider.js +2 -1
- package/dist/utils/map-provider.js.map +1 -1
- package/package.json +3 -3
- package/scripts/check-sdk-version-sync.mjs +6 -6
- package/scripts/dev-safe.mjs +7 -8
- package/scripts/dev-static.mjs +3 -0
- package/scripts/dev-with-automation.mjs +3 -0
- package/scripts/docker-build.mjs +4 -0
- package/scripts/static-server.mjs +93 -7
- package/tools/canvas_ui_tool.py +14 -8
- package/build/assets/active-backend-context-hxq31W25.js +0 -1
- package/build/assets/agent-server-client-options-DVLRd9sw.js +0 -1
- package/build/assets/agent-server-conversation-service.api-CuSdr4Qb.js +0 -5
- package/build/assets/agent-settings-D_yOy8XB.js +0 -1
- package/build/assets/api-key-entry-screen-Dl0qVYi4.js +0 -1
- package/build/assets/app-settings-yVizGXox.js +0 -1
- package/build/assets/automation-detail-dvJfLs5u.js +0 -2
- package/build/assets/automation-export-BPcgLqPD.js +0 -2
- package/build/assets/automations-list-CUXogTe0.js +0 -1
- package/build/assets/backend-form-modal-CQJGmItq.js +0 -1
- package/build/assets/check-Bvi71siz.js +0 -1
- package/build/assets/condenser-settings-Ca8fYZ_Z.js +0 -1
- package/build/assets/conversation-9NBSRoR9.js +0 -1
- package/build/assets/conversation-BXg6Oti2.js +0 -89
- package/build/assets/conversation-panel-CZri9Rup.js +0 -1
- package/build/assets/conversation-service.api-DPBQvTKD.js +0 -1
- package/build/assets/declaration-gq8V5eTU.js +0 -1
- package/build/assets/files-tab-UVoray88.js +0 -1
- package/build/assets/git-provider-icon-o6hdnJUB.js +0 -1
- package/build/assets/handle-capture-consent-CPMXU29K.js +0 -1
- package/build/assets/home-D1IHvGTN.js +0 -1
- package/build/assets/index-redirect-CUUJiNki.js +0 -1
- package/build/assets/install-server-modal-BbuQaA2w.js +0 -1
- package/build/assets/lesson-plan-jC0HBoe6.js +0 -4
- package/build/assets/llm-not-configured-banner-DoARbcdL.js +0 -27
- package/build/assets/llm-settings-4JMLV8mq.js +0 -1
- package/build/assets/llm-settings-D91gMw3U.js +0 -1
- package/build/assets/llm-subscription-service-CKyaV24y.js +0 -1
- package/build/assets/loader-circle-BEykUKYG.js +0 -1
- package/build/assets/manage-backends-modal-DkWAMSle.js +0 -1
- package/build/assets/manifest-aa5c29f6.js +0 -1
- package/build/assets/model-selector-BfqpMkSJ.js +0 -1
- package/build/assets/mouse-pointer-click-PdEQPL6v.js +0 -1
- package/build/assets/onboarding-Bu-HN1ze.js +0 -1
- package/build/assets/onboarding-modal-CZgjs5Bx.js +0 -1
- package/build/assets/option-service.api-BrZ5q87N.js +0 -1
- package/build/assets/organization-service.api-Bk4pCGU1.js +0 -1
- package/build/assets/path-utils-CSmuZoix.js +0 -1
- package/build/assets/plugins-management-service-BRBLxvUl.js +0 -1
- package/build/assets/profiles-service.api-BMXQ9pZC.js +0 -1
- package/build/assets/providers-BpO967xS.js +0 -1
- package/build/assets/proxy-BgJLtxu7.js +0 -1
- package/build/assets/root-BM5WgQ4_.js +0 -2
- package/build/assets/root-V8fkplMy.css +0 -1
- package/build/assets/root-layout-BdoyoobY.js +0 -2
- package/build/assets/schema-field-BSHrUMme.js +0 -1
- package/build/assets/sdk-section-page-t82gsOqa.js +0 -1
- package/build/assets/search-4DHskuhE.js +0 -1
- package/build/assets/secrets-service-B2GqPV0N.js +0 -1
- package/build/assets/settings-DmPLkgq0.js +0 -1
- package/build/assets/settings-modal-CwrZKrTq.js +0 -1
- package/build/assets/settings-service.api-Ce-ub11I.js +0 -1
- package/build/assets/shared-conversation-BDREQPnE.js +0 -1
- package/build/assets/skills-plugins-2Y44YHbO.js +0 -1
- package/build/assets/use-acp-credential-form-MzZM6D7D.js +0 -1
- package/build/assets/use-agent-profiles-DwZxnwO5.js +0 -1
- package/build/assets/use-backends-health-CRHzuvxO.js +0 -1
- package/build/assets/use-cloud-current-user-id-utFreJ0i.js +0 -1
- package/build/assets/use-config-mJrtZHP1.js +0 -1
- package/build/assets/use-create-conversation-DdqsP78F.js +0 -1
- package/build/assets/use-is-authed-B6M0mcGL.js +0 -1
- package/build/assets/use-llm-profiles-RC-PkpBl.js +0 -1
- package/build/assets/use-plugins-marketplace-FHlbeQ4c.js +0 -1
- package/build/assets/use-runtime-is-ready-RKj2WmEh.js +0 -1
- package/build/assets/use-save-agent-profile-tvDP15mh.js +0 -1
- package/build/assets/use-save-settings-BGlSfuYn.js +0 -1
- package/build/assets/use-settings-CH5LzXD8.js +0 -1
- package/build/assets/use-settings-nav-items-Dwktv8wo.js +0 -16
- package/build/assets/use-skills-CSzSL6HG.js +0 -1
- package/build/assets/use-tracking-BIXzagSI.js +0 -1
- package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~lf310vj7-CSVPGId3.js +0 -10
- package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~nfpll1wp-BCpa95De.js +0 -177
- package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jewnulst-C57fm7C-.js +0 -1
- package/build/assets/vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CqXiHwjU.js +0 -2
- package/build/assets/x-Cb0WAtak.js +0 -1
- package/dist/components/providers/posthog-wrapper.cjs +0 -2
- package/dist/components/providers/posthog-wrapper.cjs.map +0 -1
- package/dist/components/providers/posthog-wrapper.d.ts +0 -4
- package/dist/components/providers/posthog-wrapper.js +0 -49
- package/dist/components/providers/posthog-wrapper.js.map +0 -1
- package/dist/node_modules/posthog-js/react/dist/esm/index.cjs +0 -2
- package/dist/node_modules/posthog-js/react/dist/esm/index.cjs.map +0 -1
- package/dist/node_modules/posthog-js/react/dist/esm/index.js +0 -113
- package/dist/node_modules/posthog-js/react/dist/esm/index.js.map +0 -1
- package/dist/utils/handle-capture-consent.cjs +0 -2
- package/dist/utils/handle-capture-consent.cjs.map +0 -1
- package/dist/utils/handle-capture-consent.d.ts +0 -7
- package/dist/utils/handle-capture-consent.js +0 -8
- package/dist/utils/handle-capture-consent.js.map +0 -1
- /package/build/assets/{__vite-browser-external-4xJsU2-u.js → __vite-browser-external-BQUj0sYu.js} +0 -0
- /package/build/assets/{agent-server-ui-style-scope-COnDHTm5.js → agent-server-ui-style-scope-qhnhZHBV.js} +0 -0
- /package/build/assets/{automation-BU8zu-FP.js → automation-LZB0MjdV.js} +0 -0
- /package/build/assets/{close-p3Op5lxI.js → close-DLFb5kfv.js} +0 -0
- /package/build/assets/{common-Dh7OqABE.js → common-CxbUL3nR.js} +0 -0
- /package/build/assets/{createLucideIcon-CVAsW2Yo.js → createLucideIcon-D4Tak8A1.js} +0 -0
- /package/build/assets/{folder-mMWFvaw0.js → folder-Bk311brm.js} +0 -0
- /package/build/assets/{get-language-from-path-CPNnuVhI.js → get-language-from-path-DBqBsCWH.js} +0 -0
- /package/build/assets/{git-status-mapper-BI8FyUVp.js → git-status-mapper-DnL9OC8_.js} +0 -0
- /package/build/assets/{iconBase-DaTRRUjy.js → iconBase-Dz51Zn5x.js} +0 -0
- /package/build/assets/{link-external-DfKQroKX.js → link-external-CaBmUEs_.js} +0 -0
- /package/build/assets/{search-BsjCEFNf.js → search-BgOCR7_c.js} +0 -0
- /package/build/assets/{settings-like-page-layout-classes-DENKlZpD.js → settings-like-page-layout-classes-Cdl6jOe5.js} +0 -0
- /package/build/assets/{skills-9cDZONKh.js → skills-EqzxYBvT.js} +0 -0
- /package/build/assets/{terminal-BuLtIrb9.js → terminal-Cgf___rK.js} +0 -0
- /package/build/assets/{u-check-circle-half-LiwZkuFe.js → u-check-circle-half-MsShT8Ec.js} +0 -0
- /package/build/assets/{u-edit-DJ90xc8Z.js → u-edit-DL5LgKon.js} +0 -0
- /package/build/assets/{use-breakpoint-B-O0lQ84.js → use-breakpoint-BP3lqLMx.js} +0 -0
- /package/build/assets/{use-click-outside-element-Bf4Omzot.js → use-click-outside-element-D9BYdANT.js} +0 -0
- /package/build/assets/{use-launch-skill-in-chat-BnoDgvAy.js → use-launch-skill-in-chat-DJWEfVc5.js} +0 -0
- /package/build/assets/{vendor~browser-Dqd33JyP.js → vendor~browser-By2MVv_N.js} +0 -0
- /package/build/assets/{vendor~conversation-panel~conversation~alert-banner-DHDkknt5.js → vendor~conversation-panel~conversation~alert-banner-CxfzCmkN.js} +0 -0
- /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~epa72zsm-B4rXs7Zd.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~e0djk9ee-Cw6LUe8p.js} +0 -0
- /package/build/assets/{vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~byh8a1g4-XNPdpuO8.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~jkpzbynd-CkpBIhVe.js} +0 -0
- /package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-9UMeuPV6.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-COhHANvV.js} +0 -0
- /package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DTzw2x50.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-FghQ3Z1a.js} +0 -0
- /package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~automations-~ki5qnp0d-rV6d1Iv_.js → vendor~root-layout~index-home~home~conversation-panel~conversation~launch~skills-settings~a~j2jlu22h-mC0v44WR.js} +0 -0
- /package/build/assets/{vendor~root-layout~home~mcp~automations-list~onboarding-modal-CXyYYvYh.js → vendor~root-layout~index-home~home~mcp~automations-list~onboarding-modal-C4-GDgiF.js} +0 -0
- /package/build/assets/{vendor~terminal-aeP3PnKf.js → vendor~terminal-CnKZILnC.js} +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`./default-backend.cjs`);var t=`openhands-backends`,n=`openhands-active-backend`;function r(e){return e===`local`||e===`cloud`}function i(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.id==`string`&&t.id.length>0&&typeof t.name==`string`&&typeof t.host==`string`&&typeof t.apiKey==`string`&&r(t.kind)}function
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`./default-backend.cjs`);var t=`openhands-backends`,n=`openhands-active-backend`;function r(e){return e===`local`||e===`cloud`}function i(e){return e===void 0||e===`api-key`||e===`cookie`}function a(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.id==`string`&&t.id.length>0&&typeof t.name==`string`&&typeof t.host==`string`&&typeof t.apiKey==`string`&&r(t.kind)&&i(t.authMode)}function o(e){try{let{hostname:t}=new URL(e);return t===`localhost`||t===`127.0.0.1`||t===`::1`||t===`[::1]`}catch{return!1}}function s(e,t){return e.id!==`default-local`||e.kind!==`local`?!1:e.host===t.host||o(e.host)&&o(t.host)}function c(t){let n=e.makeDefaultLocalBackend();if(!n)return t;let r=!1,i=t.map(e=>!s(e,n)||e.apiKey===n.apiKey?e:(r=!0,{...e,apiKey:n.apiKey}));return r?(l(i),i):t}function l(e){if(!(typeof window>`u`))try{window.localStorage.setItem(t,JSON.stringify(e))}catch{}}function u(){if(typeof window>`u`)return[];try{let n=e.makeLockedCloudBackend();if(n)return l([n]),h()?.backendId!==n.id&&g({backendId:n.id}),[n];let r=window.localStorage.getItem(t);if(r===null){let t=e.makeDefaultLocalBackend();return t?(l([t]),[t]):[]}let i=JSON.parse(r);if(!Array.isArray(i))return[];let o=i.filter(a);if(o.length===0){let t=e.makeDefaultLocalBackend();return t?(l([t]),[t]):[]}return c(o)}catch{return[]}}function d(e){if(!e)return null;try{let t=JSON.parse(e);if(typeof t!=`object`||!t||typeof t.backendId!=`string`)return null;let n=t.orgId;return{backendId:t.backendId,orgId:typeof n==`string`&&n.length>0?n:null}}catch{return null}}function f(e,t){try{return e?.getItem(t)??null}catch{return null}}function p(e,t,n){try{e?.setItem(t,n)}catch{}}function m(e,t){try{e?.removeItem(t)}catch{}}function h(){return typeof window>`u`?null:d(f(window.sessionStorage,n))||d(f(window.localStorage,n))}function g(e){if(typeof window>`u`)return;if(!e){m(window.sessionStorage,n),m(window.localStorage,n);return}let t=JSON.stringify({backendId:e.backendId,orgId:e.orgId??null});p(window.sessionStorage,n,t),p(window.localStorage,n,t)}exports.readStoredActiveBackend=h,exports.readStoredBackends=u,exports.writeStoredActiveBackend=g,exports.writeStoredBackends=l;
|
|
2
2
|
//# sourceMappingURL=storage.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.cjs","names":[],"sources":["../../../src/api/backend-registry/storage.ts"],"sourcesContent":["import {\n SEEDED_DEFAULT_BACKEND_ID,\n makeDefaultLocalBackend,\n} from \"./default-backend\";\nimport type {
|
|
1
|
+
{"version":3,"file":"storage.cjs","names":[],"sources":["../../../src/api/backend-registry/storage.ts"],"sourcesContent":["import {\n SEEDED_DEFAULT_BACKEND_ID,\n makeDefaultLocalBackend,\n makeLockedCloudBackend,\n} from \"./default-backend\";\nimport type {\n Backend,\n BackendAuthMode,\n BackendKind,\n BackendSelection,\n} from \"./types\";\n\nexport const BACKENDS_STORAGE_KEY = \"openhands-backends\";\nexport const ACTIVE_BACKEND_STORAGE_KEY = \"openhands-active-backend\";\n\nfunction isValidKind(value: unknown): value is BackendKind {\n return value === \"local\" || value === \"cloud\";\n}\n\nfunction isValidAuthMode(value: unknown): value is BackendAuthMode {\n return value === undefined || value === \"api-key\" || value === \"cookie\";\n}\n\nfunction isValidBackend(value: unknown): value is Backend {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Partial<Backend>;\n return (\n typeof v.id === \"string\" &&\n v.id.length > 0 &&\n typeof v.name === \"string\" &&\n typeof v.host === \"string\" &&\n typeof v.apiKey === \"string\" &&\n isValidKind(v.kind) &&\n isValidAuthMode(v.authMode)\n );\n}\n\nfunction isLoopbackUrl(value: string): boolean {\n try {\n const { hostname } = new URL(value);\n return (\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"::1\" ||\n hostname === \"[::1]\"\n );\n } catch {\n return false;\n }\n}\n\nfunction shouldSyncLauncherDefaultLocalBackend(\n backend: Backend,\n defaultBackend: Backend,\n): boolean {\n if (backend.id !== SEEDED_DEFAULT_BACKEND_ID || backend.kind !== \"local\") {\n return false;\n }\n\n return (\n backend.host === defaultBackend.host ||\n (isLoopbackUrl(backend.host) && isLoopbackUrl(defaultBackend.host))\n );\n}\n\nfunction syncLauncherDefaultLocalBackend(backends: Backend[]): Backend[] {\n const defaultBackend = makeDefaultLocalBackend();\n if (!defaultBackend) return backends;\n\n let didSync = false;\n const syncedBackends = backends.map((backend) => {\n if (!shouldSyncLauncherDefaultLocalBackend(backend, defaultBackend)) {\n return backend;\n }\n\n if (backend.apiKey === defaultBackend.apiKey) return backend;\n\n didSync = true;\n return {\n ...backend,\n apiKey: defaultBackend.apiKey,\n };\n });\n\n if (!didSync) return backends;\n\n writeStoredBackends(syncedBackends);\n return syncedBackends;\n}\n\nexport function writeStoredBackends(backends: Backend[]): void {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(BACKENDS_STORAGE_KEY, JSON.stringify(backends));\n } catch {\n /* ignore quota / serialization errors */\n }\n}\n\nexport function readStoredBackends(): Backend[] {\n if (typeof window === \"undefined\") return [];\n\n try {\n const lockedCloudBackend = makeLockedCloudBackend();\n if (lockedCloudBackend) {\n writeStoredBackends([lockedCloudBackend]);\n const activeSelection = readStoredActiveBackend();\n if (activeSelection?.backendId !== lockedCloudBackend.id) {\n writeStoredActiveBackend({ backendId: lockedCloudBackend.id });\n }\n return [lockedCloudBackend];\n }\n\n const raw = window.localStorage.getItem(BACKENDS_STORAGE_KEY);\n\n // First install: seed only when the launcher supplied enough information\n // for a usable local backend.\n if (raw === null) {\n const defaultBackend = makeDefaultLocalBackend();\n if (!defaultBackend) return [];\n\n writeStoredBackends([defaultBackend]);\n return [defaultBackend];\n }\n\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return [];\n const valid = parsed.filter(isValidBackend);\n\n // If the stored array is empty (or everything in it failed validation),\n // only re-seed when the launcher supplied both a host and API key.\n if (valid.length === 0) {\n const defaultBackend = makeDefaultLocalBackend();\n if (!defaultBackend) return [];\n\n writeStoredBackends([defaultBackend]);\n return [defaultBackend];\n }\n\n const synced = syncLauncherDefaultLocalBackend(valid);\n return synced;\n } catch {\n return [];\n }\n}\n\nfunction parseBackendSelection(raw: string | null): BackendSelection | null {\n if (!raw) return null;\n\n try {\n const parsed = JSON.parse(raw);\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n typeof (parsed as BackendSelection).backendId !== \"string\"\n ) {\n return null;\n }\n const orgIdRaw = (parsed as BackendSelection).orgId;\n return {\n backendId: (parsed as BackendSelection).backendId,\n orgId:\n typeof orgIdRaw === \"string\" && orgIdRaw.length > 0 ? orgIdRaw : null,\n };\n } catch {\n return null;\n }\n}\n\nfunction readStorageItem(\n storage: Storage | undefined,\n key: string,\n): string | null {\n try {\n return storage?.getItem(key) ?? null;\n } catch {\n return null;\n }\n}\n\nfunction writeStorageItem(\n storage: Storage | undefined,\n key: string,\n value: string,\n): void {\n try {\n storage?.setItem(key, value);\n } catch {\n /* ignore */\n }\n}\n\nfunction removeStorageItem(storage: Storage | undefined, key: string): void {\n try {\n storage?.removeItem(key);\n } catch {\n /* ignore */\n }\n}\n\nexport function readStoredActiveBackend(): BackendSelection | null {\n if (typeof window === \"undefined\") return null;\n\n // Active backend is tab-scoped so reloading tab A does not adopt tab B's\n // backend. localStorage remains a last-used fallback for fresh tabs and old\n // persisted state.\n const sessionSelection = parseBackendSelection(\n readStorageItem(window.sessionStorage, ACTIVE_BACKEND_STORAGE_KEY),\n );\n if (sessionSelection) return sessionSelection;\n\n return parseBackendSelection(\n readStorageItem(window.localStorage, ACTIVE_BACKEND_STORAGE_KEY),\n );\n}\n\nexport function writeStoredActiveBackend(\n selection: BackendSelection | null,\n): void {\n if (typeof window === \"undefined\") return;\n\n if (!selection) {\n removeStorageItem(window.sessionStorage, ACTIVE_BACKEND_STORAGE_KEY);\n removeStorageItem(window.localStorage, ACTIVE_BACKEND_STORAGE_KEY);\n return;\n }\n\n const serialized = JSON.stringify({\n backendId: selection.backendId,\n orgId: selection.orgId ?? null,\n });\n // Mirror to localStorage only as the default for new tabs/backward\n // compatibility; reads in existing tabs prefer sessionStorage.\n writeStorageItem(\n window.sessionStorage,\n ACTIVE_BACKEND_STORAGE_KEY,\n serialized,\n );\n writeStorageItem(window.localStorage, ACTIVE_BACKEND_STORAGE_KEY, serialized);\n}\n"],"mappings":"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"}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
|
-
import { makeDefaultLocalBackend as e } from "./default-backend.js";
|
|
1
|
+
import { makeDefaultLocalBackend as e, makeLockedCloudBackend as t } from "./default-backend.js";
|
|
2
2
|
//#region src/api/backend-registry/storage.ts
|
|
3
|
-
var
|
|
4
|
-
function
|
|
3
|
+
var n = "openhands-backends", r = "openhands-active-backend";
|
|
4
|
+
function i(e) {
|
|
5
5
|
return e === "local" || e === "cloud";
|
|
6
6
|
}
|
|
7
|
-
function
|
|
7
|
+
function a(e) {
|
|
8
|
+
return e === void 0 || e === "api-key" || e === "cookie";
|
|
9
|
+
}
|
|
10
|
+
function o(e) {
|
|
8
11
|
if (typeof e != "object" || !e) return !1;
|
|
9
12
|
let t = e;
|
|
10
|
-
return typeof t.id == "string" && t.id.length > 0 && typeof t.name == "string" && typeof t.host == "string" && typeof t.apiKey == "string" &&
|
|
13
|
+
return typeof t.id == "string" && t.id.length > 0 && typeof t.name == "string" && typeof t.host == "string" && typeof t.apiKey == "string" && i(t.kind) && a(t.authMode);
|
|
11
14
|
}
|
|
12
|
-
function
|
|
15
|
+
function s(e) {
|
|
13
16
|
try {
|
|
14
17
|
let { hostname: t } = new URL(e);
|
|
15
18
|
return t === "localhost" || t === "127.0.0.1" || t === "::1" || t === "[::1]";
|
|
@@ -17,44 +20,46 @@ function a(e) {
|
|
|
17
20
|
return !1;
|
|
18
21
|
}
|
|
19
22
|
}
|
|
20
|
-
function
|
|
21
|
-
return e.id !== "default-local" || e.kind !== "local" ? !1 : e.host === t.host ||
|
|
23
|
+
function c(e, t) {
|
|
24
|
+
return e.id !== "default-local" || e.kind !== "local" ? !1 : e.host === t.host || s(e.host) && s(t.host);
|
|
22
25
|
}
|
|
23
|
-
function
|
|
26
|
+
function l(t) {
|
|
24
27
|
let n = e();
|
|
25
28
|
if (!n) return t;
|
|
26
|
-
let r = !1, i = t.map((e) => !
|
|
29
|
+
let r = !1, i = t.map((e) => !c(e, n) || e.apiKey === n.apiKey ? e : (r = !0, {
|
|
27
30
|
...e,
|
|
28
31
|
apiKey: n.apiKey
|
|
29
32
|
}));
|
|
30
|
-
return r ? (
|
|
33
|
+
return r ? (u(i), i) : t;
|
|
31
34
|
}
|
|
32
|
-
function
|
|
35
|
+
function u(e) {
|
|
33
36
|
if (!(typeof window > "u")) try {
|
|
34
|
-
window.localStorage.setItem(
|
|
37
|
+
window.localStorage.setItem(n, JSON.stringify(e));
|
|
35
38
|
} catch {}
|
|
36
39
|
}
|
|
37
|
-
function
|
|
40
|
+
function d() {
|
|
38
41
|
if (typeof window > "u") return [];
|
|
39
42
|
try {
|
|
40
|
-
let
|
|
41
|
-
if (
|
|
43
|
+
let r = t();
|
|
44
|
+
if (r) return u([r]), g()?.backendId !== r.id && _({ backendId: r.id }), [r];
|
|
45
|
+
let i = window.localStorage.getItem(n);
|
|
46
|
+
if (i === null) {
|
|
42
47
|
let t = e();
|
|
43
|
-
return t ? (
|
|
48
|
+
return t ? (u([t]), [t]) : [];
|
|
44
49
|
}
|
|
45
|
-
let
|
|
46
|
-
if (!Array.isArray(
|
|
47
|
-
let
|
|
48
|
-
if (
|
|
50
|
+
let a = JSON.parse(i);
|
|
51
|
+
if (!Array.isArray(a)) return [];
|
|
52
|
+
let s = a.filter(o);
|
|
53
|
+
if (s.length === 0) {
|
|
49
54
|
let t = e();
|
|
50
|
-
return t ? (
|
|
55
|
+
return t ? (u([t]), [t]) : [];
|
|
51
56
|
}
|
|
52
|
-
return s
|
|
57
|
+
return l(s);
|
|
53
58
|
} catch {
|
|
54
59
|
return [];
|
|
55
60
|
}
|
|
56
61
|
}
|
|
57
|
-
function
|
|
62
|
+
function f(e) {
|
|
58
63
|
if (!e) return null;
|
|
59
64
|
try {
|
|
60
65
|
let t = JSON.parse(e);
|
|
@@ -68,39 +73,39 @@ function u(e) {
|
|
|
68
73
|
return null;
|
|
69
74
|
}
|
|
70
75
|
}
|
|
71
|
-
function
|
|
76
|
+
function p(e, t) {
|
|
72
77
|
try {
|
|
73
78
|
return e?.getItem(t) ?? null;
|
|
74
79
|
} catch {
|
|
75
80
|
return null;
|
|
76
81
|
}
|
|
77
82
|
}
|
|
78
|
-
function
|
|
83
|
+
function m(e, t, n) {
|
|
79
84
|
try {
|
|
80
85
|
e?.setItem(t, n);
|
|
81
86
|
} catch {}
|
|
82
87
|
}
|
|
83
|
-
function
|
|
88
|
+
function h(e, t) {
|
|
84
89
|
try {
|
|
85
90
|
e?.removeItem(t);
|
|
86
91
|
} catch {}
|
|
87
92
|
}
|
|
88
|
-
function
|
|
89
|
-
return typeof window > "u" ? null :
|
|
93
|
+
function g() {
|
|
94
|
+
return typeof window > "u" ? null : f(p(window.sessionStorage, r)) || f(p(window.localStorage, r));
|
|
90
95
|
}
|
|
91
|
-
function
|
|
96
|
+
function _(e) {
|
|
92
97
|
if (typeof window > "u") return;
|
|
93
98
|
if (!e) {
|
|
94
|
-
|
|
99
|
+
h(window.sessionStorage, r), h(window.localStorage, r);
|
|
95
100
|
return;
|
|
96
101
|
}
|
|
97
102
|
let t = JSON.stringify({
|
|
98
103
|
backendId: e.backendId,
|
|
99
104
|
orgId: e.orgId ?? null
|
|
100
105
|
});
|
|
101
|
-
|
|
106
|
+
m(window.sessionStorage, r, t), m(window.localStorage, r, t);
|
|
102
107
|
}
|
|
103
108
|
//#endregion
|
|
104
|
-
export {
|
|
109
|
+
export { g as readStoredActiveBackend, d as readStoredBackends, _ as writeStoredActiveBackend, u as writeStoredBackends };
|
|
105
110
|
|
|
106
111
|
//# sourceMappingURL=storage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","names":[],"sources":["../../../src/api/backend-registry/storage.ts"],"sourcesContent":["import {\n SEEDED_DEFAULT_BACKEND_ID,\n makeDefaultLocalBackend,\n} from \"./default-backend\";\nimport type {
|
|
1
|
+
{"version":3,"file":"storage.js","names":[],"sources":["../../../src/api/backend-registry/storage.ts"],"sourcesContent":["import {\n SEEDED_DEFAULT_BACKEND_ID,\n makeDefaultLocalBackend,\n makeLockedCloudBackend,\n} from \"./default-backend\";\nimport type {\n Backend,\n BackendAuthMode,\n BackendKind,\n BackendSelection,\n} from \"./types\";\n\nexport const BACKENDS_STORAGE_KEY = \"openhands-backends\";\nexport const ACTIVE_BACKEND_STORAGE_KEY = \"openhands-active-backend\";\n\nfunction isValidKind(value: unknown): value is BackendKind {\n return value === \"local\" || value === \"cloud\";\n}\n\nfunction isValidAuthMode(value: unknown): value is BackendAuthMode {\n return value === undefined || value === \"api-key\" || value === \"cookie\";\n}\n\nfunction isValidBackend(value: unknown): value is Backend {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Partial<Backend>;\n return (\n typeof v.id === \"string\" &&\n v.id.length > 0 &&\n typeof v.name === \"string\" &&\n typeof v.host === \"string\" &&\n typeof v.apiKey === \"string\" &&\n isValidKind(v.kind) &&\n isValidAuthMode(v.authMode)\n );\n}\n\nfunction isLoopbackUrl(value: string): boolean {\n try {\n const { hostname } = new URL(value);\n return (\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"::1\" ||\n hostname === \"[::1]\"\n );\n } catch {\n return false;\n }\n}\n\nfunction shouldSyncLauncherDefaultLocalBackend(\n backend: Backend,\n defaultBackend: Backend,\n): boolean {\n if (backend.id !== SEEDED_DEFAULT_BACKEND_ID || backend.kind !== \"local\") {\n return false;\n }\n\n return (\n backend.host === defaultBackend.host ||\n (isLoopbackUrl(backend.host) && isLoopbackUrl(defaultBackend.host))\n );\n}\n\nfunction syncLauncherDefaultLocalBackend(backends: Backend[]): Backend[] {\n const defaultBackend = makeDefaultLocalBackend();\n if (!defaultBackend) return backends;\n\n let didSync = false;\n const syncedBackends = backends.map((backend) => {\n if (!shouldSyncLauncherDefaultLocalBackend(backend, defaultBackend)) {\n return backend;\n }\n\n if (backend.apiKey === defaultBackend.apiKey) return backend;\n\n didSync = true;\n return {\n ...backend,\n apiKey: defaultBackend.apiKey,\n };\n });\n\n if (!didSync) return backends;\n\n writeStoredBackends(syncedBackends);\n return syncedBackends;\n}\n\nexport function writeStoredBackends(backends: Backend[]): void {\n if (typeof window === \"undefined\") return;\n try {\n window.localStorage.setItem(BACKENDS_STORAGE_KEY, JSON.stringify(backends));\n } catch {\n /* ignore quota / serialization errors */\n }\n}\n\nexport function readStoredBackends(): Backend[] {\n if (typeof window === \"undefined\") return [];\n\n try {\n const lockedCloudBackend = makeLockedCloudBackend();\n if (lockedCloudBackend) {\n writeStoredBackends([lockedCloudBackend]);\n const activeSelection = readStoredActiveBackend();\n if (activeSelection?.backendId !== lockedCloudBackend.id) {\n writeStoredActiveBackend({ backendId: lockedCloudBackend.id });\n }\n return [lockedCloudBackend];\n }\n\n const raw = window.localStorage.getItem(BACKENDS_STORAGE_KEY);\n\n // First install: seed only when the launcher supplied enough information\n // for a usable local backend.\n if (raw === null) {\n const defaultBackend = makeDefaultLocalBackend();\n if (!defaultBackend) return [];\n\n writeStoredBackends([defaultBackend]);\n return [defaultBackend];\n }\n\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) return [];\n const valid = parsed.filter(isValidBackend);\n\n // If the stored array is empty (or everything in it failed validation),\n // only re-seed when the launcher supplied both a host and API key.\n if (valid.length === 0) {\n const defaultBackend = makeDefaultLocalBackend();\n if (!defaultBackend) return [];\n\n writeStoredBackends([defaultBackend]);\n return [defaultBackend];\n }\n\n const synced = syncLauncherDefaultLocalBackend(valid);\n return synced;\n } catch {\n return [];\n }\n}\n\nfunction parseBackendSelection(raw: string | null): BackendSelection | null {\n if (!raw) return null;\n\n try {\n const parsed = JSON.parse(raw);\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n typeof (parsed as BackendSelection).backendId !== \"string\"\n ) {\n return null;\n }\n const orgIdRaw = (parsed as BackendSelection).orgId;\n return {\n backendId: (parsed as BackendSelection).backendId,\n orgId:\n typeof orgIdRaw === \"string\" && orgIdRaw.length > 0 ? orgIdRaw : null,\n };\n } catch {\n return null;\n }\n}\n\nfunction readStorageItem(\n storage: Storage | undefined,\n key: string,\n): string | null {\n try {\n return storage?.getItem(key) ?? null;\n } catch {\n return null;\n }\n}\n\nfunction writeStorageItem(\n storage: Storage | undefined,\n key: string,\n value: string,\n): void {\n try {\n storage?.setItem(key, value);\n } catch {\n /* ignore */\n }\n}\n\nfunction removeStorageItem(storage: Storage | undefined, key: string): void {\n try {\n storage?.removeItem(key);\n } catch {\n /* ignore */\n }\n}\n\nexport function readStoredActiveBackend(): BackendSelection | null {\n if (typeof window === \"undefined\") return null;\n\n // Active backend is tab-scoped so reloading tab A does not adopt tab B's\n // backend. localStorage remains a last-used fallback for fresh tabs and old\n // persisted state.\n const sessionSelection = parseBackendSelection(\n readStorageItem(window.sessionStorage, ACTIVE_BACKEND_STORAGE_KEY),\n );\n if (sessionSelection) return sessionSelection;\n\n return parseBackendSelection(\n readStorageItem(window.localStorage, ACTIVE_BACKEND_STORAGE_KEY),\n );\n}\n\nexport function writeStoredActiveBackend(\n selection: BackendSelection | null,\n): void {\n if (typeof window === \"undefined\") return;\n\n if (!selection) {\n removeStorageItem(window.sessionStorage, ACTIVE_BACKEND_STORAGE_KEY);\n removeStorageItem(window.localStorage, ACTIVE_BACKEND_STORAGE_KEY);\n return;\n }\n\n const serialized = JSON.stringify({\n backendId: selection.backendId,\n orgId: selection.orgId ?? null,\n });\n // Mirror to localStorage only as the default for new tabs/backward\n // compatibility; reads in existing tabs prefer sessionStorage.\n writeStorageItem(\n window.sessionStorage,\n ACTIVE_BACKEND_STORAGE_KEY,\n serialized,\n );\n writeStorageItem(window.localStorage, ACTIVE_BACKEND_STORAGE_KEY, serialized);\n}\n"],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
export type BackendKind = "local" | "cloud";
|
|
2
|
+
export type BackendAuthMode = "api-key" | "cookie";
|
|
2
3
|
export interface Backend {
|
|
3
4
|
id: string;
|
|
4
5
|
name: string;
|
|
5
6
|
host: string;
|
|
6
7
|
apiKey: string;
|
|
7
8
|
kind: BackendKind;
|
|
9
|
+
authMode?: BackendAuthMode;
|
|
8
10
|
}
|
|
9
11
|
export interface BackendSelection {
|
|
10
12
|
backendId: string;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require(`../_virtual/_rolldown/runtime.cjs`);var e={name:require(`../constants/canvas-ui.cjs`).CANVAS_UI_CLIENT_TOOL_NAME,description:`The user is interacting with you inside Agent Canvas — a web UI with a chat panel on the left and a tabbed right-side panel (files, terminal, browser, vscode, planner, tasklist). This tool lets you drive that right-side panel so the user sees what you just produced.
|
|
2
|
+
|
|
3
|
+
They will NOT see the files you wrote, the terminal output, or the browser
|
|
4
|
+
unless you call this tool to switch the right-side panel to the relevant
|
|
5
|
+
tab. Call this every time you finish work that produces something the user
|
|
6
|
+
should look at — don't rely on them noticing on their own.
|
|
7
|
+
|
|
8
|
+
When to call (pick the most specific option that matches your last action):
|
|
9
|
+
|
|
10
|
+
* You wrote or modified a single file (ANY language, ANY size — including
|
|
11
|
+
small scripts like a hello-world bash file) →
|
|
12
|
+
command="navigate_to_file", path=<workspace-relative path of that file>
|
|
13
|
+
|
|
14
|
+
* You generated an HTML page, image, SVG, PDF, markdown report, or other
|
|
15
|
+
previewable artifact →
|
|
16
|
+
command="show_preview", path=<that file>
|
|
17
|
+
|
|
18
|
+
* You finished editing multiple files in one logical step →
|
|
19
|
+
command="open_tab", tab="files"
|
|
20
|
+
(The Files tab automatically renders a diff view when the workspace has
|
|
21
|
+
uncommitted git changes, which covers the "highlight changes" case.)
|
|
22
|
+
|
|
23
|
+
* You ran a long-running terminal command, or one whose output the user
|
|
24
|
+
should inspect →
|
|
25
|
+
command="open_tab", tab="terminal"
|
|
26
|
+
|
|
27
|
+
* You browsed to a URL the user should see →
|
|
28
|
+
First call browser_get_state(include_screenshot=true) after your final
|
|
29
|
+
browser interaction so Agent Canvas has a screenshot to display, then call
|
|
30
|
+
command="open_tab", tab="browser"
|
|
31
|
+
(browser_navigate alone only updates the URL; without browser_get_state,
|
|
32
|
+
the Browser tab will open without a screenshot.)
|
|
33
|
+
|
|
34
|
+
Call this BEFORE writing your chat-message summary of the change, so the
|
|
35
|
+
artifact is visible while the user reads what you did. One canvas_ui_control
|
|
36
|
+
call per logical step is enough — don't repeat it for the same file or tab in
|
|
37
|
+
the same turn.`,parameters:{type:`object`,additionalProperties:!1,properties:{command:{type:`string`,enum:[`navigate_to_file`,`open_tab`,`show_preview`],description:`UI command to dispatch.`},path:{type:`string`,description:`Workspace-relative file path. Required for navigate_to_file and show_preview; ignored otherwise.`},tab:{type:`string`,enum:[`files`,`browser`,`vscode`,`terminal`,`planner`,`tasklist`],description:`Tab to open. Required for open_tab; ignored otherwise.`}},required:[`command`]},annotations:{readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1}};exports.CANVAS_UI_CLIENT_TOOL=e;
|
|
38
|
+
//# sourceMappingURL=canvas-ui-client-tool.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-ui-client-tool.cjs","names":[],"sources":["../../src/api/canvas-ui-client-tool.ts"],"sourcesContent":["import { CANVAS_UI_CLIENT_TOOL_NAME } from \"#/constants/canvas-ui\";\n\nexport {\n CANVAS_UI_CLIENT_ACTION_KIND,\n CANVAS_UI_CLIENT_TOOL_NAME,\n LEGACY_CANVAS_UI_TOOL_NAME,\n} from \"#/constants/canvas-ui\";\n\nexport interface ClientToolSpec {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n annotations?: {\n title?: string | null;\n readOnlyHint: boolean;\n destructiveHint: boolean;\n idempotentHint: boolean;\n openWorldHint: boolean;\n };\n}\n\nconst CANVAS_UI_DESCRIPTION = `The user is interacting with you inside Agent Canvas — a web UI with a chat panel on the left and a tabbed right-side panel (files, terminal, browser, vscode, planner, tasklist). This tool lets you drive that right-side panel so the user sees what you just produced.\n\nThey will NOT see the files you wrote, the terminal output, or the browser\nunless you call this tool to switch the right-side panel to the relevant\ntab. Call this every time you finish work that produces something the user\nshould look at — don't rely on them noticing on their own.\n\nWhen to call (pick the most specific option that matches your last action):\n\n* You wrote or modified a single file (ANY language, ANY size — including\n small scripts like a hello-world bash file) →\n command=\"navigate_to_file\", path=<workspace-relative path of that file>\n\n* You generated an HTML page, image, SVG, PDF, markdown report, or other\n previewable artifact →\n command=\"show_preview\", path=<that file>\n\n* You finished editing multiple files in one logical step →\n command=\"open_tab\", tab=\"files\"\n (The Files tab automatically renders a diff view when the workspace has\n uncommitted git changes, which covers the \"highlight changes\" case.)\n\n* You ran a long-running terminal command, or one whose output the user\n should inspect →\n command=\"open_tab\", tab=\"terminal\"\n\n* You browsed to a URL the user should see →\n First call browser_get_state(include_screenshot=true) after your final\n browser interaction so Agent Canvas has a screenshot to display, then call\n command=\"open_tab\", tab=\"browser\"\n (browser_navigate alone only updates the URL; without browser_get_state,\n the Browser tab will open without a screenshot.)\n\nCall this BEFORE writing your chat-message summary of the change, so the\nartifact is visible while the user reads what you did. One canvas_ui_control\ncall per logical step is enough — don't repeat it for the same file or tab in\nthe same turn.`;\n\nexport const CANVAS_UI_CLIENT_TOOL: ClientToolSpec = {\n name: CANVAS_UI_CLIENT_TOOL_NAME,\n description: CANVAS_UI_DESCRIPTION,\n parameters: {\n type: \"object\",\n additionalProperties: false,\n properties: {\n command: {\n type: \"string\",\n enum: [\"navigate_to_file\", \"open_tab\", \"show_preview\"],\n description: \"UI command to dispatch.\",\n },\n path: {\n type: \"string\",\n description:\n \"Workspace-relative file path. Required for navigate_to_file and show_preview; ignored otherwise.\",\n },\n tab: {\n type: \"string\",\n enum: [\"files\", \"browser\", \"vscode\", \"terminal\", \"planner\", \"tasklist\"],\n description: \"Tab to open. Required for open_tab; ignored otherwise.\",\n },\n },\n required: [\"command\"],\n },\n annotations: {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n};\n"],"mappings":"6CA2DA,IAAa,EAAwC,CACnD,0CAAM,CAAA,2BACN,YAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBACb,WAAY,CACV,KAAM,SACN,qBAAsB,GACtB,WAAY,CACV,QAAS,CACP,KAAM,SACN,KAAM,CAAC,mBAAoB,WAAY,eAAe,CACtD,YAAa,0BACd,CACD,KAAM,CACJ,KAAM,SACN,YACE,mGACH,CACD,IAAK,CACH,KAAM,SACN,KAAM,CAAC,QAAS,UAAW,SAAU,WAAY,UAAW,WAAW,CACvE,YAAa,yDACd,CACF,CACD,SAAU,CAAC,UAAU,CACtB,CACD,YAAa,CACX,aAAc,GACd,gBAAiB,GACjB,eAAgB,GAChB,cAAe,GAChB,CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { CANVAS_UI_CLIENT_ACTION_KIND, CANVAS_UI_CLIENT_TOOL_NAME, LEGACY_CANVAS_UI_TOOL_NAME, } from "#/constants/canvas-ui";
|
|
2
|
+
export interface ClientToolSpec {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
parameters: Record<string, unknown>;
|
|
6
|
+
annotations?: {
|
|
7
|
+
title?: string | null;
|
|
8
|
+
readOnlyHint: boolean;
|
|
9
|
+
destructiveHint: boolean;
|
|
10
|
+
idempotentHint: boolean;
|
|
11
|
+
openWorldHint: boolean;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export declare const CANVAS_UI_CLIENT_TOOL: ClientToolSpec;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { CANVAS_UI_CLIENT_TOOL_NAME as e } from "../constants/canvas-ui.js";
|
|
2
|
+
var t = {
|
|
3
|
+
name: e,
|
|
4
|
+
description: "The user is interacting with you inside Agent Canvas — a web UI with a chat panel on the left and a tabbed right-side panel (files, terminal, browser, vscode, planner, tasklist). This tool lets you drive that right-side panel so the user sees what you just produced.\n\nThey will NOT see the files you wrote, the terminal output, or the browser\nunless you call this tool to switch the right-side panel to the relevant\ntab. Call this every time you finish work that produces something the user\nshould look at — don't rely on them noticing on their own.\n\nWhen to call (pick the most specific option that matches your last action):\n\n* You wrote or modified a single file (ANY language, ANY size — including\n small scripts like a hello-world bash file) →\n command=\"navigate_to_file\", path=<workspace-relative path of that file>\n\n* You generated an HTML page, image, SVG, PDF, markdown report, or other\n previewable artifact →\n command=\"show_preview\", path=<that file>\n\n* You finished editing multiple files in one logical step →\n command=\"open_tab\", tab=\"files\"\n (The Files tab automatically renders a diff view when the workspace has\n uncommitted git changes, which covers the \"highlight changes\" case.)\n\n* You ran a long-running terminal command, or one whose output the user\n should inspect →\n command=\"open_tab\", tab=\"terminal\"\n\n* You browsed to a URL the user should see →\n First call browser_get_state(include_screenshot=true) after your final\n browser interaction so Agent Canvas has a screenshot to display, then call\n command=\"open_tab\", tab=\"browser\"\n (browser_navigate alone only updates the URL; without browser_get_state,\n the Browser tab will open without a screenshot.)\n\nCall this BEFORE writing your chat-message summary of the change, so the\nartifact is visible while the user reads what you did. One canvas_ui_control\ncall per logical step is enough — don't repeat it for the same file or tab in\nthe same turn.",
|
|
5
|
+
parameters: {
|
|
6
|
+
type: "object",
|
|
7
|
+
additionalProperties: !1,
|
|
8
|
+
properties: {
|
|
9
|
+
command: {
|
|
10
|
+
type: "string",
|
|
11
|
+
enum: [
|
|
12
|
+
"navigate_to_file",
|
|
13
|
+
"open_tab",
|
|
14
|
+
"show_preview"
|
|
15
|
+
],
|
|
16
|
+
description: "UI command to dispatch."
|
|
17
|
+
},
|
|
18
|
+
path: {
|
|
19
|
+
type: "string",
|
|
20
|
+
description: "Workspace-relative file path. Required for navigate_to_file and show_preview; ignored otherwise."
|
|
21
|
+
},
|
|
22
|
+
tab: {
|
|
23
|
+
type: "string",
|
|
24
|
+
enum: [
|
|
25
|
+
"files",
|
|
26
|
+
"browser",
|
|
27
|
+
"vscode",
|
|
28
|
+
"terminal",
|
|
29
|
+
"planner",
|
|
30
|
+
"tasklist"
|
|
31
|
+
],
|
|
32
|
+
description: "Tab to open. Required for open_tab; ignored otherwise."
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
required: ["command"]
|
|
36
|
+
},
|
|
37
|
+
annotations: {
|
|
38
|
+
readOnlyHint: !0,
|
|
39
|
+
destructiveHint: !1,
|
|
40
|
+
idempotentHint: !0,
|
|
41
|
+
openWorldHint: !1
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
//#endregion
|
|
45
|
+
export { t as CANVAS_UI_CLIENT_TOOL };
|
|
46
|
+
|
|
47
|
+
//# sourceMappingURL=canvas-ui-client-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-ui-client-tool.js","names":[],"sources":["../../src/api/canvas-ui-client-tool.ts"],"sourcesContent":["import { CANVAS_UI_CLIENT_TOOL_NAME } from \"#/constants/canvas-ui\";\n\nexport {\n CANVAS_UI_CLIENT_ACTION_KIND,\n CANVAS_UI_CLIENT_TOOL_NAME,\n LEGACY_CANVAS_UI_TOOL_NAME,\n} from \"#/constants/canvas-ui\";\n\nexport interface ClientToolSpec {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n annotations?: {\n title?: string | null;\n readOnlyHint: boolean;\n destructiveHint: boolean;\n idempotentHint: boolean;\n openWorldHint: boolean;\n };\n}\n\nconst CANVAS_UI_DESCRIPTION = `The user is interacting with you inside Agent Canvas — a web UI with a chat panel on the left and a tabbed right-side panel (files, terminal, browser, vscode, planner, tasklist). This tool lets you drive that right-side panel so the user sees what you just produced.\n\nThey will NOT see the files you wrote, the terminal output, or the browser\nunless you call this tool to switch the right-side panel to the relevant\ntab. Call this every time you finish work that produces something the user\nshould look at — don't rely on them noticing on their own.\n\nWhen to call (pick the most specific option that matches your last action):\n\n* You wrote or modified a single file (ANY language, ANY size — including\n small scripts like a hello-world bash file) →\n command=\"navigate_to_file\", path=<workspace-relative path of that file>\n\n* You generated an HTML page, image, SVG, PDF, markdown report, or other\n previewable artifact →\n command=\"show_preview\", path=<that file>\n\n* You finished editing multiple files in one logical step →\n command=\"open_tab\", tab=\"files\"\n (The Files tab automatically renders a diff view when the workspace has\n uncommitted git changes, which covers the \"highlight changes\" case.)\n\n* You ran a long-running terminal command, or one whose output the user\n should inspect →\n command=\"open_tab\", tab=\"terminal\"\n\n* You browsed to a URL the user should see →\n First call browser_get_state(include_screenshot=true) after your final\n browser interaction so Agent Canvas has a screenshot to display, then call\n command=\"open_tab\", tab=\"browser\"\n (browser_navigate alone only updates the URL; without browser_get_state,\n the Browser tab will open without a screenshot.)\n\nCall this BEFORE writing your chat-message summary of the change, so the\nartifact is visible while the user reads what you did. One canvas_ui_control\ncall per logical step is enough — don't repeat it for the same file or tab in\nthe same turn.`;\n\nexport const CANVAS_UI_CLIENT_TOOL: ClientToolSpec = {\n name: CANVAS_UI_CLIENT_TOOL_NAME,\n description: CANVAS_UI_DESCRIPTION,\n parameters: {\n type: \"object\",\n additionalProperties: false,\n properties: {\n command: {\n type: \"string\",\n enum: [\"navigate_to_file\", \"open_tab\", \"show_preview\"],\n description: \"UI command to dispatch.\",\n },\n path: {\n type: \"string\",\n description:\n \"Workspace-relative file path. Required for navigate_to_file and show_preview; ignored otherwise.\",\n },\n tab: {\n type: \"string\",\n enum: [\"files\", \"browser\", \"vscode\", \"terminal\", \"planner\", \"tasklist\"],\n description: \"Tab to open. Required for open_tab; ignored otherwise.\",\n },\n },\n required: [\"command\"],\n },\n annotations: {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n};\n"],"mappings":";AA2DA,IAAa,IAAwC;CACnD,MAAM;CACN,aAAa;CACb,YAAY;EACV,MAAM;EACN,sBAAsB;EACtB,YAAY;GACV,SAAS;IACP,MAAM;IACN,MAAM;KAAC;KAAoB;KAAY;KAAe;IACtD,aAAa;IACd;GACD,MAAM;IACJ,MAAM;IACN,aACE;IACH;GACD,KAAK;IACH,MAAM;IACN,MAAM;KAAC;KAAS;KAAW;KAAU;KAAY;KAAW;KAAW;IACvE,aAAa;IACd;GACF;EACD,UAAU,CAAC,UAAU;EACtB;CACD,aAAa;EACX,cAAc;EACd,iBAAiB;EACjB,gBAAgB;EAChB,eAAe;EAChB;CACF"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../package.cjs`);var t=`agent_canvas`,n=e.default.version,r={"X-OpenHands-Client":t,"X-OpenHands-Client-Version":n};exports.AGENT_CANVAS_CLIENT_HEADERS=r,exports.AGENT_CANVAS_CLIENT_SOURCE=t,exports.AGENT_CANVAS_CLIENT_VERSION=n;
|
|
2
|
+
//# sourceMappingURL=client-source.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-source.cjs","names":[],"sources":["../../src/api/client-source.ts"],"sourcesContent":["import packageJson from \"../../package.json\";\n\nexport const AGENT_CANVAS_CLIENT_SOURCE = \"agent_canvas\";\nexport const AGENT_CANVAS_CLIENT_VERSION = packageJson.version;\n\n/**\n * Coarse, non-user-identifying request metadata for Cloud observability.\n *\n * Cloud ingress can retain these headers as facets without logging request\n * bodies, API keys, device codes, or conversation content.\n */\nexport const AGENT_CANVAS_CLIENT_HEADERS: Readonly<Record<string, string>> = {\n \"X-OpenHands-Client\": AGENT_CANVAS_CLIENT_SOURCE,\n \"X-OpenHands-Client-Version\": AGENT_CANVAS_CLIENT_VERSION,\n};\n"],"mappings":"+EAEA,IAAa,EAA6B,eAC7B,EAA8B,EAAA,QAAY,QAQ1C,EAAgE,CAC3E,qBAAsB,EACtB,6BAA8B,EAC/B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const AGENT_CANVAS_CLIENT_SOURCE = "agent_canvas";
|
|
2
|
+
export declare const AGENT_CANVAS_CLIENT_VERSION: string;
|
|
3
|
+
/**
|
|
4
|
+
* Coarse, non-user-identifying request metadata for Cloud observability.
|
|
5
|
+
*
|
|
6
|
+
* Cloud ingress can retain these headers as facets without logging request
|
|
7
|
+
* bodies, API keys, device codes, or conversation content.
|
|
8
|
+
*/
|
|
9
|
+
export declare const AGENT_CANVAS_CLIENT_HEADERS: Readonly<Record<string, string>>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import e from "../package.js";
|
|
2
|
+
//#region src/api/client-source.ts
|
|
3
|
+
var t = "agent_canvas", n = e.version, r = {
|
|
4
|
+
"X-OpenHands-Client": t,
|
|
5
|
+
"X-OpenHands-Client-Version": n
|
|
6
|
+
};
|
|
7
|
+
//#endregion
|
|
8
|
+
export { r as AGENT_CANVAS_CLIENT_HEADERS, t as AGENT_CANVAS_CLIENT_SOURCE, n as AGENT_CANVAS_CLIENT_VERSION };
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=client-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-source.js","names":[],"sources":["../../src/api/client-source.ts"],"sourcesContent":["import packageJson from \"../../package.json\";\n\nexport const AGENT_CANVAS_CLIENT_SOURCE = \"agent_canvas\";\nexport const AGENT_CANVAS_CLIENT_VERSION = packageJson.version;\n\n/**\n * Coarse, non-user-identifying request metadata for Cloud observability.\n *\n * Cloud ingress can retain these headers as facets without logging request\n * bodies, API keys, device codes, or conversation content.\n */\nexport const AGENT_CANVAS_CLIENT_HEADERS: Readonly<Record<string, string>> = {\n \"X-OpenHands-Client\": AGENT_CANVAS_CLIENT_SOURCE,\n \"X-OpenHands-Client-Version\": AGENT_CANVAS_CLIENT_VERSION,\n};\n"],"mappings":";;AAEA,IAAa,IAA6B,gBAC7B,IAA8B,EAAY,SAQ1C,IAAgE;CAC3E,sBAAsB;CACtB,8BAA8B;CAC/B"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../node_modules/@openhands/typescript-client/dist/client/cloud-client.cjs`);require(`../../node_modules/@openhands/typescript-client/dist/clients.cjs`);const t=require(`../agent-server-config.cjs`),n=require(`../backend-registry/active-store.cjs`),r=require(`../agent-server-client-options.cjs`);function i(e){if(e)return e;let t=n.getActiveBackend().backend;if(t.kind!==`cloud`)throw Error(`Cloud calls require a cloud backend.`);return t}function a(e){let t=n.getActiveBackend();return t.backend.id===e.id?t.orgId:null}function o(n){let r=i(n),o=t.getAgentServerBaseUrl(),s=o?t.getAgentServerHeaders():{};return new e.CloudClient({host:r.host,apiKey:r.apiKey,orgId:a(r),timeout:3e4,...o?{proxy:{host:o,headers:s}}:{}})}function s(e){let t=o(e);if(!t.proxy)throw new r.NoBackendAvailableError;return t}exports.createCloudClient=o,exports.createCloudClientForRuntime=s;
|
|
2
|
+
//# sourceMappingURL=client.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.cjs","names":[],"sources":["../../../src/api/cloud/client.ts"],"sourcesContent":["import { CloudClient } from \"@openhands/typescript-client/clients\";\nimport {\n getAgentServerBaseUrl,\n getAgentServerHeaders,\n} from \"../agent-server-config\";\nimport { NoBackendAvailableError } from \"../agent-server-client-options\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\n\nfunction requireCloudBackend(backend?: Backend): Backend {\n if (backend) return backend;\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\"Cloud calls require a cloud backend.\");\n }\n return active;\n}\n\n/**\n * Send `X-Org-Id` so the upstream scopes per-request to the org the user\n * selected locally, instead of the user's globally-shared `current_org_id`\n * on the cloud backend. Restricted to calls against the active backend: the\n * selector also fans out per-backend bookkeeping calls (e.g.\n * `getCloudOrganizations(b)`) that would otherwise carry the active\n * backend's orgId across an unrelated API key, which the cloud backend\n * rejects when api_key_org_id and X-Org-Id disagree.\n */\nfunction activeOrgForBackend(backend: Backend): string | null {\n const active = getActiveBackend();\n return active.backend.id === backend.id ? active.orgId : null;\n}\n\nexport function createCloudClient(backend?: Backend): CloudClient {\n const target = requireCloudBackend(backend);\n const proxyBaseUrl = getAgentServerBaseUrl();\n const proxyHeaders = proxyBaseUrl ? getAgentServerHeaders() : {};\n\n return new CloudClient({\n host: target.host,\n apiKey: target.apiKey,\n orgId: activeOrgForBackend(target),\n // Default request timeout in ms, matching the 30s the previous axios\n // transport used for direct and proxied calls. Per-request\n // `timeoutSeconds` still overrides it for direct calls.\n timeout: 30_000,\n ...(proxyBaseUrl\n ? {\n proxy: {\n host: proxyBaseUrl,\n headers: proxyHeaders,\n },\n }\n : {}),\n });\n}\n\nexport function createCloudClientForRuntime(backend?: Backend): CloudClient {\n const client = createCloudClient(backend);\n if (!client.proxy) {\n throw new NoBackendAvailableError();\n }\n return client;\n}\n"],"mappings":"4WASA,SAAS,EAAoB,EAA4B,CACvD,GAAI,EAAS,OAAO,EACpB,IAAM,EAAS,EAAA,kBAAkB,CAAC,QAClC,GAAI,EAAO,OAAS,QAClB,MAAU,MAAM,uCAAuC,CAEzD,OAAO,EAYT,SAAS,EAAoB,EAAiC,CAC5D,IAAM,EAAS,EAAA,kBAAkB,CACjC,OAAO,EAAO,QAAQ,KAAO,EAAQ,GAAK,EAAO,MAAQ,KAG3D,SAAgB,EAAkB,EAAgC,CAChE,IAAM,EAAS,EAAoB,EAAQ,CACrC,EAAe,EAAA,uBAAuB,CACtC,EAAe,EAAe,EAAA,uBAAuB,CAAG,EAAE,CAEhE,OAAO,IAAI,EAAA,YAAY,CACrB,KAAM,EAAO,KACb,OAAQ,EAAO,OACf,MAAO,EAAoB,EAAO,CAIlC,QAAS,IACT,GAAI,EACA,CACE,MAAO,CACL,KAAM,EACN,QAAS,EACV,CACF,CACD,EAAE,CACP,CAAC,CAGJ,SAAgB,EAA4B,EAAgC,CAC1E,IAAM,EAAS,EAAkB,EAAQ,CACzC,GAAI,CAAC,EAAO,MACV,MAAM,IAAI,EAAA,wBAEZ,OAAO"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { CloudClient } from "@openhands/typescript-client/clients";
|
|
2
|
+
import type { Backend } from "../backend-registry/types";
|
|
3
|
+
export declare function createCloudClient(backend?: Backend): CloudClient;
|
|
4
|
+
export declare function createCloudClientForRuntime(backend?: Backend): CloudClient;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { CloudClient as e } from "../../node_modules/@openhands/typescript-client/dist/client/cloud-client.js";
|
|
2
|
+
import "../../node_modules/@openhands/typescript-client/dist/clients.js";
|
|
3
|
+
import { getAgentServerBaseUrl as t, getAgentServerHeaders as n } from "../agent-server-config.js";
|
|
4
|
+
import { getActiveBackend as r } from "../backend-registry/active-store.js";
|
|
5
|
+
import { NoBackendAvailableError as i } from "../agent-server-client-options.js";
|
|
6
|
+
//#region src/api/cloud/client.ts
|
|
7
|
+
function a(e) {
|
|
8
|
+
if (e) return e;
|
|
9
|
+
let t = r().backend;
|
|
10
|
+
if (t.kind !== "cloud") throw Error("Cloud calls require a cloud backend.");
|
|
11
|
+
return t;
|
|
12
|
+
}
|
|
13
|
+
function o(e) {
|
|
14
|
+
let t = r();
|
|
15
|
+
return t.backend.id === e.id ? t.orgId : null;
|
|
16
|
+
}
|
|
17
|
+
function s(r) {
|
|
18
|
+
let i = a(r), s = t(), c = s ? n() : {};
|
|
19
|
+
return new e({
|
|
20
|
+
host: i.host,
|
|
21
|
+
apiKey: i.apiKey,
|
|
22
|
+
orgId: o(i),
|
|
23
|
+
timeout: 3e4,
|
|
24
|
+
...s ? { proxy: {
|
|
25
|
+
host: s,
|
|
26
|
+
headers: c
|
|
27
|
+
} } : {}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function c(e) {
|
|
31
|
+
let t = s(e);
|
|
32
|
+
if (!t.proxy) throw new i();
|
|
33
|
+
return t;
|
|
34
|
+
}
|
|
35
|
+
//#endregion
|
|
36
|
+
export { s as createCloudClient, c as createCloudClientForRuntime };
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","names":[],"sources":["../../../src/api/cloud/client.ts"],"sourcesContent":["import { CloudClient } from \"@openhands/typescript-client/clients\";\nimport {\n getAgentServerBaseUrl,\n getAgentServerHeaders,\n} from \"../agent-server-config\";\nimport { NoBackendAvailableError } from \"../agent-server-client-options\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\n\nfunction requireCloudBackend(backend?: Backend): Backend {\n if (backend) return backend;\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\"Cloud calls require a cloud backend.\");\n }\n return active;\n}\n\n/**\n * Send `X-Org-Id` so the upstream scopes per-request to the org the user\n * selected locally, instead of the user's globally-shared `current_org_id`\n * on the cloud backend. Restricted to calls against the active backend: the\n * selector also fans out per-backend bookkeeping calls (e.g.\n * `getCloudOrganizations(b)`) that would otherwise carry the active\n * backend's orgId across an unrelated API key, which the cloud backend\n * rejects when api_key_org_id and X-Org-Id disagree.\n */\nfunction activeOrgForBackend(backend: Backend): string | null {\n const active = getActiveBackend();\n return active.backend.id === backend.id ? active.orgId : null;\n}\n\nexport function createCloudClient(backend?: Backend): CloudClient {\n const target = requireCloudBackend(backend);\n const proxyBaseUrl = getAgentServerBaseUrl();\n const proxyHeaders = proxyBaseUrl ? getAgentServerHeaders() : {};\n\n return new CloudClient({\n host: target.host,\n apiKey: target.apiKey,\n orgId: activeOrgForBackend(target),\n // Default request timeout in ms, matching the 30s the previous axios\n // transport used for direct and proxied calls. Per-request\n // `timeoutSeconds` still overrides it for direct calls.\n timeout: 30_000,\n ...(proxyBaseUrl\n ? {\n proxy: {\n host: proxyBaseUrl,\n headers: proxyHeaders,\n },\n }\n : {}),\n });\n}\n\nexport function createCloudClientForRuntime(backend?: Backend): CloudClient {\n const client = createCloudClient(backend);\n if (!client.proxy) {\n throw new NoBackendAvailableError();\n }\n return client;\n}\n"],"mappings":";;;;;;AASA,SAAS,EAAoB,GAA4B;AACvD,KAAI,EAAS,QAAO;CACpB,IAAM,IAAS,GAAkB,CAAC;AAClC,KAAI,EAAO,SAAS,QAClB,OAAU,MAAM,uCAAuC;AAEzD,QAAO;;AAYT,SAAS,EAAoB,GAAiC;CAC5D,IAAM,IAAS,GAAkB;AACjC,QAAO,EAAO,QAAQ,OAAO,EAAQ,KAAK,EAAO,QAAQ;;AAG3D,SAAgB,EAAkB,GAAgC;CAChE,IAAM,IAAS,EAAoB,EAAQ,EACrC,IAAe,GAAuB,EACtC,IAAe,IAAe,GAAuB,GAAG,EAAE;AAEhE,QAAO,IAAI,EAAY;EACrB,MAAM,EAAO;EACb,QAAQ,EAAO;EACf,OAAO,EAAoB,EAAO;EAIlC,SAAS;EACT,GAAI,IACA,EACE,OAAO;GACL,MAAM;GACN,SAAS;GACV,EACF,GACD,EAAE;EACP,CAAC;;AAGJ,SAAgB,EAA4B,GAAgC;CAC1E,IAAM,IAAS,EAAkB,EAAQ;AACzC,KAAI,CAAC,EAAO,MACV,OAAM,IAAI,GAAyB;AAErC,QAAO"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../backend-registry/active-store.cjs`),t=require(`./proxy.cjs`),n=require(`../conversation-metadata-store.cjs`);function
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../backend-registry/active-store.cjs`),t=require(`./proxy.cjs`),n=require(`../client-source.cjs`),r=require(`../conversation-metadata-store.cjs`);function i(e){if(!e?.id)return e;let t=r.getStoredConversationMetadata(e.id);return t?{...e,selected_repository:e.selected_repository??t.selected_repository??null,selected_branch:e.selected_branch??t.selected_branch??null,git_provider:e.git_provider??t.git_provider??null,selected_workspace:e.selected_workspace??t.selected_workspace??null}:e}function a(){let t=e.getActiveBackend().backend;if(t.kind!==`cloud`)throw Error(`Cloud conversations call requires a cloud backend.`);return t}async function o(e=20,n){let r=a(),o=new URLSearchParams;o.set(`limit`,String(e)),n&&o.set(`page_id`,n),o.set(`sort_order`,`UPDATED_AT_DESC`);let s=await t.callCloudProxy({backend:r,method:`GET`,path:`/api/v1/app-conversations/search?${o.toString()}`});return{items:(s?.items??[]).map(e=>i(e)),next_page_id:s?.next_page_id??null}}async function s(e){if(e.length===0)return[];let n=a(),r=new URLSearchParams;for(let t of e)r.append(`ids`,t);return(await t.callCloudProxy({backend:n,method:`GET`,path:`/api/v1/app-conversations?${r.toString()}`})??[]).map(i)}async function c(e){return await t.callCloudProxy({backend:a(),method:`POST`,path:`/api/v1/app-conversations`,body:e,headers:n.AGENT_CANVAS_CLIENT_HEADERS})}async function l(e){return t.callCloudProxy({backend:a(),method:`GET`,path:`/api/v1/app-conversations/${e}/download`,responseType:`blob`})}async function u(e){await t.callCloudProxy({backend:a(),method:`DELETE`,path:`/api/v1/app-conversations/${e}`})}async function d(e,n){return await t.callCloudProxy({backend:a(),method:`PATCH`,path:`/api/v1/app-conversations/${e}`,body:{public:n}})}async function f(e){await t.callCloudProxy({backend:a(),method:`POST`,path:`/api/v1/sandboxes/${e}/pause`})}async function p(e){await t.callCloudProxy({backend:a(),method:`POST`,path:`/api/v1/sandboxes/${e}/resume`})}async function m(e,n){let r=a(),i=new URLSearchParams;return i.append(`file_path`,n),await t.callCloudProxy({backend:r,method:`GET`,path:`/api/v1/app-conversations/${e}/file?${i.toString()}`})??``}async function h(e){let n=a(),r=new URLSearchParams;return r.set(`ids`,e),(await t.callCloudProxy({backend:n,method:`GET`,path:`/api/v1/app-conversations/start-tasks?${r.toString()}`}))?.[0]??null}exports.batchGetCloudConversations=s,exports.createCloudAppConversation=c,exports.deleteCloudConversation=u,exports.downloadCloudConversation=l,exports.getCloudAppConversationStartTask=h,exports.pauseCloudSandbox=f,exports.readCloudConversationFile=m,exports.resumeCloudSandbox=p,exports.searchCloudConversations=o,exports.updateCloudConversationPublicFlag=d;
|
|
2
2
|
//# sourceMappingURL=conversation-service.api.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-service.api.cjs","names":[],"sources":["../../../src/api/cloud/conversation-service.api.ts"],"sourcesContent":["import { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { getStoredConversationMetadata } from \"../conversation-metadata-store\";\nimport type {\n AppConversation,\n AppConversationPage,\n AppConversationStartRequest,\n AppConversationStartTask,\n} from \"../conversation-service/agent-server-conversation-service.types\";\nimport { callCloudProxy } from \"./proxy\";\n\n/**\n * The cloud backend does not always echo `selected_repository` /\n * `selected_branch` / `git_provider` back from\n * `GET /api/v1/app-conversations` until its own background hydration\n * completes. We persist the selection to local storage at connect time\n * (see `AgentServerConversationService.updateConversationRepository`)\n * and overlay it here so the chat-page git control bar reflects the\n * connection immediately, instead of snapping back to the empty\n * \"Connect Repo\" state on every refetch.\n *\n * Server values take precedence whenever they're populated; the\n * local-storage fallback only fills in fields the server returned as\n * `null`/`undefined`.\n */\nfunction overlayStoredRepoSelection(\n conversation: AppConversation | null,\n): AppConversation | null {\n if (!conversation?.id) return conversation;\n const stored = getStoredConversationMetadata(conversation.id);\n if (!stored) return conversation;\n\n return {\n ...conversation,\n selected_repository:\n conversation.selected_repository ?? stored.selected_repository ?? null,\n selected_branch:\n conversation.selected_branch ?? stored.selected_branch ?? null,\n git_provider: conversation.git_provider ?? stored.git_provider ?? null,\n selected_workspace:\n conversation.selected_workspace ?? stored.selected_workspace ?? null,\n };\n}\n\nfunction getActiveCloudBackend(): Backend {\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\"Cloud conversations call requires a cloud backend.\");\n }\n return active;\n}\n\n/**\n * Search the cloud app-conversations list. Mirrors the local\n * `AgentServerConversationService.searchConversations` interface but calls\n * the cloud endpoint `/api/v1/app-conversations/search`.\n */\nexport async function searchCloudConversations(\n limit: number = 20,\n pageId?: string,\n): Promise<AppConversationPage> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"limit\", String(limit));\n if (pageId) params.set(\"page_id\", pageId);\n params.set(\"sort_order\", \"UPDATED_AT_DESC\");\n\n const data = await callCloudProxy<{\n items: AppConversation[];\n next_page_id: string | null;\n }>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/search?${params.toString()}`,\n });\n\n return {\n items: (data?.items ?? []).map(\n (item) => overlayStoredRepoSelection(item) as AppConversation,\n ),\n next_page_id: data?.next_page_id ?? null,\n };\n}\n\n/**\n * Batch-fetch cloud app-conversations by id. Mirrors the local\n * `AgentServerConversationService.batchGetAppConversations` interface.\n */\nexport async function batchGetCloudConversations(\n ids: string[],\n): Promise<(AppConversation | null)[]> {\n if (ids.length === 0) return [];\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n for (const id of ids) params.append(\"ids\", id);\n const data = await callCloudProxy<(AppConversation | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations?${params.toString()}`,\n });\n return (data ?? []).map(overlayStoredRepoSelection);\n}\n\n/**\n * Create a v1 app-conversation on the cloud backend.\n *\n * Mirrors OpenHands' cloud flow: POST /api/v1/app-conversations with the\n * `AppConversationStartRequest` payload, returning a\n * `AppConversationStartTask`. The task is initially WORKING; the caller\n * polls `getCloudAppConversationStartTask` (3s cadence per OpenHands)\n * until status is READY (then `app_conversation_id`, `agent_server_url`,\n * and `session_api_key` are populated) or ERROR.\n *\n * This path does NOT use encrypted-settings round-tripping. Secrets stay\n * server-side on the cloud backend — the only auth carried is the cloud bearer\n * token, and the conversation runtime is\n * provisioned with its own ephemeral session_api_key returned in the\n * task.\n */\nexport async function createCloudAppConversation(\n request: AppConversationStartRequest,\n): Promise<AppConversationStartTask> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversationStartTask>({\n backend,\n method: \"POST\",\n path: \"/api/v1/app-conversations\",\n body: request as unknown as Record<string, unknown>,\n });\n return data;\n}\n\n/**\n * Download a v1 app-conversation as a ZIP from the cloud backend. Mirrors\n * the local `AgentServerConversationService.downloadConversation` interface but\n * calls\n * `GET /api/v1/app-conversations/{id}/download`, which returns\n * `application/zip` with `Content-Disposition` set by the cloud backend.\n */\nexport async function downloadCloudConversation(\n conversationId: string,\n): Promise<Blob> {\n const backend = getActiveCloudBackend();\n return callCloudProxy<Blob>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/download`,\n responseType: \"blob\",\n });\n}\n\n/**\n * Delete a v1 app-conversation on the cloud backend. Mirrors the local\n * `AgentServerConversationService.deleteConversation` interface but calls\n * `DELETE /api/v1/app-conversations/{id}`, which returns a JSON\n * `Success` envelope (discarded here — the caller only needs to know\n * the request didn't error).\n */\nexport async function deleteCloudConversation(\n conversationId: string,\n): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"DELETE\",\n path: `/api/v1/app-conversations/${conversationId}`,\n });\n}\n\n/**\n * Toggle the public-sharing flag on a cloud v1 app-conversation. Mirrors\n * OpenHands' `AgentServerConversationService.updateConversationPublicFlag`:\n * `PATCH /api/v1/app-conversations/{id}` with `{ public }`, returning\n * the updated conversation.\n */\nexport async function updateCloudConversationPublicFlag(\n conversationId: string,\n isPublic: boolean,\n): Promise<AppConversation> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversation>({\n backend,\n method: \"PATCH\",\n path: `/api/v1/app-conversations/${conversationId}`,\n body: { public: isPublic },\n });\n return data;\n}\n\n/**\n * Pause the cloud sandbox backing a v1 app-conversation. Mirrors\n * OpenHands' `SandboxService.pauseSandbox`:\n * `POST /api/v1/sandboxes/{sandboxId}/pause` on the cloud backend, which stops\n * the runtime owning the conversation.\n */\nexport async function pauseCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/pause`,\n });\n}\n\n/**\n * Resume a paused cloud sandbox. Mirrors OpenHands' `SandboxService.resumeSandbox`\n * by calling `POST /api/v1/sandboxes/{sandboxId}/resume` on the SaaS.\n *\n * This is the correct endpoint for waking a PAUSED sandbox. It is a\n * lightweight unpause — NOT the same as creating a new start task via\n * `POST /api/v1/app-conversations`, which provisions a fresh conversation\n * and is subject to the 120-second sandbox-start timeout.\n */\nexport async function resumeCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/resume`,\n });\n}\n\n/**\n * Read a file from a cloud conversation's sandbox workspace. Mirrors\n * OpenHands' `AgentServerConversationService.readConversationFile` — hits\n * `GET /api/v1/app-conversations/{id}/file?file_path=...` on the cloud backend\n * and returns the file content as a string.\n */\nexport async function readCloudConversationFile(\n conversationId: string,\n filePath: string,\n): Promise<string> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.append(\"file_path\", filePath);\n const data = await callCloudProxy<string>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/file?${params.toString()}`,\n });\n return data ?? \"\";\n}\n\n/**\n * Fetch a single v1 app-conversation start task. Mirrors OpenHands'\n * `AgentServerConversationService.getStartTask` — uses the batch search endpoint\n * with a single id and unwraps the first result.\n */\nexport async function getCloudAppConversationStartTask(\n taskId: string,\n): Promise<AppConversationStartTask | null> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"ids\", taskId);\n const data = await callCloudProxy<(AppConversationStartTask | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/start-tasks?${params.toString()}`,\n });\n return data?.[0] ?? null;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conversation-service.api.cjs","names":[],"sources":["../../../src/api/cloud/conversation-service.api.ts"],"sourcesContent":["import { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { getStoredConversationMetadata } from \"../conversation-metadata-store\";\nimport type {\n AppConversation,\n AppConversationPage,\n AppConversationStartRequest,\n AppConversationStartTask,\n} from \"../conversation-service/agent-server-conversation-service.types\";\nimport { AGENT_CANVAS_CLIENT_HEADERS } from \"../client-source\";\nimport { callCloudProxy } from \"./proxy\";\n\n/**\n * The cloud backend does not always echo `selected_repository` /\n * `selected_branch` / `git_provider` back from\n * `GET /api/v1/app-conversations` until its own background hydration\n * completes. We persist the selection to local storage at connect time\n * (see `AgentServerConversationService.updateConversationRepository`)\n * and overlay it here so the chat-page git control bar reflects the\n * connection immediately, instead of snapping back to the empty\n * \"Connect Repo\" state on every refetch.\n *\n * Server values take precedence whenever they're populated; the\n * local-storage fallback only fills in fields the server returned as\n * `null`/`undefined`.\n */\nfunction overlayStoredRepoSelection(\n conversation: AppConversation | null,\n): AppConversation | null {\n if (!conversation?.id) return conversation;\n const stored = getStoredConversationMetadata(conversation.id);\n if (!stored) return conversation;\n\n return {\n ...conversation,\n selected_repository:\n conversation.selected_repository ?? stored.selected_repository ?? null,\n selected_branch:\n conversation.selected_branch ?? stored.selected_branch ?? null,\n git_provider: conversation.git_provider ?? stored.git_provider ?? null,\n selected_workspace:\n conversation.selected_workspace ?? stored.selected_workspace ?? null,\n };\n}\n\nfunction getActiveCloudBackend(): Backend {\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\"Cloud conversations call requires a cloud backend.\");\n }\n return active;\n}\n\n/**\n * Search the cloud app-conversations list. Mirrors the local\n * `AgentServerConversationService.searchConversations` interface but calls\n * the cloud endpoint `/api/v1/app-conversations/search`.\n */\nexport async function searchCloudConversations(\n limit: number = 20,\n pageId?: string,\n): Promise<AppConversationPage> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"limit\", String(limit));\n if (pageId) params.set(\"page_id\", pageId);\n params.set(\"sort_order\", \"UPDATED_AT_DESC\");\n\n const data = await callCloudProxy<{\n items: AppConversation[];\n next_page_id: string | null;\n }>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/search?${params.toString()}`,\n });\n\n return {\n items: (data?.items ?? []).map(\n (item) => overlayStoredRepoSelection(item) as AppConversation,\n ),\n next_page_id: data?.next_page_id ?? null,\n };\n}\n\n/**\n * Batch-fetch cloud app-conversations by id. Mirrors the local\n * `AgentServerConversationService.batchGetAppConversations` interface.\n */\nexport async function batchGetCloudConversations(\n ids: string[],\n): Promise<(AppConversation | null)[]> {\n if (ids.length === 0) return [];\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n for (const id of ids) params.append(\"ids\", id);\n const data = await callCloudProxy<(AppConversation | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations?${params.toString()}`,\n });\n return (data ?? []).map(overlayStoredRepoSelection);\n}\n\n/**\n * Create a v1 app-conversation on the cloud backend.\n *\n * Mirrors OpenHands' cloud flow: POST /api/v1/app-conversations with the\n * `AppConversationStartRequest` payload, returning a\n * `AppConversationStartTask`. The task is initially WORKING; the caller\n * polls `getCloudAppConversationStartTask` (3s cadence per OpenHands)\n * until status is READY (then `app_conversation_id`, `agent_server_url`,\n * and `session_api_key` are populated) or ERROR.\n *\n * This path does NOT use encrypted-settings round-tripping. Secrets stay\n * server-side on the cloud backend — the only auth carried is the cloud bearer\n * token, and the conversation runtime is\n * provisioned with its own ephemeral session_api_key returned in the\n * task.\n */\nexport async function createCloudAppConversation(\n request: AppConversationStartRequest,\n): Promise<AppConversationStartTask> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversationStartTask>({\n backend,\n method: \"POST\",\n path: \"/api/v1/app-conversations\",\n body: request as unknown as Record<string, unknown>,\n headers: AGENT_CANVAS_CLIENT_HEADERS,\n });\n return data;\n}\n\n/**\n * Download a v1 app-conversation as a ZIP from the cloud backend. Mirrors\n * the local `AgentServerConversationService.downloadConversation` interface but\n * calls\n * `GET /api/v1/app-conversations/{id}/download`, which returns\n * `application/zip` with `Content-Disposition` set by the cloud backend.\n */\nexport async function downloadCloudConversation(\n conversationId: string,\n): Promise<Blob> {\n const backend = getActiveCloudBackend();\n return callCloudProxy<Blob>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/download`,\n responseType: \"blob\",\n });\n}\n\n/**\n * Delete a v1 app-conversation on the cloud backend. Mirrors the local\n * `AgentServerConversationService.deleteConversation` interface but calls\n * `DELETE /api/v1/app-conversations/{id}`, which returns a JSON\n * `Success` envelope (discarded here — the caller only needs to know\n * the request didn't error).\n */\nexport async function deleteCloudConversation(\n conversationId: string,\n): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"DELETE\",\n path: `/api/v1/app-conversations/${conversationId}`,\n });\n}\n\n/**\n * Toggle the public-sharing flag on a cloud v1 app-conversation. Mirrors\n * OpenHands' `AgentServerConversationService.updateConversationPublicFlag`:\n * `PATCH /api/v1/app-conversations/{id}` with `{ public }`, returning\n * the updated conversation.\n */\nexport async function updateCloudConversationPublicFlag(\n conversationId: string,\n isPublic: boolean,\n): Promise<AppConversation> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversation>({\n backend,\n method: \"PATCH\",\n path: `/api/v1/app-conversations/${conversationId}`,\n body: { public: isPublic },\n });\n return data;\n}\n\n/**\n * Pause the cloud sandbox backing a v1 app-conversation. Mirrors\n * OpenHands' `SandboxService.pauseSandbox`:\n * `POST /api/v1/sandboxes/{sandboxId}/pause` on the cloud backend, which stops\n * the runtime owning the conversation.\n */\nexport async function pauseCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/pause`,\n });\n}\n\n/**\n * Resume a paused cloud sandbox. Mirrors OpenHands' `SandboxService.resumeSandbox`\n * by calling `POST /api/v1/sandboxes/{sandboxId}/resume` on the SaaS.\n *\n * This is the correct endpoint for waking a PAUSED sandbox. It is a\n * lightweight unpause — NOT the same as creating a new start task via\n * `POST /api/v1/app-conversations`, which provisions a fresh conversation\n * and is subject to the 120-second sandbox-start timeout.\n */\nexport async function resumeCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/resume`,\n });\n}\n\n/**\n * Read a file from a cloud conversation's sandbox workspace. Mirrors\n * OpenHands' `AgentServerConversationService.readConversationFile` — hits\n * `GET /api/v1/app-conversations/{id}/file?file_path=...` on the cloud backend\n * and returns the file content as a string.\n */\nexport async function readCloudConversationFile(\n conversationId: string,\n filePath: string,\n): Promise<string> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.append(\"file_path\", filePath);\n const data = await callCloudProxy<string>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/file?${params.toString()}`,\n });\n return data ?? \"\";\n}\n\n/**\n * Fetch a single v1 app-conversation start task. Mirrors OpenHands'\n * `AgentServerConversationService.getStartTask` — uses the batch search endpoint\n * with a single id and unwraps the first result.\n */\nexport async function getCloudAppConversationStartTask(\n taskId: string,\n): Promise<AppConversationStartTask | null> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"ids\", taskId);\n const data = await callCloudProxy<(AppConversationStartTask | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/start-tasks?${params.toString()}`,\n });\n return data?.[0] ?? null;\n}\n"],"mappings":"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"}
|