@openhands/agent-canvas 1.2.1 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/README.windows.md +2 -2
- package/build/assets/{Trans-De9RwQhA.js → Trans-Ch-OVWEA.js} +1 -1
- package/build/assets/{acp-providers-D_D8VUpP.js → acp-providers-Sy2LKyMa.js} +1 -1
- package/build/assets/active-backend-context-hxq31W25.js +1 -0
- package/build/assets/{add-backend-modal-DIEyAkA4.js → add-backend-modal-Bgy8anoR.js} +1 -1
- package/build/assets/{agent-profiles-settings-BovdV4N8.js → agent-profiles-settings-3mmXljZX.js} +1 -1
- package/build/assets/{agent-server-conversation-service.api-BP73yONA.js → agent-server-conversation-service.api-CuSdr4Qb.js} +4 -4
- package/build/assets/{agent-settings-Ofbh6UTD.js → agent-settings-B-W10B4E.js} +1 -1
- package/build/assets/agent-settings-D_yOy8XB.js +1 -0
- package/build/assets/{alert-banner-BW0wRYw6.js → alert-banner-Bpf2NQJq.js} +1 -1
- package/build/assets/{api-key-entry-screen-CZIdRmUJ.js → api-key-entry-screen-Dl0qVYi4.js} +1 -1
- package/build/assets/{app-settings-BHJ9nKti.js → app-settings-yVizGXox.js} +1 -1
- package/build/assets/automation-detail-dvJfLs5u.js +2 -0
- package/build/assets/automation-export-BPcgLqPD.js +2 -0
- package/build/assets/automations-list-CUXogTe0.js +1 -0
- package/build/assets/{back-nav-button-BYmxFxGt.js → back-nav-button-CUS2mi-U.js} +1 -1
- package/build/assets/backend-form-modal-CQJGmItq.js +1 -0
- package/build/assets/{backend-synced-settings-badge-Bs3FSXsS.js → backend-synced-settings-badge-D9hZx05w.js} +1 -1
- package/build/assets/{base-modal-CC5Pp8CF.js → base-modal-BuF2f0YL.js} +1 -1
- package/build/assets/{brand-button-DKPMEKcW.js → brand-button-vMVuyDXu.js} +1 -1
- package/build/assets/{browser-B39N74jU.js → browser-BifzWIBd.js} +1 -1
- package/build/assets/{browser-tab-aiDg7aEn.js → browser-tab-CkkqJnqw.js} +1 -1
- package/build/assets/{chat-send-button-DxuZIoW8.js → chat-send-button-B_jc5z5C.js} +1 -1
- package/build/assets/{circle-plus-check-toggle-T3eAIuPQ.js → circle-plus-check-toggle-C5YxjxvI.js} +1 -1
- package/build/assets/{combobox-caret-CLGvOs32.js → combobox-caret-DoObzqf4.js} +1 -1
- package/build/assets/{command-menu-DKrLCRla.js → command-menu-D-JV3Wqm.js} +1 -1
- package/build/assets/{condenser-settings-D_5vY4m3.js → condenser-settings-Ca8fYZ_Z.js} +1 -1
- package/build/assets/{confirmation-modal-BK1F0A68.js → confirmation-modal-BGLu6XJN.js} +1 -1
- package/build/assets/{context-menu-list-item-DBFzplWW.js → context-menu-list-item-BD5_EaKN.js} +1 -1
- package/build/assets/conversation-9NBSRoR9.js +1 -0
- package/build/assets/conversation-BXg6Oti2.js +89 -0
- package/build/assets/conversation-panel-CZri9Rup.js +1 -0
- package/build/assets/{conversation-service.api-CqZcHr1c.js → conversation-service.api-DPBQvTKD.js} +1 -1
- package/build/assets/{conversation-tab-empty-state-m8IUkfMj.js → conversation-tab-empty-state-B2dDYEwf.js} +1 -1
- package/build/assets/{copy-to-clipboard-button-Aj9wFmt2.js → copy-to-clipboard-button-CaR52OnA.js} +1 -1
- package/build/assets/declaration-gq8V5eTU.js +1 -0
- package/build/assets/{device-verify-B5YCrvSu.js → device-verify-Dj6I4Iqe.js} +1 -1
- package/build/assets/{dropdown-classes-CgQ45JmQ.js → dropdown-classes-DJSXeLqc.js} +1 -1
- package/build/assets/{ellipsis-button-1BV9Sga8.js → ellipsis-button-C5Z-tPFp.js} +1 -1
- package/build/assets/{entry.client-Dy--3GeA.js → entry.client-2_3ePAm0.js} +2 -2
- package/build/assets/{enum-filter-dropdown-DCITiYVi.js → enum-filter-dropdown-DXbVwiNZ.js} +1 -1
- package/build/assets/{environment-switch-overlay-DUnKILNH.js → environment-switch-overlay-DZQfRGTx.js} +1 -1
- package/build/assets/{extensions-hub-CksKNpP9.js → extensions-hub-CLjmOGqS.js} +1 -1
- package/build/assets/{extensions-navigation-Di9rJ-b5.js → extensions-navigation-B5MeUiMq.js} +1 -1
- package/build/assets/files-tab-UVoray88.js +1 -0
- package/build/assets/{form-control-classes-9rkU4usZ.js → form-control-classes-ChpNBe9n.js} +1 -1
- package/build/assets/{git-provider-icon-aQRcUVI-.js → git-provider-icon-o6hdnJUB.js} +1 -1
- package/build/assets/home-D1IHvGTN.js +1 -0
- package/build/assets/{install-server-modal-BRab9inF.js → install-server-modal-BbuQaA2w.js} +1 -1
- package/build/assets/{launch-1TJRKkkX.js → launch-V_3Rp7WS.js} +1 -1
- package/build/assets/lesson-plan-jC0HBoe6.js +4 -0
- package/build/assets/{llm-not-configured-banner-BrU5uHto.js → llm-not-configured-banner-DoARbcdL.js} +4 -4
- package/build/assets/{llm-settings-BpdU51Jo.js → llm-settings-4JMLV8mq.js} +1 -1
- package/build/assets/llm-settings-D91gMw3U.js +1 -0
- package/build/assets/{loading-spinner-DHAIPZkP.js → loading-spinner-BLdswi6q.js} +1 -1
- package/build/assets/{manage-backends-modal-BREySP-J.js → manage-backends-modal-DkWAMSle.js} +1 -1
- package/build/assets/manifest-aa5c29f6.js +1 -0
- package/build/assets/{markdown-renderer-D8mayGjI.js → markdown-renderer-DMT7Zkpd.js} +1 -1
- package/build/assets/{mcp-XXf8k6mb.js → mcp-BQufNPZ6.js} +1 -1
- package/build/assets/{messages-D2oZb47Z.js → messages-BnJCqnFf.js} +11 -11
- package/build/assets/{modal-body-Dcu5McCa.js → modal-body-DouOE5KH.js} +1 -1
- package/build/assets/{modal-classes-DPqxSyuP.js → modal-classes-Cf-4tbHz.js} +1 -1
- package/build/assets/{modal-close-button-CTCX4nCH.js → modal-close-button-B6CfxxJj.js} +1 -1
- package/build/assets/{model-selector-VDHBytb6.js → model-selector-BfqpMkSJ.js} +1 -1
- package/build/assets/onboarding-Bu-HN1ze.js +1 -0
- package/build/assets/{onboarding-modal-C084vkv7.js → onboarding-modal-CZgjs5Bx.js} +1 -1
- package/build/assets/{option-service.api-Cl5VLGyw.js → option-service.api-BrZ5q87N.js} +1 -1
- package/build/assets/{organization-service.api-CnynNoT-.js → organization-service.api-Bk4pCGU1.js} +1 -1
- package/build/assets/{path-utils-BeOmjIcE.js → path-utils-CSmuZoix.js} +1 -1
- package/build/assets/{plan-components-j9X4AxYM.js → plan-components-CcCBmCzW.js} +1 -1
- package/build/assets/{planner-tab-AZMjJx31.js → planner-tab-Dhyqcqmb.js} +1 -1
- package/build/assets/{plugins-management-service-BAp70KN7.js → plugins-management-service-BRBLxvUl.js} +1 -1
- package/build/assets/{profiles-service.api-CeYEmSM3.js → profiles-service.api-BMXQ9pZC.js} +1 -1
- package/build/assets/providers-BpO967xS.js +1 -0
- package/build/assets/{proxy-CHmFkV16.js → proxy-BgJLtxu7.js} +1 -1
- package/build/assets/{recommended-automations-launcher-Bk8tQ-Cn.js → recommended-automations-launcher-CTcGTl4d.js} +1 -1
- package/build/assets/root-BM5WgQ4_.js +2 -0
- package/build/assets/root-V8fkplMy.css +1 -0
- package/build/assets/root-layout-BdoyoobY.js +2 -0
- package/build/assets/{runtime-waiting-state-DkzLgvMn.js → runtime-waiting-state-BsXLElvN.js} +1 -1
- package/build/assets/{schema-field-nvq_Juo2.js → schema-field-BSHrUMme.js} +1 -1
- package/build/assets/{sdk-section-page-CgT70FaZ.js → sdk-section-page-t82gsOqa.js} +1 -1
- package/build/assets/{sdk-settings-schema-BjBkMHzZ.js → sdk-settings-schema-Cv7M9eSe.js} +1 -1
- package/build/assets/{secrets-service-CZYjNxFw.js → secrets-service-B2GqPV0N.js} +1 -1
- package/build/assets/{secrets-settings-BCxk9p9s.js → secrets-settings-Cx6yJlyb.js} +1 -1
- package/build/assets/{segmented-toggle-Cen5AMUc.js → segmented-toggle-DyQqPhoD.js} +1 -1
- package/build/assets/{settings-CedTdtb5.js → settings-DmPLkgq0.js} +1 -1
- package/build/assets/{settings-dropdown-input-xzoZwgUe.js → settings-dropdown-input-BjunGXJb.js} +1 -1
- package/build/assets/{settings-index-Cct3PJSP.js → settings-index-D6sxWSRk.js} +1 -1
- package/build/assets/{settings-input-DYs7t3oK.js → settings-input-bD6npsDm.js} +1 -1
- package/build/assets/{settings-list-classes-DvQr5jVS.js → settings-list-classes-Dp_OgzN0.js} +1 -1
- package/build/assets/{settings-modal-DwLybV_O.js → settings-modal-CwrZKrTq.js} +1 -1
- package/build/assets/settings-service.api-Ce-ub11I.js +1 -0
- package/build/assets/{settings-switch-C2N2xqEb.js → settings-switch-5cuxl8Dc.js} +1 -1
- package/build/assets/{shared-conversation-DnDwfLgg.js → shared-conversation-BDREQPnE.js} +1 -1
- package/build/assets/{sidebar-layout-BtpUSN3j.js → sidebar-layout-DuzJMMw-.js} +1 -1
- package/build/assets/{sidebar-mobile-menu-toggle-B8k3qu84.js → sidebar-mobile-menu-toggle-VvvX32iF.js} +1 -1
- package/build/assets/{sidebar-nav-link-CIB3NBRW.js → sidebar-nav-link-5AlTT5-j.js} +1 -1
- package/build/assets/{skill-card-pill-row-D2bUe2kB.js → skill-card-pill-row-eTIkE4nz.js} +1 -1
- package/build/assets/{skills-plugins-B68ay6Pu.js → skills-plugins-2Y44YHbO.js} +1 -1
- package/build/assets/{skills-settings-A6sUy0T7.js → skills-settings-BUv04tSc.js} +1 -1
- package/build/assets/{styled-tooltip-DsKsFjuq.js → styled-tooltip-CgX2oRaK.js} +1 -1
- package/build/assets/{suspense-X5dBsJzn.js → suspense-BO1Tl_Vf.js} +1 -1
- package/build/assets/{task-list-tab-BAThr9Ex.js → task-list-tab-0k9PhuqO.js} +1 -1
- package/build/assets/{terminal-BmT0_gIH.js → terminal-B61WrJdS.js} +1 -1
- package/build/assets/{toggle-switch-DBlOOzBr.js → toggle-switch-2j5wwR85.js} +1 -1
- package/build/assets/{typography-YGPBGzOG.js → typography-D8mHDeNG.js} +1 -1
- package/build/assets/{use-acp-credential-form-Bs6s0DTU.js → use-acp-credential-form-MzZM6D7D.js} +1 -1
- package/build/assets/{use-activate-agent-profile-CKtTToSx.js → use-activate-agent-profile-20v1xU0H.js} +1 -1
- package/build/assets/{use-active-agent-profile-CWLPpOtK.js → use-active-agent-profile-BkJN7Xsy.js} +1 -1
- package/build/assets/{use-active-conversation-DI5S5M1w.js → use-active-conversation-DOZVSVtU.js} +1 -1
- package/build/assets/{use-agent-profiles-DPcaYLpm.js → use-agent-profiles-DwZxnwO5.js} +1 -1
- package/build/assets/{use-agent-state-Buh3bQDh.js → use-agent-state-DHZO1obC.js} +1 -1
- package/build/assets/{use-backends-health-CxkvJy2N.js → use-backends-health-CRHzuvxO.js} +1 -1
- package/build/assets/{use-can-manage-org-profiles-DeX2Mfje.js → use-can-manage-org-profiles-C-OhWVBS.js} +1 -1
- package/build/assets/{use-cloud-current-user-id-D_PQGfmT.js → use-cloud-current-user-id-utFreJ0i.js} +1 -1
- package/build/assets/use-config-mJrtZHP1.js +1 -0
- package/build/assets/{use-create-conversation-D9OWYcte.js → use-create-conversation-DdqsP78F.js} +1 -1
- package/build/assets/{use-create-secret-CVFSlhlR.js → use-create-secret-D0HCOZFu.js} +1 -1
- package/build/assets/{use-event-store-YSOxy9FC.js → use-event-store-DjgU4wfO.js} +1 -1
- package/build/assets/{use-handle-plan-click-Dug8egQl.js → use-handle-plan-click-DyRASKMC.js} +1 -1
- package/build/assets/use-is-authed-B6M0mcGL.js +1 -0
- package/build/assets/use-llm-profiles-RC-PkpBl.js +1 -0
- package/build/assets/{use-plugins-marketplace-BGb-KgfD.js → use-plugins-marketplace-FHlbeQ4c.js} +1 -1
- package/build/assets/use-runtime-is-ready-RKj2WmEh.js +1 -0
- package/build/assets/use-save-agent-profile-tvDP15mh.js +1 -0
- package/build/assets/{use-save-settings-CChDyjOB.js → use-save-settings-BGlSfuYn.js} +1 -1
- package/build/assets/{use-settings-dX4fKUPF.js → use-settings-CH5LzXD8.js} +1 -1
- package/build/assets/{use-settings-nav-items-D6pHnvxg.js → use-settings-nav-items-Dwktv8wo.js} +1 -1
- package/build/assets/{use-skills-Dqo-pDDx.js → use-skills-CSzSL6HG.js} +1 -1
- package/build/assets/{use-task-list-CmWGElgb.js → use-task-list-AVBLbbcR.js} +1 -1
- package/build/assets/{use-tracking-GtXCHmTv.js → use-tracking-BIXzagSI.js} +1 -1
- package/build/assets/{use-user-conversation-6uOXFP95.js → use-user-conversation-zpx7I18x.js} +1 -1
- package/build/assets/{useMutation-DCE9RcgK.js → useMutation-DrCAVg5w.js} +1 -1
- package/build/assets/{useMutationState-BUab8Kxr.js → useMutationState-D8QN0ZCy.js} +1 -1
- package/build/assets/{useQueries-CRzaAqzH.js → useQueries-DClgUTc7.js} +1 -1
- package/build/assets/{useQuery-CpjHYtZc.js → useQuery-CRBP8vIS.js} +1 -1
- package/build/assets/{useTranslation-Cgy4JA_g.js → useTranslation-CDRCKC9-.js} +1 -1
- package/build/assets/{utils-CE0lDWtb.js → utils-D3U3rlqr.js} +1 -1
- package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~d1e18dtv-5Q6lQJdE.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~nfpll1wp-BCpa95De.js} +1 -1
- package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~nn5zty47-Zl0G1QCy.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jewnulst-C57fm7C-.js} +1 -1
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~settings~settings-index~agen~enjl5xdm-mMKDm94D.js → vendor~root-layout~home~conversation-panel~conversation~launch~settings~settings-index~agen~enjl5xdm-B0EIDu4M.js} +1 -1
- package/build/assets/{verification-settings-D_zsNB_c.js → verification-settings-D576N2xa.js} +1 -1
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +24 -0
- package/build/locales/ca/openhands.json +24 -0
- package/build/locales/de/openhands.json +24 -0
- package/build/locales/en/openhands.json +25 -1
- package/build/locales/es/openhands.json +24 -0
- package/build/locales/fr/openhands.json +24 -0
- package/build/locales/it/openhands.json +24 -0
- package/build/locales/ja/openhands.json +24 -0
- package/build/locales/ko-KR/openhands.json +24 -0
- package/build/locales/no/openhands.json +24 -0
- package/build/locales/pt/openhands.json +24 -0
- package/build/locales/tr/openhands.json +24 -0
- package/build/locales/uk/openhands.json +24 -0
- package/build/locales/zh-CN/openhands.json +24 -0
- package/build/locales/zh-TW/openhands.json +24 -0
- package/config/defaults.json +4 -4
- package/dist/api/automation-service/automation-service.api.d.ts +2 -1
- package/dist/api/event-service/event-service.api.cjs +1 -1
- package/dist/api/event-service/event-service.api.cjs.map +1 -1
- package/dist/api/event-service/event-service.api.js +1 -1
- package/dist/api/event-service/event-service.api.js.map +1 -1
- package/dist/api/event-service/event-service.types.d.ts +6 -0
- 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.js +2 -2
- package/dist/api/git-service/agent-server-git-service.api.js.map +1 -1
- package/dist/api/git-service/git-service.api.cjs +1 -1
- package/dist/api/git-service/git-service.api.cjs.map +1 -1
- package/dist/api/git-service/git-service.api.js +2 -2
- package/dist/api/git-service/git-service.api.js.map +1 -1
- package/dist/components/conversation-events/chat/event-thought-helpers.cjs +1 -1
- package/dist/components/conversation-events/chat/event-thought-helpers.js +1 -1
- package/dist/components/features/automations/automation-card.d.ts +2 -1
- package/dist/components/features/automations/automation-group.d.ts +2 -1
- package/dist/components/features/automations/automation-list-row.d.ts +2 -1
- package/dist/components/features/automations/build-automation-menu-items.d.ts +2 -1
- package/dist/components/features/automations/detail/detail-header.d.ts +3 -1
- package/dist/components/features/automations/import-automation-modal.d.ts +10 -0
- 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 +3 -1
- package/dist/components/features/backends/backend-form-modal.js +17 -16
- package/dist/components/features/backends/backend-form-modal.js.map +1 -1
- package/dist/components/features/conversation/conversation-name-context-menu.cjs +1 -1
- package/dist/components/features/conversation/conversation-name-context-menu.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-name-context-menu.d.ts +2 -1
- package/dist/components/features/conversation/conversation-name-context-menu.js +74 -63
- package/dist/components/features/conversation/conversation-name-context-menu.js.map +1 -1
- package/dist/components/features/conversation/conversation-name.cjs +1 -1
- package/dist/components/features/conversation/conversation-name.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-name.js +73 -61
- package/dist/components/features/conversation/conversation-name.js.map +1 -1
- package/dist/components/features/conversation/transcript-export-modal.cjs +2 -0
- package/dist/components/features/conversation/transcript-export-modal.cjs.map +1 -0
- package/dist/components/features/conversation/transcript-export-modal.d.ts +10 -0
- package/dist/components/features/conversation/transcript-export-modal.js +140 -0
- package/dist/components/features/conversation/transcript-export-modal.js.map +1 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
- package/dist/components/features/home/shared/dropdown-item.cjs +1 -1
- package/dist/components/features/home/shared/dropdown-item.cjs.map +1 -1
- package/dist/components/features/home/shared/dropdown-item.d.ts +7 -1
- package/dist/components/features/home/shared/dropdown-item.js +2 -1
- package/dist/components/features/home/shared/dropdown-item.js.map +1 -1
- package/dist/components/features/home/shared/generic-dropdown-menu.cjs +1 -1
- package/dist/components/features/home/shared/generic-dropdown-menu.cjs.map +1 -1
- package/dist/components/features/home/shared/generic-dropdown-menu.d.ts +8 -1
- package/dist/components/features/home/shared/generic-dropdown-menu.js +18 -10
- package/dist/components/features/home/shared/generic-dropdown-menu.js.map +1 -1
- package/dist/components/features/home/workspace-dropdown/workspace-dropdown.d.ts +11 -2
- package/dist/config/defaults.cjs +1 -1
- package/dist/config/defaults.cjs.map +1 -1
- package/dist/config/defaults.js +4 -4
- package/dist/config/defaults.js.map +1 -1
- package/dist/hooks/query/use-automations.d.ts +2 -1
- package/dist/hooks/query/use-resolved-workspaces.cjs +1 -1
- package/dist/hooks/query/use-resolved-workspaces.cjs.map +1 -1
- package/dist/hooks/query/use-resolved-workspaces.d.ts +9 -1
- package/dist/hooks/query/use-resolved-workspaces.js +1 -0
- package/dist/hooks/query/use-resolved-workspaces.js.map +1 -1
- package/dist/hooks/query/use-workspace-file-content.cjs +1 -1
- package/dist/hooks/query/use-workspace-file-content.cjs.map +1 -1
- package/dist/hooks/query/use-workspace-file-content.js +61 -55
- package/dist/hooks/query/use-workspace-file-content.js.map +1 -1
- package/dist/hooks/query/use-workspace-files.cjs +1 -1
- package/dist/hooks/query/use-workspace-files.cjs.map +1 -1
- package/dist/hooks/query/use-workspace-files.d.ts +11 -4
- package/dist/hooks/query/use-workspace-files.js +39 -18
- package/dist/hooks/query/use-workspace-files.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.d.ts +9 -0
- package/dist/hooks/use-auto-refresh-files-on-edit.js +15 -11
- package/dist/hooks/use-auto-refresh-files-on-edit.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 +7 -0
- package/dist/hooks/use-tracking.js +9 -0
- 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 +24 -0
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/translation.cjs +2 -2
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +409 -1
- package/dist/i18n/translation.js.map +1 -1
- package/dist/locales/ar/openhands.json +24 -0
- package/dist/locales/ca/openhands.json +24 -0
- package/dist/locales/de/openhands.json +24 -0
- package/dist/locales/en/openhands.json +25 -1
- package/dist/locales/es/openhands.json +24 -0
- package/dist/locales/fr/openhands.json +24 -0
- package/dist/locales/it/openhands.json +24 -0
- package/dist/locales/ja/openhands.json +24 -0
- package/dist/locales/ko-KR/openhands.json +24 -0
- package/dist/locales/no/openhands.json +24 -0
- package/dist/locales/pt/openhands.json +24 -0
- package/dist/locales/tr/openhands.json +24 -0
- package/dist/locales/uk/openhands.json +24 -0
- package/dist/locales/zh-CN/openhands.json +24 -0
- package/dist/locales/zh-TW/openhands.json +24 -0
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/dist/routes/files-tab.cjs +1 -1
- package/dist/routes/files-tab.js +10 -10
- package/dist/types/automation.d.ts +8 -0
- package/dist/utils/custom-toast-handlers.cjs.map +1 -1
- package/dist/utils/custom-toast-handlers.d.ts +1 -0
- package/dist/utils/custom-toast-handlers.js.map +1 -1
- package/dist/utils/mcp-server-name.cjs +1 -1
- package/dist/utils/mcp-server-name.cjs.map +1 -1
- package/dist/utils/mcp-server-name.js +2 -2
- package/dist/utils/mcp-server-name.js.map +1 -1
- package/dist/utils/transcript-export/index.cjs +72 -0
- package/dist/utils/transcript-export/index.cjs.map +1 -0
- package/dist/utils/transcript-export/index.d.ts +10 -0
- package/dist/utils/transcript-export/index.js +302 -0
- package/dist/utils/transcript-export/index.js.map +1 -0
- package/dist/utils/transcript-export/load-complete-events.cjs +2 -0
- package/dist/utils/transcript-export/load-complete-events.cjs.map +1 -0
- package/dist/utils/transcript-export/load-complete-events.d.ts +22 -0
- package/dist/utils/transcript-export/load-complete-events.js +39 -0
- package/dist/utils/transcript-export/load-complete-events.js.map +1 -0
- package/package.json +1 -1
- package/scripts/check-sdk-version-sync.mjs +6 -6
- package/scripts/dev-safe.mjs +2 -2
- package/build/assets/active-backend-context-u2tdYRgH.js +0 -1
- package/build/assets/agent-settings-FGL3Yvkp.js +0 -1
- package/build/assets/automation-detail-DwYGzLkp.js +0 -2
- package/build/assets/automations-list-CuAfJmMW.js +0 -1
- package/build/assets/backend-form-modal-BiaOB2C4.js +0 -1
- package/build/assets/conversation-DnVC6vRV.js +0 -1
- package/build/assets/conversation-panel-ZEz-z3az.js +0 -1
- package/build/assets/conversation-xkBS3AHC.js +0 -19
- package/build/assets/declaration-B9kpCaYl.js +0 -1
- package/build/assets/edit-automation-modal-B6U96gVV.js +0 -1
- package/build/assets/files-tab-61Vaihc6.js +0 -1
- package/build/assets/home-5gOtUe-n.js +0 -1
- package/build/assets/lesson-plan-BtrZUCuj.js +0 -4
- package/build/assets/llm-settings-DsInf6yD.js +0 -1
- package/build/assets/manifest-a5bb7568.js +0 -1
- package/build/assets/onboarding-D32kiGME.js +0 -1
- package/build/assets/providers-vX9jk9Vy.js +0 -1
- package/build/assets/root-CxWZUXTQ.css +0 -1
- package/build/assets/root-layout-CoWw4kpz.js +0 -2
- package/build/assets/root-tuEPDx-i.js +0 -2
- package/build/assets/settings-service.api-DldkFI1x.js +0 -1
- package/build/assets/use-config-ur0RbjCP.js +0 -1
- package/build/assets/use-is-authed-_dhQ2Xuj.js +0 -1
- package/build/assets/use-llm-profiles-DjackuP1.js +0 -1
- package/build/assets/use-runtime-is-ready-Diiq65Q-.js +0 -1
- package/build/assets/use-save-agent-profile-aKKLqDJM.js +0 -1
- /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~i3v2mlbw-BrJQ3XZH.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~epa72zsm-B4rXs7Zd.js} +0 -0
- /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~ncdxw0bh-ClHnt5lR.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~lf310vj7-CSVPGId3.js} +0 -0
- /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~k6tszsdc-Bb-xMtbv.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~ivvrgjsa-BlIZPCXX.js} +0 -0
|
@@ -737,6 +737,14 @@
|
|
|
737
737
|
"AUTOMATIONS$TITLE": "Automações",
|
|
738
738
|
"AUTOMATIONS$SUBTITLE": "Visualize automações ativas e inativas, pesquise por metadados e inspecione detalhes somente leitura.",
|
|
739
739
|
"AUTOMATIONS$ADD_AUTOMATION": "Adicionar automação",
|
|
740
|
+
"AUTOMATIONS$IMPORT": "Importar automação",
|
|
741
|
+
"AUTOMATIONS$EXPORT": "Exportar",
|
|
742
|
+
"AUTOMATIONS$IMPORT_PREVIEW_DESCRIPTION": "Revise os detalhes da automação antes de importar.",
|
|
743
|
+
"AUTOMATIONS$IMPORT_DISABLED_NOTICE": "A automação importada ficará desativada até que você a revise e ative.",
|
|
744
|
+
"AUTOMATIONS$IMPORTING": "Importando...",
|
|
745
|
+
"AUTOMATIONS$IMPORT_SUCCESS": "\"{{name}}\" foi importada como desativada.",
|
|
746
|
+
"AUTOMATIONS$IMPORT_VIEW": "Ver automação",
|
|
747
|
+
"AUTOMATIONS$IMPORT_INVALID_JSON": "O arquivo selecionado não é um JSON válido.",
|
|
740
748
|
"AUTOMATIONS$EMPTY": "Nenhuma automação configurada",
|
|
741
749
|
"AUTOMATIONS$EMPTY_HINT": "Escolha um das recomendações abaixo para começar.",
|
|
742
750
|
"AUTOMATIONS$EMPTY_HOW_TO_CREATE_TITLE": "Como criar uma automação",
|
|
@@ -1042,6 +1050,21 @@
|
|
|
1042
1050
|
"BUTTON$MARK_HELPFUL": "Marcar esta solução como útil",
|
|
1043
1051
|
"BUTTON$MARK_NOT_HELPFUL": "Marcar esta solução como não útil",
|
|
1044
1052
|
"BUTTON$EXPORT_CONVERSATION": "Exportar conversa",
|
|
1053
|
+
"BUTTON$EXPORT_TRANSCRIPT": "Exportar…",
|
|
1054
|
+
"BUTTON$DOWNLOAD_CONVERSATION_DATA": "Baixar dados da conversa",
|
|
1055
|
+
"TRANSCRIPT_EXPORT$TITLE": "Exportar conversa",
|
|
1056
|
+
"TRANSCRIPT_EXPORT$DESCRIPTION": "Baixe uma transcrição compartilhável sem enviar os dados da conversa para nenhum lugar.",
|
|
1057
|
+
"TRANSCRIPT_EXPORT$FORMAT": "Formato",
|
|
1058
|
+
"TRANSCRIPT_EXPORT$MARKDOWN": "Documento Markdown (.md)",
|
|
1059
|
+
"TRANSCRIPT_EXPORT$HTML": "Página web independente (.html)",
|
|
1060
|
+
"TRANSCRIPT_EXPORT$INCLUDE_TOOL_DETAILS": "Incluir detalhes das chamadas de ferramentas",
|
|
1061
|
+
"TRANSCRIPT_EXPORT$INCLUDE_TIMESTAMPS": "Incluir carimbos de data e hora",
|
|
1062
|
+
"TRANSCRIPT_EXPORT$DEFAULT_TITLE": "Transcrição da conversa",
|
|
1063
|
+
"TRANSCRIPT_EXPORT$MODEL": "Modelo",
|
|
1064
|
+
"TRANSCRIPT_EXPORT$REASON": "Motivo",
|
|
1065
|
+
"TRANSCRIPT_EXPORT$USER": "Usuário",
|
|
1066
|
+
"TRANSCRIPT_EXPORT$TOOL": "Ferramenta",
|
|
1067
|
+
"TRANSCRIPT_EXPORT$HOOK": "Hook: {{command}}",
|
|
1045
1068
|
"WAITLIST$IF_NOT_JOINED": "Se você ainda não entrou na lista de espera, faça isso para obter acesso.",
|
|
1046
1069
|
"WAITLIST$PATIENCE_MESSAGE": "Obrigado pela sua paciência. Estamos trabalhando duro para lhe dar acesso o mais rápido possível.",
|
|
1047
1070
|
"WAITLIST$ALMOST_THERE": "Quase lá!",
|
|
@@ -1196,6 +1219,7 @@
|
|
|
1196
1219
|
"HOME$OPEN_WORKSPACE": "Abrir espaço de trabalho",
|
|
1197
1220
|
"HOME$CREATING_CONVERSATION": "Criando conversa…",
|
|
1198
1221
|
"HOME$ADD_WORKSPACES": "+ Adicionar espaço de trabalho",
|
|
1222
|
+
"HOME$WORKSPACE_GROUP_OTHER": "Outros",
|
|
1199
1223
|
"HOME$MANAGE_WORKSPACES": "Gerenciar espaços de trabalho",
|
|
1200
1224
|
"HOME$MANAGE_WORKSPACES_EMPTY": "Você ainda não tem nenhum espaço de trabalho.",
|
|
1201
1225
|
"HOME$REMOVE_WORKSPACE": "Remover",
|
|
@@ -737,6 +737,14 @@
|
|
|
737
737
|
"AUTOMATIONS$TITLE": "Otomasyonlar",
|
|
738
738
|
"AUTOMATIONS$SUBTITLE": "Aktif ve aktif olmayan otomasyonları görüntüleyin, meta verilere göre arama yapın ve salt okunur ayrıntıları inceleyin.",
|
|
739
739
|
"AUTOMATIONS$ADD_AUTOMATION": "Otomasyon ekle",
|
|
740
|
+
"AUTOMATIONS$IMPORT": "Otomasyonu içe aktar",
|
|
741
|
+
"AUTOMATIONS$EXPORT": "Dışa aktar",
|
|
742
|
+
"AUTOMATIONS$IMPORT_PREVIEW_DESCRIPTION": "İçe aktarmadan önce otomasyon ayrıntılarını inceleyin.",
|
|
743
|
+
"AUTOMATIONS$IMPORT_DISABLED_NOTICE": "İçe aktarılan otomasyon, inceleyip etkinleştirene kadar devre dışı kalır.",
|
|
744
|
+
"AUTOMATIONS$IMPORTING": "İçe aktarılıyor...",
|
|
745
|
+
"AUTOMATIONS$IMPORT_SUCCESS": "\"{{name}}\" devre dışı olarak içe aktarıldı.",
|
|
746
|
+
"AUTOMATIONS$IMPORT_VIEW": "Otomasyonu görüntüle",
|
|
747
|
+
"AUTOMATIONS$IMPORT_INVALID_JSON": "Seçilen dosya geçerli bir JSON değil.",
|
|
740
748
|
"AUTOMATIONS$EMPTY": "Yapılandırılmış otomasyon yok",
|
|
741
749
|
"AUTOMATIONS$EMPTY_HINT": "Başlamak için aşağıdaki önerilerden birini seçin.",
|
|
742
750
|
"AUTOMATIONS$EMPTY_HOW_TO_CREATE_TITLE": "Otomasyon nasıl oluşturulur",
|
|
@@ -1042,6 +1050,21 @@
|
|
|
1042
1050
|
"BUTTON$MARK_HELPFUL": "Bu çözümü yararlı olarak işaretle",
|
|
1043
1051
|
"BUTTON$MARK_NOT_HELPFUL": "Bu çözümü yararlı değil olarak işaretle",
|
|
1044
1052
|
"BUTTON$EXPORT_CONVERSATION": "Konuşmayı dışa aktar",
|
|
1053
|
+
"BUTTON$EXPORT_TRANSCRIPT": "Dışa aktar…",
|
|
1054
|
+
"BUTTON$DOWNLOAD_CONVERSATION_DATA": "Konuşma verilerini indir",
|
|
1055
|
+
"TRANSCRIPT_EXPORT$TITLE": "Konuşmayı dışa aktar",
|
|
1056
|
+
"TRANSCRIPT_EXPORT$DESCRIPTION": "Konuşma verilerini herhangi bir yere göndermeden paylaşılabilir bir döküm indirin.",
|
|
1057
|
+
"TRANSCRIPT_EXPORT$FORMAT": "Biçim",
|
|
1058
|
+
"TRANSCRIPT_EXPORT$MARKDOWN": "Markdown belgesi (.md)",
|
|
1059
|
+
"TRANSCRIPT_EXPORT$HTML": "Bağımsız web sayfası (.html)",
|
|
1060
|
+
"TRANSCRIPT_EXPORT$INCLUDE_TOOL_DETAILS": "Araç çağrısı ayrıntılarını dahil et",
|
|
1061
|
+
"TRANSCRIPT_EXPORT$INCLUDE_TIMESTAMPS": "Zaman damgalarını dahil et",
|
|
1062
|
+
"TRANSCRIPT_EXPORT$DEFAULT_TITLE": "Konuşma dökümü",
|
|
1063
|
+
"TRANSCRIPT_EXPORT$MODEL": "Model",
|
|
1064
|
+
"TRANSCRIPT_EXPORT$REASON": "Neden",
|
|
1065
|
+
"TRANSCRIPT_EXPORT$USER": "Kullanıcı",
|
|
1066
|
+
"TRANSCRIPT_EXPORT$TOOL": "Araç",
|
|
1067
|
+
"TRANSCRIPT_EXPORT$HOOK": "Kanca: {{command}}",
|
|
1045
1068
|
"WAITLIST$IF_NOT_JOINED": "Henüz bekleme listesine katılmadıysanız, erişim elde etmek için lütfen katılın.",
|
|
1046
1069
|
"WAITLIST$PATIENCE_MESSAGE": "Sabrınız için teşekkür ederiz. Size mümkün olan en kısa sürede erişim sağlamak için çok çalışıyoruz.",
|
|
1047
1070
|
"WAITLIST$ALMOST_THERE": "Neredeyse tamam!",
|
|
@@ -1196,6 +1219,7 @@
|
|
|
1196
1219
|
"HOME$OPEN_WORKSPACE": "Çalışma Alanını Aç",
|
|
1197
1220
|
"HOME$CREATING_CONVERSATION": "Konuşma oluşturuluyor…",
|
|
1198
1221
|
"HOME$ADD_WORKSPACES": "+ Çalışma alanı ekle",
|
|
1222
|
+
"HOME$WORKSPACE_GROUP_OTHER": "Diğer",
|
|
1199
1223
|
"HOME$MANAGE_WORKSPACES": "Çalışma alanlarını yönet",
|
|
1200
1224
|
"HOME$MANAGE_WORKSPACES_EMPTY": "Henüz hiç çalışma alanınız yok.",
|
|
1201
1225
|
"HOME$REMOVE_WORKSPACE": "Kaldır",
|
|
@@ -737,6 +737,14 @@
|
|
|
737
737
|
"AUTOMATIONS$TITLE": "Автоматизації",
|
|
738
738
|
"AUTOMATIONS$SUBTITLE": "Переглядайте активні та неактивні автоматизації, шукайте за метаданими та переглядайте деталі лише для читання.",
|
|
739
739
|
"AUTOMATIONS$ADD_AUTOMATION": "Додати автоматизацію",
|
|
740
|
+
"AUTOMATIONS$IMPORT": "Імпортувати автоматизацію",
|
|
741
|
+
"AUTOMATIONS$EXPORT": "Експортувати",
|
|
742
|
+
"AUTOMATIONS$IMPORT_PREVIEW_DESCRIPTION": "Перевірте деталі автоматизації перед імпортом.",
|
|
743
|
+
"AUTOMATIONS$IMPORT_DISABLED_NOTICE": "Імпортована автоматизація буде вимкнена, доки ви не перевірите та не ввімкнете її.",
|
|
744
|
+
"AUTOMATIONS$IMPORTING": "Імпортування...",
|
|
745
|
+
"AUTOMATIONS$IMPORT_SUCCESS": "«{{name}}» імпортовано у вимкненому стані.",
|
|
746
|
+
"AUTOMATIONS$IMPORT_VIEW": "Переглянути автоматизацію",
|
|
747
|
+
"AUTOMATIONS$IMPORT_INVALID_JSON": "Вибраний файл не є коректним JSON.",
|
|
740
748
|
"AUTOMATIONS$EMPTY": "Автоматизації не налаштовано",
|
|
741
749
|
"AUTOMATIONS$EMPTY_HINT": "Виберіть одну з рекомендацій нижче, щоб почати.",
|
|
742
750
|
"AUTOMATIONS$EMPTY_HOW_TO_CREATE_TITLE": "Як створити автоматизацію",
|
|
@@ -1042,6 +1050,21 @@
|
|
|
1042
1050
|
"BUTTON$MARK_HELPFUL": "Позначити це рішення як корисне",
|
|
1043
1051
|
"BUTTON$MARK_NOT_HELPFUL": "Позначити це рішення як некорисне",
|
|
1044
1052
|
"BUTTON$EXPORT_CONVERSATION": "Експорт розмови",
|
|
1053
|
+
"BUTTON$EXPORT_TRANSCRIPT": "Експортувати…",
|
|
1054
|
+
"BUTTON$DOWNLOAD_CONVERSATION_DATA": "Завантажити дані розмови",
|
|
1055
|
+
"TRANSCRIPT_EXPORT$TITLE": "Експортувати розмову",
|
|
1056
|
+
"TRANSCRIPT_EXPORT$DESCRIPTION": "Завантажте стенограму для поширення, не надсилаючи дані розмови назовні.",
|
|
1057
|
+
"TRANSCRIPT_EXPORT$FORMAT": "Формат",
|
|
1058
|
+
"TRANSCRIPT_EXPORT$MARKDOWN": "Документ Markdown (.md)",
|
|
1059
|
+
"TRANSCRIPT_EXPORT$HTML": "Автономна вебсторінка (.html)",
|
|
1060
|
+
"TRANSCRIPT_EXPORT$INCLUDE_TOOL_DETAILS": "Додати подробиці викликів інструментів",
|
|
1061
|
+
"TRANSCRIPT_EXPORT$INCLUDE_TIMESTAMPS": "Додати часові позначки",
|
|
1062
|
+
"TRANSCRIPT_EXPORT$DEFAULT_TITLE": "Стенограма розмови",
|
|
1063
|
+
"TRANSCRIPT_EXPORT$MODEL": "Модель",
|
|
1064
|
+
"TRANSCRIPT_EXPORT$REASON": "Причина",
|
|
1065
|
+
"TRANSCRIPT_EXPORT$USER": "Користувач",
|
|
1066
|
+
"TRANSCRIPT_EXPORT$TOOL": "Інструмент",
|
|
1067
|
+
"TRANSCRIPT_EXPORT$HOOK": "Гук: {{command}}",
|
|
1045
1068
|
"WAITLIST$IF_NOT_JOINED": "Якщо ви ще не записалися до списку очікування, будь ласка, зробіть це, щоб отримати доступ.",
|
|
1046
1069
|
"WAITLIST$PATIENCE_MESSAGE": "Дякуємо за ваше терпіння. Ми наполегливо працюємо, щоб надати вам доступ якомога швидше.",
|
|
1047
1070
|
"WAITLIST$ALMOST_THERE": "Майже готово!",
|
|
@@ -1196,6 +1219,7 @@
|
|
|
1196
1219
|
"HOME$OPEN_WORKSPACE": "Відкрити робочу область",
|
|
1197
1220
|
"HOME$CREATING_CONVERSATION": "Створення розмови…",
|
|
1198
1221
|
"HOME$ADD_WORKSPACES": "+ Додати робочу область",
|
|
1222
|
+
"HOME$WORKSPACE_GROUP_OTHER": "Інше",
|
|
1199
1223
|
"HOME$MANAGE_WORKSPACES": "Керування робочими областями",
|
|
1200
1224
|
"HOME$MANAGE_WORKSPACES_EMPTY": "У вас ще немає робочих областей.",
|
|
1201
1225
|
"HOME$REMOVE_WORKSPACE": "Видалити",
|
|
@@ -737,6 +737,14 @@
|
|
|
737
737
|
"AUTOMATIONS$TITLE": "自动化",
|
|
738
738
|
"AUTOMATIONS$SUBTITLE": "查看活动和非活动的自动化,按元数据搜索,并检查只读详情。",
|
|
739
739
|
"AUTOMATIONS$ADD_AUTOMATION": "添加自动化",
|
|
740
|
+
"AUTOMATIONS$IMPORT": "导入自动化",
|
|
741
|
+
"AUTOMATIONS$EXPORT": "导出",
|
|
742
|
+
"AUTOMATIONS$IMPORT_PREVIEW_DESCRIPTION": "请在导入前检查自动化详情。",
|
|
743
|
+
"AUTOMATIONS$IMPORT_DISABLED_NOTICE": "导入的自动化将保持禁用,直到您检查并启用它。",
|
|
744
|
+
"AUTOMATIONS$IMPORTING": "正在导入...",
|
|
745
|
+
"AUTOMATIONS$IMPORT_SUCCESS": "已导入“{{name}}”,当前为禁用状态。",
|
|
746
|
+
"AUTOMATIONS$IMPORT_VIEW": "查看自动化",
|
|
747
|
+
"AUTOMATIONS$IMPORT_INVALID_JSON": "所选文件不是有效的 JSON。",
|
|
740
748
|
"AUTOMATIONS$EMPTY": "未配置自动化",
|
|
741
749
|
"AUTOMATIONS$EMPTY_HINT": "从下方的推荐中选择一个开始使用。",
|
|
742
750
|
"AUTOMATIONS$EMPTY_HOW_TO_CREATE_TITLE": "如何创建自动化",
|
|
@@ -1042,6 +1050,21 @@
|
|
|
1042
1050
|
"BUTTON$MARK_HELPFUL": "标记此解决方案有帮助",
|
|
1043
1051
|
"BUTTON$MARK_NOT_HELPFUL": "标记此解决方案没有帮助",
|
|
1044
1052
|
"BUTTON$EXPORT_CONVERSATION": "导出对话",
|
|
1053
|
+
"BUTTON$EXPORT_TRANSCRIPT": "导出…",
|
|
1054
|
+
"BUTTON$DOWNLOAD_CONVERSATION_DATA": "下载对话数据",
|
|
1055
|
+
"TRANSCRIPT_EXPORT$TITLE": "导出对话",
|
|
1056
|
+
"TRANSCRIPT_EXPORT$DESCRIPTION": "在不向外部发送对话数据的情况下下载可共享的记录。",
|
|
1057
|
+
"TRANSCRIPT_EXPORT$FORMAT": "格式",
|
|
1058
|
+
"TRANSCRIPT_EXPORT$MARKDOWN": "Markdown 文档(.md)",
|
|
1059
|
+
"TRANSCRIPT_EXPORT$HTML": "独立网页(.html)",
|
|
1060
|
+
"TRANSCRIPT_EXPORT$INCLUDE_TOOL_DETAILS": "包含工具调用详情",
|
|
1061
|
+
"TRANSCRIPT_EXPORT$INCLUDE_TIMESTAMPS": "包含时间戳",
|
|
1062
|
+
"TRANSCRIPT_EXPORT$DEFAULT_TITLE": "对话记录",
|
|
1063
|
+
"TRANSCRIPT_EXPORT$MODEL": "模型",
|
|
1064
|
+
"TRANSCRIPT_EXPORT$REASON": "原因",
|
|
1065
|
+
"TRANSCRIPT_EXPORT$USER": "用户",
|
|
1066
|
+
"TRANSCRIPT_EXPORT$TOOL": "工具",
|
|
1067
|
+
"TRANSCRIPT_EXPORT$HOOK": "钩子: {{command}}",
|
|
1045
1068
|
"WAITLIST$IF_NOT_JOINED": "如果您尚未加入等待名单,请加入以获取访问权限。",
|
|
1046
1069
|
"WAITLIST$PATIENCE_MESSAGE": "感谢您的耐心等待。我们正在努力尽快为您提供访问权限。",
|
|
1047
1070
|
"WAITLIST$ALMOST_THERE": "即将完成!",
|
|
@@ -1196,6 +1219,7 @@
|
|
|
1196
1219
|
"HOME$OPEN_WORKSPACE": "打开工作区",
|
|
1197
1220
|
"HOME$CREATING_CONVERSATION": "正在创建会话…",
|
|
1198
1221
|
"HOME$ADD_WORKSPACES": "+ 添加工作区",
|
|
1222
|
+
"HOME$WORKSPACE_GROUP_OTHER": "其他",
|
|
1199
1223
|
"HOME$MANAGE_WORKSPACES": "管理工作区",
|
|
1200
1224
|
"HOME$MANAGE_WORKSPACES_EMPTY": "您还没有任何工作区。",
|
|
1201
1225
|
"HOME$REMOVE_WORKSPACE": "移除",
|
|
@@ -737,6 +737,14 @@
|
|
|
737
737
|
"AUTOMATIONS$TITLE": "自動化",
|
|
738
738
|
"AUTOMATIONS$SUBTITLE": "檢視作用中與非作用中的自動化,依中繼資料搜尋,並檢查唯讀詳情。",
|
|
739
739
|
"AUTOMATIONS$ADD_AUTOMATION": "新增自動化",
|
|
740
|
+
"AUTOMATIONS$IMPORT": "匯入自動化",
|
|
741
|
+
"AUTOMATIONS$EXPORT": "匯出",
|
|
742
|
+
"AUTOMATIONS$IMPORT_PREVIEW_DESCRIPTION": "請在匯入前檢查自動化詳細資料。",
|
|
743
|
+
"AUTOMATIONS$IMPORT_DISABLED_NOTICE": "匯入的自動化將保持停用,直到您檢查並啟用它。",
|
|
744
|
+
"AUTOMATIONS$IMPORTING": "正在匯入...",
|
|
745
|
+
"AUTOMATIONS$IMPORT_SUCCESS": "已匯入「{{name}}」,目前為停用狀態。",
|
|
746
|
+
"AUTOMATIONS$IMPORT_VIEW": "檢視自動化",
|
|
747
|
+
"AUTOMATIONS$IMPORT_INVALID_JSON": "所選檔案不是有效的 JSON。",
|
|
740
748
|
"AUTOMATIONS$EMPTY": "未設定自動化",
|
|
741
749
|
"AUTOMATIONS$EMPTY_HINT": "從下方的推薦中選擇一個開始使用。",
|
|
742
750
|
"AUTOMATIONS$EMPTY_HOW_TO_CREATE_TITLE": "如何建立自動化",
|
|
@@ -1042,6 +1050,21 @@
|
|
|
1042
1050
|
"BUTTON$MARK_HELPFUL": "標記此解決方案有幫助",
|
|
1043
1051
|
"BUTTON$MARK_NOT_HELPFUL": "標記此解決方案沒有幫助",
|
|
1044
1052
|
"BUTTON$EXPORT_CONVERSATION": "導出對話",
|
|
1053
|
+
"BUTTON$EXPORT_TRANSCRIPT": "匯出…",
|
|
1054
|
+
"BUTTON$DOWNLOAD_CONVERSATION_DATA": "下載對話資料",
|
|
1055
|
+
"TRANSCRIPT_EXPORT$TITLE": "匯出對話",
|
|
1056
|
+
"TRANSCRIPT_EXPORT$DESCRIPTION": "在不向外部傳送對話資料的情況下下載可分享的記錄。",
|
|
1057
|
+
"TRANSCRIPT_EXPORT$FORMAT": "格式",
|
|
1058
|
+
"TRANSCRIPT_EXPORT$MARKDOWN": "Markdown 文件(.md)",
|
|
1059
|
+
"TRANSCRIPT_EXPORT$HTML": "獨立網頁(.html)",
|
|
1060
|
+
"TRANSCRIPT_EXPORT$INCLUDE_TOOL_DETAILS": "包含工具呼叫詳細資料",
|
|
1061
|
+
"TRANSCRIPT_EXPORT$INCLUDE_TIMESTAMPS": "包含時間戳記",
|
|
1062
|
+
"TRANSCRIPT_EXPORT$DEFAULT_TITLE": "對話記錄",
|
|
1063
|
+
"TRANSCRIPT_EXPORT$MODEL": "模型",
|
|
1064
|
+
"TRANSCRIPT_EXPORT$REASON": "原因",
|
|
1065
|
+
"TRANSCRIPT_EXPORT$USER": "使用者",
|
|
1066
|
+
"TRANSCRIPT_EXPORT$TOOL": "工具",
|
|
1067
|
+
"TRANSCRIPT_EXPORT$HOOK": "掛鉤: {{command}}",
|
|
1045
1068
|
"WAITLIST$IF_NOT_JOINED": "如果您尚未加入等待名單,請加入以獲取訪問權限。",
|
|
1046
1069
|
"WAITLIST$PATIENCE_MESSAGE": "感謝您的耐心等待。我們正在努力盡快為您提供訪問權限。",
|
|
1047
1070
|
"WAITLIST$ALMOST_THERE": "即將完成!",
|
|
@@ -1196,6 +1219,7 @@
|
|
|
1196
1219
|
"HOME$OPEN_WORKSPACE": "打開工作區",
|
|
1197
1220
|
"HOME$CREATING_CONVERSATION": "正在建立會話…",
|
|
1198
1221
|
"HOME$ADD_WORKSPACES": "+ 新增工作區",
|
|
1222
|
+
"HOME$WORKSPACE_GROUP_OTHER": "其他",
|
|
1199
1223
|
"HOME$MANAGE_WORKSPACES": "管理工作區",
|
|
1200
1224
|
"HOME$MANAGE_WORKSPACES_EMPTY": "您尚無任何工作區。",
|
|
1201
1225
|
"HOME$REMOVE_WORKSPACE": "移除",
|
package/config/defaults.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_comment": "Single source of truth for version pins, ports, paths, and defaults shared across the npm and Docker install paths. Read by scripts/dev-safe.mjs, scripts/dev-with-automation.mjs, docker/entrypoint.sh (via generated defaults.env), and .github/workflows/docker.yml.",
|
|
3
3
|
"versions": {
|
|
4
|
-
"agentServer": "1.
|
|
5
|
-
"agentCanvas": "1.
|
|
6
|
-
"automation": "1.1.
|
|
4
|
+
"agentServer": "1.35.0",
|
|
5
|
+
"agentCanvas": "1.4.0",
|
|
6
|
+
"automation": "1.1.6"
|
|
7
7
|
},
|
|
8
8
|
"compatibility": {
|
|
9
9
|
"minimumAgentServer": "1.28.0"
|
|
10
10
|
},
|
|
11
11
|
"constraints": {
|
|
12
|
-
"_comment": "Temporary upper bound on the agent-client-protocol (acp) transitive dependency. openhands-sdk 1.
|
|
12
|
+
"_comment": "Temporary upper bound on the agent-client-protocol (acp) transitive dependency. openhands-sdk 1.35.0 requires agent-client-protocol>=0.10.1 with no upper bound, but acp 0.11.0 reordered the ACP prompt() arguments and breaks the SDK's ACP client (a PromptRequest validation error surfaces as 'ACP error: 2 validation errors for PromptRequest'). Pin acp <0.11 until a fixed openhands-sdk ships. Consumed by scripts/dev-safe.mjs (agent-server uvx install) and .github/workflows/mock-llm-e2e.yml (mock ACP server venv).",
|
|
13
13
|
"agentClientProtocol": "agent-client-protocol<0.11"
|
|
14
14
|
},
|
|
15
15
|
"images": {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Automation, AutomationRun, AutomationsResponse, AutomationRunsResponse } from "#/types/automation";
|
|
1
|
+
import type { Automation, AutomationRun, AutomationSpec, AutomationsResponse, AutomationRunsResponse } from "#/types/automation";
|
|
2
2
|
export interface AutomationHealthResponse {
|
|
3
3
|
status: "ok" | "error";
|
|
4
4
|
message?: string;
|
|
@@ -10,6 +10,7 @@ declare class AutomationService {
|
|
|
10
10
|
}): Promise<AutomationsResponse>;
|
|
11
11
|
static getAutomations(limit?: number, offset?: number): Promise<AutomationsResponse>;
|
|
12
12
|
static getAutomation(id: string): Promise<Automation>;
|
|
13
|
+
static createAutomation(spec: AutomationSpec): Promise<Automation>;
|
|
13
14
|
static updateAutomation(id: string, body: Partial<Automation>): Promise<Automation>;
|
|
14
15
|
static deleteAutomation(id: string): Promise<void>;
|
|
15
16
|
static dispatchAutomation(id: string): Promise<AutomationRun>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs`);require(`../../node_modules/@openhands/typescript-client/dist/clients.cjs`);const t=require(`../../utils/websocket-url.cjs`),n=require(`../backend-registry/active-store.cjs`),r=require(`../agent-server-client-options.cjs`),i=require(`../../node_modules/@openhands/typescript-client/dist/events/remote-events-list.cjs`),a=require(`../cloud/proxy.cjs`);var o=class{static async respondToConfirmation(i,o,s,c){let l=n.getActiveBackend().backend;return l.kind===`cloud`?a.callCloudProxy({backend:l,method:`POST`,hostOverride:t.buildHttpBaseUrl(o),path:`/api/conversations/${i}/events/respond_to_confirmation`,body:s,authMode:`session-api-key`,sessionApiKey:c}):new e.ConversationClient(r.getAgentServerClientOptions({conversationUrl:o,sessionApiKey:c})).respondToConfirmation(i,s)}static async getEventCount(i,o,s){let c=n.getActiveBackend().backend;return c.kind===`cloud`?a.callCloudProxy({backend:c,method:`GET`,hostOverride:t.buildHttpBaseUrl(o),path:`/api/conversations/${i}/events/count`,authMode:`session-api-key`,sessionApiKey:s}):new e.ConversationClient(r.getAgentServerClientOptions({conversationUrl:o,sessionApiKey:s})).getEventCount(i)}static async searchEvents(e,t,o,s={}){let c=n.getActiveBackend().backend,l=s.limit??100;if(c.kind===`cloud`){let t=Math.min(l,100),n=!!(s.sortOrder||s.pageId||s.timestampGte||s.timestampLt),r=new URLSearchParams;r.set(`limit`,String(t)),s.sortOrder&&r.set(`sort_order`,s.sortOrder),s.pageId&&r.set(`page_id`,s.pageId),s.timestampGte&&r.set(`timestamp__gte`,s.timestampGte),s.timestampLt&&r.set(`timestamp__lt`,s.timestampLt);let i=t=>a.callCloudProxy({backend:c,method:`GET`,path:`/api/v1/conversation/${e}/events/search?${t.toString()}`});try{let e=await i(r);return{items:e?.items??[],next_page_id:e?.next_page_id??null}}catch(e){if(!n)throw e;return console.warn(`[EventService] Cloud backend doesn't support pagination filters. Falling back to initial load only. Server needs OpenHands/OpenHands#14399.`),{items:[],next_page_id:null}}}let u=await new i.RemoteEventsList(r.getAgentServerHttpClientOptions({conversationUrl:t,sessionApiKey:o}),e).search({limit:l,...s.pageId?{page_id:s.pageId}:{},...s.sortOrder?{sort_order:s.sortOrder}:{},...s.timestampGte?{timestamp__gte:s.timestampGte}:{},...s.timestampLt?{timestamp__lt:s.timestampLt}:{}});return{items:u?.items??[],next_page_id:u?.next_page_id??null}}};exports.default=o;
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs`);require(`../../node_modules/@openhands/typescript-client/dist/clients.cjs`);const t=require(`../../utils/websocket-url.cjs`),n=require(`../backend-registry/active-store.cjs`),r=require(`../agent-server-client-options.cjs`),i=require(`../../node_modules/@openhands/typescript-client/dist/events/remote-events-list.cjs`),a=require(`../cloud/proxy.cjs`);var o=class{static async respondToConfirmation(i,o,s,c){let l=n.getActiveBackend().backend;return l.kind===`cloud`?a.callCloudProxy({backend:l,method:`POST`,hostOverride:t.buildHttpBaseUrl(o),path:`/api/conversations/${i}/events/respond_to_confirmation`,body:s,authMode:`session-api-key`,sessionApiKey:c}):new e.ConversationClient(r.getAgentServerClientOptions({conversationUrl:o,sessionApiKey:c})).respondToConfirmation(i,s)}static async getEventCount(i,o,s){let c=n.getActiveBackend().backend;return c.kind===`cloud`?a.callCloudProxy({backend:c,method:`GET`,hostOverride:t.buildHttpBaseUrl(o),path:`/api/conversations/${i}/events/count`,authMode:`session-api-key`,sessionApiKey:s}):new e.ConversationClient(r.getAgentServerClientOptions({conversationUrl:o,sessionApiKey:s})).getEventCount(i)}static async searchEvents(e,t,o,s={}){let c=n.getActiveBackend().backend,l=s.limit??100;if(c.kind===`cloud`){let t=Math.min(l,100),n=!!(s.sortOrder||s.pageId||s.timestampGte||s.timestampLt),r=new URLSearchParams;r.set(`limit`,String(t)),s.sortOrder&&r.set(`sort_order`,s.sortOrder),s.pageId&&r.set(`page_id`,s.pageId),s.timestampGte&&r.set(`timestamp__gte`,s.timestampGte),s.timestampLt&&r.set(`timestamp__lt`,s.timestampLt);let i=t=>a.callCloudProxy({backend:c,method:`GET`,path:`/api/v1/conversation/${e}/events/search?${t.toString()}`});try{let e=await i(r);return{items:e?.items??[],next_page_id:e?.next_page_id??null}}catch(e){if(!n||s.strictPagination)throw e;return console.warn(`[EventService] Cloud backend doesn't support pagination filters. Falling back to initial load only. Server needs OpenHands/OpenHands#14399.`),{items:[],next_page_id:null}}}let u=await new i.RemoteEventsList(r.getAgentServerHttpClientOptions({conversationUrl:t,sessionApiKey:o}),e).search({limit:l,...s.pageId?{page_id:s.pageId}:{},...s.sortOrder?{sort_order:s.sortOrder}:{},...s.timestampGte?{timestamp__gte:s.timestampGte}:{},...s.timestampLt?{timestamp__lt:s.timestampLt}:{}});return{items:u?.items??[],next_page_id:u?.next_page_id??null}}};exports.default=o;
|
|
2
2
|
//# sourceMappingURL=event-service.api.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-service.api.cjs","names":[],"sources":["../../../src/api/event-service/event-service.api.ts"],"sourcesContent":["import { ConversationClient } from \"@openhands/typescript-client/clients\";\nimport { RemoteEventsList } from \"@openhands/typescript-client/events/remote-events-list\";\nimport { OpenHandsEvent } from \"#/types/agent-server/core\";\nimport { buildHttpBaseUrl } from \"#/utils/websocket-url\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport {\n getAgentServerClientOptions,\n getAgentServerHttpClientOptions,\n} from \"../agent-server-client-options\";\nimport type {\n ConfirmationResponseRequest,\n ConfirmationResponseResponse,\n EventSearchOptions,\n EventSearchPage,\n} from \"./event-service.types\";\n\n/**\n * Cloud-mode REST calls are split between two upstream hosts (matching\n * OpenHands' cloud frontend):\n *\n * - **App API** (`backend.host`, default in `callCloudProxy`):\n * event *history* (`/api/v1/conversation/{id}/events/search`).\n * Persisted by the cloud backend — survives the runtime sandbox.\n *\n * - **Runtime sandbox** (extracted from `conversation.conversation_url`\n * and passed as `hostOverride`): live runtime endpoints like\n * `/api/conversations/{id}/events/count` and\n * `/api/conversations/{id}/events/respond_to_confirmation`. Auth on\n * these endpoints is `X-Session-API-Key`, not `Authorization: Bearer`.\n *\n * App API calls go directly to the cloud backend with bearer auth. Runtime\n * sandbox calls go through `/api/cloud-proxy`, which avoids depending on CORS\n * for per-conversation runtime hosts.\n *\n * Local mode keeps the existing typescript-client path: it targets the\n * conversation's host directly via typed client classes.\n */\nclass EventService {\n static async respondToConfirmation(\n conversationId: string,\n conversationUrl: string,\n request: ConfirmationResponseRequest,\n sessionApiKey?: string | null,\n ): Promise<ConfirmationResponseResponse> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<ConfirmationResponseResponse>({\n backend: active,\n method: \"POST\",\n hostOverride: buildHttpBaseUrl(conversationUrl),\n path: `/api/conversations/${conversationId}/events/respond_to_confirmation`,\n body: request,\n authMode: \"session-api-key\",\n sessionApiKey,\n });\n }\n\n return new ConversationClient(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n }),\n ).respondToConfirmation<ConfirmationResponseResponse>(\n conversationId,\n request,\n );\n }\n\n static async getEventCount(\n conversationId: string,\n conversationUrl: string,\n sessionApiKey?: string | null,\n ): Promise<number> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<number>({\n backend: active,\n method: \"GET\",\n hostOverride: buildHttpBaseUrl(conversationUrl),\n path: `/api/conversations/${conversationId}/events/count`,\n authMode: \"session-api-key\",\n sessionApiKey,\n });\n }\n\n return new ConversationClient(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n }),\n ).getEventCount(conversationId);\n }\n\n /**\n * Search events for a conversation. Returns the raw page so callers can\n * paginate (via `next_page_id`) and so REST-driven history loading can\n * tell when there are no more older events to load.\n */\n static async searchEvents(\n conversationId: string,\n conversationUrl?: string | null,\n sessionApiKey?: string | null,\n options: EventSearchOptions = {},\n ): Promise<EventSearchPage<OpenHandsEvent>> {\n const active = getActiveBackend().backend;\n const limit = options.limit ?? 100;\n\n if (active.kind === \"cloud\") {\n // Event *history* lives on the cloud App API, not the runtime\n // sandbox. Path is singular `conversation` and v1-prefixed.\n //\n // Full pagination params (sort_order, page_id, timestamp filters)\n // require the server-side fix from OpenHands/OpenHands#14399. If\n // the cloud backend hasn't been updated yet, the timestamp filters\n // trigger a 500 (str-vs-datetime comparison). We attempt the full\n // request first and fall back to a limit-only request on failure.\n const cloudLimit = Math.min(limit, 100);\n const hasFilterParams = !!(\n options.sortOrder ||\n options.pageId ||\n options.timestampGte ||\n options.timestampLt\n );\n\n const params = new URLSearchParams();\n params.set(\"limit\", String(cloudLimit));\n if (options.sortOrder) params.set(\"sort_order\", options.sortOrder);\n if (options.pageId) params.set(\"page_id\", options.pageId);\n if (options.timestampGte)\n params.set(\"timestamp__gte\", options.timestampGte);\n if (options.timestampLt) params.set(\"timestamp__lt\", options.timestampLt);\n\n const doCloudSearch = (searchParams: URLSearchParams) =>\n callCloudProxy<EventSearchPage<OpenHandsEvent>>({\n backend: active,\n method: \"GET\",\n path: `/api/v1/conversation/${conversationId}/events/search?${searchParams.toString()}`,\n });\n\n try {\n const data = await doCloudSearch(params);\n return {\n items: data?.items ?? [],\n next_page_id: data?.next_page_id ?? null,\n };\n } catch (err) {\n if (!hasFilterParams) throw err;\n\n // Server doesn't support timestamp filters yet — stop pagination\n // by returning an empty page so the UI doesn't retry indefinitely.\n // A limit-only fallback would return the same most-recent events\n // already in the store, which get deduped but keep hasMore=true.\n console.warn(\n \"[EventService] Cloud backend doesn't support pagination filters. \" +\n \"Falling back to initial load only. \" +\n \"Server needs OpenHands/OpenHands#14399.\",\n );\n return { items: [], next_page_id: null };\n }\n }\n\n const page = await new RemoteEventsList(\n getAgentServerHttpClientOptions({ conversationUrl, sessionApiKey }),\n conversationId,\n ).search({\n limit,\n ...(options.pageId ? { page_id: options.pageId } : {}),\n ...(options.sortOrder ? { sort_order: options.sortOrder } : {}),\n ...(options.timestampGte ? { timestamp__gte: options.timestampGte } : {}),\n ...(options.timestampLt ? { timestamp__lt: options.timestampLt } : {}),\n });\n\n return {\n items: (page?.items ?? []) as OpenHandsEvent[],\n next_page_id: page?.next_page_id ?? null,\n };\n }\n}\n\nexport default EventService;\n"],"mappings":"sfAsCA,IAAM,EAAN,KAAmB,CACjB,aAAa,sBACX,EACA,EACA,EACA,EACuC,CACvC,IAAM,EAAS,EAAA,kBAAkB,CAAC,QAclC,OAZI,EAAO,OAAS,QACX,EAAA,eAA6C,CAClD,QAAS,EACT,OAAQ,OACR,aAAc,EAAA,iBAAiB,EAAgB,CAC/C,KAAM,sBAAsB,EAAe,iCAC3C,KAAM,EACN,SAAU,kBACV,gBACD,CAAC,CAGG,IAAI,EAAA,mBACT,EAAA,4BAA4B,CAC1B,kBACA,gBACD,CAAC,CACH,CAAC,sBACA,EACA,EACD,CAGH,aAAa,cACX,EACA,EACA,EACiB,CACjB,IAAM,EAAS,EAAA,kBAAkB,CAAC,QAalC,OAXI,EAAO,OAAS,QACX,EAAA,eAAuB,CAC5B,QAAS,EACT,OAAQ,MACR,aAAc,EAAA,iBAAiB,EAAgB,CAC/C,KAAM,sBAAsB,EAAe,eAC3C,SAAU,kBACV,gBACD,CAAC,CAGG,IAAI,EAAA,mBACT,EAAA,4BAA4B,CAC1B,kBACA,gBACD,CAAC,CACH,CAAC,cAAc,EAAe,CAQjC,aAAa,aACX,EACA,EACA,EACA,EAA8B,EAAE,CACU,CAC1C,IAAM,EAAS,EAAA,kBAAkB,CAAC,QAC5B,EAAQ,EAAQ,OAAS,IAE/B,GAAI,EAAO,OAAS,QAAS,CAS3B,IAAM,EAAa,KAAK,IAAI,EAAO,IAAI,CACjC,EAAkB,CAAC,EACvB,EAAQ,WACR,EAAQ,QACR,EAAQ,cACR,EAAQ,aAGJ,EAAS,IAAI,gBACnB,EAAO,IAAI,QAAS,OAAO,EAAW,CAAC,CACnC,EAAQ,WAAW,EAAO,IAAI,aAAc,EAAQ,UAAU,CAC9D,EAAQ,QAAQ,EAAO,IAAI,UAAW,EAAQ,OAAO,CACrD,EAAQ,cACV,EAAO,IAAI,iBAAkB,EAAQ,aAAa,CAChD,EAAQ,aAAa,EAAO,IAAI,gBAAiB,EAAQ,YAAY,CAEzE,IAAM,EAAiB,GACrB,EAAA,eAAgD,CAC9C,QAAS,EACT,OAAQ,MACR,KAAM,wBAAwB,EAAe,iBAAiB,EAAa,UAAU,GACtF,CAAC,CAEJ,GAAI,CACF,IAAM,EAAO,MAAM,EAAc,EAAO,CACxC,MAAO,CACL,MAAO,GAAM,OAAS,EAAE,CACxB,aAAc,GAAM,cAAgB,KACrC,OACM,EAAK,
|
|
1
|
+
{"version":3,"file":"event-service.api.cjs","names":[],"sources":["../../../src/api/event-service/event-service.api.ts"],"sourcesContent":["import { ConversationClient } from \"@openhands/typescript-client/clients\";\nimport { RemoteEventsList } from \"@openhands/typescript-client/events/remote-events-list\";\nimport { OpenHandsEvent } from \"#/types/agent-server/core\";\nimport { buildHttpBaseUrl } from \"#/utils/websocket-url\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport {\n getAgentServerClientOptions,\n getAgentServerHttpClientOptions,\n} from \"../agent-server-client-options\";\nimport type {\n ConfirmationResponseRequest,\n ConfirmationResponseResponse,\n EventSearchOptions,\n EventSearchPage,\n} from \"./event-service.types\";\n\n/**\n * Cloud-mode REST calls are split between two upstream hosts (matching\n * OpenHands' cloud frontend):\n *\n * - **App API** (`backend.host`, default in `callCloudProxy`):\n * event *history* (`/api/v1/conversation/{id}/events/search`).\n * Persisted by the cloud backend — survives the runtime sandbox.\n *\n * - **Runtime sandbox** (extracted from `conversation.conversation_url`\n * and passed as `hostOverride`): live runtime endpoints like\n * `/api/conversations/{id}/events/count` and\n * `/api/conversations/{id}/events/respond_to_confirmation`. Auth on\n * these endpoints is `X-Session-API-Key`, not `Authorization: Bearer`.\n *\n * App API calls go directly to the cloud backend with bearer auth. Runtime\n * sandbox calls go through `/api/cloud-proxy`, which avoids depending on CORS\n * for per-conversation runtime hosts.\n *\n * Local mode keeps the existing typescript-client path: it targets the\n * conversation's host directly via typed client classes.\n */\nclass EventService {\n static async respondToConfirmation(\n conversationId: string,\n conversationUrl: string,\n request: ConfirmationResponseRequest,\n sessionApiKey?: string | null,\n ): Promise<ConfirmationResponseResponse> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<ConfirmationResponseResponse>({\n backend: active,\n method: \"POST\",\n hostOverride: buildHttpBaseUrl(conversationUrl),\n path: `/api/conversations/${conversationId}/events/respond_to_confirmation`,\n body: request,\n authMode: \"session-api-key\",\n sessionApiKey,\n });\n }\n\n return new ConversationClient(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n }),\n ).respondToConfirmation<ConfirmationResponseResponse>(\n conversationId,\n request,\n );\n }\n\n static async getEventCount(\n conversationId: string,\n conversationUrl: string,\n sessionApiKey?: string | null,\n ): Promise<number> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<number>({\n backend: active,\n method: \"GET\",\n hostOverride: buildHttpBaseUrl(conversationUrl),\n path: `/api/conversations/${conversationId}/events/count`,\n authMode: \"session-api-key\",\n sessionApiKey,\n });\n }\n\n return new ConversationClient(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n }),\n ).getEventCount(conversationId);\n }\n\n /**\n * Search events for a conversation. Returns the raw page so callers can\n * paginate (via `next_page_id`) and so REST-driven history loading can\n * tell when there are no more older events to load.\n */\n static async searchEvents(\n conversationId: string,\n conversationUrl?: string | null,\n sessionApiKey?: string | null,\n options: EventSearchOptions = {},\n ): Promise<EventSearchPage<OpenHandsEvent>> {\n const active = getActiveBackend().backend;\n const limit = options.limit ?? 100;\n\n if (active.kind === \"cloud\") {\n // Event *history* lives on the cloud App API, not the runtime\n // sandbox. Path is singular `conversation` and v1-prefixed.\n //\n // Full pagination params (sort_order, page_id, timestamp filters)\n // require the server-side fix from OpenHands/OpenHands#14399. If\n // the cloud backend hasn't been updated yet, the timestamp filters\n // trigger a 500 (str-vs-datetime comparison). We attempt the full\n // request first and fall back to a limit-only request on failure.\n const cloudLimit = Math.min(limit, 100);\n const hasFilterParams = !!(\n options.sortOrder ||\n options.pageId ||\n options.timestampGte ||\n options.timestampLt\n );\n\n const params = new URLSearchParams();\n params.set(\"limit\", String(cloudLimit));\n if (options.sortOrder) params.set(\"sort_order\", options.sortOrder);\n if (options.pageId) params.set(\"page_id\", options.pageId);\n if (options.timestampGte)\n params.set(\"timestamp__gte\", options.timestampGte);\n if (options.timestampLt) params.set(\"timestamp__lt\", options.timestampLt);\n\n const doCloudSearch = (searchParams: URLSearchParams) =>\n callCloudProxy<EventSearchPage<OpenHandsEvent>>({\n backend: active,\n method: \"GET\",\n path: `/api/v1/conversation/${conversationId}/events/search?${searchParams.toString()}`,\n });\n\n try {\n const data = await doCloudSearch(params);\n return {\n items: data?.items ?? [],\n next_page_id: data?.next_page_id ?? null,\n };\n } catch (err) {\n if (!hasFilterParams) throw err;\n if (options.strictPagination) throw err;\n\n // Server doesn't support timestamp filters yet — stop pagination\n // by returning an empty page so the UI doesn't retry indefinitely.\n // A limit-only fallback would return the same most-recent events\n // already in the store, which get deduped but keep hasMore=true.\n console.warn(\n \"[EventService] Cloud backend doesn't support pagination filters. \" +\n \"Falling back to initial load only. \" +\n \"Server needs OpenHands/OpenHands#14399.\",\n );\n return { items: [], next_page_id: null };\n }\n }\n\n const page = await new RemoteEventsList(\n getAgentServerHttpClientOptions({ conversationUrl, sessionApiKey }),\n conversationId,\n ).search({\n limit,\n ...(options.pageId ? { page_id: options.pageId } : {}),\n ...(options.sortOrder ? { sort_order: options.sortOrder } : {}),\n ...(options.timestampGte ? { timestamp__gte: options.timestampGte } : {}),\n ...(options.timestampLt ? { timestamp__lt: options.timestampLt } : {}),\n });\n\n return {\n items: (page?.items ?? []) as OpenHandsEvent[],\n next_page_id: page?.next_page_id ?? null,\n };\n }\n}\n\nexport default EventService;\n"],"mappings":"sfAsCA,IAAM,EAAN,KAAmB,CACjB,aAAa,sBACX,EACA,EACA,EACA,EACuC,CACvC,IAAM,EAAS,EAAA,kBAAkB,CAAC,QAclC,OAZI,EAAO,OAAS,QACX,EAAA,eAA6C,CAClD,QAAS,EACT,OAAQ,OACR,aAAc,EAAA,iBAAiB,EAAgB,CAC/C,KAAM,sBAAsB,EAAe,iCAC3C,KAAM,EACN,SAAU,kBACV,gBACD,CAAC,CAGG,IAAI,EAAA,mBACT,EAAA,4BAA4B,CAC1B,kBACA,gBACD,CAAC,CACH,CAAC,sBACA,EACA,EACD,CAGH,aAAa,cACX,EACA,EACA,EACiB,CACjB,IAAM,EAAS,EAAA,kBAAkB,CAAC,QAalC,OAXI,EAAO,OAAS,QACX,EAAA,eAAuB,CAC5B,QAAS,EACT,OAAQ,MACR,aAAc,EAAA,iBAAiB,EAAgB,CAC/C,KAAM,sBAAsB,EAAe,eAC3C,SAAU,kBACV,gBACD,CAAC,CAGG,IAAI,EAAA,mBACT,EAAA,4BAA4B,CAC1B,kBACA,gBACD,CAAC,CACH,CAAC,cAAc,EAAe,CAQjC,aAAa,aACX,EACA,EACA,EACA,EAA8B,EAAE,CACU,CAC1C,IAAM,EAAS,EAAA,kBAAkB,CAAC,QAC5B,EAAQ,EAAQ,OAAS,IAE/B,GAAI,EAAO,OAAS,QAAS,CAS3B,IAAM,EAAa,KAAK,IAAI,EAAO,IAAI,CACjC,EAAkB,CAAC,EACvB,EAAQ,WACR,EAAQ,QACR,EAAQ,cACR,EAAQ,aAGJ,EAAS,IAAI,gBACnB,EAAO,IAAI,QAAS,OAAO,EAAW,CAAC,CACnC,EAAQ,WAAW,EAAO,IAAI,aAAc,EAAQ,UAAU,CAC9D,EAAQ,QAAQ,EAAO,IAAI,UAAW,EAAQ,OAAO,CACrD,EAAQ,cACV,EAAO,IAAI,iBAAkB,EAAQ,aAAa,CAChD,EAAQ,aAAa,EAAO,IAAI,gBAAiB,EAAQ,YAAY,CAEzE,IAAM,EAAiB,GACrB,EAAA,eAAgD,CAC9C,QAAS,EACT,OAAQ,MACR,KAAM,wBAAwB,EAAe,iBAAiB,EAAa,UAAU,GACtF,CAAC,CAEJ,GAAI,CACF,IAAM,EAAO,MAAM,EAAc,EAAO,CACxC,MAAO,CACL,MAAO,GAAM,OAAS,EAAE,CACxB,aAAc,GAAM,cAAgB,KACrC,OACM,EAAK,CAEZ,GADI,CAAC,GACD,EAAQ,iBAAkB,MAAM,EAWpC,OALA,QAAQ,KACN,8IAGD,CACM,CAAE,MAAO,EAAE,CAAE,aAAc,KAAM,EAI5C,IAAM,EAAO,MAAM,IAAI,EAAA,iBACrB,EAAA,gCAAgC,CAAE,kBAAiB,gBAAe,CAAC,CACnE,EACD,CAAC,OAAO,CACP,QACA,GAAI,EAAQ,OAAS,CAAE,QAAS,EAAQ,OAAQ,CAAG,EAAE,CACrD,GAAI,EAAQ,UAAY,CAAE,WAAY,EAAQ,UAAW,CAAG,EAAE,CAC9D,GAAI,EAAQ,aAAe,CAAE,eAAgB,EAAQ,aAAc,CAAG,EAAE,CACxE,GAAI,EAAQ,YAAc,CAAE,cAAe,EAAQ,YAAa,CAAG,EAAE,CACtE,CAAC,CAEF,MAAO,CACL,MAAQ,GAAM,OAAS,EAAE,CACzB,aAAc,GAAM,cAAgB,KACrC"}
|
|
@@ -53,7 +53,7 @@ var s = class {
|
|
|
53
53
|
next_page_id: e?.next_page_id ?? null
|
|
54
54
|
};
|
|
55
55
|
} catch (e) {
|
|
56
|
-
if (!n) throw e;
|
|
56
|
+
if (!n || s.strictPagination) throw e;
|
|
57
57
|
return console.warn("[EventService] Cloud backend doesn't support pagination filters. Falling back to initial load only. Server needs OpenHands/OpenHands#14399."), {
|
|
58
58
|
items: [],
|
|
59
59
|
next_page_id: null
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-service.api.js","names":[],"sources":["../../../src/api/event-service/event-service.api.ts"],"sourcesContent":["import { ConversationClient } from \"@openhands/typescript-client/clients\";\nimport { RemoteEventsList } from \"@openhands/typescript-client/events/remote-events-list\";\nimport { OpenHandsEvent } from \"#/types/agent-server/core\";\nimport { buildHttpBaseUrl } from \"#/utils/websocket-url\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport {\n getAgentServerClientOptions,\n getAgentServerHttpClientOptions,\n} from \"../agent-server-client-options\";\nimport type {\n ConfirmationResponseRequest,\n ConfirmationResponseResponse,\n EventSearchOptions,\n EventSearchPage,\n} from \"./event-service.types\";\n\n/**\n * Cloud-mode REST calls are split between two upstream hosts (matching\n * OpenHands' cloud frontend):\n *\n * - **App API** (`backend.host`, default in `callCloudProxy`):\n * event *history* (`/api/v1/conversation/{id}/events/search`).\n * Persisted by the cloud backend — survives the runtime sandbox.\n *\n * - **Runtime sandbox** (extracted from `conversation.conversation_url`\n * and passed as `hostOverride`): live runtime endpoints like\n * `/api/conversations/{id}/events/count` and\n * `/api/conversations/{id}/events/respond_to_confirmation`. Auth on\n * these endpoints is `X-Session-API-Key`, not `Authorization: Bearer`.\n *\n * App API calls go directly to the cloud backend with bearer auth. Runtime\n * sandbox calls go through `/api/cloud-proxy`, which avoids depending on CORS\n * for per-conversation runtime hosts.\n *\n * Local mode keeps the existing typescript-client path: it targets the\n * conversation's host directly via typed client classes.\n */\nclass EventService {\n static async respondToConfirmation(\n conversationId: string,\n conversationUrl: string,\n request: ConfirmationResponseRequest,\n sessionApiKey?: string | null,\n ): Promise<ConfirmationResponseResponse> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<ConfirmationResponseResponse>({\n backend: active,\n method: \"POST\",\n hostOverride: buildHttpBaseUrl(conversationUrl),\n path: `/api/conversations/${conversationId}/events/respond_to_confirmation`,\n body: request,\n authMode: \"session-api-key\",\n sessionApiKey,\n });\n }\n\n return new ConversationClient(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n }),\n ).respondToConfirmation<ConfirmationResponseResponse>(\n conversationId,\n request,\n );\n }\n\n static async getEventCount(\n conversationId: string,\n conversationUrl: string,\n sessionApiKey?: string | null,\n ): Promise<number> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<number>({\n backend: active,\n method: \"GET\",\n hostOverride: buildHttpBaseUrl(conversationUrl),\n path: `/api/conversations/${conversationId}/events/count`,\n authMode: \"session-api-key\",\n sessionApiKey,\n });\n }\n\n return new ConversationClient(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n }),\n ).getEventCount(conversationId);\n }\n\n /**\n * Search events for a conversation. Returns the raw page so callers can\n * paginate (via `next_page_id`) and so REST-driven history loading can\n * tell when there are no more older events to load.\n */\n static async searchEvents(\n conversationId: string,\n conversationUrl?: string | null,\n sessionApiKey?: string | null,\n options: EventSearchOptions = {},\n ): Promise<EventSearchPage<OpenHandsEvent>> {\n const active = getActiveBackend().backend;\n const limit = options.limit ?? 100;\n\n if (active.kind === \"cloud\") {\n // Event *history* lives on the cloud App API, not the runtime\n // sandbox. Path is singular `conversation` and v1-prefixed.\n //\n // Full pagination params (sort_order, page_id, timestamp filters)\n // require the server-side fix from OpenHands/OpenHands#14399. If\n // the cloud backend hasn't been updated yet, the timestamp filters\n // trigger a 500 (str-vs-datetime comparison). We attempt the full\n // request first and fall back to a limit-only request on failure.\n const cloudLimit = Math.min(limit, 100);\n const hasFilterParams = !!(\n options.sortOrder ||\n options.pageId ||\n options.timestampGte ||\n options.timestampLt\n );\n\n const params = new URLSearchParams();\n params.set(\"limit\", String(cloudLimit));\n if (options.sortOrder) params.set(\"sort_order\", options.sortOrder);\n if (options.pageId) params.set(\"page_id\", options.pageId);\n if (options.timestampGte)\n params.set(\"timestamp__gte\", options.timestampGte);\n if (options.timestampLt) params.set(\"timestamp__lt\", options.timestampLt);\n\n const doCloudSearch = (searchParams: URLSearchParams) =>\n callCloudProxy<EventSearchPage<OpenHandsEvent>>({\n backend: active,\n method: \"GET\",\n path: `/api/v1/conversation/${conversationId}/events/search?${searchParams.toString()}`,\n });\n\n try {\n const data = await doCloudSearch(params);\n return {\n items: data?.items ?? [],\n next_page_id: data?.next_page_id ?? null,\n };\n } catch (err) {\n if (!hasFilterParams) throw err;\n\n // Server doesn't support timestamp filters yet — stop pagination\n // by returning an empty page so the UI doesn't retry indefinitely.\n // A limit-only fallback would return the same most-recent events\n // already in the store, which get deduped but keep hasMore=true.\n console.warn(\n \"[EventService] Cloud backend doesn't support pagination filters. \" +\n \"Falling back to initial load only. \" +\n \"Server needs OpenHands/OpenHands#14399.\",\n );\n return { items: [], next_page_id: null };\n }\n }\n\n const page = await new RemoteEventsList(\n getAgentServerHttpClientOptions({ conversationUrl, sessionApiKey }),\n conversationId,\n ).search({\n limit,\n ...(options.pageId ? { page_id: options.pageId } : {}),\n ...(options.sortOrder ? { sort_order: options.sortOrder } : {}),\n ...(options.timestampGte ? { timestamp__gte: options.timestampGte } : {}),\n ...(options.timestampLt ? { timestamp__lt: options.timestampLt } : {}),\n });\n\n return {\n items: (page?.items ?? []) as OpenHandsEvent[],\n next_page_id: page?.next_page_id ?? null,\n };\n }\n}\n\nexport default EventService;\n"],"mappings":";;;;;;;;AAsCA,IAAM,IAAN,MAAmB;CACjB,aAAa,sBACX,GACA,GACA,GACA,GACuC;EACvC,IAAM,IAAS,GAAkB,CAAC;AAclC,SAZI,EAAO,SAAS,UACX,EAA6C;GAClD,SAAS;GACT,QAAQ;GACR,cAAc,EAAiB,EAAgB;GAC/C,MAAM,sBAAsB,EAAe;GAC3C,MAAM;GACN,UAAU;GACV;GACD,CAAC,GAGG,IAAI,EACT,EAA4B;GAC1B;GACA;GACD,CAAC,CACH,CAAC,sBACA,GACA,EACD;;CAGH,aAAa,cACX,GACA,GACA,GACiB;EACjB,IAAM,IAAS,GAAkB,CAAC;AAalC,SAXI,EAAO,SAAS,UACX,EAAuB;GAC5B,SAAS;GACT,QAAQ;GACR,cAAc,EAAiB,EAAgB;GAC/C,MAAM,sBAAsB,EAAe;GAC3C,UAAU;GACV;GACD,CAAC,GAGG,IAAI,EACT,EAA4B;GAC1B;GACA;GACD,CAAC,CACH,CAAC,cAAc,EAAe;;CAQjC,aAAa,aACX,GACA,GACA,GACA,IAA8B,EAAE,EACU;EAC1C,IAAM,IAAS,GAAkB,CAAC,SAC5B,IAAQ,EAAQ,SAAS;AAE/B,MAAI,EAAO,SAAS,SAAS;GAS3B,IAAM,IAAa,KAAK,IAAI,GAAO,IAAI,EACjC,IAAkB,CAAC,EACvB,EAAQ,aACR,EAAQ,UACR,EAAQ,gBACR,EAAQ,cAGJ,IAAS,IAAI,iBAAiB;AAMpC,GALA,EAAO,IAAI,SAAS,OAAO,EAAW,CAAC,EACnC,EAAQ,aAAW,EAAO,IAAI,cAAc,EAAQ,UAAU,EAC9D,EAAQ,UAAQ,EAAO,IAAI,WAAW,EAAQ,OAAO,EACrD,EAAQ,gBACV,EAAO,IAAI,kBAAkB,EAAQ,aAAa,EAChD,EAAQ,eAAa,EAAO,IAAI,iBAAiB,EAAQ,YAAY;GAEzE,IAAM,KAAiB,MACrB,EAAgD;IAC9C,SAAS;IACT,QAAQ;IACR,MAAM,wBAAwB,EAAe,iBAAiB,EAAa,UAAU;IACtF,CAAC;AAEJ,OAAI;IACF,IAAM,IAAO,MAAM,EAAc,EAAO;AACxC,WAAO;KACL,OAAO,GAAM,SAAS,EAAE;KACxB,cAAc,GAAM,gBAAgB;KACrC;YACM,GAAK;
|
|
1
|
+
{"version":3,"file":"event-service.api.js","names":[],"sources":["../../../src/api/event-service/event-service.api.ts"],"sourcesContent":["import { ConversationClient } from \"@openhands/typescript-client/clients\";\nimport { RemoteEventsList } from \"@openhands/typescript-client/events/remote-events-list\";\nimport { OpenHandsEvent } from \"#/types/agent-server/core\";\nimport { buildHttpBaseUrl } from \"#/utils/websocket-url\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport {\n getAgentServerClientOptions,\n getAgentServerHttpClientOptions,\n} from \"../agent-server-client-options\";\nimport type {\n ConfirmationResponseRequest,\n ConfirmationResponseResponse,\n EventSearchOptions,\n EventSearchPage,\n} from \"./event-service.types\";\n\n/**\n * Cloud-mode REST calls are split between two upstream hosts (matching\n * OpenHands' cloud frontend):\n *\n * - **App API** (`backend.host`, default in `callCloudProxy`):\n * event *history* (`/api/v1/conversation/{id}/events/search`).\n * Persisted by the cloud backend — survives the runtime sandbox.\n *\n * - **Runtime sandbox** (extracted from `conversation.conversation_url`\n * and passed as `hostOverride`): live runtime endpoints like\n * `/api/conversations/{id}/events/count` and\n * `/api/conversations/{id}/events/respond_to_confirmation`. Auth on\n * these endpoints is `X-Session-API-Key`, not `Authorization: Bearer`.\n *\n * App API calls go directly to the cloud backend with bearer auth. Runtime\n * sandbox calls go through `/api/cloud-proxy`, which avoids depending on CORS\n * for per-conversation runtime hosts.\n *\n * Local mode keeps the existing typescript-client path: it targets the\n * conversation's host directly via typed client classes.\n */\nclass EventService {\n static async respondToConfirmation(\n conversationId: string,\n conversationUrl: string,\n request: ConfirmationResponseRequest,\n sessionApiKey?: string | null,\n ): Promise<ConfirmationResponseResponse> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<ConfirmationResponseResponse>({\n backend: active,\n method: \"POST\",\n hostOverride: buildHttpBaseUrl(conversationUrl),\n path: `/api/conversations/${conversationId}/events/respond_to_confirmation`,\n body: request,\n authMode: \"session-api-key\",\n sessionApiKey,\n });\n }\n\n return new ConversationClient(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n }),\n ).respondToConfirmation<ConfirmationResponseResponse>(\n conversationId,\n request,\n );\n }\n\n static async getEventCount(\n conversationId: string,\n conversationUrl: string,\n sessionApiKey?: string | null,\n ): Promise<number> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<number>({\n backend: active,\n method: \"GET\",\n hostOverride: buildHttpBaseUrl(conversationUrl),\n path: `/api/conversations/${conversationId}/events/count`,\n authMode: \"session-api-key\",\n sessionApiKey,\n });\n }\n\n return new ConversationClient(\n getAgentServerClientOptions({\n conversationUrl,\n sessionApiKey,\n }),\n ).getEventCount(conversationId);\n }\n\n /**\n * Search events for a conversation. Returns the raw page so callers can\n * paginate (via `next_page_id`) and so REST-driven history loading can\n * tell when there are no more older events to load.\n */\n static async searchEvents(\n conversationId: string,\n conversationUrl?: string | null,\n sessionApiKey?: string | null,\n options: EventSearchOptions = {},\n ): Promise<EventSearchPage<OpenHandsEvent>> {\n const active = getActiveBackend().backend;\n const limit = options.limit ?? 100;\n\n if (active.kind === \"cloud\") {\n // Event *history* lives on the cloud App API, not the runtime\n // sandbox. Path is singular `conversation` and v1-prefixed.\n //\n // Full pagination params (sort_order, page_id, timestamp filters)\n // require the server-side fix from OpenHands/OpenHands#14399. If\n // the cloud backend hasn't been updated yet, the timestamp filters\n // trigger a 500 (str-vs-datetime comparison). We attempt the full\n // request first and fall back to a limit-only request on failure.\n const cloudLimit = Math.min(limit, 100);\n const hasFilterParams = !!(\n options.sortOrder ||\n options.pageId ||\n options.timestampGte ||\n options.timestampLt\n );\n\n const params = new URLSearchParams();\n params.set(\"limit\", String(cloudLimit));\n if (options.sortOrder) params.set(\"sort_order\", options.sortOrder);\n if (options.pageId) params.set(\"page_id\", options.pageId);\n if (options.timestampGte)\n params.set(\"timestamp__gte\", options.timestampGte);\n if (options.timestampLt) params.set(\"timestamp__lt\", options.timestampLt);\n\n const doCloudSearch = (searchParams: URLSearchParams) =>\n callCloudProxy<EventSearchPage<OpenHandsEvent>>({\n backend: active,\n method: \"GET\",\n path: `/api/v1/conversation/${conversationId}/events/search?${searchParams.toString()}`,\n });\n\n try {\n const data = await doCloudSearch(params);\n return {\n items: data?.items ?? [],\n next_page_id: data?.next_page_id ?? null,\n };\n } catch (err) {\n if (!hasFilterParams) throw err;\n if (options.strictPagination) throw err;\n\n // Server doesn't support timestamp filters yet — stop pagination\n // by returning an empty page so the UI doesn't retry indefinitely.\n // A limit-only fallback would return the same most-recent events\n // already in the store, which get deduped but keep hasMore=true.\n console.warn(\n \"[EventService] Cloud backend doesn't support pagination filters. \" +\n \"Falling back to initial load only. \" +\n \"Server needs OpenHands/OpenHands#14399.\",\n );\n return { items: [], next_page_id: null };\n }\n }\n\n const page = await new RemoteEventsList(\n getAgentServerHttpClientOptions({ conversationUrl, sessionApiKey }),\n conversationId,\n ).search({\n limit,\n ...(options.pageId ? { page_id: options.pageId } : {}),\n ...(options.sortOrder ? { sort_order: options.sortOrder } : {}),\n ...(options.timestampGte ? { timestamp__gte: options.timestampGte } : {}),\n ...(options.timestampLt ? { timestamp__lt: options.timestampLt } : {}),\n });\n\n return {\n items: (page?.items ?? []) as OpenHandsEvent[],\n next_page_id: page?.next_page_id ?? null,\n };\n }\n}\n\nexport default EventService;\n"],"mappings":";;;;;;;;AAsCA,IAAM,IAAN,MAAmB;CACjB,aAAa,sBACX,GACA,GACA,GACA,GACuC;EACvC,IAAM,IAAS,GAAkB,CAAC;AAclC,SAZI,EAAO,SAAS,UACX,EAA6C;GAClD,SAAS;GACT,QAAQ;GACR,cAAc,EAAiB,EAAgB;GAC/C,MAAM,sBAAsB,EAAe;GAC3C,MAAM;GACN,UAAU;GACV;GACD,CAAC,GAGG,IAAI,EACT,EAA4B;GAC1B;GACA;GACD,CAAC,CACH,CAAC,sBACA,GACA,EACD;;CAGH,aAAa,cACX,GACA,GACA,GACiB;EACjB,IAAM,IAAS,GAAkB,CAAC;AAalC,SAXI,EAAO,SAAS,UACX,EAAuB;GAC5B,SAAS;GACT,QAAQ;GACR,cAAc,EAAiB,EAAgB;GAC/C,MAAM,sBAAsB,EAAe;GAC3C,UAAU;GACV;GACD,CAAC,GAGG,IAAI,EACT,EAA4B;GAC1B;GACA;GACD,CAAC,CACH,CAAC,cAAc,EAAe;;CAQjC,aAAa,aACX,GACA,GACA,GACA,IAA8B,EAAE,EACU;EAC1C,IAAM,IAAS,GAAkB,CAAC,SAC5B,IAAQ,EAAQ,SAAS;AAE/B,MAAI,EAAO,SAAS,SAAS;GAS3B,IAAM,IAAa,KAAK,IAAI,GAAO,IAAI,EACjC,IAAkB,CAAC,EACvB,EAAQ,aACR,EAAQ,UACR,EAAQ,gBACR,EAAQ,cAGJ,IAAS,IAAI,iBAAiB;AAMpC,GALA,EAAO,IAAI,SAAS,OAAO,EAAW,CAAC,EACnC,EAAQ,aAAW,EAAO,IAAI,cAAc,EAAQ,UAAU,EAC9D,EAAQ,UAAQ,EAAO,IAAI,WAAW,EAAQ,OAAO,EACrD,EAAQ,gBACV,EAAO,IAAI,kBAAkB,EAAQ,aAAa,EAChD,EAAQ,eAAa,EAAO,IAAI,iBAAiB,EAAQ,YAAY;GAEzE,IAAM,KAAiB,MACrB,EAAgD;IAC9C,SAAS;IACT,QAAQ;IACR,MAAM,wBAAwB,EAAe,iBAAiB,EAAa,UAAU;IACtF,CAAC;AAEJ,OAAI;IACF,IAAM,IAAO,MAAM,EAAc,EAAO;AACxC,WAAO;KACL,OAAO,GAAM,SAAS,EAAE;KACxB,cAAc,GAAM,gBAAgB;KACrC;YACM,GAAK;AAEZ,QADI,CAAC,KACD,EAAQ,iBAAkB,OAAM;AAWpC,WALA,QAAQ,KACN,8IAGD,EACM;KAAE,OAAO,EAAE;KAAE,cAAc;KAAM;;;EAI5C,IAAM,IAAO,MAAM,IAAI,EACrB,EAAgC;GAAE;GAAiB;GAAe,CAAC,EACnE,EACD,CAAC,OAAO;GACP;GACA,GAAI,EAAQ,SAAS,EAAE,SAAS,EAAQ,QAAQ,GAAG,EAAE;GACrD,GAAI,EAAQ,YAAY,EAAE,YAAY,EAAQ,WAAW,GAAG,EAAE;GAC9D,GAAI,EAAQ,eAAe,EAAE,gBAAgB,EAAQ,cAAc,GAAG,EAAE;GACxE,GAAI,EAAQ,cAAc,EAAE,eAAe,EAAQ,aAAa,GAAG,EAAE;GACtE,CAAC;AAEF,SAAO;GACL,OAAQ,GAAM,SAAS,EAAE;GACzB,cAAc,GAAM,gBAAgB;GACrC"}
|
|
@@ -17,6 +17,12 @@ export interface EventSearchOptions {
|
|
|
17
17
|
timestampGte?: string;
|
|
18
18
|
/** Filter: event timestamp < this value (ISO 8601). */
|
|
19
19
|
timestampLt?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Surface unsupported cloud pagination instead of degrading to an empty
|
|
22
|
+
* page. Callers that require a complete result (such as transcript export)
|
|
23
|
+
* must set this so a partial history is never mistaken for exhaustion.
|
|
24
|
+
*/
|
|
25
|
+
strictPagination?: boolean;
|
|
20
26
|
}
|
|
21
27
|
export interface EventSearchPage<TEvent> {
|
|
22
28
|
items: TEvent[];
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../backend-registry/active-store.cjs`),t=require(`../agent-server-client-options.cjs`),n=require(`../cloud/proxy.cjs`),r=require(`../../node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.cjs`),i=require(`../../utils/git-status-mapper.cjs`);function a(e){return e.startsWith(`/`)?e:`/${e}`}var o=class{static async getGitChanges(o,s,c,l){let u=e.getActiveBackend().backend;if(u.kind===`cloud`&&o){let e=new URLSearchParams;e.set(`path`,a(l));let t=await n.callCloudProxy({backend:u,method:`GET`,path:`/api/v1/app-conversations/${o}/git/changes?${e.toString()}`});if(!Array.isArray(t))throw Error(`Invalid response from runtime - runtime may be unavailable`);return t.map(e=>({status:i.mapAnyGitStatusToClientStatus(String(e.status)),path:e.path}))}let d=await new r.RemoteWorkspace(t.getAgentServerClientOptions({conversationUrl:s,sessionApiKey:c})).gitChanges(l
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../backend-registry/active-store.cjs`),t=require(`../agent-server-client-options.cjs`),n=require(`../cloud/proxy.cjs`),r=require(`../../node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.cjs`),i=require(`../../utils/git-status-mapper.cjs`);function a(e){return e.startsWith(`/`)?e:`/${e}`}var o=class{static async getGitChanges(o,s,c,l){let u=e.getActiveBackend().backend;if(u.kind===`cloud`&&o){let e=new URLSearchParams;e.set(`path`,a(l));let t=await n.callCloudProxy({backend:u,method:`GET`,path:`/api/v1/app-conversations/${o}/git/changes?${e.toString()}`});if(!Array.isArray(t))throw Error(`Invalid response from runtime - runtime may be unavailable`);return t.map(e=>({status:i.mapAnyGitStatusToClientStatus(String(e.status)),path:e.path}))}let d=await new r.RemoteWorkspace(t.getAgentServerClientOptions({conversationUrl:s,sessionApiKey:c})).gitChanges(l);if(!Array.isArray(d))throw Error(`Invalid response from runtime - runtime may be unavailable`);return d.map(e=>({status:i.mapAnyGitStatusToClientStatus(String(e.status)),path:e.path}))}static async getGitChangeDiff(i,o,s,c){let l=e.getActiveBackend().backend;if(l.kind===`cloud`&&i){let e=new URLSearchParams;e.set(`path`,a(c));let t=await n.callCloudProxy({backend:l,method:`GET`,path:`/api/v1/app-conversations/${i}/git/diff?${e.toString()}`});return{modified:t?.modified??``,original:t?.original??``,...t?.diff?{diff:t.diff}:{}}}let u=await new r.RemoteWorkspace(t.getAgentServerClientOptions({conversationUrl:o,sessionApiKey:s})).gitDiff(c);return{modified:u.modified??``,original:u.original??``,...u.diff?{diff:u.diff}:{}}}};exports.default=o;
|
|
2
2
|
//# sourceMappingURL=agent-server-git-service.api.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-server-git-service.api.cjs","names":[],"sources":["../../../src/api/git-service/agent-server-git-service.api.ts"],"sourcesContent":["import { RemoteWorkspace } from \"@openhands/typescript-client/workspace/remote-workspace\";\nimport { mapAnyGitStatusToClientStatus } from \"#/utils/git-status-mapper\";\nimport type { GitChange, GitChangeDiff } from \"../open-hands.types\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\n\ninterface AgentServerGitChange {\n status: string;\n path: string;\n}\n\n/**\n * Git operations for agent-server conversations.\n *\n * In **local** mode the runtime is reachable directly from the browser\n * (it's `127.0.0.1:18000`); the SDK's `RemoteWorkspace` calls land\n * fine. In **cloud** mode the runtime is at\n * `*.prod-runtime.all-hands.dev`, which doesn't allow CORS from\n * `localhost`. So cloud-mode calls hit the cloud API's\n * `GET /api/v1/app-conversations/{id}/git/{changes,diff}` proxy\n * endpoints instead — the server resolves the conversation's runtime\n * and makes the hop itself with the sandbox's session API key, and the\n * cloud API's CORS is permissive for bearer-token requests.\n */\n\n/**\n * The cloud runtime's `/api/git/{changes,diff}` endpoints prepend\n * `/workspace/` to relative paths (so a relative arg like\n * `workspace/project` becomes `/workspace/workspace/project` and 404s).\n * `getGitPath` returns the local agent-server's relative convention by\n * default; normalize to an absolute path before sending to the cloud\n * runtime.\n */\nfunction toAbsoluteRuntimePath(path: string): string {\n return path.startsWith(\"/\") ? path : `/${path}`;\n}\n\nclass AgentServerGitService {\n static async getGitChanges(\n conversationId: string,\n conversationUrl: string | null | undefined,\n sessionApiKey: string | null | undefined,\n path: string,\n ): Promise<GitChange[]> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\" && conversationId) {\n const params = new URLSearchParams();\n params.set(\"path\", toAbsoluteRuntimePath(path));\n const data = await callCloudProxy<AgentServerGitChange[]>({\n backend: active,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/git/changes?${params.toString()}`,\n });\n if (!Array.isArray(data)) {\n throw new Error(\n \"Invalid response from runtime - runtime may be unavailable\",\n );\n }\n return data.map((change) => ({\n status: mapAnyGitStatusToClientStatus(\n String(change.status) as Parameters<\n typeof mapAnyGitStatusToClientStatus\n >[0],\n ),\n path: change.path,\n }));\n }\n\n const changes = await new RemoteWorkspace(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).gitChanges(path
|
|
1
|
+
{"version":3,"file":"agent-server-git-service.api.cjs","names":[],"sources":["../../../src/api/git-service/agent-server-git-service.api.ts"],"sourcesContent":["import { RemoteWorkspace } from \"@openhands/typescript-client/workspace/remote-workspace\";\nimport { mapAnyGitStatusToClientStatus } from \"#/utils/git-status-mapper\";\nimport type { GitChange, GitChangeDiff } from \"../open-hands.types\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\n\ninterface AgentServerGitChange {\n status: string;\n path: string;\n}\n\n/**\n * Git operations for agent-server conversations.\n *\n * In **local** mode the runtime is reachable directly from the browser\n * (it's `127.0.0.1:18000`); the SDK's `RemoteWorkspace` calls land\n * fine. In **cloud** mode the runtime is at\n * `*.prod-runtime.all-hands.dev`, which doesn't allow CORS from\n * `localhost`. So cloud-mode calls hit the cloud API's\n * `GET /api/v1/app-conversations/{id}/git/{changes,diff}` proxy\n * endpoints instead — the server resolves the conversation's runtime\n * and makes the hop itself with the sandbox's session API key, and the\n * cloud API's CORS is permissive for bearer-token requests.\n */\n\n/**\n * The cloud runtime's `/api/git/{changes,diff}` endpoints prepend\n * `/workspace/` to relative paths (so a relative arg like\n * `workspace/project` becomes `/workspace/workspace/project` and 404s).\n * `getGitPath` returns the local agent-server's relative convention by\n * default; normalize to an absolute path before sending to the cloud\n * runtime.\n */\nfunction toAbsoluteRuntimePath(path: string): string {\n return path.startsWith(\"/\") ? path : `/${path}`;\n}\n\nclass AgentServerGitService {\n static async getGitChanges(\n conversationId: string,\n conversationUrl: string | null | undefined,\n sessionApiKey: string | null | undefined,\n path: string,\n ): Promise<GitChange[]> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\" && conversationId) {\n const params = new URLSearchParams();\n params.set(\"path\", toAbsoluteRuntimePath(path));\n const data = await callCloudProxy<AgentServerGitChange[]>({\n backend: active,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/git/changes?${params.toString()}`,\n });\n if (!Array.isArray(data)) {\n throw new Error(\n \"Invalid response from runtime - runtime may be unavailable\",\n );\n }\n return data.map((change) => ({\n status: mapAnyGitStatusToClientStatus(\n String(change.status) as Parameters<\n typeof mapAnyGitStatusToClientStatus\n >[0],\n ),\n path: change.path,\n }));\n }\n\n // No `ref`: let the server auto-detect the base (origin branch /\n // merge-base), so changes the agent has already committed still show\n // up. `ref: \"HEAD\"` would go blank after every `git commit` — and the\n // cloud-proxy branch above already omits `ref`.\n const changes = await new RemoteWorkspace(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).gitChanges(path);\n\n if (!Array.isArray(changes)) {\n throw new Error(\n \"Invalid response from runtime - runtime may be unavailable\",\n );\n }\n\n return changes.map((change) => ({\n status: mapAnyGitStatusToClientStatus(\n String(change.status) as Parameters<\n typeof mapAnyGitStatusToClientStatus\n >[0],\n ),\n path: change.path,\n }));\n }\n\n static async getGitChangeDiff(\n conversationId: string,\n conversationUrl: string | null | undefined,\n sessionApiKey: string | null | undefined,\n path: string,\n ): Promise<GitChangeDiff> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\" && conversationId) {\n const params = new URLSearchParams();\n params.set(\"path\", toAbsoluteRuntimePath(path));\n const diff = await callCloudProxy<GitChangeDiff & { diff?: string }>({\n backend: active,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/git/diff?${params.toString()}`,\n });\n return {\n modified: diff?.modified ?? \"\",\n original: diff?.original ?? \"\",\n ...(diff?.diff ? { diff: diff.diff } : {}),\n } as GitChangeDiff;\n }\n\n // No `ref` for the same reason as getGitChanges: the base must match\n // the one the change list was computed against.\n const diff = (await new RemoteWorkspace(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).gitDiff(path)) as GitChangeDiff & { diff?: string };\n\n return {\n modified: diff.modified ?? \"\",\n original: diff.original ?? \"\",\n ...(diff.diff ? { diff: diff.diff } : {}),\n } as GitChangeDiff;\n }\n}\n\nexport default AgentServerGitService;\n"],"mappings":"wUAkCA,SAAS,EAAsB,EAAsB,CACnD,OAAO,EAAK,WAAW,IAAI,CAAG,EAAO,IAAI,IAG3C,IAAM,EAAN,KAA4B,CAC1B,aAAa,cACX,EACA,EACA,EACA,EACsB,CACtB,IAAM,EAAS,EAAA,kBAAkB,CAAC,QAElC,GAAI,EAAO,OAAS,SAAW,EAAgB,CAC7C,IAAM,EAAS,IAAI,gBACnB,EAAO,IAAI,OAAQ,EAAsB,EAAK,CAAC,CAC/C,IAAM,EAAO,MAAM,EAAA,eAAuC,CACxD,QAAS,EACT,OAAQ,MACR,KAAM,6BAA6B,EAAe,eAAe,EAAO,UAAU,GACnF,CAAC,CACF,GAAI,CAAC,MAAM,QAAQ,EAAK,CACtB,MAAU,MACR,6DACD,CAEH,OAAO,EAAK,IAAK,IAAY,CAC3B,OAAQ,EAAA,8BACN,OAAO,EAAO,OAAO,CAGtB,CACD,KAAM,EAAO,KACd,EAAE,CAOL,IAAM,EAAU,MAAM,IAAI,EAAA,gBACxB,EAAA,4BAA4B,CAAE,kBAAiB,gBAAe,CAAC,CAChE,CAAC,WAAW,EAAK,CAElB,GAAI,CAAC,MAAM,QAAQ,EAAQ,CACzB,MAAU,MACR,6DACD,CAGH,OAAO,EAAQ,IAAK,IAAY,CAC9B,OAAQ,EAAA,8BACN,OAAO,EAAO,OAAO,CAGtB,CACD,KAAM,EAAO,KACd,EAAE,CAGL,aAAa,iBACX,EACA,EACA,EACA,EACwB,CACxB,IAAM,EAAS,EAAA,kBAAkB,CAAC,QAElC,GAAI,EAAO,OAAS,SAAW,EAAgB,CAC7C,IAAM,EAAS,IAAI,gBACnB,EAAO,IAAI,OAAQ,EAAsB,EAAK,CAAC,CAC/C,IAAM,EAAO,MAAM,EAAA,eAAkD,CACnE,QAAS,EACT,OAAQ,MACR,KAAM,6BAA6B,EAAe,YAAY,EAAO,UAAU,GAChF,CAAC,CACF,MAAO,CACL,SAAU,GAAM,UAAY,GAC5B,SAAU,GAAM,UAAY,GAC5B,GAAI,GAAM,KAAO,CAAE,KAAM,EAAK,KAAM,CAAG,EAAE,CAC1C,CAKH,IAAM,EAAQ,MAAM,IAAI,EAAA,gBACtB,EAAA,4BAA4B,CAAE,kBAAiB,gBAAe,CAAC,CAChE,CAAC,QAAQ,EAAK,CAEf,MAAO,CACL,SAAU,EAAK,UAAY,GAC3B,SAAU,EAAK,UAAY,GAC3B,GAAI,EAAK,KAAO,CAAE,KAAM,EAAK,KAAM,CAAG,EAAE,CACzC"}
|
|
@@ -27,7 +27,7 @@ var o = class {
|
|
|
27
27
|
let d = await new r(t({
|
|
28
28
|
conversationUrl: s,
|
|
29
29
|
sessionApiKey: c
|
|
30
|
-
})).gitChanges(l
|
|
30
|
+
})).gitChanges(l);
|
|
31
31
|
if (!Array.isArray(d)) throw Error("Invalid response from runtime - runtime may be unavailable");
|
|
32
32
|
return d.map((e) => ({
|
|
33
33
|
status: i(String(e.status)),
|
|
@@ -53,7 +53,7 @@ var o = class {
|
|
|
53
53
|
let u = await new r(t({
|
|
54
54
|
conversationUrl: o,
|
|
55
55
|
sessionApiKey: s
|
|
56
|
-
})).gitDiff(c
|
|
56
|
+
})).gitDiff(c);
|
|
57
57
|
return {
|
|
58
58
|
modified: u.modified ?? "",
|
|
59
59
|
original: u.original ?? "",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-server-git-service.api.js","names":[],"sources":["../../../src/api/git-service/agent-server-git-service.api.ts"],"sourcesContent":["import { RemoteWorkspace } from \"@openhands/typescript-client/workspace/remote-workspace\";\nimport { mapAnyGitStatusToClientStatus } from \"#/utils/git-status-mapper\";\nimport type { GitChange, GitChangeDiff } from \"../open-hands.types\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\n\ninterface AgentServerGitChange {\n status: string;\n path: string;\n}\n\n/**\n * Git operations for agent-server conversations.\n *\n * In **local** mode the runtime is reachable directly from the browser\n * (it's `127.0.0.1:18000`); the SDK's `RemoteWorkspace` calls land\n * fine. In **cloud** mode the runtime is at\n * `*.prod-runtime.all-hands.dev`, which doesn't allow CORS from\n * `localhost`. So cloud-mode calls hit the cloud API's\n * `GET /api/v1/app-conversations/{id}/git/{changes,diff}` proxy\n * endpoints instead — the server resolves the conversation's runtime\n * and makes the hop itself with the sandbox's session API key, and the\n * cloud API's CORS is permissive for bearer-token requests.\n */\n\n/**\n * The cloud runtime's `/api/git/{changes,diff}` endpoints prepend\n * `/workspace/` to relative paths (so a relative arg like\n * `workspace/project` becomes `/workspace/workspace/project` and 404s).\n * `getGitPath` returns the local agent-server's relative convention by\n * default; normalize to an absolute path before sending to the cloud\n * runtime.\n */\nfunction toAbsoluteRuntimePath(path: string): string {\n return path.startsWith(\"/\") ? path : `/${path}`;\n}\n\nclass AgentServerGitService {\n static async getGitChanges(\n conversationId: string,\n conversationUrl: string | null | undefined,\n sessionApiKey: string | null | undefined,\n path: string,\n ): Promise<GitChange[]> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\" && conversationId) {\n const params = new URLSearchParams();\n params.set(\"path\", toAbsoluteRuntimePath(path));\n const data = await callCloudProxy<AgentServerGitChange[]>({\n backend: active,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/git/changes?${params.toString()}`,\n });\n if (!Array.isArray(data)) {\n throw new Error(\n \"Invalid response from runtime - runtime may be unavailable\",\n );\n }\n return data.map((change) => ({\n status: mapAnyGitStatusToClientStatus(\n String(change.status) as Parameters<\n typeof mapAnyGitStatusToClientStatus\n >[0],\n ),\n path: change.path,\n }));\n }\n\n const changes = await new RemoteWorkspace(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).gitChanges(path
|
|
1
|
+
{"version":3,"file":"agent-server-git-service.api.js","names":[],"sources":["../../../src/api/git-service/agent-server-git-service.api.ts"],"sourcesContent":["import { RemoteWorkspace } from \"@openhands/typescript-client/workspace/remote-workspace\";\nimport { mapAnyGitStatusToClientStatus } from \"#/utils/git-status-mapper\";\nimport type { GitChange, GitChangeDiff } from \"../open-hands.types\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\n\ninterface AgentServerGitChange {\n status: string;\n path: string;\n}\n\n/**\n * Git operations for agent-server conversations.\n *\n * In **local** mode the runtime is reachable directly from the browser\n * (it's `127.0.0.1:18000`); the SDK's `RemoteWorkspace` calls land\n * fine. In **cloud** mode the runtime is at\n * `*.prod-runtime.all-hands.dev`, which doesn't allow CORS from\n * `localhost`. So cloud-mode calls hit the cloud API's\n * `GET /api/v1/app-conversations/{id}/git/{changes,diff}` proxy\n * endpoints instead — the server resolves the conversation's runtime\n * and makes the hop itself with the sandbox's session API key, and the\n * cloud API's CORS is permissive for bearer-token requests.\n */\n\n/**\n * The cloud runtime's `/api/git/{changes,diff}` endpoints prepend\n * `/workspace/` to relative paths (so a relative arg like\n * `workspace/project` becomes `/workspace/workspace/project` and 404s).\n * `getGitPath` returns the local agent-server's relative convention by\n * default; normalize to an absolute path before sending to the cloud\n * runtime.\n */\nfunction toAbsoluteRuntimePath(path: string): string {\n return path.startsWith(\"/\") ? path : `/${path}`;\n}\n\nclass AgentServerGitService {\n static async getGitChanges(\n conversationId: string,\n conversationUrl: string | null | undefined,\n sessionApiKey: string | null | undefined,\n path: string,\n ): Promise<GitChange[]> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\" && conversationId) {\n const params = new URLSearchParams();\n params.set(\"path\", toAbsoluteRuntimePath(path));\n const data = await callCloudProxy<AgentServerGitChange[]>({\n backend: active,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/git/changes?${params.toString()}`,\n });\n if (!Array.isArray(data)) {\n throw new Error(\n \"Invalid response from runtime - runtime may be unavailable\",\n );\n }\n return data.map((change) => ({\n status: mapAnyGitStatusToClientStatus(\n String(change.status) as Parameters<\n typeof mapAnyGitStatusToClientStatus\n >[0],\n ),\n path: change.path,\n }));\n }\n\n // No `ref`: let the server auto-detect the base (origin branch /\n // merge-base), so changes the agent has already committed still show\n // up. `ref: \"HEAD\"` would go blank after every `git commit` — and the\n // cloud-proxy branch above already omits `ref`.\n const changes = await new RemoteWorkspace(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).gitChanges(path);\n\n if (!Array.isArray(changes)) {\n throw new Error(\n \"Invalid response from runtime - runtime may be unavailable\",\n );\n }\n\n return changes.map((change) => ({\n status: mapAnyGitStatusToClientStatus(\n String(change.status) as Parameters<\n typeof mapAnyGitStatusToClientStatus\n >[0],\n ),\n path: change.path,\n }));\n }\n\n static async getGitChangeDiff(\n conversationId: string,\n conversationUrl: string | null | undefined,\n sessionApiKey: string | null | undefined,\n path: string,\n ): Promise<GitChangeDiff> {\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\" && conversationId) {\n const params = new URLSearchParams();\n params.set(\"path\", toAbsoluteRuntimePath(path));\n const diff = await callCloudProxy<GitChangeDiff & { diff?: string }>({\n backend: active,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/git/diff?${params.toString()}`,\n });\n return {\n modified: diff?.modified ?? \"\",\n original: diff?.original ?? \"\",\n ...(diff?.diff ? { diff: diff.diff } : {}),\n } as GitChangeDiff;\n }\n\n // No `ref` for the same reason as getGitChanges: the base must match\n // the one the change list was computed against.\n const diff = (await new RemoteWorkspace(\n getAgentServerClientOptions({ conversationUrl, sessionApiKey }),\n ).gitDiff(path)) as GitChangeDiff & { diff?: string };\n\n return {\n modified: diff.modified ?? \"\",\n original: diff.original ?? \"\",\n ...(diff.diff ? { diff: diff.diff } : {}),\n } as GitChangeDiff;\n }\n}\n\nexport default AgentServerGitService;\n"],"mappings":";;;;;;AAkCA,SAAS,EAAsB,GAAsB;AACnD,QAAO,EAAK,WAAW,IAAI,GAAG,IAAO,IAAI;;AAG3C,IAAM,IAAN,MAA4B;CAC1B,aAAa,cACX,GACA,GACA,GACA,GACsB;EACtB,IAAM,IAAS,GAAkB,CAAC;AAElC,MAAI,EAAO,SAAS,WAAW,GAAgB;GAC7C,IAAM,IAAS,IAAI,iBAAiB;AACpC,KAAO,IAAI,QAAQ,EAAsB,EAAK,CAAC;GAC/C,IAAM,IAAO,MAAM,EAAuC;IACxD,SAAS;IACT,QAAQ;IACR,MAAM,6BAA6B,EAAe,eAAe,EAAO,UAAU;IACnF,CAAC;AACF,OAAI,CAAC,MAAM,QAAQ,EAAK,CACtB,OAAU,MACR,6DACD;AAEH,UAAO,EAAK,KAAK,OAAY;IAC3B,QAAQ,EACN,OAAO,EAAO,OAAO,CAGtB;IACD,MAAM,EAAO;IACd,EAAE;;EAOL,IAAM,IAAU,MAAM,IAAI,EACxB,EAA4B;GAAE;GAAiB;GAAe,CAAC,CAChE,CAAC,WAAW,EAAK;AAElB,MAAI,CAAC,MAAM,QAAQ,EAAQ,CACzB,OAAU,MACR,6DACD;AAGH,SAAO,EAAQ,KAAK,OAAY;GAC9B,QAAQ,EACN,OAAO,EAAO,OAAO,CAGtB;GACD,MAAM,EAAO;GACd,EAAE;;CAGL,aAAa,iBACX,GACA,GACA,GACA,GACwB;EACxB,IAAM,IAAS,GAAkB,CAAC;AAElC,MAAI,EAAO,SAAS,WAAW,GAAgB;GAC7C,IAAM,IAAS,IAAI,iBAAiB;AACpC,KAAO,IAAI,QAAQ,EAAsB,EAAK,CAAC;GAC/C,IAAM,IAAO,MAAM,EAAkD;IACnE,SAAS;IACT,QAAQ;IACR,MAAM,6BAA6B,EAAe,YAAY,EAAO,UAAU;IAChF,CAAC;AACF,UAAO;IACL,UAAU,GAAM,YAAY;IAC5B,UAAU,GAAM,YAAY;IAC5B,GAAI,GAAM,OAAO,EAAE,MAAM,EAAK,MAAM,GAAG,EAAE;IAC1C;;EAKH,IAAM,IAAQ,MAAM,IAAI,EACtB,EAA4B;GAAE;GAAiB;GAAe,CAAC,CAChE,CAAC,QAAQ,EAAK;AAEf,SAAO;GACL,UAAU,EAAK,YAAY;GAC3B,UAAU,EAAK,YAAY;GAC3B,GAAI,EAAK,OAAO,EAAE,MAAM,EAAK,MAAM,GAAG,EAAE;GACzC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../backend-registry/active-store.cjs`),t=require(`../agent-server-client-options.cjs`),n=require(`../../node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.cjs`),r=require(`../conversation-service/agent-server-conversation-service.api.cjs`),i=require(`../../utils/git-status-mapper.cjs`),a=require(`../cloud/git-service.api.cjs`);var o=e=>e,s=()=>e.getActiveBackend().backend.kind===`cloud`,c=e=>!e||e===`undefined`||e===`null`,l={items:[],next_page_id:null},u={items:[],next_page_id:null},d={items:[],next_page_id:null},f=class{static async searchGitRepositories(e,t,n=100,r,i){return c(t)||!s()?l:a.searchCloudRepositories({provider:o(t),query:e||void 0,limit:n,pageId:r,installationId:i})}static async retrieveUserGitRepositories(e,t,n=30,r){return c(e)||!s()?l:a.searchCloudRepositories({provider:o(e),limit:n,pageId:t,installationId:r})}static async retrieveInstallationRepositories(e,t,n,r,i=30){if(c(e)||!s())return l;let u=n[t];return u?a.searchCloudRepositories({provider:o(e),installationId:u,limit:i,pageId:r}):l}static async getRepositoryBranches(e,t,n=``,r,i=30){return c(t)||!s()?u:a.getCloudRepositoryBranches({provider:o(t),repository:e,query:n||void 0,pageId:r,limit:i})}static async searchRepositoryBranches(e,t,n,r,i=30){return c(t)||!s()?u:a.getCloudRepositoryBranches({provider:o(t),repository:e,query:n,pageId:r,limit:i})}static async getUserInstallations(e,t,n=100){return c(e)||!s()?d:a.getCloudInstallations({provider:o(e),pageId:t,limit:n})}static async getGitChanges(e){let a=await r.default.resolveConversationWorkingDir(e);return(await new n.RemoteWorkspace(t.getAgentServerClientOptions({workingDir:a})).gitChanges(a
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../backend-registry/active-store.cjs`),t=require(`../agent-server-client-options.cjs`),n=require(`../../node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.cjs`),r=require(`../conversation-service/agent-server-conversation-service.api.cjs`),i=require(`../../utils/git-status-mapper.cjs`),a=require(`../cloud/git-service.api.cjs`);var o=e=>e,s=()=>e.getActiveBackend().backend.kind===`cloud`,c=e=>!e||e===`undefined`||e===`null`,l={items:[],next_page_id:null},u={items:[],next_page_id:null},d={items:[],next_page_id:null},f=class{static async searchGitRepositories(e,t,n=100,r,i){return c(t)||!s()?l:a.searchCloudRepositories({provider:o(t),query:e||void 0,limit:n,pageId:r,installationId:i})}static async retrieveUserGitRepositories(e,t,n=30,r){return c(e)||!s()?l:a.searchCloudRepositories({provider:o(e),limit:n,pageId:t,installationId:r})}static async retrieveInstallationRepositories(e,t,n,r,i=30){if(c(e)||!s())return l;let u=n[t];return u?a.searchCloudRepositories({provider:o(e),installationId:u,limit:i,pageId:r}):l}static async getRepositoryBranches(e,t,n=``,r,i=30){return c(t)||!s()?u:a.getCloudRepositoryBranches({provider:o(t),repository:e,query:n||void 0,pageId:r,limit:i})}static async searchRepositoryBranches(e,t,n,r,i=30){return c(t)||!s()?u:a.getCloudRepositoryBranches({provider:o(t),repository:e,query:n,pageId:r,limit:i})}static async getUserInstallations(e,t,n=100){return c(e)||!s()?d:a.getCloudInstallations({provider:o(e),pageId:t,limit:n})}static async getGitChanges(e){let a=await r.default.resolveConversationWorkingDir(e);return(await new n.RemoteWorkspace(t.getAgentServerClientOptions({workingDir:a})).gitChanges(a)).map(e=>({path:e.path,status:i.mapAnyGitStatusToClientStatus(String(e.status))}))}static async getGitChangeDiff(e,r){let i=await new n.RemoteWorkspace(t.getAgentServerClientOptions()).gitDiff(r);return{modified:i.modified??``,original:i.original??``}}};exports.default=f;
|
|
2
2
|
//# sourceMappingURL=git-service.api.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-service.api.cjs","names":[],"sources":["../../../src/api/git-service/git-service.api.ts"],"sourcesContent":["import { RemoteWorkspace } from \"@openhands/typescript-client/workspace/remote-workspace\";\nimport { RepositoryPage, BranchPage, InstallationPage } from \"#/types/git\";\nimport { Provider } from \"#/types/settings\";\nimport { GitChange, GitChangeDiff } from \"../open-hands.types\";\nimport AgentServerConversationService from \"../conversation-service/agent-server-conversation-service.api\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\nimport { mapAnyGitStatusToClientStatus } from \"#/utils/git-status-mapper\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport {\n getCloudInstallations,\n getCloudRepositoryBranches,\n searchCloudRepositories,\n} from \"../cloud/git-service.api\";\n\nconst safeProvider = (value: string): Provider => value as Provider;\n\nconst isCloudActive = () => getActiveBackend().backend.kind === \"cloud\";\n\n/**\n * Guard against null/undefined provider values that would result in\n * invalid API requests (e.g., \"?provider=undefined\"). Returns true\n * if the provider is falsy and the request should be skipped.\n */\nconst isInvalidProvider = (provider: string | null | undefined): boolean =>\n !provider || provider === \"undefined\" || provider === \"null\";\n\nconst EMPTY_REPOSITORY_PAGE: RepositoryPage = { items: [], next_page_id: null };\nconst EMPTY_BRANCH_PAGE: BranchPage = { items: [], next_page_id: null };\nconst EMPTY_INSTALLATION_PAGE: InstallationPage = {\n items: [],\n next_page_id: null,\n};\n\nclass GitService {\n static async searchGitRepositories(\n query: string,\n provider: string,\n limit = 100,\n pageId?: string,\n installationId?: string,\n ): Promise<RepositoryPage> {\n if (isInvalidProvider(provider) || !isCloudActive()) {\n return EMPTY_REPOSITORY_PAGE;\n }\n return searchCloudRepositories({\n provider: safeProvider(provider),\n query: query || undefined,\n limit,\n pageId,\n installationId,\n });\n }\n\n static async retrieveUserGitRepositories(\n provider: string,\n pageId?: string,\n limit = 30,\n installationId?: string,\n ): Promise<RepositoryPage> {\n if (isInvalidProvider(provider) || !isCloudActive()) {\n return EMPTY_REPOSITORY_PAGE;\n }\n return searchCloudRepositories({\n provider: safeProvider(provider),\n limit,\n pageId,\n installationId,\n });\n }\n\n static async retrieveInstallationRepositories(\n provider: string,\n installationIndex: number,\n installations: string[],\n pageId?: string,\n limit = 30,\n ): Promise<RepositoryPage> {\n if (isInvalidProvider(provider) || !isCloudActive()) {\n return EMPTY_REPOSITORY_PAGE;\n }\n const installationId = installations[installationIndex];\n if (!installationId) return EMPTY_REPOSITORY_PAGE;\n return searchCloudRepositories({\n provider: safeProvider(provider),\n installationId,\n limit,\n pageId,\n });\n }\n\n static async getRepositoryBranches(\n repository: string,\n provider: string,\n query: string = \"\",\n pageId?: string,\n limit = 30,\n ): Promise<BranchPage> {\n if (isInvalidProvider(provider) || !isCloudActive()) {\n return EMPTY_BRANCH_PAGE;\n }\n return getCloudRepositoryBranches({\n provider: safeProvider(provider),\n repository,\n query: query || undefined,\n pageId,\n limit,\n });\n }\n\n static async searchRepositoryBranches(\n repository: string,\n provider: string,\n query: string,\n pageId?: string,\n limit = 30,\n ): Promise<BranchPage> {\n if (isInvalidProvider(provider) || !isCloudActive()) {\n return EMPTY_BRANCH_PAGE;\n }\n return getCloudRepositoryBranches({\n provider: safeProvider(provider),\n repository,\n query,\n pageId,\n limit,\n });\n }\n\n static async getUserInstallations(\n provider: string,\n pageId?: string,\n limit = 100,\n ): Promise<InstallationPage> {\n if (isInvalidProvider(provider) || !isCloudActive()) {\n return EMPTY_INSTALLATION_PAGE;\n }\n return getCloudInstallations({\n provider: safeProvider(provider),\n pageId,\n limit,\n });\n }\n\n static async getGitChanges(conversationId: string): Promise<GitChange[]> {\n const workingDir =\n await AgentServerConversationService.resolveConversationWorkingDir(\n conversationId,\n );\n const changes = await new RemoteWorkspace(\n getAgentServerClientOptions({ workingDir }),\n ).gitChanges(workingDir
|
|
1
|
+
{"version":3,"file":"git-service.api.cjs","names":[],"sources":["../../../src/api/git-service/git-service.api.ts"],"sourcesContent":["import { RemoteWorkspace } from \"@openhands/typescript-client/workspace/remote-workspace\";\nimport { RepositoryPage, BranchPage, InstallationPage } from \"#/types/git\";\nimport { Provider } from \"#/types/settings\";\nimport { GitChange, GitChangeDiff } from \"../open-hands.types\";\nimport AgentServerConversationService from \"../conversation-service/agent-server-conversation-service.api\";\nimport { getAgentServerClientOptions } from \"../agent-server-client-options\";\nimport { mapAnyGitStatusToClientStatus } from \"#/utils/git-status-mapper\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport {\n getCloudInstallations,\n getCloudRepositoryBranches,\n searchCloudRepositories,\n} from \"../cloud/git-service.api\";\n\nconst safeProvider = (value: string): Provider => value as Provider;\n\nconst isCloudActive = () => getActiveBackend().backend.kind === \"cloud\";\n\n/**\n * Guard against null/undefined provider values that would result in\n * invalid API requests (e.g., \"?provider=undefined\"). Returns true\n * if the provider is falsy and the request should be skipped.\n */\nconst isInvalidProvider = (provider: string | null | undefined): boolean =>\n !provider || provider === \"undefined\" || provider === \"null\";\n\nconst EMPTY_REPOSITORY_PAGE: RepositoryPage = { items: [], next_page_id: null };\nconst EMPTY_BRANCH_PAGE: BranchPage = { items: [], next_page_id: null };\nconst EMPTY_INSTALLATION_PAGE: InstallationPage = {\n items: [],\n next_page_id: null,\n};\n\nclass GitService {\n static async searchGitRepositories(\n query: string,\n provider: string,\n limit = 100,\n pageId?: string,\n installationId?: string,\n ): Promise<RepositoryPage> {\n if (isInvalidProvider(provider) || !isCloudActive()) {\n return EMPTY_REPOSITORY_PAGE;\n }\n return searchCloudRepositories({\n provider: safeProvider(provider),\n query: query || undefined,\n limit,\n pageId,\n installationId,\n });\n }\n\n static async retrieveUserGitRepositories(\n provider: string,\n pageId?: string,\n limit = 30,\n installationId?: string,\n ): Promise<RepositoryPage> {\n if (isInvalidProvider(provider) || !isCloudActive()) {\n return EMPTY_REPOSITORY_PAGE;\n }\n return searchCloudRepositories({\n provider: safeProvider(provider),\n limit,\n pageId,\n installationId,\n });\n }\n\n static async retrieveInstallationRepositories(\n provider: string,\n installationIndex: number,\n installations: string[],\n pageId?: string,\n limit = 30,\n ): Promise<RepositoryPage> {\n if (isInvalidProvider(provider) || !isCloudActive()) {\n return EMPTY_REPOSITORY_PAGE;\n }\n const installationId = installations[installationIndex];\n if (!installationId) return EMPTY_REPOSITORY_PAGE;\n return searchCloudRepositories({\n provider: safeProvider(provider),\n installationId,\n limit,\n pageId,\n });\n }\n\n static async getRepositoryBranches(\n repository: string,\n provider: string,\n query: string = \"\",\n pageId?: string,\n limit = 30,\n ): Promise<BranchPage> {\n if (isInvalidProvider(provider) || !isCloudActive()) {\n return EMPTY_BRANCH_PAGE;\n }\n return getCloudRepositoryBranches({\n provider: safeProvider(provider),\n repository,\n query: query || undefined,\n pageId,\n limit,\n });\n }\n\n static async searchRepositoryBranches(\n repository: string,\n provider: string,\n query: string,\n pageId?: string,\n limit = 30,\n ): Promise<BranchPage> {\n if (isInvalidProvider(provider) || !isCloudActive()) {\n return EMPTY_BRANCH_PAGE;\n }\n return getCloudRepositoryBranches({\n provider: safeProvider(provider),\n repository,\n query,\n pageId,\n limit,\n });\n }\n\n static async getUserInstallations(\n provider: string,\n pageId?: string,\n limit = 100,\n ): Promise<InstallationPage> {\n if (isInvalidProvider(provider) || !isCloudActive()) {\n return EMPTY_INSTALLATION_PAGE;\n }\n return getCloudInstallations({\n provider: safeProvider(provider),\n pageId,\n limit,\n });\n }\n\n static async getGitChanges(conversationId: string): Promise<GitChange[]> {\n const workingDir =\n await AgentServerConversationService.resolveConversationWorkingDir(\n conversationId,\n );\n const changes = await new RemoteWorkspace(\n getAgentServerClientOptions({ workingDir }),\n ).gitChanges(workingDir);\n\n return changes.map((change) => ({\n path: change.path,\n status: mapAnyGitStatusToClientStatus(\n String(change.status) as Parameters<\n typeof mapAnyGitStatusToClientStatus\n >[0],\n ),\n }));\n }\n\n static async getGitChangeDiff(\n _conversationId: string,\n path: string,\n ): Promise<GitChangeDiff> {\n const diff = await new RemoteWorkspace(\n getAgentServerClientOptions(),\n ).gitDiff(path);\n\n return {\n modified: diff.modified ?? \"\",\n original: diff.original ?? \"\",\n };\n }\n}\n\nexport default GitService;\n"],"mappings":"iaAcA,IAAM,EAAgB,GAA4B,EAE5C,MAAsB,EAAA,kBAAkB,CAAC,QAAQ,OAAS,QAO1D,EAAqB,GACzB,CAAC,GAAY,IAAa,aAAe,IAAa,OAElD,EAAwC,CAAE,MAAO,EAAE,CAAE,aAAc,KAAM,CACzE,EAAgC,CAAE,MAAO,EAAE,CAAE,aAAc,KAAM,CACjE,EAA4C,CAChD,MAAO,EAAE,CACT,aAAc,KACf,CAEK,EAAN,KAAiB,CACf,aAAa,sBACX,EACA,EACA,EAAQ,IACR,EACA,EACyB,CAIzB,OAHI,EAAkB,EAAS,EAAI,CAAC,GAAe,CAC1C,EAEF,EAAA,wBAAwB,CAC7B,SAAU,EAAa,EAAS,CAChC,MAAO,GAAS,IAAA,GAChB,QACA,SACA,iBACD,CAAC,CAGJ,aAAa,4BACX,EACA,EACA,EAAQ,GACR,EACyB,CAIzB,OAHI,EAAkB,EAAS,EAAI,CAAC,GAAe,CAC1C,EAEF,EAAA,wBAAwB,CAC7B,SAAU,EAAa,EAAS,CAChC,QACA,SACA,iBACD,CAAC,CAGJ,aAAa,iCACX,EACA,EACA,EACA,EACA,EAAQ,GACiB,CACzB,GAAI,EAAkB,EAAS,EAAI,CAAC,GAAe,CACjD,OAAO,EAET,IAAM,EAAiB,EAAc,GAErC,OADK,EACE,EAAA,wBAAwB,CAC7B,SAAU,EAAa,EAAS,CAChC,iBACA,QACA,SACD,CAAC,CAN0B,EAS9B,aAAa,sBACX,EACA,EACA,EAAgB,GAChB,EACA,EAAQ,GACa,CAIrB,OAHI,EAAkB,EAAS,EAAI,CAAC,GAAe,CAC1C,EAEF,EAAA,2BAA2B,CAChC,SAAU,EAAa,EAAS,CAChC,aACA,MAAO,GAAS,IAAA,GAChB,SACA,QACD,CAAC,CAGJ,aAAa,yBACX,EACA,EACA,EACA,EACA,EAAQ,GACa,CAIrB,OAHI,EAAkB,EAAS,EAAI,CAAC,GAAe,CAC1C,EAEF,EAAA,2BAA2B,CAChC,SAAU,EAAa,EAAS,CAChC,aACA,QACA,SACA,QACD,CAAC,CAGJ,aAAa,qBACX,EACA,EACA,EAAQ,IACmB,CAI3B,OAHI,EAAkB,EAAS,EAAI,CAAC,GAAe,CAC1C,EAEF,EAAA,sBAAsB,CAC3B,SAAU,EAAa,EAAS,CAChC,SACA,QACD,CAAC,CAGJ,aAAa,cAAc,EAA8C,CACvE,IAAM,EACJ,MAAM,EAAA,QAA+B,8BACnC,EACD,CAKH,OAAO,MAJe,IAAI,EAAA,gBACxB,EAAA,4BAA4B,CAAE,aAAY,CAAC,CAC5C,CAAC,WAAW,EAAW,EAET,IAAK,IAAY,CAC9B,KAAM,EAAO,KACb,OAAQ,EAAA,8BACN,OAAO,EAAO,OAAO,CAGtB,CACF,EAAE,CAGL,aAAa,iBACX,EACA,EACwB,CACxB,IAAM,EAAO,MAAM,IAAI,EAAA,gBACrB,EAAA,6BAA6B,CAC9B,CAAC,QAAQ,EAAK,CAEf,MAAO,CACL,SAAU,EAAK,UAAY,GAC3B,SAAU,EAAK,UAAY,GAC5B"}
|
|
@@ -69,13 +69,13 @@ var c = (e) => e, l = () => e().backend.kind === "cloud", u = (e) => !e || e ===
|
|
|
69
69
|
}
|
|
70
70
|
static async getGitChanges(e) {
|
|
71
71
|
let a = await r.resolveConversationWorkingDir(e);
|
|
72
|
-
return (await new n(t({ workingDir: a })).gitChanges(a
|
|
72
|
+
return (await new n(t({ workingDir: a })).gitChanges(a)).map((e) => ({
|
|
73
73
|
path: e.path,
|
|
74
74
|
status: i(String(e.status))
|
|
75
75
|
}));
|
|
76
76
|
}
|
|
77
77
|
static async getGitChangeDiff(e, r) {
|
|
78
|
-
let i = await new n(t()).gitDiff(r
|
|
78
|
+
let i = await new n(t()).gitDiff(r);
|
|
79
79
|
return {
|
|
80
80
|
modified: i.modified ?? "",
|
|
81
81
|
original: i.original ?? ""
|