@openhands/agent-canvas 1.3.0 → 1.5.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 +11 -12
- package/README.windows.md +4 -2
- package/build/assets/{Trans-DY6toRDu.js → Trans-DqF_OEZB.js} +1 -1
- package/build/assets/{acp-providers-Djl6vNn-.js → acp-providers-BQwoUBpe.js} +1 -1
- package/build/assets/active-backend-context-BCXRv5pm.js +1 -0
- package/build/assets/{add-backend-modal-DljoP9lc.js → add-backend-modal-BKHzq5no.js} +1 -1
- package/build/assets/{agent-profiles-settings-BJMmTZgv.js → agent-profiles-settings-CEp5CIz8.js} +1 -1
- package/build/assets/agent-server-compatibility-D6DSanlx.js +1 -0
- package/build/assets/agent-server-conversation-service.api-cylugfDz.js +41 -0
- package/build/assets/{agent-settings-lUknCeaF.js → agent-settings-C-tann3x.js} +2 -2
- package/build/assets/agent-settings-DGUKNSnU.js +1 -0
- package/build/assets/{alert-banner-Bpf2NQJq.js → alert-banner-Dd4woGbm.js} +1 -1
- package/build/assets/api-key-entry-screen-Bll_CkuQ.js +1 -0
- package/build/assets/app-settings-BpViWwpC.js +1 -0
- package/build/assets/automation-detail-Z9dN2f5l.js +2 -0
- package/build/assets/automation-export-D5uL0Tf8.js +2 -0
- package/build/assets/automations-list-BMOWcqzZ.js +1 -0
- package/build/assets/{back-nav-button-CUS2mi-U.js → back-nav-button-ZUDTMOTB.js} +1 -1
- package/build/assets/backend-form-modal-DhBT8P4g.js +1 -0
- package/build/assets/{backend-synced-settings-badge-CanzmG12.js → backend-synced-settings-badge-Db_REKVw.js} +1 -1
- package/build/assets/{base-modal-BuF2f0YL.js → base-modal-Cb0C6m0Q.js} +1 -1
- package/build/assets/{bot-D7eUAuSB.js → bot-C-EA6685.js} +1 -1
- package/build/assets/{brand-button-vMVuyDXu.js → brand-button-2Tp3aXk1.js} +1 -1
- package/build/assets/{browser-BifzWIBd.js → browser-QYLVr1kS.js} +2 -2
- package/build/assets/browser-store-BGXOGo-R.js +1 -0
- package/build/assets/{browser-tab-CkkqJnqw.js → browser-tab-BTTP1OE2.js} +1 -1
- package/build/assets/canvas-ui-BhxjoA1f.js +1 -0
- package/build/assets/{chat-send-button-B_jc5z5C.js → chat-send-button-BZHG2hAW.js} +1 -1
- package/build/assets/check-TbOEtHKj.js +1 -0
- package/build/assets/{chevron-down-CI8A6tet.js → chevron-down-D7IvFMBM.js} +1 -1
- package/build/assets/{circle-plus-check-toggle-C5YxjxvI.js → circle-plus-check-toggle-QQJKUnF6.js} +1 -1
- package/build/assets/client-source-Biqarhgr.js +1 -0
- package/build/assets/cloud-funnel-analytics-D-27T5Ao.js +1 -0
- package/build/assets/{combobox-caret-DoObzqf4.js → combobox-caret-A5jMVHgE.js} +1 -1
- package/build/assets/{command-menu-D-JV3Wqm.js → command-menu-BMVEme4H.js} +1 -1
- package/build/assets/{command-store-D8J5LMW1.js → command-store-jrWX_CcW.js} +1 -1
- package/build/assets/condenser-settings-CIa6eyB4.js +1 -0
- package/build/assets/{confirmation-modal-BGLu6XJN.js → confirmation-modal-4n_944zq.js} +1 -1
- package/build/assets/{context-menu-list-item-BD5_EaKN.js → context-menu-list-item-DvfFic5I.js} +1 -1
- package/build/assets/conversation-CHnEXGRM.js +1 -0
- package/build/assets/conversation-D4o4dG2t.js +89 -0
- package/build/assets/conversation-panel-11FjLCId.js +1 -0
- package/build/assets/conversation-service.api-0JG_fF9d.js +1 -0
- package/build/assets/conversation-state-store-JiUQp02U.js +1 -0
- package/build/assets/{conversation-store-LptbOvKa.js → conversation-store-BCSpLuEf.js} +1 -1
- package/build/assets/{conversation-tab-empty-state-B2dDYEwf.js → conversation-tab-empty-state-BUhKVwoi.js} +1 -1
- package/build/assets/{copy-3JCw_XFB.js → copy-D1YGjP-C.js} +1 -1
- package/build/assets/{copy-to-clipboard-button-CaR52OnA.js → copy-to-clipboard-button-Dp4Q_hXi.js} +1 -1
- package/build/assets/declaration-BGsHjPEW.js +1 -0
- package/build/assets/{device-verify-BsznkV-a.js → device-verify-CM086oKs.js} +1 -1
- package/build/assets/{dropdown-classes-DJSXeLqc.js → dropdown-classes-DZq0BQjb.js} +1 -1
- package/build/assets/{ellipsis-button-C5Z-tPFp.js → ellipsis-button-TPJdyxnK.js} +1 -1
- package/build/assets/{entry.client-JixNvFrr.js → entry.client-DypYHsYm.js} +2 -2
- package/build/assets/{enum-filter-dropdown-DXbVwiNZ.js → enum-filter-dropdown-CW_mBg0e.js} +1 -1
- package/build/assets/{environment-switch-overlay-DZQfRGTx.js → environment-switch-overlay-6laJch-9.js} +1 -1
- package/build/assets/{extensions-hub-DfvgqzTc.js → extensions-hub-BJFbFfKS.js} +1 -1
- package/build/assets/{extensions-navigation-D9i0DL62.js → extensions-navigation-DqSl7CJw.js} +1 -1
- package/build/assets/{external-link-D2zJjE9G.js → external-link-lhdITPqq.js} +1 -1
- package/build/assets/files-tab-c316dKAq.js +1 -0
- package/build/assets/{files-tab-store-DJsPxYdg.js → files-tab-store-tfCav6bB.js} +1 -1
- package/build/assets/{form-control-classes-ChpNBe9n.js → form-control-classes-CvUaw8_L.js} +1 -1
- package/build/assets/format-time-delta-DhDbkD7V.js +1 -0
- package/build/assets/git-provider-icon-DUb2pEos.js +1 -0
- package/build/assets/home-BQ-DC06B.js +1 -0
- package/build/assets/home-D7ds4Jyw.js +1 -0
- package/build/assets/index-home-BRFDWs_4.js +1 -0
- package/build/assets/install-server-modal-CvHvzZj3.js +1 -0
- package/build/assets/{launch-BgIlZLSX.js → launch-A47TK2Me.js} +1 -1
- package/build/assets/lesson-plan-DSf95kQ2.js +4 -0
- package/build/assets/{list-todo-BfH6yYUK.js → list-todo-CAtvkzcy.js} +1 -1
- package/build/assets/llm-not-configured-banner-B7DR8SPs.js +27 -0
- package/build/assets/llm-settings-Ch4ZbW3c.js +1 -0
- package/build/assets/llm-settings-Cvi7q4ox.js +1 -0
- package/build/assets/llm-subscription-service-Cz1yBBvE.js +1 -0
- package/build/assets/loader-circle-CsAsfLIs.js +1 -0
- package/build/assets/{loading-spinner-BLdswi6q.js → loading-spinner-Txxx1I1p.js} +1 -1
- package/build/assets/manage-backends-modal-DAVhNUCe.js +1 -0
- package/build/assets/manifest-958c741a.js +1 -0
- package/build/assets/{markdown-renderer-DMT7Zkpd.js → markdown-renderer-B6cJJ_MN.js} +1 -1
- package/build/assets/{mcp-CHkklDMv.js → mcp-BwssgMpg.js} +2 -2
- package/build/assets/{messages-B3RugH7P.js → messages-D8MeG2ZQ.js} +26 -26
- package/build/assets/{modal-body-DouOE5KH.js → modal-body-CDZdZ-eT.js} +1 -1
- package/build/assets/{modal-classes-Cf-4tbHz.js → modal-classes-B4oit_4c.js} +1 -1
- package/build/assets/{modal-close-button-B6CfxxJj.js → modal-close-button-DQElFMPo.js} +1 -1
- package/build/assets/model-selector-BxTbbKub.js +1 -0
- package/build/assets/{navigation-link-D8hfwvxI.js → navigation-link-imH6S7h2.js} +1 -1
- package/build/assets/onboarding-CyicadGt.js +1 -0
- package/build/assets/onboarding-modal-DQwihcTz.js +1 -0
- package/build/assets/option-service.api-DAkg_F7p.js +1 -0
- package/build/assets/organization-service.api-QknzKDh3.js +1 -0
- package/build/assets/package-Dk_VtWJ4.js +1 -0
- package/build/assets/path-utils-BECGet7G.js +1 -0
- package/build/assets/{pencil-Dj2XjKmI.js → pencil-CWhApFIT.js} +1 -1
- package/build/assets/{plan-components-CcCBmCzW.js → plan-components-CgPHWz3E.js} +1 -1
- package/build/assets/{planner-tab-CCqdXxkL.js → planner-tab-DPKHmMAX.js} +1 -1
- package/build/assets/plugins-management-service-DuTTxquo.js +1 -0
- package/build/assets/profiles-service.api-D6jvZOWu.js +1 -0
- package/build/assets/providers-B8pxQK8x.js +1 -0
- package/build/assets/proxy-CuhhyjdX.js +1 -0
- package/build/assets/{recommended-automations-launcher-CVEF_1pc.js → recommended-automations-launcher-DA6DWS7V.js} +1 -1
- package/build/assets/{refresh-cw-DM82EIyx.js → refresh-cw-B9B7-vsy.js} +1 -1
- package/build/assets/root-BhP6bTBB.js +2 -0
- package/build/assets/root-CYWeTrWE.css +1 -0
- package/build/assets/root-layout-oBaHHW4s.js +2 -0
- package/build/assets/{runtime-waiting-state-BsXLElvN.js → runtime-waiting-state-DeD9G7yJ.js} +1 -1
- package/build/assets/schema-field-BOLdL_U7.js +1 -0
- package/build/assets/sdk-section-page-ZIltERxf.js +1 -0
- package/build/assets/{sdk-settings-schema-Cv7M9eSe.js → sdk-settings-schema-Ba_Pa9uf.js} +1 -1
- package/build/assets/search-dIQ09UY2.js +1 -0
- package/build/assets/secrets-service-50DElFny.js +1 -0
- package/build/assets/{secrets-settings-DxTx9HgU.js → secrets-settings-Digl7JLe.js} +1 -1
- package/build/assets/{segmented-toggle-DyQqPhoD.js → segmented-toggle-C1-ZVyr5.js} +1 -1
- package/build/assets/settings-BfgLHsgd.js +1 -0
- package/build/assets/{settings-dropdown-input-BjunGXJb.js → settings-dropdown-input-BD5C9fBn.js} +1 -1
- package/build/assets/{settings-index-BjeuYFFa.js → settings-index-CODBijya.js} +1 -1
- package/build/assets/{settings-input-bD6npsDm.js → settings-input-CzNOq-Pj.js} +1 -1
- package/build/assets/{settings-list-classes-Dp_OgzN0.js → settings-list-classes-CuxH9ZoR.js} +1 -1
- package/build/assets/settings-modal-BcSWpKI0.js +1 -0
- package/build/assets/settings-service.api-Bsu1PvYO.js +1 -0
- package/build/assets/{settings-switch-5cuxl8Dc.js → settings-switch-DqmHAfWJ.js} +1 -1
- package/build/assets/{settings-utils-BMdG65By.js → settings-utils-B1lBErvV.js} +1 -1
- package/build/assets/shared-conversation-CDskdmrb.js +1 -0
- package/build/assets/{sidebar-layout-DuzJMMw-.js → sidebar-layout-Cn6eQaEI.js} +1 -1
- package/build/assets/{sidebar-mobile-menu-toggle-CMmAYkh8.js → sidebar-mobile-menu-toggle-DmCmZgq1.js} +1 -1
- package/build/assets/{sidebar-nav-link-5AlTT5-j.js → sidebar-nav-link-DMc8AIe7.js} +1 -1
- package/build/assets/{sidebar-store-CZuE8AH5.js → sidebar-store-DXWSCFpa.js} +1 -1
- package/build/assets/{skill-card-pill-row-eTIkE4nz.js → skill-card-pill-row-DOIWjiMF.js} +1 -1
- package/build/assets/skills-plugins-DLgINYuY.js +1 -0
- package/build/assets/{skills-settings-BYn4-AQQ.js → skills-settings-DPiCWalR.js} +2 -2
- package/build/assets/{square-chevron-right-Czw3FFWc.js → square-chevron-right-DE-JN-2Z.js} +1 -1
- package/build/assets/{styled-tooltip-CgX2oRaK.js → styled-tooltip-CvsjHuIf.js} +1 -1
- package/build/assets/{suspense-X5dBsJzn.js → suspense-DmZ3MSSh.js} +1 -1
- package/build/assets/{task-list-tab-0k9PhuqO.js → task-list-tab-CuhcDycu.js} +1 -1
- package/build/assets/telemetry-DHiTRl5_.js +2 -0
- package/build/assets/{terminal-BsGcSpRS.js → terminal-CVqF-tCD.js} +1 -1
- package/build/assets/{toggle-switch-2j5wwR85.js → toggle-switch-CS0ClOy2.js} +1 -1
- package/build/assets/{trash-2-Be_7y3Mn.js → trash-2-BU6BlW4i.js} +1 -1
- package/build/assets/{typography-D8mHDeNG.js → typography-CQn9wyEX.js} +1 -1
- package/build/assets/use-acp-credential-form-LlfZO_DD.js +1 -0
- package/build/assets/{use-activate-agent-profile-WaAZYz4E.js → use-activate-agent-profile-DpQjsXM0.js} +1 -1
- package/build/assets/{use-active-agent-profile-CYY3vGar.js → use-active-agent-profile-Gw_uJujV.js} +1 -1
- package/build/assets/{use-active-conversation-D-r929nx.js → use-active-conversation-B0sttISF.js} +1 -1
- package/build/assets/use-agent-profiles-LHZEK0Gg.js +1 -0
- package/build/assets/{use-agent-state-DijdVAQ0.js → use-agent-state-C5uA0bRj.js} +1 -1
- package/build/assets/use-backends-health-DKt1SmiU.js +1 -0
- package/build/assets/{use-can-manage-org-profiles-BEo0peGn.js → use-can-manage-org-profiles-BAtqsbCi.js} +1 -1
- package/build/assets/use-cloud-current-user-id-C8m1oBy4.js +1 -0
- package/build/assets/use-config-CXy4vD0H.js +1 -0
- package/build/assets/use-create-conversation-CWQGNQ9J.js +1 -0
- package/build/assets/{use-create-secret-D5O5qdWC.js → use-create-secret-BIrsX3OB.js} +1 -1
- package/build/assets/{use-event-store-DjgU4wfO.js → use-event-store-CsD17BKu.js} +1 -1
- package/build/assets/{use-handle-plan-click-Mn_SNTCh.js → use-handle-plan-click-DEuO7Byo.js} +1 -1
- package/build/assets/use-is-authed-Dvbpiu3B.js +1 -0
- package/build/assets/{use-launch-skill-in-chat-BnoDgvAy.js → use-launch-skill-in-chat-CdHOoQGM.js} +1 -1
- package/build/assets/use-llm-profiles-DQpQxVOD.js +1 -0
- package/build/assets/use-plugins-marketplace-Bkk07W_M.js +1 -0
- package/build/assets/use-runtime-is-ready-D4pkGT6E.js +1 -0
- package/build/assets/use-save-agent-profile-BxEsjnW0.js +1 -0
- package/build/assets/{use-save-settings-D1HoCDbn.js → use-save-settings-ioSUMqbE.js} +1 -1
- package/build/assets/use-settings-DNJC4gqu.js +1 -0
- package/build/assets/use-settings-nav-items-BUsrDbVR.js +16 -0
- package/build/assets/use-skills-BsmKm23M.js +1 -0
- package/build/assets/{use-task-list-AVBLbbcR.js → use-task-list-rs7Xbzl8.js} +1 -1
- package/build/assets/{use-tracking-2ZwQwpg_.js → use-tracking-poxQHMwR.js} +1 -1
- package/build/assets/{use-user-conversation-OAfenBRG.js → use-user-conversation-B337kUKB.js} +1 -1
- package/build/assets/{useMutation-DCE9RcgK.js → useMutation-u8UgRgDK.js} +1 -1
- package/build/assets/{useMutationState-BUab8Kxr.js → useMutationState-OnAsCLA_.js} +1 -1
- package/build/assets/{useQueries-CRzaAqzH.js → useQueries-BpIlT8Mt.js} +1 -1
- package/build/assets/{useQuery-CpjHYtZc.js → useQuery-D5pEZbY0.js} +1 -1
- package/build/assets/{useTranslation-CDRCKC9-.js → useTranslation-Cbf5AGg_.js} +1 -1
- package/build/assets/{utils-D3U3rlqr.js → utils-DB9LsAzA.js} +1 -1
- package/build/assets/{vendor~browser-Cvg7jXCP.js → vendor~browser-5Njjw1Cl.js} +1 -1
- package/build/assets/{vendor~browser-tab-Di0kh5Zw.js → vendor~browser-tab-Xn94EtUo.js} +1 -1
- package/build/assets/{vendor~entry.client-9tWQ_Ugw.js → vendor~entry.client-DDuH4--y.js} +1 -1
- package/build/assets/{vendor~entry.client-D6BtSOtn.js → vendor~entry.client-DQGrNspu.js} +1 -1
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~dhilvkxv-BIieS_OD.js +2 -0
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~iztiaf2o-rqo6vRFz.js +185 -0
- package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~nn5zty47-Zl0G1QCy.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ljq5gbus-B2XD4bi2.js} +1 -1
- package/build/assets/{vendor~files-tab-B02k3xvx.js → vendor~files-tab-CiC3-lGh.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation-CYMF9JYB.js → vendor~index-home~home~conversation-panel~conversation-ChmYLVgz.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-9UMeuPV6.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-B8XNNEQZ.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-d8aETPbZ.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CnJRLn5s.js} +1 -1
- package/build/assets/vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DWteoTyr.js +2 -0
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-D7EUmQ8Y.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-Dc5nKwLO.js} +1 -1
- package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BD0GaRGa.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-tlf6AnDe.js} +1 -1
- package/build/assets/{vendor~launch-CHXA9cJu.js → vendor~launch-28DK5Rsl.js} +1 -1
- package/build/assets/{vendor~root-layout~conversation-panel~conversation-CpiTHpHl.js → vendor~root-layout~conversation-panel~conversation-8tIsyrPj.js} +1 -1
- package/build/assets/{vendor~root-layout~conversation-panel~conversation~shared-conversation-_TdZcNMD.js → vendor~root-layout~conversation-panel~conversation~shared-conversation-lYNG9C1U.js} +1 -1
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation-Cn2jwSga.js → vendor~root-layout~index-home~home~conversation-panel~conversation-Zhq6xAxR.js} +1 -1
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-CZM4hwUT.js → vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation~aler~gfu7qdtz-B81b08bw.js} +1 -1
- package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~settings~settings-index~agen~enjl5xdm-mMKDm94D.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~ftka0fnu-jpyLM1Nn.js} +2 -2
- package/build/assets/{verification-settings-DnXS6VWv.js → verification-settings-HRgEM-_3.js} +1 -1
- package/build/assets/x-ZE4iplpF.js +1 -0
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +9 -0
- package/build/locales/ca/openhands.json +9 -0
- package/build/locales/de/openhands.json +9 -0
- package/build/locales/en/openhands.json +10 -1
- package/build/locales/es/openhands.json +9 -0
- package/build/locales/fr/openhands.json +9 -0
- package/build/locales/it/openhands.json +9 -0
- package/build/locales/ja/openhands.json +9 -0
- package/build/locales/ko-KR/openhands.json +9 -0
- package/build/locales/no/openhands.json +9 -0
- package/build/locales/pt/openhands.json +9 -0
- package/build/locales/tr/openhands.json +9 -0
- package/build/locales/uk/openhands.json +9 -0
- package/build/locales/zh-CN/openhands.json +9 -0
- package/build/locales/zh-TW/openhands.json +9 -0
- package/config/defaults.json +5 -4
- package/dist/api/agent-server-adapter.cjs +3 -3
- package/dist/api/agent-server-adapter.cjs.map +1 -1
- package/dist/api/agent-server-adapter.d.ts +9 -1
- package/dist/api/agent-server-adapter.js +105 -102
- package/dist/api/agent-server-adapter.js.map +1 -1
- package/dist/api/agent-server-config.cjs +1 -1
- package/dist/api/agent-server-config.cjs.map +1 -1
- package/dist/api/agent-server-config.d.ts +3 -0
- package/dist/api/agent-server-config.js +45 -23
- package/dist/api/agent-server-config.js.map +1 -1
- package/dist/api/backend-registry/auth.cjs +1 -1
- package/dist/api/backend-registry/auth.cjs.map +1 -1
- package/dist/api/backend-registry/auth.js +1 -1
- package/dist/api/backend-registry/auth.js.map +1 -1
- package/dist/api/backend-registry/default-backend.cjs +1 -1
- package/dist/api/backend-registry/default-backend.cjs.map +1 -1
- package/dist/api/backend-registry/default-backend.d.ts +3 -0
- package/dist/api/backend-registry/default-backend.js +22 -10
- package/dist/api/backend-registry/default-backend.js.map +1 -1
- package/dist/api/backend-registry/storage.cjs +1 -1
- package/dist/api/backend-registry/storage.cjs.map +1 -1
- package/dist/api/backend-registry/storage.js +38 -33
- package/dist/api/backend-registry/storage.js.map +1 -1
- package/dist/api/backend-registry/types.d.ts +2 -0
- package/dist/api/canvas-ui-client-tool.cjs +38 -0
- package/dist/api/canvas-ui-client-tool.cjs.map +1 -0
- package/dist/api/canvas-ui-client-tool.d.ts +14 -0
- package/dist/api/canvas-ui-client-tool.js +47 -0
- package/dist/api/canvas-ui-client-tool.js.map +1 -0
- package/dist/api/client-source.cjs +2 -0
- package/dist/api/client-source.cjs.map +1 -0
- package/dist/api/client-source.d.ts +9 -0
- package/dist/api/client-source.js +10 -0
- package/dist/api/client-source.js.map +1 -0
- package/dist/api/cloud/client.cjs +2 -0
- package/dist/api/cloud/client.cjs.map +1 -0
- package/dist/api/cloud/client.d.ts +4 -0
- package/dist/api/cloud/client.js +38 -0
- package/dist/api/cloud/client.js.map +1 -0
- package/dist/api/cloud/conversation-service.api.cjs +1 -1
- package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
- package/dist/api/cloud/conversation-service.api.js +33 -31
- package/dist/api/cloud/conversation-service.api.js.map +1 -1
- package/dist/api/cloud/organization-service.api.cjs +1 -1
- package/dist/api/cloud/organization-service.api.cjs.map +1 -1
- package/dist/api/cloud/organization-service.api.js +11 -10
- package/dist/api/cloud/organization-service.api.js.map +1 -1
- package/dist/api/cloud/proxy.cjs +1 -1
- package/dist/api/cloud/proxy.cjs.map +1 -1
- package/dist/api/cloud/proxy.d.ts +2 -40
- package/dist/api/cloud/proxy.js +14 -39
- package/dist/api/cloud/proxy.js.map +1 -1
- package/dist/api/conversation-metadata-store.cjs +1 -1
- package/dist/api/conversation-metadata-store.cjs.map +1 -1
- package/dist/api/conversation-metadata-store.d.ts +2 -9
- package/dist/api/conversation-metadata-store.js +13 -9
- package/dist/api/conversation-metadata-store.js.map +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +2 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.js +98 -88
- package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.types.d.ts +5 -0
- package/dist/api/device-flow-client.cjs +1 -1
- package/dist/api/device-flow-client.cjs.map +1 -1
- package/dist/api/device-flow-client.d.ts +4 -58
- package/dist/api/device-flow-client.js +8 -98
- package/dist/api/device-flow-client.js.map +1 -1
- package/dist/api/git-service/agent-server-git-service.api.cjs +1 -1
- package/dist/api/git-service/agent-server-git-service.api.cjs.map +1 -1
- package/dist/api/git-service/agent-server-git-service.api.d.ts +10 -2
- package/dist/api/git-service/agent-server-git-service.api.js +107 -40
- package/dist/api/git-service/agent-server-git-service.api.js.map +1 -1
- package/dist/api/open-hands.types.d.ts +11 -0
- package/dist/api/secrets-service.cjs +1 -1
- package/dist/api/secrets-service.cjs.map +1 -1
- package/dist/api/secrets-service.js +15 -14
- package/dist/api/secrets-service.js.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +73 -64
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.cjs +2 -2
- package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.js +2 -0
- package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.js.map +1 -1
- package/dist/components/features/backends/backend-form-modal.cjs +1 -1
- package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
- package/dist/components/features/backends/backend-form-modal.d.ts +7 -3
- package/dist/components/features/backends/backend-form-modal.js +216 -201
- package/dist/components/features/backends/backend-form-modal.js.map +1 -1
- package/dist/components/features/backends/backend-row.cjs +1 -1
- package/dist/components/features/backends/backend-row.cjs.map +1 -1
- package/dist/components/features/backends/backend-row.js +2 -1
- package/dist/components/features/backends/backend-row.js.map +1 -1
- package/dist/components/features/backends/backend-selector.cjs +1 -1
- package/dist/components/features/backends/backend-selector.cjs.map +1 -1
- package/dist/components/features/backends/backend-selector.js +51 -51
- package/dist/components/features/backends/backend-selector.js.map +1 -1
- package/dist/components/features/backends/device-flow-auth.cjs +1 -1
- package/dist/components/features/backends/device-flow-auth.cjs.map +1 -1
- package/dist/components/features/backends/device-flow-auth.d.ts +4 -1
- package/dist/components/features/backends/device-flow-auth.js +38 -38
- package/dist/components/features/backends/device-flow-auth.js.map +1 -1
- package/dist/components/features/chat/chat-interface.cjs +2 -2
- package/dist/components/features/chat/chat-interface.cjs.map +1 -1
- package/dist/components/features/chat/chat-interface.js +173 -165
- package/dist/components/features/chat/chat-interface.js.map +1 -1
- package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
- package/dist/components/features/chat/components/chat-input-actions.d.ts +2 -1
- package/dist/components/features/chat/components/chat-input-actions.js +44 -43
- package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
- package/dist/components/features/chat/components/chat-input-container.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-container.cjs.map +1 -1
- package/dist/components/features/chat/components/chat-input-container.d.ts +2 -1
- package/dist/components/features/chat/components/chat-input-container.js +20 -19
- package/dist/components/features/chat/components/chat-input-container.js.map +1 -1
- package/dist/components/features/chat/components/chat-input-profile-picker.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-profile-picker.cjs.map +1 -1
- package/dist/components/features/chat/components/chat-input-profile-picker.js +44 -32
- package/dist/components/features/chat/components/chat-input-profile-picker.js.map +1 -1
- package/dist/components/features/chat/components/resolve-picker-kind.cjs +1 -1
- package/dist/components/features/chat/components/resolve-picker-kind.cjs.map +1 -1
- package/dist/components/features/chat/components/resolve-picker-kind.d.ts +10 -22
- package/dist/components/features/chat/components/resolve-picker-kind.js +6 -3
- package/dist/components/features/chat/components/resolve-picker-kind.js.map +1 -1
- package/dist/components/features/chat/custom-chat-input.cjs +1 -1
- package/dist/components/features/chat/custom-chat-input.cjs.map +1 -1
- package/dist/components/features/chat/custom-chat-input.d.ts +2 -1
- package/dist/components/features/chat/custom-chat-input.js +52 -51
- package/dist/components/features/chat/custom-chat-input.js.map +1 -1
- package/dist/components/features/chat/interactive-chat-box.cjs +1 -1
- package/dist/components/features/chat/interactive-chat-box.cjs.map +1 -1
- package/dist/components/features/chat/interactive-chat-box.d.ts +2 -1
- package/dist/components/features/chat/interactive-chat-box.js +9 -8
- package/dist/components/features/chat/interactive-chat-box.js.map +1 -1
- package/dist/components/features/diff-viewer/commit-list.cjs +2 -0
- package/dist/components/features/diff-viewer/commit-list.cjs.map +1 -0
- package/dist/components/features/diff-viewer/commit-list.d.ts +13 -0
- package/dist/components/features/diff-viewer/commit-list.js +27 -0
- package/dist/components/features/diff-viewer/commit-list.js.map +1 -0
- package/dist/components/features/diff-viewer/commit-row.cjs +2 -0
- package/dist/components/features/diff-viewer/commit-row.cjs.map +1 -0
- package/dist/components/features/diff-viewer/commit-row.d.ts +14 -0
- package/dist/components/features/diff-viewer/commit-row.js +59 -0
- package/dist/components/features/diff-viewer/commit-row.js.map +1 -0
- package/dist/components/features/diff-viewer/file-diff-viewer.cjs +1 -1
- package/dist/components/features/diff-viewer/file-diff-viewer.cjs.map +1 -1
- package/dist/components/features/diff-viewer/file-diff-viewer.d.ts +7 -1
- package/dist/components/features/diff-viewer/file-diff-viewer.js +40 -39
- package/dist/components/features/diff-viewer/file-diff-viewer.js.map +1 -1
- package/dist/components/features/plugins/plugin-detail-modal.d.ts +2 -1
- package/dist/components/shared/modals/settings/settings-modal.cjs +1 -1
- package/dist/components/shared/modals/settings/settings-modal.cjs.map +1 -1
- package/dist/components/shared/modals/settings/settings-modal.js +23 -22
- package/dist/components/shared/modals/settings/settings-modal.js.map +1 -1
- package/dist/config/defaults.cjs +1 -1
- package/dist/config/defaults.cjs.map +1 -1
- package/dist/config/defaults.js +5 -4
- package/dist/config/defaults.js.map +1 -1
- package/dist/constants/acp-providers.cjs.map +1 -1
- package/dist/constants/acp-providers.d.ts +1 -1
- package/dist/constants/acp-providers.js.map +1 -1
- package/dist/constants/canvas-ui.cjs +2 -0
- package/dist/constants/canvas-ui.cjs.map +1 -0
- package/dist/constants/canvas-ui.d.ts +8 -0
- package/dist/constants/canvas-ui.js +6 -0
- package/dist/constants/canvas-ui.js.map +1 -0
- package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
- package/dist/contexts/conversation-websocket-context.js.map +1 -1
- package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
- package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
- package/dist/hooks/mutation/use-create-conversation.d.ts +2 -1
- package/dist/hooks/mutation/use-create-conversation.js +52 -52
- package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
- package/dist/hooks/query/query-keys.cjs +1 -1
- package/dist/hooks/query/query-keys.cjs.map +1 -1
- package/dist/hooks/query/query-keys.d.ts +2 -0
- package/dist/hooks/query/query-keys.js +4 -1
- package/dist/hooks/query/query-keys.js.map +1 -1
- package/dist/hooks/query/use-backends-health.cjs +1 -1
- package/dist/hooks/query/use-backends-health.cjs.map +1 -1
- package/dist/hooks/query/use-backends-health.js +50 -48
- package/dist/hooks/query/use-backends-health.js.map +1 -1
- package/dist/hooks/query/use-cloud-organizations.cjs +1 -1
- package/dist/hooks/query/use-cloud-organizations.cjs.map +1 -1
- package/dist/hooks/query/use-cloud-organizations.d.ts +1 -0
- package/dist/hooks/query/use-cloud-organizations.js +5 -2
- package/dist/hooks/query/use-cloud-organizations.js.map +1 -1
- package/dist/hooks/query/use-commit-changes.cjs +2 -0
- package/dist/hooks/query/use-commit-changes.cjs.map +1 -0
- package/dist/hooks/query/use-commit-changes.d.ts +5 -0
- package/dist/hooks/query/use-commit-changes.js +34 -0
- package/dist/hooks/query/use-commit-changes.js.map +1 -0
- package/dist/hooks/query/use-task-polling.cjs +1 -1
- package/dist/hooks/query/use-task-polling.cjs.map +1 -1
- package/dist/hooks/query/use-task-polling.d.ts +3 -2
- package/dist/hooks/query/use-task-polling.js +53 -40
- package/dist/hooks/query/use-task-polling.js.map +1 -1
- package/dist/hooks/query/use-unified-git-commits.cjs +2 -0
- package/dist/hooks/query/use-unified-git-commits.cjs.map +1 -0
- package/dist/hooks/query/use-unified-git-commits.d.ts +10 -0
- package/dist/hooks/query/use-unified-git-commits.js +41 -0
- package/dist/hooks/query/use-unified-git-commits.js.map +1 -0
- package/dist/hooks/query/use-unified-git-diff.cjs +1 -1
- package/dist/hooks/query/use-unified-git-diff.cjs.map +1 -1
- package/dist/hooks/query/use-unified-git-diff.d.ts +5 -0
- package/dist/hooks/query/use-unified-git-diff.js +11 -4
- package/dist/hooks/query/use-unified-git-diff.js.map +1 -1
- package/dist/hooks/use-acp-model-context.cjs +1 -1
- package/dist/hooks/use-acp-model-context.cjs.map +1 -1
- package/dist/hooks/use-acp-model-context.d.ts +4 -1
- package/dist/hooks/use-acp-model-context.js +9 -8
- package/dist/hooks/use-acp-model-context.js.map +1 -1
- package/dist/hooks/use-auto-refresh-files-on-edit.cjs +1 -1
- package/dist/hooks/use-auto-refresh-files-on-edit.cjs.map +1 -1
- package/dist/hooks/use-auto-refresh-files-on-edit.js +1 -1
- package/dist/hooks/use-auto-refresh-files-on-edit.js.map +1 -1
- package/dist/hooks/use-chat-input-model-state.cjs.map +1 -1
- package/dist/hooks/use-chat-input-model-state.d.ts +2 -1
- package/dist/hooks/use-chat-input-model-state.js.map +1 -1
- package/dist/hooks/use-chat-input-profile-state.cjs +1 -1
- package/dist/hooks/use-chat-input-profile-state.cjs.map +1 -1
- package/dist/hooks/use-chat-input-profile-state.d.ts +1 -10
- package/dist/hooks/use-chat-input-profile-state.js +42 -15
- package/dist/hooks/use-chat-input-profile-state.js.map +1 -1
- package/dist/hooks/use-device-flow.cjs +1 -1
- package/dist/hooks/use-device-flow.cjs.map +1 -1
- package/dist/hooks/use-device-flow.d.ts +4 -1
- package/dist/hooks/use-device-flow.js +42 -40
- package/dist/hooks/use-device-flow.js.map +1 -1
- package/dist/hooks/use-tracking.cjs.map +1 -1
- package/dist/hooks/use-tracking.d.ts +2 -1
- package/dist/hooks/use-tracking.js.map +1 -1
- package/dist/i18n/declaration.cjs +1 -1
- package/dist/i18n/declaration.cjs.map +1 -1
- package/dist/i18n/declaration.d.ts +9 -0
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/index.cjs +1 -1
- package/dist/i18n/index.cjs.map +1 -1
- package/dist/i18n/index.js +19 -18
- package/dist/i18n/index.js.map +1 -1
- package/dist/i18n/translation.cjs +3 -3
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +154 -1
- package/dist/i18n/translation.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +32 -32
- package/dist/lib/index.cjs +1 -1
- package/dist/lib/index.js +1 -1
- package/dist/locales/ar/openhands.json +9 -0
- package/dist/locales/ca/openhands.json +9 -0
- package/dist/locales/de/openhands.json +9 -0
- package/dist/locales/en/openhands.json +10 -1
- package/dist/locales/es/openhands.json +9 -0
- package/dist/locales/fr/openhands.json +9 -0
- package/dist/locales/it/openhands.json +9 -0
- package/dist/locales/ja/openhands.json +9 -0
- package/dist/locales/ko-KR/openhands.json +9 -0
- package/dist/locales/no/openhands.json +9 -0
- package/dist/locales/pt/openhands.json +9 -0
- package/dist/locales/tr/openhands.json +9 -0
- package/dist/locales/uk/openhands.json +9 -0
- package/dist/locales/zh-CN/openhands.json +9 -0
- package/dist/locales/zh-TW/openhands.json +9 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.cjs +2 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.js +351 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.cjs +2 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.js +106 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs +2 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js +69 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/clients.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/clients.js +3 -0
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js +18 -2
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp.js.map +1 -1
- package/dist/node_modules/axios/index.cjs +1 -1
- package/dist/node_modules/axios/index.js +1 -1
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +2 -2
- package/dist/package.js.map +1 -1
- package/dist/routes/app-settings.cjs +1 -1
- package/dist/routes/app-settings.cjs.map +1 -1
- package/dist/routes/app-settings.js +67 -66
- package/dist/routes/app-settings.js.map +1 -1
- package/dist/routes/commits-tab.cjs +2 -0
- package/dist/routes/commits-tab.cjs.map +1 -0
- package/dist/routes/commits-tab.d.ts +8 -0
- package/dist/routes/commits-tab.js +45 -0
- package/dist/routes/commits-tab.js.map +1 -0
- package/dist/routes/files-tab.cjs +1 -1
- package/dist/routes/files-tab.cjs.map +1 -1
- package/dist/routes/files-tab.js +148 -127
- package/dist/routes/files-tab.js.map +1 -1
- package/dist/services/cloud-funnel-analytics.cjs +2 -0
- package/dist/services/cloud-funnel-analytics.cjs.map +1 -0
- package/dist/services/cloud-funnel-analytics.d.ts +12 -0
- package/dist/services/cloud-funnel-analytics.js +53 -0
- package/dist/services/cloud-funnel-analytics.js.map +1 -0
- package/dist/services/telemetry.cjs +1 -1
- package/dist/services/telemetry.cjs.map +1 -1
- package/dist/services/telemetry.js +49 -47
- package/dist/services/telemetry.js.map +1 -1
- package/dist/types/agent-server/core/base/action.d.ts +5 -4
- package/dist/types/agent-server/core/base/base.d.ts +3 -2
- package/dist/types/agent-server/core/base/observation.d.ts +1 -1
- package/dist/types/agent-server/type-guards.cjs +1 -1
- package/dist/types/agent-server/type-guards.cjs.map +1 -1
- package/dist/types/agent-server/type-guards.d.ts +3 -5
- package/dist/types/agent-server/type-guards.js +2 -1
- package/dist/types/agent-server/type-guards.js.map +1 -1
- package/dist/types/automation.d.ts +5 -0
- package/dist/utils/api-error-message.d.ts +11 -0
- package/dist/utils/automation-timeout.d.ts +19 -0
- package/dist/utils/base-path.cjs +2 -0
- package/dist/utils/base-path.cjs.map +1 -0
- package/dist/utils/base-path.d.ts +2 -0
- package/dist/utils/base-path.js +23 -0
- package/dist/utils/base-path.js.map +1 -0
- package/package.json +2 -2
- package/scripts/check-sdk-version-sync.mjs +6 -6
- package/scripts/dev-safe.mjs +7 -8
- package/scripts/dev-static.mjs +3 -0
- package/scripts/dev-with-automation.mjs +3 -0
- package/scripts/docker-build.mjs +4 -0
- package/scripts/static-server.mjs +93 -7
- package/tools/canvas_ui_tool.py +14 -8
- package/build/assets/active-backend-context-B3umL5R-.js +0 -1
- package/build/assets/agent-server-client-options-DVLRd9sw.js +0 -1
- package/build/assets/agent-server-conversation-service.api-D_ZvtJjG.js +0 -5
- package/build/assets/agent-settings-BVVFzBWS.js +0 -1
- package/build/assets/api-key-entry-screen-CWEHcPJA.js +0 -1
- package/build/assets/app-settings-Dj90qosy.js +0 -1
- package/build/assets/automation-detail-CXJU0_gF.js +0 -2
- package/build/assets/automation-export-FWY9LPsG.js +0 -2
- package/build/assets/automations-list-DDGBkWLC.js +0 -1
- package/build/assets/backend-form-modal-DSbrafX2.js +0 -1
- package/build/assets/browser-store-BI6uklCG.js +0 -1
- package/build/assets/check-Bvi71siz.js +0 -1
- package/build/assets/condenser-settings-30cX9SK6.js +0 -1
- package/build/assets/conversation-BltULtFA.js +0 -89
- package/build/assets/conversation-e0a0_X4S.js +0 -1
- package/build/assets/conversation-panel-Cr9_ZGI-.js +0 -1
- package/build/assets/conversation-service.api-DQaKzIRj.js +0 -1
- package/build/assets/conversation-state-store-B2Bp32XI.js +0 -1
- package/build/assets/declaration-gq8V5eTU.js +0 -1
- package/build/assets/files-tab-DDtEJcGE.js +0 -1
- package/build/assets/git-provider-icon-BjkecAuV.js +0 -1
- package/build/assets/home-BCKWpKpf.js +0 -1
- package/build/assets/index-redirect-CUUJiNki.js +0 -1
- package/build/assets/install-server-modal-BIugLhVB.js +0 -1
- package/build/assets/lesson-plan-DgpP80mJ.js +0 -4
- package/build/assets/llm-not-configured-banner-BlX8NifC.js +0 -27
- package/build/assets/llm-settings-DJmbryaE.js +0 -1
- package/build/assets/llm-settings-kU5v0H1Z.js +0 -1
- package/build/assets/llm-subscription-service-CKyaV24y.js +0 -1
- package/build/assets/loader-circle-BEykUKYG.js +0 -1
- package/build/assets/manage-backends-modal-C8FJQIZR.js +0 -1
- package/build/assets/manifest-56d40d7c.js +0 -1
- package/build/assets/model-selector-BOj1wBlq.js +0 -1
- package/build/assets/mouse-pointer-click-PdEQPL6v.js +0 -1
- package/build/assets/onboarding-DYhDxmI9.js +0 -1
- package/build/assets/onboarding-modal-CP_WxDC9.js +0 -1
- package/build/assets/option-service.api-C0tYT4-r.js +0 -1
- package/build/assets/organization-service.api-CnynNoT-.js +0 -1
- package/build/assets/path-utils-DWcgCGen.js +0 -1
- package/build/assets/plugins-management-service-BAp70KN7.js +0 -1
- package/build/assets/profiles-service.api-CeYEmSM3.js +0 -1
- package/build/assets/providers-BxCuC9bZ.js +0 -1
- package/build/assets/proxy-CHmFkV16.js +0 -1
- package/build/assets/root-V8fkplMy.css +0 -1
- package/build/assets/root-layout-CttG_lQi.js +0 -2
- package/build/assets/root-uJ2t9rCQ.js +0 -2
- package/build/assets/schema-field-xUr6rDd6.js +0 -1
- package/build/assets/sdk-section-page-CbLrVUa3.js +0 -1
- package/build/assets/search-4DHskuhE.js +0 -1
- package/build/assets/secrets-service-CZYjNxFw.js +0 -1
- package/build/assets/settings-DnlfS09K.js +0 -1
- package/build/assets/settings-modal-DfTcL-mV.js +0 -1
- package/build/assets/settings-service.api-K4ncGlBv.js +0 -1
- package/build/assets/shared-conversation-DWtBkJv7.js +0 -1
- package/build/assets/skills-plugins-BJ040luO.js +0 -1
- package/build/assets/use-acp-credential-form-EtnbtYt0.js +0 -1
- package/build/assets/use-agent-profiles-DEAMFp-W.js +0 -1
- package/build/assets/use-backends-health-DkC7tKkC.js +0 -1
- package/build/assets/use-cloud-current-user-id-Dm99wXp2.js +0 -1
- package/build/assets/use-config-CHzNIHpv.js +0 -1
- package/build/assets/use-create-conversation-CTsvZ96U.js +0 -1
- package/build/assets/use-is-authed-_dhQ2Xuj.js +0 -1
- package/build/assets/use-llm-profiles-BMhPDlwQ.js +0 -1
- package/build/assets/use-plugins-marketplace-BGb-KgfD.js +0 -1
- package/build/assets/use-runtime-is-ready-CC-KrLKe.js +0 -1
- package/build/assets/use-save-agent-profile-CLMmbx_X.js +0 -1
- package/build/assets/use-settings-BReAMxCG.js +0 -1
- package/build/assets/use-settings-nav-items-xe1YgLnE.js +0 -16
- package/build/assets/use-skills-Dqo-pDDx.js +0 -1
- package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~d1e18dtv-5Q6lQJdE.js +0 -177
- package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~ncdxw0bh-ClHnt5lR.js +0 -10
- package/build/assets/vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CqXiHwjU.js +0 -2
- package/build/assets/x-Cb0WAtak.js +0 -1
- /package/build/assets/{__vite-browser-external-4xJsU2-u.js → __vite-browser-external-DU-Cb_sT.js} +0 -0
- /package/build/assets/{automation-BU8zu-FP.js → automation-BVEmGghX.js} +0 -0
- /package/build/assets/{checkmark-h7udgXMM.js → checkmark-DhcMGwtO.js} +0 -0
- /package/build/assets/{close-p3Op5lxI.js → close-DO5Rq_CS.js} +0 -0
- /package/build/assets/{code-tag-DYlAhEQY.js → code-tag-BvjtzUsr.js} +0 -0
- /package/build/assets/{color-themes-DPBzNtVg.js → color-themes-bVMmJJG6.js} +0 -0
- /package/build/assets/{common-Dh7OqABE.js → common-CxbUL3nR.js} +0 -0
- /package/build/assets/{conversation-local-storage-F6zVMM--.js → conversation-local-storage-B31voBg7.js} +0 -0
- /package/build/assets/{copy-BLmGeJcd.js → copy-DLUw2us-.js} +0 -0
- /package/build/assets/{createLucideIcon-CVAsW2Yo.js → createLucideIcon-D4Tak8A1.js} +0 -0
- /package/build/assets/{dist-CodhvuAP.js → dist-Dj01FXbZ.js} +0 -0
- /package/build/assets/{environment-switch-store-DkjlKWzN.js → environment-switch-store-D9hB9PvY.js} +0 -0
- /package/build/assets/{extension-module-card-classes-9V3J9J_b.js → extension-module-card-classes-BlO4w702.js} +0 -0
- /package/build/assets/{folder-mMWFvaw0.js → folder-ynxP2EIL.js} +0 -0
- /package/build/assets/{get-language-from-path-CPNnuVhI.js → get-language-from-path-rWEQrOGU.js} +0 -0
- /package/build/assets/{git-status-mapper-BI8FyUVp.js → git-status-mapper-C3rfzUex.js} +0 -0
- /package/build/assets/{handle-capture-consent-CPMXU29K.js → handle-capture-consent-DDnXMC9Y.js} +0 -0
- /package/build/assets/{iconBase-DaTRRUjy.js → iconBase-CuvxAQZ5.js} +0 -0
- /package/build/assets/{link-external-DfKQroKX.js → link-external-BVDiJfZt.js} +0 -0
- /package/build/assets/{llm-subscription-DtsX5Lhg.js → llm-subscription-BkdHwtQe.js} +0 -0
- /package/build/assets/{map-provider-BM2SJarp.js → map-provider-XSFHmdDs.js} +0 -0
- /package/build/assets/{middleware-DYHYNAnP.js → middleware-CWYDMVuG.js} +0 -0
- /package/build/assets/{modal-backdrop-zVwfOJZr.js → modal-backdrop-Dsmzgr5s.js} +0 -0
- /package/build/assets/{navigation-context-DPs2G0X8.js → navigation-context-SjzfpygH.js} +0 -0
- /package/build/assets/{objectWithoutPropertiesLoose-BgYIAs2y.js → objectWithoutPropertiesLoose-CQwg6tC0.js} +0 -0
- /package/build/assets/{openhands-logo-bcNw5bkY.js → openhands-logo-C-gDp1wr.js} +0 -0
- /package/build/assets/{react-DPDgL6du.js → react-ao3tWj6K.js} +0 -0
- /package/build/assets/{search-BsjCEFNf.js → search-pb4UKTfK.js} +0 -0
- /package/build/assets/{settings-mQUckT0g.js → settings-DksoDv5z.js} +0 -0
- /package/build/assets/{settings-gear-MXCyZW0x.js → settings-gear-D_HVvE5L.js} +0 -0
- /package/build/assets/{settings-like-page-layout-classes-DENKlZpD.js → settings-like-page-layout-classes-DLrsPCaI.js} +0 -0
- /package/build/assets/{settings-section-header-context-COMOIaxV.js → settings-section-header-context-C2MUIG88.js} +0 -0
- /package/build/assets/{skills-9cDZONKh.js → skills-CH4xgIh-.js} +0 -0
- /package/build/assets/{switch-skeleton-DqQwalyu.js → switch-skeleton-BpSOvZ-n.js} +0 -0
- /package/build/assets/{terminal-BuLtIrb9.js → terminal-Dokfkxn0.js} +0 -0
- /package/build/assets/{u-check-circle-BqoIxNz_.js → u-check-circle-DPWVO-9N.js} +0 -0
- /package/build/assets/{u-check-circle-half-LiwZkuFe.js → u-check-circle-half-BGNAAjOW.js} +0 -0
- /package/build/assets/{u-edit-DJ90xc8Z.js → u-edit-BIskOoEG.js} +0 -0
- /package/build/assets/{use-breakpoint-B-O0lQ84.js → use-breakpoint-OjLm94cF.js} +0 -0
- /package/build/assets/{use-click-outside-element-Bf4Omzot.js → use-click-outside-element-Jpt2WWd7.js} +0 -0
- /package/build/assets/{use-onboarding-completion-C_Swglzp.js → use-onboarding-completion-DkRpDTsD.js} +0 -0
- /package/build/assets/{v4-DbCkTSoU.js → v4-DPgam_jW.js} +0 -0
- /package/build/assets/{vendor~browser-Dqd33JyP.js → vendor~browser-BvEKaLBz.js} +0 -0
- /package/build/assets/{vendor~conversation-panel~conversation~alert-banner-DHDkknt5.js → vendor~conversation-panel~conversation~alert-banner-CznX01nZ.js} +0 -0
- /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~i3v2mlbw-BrJQ3XZH.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~e0djk9ee-Cw6LUe8p.js} +0 -0
- /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~k6tszsdc-Bb-xMtbv.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~g9hift2g-DmmpG9SI.js} +0 -0
- /package/build/assets/{vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~byh8a1g4-XNPdpuO8.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~jkpzbynd-CkpBIhVe.js} +0 -0
- /package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DTzw2x50.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BuL5kjfS.js} +0 -0
- /package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~automations-~ki5qnp0d-rV6d1Iv_.js → vendor~root-layout~index-home~home~conversation-panel~conversation~launch~skills-settings~a~j2jlu22h-DUYl8gbZ.js} +0 -0
- /package/build/assets/{vendor~root-layout~home~mcp~automations-list~onboarding-modal-CXyYYvYh.js → vendor~root-layout~index-home~home~mcp~automations-list~onboarding-modal-pIgQDxTc.js} +0 -0
- /package/build/assets/{vendor~terminal-aeP3PnKf.js → vendor~terminal-jAaNQWS9.js} +0 -0
- /package/build/assets/{x-mark-Batp6gXa.js → x-mark-C5przfXl.js} +0 -0
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
*
|
|
20
20
|
* Usage:
|
|
21
21
|
* node scripts/check-sdk-version-sync.mjs
|
|
22
|
-
* EXPECTED_SDK_VERSION=1.
|
|
22
|
+
* EXPECTED_SDK_VERSION=1.36.1 node scripts/check-sdk-version-sync.mjs
|
|
23
23
|
* node scripts/check-sdk-version-sync.mjs --check-pypi
|
|
24
24
|
*
|
|
25
25
|
* Environment variables:
|
|
@@ -78,7 +78,7 @@ Triggering from other repos:
|
|
|
78
78
|
-H "Authorization: token \$GITHUB_TOKEN" \\
|
|
79
79
|
-H "Accept: application/vnd.github.v3+json" \\
|
|
80
80
|
https://api.github.com/repos/OpenHands/agent-canvas/dispatches \\
|
|
81
|
-
-d '{"event_type": "sdk-version-check", "client_payload": {"version": "1.
|
|
81
|
+
-d '{"event_type": "sdk-version-check", "client_payload": {"version": "1.36.1"}}'
|
|
82
82
|
`);
|
|
83
83
|
process.exit(0);
|
|
84
84
|
}
|
|
@@ -260,9 +260,9 @@ async function fetchPyPIDependencies(packageName, version) {
|
|
|
260
260
|
* Parse PyPI requires_dist array and extract SDK package versions
|
|
261
261
|
*
|
|
262
262
|
* PyPI returns dependencies in PEP 508 format like:
|
|
263
|
-
* "openhands-sdk>=1.
|
|
264
|
-
* "openhands-tools==1.
|
|
265
|
-
* "openhands-workspace (>=1.
|
|
263
|
+
* "openhands-sdk>=1.36.1,<2.0.0"
|
|
264
|
+
* "openhands-tools==1.36.1"
|
|
265
|
+
* "openhands-workspace (>=1.36.1)"
|
|
266
266
|
*/
|
|
267
267
|
function parseSdkVersionsFromRequiresDist(requiresDist) {
|
|
268
268
|
const versions = {};
|
|
@@ -276,7 +276,7 @@ function parseSdkVersionsFromRequiresDist(requiresDist) {
|
|
|
276
276
|
}
|
|
277
277
|
|
|
278
278
|
// Extract the version number - look for patterns like:
|
|
279
|
-
// ">=1.
|
|
279
|
+
// ">=1.36.1", "==1.36.1", "(>=1.36.1)", "~=1.36.1"
|
|
280
280
|
// After the package name and before any comma or closing paren
|
|
281
281
|
const versionPattern = /[><=~!]+\s*([0-9]+(?:\.[0-9]+)*)/;
|
|
282
282
|
const match = dep.match(versionPattern);
|
package/scripts/dev-safe.mjs
CHANGED
|
@@ -48,7 +48,7 @@ const LOCAL_AGENT_SERVER_SUBDIRS = [
|
|
|
48
48
|
"openhands-workspace",
|
|
49
49
|
];
|
|
50
50
|
const DEFAULT_AGENT_SERVER_VERSION = SHARED_DEFAULTS.versions.agentServer;
|
|
51
|
-
// Temporary transitive-dep pin: openhands-sdk 1.
|
|
51
|
+
// Temporary transitive-dep pin: openhands-sdk 1.36.1 leaves agent-client-protocol
|
|
52
52
|
// unbounded (>=0.10.1), but acp 0.11.0 reordered the ACP prompt() args and breaks
|
|
53
53
|
// the SDK's ACP client. Hold acp <0.11 until a fixed SDK ships. See config/defaults.json.
|
|
54
54
|
const AGENT_CLIENT_PROTOCOL_CONSTRAINT =
|
|
@@ -399,7 +399,7 @@ export function validateFrontendDependencies(
|
|
|
399
399
|
* edits are picked up without a manual reinstall. The agent-server itself
|
|
400
400
|
* is rebuilt from local source on each invocation (--reinstall).
|
|
401
401
|
* - OH_AGENT_SERVER_GIT_REF: Git commit SHA or branch name
|
|
402
|
-
* - OH_AGENT_SERVER_VERSION: Specific PyPI version (e.g., "1.
|
|
402
|
+
* - OH_AGENT_SERVER_VERSION: Specific PyPI version (e.g., "1.36.1")
|
|
403
403
|
*
|
|
404
404
|
* If none are set, defaults to the released version specified by
|
|
405
405
|
* DEFAULT_AGENT_SERVER_VERSION. Set OH_AGENT_SERVER_GIT_REF to use a
|
|
@@ -636,10 +636,9 @@ function buildConfigFromPorts(ports, cwd, env) {
|
|
|
636
636
|
env.LOCAL_BACKEND_API_KEY ||
|
|
637
637
|
getOrCreatePersistedApiKeyFile(persistedKeyPath);
|
|
638
638
|
|
|
639
|
-
// Host directory containing
|
|
640
|
-
//
|
|
641
|
-
//
|
|
642
|
-
// <repo-root>/tools relative to this script.
|
|
639
|
+
// Host directory containing the legacy canvas_ui Python module. Persisted
|
|
640
|
+
// conversations created before the client_tools migration still reference
|
|
641
|
+
// its module qualname, so the agent-server can import it when resuming them.
|
|
643
642
|
const canvasToolsDir = fileURLToPath(new URL("../tools", import.meta.url));
|
|
644
643
|
|
|
645
644
|
return {
|
|
@@ -719,8 +718,8 @@ export function buildAgentServerEnv(config) {
|
|
|
719
718
|
// a follow-up change to the automation preset reads
|
|
720
719
|
// OH_SESSION_API_KEYS_0 directly (which is already in env).
|
|
721
720
|
AGENT_SERVER_URL: config.backendBaseUrl,
|
|
722
|
-
//
|
|
723
|
-
//
|
|
721
|
+
// Let the agent-server resolve canvas_ui_tool when old persisted metadata
|
|
722
|
+
// requests that compatibility module during startup.
|
|
724
723
|
OH_EXTRA_PYTHON_PATH: config.canvasToolsDir,
|
|
725
724
|
};
|
|
726
725
|
}
|
package/scripts/dev-static.mjs
CHANGED
|
@@ -386,6 +386,9 @@ function startStaticServer(config) {
|
|
|
386
386
|
join(config.canvasPath, "build"),
|
|
387
387
|
"--port",
|
|
388
388
|
String(config.vitePort),
|
|
389
|
+
...(process.env.VITE_BASE_PATH
|
|
390
|
+
? ["--base-path", process.env.VITE_BASE_PATH]
|
|
391
|
+
: []),
|
|
389
392
|
// Inject the API key so the pre-built frontend can authenticate
|
|
390
393
|
// to the agent-server without a baked-in VITE_SESSION_API_KEY.
|
|
391
394
|
...(config.sessionApiKey
|
|
@@ -1376,6 +1376,9 @@ function startStaticFrontend(config, staticDir) {
|
|
|
1376
1376
|
staticDir,
|
|
1377
1377
|
"--port",
|
|
1378
1378
|
String(config.vitePort),
|
|
1379
|
+
...(process.env.VITE_BASE_PATH
|
|
1380
|
+
? ["--base-path", process.env.VITE_BASE_PATH]
|
|
1381
|
+
: []),
|
|
1379
1382
|
// In local mode, inject the API key so the pre-built frontend can
|
|
1380
1383
|
// authenticate transparently. In public mode, pass --auth-required
|
|
1381
1384
|
// so the frontend shows the API key entry screen instead.
|
package/scripts/docker-build.mjs
CHANGED
|
@@ -25,6 +25,7 @@ const config = JSON.parse(
|
|
|
25
25
|
|
|
26
26
|
const agentServerImage = `${config.images.agentServer}:${config.versions.agentServer}-python`;
|
|
27
27
|
const automationVersion = config.versions.automation;
|
|
28
|
+
const canvasBasePath = config.paths.canvasBasePath;
|
|
28
29
|
|
|
29
30
|
// Parse CLI: --tag <name> and everything after -- is passed to docker build
|
|
30
31
|
let tag = "agent-canvas:local";
|
|
@@ -50,6 +51,8 @@ const cmd = [
|
|
|
50
51
|
`AGENT_SERVER_IMAGE=${agentServerImage}`,
|
|
51
52
|
"--build-arg",
|
|
52
53
|
`AUTOMATION_VERSION=${automationVersion}`,
|
|
54
|
+
"--build-arg",
|
|
55
|
+
`VITE_BASE_PATH=${canvasBasePath}`,
|
|
53
56
|
"-t",
|
|
54
57
|
tag,
|
|
55
58
|
...extraArgs,
|
|
@@ -58,6 +61,7 @@ const cmd = [
|
|
|
58
61
|
|
|
59
62
|
console.log(`Agent Server image : ${agentServerImage}`);
|
|
60
63
|
console.log(`Automation version : ${automationVersion}`);
|
|
64
|
+
console.log(`Canvas base path : ${canvasBasePath}`);
|
|
61
65
|
console.log(`Tag : ${tag}`);
|
|
62
66
|
console.log(`\n$ ${cmd.join(" ")}\n`);
|
|
63
67
|
|
|
@@ -86,6 +86,7 @@ export function parseArgs(argv = process.argv.slice(2)) {
|
|
|
86
86
|
authRequired: false,
|
|
87
87
|
runtimeServicesInfo: null,
|
|
88
88
|
lockToCloud: null,
|
|
89
|
+
basePath: "/",
|
|
89
90
|
};
|
|
90
91
|
|
|
91
92
|
for (let i = 0; i < argv.length; i++) {
|
|
@@ -127,6 +128,9 @@ export function parseArgs(argv = process.argv.slice(2)) {
|
|
|
127
128
|
case "--lock-to-cloud":
|
|
128
129
|
config.lockToCloud = argv[++i] || null;
|
|
129
130
|
break;
|
|
131
|
+
case "--base-path":
|
|
132
|
+
config.basePath = normalizeBasePath(argv[++i]);
|
|
133
|
+
break;
|
|
130
134
|
|
|
131
135
|
case "--auth-required":
|
|
132
136
|
config.authRequired = true;
|
|
@@ -166,6 +170,14 @@ export function parseArgs(argv = process.argv.slice(2)) {
|
|
|
166
170
|
return config;
|
|
167
171
|
}
|
|
168
172
|
|
|
173
|
+
function normalizeBasePath(value) {
|
|
174
|
+
const raw = (value ?? "").trim();
|
|
175
|
+
if (!raw || raw === "/") return "/";
|
|
176
|
+
|
|
177
|
+
const withLeadingSlash = raw.startsWith("/") ? raw : `/${raw}`;
|
|
178
|
+
return withLeadingSlash.replace(/\/+$/, "");
|
|
179
|
+
}
|
|
180
|
+
|
|
169
181
|
function showHelp() {
|
|
170
182
|
console.log(`
|
|
171
183
|
Combined static file server + reverse proxy.
|
|
@@ -194,6 +206,9 @@ OPTIONS:
|
|
|
194
206
|
--lock-to-cloud <cloud-url> Lock backend setup to a single OpenHands Cloud
|
|
195
207
|
URL. Hides manual/local backend setup and the
|
|
196
208
|
custom Cloud URL field in the pre-built frontend.
|
|
209
|
+
--base-path <path> Mount the SPA under <path> (default: /).
|
|
210
|
+
For example, --base-path /canvas serves
|
|
211
|
+
index.html and assets under /canvas.
|
|
197
212
|
--reject-prefix <prefix> Return 503 for requests matching <prefix>
|
|
198
213
|
instead of SPA-fallbacking to index.html;
|
|
199
214
|
may be repeated. Useful in --frontend-only
|
|
@@ -247,12 +262,17 @@ ROUTING:
|
|
|
247
262
|
* `window.__AGENT_CANVAS_LOCK_TO_CLOUD__`. Read by `getLockedCloudHost()` in
|
|
248
263
|
* `agent-server-config.ts` so pre-built frontend bundles can hide manual
|
|
249
264
|
* backend setup and the custom Cloud URL field at runtime.
|
|
265
|
+
*
|
|
266
|
+
* - `basePath`: the path prefix the SPA is mounted under, exposed as
|
|
267
|
+
* `window.__AGENT_CANVAS_BASE_PATH__` so runtime static assets like locale
|
|
268
|
+
* files can resolve through the same subpath as the built bundle.
|
|
250
269
|
*/
|
|
251
270
|
function makeConfigInjectionScript(
|
|
252
271
|
sessionApiKey,
|
|
253
272
|
authRequired,
|
|
254
273
|
runtimeServicesInfo,
|
|
255
274
|
lockToCloud,
|
|
275
|
+
basePath,
|
|
256
276
|
) {
|
|
257
277
|
const parts = [];
|
|
258
278
|
|
|
@@ -296,6 +316,12 @@ function makeConfigInjectionScript(
|
|
|
296
316
|
);
|
|
297
317
|
}
|
|
298
318
|
|
|
319
|
+
if (basePath && basePath !== "/") {
|
|
320
|
+
parts.push(
|
|
321
|
+
`window.__AGENT_CANVAS_BASE_PATH__=${JSON.stringify(basePath)};`,
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
|
|
299
325
|
if (parts.length === 0) return "";
|
|
300
326
|
|
|
301
327
|
return `<script>(function(){${parts.join("")}}());</script>`;
|
|
@@ -309,7 +335,13 @@ async function serveInjectedIndexHtml(
|
|
|
309
335
|
req,
|
|
310
336
|
res,
|
|
311
337
|
indexPath,
|
|
312
|
-
{
|
|
338
|
+
{
|
|
339
|
+
sessionApiKey,
|
|
340
|
+
authRequired,
|
|
341
|
+
runtimeServicesInfo,
|
|
342
|
+
lockToCloud,
|
|
343
|
+
basePath,
|
|
344
|
+
} = {},
|
|
313
345
|
) {
|
|
314
346
|
let content;
|
|
315
347
|
try {
|
|
@@ -323,6 +355,7 @@ async function serveInjectedIndexHtml(
|
|
|
323
355
|
authRequired,
|
|
324
356
|
runtimeServicesInfo,
|
|
325
357
|
lockToCloud,
|
|
358
|
+
basePath,
|
|
326
359
|
);
|
|
327
360
|
// Inject right before </head> so the key is available before any app code runs.
|
|
328
361
|
// replace() targets the first (and only) </head> in well-formed HTML.
|
|
@@ -370,7 +403,8 @@ function needsRuntimeInjection(injectionOpts) {
|
|
|
370
403
|
injectionOpts.sessionApiKey ||
|
|
371
404
|
injectionOpts.authRequired ||
|
|
372
405
|
injectionOpts.runtimeServicesInfo ||
|
|
373
|
-
injectionOpts.lockToCloud
|
|
406
|
+
injectionOpts.lockToCloud ||
|
|
407
|
+
(injectionOpts.basePath && injectionOpts.basePath !== "/"),
|
|
374
408
|
);
|
|
375
409
|
}
|
|
376
410
|
|
|
@@ -393,6 +427,36 @@ function notFound(res) {
|
|
|
393
427
|
res.end("Not Found");
|
|
394
428
|
}
|
|
395
429
|
|
|
430
|
+
function isMountedPath(urlPath, basePath) {
|
|
431
|
+
return (
|
|
432
|
+
basePath === "/" ||
|
|
433
|
+
urlPath === basePath ||
|
|
434
|
+
urlPath.startsWith(`${basePath}/`)
|
|
435
|
+
);
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
function stripBasePathFromUrl(rawUrl, basePath) {
|
|
439
|
+
if (basePath === "/") return rawUrl;
|
|
440
|
+
|
|
441
|
+
const [rawPath = "/", ...rest] = (rawUrl || "/").split("?");
|
|
442
|
+
const suffix = rawPath.slice(basePath.length) || "/";
|
|
443
|
+
const path = suffix.startsWith("/") ? suffix : `/${suffix}`;
|
|
444
|
+
return rest.length > 0 ? `${path}?${rest.join("?")}` : path;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
function redirectToMountedPath(req, res, urlPath, basePath) {
|
|
448
|
+
if (basePath === "/" || !isGetOrHead(req) || looksLikeAssetRequest(urlPath)) {
|
|
449
|
+
return false;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
const [, query = ""] = (req.url ?? "/").split("?", 2);
|
|
453
|
+
const path = urlPath === "/" ? "/" : urlPath;
|
|
454
|
+
const location = `${basePath}${path}${query ? `?${query}` : ""}`;
|
|
455
|
+
res.writeHead(308, { Location: location });
|
|
456
|
+
res.end();
|
|
457
|
+
return true;
|
|
458
|
+
}
|
|
459
|
+
|
|
396
460
|
function setStaticHeaders(res, pathname) {
|
|
397
461
|
const extension = extname(pathname).toLowerCase();
|
|
398
462
|
if (extension === ".js" || extension === ".mjs") {
|
|
@@ -421,29 +485,46 @@ async function handleStatic(
|
|
|
421
485
|
staticMiddleware,
|
|
422
486
|
injectionOpts = {},
|
|
423
487
|
rejectPrefixes = [],
|
|
488
|
+
basePath = "/",
|
|
424
489
|
) {
|
|
425
490
|
const urlPath = parseUrlPath(req, res);
|
|
426
491
|
if (urlPath === null) return;
|
|
427
492
|
|
|
493
|
+
if (!isMountedPath(urlPath, basePath)) {
|
|
494
|
+
if (matchesAnyPrefix(urlPath, rejectPrefixes)) {
|
|
495
|
+
rejectUnavailable(res);
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
498
|
+
if (!redirectToMountedPath(req, res, urlPath, basePath)) notFound(res);
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
const mountedUrl = stripBasePathFromUrl(req.url ?? "/", basePath);
|
|
503
|
+
const mountedPath = parseUrlPath({ ...req, url: mountedUrl }, res);
|
|
504
|
+
if (mountedPath === null) return;
|
|
505
|
+
|
|
428
506
|
const injectRuntimeConfig = needsRuntimeInjection(injectionOpts);
|
|
429
507
|
const indexPath = resolve(dirAbs, "index.html");
|
|
430
508
|
|
|
431
509
|
if (
|
|
432
510
|
injectRuntimeConfig &&
|
|
433
511
|
isGetOrHead(req) &&
|
|
434
|
-
(
|
|
512
|
+
(mountedPath === "/" || mountedPath === "/index.html")
|
|
435
513
|
) {
|
|
436
514
|
if (await serveInjectedIndexHtml(req, res, indexPath, injectionOpts))
|
|
437
515
|
return;
|
|
438
516
|
}
|
|
439
517
|
|
|
440
|
-
|
|
441
|
-
|
|
518
|
+
const mountedReq = Object.create(req);
|
|
519
|
+
mountedReq.url = mountedUrl;
|
|
520
|
+
|
|
521
|
+
staticMiddleware(mountedReq, res, async () => {
|
|
522
|
+
if (matchesAnyPrefix(mountedPath, rejectPrefixes)) {
|
|
442
523
|
rejectUnavailable(res);
|
|
443
524
|
return;
|
|
444
525
|
}
|
|
445
526
|
|
|
446
|
-
if (isGetOrHead(req) && !looksLikeAssetRequest(
|
|
527
|
+
if (isGetOrHead(req) && !looksLikeAssetRequest(mountedPath)) {
|
|
447
528
|
if (await serveInjectedIndexHtml(req, res, indexPath, injectionOpts)) {
|
|
448
529
|
return;
|
|
449
530
|
}
|
|
@@ -466,7 +547,9 @@ export function startStaticServer(config) {
|
|
|
466
547
|
authRequired: config.authRequired || false,
|
|
467
548
|
runtimeServicesInfo: config.runtimeServicesInfo || null,
|
|
468
549
|
lockToCloud: config.lockToCloud || null,
|
|
550
|
+
basePath: normalizeBasePath(config.basePath),
|
|
469
551
|
};
|
|
552
|
+
const basePath = injectionOpts.basePath;
|
|
470
553
|
const rejectPrefixes = config.rejectPrefixes ?? [];
|
|
471
554
|
const staticMiddleware = createStaticMiddleware(dirAbs);
|
|
472
555
|
|
|
@@ -485,6 +568,7 @@ export function startStaticServer(config) {
|
|
|
485
568
|
staticMiddleware,
|
|
486
569
|
injectionOpts,
|
|
487
570
|
rejectPrefixes,
|
|
571
|
+
basePath,
|
|
488
572
|
).catch((err) => {
|
|
489
573
|
console.error(`Static handler error for ${req.url}:`, err);
|
|
490
574
|
if (!res.headersSent) {
|
|
@@ -506,11 +590,13 @@ export function startStaticServer(config) {
|
|
|
506
590
|
|
|
507
591
|
return new Promise((resolveListen) => {
|
|
508
592
|
server.listen(config.port, config.host, () => {
|
|
593
|
+
const displayPath = basePath === "/" ? "/" : `${basePath}/`;
|
|
509
594
|
console.log("");
|
|
510
595
|
console.log(
|
|
511
|
-
`Static-server + proxy listening on http://${config.host}:${config.port}
|
|
596
|
+
`Static-server + proxy listening on http://${config.host}:${config.port}${displayPath}`,
|
|
512
597
|
);
|
|
513
598
|
console.log(` Static dir: ${dirAbs}`);
|
|
599
|
+
console.log(` Base path: ${basePath}`);
|
|
514
600
|
const sortedRoutes = Object.entries(config.routes).sort(
|
|
515
601
|
([a], [b]) => b.length - a.length,
|
|
516
602
|
);
|
package/tools/canvas_ui_tool.py
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
"""Canvas UI
|
|
1
|
+
"""Legacy conversation compatibility for the former Python Canvas UI tool.
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
New conversations define ``canvas_ui_control`` through the agent-server's
|
|
4
|
+
``client_tools`` JSON API. The distinct name avoids colliding with this
|
|
5
|
+
process-global legacy registration. This module remains importable because
|
|
6
|
+
persisted conversations store
|
|
7
|
+
``tool_module_qualnames = {"canvas_ui": "canvas_ui_tool"}`` and may contain
|
|
8
|
+
``CanvasUIAction`` / ``CanvasUIObservation`` events. Agent-server imports the
|
|
9
|
+
module before restoring those conversations so the legacy event kinds and tool
|
|
10
|
+
registration remain resolvable.
|
|
6
11
|
|
|
7
12
|
The server-side executor is a no-op that returns an acknowledgment. The actual
|
|
8
13
|
UI effect happens client-side: the frontend watches the WebSocket stream for
|
|
9
|
-
``
|
|
14
|
+
legacy ``canvas_ui`` and current ``canvas_ui_control`` ActionEvents and dispatches
|
|
15
|
+
the command.
|
|
10
16
|
"""
|
|
11
17
|
|
|
12
18
|
from collections.abc import Sequence
|
|
@@ -127,7 +133,7 @@ class CanvasUITool(ToolDefinition[CanvasUIAction, CanvasUIObservation]):
|
|
|
127
133
|
]
|
|
128
134
|
|
|
129
135
|
|
|
130
|
-
#
|
|
131
|
-
#
|
|
132
|
-
#
|
|
136
|
+
# Persisted pre-client_tools conversations import this module by qualname before
|
|
137
|
+
# restoring their agent and events. Keep the registration until those records
|
|
138
|
+
# have a server-side migration path.
|
|
133
139
|
register_tool("canvas_ui", CanvasUITool)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-BFRubm34.js";import{Ct as t,bt as n}from"./vendor-styling-CI0PQ3ab.js";import{a as r,c as i,i as a,l as o,n as s,o as ee,r as te,u as ne}from"./vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~d1e18dtv-5Q6lQJdE.js";import{i as re,t as c}from"./declaration-gq8V5eTU.js";import{m as ie,o as ae,v as oe}from"./vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~ncdxw0bh-ClHnt5lR.js";import{I as se,t as ce}from"./utils-D3U3rlqr.js";import{E as l,c as u,d,f,g as le,h as p,l as m,m as h,n as ue,p as de,s as fe,u as pe,v as me}from"./agent-server-client-options-DVLRd9sw.js";var g=e(t(),1),_=`openhands`,he=[{label:`English`,value:`en`},{label:`日本語`,value:`ja`},{label:`简体中文`,value:`zh-CN`},{label:`繁體中文`,value:`zh-TW`},{label:`한국어`,value:`ko-KR`},{label:`Norsk`,value:`no`},{label:`Arabic`,value:`ar`},{label:`Deutsch`,value:`de`},{label:`Français`,value:`fr`},{label:`Italiano`,value:`it`},{label:`Português`,value:`pt`},{label:`Español`,value:`es`},{label:`Català`,value:`ca`},{label:`Türkçe`,value:`tr`},{label:`Українська`,value:`uk`}],v=new WeakMap,ge=e=>{if(!v.has(e)){let t=e.use(r).use(a).use(re).init({fallbackLng:`en`,debug:!1,supportedLngs:he.map(e=>e.value),nonExplicitSupportedLngs:!1,ns:[_],defaultNS:_,fallbackNS:_,backend:{loadPath:`/locales/{{lng}}/{{ns}}.json`},interpolation:{escapeValue:!1}});v.set(e,t)}return e},_e=()=>ge(ee()),y=null,b=null,x=()=>(y||=_e(),y),S=()=>b??x(),ve=e=>(b=e??x(),b),ye=async(e=x())=>(await v.get(e),e),be=e=>e?typeof e==`object`&&!Array.isArray(e)?{ns:_,...e}:e:{ns:_},C=new Proxy({},{get:(e,t)=>{let n=S();if(t===`t`)return(e,t)=>n.t(e,be(t));if(t===`exists`)return(e,t)=>n.exists(e,be(t));let r=Reflect.get(n,t,n);return typeof r==`function`?r.bind(n):r},set:(e,t,n)=>{let r=S();return Reflect.set(r,t,n,r)}}),xe=e=>typeof e.response?.data==`object`&&e.response?.data!==null&&`error`in e.response.data&&typeof e.response?.data?.error==`string`,Se=e=>typeof e.response?.data==`object`&&e.response?.data!==null&&`message`in e.response.data&&typeof e.response?.data?.message==`string`,Ce=`Disconnected (check URL or network). Check that the backend URL is correct and the backend server is reachable. If the backend is on another origin, check that it allows this frontend origin.`,we=`Disconnected (request timed out). Check that the backend URL is correct and reachable.`,Te=4;function Ee(e){return typeof e==`object`&&!!e}function De(e){let t=[],n=new Set,r=e,i=0;for(;r!=null&&i<Te&&!n.has(r);){if(n.add(r),r instanceof Error)r.message&&t.push(r.message),r=r.cause;else if(typeof r==`string`){r&&t.push(r);break}else if(Ee(r)){let e=r.message;typeof e==`string`&&e&&t.push(e),r=r.cause}else break;i+=1}return t}function w(e){if(!e)return!1;let t=e.toLowerCase();return t.includes(`disconnected (check cors or network)`)||t.includes(`disconnected (check url or network)`)||t.includes(`blocked by cors`)||t.includes(`failed to fetch`)||t.includes(`network error`)||t.includes(`load failed`)||t.includes(`networkerror when attempting to fetch resource`)||t.includes(`cors`)&&t.includes(`blocked`)}function Oe(e){return De(e).some(w)}function T(e){if(!e)return!1;let t=e.toLowerCase();return t.includes(`request timeout`)||t.includes(`timeout after`)||t.includes(`backend request timed out`)}function E(e){let t=De(e);return t.some(w)?Ce:t.some(T)?we:t[0]??null}function ke(e){return typeof e==`object`&&!!e&&`isAxiosError`in e&&e.isAxiosError===!0}var D=e=>{let t=null,n=!1;return ke(e)?(n=!0,t=xe(e)&&e.response?.data.error?e.response?.data.error:Se(e)&&e.response?.data.message?e.response?.data.message:e.message):t=e instanceof Error?e.message:typeof e==`string`?e:null,E(n?t??e:e)??t??``},O=(e,t=5e3,n=1e4)=>{if(!e)return t;let r=e.length/(1e3/60)*1e3*1.5;return Math.min(Math.max(r,t),n)},k=n(),A={background:`var(--oh-color-tertiary)`,border:`1px solid var(--oh-border-input)`,color:`#fff`,borderRadius:`var(--oh-radius)`,maxWidth:`400px`,wordBreak:`break-word`,overflowWrap:`anywhere`,whiteSpace:`pre-wrap`},j={position:`top-right`,style:A},Ae={...A,color:`var(--oh-muted)`};function je({message:e}){let t=g.useRef(null),[n,r]=g.useState(!1);return g.useLayoutEffect(()=>{let e=t.current;if(!e)return;let n=()=>{let t=Number.parseFloat(getComputedStyle(e).lineHeight);if(!Number.isFinite(t)||t<=0){r(!1);return}r(e.getBoundingClientRect().height>t*1.5)};n();let i=new ResizeObserver(n);return i.observe(e),()=>i.disconnect()},[e]),(0,k.jsxs)(`div`,{className:ce(`flex min-w-0 gap-2`,n?`items-start`:`items-center`),children:[(0,k.jsx)(te,{"aria-hidden":!0,className:`h-4 w-4 shrink-0`,strokeWidth:2,style:{color:se}}),(0,k.jsx)(`span`,{ref:t,className:`min-w-0 flex-1 text-sm leading-5 [word-break:break-word] [overflow-wrap:anywhere]`,children:e})]})}var Me={...j,icon:null,style:Ae},M=e=>{let t=e||C.t(c.STATUS$ERROR);w(t)?t=C.t(c.ERROR$CORS_OR_NETWORK):T(t)&&(t=C.t(c.ERROR$BACKEND_REQUEST_TIMEOUT));let n=O(t,4e3);s((0,k.jsx)(je,{message:t}),{...Me,duration:n})},Ne=e=>{let t=O(e,5e3);s.success((0,k.jsx)(`span`,{className:`[word-break:break-word] [overflow-wrap:anywhere]`,children:e}),{...j,duration:t})},Pe=(e,t,n)=>{let r=O(`${e} ${t}`,5e3);s.success((0,k.jsxs)(`span`,{className:`[word-break:break-word] [overflow-wrap:anywhere]`,children:[e,` `,(0,k.jsx)(`a`,{className:`underline hover:no-underline`,href:n,children:t})]}),{...j,duration:r})},Fe=e=>{let t=O(e,6e3);s((0,k.jsx)(`span`,{className:`[word-break:break-word] [overflow-wrap:anywhere]`,children:e}),{...j,icon:`⚠️`,duration:t})},N=`openhands-backend-health`,P=500;function Ie(e){if(typeof e!=`object`||!e)return!1;let t=e;return Number.isInteger(t.consecutiveFailures)&&t.consecutiveFailures>=0&&t.consecutiveFailures<=5&&(t.lastError===null||typeof t.lastError==`string`)&&(t.lastFailureAt===null||typeof t.lastFailureAt==`number`)&&typeof t.disabled==`boolean`}function Le(){if(typeof window>`u`)return{};try{let e=window.localStorage.getItem(N);if(!e)return{};let t=JSON.parse(e);if(typeof t!=`object`||!t)return{};let n={};for(let[e,r]of Object.entries(t))typeof e==`string`&&e.length>0&&Ie(r)&&(n[e]=r);return n}catch{return{}}}function Re(e){if(!(typeof window>`u`))try{if(Object.keys(e).length===0){window.localStorage.removeItem(N);return}window.localStorage.setItem(N,JSON.stringify(e))}catch{}}function ze(e){let t=E(e)??`Unknown error`;return t.length>P?`${t.slice(0,P)}…`:t}var F=Le(),I=new Set;function Be(){I.forEach(e=>e())}function L(e){F=e,Re(e),Be()}function Ve(){return F}function He(e){return I.add(e),()=>{I.delete(e)}}function Ue(e,t){let n=F[e],r=Math.min((n?.consecutiveFailures??0)+1,5),i=n?.disabled===!0||r>=5,a={consecutiveFailures:r,lastError:ze(t),lastFailureAt:Date.now(),disabled:i};L({...F,[e]:a})}function R(e){if(!(e in F))return;let{[e]:t,...n}=F;L(n)}function We(e){if(!(e in F))return;let{[e]:t,...n}=F;L(n)}function Ge(e){if(!(e in F))return;let{[e]:t,...n}=F;L(n)}var Ke=(e,t)=>{(e?.response?.status===401||e?.status===401)&&t.invalidateQueries({queryKey:[`user`,`authenticated`]})},z=e=>{if(!(e instanceof oe)||e.response?.status!==401&&e.status!==401)return!1;let t=u().backend;if(t.kind!==`cloud`)return!1;let n=e.config?.url;return!n||n.startsWith(t.host.replace(/\/+$/,``))},B=new Set,qe=()=>{let e=new i({queryCache:new o({onSuccess:(e,t)=>{let n=t.meta?.backendId??t.options.meta?.backendId;typeof n==`string`&&R(n)},onError:(t,n)=>{if(n.queryKey[0]===`user`&&n.queryKey[1]===`authenticated`||Ke(t,e),!(n.meta?.disableToast??n.options.meta?.disableToast)&&!z(t)){let e=D(t);B.has(e||``)||(M(e||C.t(c.ERROR$GENERIC)),B.add(e||``),setTimeout(()=>{B.delete(e||``)},3e3))}}}),mutationCache:new ne({onError:(t,n,r,i)=>{Ke(t,e),!(i?.meta?.disableToast??i?.options.meta?.disableToast)&&!z(t)&&M(D(t)||C.t(c.ERROR$GENERIC))}})});return e},V=null,H=null,U=()=>(V||=qe(),V),W=()=>H??U(),Je=e=>(H=e??U(),H),G=new Proxy({},{get:(e,t)=>{let n=W(),r=Reflect.get(n,t,n);return typeof r==`function`?r.bind(n):r},set:(e,t,n)=>{let r=W();return Reflect.set(r,t,n,r)}}),Ye={_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.`,versions:{agentServer:`1.35.0`,agentCanvas:`1.3.0`,automation:`1.1.6`},compatibility:{minimumAgentServer:`1.28.0`},constraints:{_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).`,agentClientProtocol:`agent-client-protocol<0.11`},images:{agentServer:`ghcr.io/openhands/agent-server`,agentCanvas:`ghcr.io/openhands/agent-canvas`},ports:{agentServer:18e3,automation:18001,proxy:8e3},paths:{stateSubdir:`agent-canvas`,conversations:`agent-canvas/conversations`,bashEvents:`agent-canvas/bash_events`,automationDb:`automation/automations.db`},packages:{agentServer:`openhands-agent-server`,automation:`openhands-automation`,tools:`openhands-tools`,workspace:`openhands-workspace`}},Xe=5e3,Ze=`unknown`,K=Ye.compatibility.minimumAgentServer,Qe=`AGENT_SERVER_UNSUPPORTED_VERSION`,$e=`AGENT_SERVER_UNKNOWN_VERSION`,q=null,et=e=>Array.isArray(e?.usable_tools)?e.usable_tools:null,J=class extends Error{details;noBackendConfigured;constructor(e,t){let n=t?.noBackendConfigured??!1;super(n?`No agent server backend is configured yet. Add a backend to get started.`:`Could not connect to the configured agent server. Make sure it is running and reachable, then reload the page.`),this.name=`AgentServerUnavailableError`,this.details=e??null,this.noBackendConfigured=n}},tt=e=>e instanceof J||typeof e==`object`&&!!e&&`name`in e&&e.name===`AgentServerUnavailableError`,nt=class extends J{code=Qe;actualVersion;requiredVersion=K;constructor(e){let t=`Agent Canvas requires agent-server ${K} or newer; this backend is running ${e}. Please upgrade the agent-server backend.`;super(t),this.name=`AgentServerUnsupportedVersionError`,this.message=t,this.actualVersion=e}},Y=class extends J{code=$e;actualVersion;requiredVersion=K;constructor(e){let t=`Could not determine this backend's agent-server version.${e?` It reported "${e}".`:``} Agent Canvas requires agent-server ${K} or newer, but this backend did not return a valid version from /server_info. Restart or rebuild the agent-server backend, then try again.`;super(t),this.name=`AgentServerUnknownVersionError`,this.message=t,this.actualVersion=e}},rt=e=>l()&&Z(e,401);function X(){q=null}function it(e){let t=et(q);return Array.isArray(t)?t.includes(e):!0}function at(e){return e instanceof Error&&e.name===`HttpError`&&`status`in e&&typeof e.status==`number`}function Z(e,t){return at(e)&&e.status===t}function ot(e){return typeof e.version==`string`&&e.version.trim()||null}function st(e){let t=ot(e);return!t||t.toLowerCase()===Ze?null:t}function ct(e){let t=st(e);return!t||!Q(t)?null:t}function lt(e,t){let n=Q(e),r=Q(t);if(!n||!r)return null;for(let e of[`major`,`minor`,`patch`]){if(n[e]>r[e])return 1;if(n[e]<r[e])return-1}return n.prerelease&&!r.prerelease?-1:!n.prerelease&&r.prerelease?1:n.prerelease&&r.prerelease?n.prerelease.localeCompare(r.prerelease):0}function Q(e){let[t]=e.trim().replace(/^v/,``).split(`+`),[n,r]=t.split(`-`,2),i=n.split(`.`);if(i.length!==3)return null;let[a,o,s]=i.map(e=>Number(e));return[a,o,s].every(e=>Number.isInteger(e)&&e>=0)?{major:a,minor:o,patch:s,prerelease:r}:null}function ut(e){let t=st(e);if(!t)throw X(),new Y(ot(e));let n=lt(t,K);if(n===null)throw X(),new Y(t);if(n<0)throw X(),new nt(t)}async function dt(){let e=pe();if(!e){if(X(),de(u().backend))throw new J(`No backend configured`,{noBackendConfigured:!0});return null}let t=ue({host:e.host,sessionApiKey:e.apiKey||null,timeout:Xe}),n;try{n=await new ie(t).getServerInfo()}catch(e){throw X(),Z(e,401)?e:new J(e instanceof Error?e.message:null)}if(ut(n),l())try{await new ae(t).getSettings()}catch(e){if(Z(e,401))throw e;console.warn(`[agent-server] getSettings() probe failed (non-401):`,e)}return q=n,n}var ft={WEB_CLIENT_CONFIG:[`web-client-config`]},pt={all:[`settings`],byScope:e=>[`settings`,e],personal:()=>[`settings`,`personal`]},mt={all:[`llm-profiles`]},ht={all:[`agent-profiles`]},gt={retry:!1},_t={all:[`llm-subscription`],openaiStatus:[`llm-subscription`,`openai`,`status`],openaiModels:[`llm-subscription`,`openai`,`models`]},vt={all:[`local-workspaces`]},yt={marketplace:[`plugins-marketplace`],installed:[`plugins-installed`],local:[`plugins-local`]},bt={staleTime:1e3*60*5,gcTime:1e3*60*15},$=g.createContext(null);function xt(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID():`backend-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function St({children:e}){let t=g.useSyncExternalStore(le,f,f),n=g.useCallback(()=>{X(),G.invalidateQueries({queryKey:ft.WEB_CLIENT_CONFIG})},[]),r=g.useCallback((e,t)=>{let r=m()?.backendId??null,i=m()?.orgId??null,a=t??null;e===r&&a===i||(h({backendId:e,orgId:a}),n())},[n]),i=g.useCallback(e=>{let t={...e,id:xt()};return p([...d(),t]),h({backendId:t.id}),n(),t},[n]),a=g.useCallback((e,t)=>{let r=d().find(t=>t.id===e),i=m()?.backendId??null;p(d().map(n=>n.id===e?{...n,...t}:n));let a=t.host!==void 0&&r!==void 0&&t.host!==r.host,o=t.apiKey!==void 0&&r!==void 0&&t.apiKey!==r.apiKey;(a||o)&&(We(e),i===e&&n())},[n]),o=g.useCallback(e=>{p(d().filter(t=>t.id!==e)),Ge(e),n()},[n]),s=g.useMemo(()=>({backends:t.backends,active:t.active,setActive:r,addBackend:i,updateBackend:a,removeBackend:o}),[t,r,i,a,o]);return(0,k.jsx)($.Provider,{value:s,children:e})}function Ct(){let e=g.useContext($);if(!e)throw Error(`useActiveBackendContext must be used inside <ActiveBackendProvider>`);return e}function wt(){let e=g.useContext($);return e?e.active:{backend:me()??fe,orgId:null}}export{M as A,_ as B,G as C,R as D,Ue as E,E as F,ye as G,S as H,T as I,Oe as L,Pe as M,Fe as N,He as O,D as P,w as R,W as S,Ve as T,C as U,x as V,ve as W,it as _,gt as a,dt as b,_t as c,ft as d,pt as f,rt as g,ct as h,ht as i,Ne as j,j as k,vt as l,X as m,wt as n,bt as o,ut as p,Ct as r,mt as s,St as t,yt as u,tt as v,Je as w,U as x,Z as y,he as z};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e=`workspace/project`,t=`__AGENT_CANVAS_LOCK_TO_CLOUD__`;function n(e){return e?.trim()||null}function r(e){if(!e)return null;let t=e.trim().replace(/\/$/,``);return t?/^https?:\/\//i.test(t)?t:typeof window<`u`?`${window.location.protocol}//${t}`:`http://${t}`:null}function i(e){if(!e)return null;let t=e.trim().replace(/\/+$/,``);return t?/^https?:\/\//i.test(t)?t:`https://${t}`:null}function a(){return r(void 0)}function o(){let e=n(void 0);if(e)return e;if(typeof window<`u`){let e=window.__AGENT_CANVAS_SESSION_API_KEY__;if(typeof e==`string`)return n(e)}return null}function s(){return{baseUrl:u()??``,sessionApiKey:d()??``}}function c(){let e=i(void 0);if(e)return e;if(typeof window<`u`){let e=window[t];if(typeof e==`string`)return i(e)}return null}function l(e,t){let n=i(e),r=i(t);return!n||!r?!1:n.toLowerCase()===r.toLowerCase()}function u(){return a()||(typeof window<`u`?window.location.origin:null)}function d(){return o()}function f(){return(void 0)?.trim()||e}function p(e){return`${f().replace(/\/+$/,``)}/${e.replace(/-/g,``)}`}function m(){let e=d();return e?{"X-Session-API-Key":e}:{}}function h(){return typeof window<`u`&&window.__AGENT_CANVAS_AUTH_REQUIRED__===!0}function ee(){return h()?!d():!1}var g=`default-local`,_=`Local`;function v(){if(c())return null;let e=u(),t=d();return!e||!t?null:{id:g,name:_,host:e,apiKey:t,kind:`local`}}var y=`openhands-backends`,b=`openhands-active-backend`;function x(e){return e===`local`||e===`cloud`}function te(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.id==`string`&&t.id.length>0&&typeof t.name==`string`&&typeof t.host==`string`&&typeof t.apiKey==`string`&&x(t.kind)}function S(e){try{let{hostname:t}=new URL(e);return t===`localhost`||t===`127.0.0.1`||t===`::1`||t===`[::1]`}catch{return!1}}function ne(e,t){return e.id!==`default-local`||e.kind!==`local`?!1:e.host===t.host||S(e.host)&&S(t.host)}function C(e){let t=v();if(!t)return e;let n=!1,r=e.map(e=>!ne(e,t)||e.apiKey===t.apiKey?e:(n=!0,{...e,apiKey:t.apiKey}));return n?(w(r),r):e}function w(e){if(!(typeof window>`u`))try{window.localStorage.setItem(y,JSON.stringify(e))}catch{}}function T(){if(typeof window>`u`)return[];try{let e=window.localStorage.getItem(y);if(e===null){let e=v();return e?(w([e]),[e]):[]}let t=JSON.parse(e);if(!Array.isArray(t))return[];let n=t.filter(te);if(n.length===0){let e=v();return e?(w([e]),[e]):[]}return C(n)}catch{return[]}}function E(e){if(!e)return null;try{let t=JSON.parse(e);if(typeof t!=`object`||!t||typeof t.backendId!=`string`)return null;let n=t.orgId;return{backendId:t.backendId,orgId:typeof n==`string`&&n.length>0?n:null}}catch{return null}}function D(e,t){try{return e?.getItem(t)??null}catch{return null}}function O(e,t,n){try{e?.setItem(t,n)}catch{}}function k(e,t){try{e?.removeItem(t)}catch{}}function A(){return typeof window>`u`?null:E(D(window.sessionStorage,b))||E(D(window.localStorage,b))}function j(e){if(typeof window>`u`)return;if(!e){k(window.sessionStorage,b),k(window.localStorage,b);return}let t=JSON.stringify({backendId:e.backendId,orgId:e.orgId??null});O(window.sessionStorage,b,t),O(window.localStorage,b,t)}var M=`no-backend`,N={id:M,name:`No Backend Available`,host:``,apiKey:``,kind:`local`};function P(e){return e.id===M}function re(e){return e[0]??N}function F(e,t){let n=null,r=null;if(t){let i=e.find(e=>e.id===t.backendId);i&&(n=i,r=t.orgId??null)}return n||(n=re(e),r=null),{backends:e,selection:t,active:{backend:n,orgId:r}}}var I=F(T(),A()),L=new Set;function R(){L.forEach(e=>e())}function z(){return I.active}function B(){let e=I.active.backend;return e.kind===`local`&&!P(e)?e:null}function V(){return I.backends}function H(){return I.selection}function U(){return I}function W(e){j(e),I=F(I.backends,e),R()}function G(e){w(e);let t=I.selection;t&&!e.some(e=>e.id===t.backendId)&&(t=null,j(null)),I=F(e,t),R()}function K(e){return L.add(e),()=>{L.delete(e)}}function q(e){if(e&&!e.startsWith(`/`))try{let t=new URL(e),n=t.hostname,r=window.location.hostname??window.location.host?.split(`:`)[0];return r&&(n===`localhost`||n===`127.0.0.1`)&&r!==`localhost`&&r!==`127.0.0.1`?`${r}:${t.port}`:t.host}catch{return window.location.host}return window.location.host}function J(e){if(e&&!e.startsWith(`/`))try{return(new URL(e).pathname.split(`/api/conversations`)[0]||``).replace(/\/$/,``)}catch{return``}return``}function Y(e){let t=q(e),n=J(e),r=window.location.protocol===`https:`,i=X(e)===`https:`;return`${r||i?`https:`:`http:`}//${t}${n}`}function X(e){if(!e||e.startsWith(`/`))return null;try{return new URL(e).protocol}catch{return null}}function ie(e,t){let n=q(e),r=J(e),i=window.location.protocol===`https:`,a=X(e)===`https:`,o=`${i||a?`wss:`:`ws:`}//${n}${r}/sockets/bash-events`;return t?`${o}?session_api_key=${encodeURIComponent(t)}`:o}function ae(e,t){if(!e)return null;let n=q(t),r=J(t),i=window.location.protocol===`https:`,a=X(t)===`https:`;return`${i||a?`wss:`:`ws:`}//${n}${r}/sockets/events/${e}`}var Z=class extends Error{constructor(){super(`No backend is configured.`),this.name=`NoBackendAvailableError`}};function Q(e){return e.replace(/\/+$/,``)}function oe(e,t){return e.host?Q(e.host):e.conversationUrl?Q(Y(e.conversationUrl)):Q(t?.host??``)}function $(e={}){let t=B();if(!t&&!e.host&&!e.conversationUrl)throw new Z;let n=e.sessionApiKey??e.apiKey??t?.apiKey??void 0;return{host:oe(e,t),...n?{apiKey:n}:{},workingDir:e.workingDir??f(),...e.timeout===void 0?{}:{timeout:e.timeout}}}function se(e){let{host:t,apiKey:n,timeout:r}=$(e);return{baseUrl:t,...n?{apiKey:n}:{},timeout:r??6e4}}export{m as C,ee as D,h as E,l as O,s as S,c as T,_,Y as a,p as b,z as c,V as d,U as f,K as g,G as h,ie as i,H as l,W as m,$ as n,ae as o,P as p,se as r,N as s,Z as t,B as u,v,f as w,u as x,e as y};
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/secrets-service-CZYjNxFw.js","assets/rolldown-runtime-BFRubm34.js","assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~ncdxw0bh-ClHnt5lR.js","assets/vendor-styling-CI0PQ3ab.js","assets/agent-server-client-options-DVLRd9sw.js","assets/proxy-CHmFkV16.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{St as e}from"./vendor-styling-CI0PQ3ab.js";import{d as t,f as n,r,s as i}from"./vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~ncdxw0bh-ClHnt5lR.js";import{_ as a}from"./active-backend-context-B3umL5R-.js";import{t as o}from"./common-Dh7OqABE.js";import{a as s,b as c,c as l,n as u,t as ee,u as d,w as f}from"./agent-server-client-options-DVLRd9sw.js";import{n as p,t as m}from"./proxy-CHmFkV16.js";import{t as h}from"./settings-mQUckT0g.js";import{t as te}from"./settings-service.api-K4ncGlBv.js";import{r as g,t as _}from"./vendor~root-layout~home~conversation-panel~conversation~launch~settings~settings-index~agen~enjl5xdm-mMKDm94D.js";import{t as v}from"./v4-DbCkTSoU.js";import{t as y}from"./profiles-service.api-CeYEmSM3.js";import{t as b}from"./vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~automations-~ki5qnp0d-rV6d1Iv_.js";import{f as x,o as S,s as ne}from"./acp-providers-Djl6vNn-.js";import{d as re,f as C,r as ie}from"./llm-subscription-DtsX5Lhg.js";import{t as ae}from"./llm-subscription-service-CKyaV24y.js";var w=new Map;function oe(e){return/^([/\\]|[a-zA-Z]:[/\\])/.test(e)}function se(e,t){return`${e.replace(/[/\\]+$/,``)}/${t.replace(/^[/\\]+/,``)}`}async function T(e={}){let n=u(e),r=n.host,i=w.get(r);if(i)return i;let a=(async()=>{let{home:e}=await new t(n).getHome();if(!e||typeof e!=`string`)throw Error(`Agent server returned an empty home directory`);return e.replace(/[/\\]+$/,``)})();w.set(r,a);try{return await a}catch(e){throw w.delete(r),e}}async function ce(e,t={}){let n=e.replace(/[/\\]+$/,``);return n?oe(n)?n:se(await T(t),n):T(t)}var E=`openhands-agent-server-conversation-metadata`,D=()=>{if(typeof window>`u`)return{};try{let e=window.localStorage.getItem(E);if(!e)return{};let t=JSON.parse(e);return!t||typeof t!=`object`?{}:t}catch{return{}}},le=e=>{if(!(typeof window>`u`)){if(Object.keys(e).length===0){window.localStorage.removeItem(E);return}window.localStorage.setItem(E,JSON.stringify(e))}},O=e=>D()[e]??null,k=(e,t)=>{let n=D();n[e]=t,le(n)},A=e=>{let t=D();e in t&&(delete t[e],le(t))};function j(e){if(!e?.id)return e;let t=O(e.id);return t?{...e,selected_repository:e.selected_repository??t.selected_repository??null,selected_branch:e.selected_branch??t.selected_branch??null,git_provider:e.git_provider??t.git_provider??null,selected_workspace:e.selected_workspace??t.selected_workspace??null}:e}function M(){let e=l().backend;if(e.kind!==`cloud`)throw Error(`Cloud conversations call requires a cloud backend.`);return e}async function ue(e=20,t){let n=M(),r=new URLSearchParams;r.set(`limit`,String(e)),t&&r.set(`page_id`,t),r.set(`sort_order`,`UPDATED_AT_DESC`);let i=await m({backend:n,method:`GET`,path:`/api/v1/app-conversations/search?${r.toString()}`});return{items:(i?.items??[]).map(e=>j(e)),next_page_id:i?.next_page_id??null}}async function N(e){if(e.length===0)return[];let t=M(),n=new URLSearchParams;for(let t of e)n.append(`ids`,t);return(await m({backend:t,method:`GET`,path:`/api/v1/app-conversations?${n.toString()}`})??[]).map(j)}async function de(e){return await m({backend:M(),method:`POST`,path:`/api/v1/app-conversations`,body:e})}async function fe(e){return m({backend:M(),method:`GET`,path:`/api/v1/app-conversations/${e}/download`,responseType:`blob`})}async function pe(e){await m({backend:M(),method:`DELETE`,path:`/api/v1/app-conversations/${e}`})}async function me(e,t){return await m({backend:M(),method:`PATCH`,path:`/api/v1/app-conversations/${e}`,body:{public:t}})}async function he(e){await m({backend:M(),method:`POST`,path:`/api/v1/sandboxes/${e}/pause`})}async function ge(e){await m({backend:M(),method:`POST`,path:`/api/v1/sandboxes/${e}/resume`})}async function P(e,t){let n=M(),r=new URLSearchParams;return r.append(`file_path`,t),await m({backend:n,method:`GET`,path:`/api/v1/app-conversations/${e}/file?${r.toString()}`})??``}async function _e(e){let t=M(),n=new URLSearchParams;return n.set(`ids`,e),(await m({backend:t,method:`GET`,path:`/api/v1/app-conversations/start-tasks?${n.toString()}`}))?.[0]??null}var F=`canvas_ui`,ve=`canvas_ui_tool`,ye=[`terminal`,`file_editor`,`task_tracker`,F],I=`browser_tool_set`,L=`task_tool_set`;function be(){return!0}function xe(){let e=(void 0)?.trim();if(e)return e;if(typeof window<`u`){let e=window.__AGENT_CANVAS_RUNTIME_SERVICES_INFO__;if(typeof e==`string`)return e.trim()||null}return null}function Se(){let e=xe();if(!e)return null;try{let t=JSON.parse(e);return!t||typeof t!=`object`?null:t}catch{return null}}function Ce(){let e=Se();if(!e?.services)return;let t=[];t.push(`<RUNTIME_SERVICES>`),e.mode?t.push(`You are running inside an agent-canvas dev stack started in '${e.mode}' mode.`):t.push(`You are running inside an agent-canvas dev stack.`),t.push(`The following services are reachable from your sandbox. URLs are written`,`from your point of view (i.e., as you should curl/fetch them).`,``);let{agent_server:n,ingress:r,automation:i}=e.services,{frontend:a}=e.services;n?.url_from_agent&&t.push(`* Agent Server (you): ${n.url_from_agent}`,` ${n.description??`The agent-server hosting your tool calls.`}`),r?.url_from_agent&&t.push(`* Ingress: ${r.url_from_agent}`,` ${r.description??`Unified entry point for browser-facing traffic.`}`),a?.url_from_agent&&t.push(`* Frontend: ${a.url_from_agent}`,` ${a.description??`Frontend dev server.`}`),i?.url_from_agent?(t.push(`* Automation backend: ${i.url_from_agent}`,` ${i.description??`OpenHands Automations service.`}`),i.docs_url&&t.push(` Docs: ${i.docs_url}`),i.openapi_url&&t.push(` OpenAPI: ${i.openapi_url}`),i.auth_env_var&&t.push(` Auth: header 'X-Session-API-Key: $${i.auth_env_var}'`)):t.push(`* Automation backend: not running in this dev mode (skip /api/automation calls).`);let o=n?.url_from_agent;return t.push(``,`Trust this block over guessing: do not assume any other URLs are running.`),o&&t.push(`In particular, ${o} inside your sandbox is the Agent Server`,`you are running inside of — NOT the automation backend.`),t.push(`</RUNTIME_SERVICES>`),t.join(`
|
|
3
|
-
`)}function we(e){let{host:t}=u();return`${t}/api/conversations/${e}`}function R(e){return`Conversation ${e.slice(0,5)}`}function z(e){let t=O(e.id),n=e.agent?.kind===`ACPAgent`,r=n?e.tags?.acpserver??e.agent?.acp_server??null:null;return{id:e.id,created_by_user_id:null,selected_repository:t?.selected_repository??null,selected_branch:t?.selected_branch??null,git_provider:t?.git_provider??null,selected_workspace:t?.selected_workspace??null,active_profile:t?.active_profile??null,title:e.title?.trim()?e.title:R(e.id),trigger:null,pr_number:[],agent_kind:n?`acp`:`openhands`,acp_server:r,llm_model:n?x({runtimeName:e.current_model_name,runtimeId:e.current_model_id,configured:e.agent?.acp_model,sdkLlm:e.agent?.llm?.model}):e.agent?.llm?.model??h.llm_model,metrics:e.metrics?{accumulated_cost:e.metrics.accumulated_cost??null,max_budget_per_task:e.metrics.max_budget_per_task??null,accumulated_token_usage:e.metrics.accumulated_token_usage?{prompt_tokens:e.metrics.accumulated_token_usage.prompt_tokens??0,completion_tokens:e.metrics.accumulated_token_usage.completion_tokens??0,cache_read_tokens:e.metrics.accumulated_token_usage.cache_read_tokens??0,cache_write_tokens:e.metrics.accumulated_token_usage.cache_write_tokens??0,context_window:e.metrics.accumulated_token_usage.context_window??0,per_turn_token:e.metrics.accumulated_token_usage.per_turn_token??0}:null}:null,created_at:e.created_at,updated_at:e.updated_at,execution_status:e.execution_status??o.IDLE,sandbox_status:e.sandbox_status??null,conversation_url:we(e.id),session_api_key:u().apiKey??null,sandbox_id:null,workspace:{working_dir:e.workspace?.working_dir??f()},public:!1,sub_conversation_ids:[]}}function Te(e){return{items:e.items.map(z),next_page_id:e.next_page_id??null}}var Ee=`acpserver`,De=`gAAAAA`,Oe=new Set([`schema_version`,`agent_settings`,`workspace`,`conversation_id`,`initial_message`,`plugins`]);function B(e){return!e||typeof e!=`object`||Array.isArray(e)?{}:structuredClone(e)}function V(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function H(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function U(e){return typeof e==`string`?e.startsWith(De):Array.isArray(e)?e.some(U):H(e)?Object.values(e).some(U):!1}function ke(e){return H(e)?Object.values(e).some(U):!1}function Ae(e){return e.confirmation_mode===!0?e.security_analyzer===`llm`?{kind:`ConfirmRisky`,threshold:`HIGH`,confirm_unknown:!0}:{kind:`AlwaysConfirm`}:{kind:`NeverConfirm`}}function je(e){switch(e.security_analyzer){case`llm`:return{kind:`LLMSecurityAnalyzer`};case`pattern`:return{kind:`PatternSecurityAnalyzer`};case`policy_rail`:return{kind:`PolicyRailSecurityAnalyzer`};default:return}}function Me(e){return!!e&&typeof e==`object`&&!Array.isArray(e)&&typeof e.name==`string`}function W(e,t){return e===F?a(e):e===I?be()&&a(e):e===L?t.enable_sub_agents===!0&&a(e):!0}function Ne(e){let t=new Map;for(let n of ye)W(n,e)&&t.set(n,{name:n,params:{}});for(let n of[I,L])W(n,e)&&t.set(n,{name:n,params:{}});let n=e.tools;if(Array.isArray(n)&&n.every(e=>Me(e)))for(let r of n)W(r.name,e)&&t.set(r.name,{name:r.name,params:B(r.params)});return Array.from(t.values())}function Pe(e,t){let n=[e?.trim(),t?.trim()].filter(Boolean);return n.length===0?null:{role:`user`,content:[{type:`text`,text:n.join(`
|
|
4
|
-
|
|
5
|
-
`)}],run:!0}}function Fe(){return b.map(e=>{let t=e.triggers?.length>0?{type:`keyword`,keywords:e.triggers}:null,n=`/home/runner/work/agent-canvas/agent-canvas/node_modules/@openhands/extensions/skills/${e.name}/SKILL.md`;return{name:e.name,content:e.content,trigger:t,source:n,description:e.description??null,is_agentskills_format:!0,...e.license?{license:e.license}:{},...e.compatibility?{compatibility:e.compatibility}:{}}})}function G(e){let t=Ce(),n=B(e.agent_context),r=[...Array.isArray(n.skills)?n.skills:[],...Fe()];return{...n,skills:r,load_public_skills:!1,load_user_skills:!0,load_project_skills:!0,...t?{system_message_suffix:t}:{}}}function K(e){return B(e.agent_settings).agent_kind===`acp`}function Ie(e){let t=B(e.agent_settings).acp_server;return typeof t==`string`&&t.length>0?t:void 0}function Le(e){let t=e.acp_command;if(!(Array.isArray(t)&&t.length===0)&&t!==void 0)return t;let n=ne(typeof e.acp_server==`string`?e.acp_server:void 0);return n?[...n.default_command]:t}function Re(e){let t=B(e.agent_settings),n={agent_kind:`acp`,agent_context:G(t)};for(let e of _){if(e===`acp_model`||e===`acp_env`)continue;let r=e===`acp_command`?Le(t):t[e];r!=null&&(n[e]=r)}let r=B(t.mcp_config);Object.keys(r).length>0&&(n.mcp_config=r);let i=typeof t.acp_server==`string`?t.acp_server:void 0,a=x({configured:t.acp_model,providerDefault:S(i)});return a&&(n.acp_model=a),n}function ze(e){let t=B(e.agent_settings),n=B(t.llm);n.model=typeof n.model==`string`&&n.model.trim().length>0?n.model:h.llm_model,n.stream=!0;let r=V(n.api_key);r?n.api_key=r:delete n.api_key;let i=V(n.base_url);i?n.base_url=i:delete n.base_url,C(n)?(n.auth_type=ie,n.subscription_vendor=re,delete n.api_key,delete n.base_url):(delete n.auth_type,delete n.subscription_vendor);let a=B(t.mcp_config);Object.keys(a).length===0&&delete t.mcp_config,delete t.acp_server;for(let e of _)delete t[e];return delete t.acp_env,{...t,llm:n,agent_context:G(t),tools:Ne(t)}}function Be(e){return K(e)?Re(e):ze(e)}function Ve(e){let{settings:t,query:n,conversationInstructions:r,plugins:i,workingDir:a}=e,o=B(t.conversation_settings),s=Pe(n,r);return Oe.forEach(e=>delete o[e]),{...o,workspace:{kind:`LocalWorkspace`,working_dir:a??f()},...s?{initial_message:s}:{},...i?.length?{plugins:i.map(e=>({source:e.source,...e.ref?{ref:e.ref}:{},...e.repo_path?{repo_path:e.repo_path}:{}}))}:{}}}function He(e){let t=e.encryptedAgentSettings?{...e.settings,agent_settings:e.encryptedAgentSettings}:e.settings,n=K(t),r=Be(t),i=n?Ie(t):void 0,o=Ve(e.encryptedConversationSettings?{...e,settings:{...e.settings,conversation_settings:e.encryptedConversationSettings}}:e),s={...e.agentProfileId?{agent_profile_id:e.agentProfileId}:{agent_settings:r},workspace:o.workspace,confirmation_policy:Ae(o),max_iterations:typeof o.max_iterations==`number`?o.max_iterations:500,stuck_detection:!0,autotitle:!0,worktree:e.worktree??!0};!e.agentProfileId&&i&&(s.tags={[Ee]:i}),!e.agentProfileId&&e.secretsEncrypted&&(!n||ke(r.mcp_config))&&(s.secrets_encrypted=!0),e.conversationId&&(s.conversation_id=e.conversationId);let c=je(o);c&&(s.security_analyzer=c),o.initial_message&&(s.initial_message=o.initial_message),o.plugins&&(s.plugins=o.plugins),o.hook_config&&(s.hook_config=o.hook_config);let l={},u=a(F);if(u&&(l[F]=ve),Object.assign(l,o.tool_module_qualnames??{}),u||delete l[F],Object.keys(l).length>0&&(s.tool_module_qualnames=l),o.agent_definitions&&(s.agent_definitions=o.agent_definitions),e.customSecrets&&e.customSecrets.length>0){let t=d(),n=t?p(t):{},r={};for(let t of e.customSecrets){let e={kind:`LookupSecret`,url:`/api/settings/secrets/${encodeURIComponent(t.name)}`,description:t.description};Object.keys(n).length>0&&(e.headers=n),r[t.name]=e}s.secrets=r}return s}var Ue=`Connect your ChatGPT subscription before starting a conversation with this LLM profile.`;async function q(e){if(C(B(e.llm))&&!(await ae.getOpenAIStatus()).connected)throw Error(Ue)}async function We(t){let{SecretsService:n}=await e(async()=>{let{SecretsService:e}=await import(`./secrets-service-CZYjNxFw.js`).then(e=>e.n);return{SecretsService:e}},__vite__mapDeps([0,1,2,3,4,5])),[r,i]=await Promise.all([te.getSettingsForConversation(),n.getSecrets()]),{agentSettings:a,conversationSettings:o,secretsEncrypted:s}=r;return t.agentProfileId||await q(a),He({...t,encryptedAgentSettings:a,encryptedConversationSettings:o,secretsEncrypted:s,customSecrets:i})}function Ge(){return{hooks:[]}}var Ke=`1970-01-01T00:00:00.000Z`,qe=`Unable to load conversations because the selected agent server returned data this UI does not understand. Check the backend URL/session key and update the agent server if needed.`;function J(){return Error(qe)}function Y(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function X(e){return typeof e==`number`?e:null}function Z(e){return typeof e==`number`?e:0}function Q(e){return typeof e==`string`?e:null}function Je(e,t,n){let r=e[t]??e[n];return typeof r==`string`&&r.trim()?r:Ke}function Ye(e){return Y(e)?{prompt_tokens:Z(e.prompt_tokens),completion_tokens:Z(e.completion_tokens),cache_read_tokens:Z(e.cache_read_tokens),cache_write_tokens:Z(e.cache_write_tokens),context_window:Z(e.context_window),per_turn_token:Z(e.per_turn_token)}:null}function Xe(e){return Y(e)?{accumulated_cost:X(e.accumulated_cost),max_budget_per_task:X(e.max_budget_per_task),accumulated_token_usage:Ye(e.accumulated_token_usage)}:null}function Ze(e){if(!Y(e))return null;let t=Y(e.llm)?{model:Q(e.llm.model)}:null;return{kind:Q(e.kind),acp_server:Q(e.acp_server),acp_model:Q(e.acp_model),llm:t}}function Qe(e){return Y(e)?{working_dir:Q(e.working_dir)}:null}function $e(e){if(!Y(e))return null;let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return t}function et(e){if(!e.startsWith(`/`))return null;let t=[];for(let n of e.split(`/`))if(n&&n!==`.`)if(n===`..`){if(!t.length)return null;t.pop()}else t.push(n);return`/${t.join(`/`)}`}function tt(e,t){let n=et(e),r=et(t);if(!n||!r||n!==r&&!n.startsWith(`${r}/`))throw Error(`Conversation file path must stay inside the workspace`);return n}function nt(e){if(!Y(e)||typeof e.id!=`string`||!e.id.trim())throw J();return{id:e.id.trim(),title:Q(e.title),created_at:Je(e,`created_at`,`createdAt`),updated_at:Je(e,`updated_at`,`updatedAt`),execution_status:Q(e.execution_status),sandbox_status:Q(e.sandbox_status),metrics:Xe(e.metrics),agent:Ze(e.agent),workspace:Qe(e.workspace),tags:$e(e.tags),current_model_id:Q(e.current_model_id),current_model_name:Q(e.current_model_name)}}function $(e){if(!Array.isArray(e))throw J();return e.map(nt)}function rt(e){if(Array.isArray(e))return{items:$(e),next_page_id:null};if(!Y(e))throw J();return{items:$(e.items),next_page_id:typeof e.next_page_id==`string`?e.next_page_id:null}}var it=new Set([`idle`,`running`,`paused`,`waiting_for_confirmation`,`finished`,`error`,`stuck`]);function at(e){let t=e??`idle`;return it.has(t)?t:`idle`}function ot(e,t){if(!e)throw Error(`Conversation ${t} was not found`);return e}var st=class{static async sendMessage(e,t,r){let i=l().backend,a=r?.conversationUrl??null,o=r?.sessionApiKey??null;if(i.kind===`cloud`){if(!a||!o){let[t]=await N([e]);a=t?.conversation_url?.trim()??null,o=t?.session_api_key?.trim()??null}if(!a||!o)throw Error(`Conversation sandbox is still starting. Wait for it to finish, then try again.`);return await m({backend:i,method:`POST`,hostOverride:s(a),path:`/api/conversations/${e}/events`,body:{...t,run:!0},authMode:`session-api-key`,sessionApiKey:o}),t}return await new n(u({conversationUrl:a,sessionApiKey:o})).sendEvent(e,t,{run:!0}),t}static async createConversation(e,t,r,i,a,o,s,f,p,m){if(l().backend.kind===`cloud`)return de({initial_message:e?{role:`user`,content:[{type:`text`,text:e}]}:null,title:t??null,selected_repository:i?.selected_repository??null,selected_branch:i?.selected_branch??null,git_provider:i?.git_provider??null,plugins:r??null,parent_conversation_id:s??null,agent_type:f,sandbox_id:p??null,agent_profile_id:m??null});let h=await te.getSettings(),g=v(),_=await ce(a??c(g)),y=o??(a?`local_repo`:`new_worktree`),b=await We({settings:h,query:e,conversationInstructions:t,plugins:r,conversationId:g,workingDir:_,worktree:y===`new_worktree`,agentProfileId:m}),x=await new n(u()).createConversation(b),S=d();if(!S)throw new ee;return(i?.selected_repository||a)&&k(x.id,{selected_repository:i?.selected_repository??null,selected_branch:i?.selected_branch??null,git_provider:i?.git_provider??null,selected_workspace:a??null,workspace_mode:y}),{id:x.id,created_by_user_id:null,status:`READY`,detail:null,app_conversation_id:x.id,agent_server_url:S.host,request:{initial_message:b.initial_message,plugins:r??null},created_at:x.created_at,updated_at:x.updated_at}}static async getStartTask(e){return l().backend.kind===`cloud`?_e(e):null}static async getVSCodeUrl(e,t,n){let i=await this.resolveConversationWorkingDir(e);return{vscode_url:await new r(u({conversationUrl:t,sessionApiKey:n})).getUrl({baseUrl:typeof window<`u`?window.location.origin:void 0,workspaceDir:i})}}static async resolveConversationWorkingDir(e){let[t]=await this.batchGetAppConversations([e]);return t?.workspace?.working_dir??f()}static async batchGetAppConversations(e){return e.length===0?[]:l().backend.kind===`cloud`?N(e):$(await new n(u()).getConversations(e)).map(e=>z(e))}static async updateConversationPublicFlag(e,t){if(l().backend.kind!==`cloud`)throw Error(`Public sharing requires a cloud backend.`);return me(e,t)}static async updateConversationRepository(e,t,n,r){t?k(e,{...O(e)??{},selected_repository:t,selected_branch:n??null,git_provider:r??null}):A(e);let[i]=await this.batchGetAppConversations([e]);return ot(i,e)}static async readConversationFile(e,n){if(l().backend.kind===`cloud`)return P(e,tt(n??`/workspace/project/.agents_tmp/PLAN.md`,`/workspace/project`));let r=await this.resolveConversationWorkingDir(e),i=tt(n??`${r}/.agents_tmp/PLAN.md`,r);return new t(u()).downloadTextFile(i)}static async downloadConversation(e){return l().backend.kind===`cloud`?fe(e):new t(u()).downloadTrajectory(e)}static async getHooks(e){return Ge()}static async getRuntimeConversation(e,t,r){let i=l().backend,a=i.kind===`cloud`&&t?await m({backend:i,method:`GET`,hostOverride:s(t),path:`/api/conversations/${e}`,authMode:`session-api-key`,sessionApiKey:r}):await new n(u({conversationUrl:t,sessionApiKey:r})).getConversation(e),o=nt(a),c=Y(a)?a.stats:null;return{id:o.id,title:o.title?.trim()?o.title:R(o.id),metrics:Xe(o.metrics),created_at:o.created_at,updated_at:o.updated_at,status:at(o.execution_status),stats:Y(c)?c:{usage_to_metrics:{}}}}static async searchConversations(e=20,t){return l().backend.kind===`cloud`?ue(e,t):Te(rt(await new n(u()).searchConversations({limit:e,page_id:t,sort_order:g.UPDATED_AT_DESC})))}static async deleteConversation(e){l().backend.kind===`cloud`?await pe(e):await new n(u()).deleteConversation(e),A(e)}static async updateConversationTitle(e,t){await new n(u()).updateConversation(e,{title:t});let[r]=await this.batchGetAppConversations([e]);return ot(r,e)}static async forkConversation(e,t,r){if(l().backend.kind===`cloud`)throw Error(`Branching a conversation isn't supported on the cloud backend yet.`);let i=await new n(u()).forkConversation(e,{from_event_id:t,...r?{title:r}:{}}),a=O(e);return a&&k(i.id,a),i}static async getEventParentId(e,t){return(await new n(u()).getEvent(e,t)).parent_id??void 0}static async switchProfile(e,t){let{backend:r}=l();if(r.kind===`cloud`){if(!e){await y.activateProfile(t);return}await m({backend:r,method:`POST`,path:`/api/v1/app-conversations/${e}/switch_profile`,body:{profile_name:t}});return}if(!e){await new i(u()).activateProfile(t);return}let a=u(),o=new n(a),s=await new i(a).getProfile(t,{exposeSecrets:`encrypted`}),c=typeof s.config.model==`string`?s.config.model:``;if(!c)throw Error(`Profile '${t}' has no model.`);await q({llm:s.config}),await o.switchLLM(e,{...s.config,model:c,stream:!0,usage_id:`profile:${t}:${v()}`})}static async switchAcpModel(e,t){let{backend:r}=l();if(r.kind===`cloud`){await m({backend:r,method:`POST`,path:`/api/v1/app-conversations/${e}/switch_acp_model`,body:{model:t}});return}await new n(u()).switchAcpModel(e,t)}};export{ge as a,ce as c,P as i,N as n,O as o,he as r,k as s,st as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e,r as t}from"./agent-settings-lUknCeaF.js";export{e as default,t as handle};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-BFRubm34.js";import{Ct as t,bt as n}from"./vendor-styling-CI0PQ3ab.js";import{t as r}from"./useTranslation-CDRCKC9-.js";import{t as i}from"./declaration-gq8V5eTU.js";import{o as a}from"./vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~ncdxw0bh-ClHnt5lR.js";import{r as o,y as s}from"./active-backend-context-B3umL5R-.js";import{t as c}from"./utils-D3U3rlqr.js";import{n as l,p as u}from"./agent-server-client-options-DVLRd9sw.js";import{r as d,t as f}from"./modal-body-DouOE5KH.js";import{t as p}from"./brand-button-vMVuyDXu.js";import{a as m,n as h}from"./backend-form-modal-DSbrafX2.js";var g=e(t(),1),_=n();function v(){let{t:e}=r(`openhands`),{active:t,addBackend:n,updateBackend:v}=o(),y=window.location.origin,[b,x]=g.useState(!1),[S,C]=g.useState(`idle`),[w,T]=g.useState(null),E=g.useCallback(async r=>{x(!0),C(`idle`),T(null);try{await new a(l({host:r.host,sessionApiKey:r.apiKey,timeout:5e3})).getSettings(),C(`success`),u(t.backend)?n(r):v(t.backend.id,r),window.location.reload()}catch(t){if(C(`error`),s(t,401))T(e(i.AUTH$INVALID_KEY));else{let n=t instanceof Error?t.message:String(t);T(`${e(i.AUTH$CONNECTION_FAILED)}${n?`: ${n}`:``}`)}x(!1)}},[t.backend,n,v,e]);return(0,_.jsx)(`div`,{"data-testid":`api-key-entry-screen`,className:`flex min-h-screen items-center justify-center bg-base px-6`,children:(0,_.jsxs)(`div`,{className:c(`relative rounded-xl border border-[var(--oh-border)] bg-base-secondary`,d(`md`),f),children:[(0,_.jsx)(`div`,{className:`px-6 pt-6 pb-2 pr-12`,children:(0,_.jsx)(`h2`,{className:`text-lg font-semibold`,children:e(i.BACKEND$ADD_TITLE)})}),(0,_.jsx)(`div`,{className:`px-6 pb-6 pt-2`,children:(0,_.jsx)(h,{mode:`add`,backend:{...t.backend,host:y,apiKey:``,name:``},onSubmitted:()=>{},testIdRoot:`api-key-entry`,hostReadOnly:!0,requireApiKey:!0,onSubmitOverride:E,renderActions:({canSubmit:t,testIdRoot:n})=>(0,_.jsxs)(_.Fragment,{children:[S!==`idle`&&(0,_.jsxs)(`div`,{className:`flex items-center gap-3 text-sm`,children:[(0,_.jsx)(m,{isConnected:S===`success`}),(0,_.jsx)(`span`,{"data-testid":`${n}-status`,className:S===`error`?`text-red-400`:`text-green-400`,children:S===`error`?w:e(i.ONBOARDING$BACKEND_STATUS_CONNECTED)})]}),(0,_.jsx)(p,{type:`submit`,variant:`secondary`,isDisabled:!t||b,testId:`${n}-submit`,className:`w-full text-center`,children:e(b?i.ONBOARDING$BACKEND_STATUS_CHECKING:i.BACKEND$CONNECT)})]})})})]})})}export{v as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-BFRubm34.js";import{Ct as t,bt as n}from"./vendor-styling-CI0PQ3ab.js";import{L as r}from"./vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~byh8a1g4-XNPdpuO8.js";import{t as i}from"./useTranslation-CDRCKC9-.js";import{t as a}from"./declaration-gq8V5eTU.js";import{A as o,P as s,j as c,z as l}from"./active-backend-context-B3umL5R-.js";import{n as u}from"./vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~nn5zty47-Zl0G1QCy.js";import{t as d}from"./brand-button-vMVuyDXu.js";import{i as f,n as p,r as m,t as h}from"./color-themes-DPBzNtVg.js";import{t as g}from"./settings-input-bD6npsDm.js";import{t as _}from"./settings-mQUckT0g.js";import{r as v}from"./use-settings-BReAMxCG.js";import{t as y}from"./handle-capture-consent-CPMXU29K.js";import{t as b}from"./use-save-settings-D1HoCDbn.js";import{t as x}from"./settings-dropdown-input-BjunGXJb.js";import{n as S,t as C}from"./switch-skeleton-DqQwalyu.js";import{t as w}from"./settings-switch-5cuxl8Dc.js";var T=e(t(),1),E=n();function D({defaultKey:e,onChange:t,name:n}){let{t:r}=i(`openhands`);return(0,E.jsx)(x,{testId:n,name:n,onInputChange:t,label:r(a.SETTINGS$LANGUAGE),items:l.map(e=>({key:e.value,label:e.label})),defaultSelectedKey:e,isClearable:!1,wrapperClassName:`w-full min-w-0`})}function O(){let{t:e}=i(`openhands`),t=T.useCallback(e=>{if(!e)return;let t=e;p(t),m(t)},[]);return(0,E.jsx)(x,{testId:`color-theme-input`,name:`color-theme-input`,label:e(a.SETTINGS$COLOR_THEME),items:h.map(e=>({key:e.key,label:e.label})),defaultSelectedKey:f(),onSelectionChange:t,isClearable:!1,wrapperClassName:`w-full min-w-0`})}function k(){return(0,E.jsxs)(`div`,{"data-testid":`app-settings-skeleton`,className:`px-11 py-9 flex flex-col gap-6`,children:[(0,E.jsx)(S,{}),(0,E.jsx)(C,{}),(0,E.jsx)(C,{})]})}function A(){let e=u(),{t}=i(`openhands`),{mutate:n,isPending:r}=b(),{data:f,isLoading:p}=v(),[m,h]=T.useState(!1),[x,S]=T.useState(!1),[C,A]=T.useState(!1),[j,M]=T.useState(!1),[N,P]=T.useState(!1),F=r=>{let i=r.get(`language-input`)?.toString(),u=l.find(({label:e})=>e===i)?.value||_.language,d=r.get(`enable-analytics-switch`)?.toString()===`on`;n({language:u,user_consents_to_analytics:d,enable_sound_notifications:r.get(`enable-sound-notifications-switch`)?.toString()===`on`,git_user_name:r.get(`git-user-name-input`)?.toString()||_.git_user_name,git_user_email:r.get(`git-user-email-input`)?.toString()||_.git_user_email},{onSuccess:()=>{y(e,d),c(t(a.SETTINGS$SAVED))},onError:e=>{o(s(e)||t(a.ERROR$GENERIC))},onSettled:()=>{h(!1),S(!1),A(!1),M(!1),P(!1)}})},I=e=>{let t=l.find(({label:t})=>t===e)?.label,n=l.find(({value:e})=>e===f?.language)?.label;h(t!==n)},L=e=>{S(e!==(f?.user_consents_to_analytics??!0))},R=e=>{A(e!==!!f?.enable_sound_notifications)},z=e=>{let t=f?.git_user_name;M(e!==t)},B=e=>{let t=f?.git_user_email;P(e!==t)},V=!m&&!x&&!C&&!j&&!N,H=!f||p||r;return(0,E.jsxs)(`form`,{"data-testid":`app-settings-screen`,action:F,className:`flex flex-col gap-6`,children:[H&&(0,E.jsx)(k,{}),!H&&(0,E.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,E.jsx)(D,{name:`language-input`,defaultKey:f.language,onChange:I}),(0,E.jsx)(O,{}),(0,E.jsx)(w,{testId:`enable-analytics-switch`,name:`enable-analytics-switch`,defaultIsToggled:f.user_consents_to_analytics??!0,onToggle:L,children:t(a.ANALYTICS$SEND_ANONYMOUS_DATA)}),(0,E.jsx)(w,{testId:`enable-sound-notifications-switch`,name:`enable-sound-notifications-switch`,defaultIsToggled:!!f.enable_sound_notifications,onToggle:R,children:t(a.SETTINGS$SOUND_NOTIFICATIONS)}),(0,E.jsxs)(`div`,{className:`border-t border-[var(--oh-border)] pt-6 mt-2`,children:[(0,E.jsx)(`h3`,{className:`text-lg font-medium mb-2`,children:t(a.SETTINGS$GIT_SETTINGS)}),(0,E.jsx)(`p`,{className:`mb-4 text-sm leading-5 text-tertiary-light`,children:t(a.SETTINGS$GIT_SETTINGS_DESCRIPTION)}),(0,E.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,E.jsx)(g,{testId:`git-user-name-input`,name:`git-user-name-input`,type:`text`,label:t(a.SETTINGS$GIT_USERNAME),defaultValue:f.git_user_name||``,onChange:z,placeholder:t(a.SETTINGS$GIT_USERNAME_PLACEHOLDER),className:`w-full min-w-0`}),(0,E.jsx)(g,{testId:`git-user-email-input`,name:`git-user-email-input`,type:`email`,label:t(a.SETTINGS$GIT_EMAIL),defaultValue:f.git_user_email||``,onChange:B,placeholder:t(a.SETTINGS$GIT_EMAIL_PLACEHOLDER),className:`w-full min-w-0`})]}),(0,E.jsx)(`div`,{className:`flex justify-start pt-4`,children:(0,E.jsxs)(d,{testId:`submit-button`,variant:`primary`,type:`submit`,isDisabled:r||V,children:[!r&&t(a.SETTINGS$SAVE_CHANGES),r&&t(a.SETTINGS$SAVING)]})})]})]})]})}var j=r(A);export{j as default};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-BFRubm34.js";import{Ct as t,bt as n}from"./vendor-styling-CI0PQ3ab.js";import{L as r,P as i}from"./vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~byh8a1g4-XNPdpuO8.js";import{t as a}from"./useQuery-CpjHYtZc.js";import{t as o}from"./useTranslation-CDRCKC9-.js";import{t as s}from"./declaration-gq8V5eTU.js";import{b as c,p as l,y as u}from"./vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~ncdxw0bh-ClHnt5lR.js";import{A as d,j as f,n as p}from"./active-backend-context-B3umL5R-.js";import{t as m}from"./back-nav-button-CUS2mi-U.js";import{i as h,t as g}from"./utils-D3U3rlqr.js";import{a as _,c as v,n as y}from"./agent-server-client-options-DVLRd9sw.js";import{t as b}from"./proxy-CHmFkV16.js";import{r as x}from"./modal-classes-Cf-4tbHz.js";import{t as S}from"./brand-button-vMVuyDXu.js";import{n as C}from"./navigation-context-DPs2G0X8.js";import{t as w}from"./use-tracking-2ZwQwpg_.js";import{t as T}from"./use-create-conversation-CTsvZ96U.js";import{t as E}from"./u-edit-DJ90xc8Z.js";import{t as D}from"./terminal-BuLtIrb9.js";import{t as O}from"./use-user-conversation-OAfenBRG.js";import{t as k}from"./toggle-switch-2j5wwR85.js";import{t as ee}from"./x-mark-Batp6gXa.js";import{t as A}from"./code-tag-DYlAhEQY.js";import{t as j}from"./link-external-DfKQroKX.js";import{C as te,D as M,E as ne,O as re,S as ie,T as ae,_ as N,a as oe,b as se,c as P,d as F,f as I,g as L,h as ce,i as le,l as ue,m as R,o as de,p as fe,r as pe,s as me,t as he,u as ge}from"./automation-export-FWY9LPsG.js";import{t as z}from"./automation-BU8zu-FP.js";var B=e(t()),V=n();function H(){let{t:e}=o(`openhands`);return(0,V.jsx)(m,{to:`/automations`,children:e(s.AUTOMATIONS$DETAIL$BACK_TO_LIST)})}var U=e=>(0,V.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 24 24`,stroke:`currentColor`,strokeWidth:2,...e,children:(0,V.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3`})});function _e({active:e}){let{t}=o(`openhands`);return(0,V.jsx)(`span`,{"data-testid":e?`active-status-badge-active`:`active-status-badge-inactive`,className:g(`inline-flex items-center rounded-full px-3 py-1 text-xs font-medium`,e?`bg-[var(--oh-success)]/15 text-[var(--oh-success)]`:`bg-surface-raised text-muted`),children:t(e?s.AUTOMATIONS$DETAIL$ACTIVE:s.AUTOMATIONS$DETAIL$INACTIVE)})}function ve({automation:e,onToggle:t,onEdit:n,onDelete:r,onExport:i,onDownloadTarball:a,onRunNow:c,isRunningNow:l=!1}){let{t:u}=o(`openhands`),d=L(`manage_automations`),f=[...n?[{label:u(s.AUTOMATIONS$EDIT),icon:(0,V.jsx)(E,{className:`size-4`}),onClick:n}]:[],{label:e.enabled?u(s.AUTOMATIONS$TURN_OFF):u(s.AUTOMATIONS$TURN_ON),icon:(0,V.jsx)(ge,{className:`size-4`}),onClick:t},{label:u(s.AUTOMATIONS$EXPORT),icon:(0,V.jsx)(U,{className:`size-4`}),onClick:i},{label:u(s.AUTOMATIONS$DOWNLOAD_TARBALL),icon:(0,V.jsx)(U,{className:`size-4`}),onClick:a},{label:u(s.AUTOMATIONS$DELETE),icon:(0,V.jsx)(ue,{className:`size-4`}),onClick:r}];return(0,V.jsx)(`div`,{className:`flex flex-col gap-4`,children:(0,V.jsxs)(`div`,{className:`flex items-start justify-between`,children:[(0,V.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,V.jsx)(`h1`,{className:`text-xl font-medium text-content`,children:e.name}),(0,V.jsx)(_e,{active:e.enabled})]}),(0,V.jsxs)(`div`,{className:`flex items-center gap-2`,children:[d&&c&&(0,V.jsxs)(`button`,{type:`button`,className:`inline-flex items-center gap-1.5 rounded-md border border-[var(--oh-border)] px-3 py-1.5 text-sm font-medium text-content transition-colors hover:bg-surface-raised disabled:cursor-not-allowed disabled:opacity-60`,disabled:l||!e.enabled,onClick:c,children:[(0,V.jsx)(ce,{className:`size-3.5 shrink-0`,"aria-hidden":!0}),u(l?s.AUTOMATIONS$STARTING:s.AUTOMATIONS$RUN_NOW)]}),d&&(0,V.jsx)(k,{enabled:e.enabled,label:e.enabled?u(s.AUTOMATIONS$TURN_OFF):u(s.AUTOMATIONS$TURN_ON),onToggle:t}),d&&(0,V.jsx)(N,{items:f})]})]})})}function W({icon:e,title:t,children:n}){return(0,V.jsxs)(`div`,{className:`rounded-2xl border border-[var(--oh-border)] bg-[var(--oh-surface)]`,children:[(0,V.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-[var(--oh-border)] px-5 py-3`,children:[(0,V.jsx)(`span`,{className:`size-4 text-muted`,children:e}),(0,V.jsx)(`h3`,{className:`text-sm font-medium text-content`,children:t})]}),(0,V.jsx)(`div`,{className:`px-5 py-5`,children:n})]})}var ye=240,be=`max-h-60`;function xe({prompt:e}){let{t}=o(`openhands`),[n,r]=B.useState(!1),[i,a]=B.useState(!1),c=B.useRef(null),l=i&&!n;return B.useLayoutEffect(()=>{let e=c.current;if(!e)return;let t=()=>{a(e.scrollHeight>ye)};t();let n=new ResizeObserver(t);return n.observe(e),()=>n.disconnect()},[e]),(0,V.jsx)(W,{icon:(0,V.jsx)(D,{className:`size-4`}),title:t(s.AUTOMATIONS$DETAIL$PROMPT),children:(0,V.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,V.jsxs)(`div`,{className:`relative`,children:[(0,V.jsx)(`p`,{ref:c,className:g(`whitespace-pre-wrap text-sm leading-6 text-content`,l&&g(be,`overflow-hidden`)),"data-testid":`automation-prompt-content`,children:e}),l?(0,V.jsx)(`div`,{className:`pointer-events-none absolute inset-x-0 bottom-0 h-20 bg-gradient-to-t from-[var(--oh-surface)] to-transparent`,"aria-hidden":!0,"data-testid":`automation-prompt-fade`}):null]}),i?(0,V.jsx)(`button`,{type:`button`,className:`self-start cursor-pointer text-sm font-normal text-[var(--oh-muted)] hover:text-white`,onClick:()=>r(e=>!e),"data-testid":`automation-prompt-toggle`,children:t(n?s.COMMON$VIEW_LESS:s.COMMON$VIEW_MORE)}):null]})})}var Se=e=>(0,V.jsxs)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 24 24`,strokeWidth:2,stroke:`currentColor`,...e,children:[(0,V.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M10.343 3.94c.09-.542.56-.94 1.11-.94h1.093c.55 0 1.02.398 1.11.94l.149.894c.07.424.384.764.78.93.398.164.855.142 1.205-.108l.737-.527a1.125 1.125 0 0 1 1.45.12l.773.774c.39.389.44 1.002.12 1.45l-.527.737c-.25.35-.272.806-.107 1.204.165.397.505.71.93.78l.893.15c.543.09.94.56.94 1.109v1.094c0 .55-.397 1.02-.94 1.11l-.893.149c-.425.07-.765.383-.93.78-.165.398-.143.854.107 1.204l.527.738c.32.447.269 1.06-.12 1.45l-.774.773a1.125 1.125 0 0 1-1.449.12l-.738-.527c-.35-.25-.806-.272-1.204-.107-.397.165-.71.505-.78.929l-.15.894c-.09.542-.56.94-1.11.94h-1.094c-.55 0-1.019-.398-1.11-.94l-.148-.894c-.071-.424-.384-.764-.781-.93-.398-.164-.854-.142-1.204.108l-.738.527c-.447.32-1.06.269-1.45-.12l-.773-.774a1.125 1.125 0 0 1-.12-1.45l.527-.737c.25-.35.273-.806.108-1.204-.165-.397-.506-.71-.93-.78l-.894-.15c-.542-.09-.94-.56-.94-1.109v-1.094c0-.55.398-1.02.94-1.11l.894-.149c.424-.07.765-.383.93-.78.165-.398.143-.854-.108-1.204l-.526-.738a1.125 1.125 0 0 1 .12-1.45l.773-.773a1.125 1.125 0 0 1 1.45-.12l.737.527c.35.25.807.272 1.204.107.397-.165.71-.505.78-.929l.15-.894Z`}),(0,V.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z`})]}),Ce=e=>(0,V.jsxs)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 24 24`,strokeWidth:2,stroke:`currentColor`,...e,children:[(0,V.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M6 3v12m0 0a3 3 0 1 0 3 3M6 15a3 3 0 0 1 3-3h6a3 3 0 0 0 3-3V3m0 0a3 3 0 1 0 0 0`}),(0,V.jsx)(`circle`,{cx:6,cy:3,r:2}),(0,V.jsx)(`circle`,{cx:18,cy:3,r:2}),(0,V.jsx)(`circle`,{cx:9,cy:18,r:2})]}),G=e=>(0,V.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 24 24`,strokeWidth:2,stroke:`currentColor`,...e,children:(0,V.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M9 12.75 11.25 15 15 9.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z`})}),K=e=>(0,V.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 24 24`,strokeWidth:2,stroke:`currentColor`,...e,children:(0,V.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5`})}),we=e=>(0,V.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 24 24`,strokeWidth:2,stroke:`currentColor`,...e,children:(0,V.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M14.857 17.082a23.848 23.848 0 0 0 5.454-1.31A8.967 8.967 0 0 1 18 9.75V9A6 6 0 0 0 6 9v.75a8.967 8.967 0 0 1-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 0 1-5.714 0m5.714 0a3 3 0 1 1-5.714 0`})});function q({icon:e,label:t,children:n}){return(0,V.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,V.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,V.jsx)(`span`,{className:`size-3.5 text-muted`,children:e}),(0,V.jsx)(`span`,{className:`text-xs font-medium text-muted`,children:t})]}),(0,V.jsx)(`div`,{className:`text-sm text-content`,children:n})]})}function Te({branch:e}){return(0,V.jsx)(`span`,{className:`inline-flex items-center rounded-full border border-[var(--oh-border)] bg-surface-raised px-2.5 py-0.5 text-xs text-muted`,children:e})}var J=60;function Ee({filter:e}){let{t}=o(`openhands`),[n,r]=(0,B.useState)(!1),i=e.length>J;return(0,V.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,V.jsx)(`span`,{className:`break-all`,children:i&&!n?`${e.slice(0,J)}…`:e}),i&&(0,V.jsx)(`button`,{type:`button`,onClick:()=>r(!n),"aria-expanded":n,className:`text-xs text-muted hover:text-content self-start`,children:t(n?s.SETTINGS$SKILLS_SHOW_LESS:s.SETTINGS$SKILLS_SHOW_MORE)})]})}function De({automation:e}){let{t}=o(`openhands`),n=e.trigger.type===`event`,r=e.trigger.schedule??``;e.trigger.schedule_human&&(r=e.timezone?`${e.trigger.schedule_human} (${e.timezone})`:e.trigger.schedule_human);let i=t(n?s.AUTOMATIONS$DETAIL$TRIGGER_EVENT:s.AUTOMATIONS$DETAIL$TRIGGER_SCHEDULE);return(0,V.jsx)(W,{icon:(0,V.jsx)(Se,{className:`size-4`}),title:t(s.AUTOMATIONS$DETAIL$CONFIGURATION),children:(0,V.jsxs)(`div`,{className:`grid grid-cols-2 gap-x-4 gap-y-5`,children:[e.repository&&(0,V.jsx)(q,{icon:(0,V.jsx)(Ce,{className:`size-3.5`}),label:t(s.AUTOMATIONS$DETAIL$REPOSITORIES),children:(0,V.jsxs)(`span`,{className:`flex items-center gap-1`,children:[e.repository,e.branch&&(0,V.jsx)(Te,{branch:e.branch})]})}),(0,V.jsx)(q,{icon:(0,V.jsx)(G,{className:`size-3.5`}),label:t(s.AUTOMATIONS$DETAIL$TRIGGER),children:i}),!n&&(0,V.jsx)(q,{icon:(0,V.jsx)(K,{className:`size-3.5`}),label:t(s.AUTOMATIONS$DETAIL$SCHEDULE),children:r}),n&&e.trigger.source&&(0,V.jsx)(q,{icon:(0,V.jsx)(fe,{className:`size-3.5`}),label:t(s.AUTOMATIONS$DETAIL$EVENT_SOURCE),children:e.trigger.source}),n&&e.trigger.on&&(0,V.jsx)(q,{icon:(0,V.jsx)(j,{className:`size-3.5`}),label:t(s.AUTOMATIONS$DETAIL$EVENT_TYPE),children:F(e.trigger.on)}),n&&e.trigger.filter&&(0,V.jsx)(q,{icon:(0,V.jsx)(A,{className:`size-3.5`}),label:t(s.AUTOMATIONS$DETAIL$EVENT_FILTER),children:(0,V.jsx)(Ee,{filter:e.trigger.filter})}),(0,V.jsx)(q,{icon:(0,V.jsx)(I,{className:`size-3.5`}),label:t(s.AUTOMATIONS$DETAIL$MODEL),children:e.model??t(s.COMMON$ACTIVE_PROFILE)}),e.notification&&(0,V.jsx)(q,{icon:(0,V.jsx)(we,{className:`size-3.5`}),label:t(s.AUTOMATIONS$DETAIL$NOTIFICATION),children:e.notification})]})})}var Oe=e=>(0,V.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 24 24`,strokeWidth:2,stroke:`currentColor`,...e,children:(0,V.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M14.25 6.087c0-.355.186-.676.401-.959.221-.29.349-.634.349-1.003 0-1.036-1.007-1.875-2.25-1.875s-2.25.84-2.25 1.875c0 .369.128.713.349 1.003.215.283.401.604.401.959v0a.64.64 0 0 1-.657.643 48.39 48.39 0 0 1-4.163-.3c.186 1.613.293 3.25.315 4.907a.656.656 0 0 1-.658.663v0c-.355 0-.676-.186-.959-.401a1.647 1.647 0 0 0-1.003-.349c-1.036 0-1.875 1.007-1.875 2.25s.84 2.25 1.875 2.25c.369 0 .713-.128 1.003-.349.283-.215.604-.401.959-.401v0c.31 0 .555.26.532.57a48.039 48.039 0 0 1-.642 5.056c1.518.19 3.058.309 4.616.354a.64.64 0 0 0 .657-.643v0c0-.355-.186-.676-.401-.959a1.647 1.647 0 0 1-.349-1.003c0-1.035 1.008-1.875 2.25-1.875 1.243 0 2.25.84 2.25 1.875 0 .369-.128.713-.349 1.003-.215.283-.4.604-.4.959v0c0 .333.277.599.61.58a48.1 48.1 0 0 0 5.427-.63 48.05 48.05 0 0 0 .582-4.717.532.532 0 0 0-.533-.57v0c-.355 0-.676.186-.959.401-.29.221-.634.349-1.003.349-1.035 0-1.875-1.007-1.875-2.25s.84-2.25 1.875-2.25c.37 0 .713.128 1.003.349.283.215.604.401.96.401v0a.656.656 0 0 0 .658-.663 48.422 48.422 0 0 0-.37-5.36c-1.886.342-3.81.574-5.766.689a.578.578 0 0 1-.61-.58v0Z`})});function ke({name:e}){return(0,V.jsx)(`span`,{className:`inline-flex items-center rounded-full border border-[var(--oh-border)] bg-[var(--oh-surface-deep)] px-3.5 py-1.5 text-sm text-content`,children:e})}function Ae({plugins:e}){let{t}=o(`openhands`);return(0,V.jsx)(W,{icon:(0,V.jsx)(Oe,{className:`size-4`}),title:t(s.AUTOMATIONS$DETAIL$PLUGINS),children:(0,V.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:e.map(e=>(0,V.jsx)(ke,{name:e},e))})})}var Y=e=>(0,V.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 24 24`,strokeWidth:2,stroke:`currentColor`,...e,children:(0,V.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182`})});function X(e,t){return new Date(e).toLocaleDateString(t,{year:`numeric`,month:`short`,day:`numeric`})}function je(e,t,n){let r=Date.now()-new Date(e).getTime(),i=Math.floor(r/6e4),a=Math.floor(r/36e5),o=Math.floor(r/864e5);return i<1?n(s.AUTOMATIONS$DETAIL$TIME_JUST_NOW):i<60?n(s.AUTOMATIONS$DETAIL$TIME_MINUTES_AGO,{count:i}):a<24?n(s.AUTOMATIONS$DETAIL$TIME_HOURS_AGO,{count:a}):o===1?n(s.AUTOMATIONS$DETAIL$TIME_YESTERDAY):o<7?n(s.AUTOMATIONS$DETAIL$TIME_DAYS_AGO,{count:o}):X(e,t)}function Me({createdAt:e,lastRunAt:t}){let{t:n,i18n:r}=o(`openhands`),i=r.language;return(0,V.jsx)(W,{icon:(0,V.jsx)(Y,{className:`size-4`}),title:n(s.AUTOMATIONS$DETAIL$ACTIVITY),children:(0,V.jsxs)(`div`,{className:`grid grid-cols-2 gap-x-4`,children:[(0,V.jsx)(q,{icon:(0,V.jsx)(K,{className:`size-3.5`}),label:n(s.AUTOMATIONS$DETAIL$CREATED),children:X(e,i)}),(0,V.jsx)(q,{icon:(0,V.jsx)(R,{className:`size-3.5`}),label:n(s.AUTOMATIONS$DETAIL$LAST_RUN),children:t?je(t,i,n):n(s.AUTOMATIONS$DETAIL$TIME_NEVER)})]})})}var Ne=e=>(0,V.jsx)(`svg`,{xmlns:`http://www.w3.org/2000/svg`,fill:`none`,viewBox:`0 0 24 24`,strokeWidth:2,stroke:`currentColor`,...e,children:(0,V.jsx)(`path`,{strokeLinecap:`round`,strokeLinejoin:`round`,d:`m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z`})}),Pe={[z.COMPLETED]:{label:s.AUTOMATIONS$DETAIL$SUCCESSFUL,style:`border-[var(--oh-success)]/50 bg-[var(--oh-success)]/10 text-[var(--oh-success)]`},[z.FAILED]:{label:s.AUTOMATIONS$DETAIL$FAILED,style:`border-[var(--oh-danger)]/50 bg-[var(--oh-danger)]/10 text-danger`},[z.PENDING]:{label:s.AUTOMATIONS$DETAIL$PENDING,style:`border-[var(--oh-border)] bg-surface-raised text-muted`},[z.RUNNING]:{label:s.AUTOMATIONS$DETAIL$RUNNING,style:`border-[var(--oh-border)] bg-surface-raised text-muted`}};function Fe({status:e}){switch(e){case z.COMPLETED:return(0,V.jsx)(G,{"data-testid":`run-status-icon-completed`,className:`size-3.5`});case z.FAILED:return(0,V.jsx)(Ne,{"data-testid":`run-status-icon-failed`,className:`size-3.5`});default:return(0,V.jsx)(R,{"data-testid":`run-status-icon-pending`,className:`size-3.5`})}}function Ie({status:e}){let{t}=o(`openhands`),n=Pe[e];return(0,V.jsxs)(`span`,{className:g(`inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-xs font-medium`,n.style),children:[(0,V.jsx)(Fe,{status:e}),t(n.label)]})}var Le=20;function Re(e){return e.kind===`BashOutput`}var ze=class e{static async listOutputs(t,n,r){let i=[],a;for(let o=0;o<Le;o+=1){let o=await e.searchEvents(t,n,{kind__eq:`BashOutput`,command_id__eq:r,sort_order:`TIMESTAMP`,...a?{page_id:a}:{}});if(o.items.forEach(e=>{Re(e)&&i.push(e)}),!o.next_page_id)break;a=o.next_page_id}return i}static async searchEvents(e,t,n){let r=v().backend;if(r.kind===`cloud`){if(!e)throw Error(`BashService.listOutputs requires a conversation URL on cloud backends`);let i=new URLSearchParams;return Object.entries(n).forEach(([e,t])=>{t!=null&&i.set(e,String(t))}),b({backend:r,method:`GET`,hostOverride:_(e),path:`/api/bash/bash_events/search?${i.toString()}`,authMode:`session-api-key`,sessionApiKey:t})}return new l(y({...e?{conversationUrl:e}:{},sessionApiKey:t})).searchEvents(n)}},Be=[`bash-command-logs`];function Ve(e){switch(e){case`MISSING`:return`missing`;case`PAUSED`:return`paused`;case`STARTING`:return`starting`;case`ERROR`:return`errored`;case`RUNNING`:case null:case void 0:default:return null}}function He(e){if(!c.isAxiosError(e))return null;if(!e.response)return`unreachable`;let t=e.response.status;return t===404||t>=500?`unreachable`:null}function Ue(e){let{conversationId:t,bashCommandId:n,enabled:r=!0}=e,i=p(),o=O(r?t??null:null),s=o.data,c=s?.conversation_url??null,l=s?.session_api_key??null,u=i.backend.kind===`cloud`,d=o.isFetched,f=null,m=!1;u&&d&&(s?f=Ve(s.sandbox_status)??(s.conversation_url?null:`missing`):m=!0);let h=r&&!!n&&(u?!!c:!0)&&!f&&!m,g=a({queryKey:[...Be,n,c,l,i.backend.id,i.orgId],queryFn:()=>ze.listOutputs(c,l,n),enabled:h,staleTime:60*1e3,gcTime:300*1e3,retry:!1}),_=u?He(g.error):null,v=f??_;return{data:g.data,error:_?null:g.error,isFetching:g.isFetching,isPending:g.isPending,isResolvingConversation:u&&o.isPending,conversationMissing:m,sandboxIssue:v}}var We=4e3;function Ge(e,t){return e.length<=t?e:`…(truncated)…\n${e.slice(e.length-t)}`}function Ke({automationName:e,automationPrompt:t,errorDetail:n,stderr:r,runId:i}){let a=r?.trim()||n?.trim()||``,o=a?Ge(a,We):`No error output was captured for this run.`,s=e?.trim(),c=[`${s?`The scheduled automation "${s}" failed during a run.`:`A scheduled automation failed during a run.`} Please investigate the error and fix the root cause.`],l=t?.trim();return l&&c.push(``,`What the automation was set up to do:`,l),c.push(``,`Error output from the failed run (run ${i}):`,o,``,`Please diagnose why it failed and propose or implement a fix.`),c.join(`
|
|
2
|
-
`)}function qe({run:e,automation:t,stderr:n}){let{t:r}=o(`openhands`),{navigate:i}=C(),a=T();return(0,V.jsx)(S,{testId:`debug-automation-button`,type:`button`,variant:`primary`,onClick:()=>{if(a.isPending)return;let r=Ke({automationName:t?.name,automationPrompt:t?.prompt,errorDetail:e.error_detail,stderr:n,runId:e.id});a.mutate({query:r},{onSuccess:e=>{i(`/conversations/${e.conversation_id}`)}})},isDisabled:a.isPending,"aria-busy":a.isPending,children:r(s.AUTOMATIONS$DETAIL$DEBUG_WITH_OPENHANDS)})}var Je={missing:s.AUTOMATIONS$DETAIL$LOGS_SANDBOX_MISSING,paused:s.AUTOMATIONS$DETAIL$LOGS_SANDBOX_PAUSED,starting:s.AUTOMATIONS$DETAIL$LOGS_SANDBOX_STARTING,errored:s.AUTOMATIONS$DETAIL$LOGS_SANDBOX_ERROR,unreachable:s.AUTOMATIONS$DETAIL$LOGS_SANDBOX_UNREACHABLE};function Z(e,t){return[...e].sort((e,t)=>{let n=e.timestamp.localeCompare(t.timestamp);return n===0?(e.order??0)-(t.order??0):n}).map(e=>e[t]??``).join(``)}function Ye({conversationId:e,bashCommandId:t,isOpen:n,onClose:r,run:i,automation:a}){let{t:c}=o(`openhands`),[l,u]=(0,B.useState)(`stdout`),{data:d,isFetching:f,isResolvingConversation:p,sandboxIssue:m,conversationMissing:h,error:_}=Ue({conversationId:e,bashCommandId:t,enabled:n});(0,B.useEffect)(()=>{n&&u(`stdout`)},[n,t]),(0,B.useEffect)(()=>{if(!n)return;let e=e=>{e.key===`Escape`&&r()};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[n,r]);let{stdout:v,stderr:y}=(0,B.useMemo)(()=>d?{stdout:Z(d,`stdout`),stderr:Z(d,`stderr`)}:{stdout:``,stderr:``},[d]);if(!n)return null;let b=p||f&&!d,S=!t,C=l===`stdout`?v:y,w=`border-b-2 px-3 py-2 text-sm font-normal transition-colors focus:outline-none`,T=`border-[var(--oh-primary)] text-white`,E=`border-transparent text-muted hover:text-content`;return(0,V.jsxs)(`div`,{className:`fixed inset-0 z-50 flex items-center justify-center p-4`,role:`dialog`,"aria-modal":`true`,"aria-label":c(s.AUTOMATIONS$DETAIL$LOGS_TITLE),children:[(0,V.jsx)(`div`,{className:`absolute inset-0 bg-black/60`,onClick:r,onKeyDown:e=>{e.key===`Escape`&&r()},role:`presentation`}),(0,V.jsxs)(`div`,{className:`relative flex max-h-[80vh] w-full max-w-3xl flex-col rounded-xl border border-[var(--oh-border)] bg-[var(--oh-surface)] p-6`,children:[(0,V.jsx)(`button`,{type:`button`,onClick:r,className:`absolute right-4 top-4 text-muted hover:text-foreground`,"aria-label":c(s.AUTOMATIONS$CANCEL),children:(0,V.jsx)(ee,{className:`size-5`})}),(0,V.jsx)(`h2`,{className:g(`pr-8`,x),children:c(s.AUTOMATIONS$DETAIL$LOGS_TITLE)}),(0,V.jsxs)(`div`,{role:`tablist`,"aria-label":c(s.AUTOMATIONS$DETAIL$LOGS_TITLE),className:`mt-4 flex gap-1 border-b border-[var(--oh-border)]`,children:[(0,V.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":l===`stdout`,"aria-controls":`run-logs-panel-stdout`,id:`run-logs-tab-stdout`,tabIndex:l===`stdout`?0:-1,onClick:()=>u(`stdout`),className:`${w} ${l===`stdout`?T:E}`,children:c(s.AUTOMATIONS$DETAIL$LOGS_TAB_OUTPUT)}),(0,V.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":l===`stderr`,"aria-controls":`run-logs-panel-stderr`,id:`run-logs-tab-stderr`,tabIndex:l===`stderr`?0:-1,onClick:()=>u(`stderr`),className:`${w} ${l===`stderr`?T:E}`,children:c(s.AUTOMATIONS$DETAIL$LOGS_TAB_ERROR)})]}),(0,V.jsxs)(`div`,{role:`tabpanel`,id:`run-logs-panel-${l}`,"aria-labelledby":`run-logs-tab-${l}`,className:`mt-3 min-h-[12rem] flex-1 overflow-auto rounded-lg border border-[var(--oh-border)] bg-black/40 p-4 font-mono text-xs`,children:[S&&(0,V.jsx)(`p`,{className:`text-muted italic`,children:c(s.AUTOMATIONS$DETAIL$LOGS_NO_COMMAND)}),!S&&h&&(0,V.jsx)(`p`,{className:`text-muted italic`,children:c(s.AUTOMATIONS$DETAIL$LOGS_CONVERSATION_MISSING)}),!S&&!h&&m&&(0,V.jsx)(`p`,{"data-testid":`run-logs-sandbox-issue-${m}`,className:`text-muted italic`,children:c(Je[m])}),!S&&!h&&!m&&b&&(0,V.jsx)(`p`,{className:`text-muted italic`,children:c(s.AUTOMATIONS$DETAIL$LOGS_LOADING)}),!S&&!h&&!m&&!b&&_&&!d&&(0,V.jsxs)(`p`,{className:`text-danger`,children:[c(s.AUTOMATIONS$DETAIL$LOGS_ERROR),`: `,String(_)]}),!b&&!m&&d&&(0,V.jsx)(`pre`,{"data-testid":`run-logs-output-${l}`,className:`whitespace-pre-wrap break-words ${l===`stderr`?`text-danger`:`text-content`}`,children:C.length>0?C:(0,V.jsx)(`span`,{className:`text-muted italic`,children:c(s.AUTOMATIONS$DETAIL$LOGS_EMPTY)})})]}),i?.status===z.FAILED&&(0,V.jsx)(`div`,{className:`mt-4 flex justify-end`,children:(0,V.jsx)(qe,{run:i,automation:a,stderr:y})})]})]})}function Xe(e,t){return new Date(e).toLocaleDateString(t,{weekday:`long`,year:`numeric`,month:`long`,day:`numeric`,hour:`numeric`,minute:`2-digit`})}function Ze(e){if(!e)return!0;let t=new Date(e).getTime();return Number.isNaN(t)||t===0}function Qe(e){return`/conversations/${e}`}function $e({run:e,automation:t}){let{t:n,i18n:r}=o(`openhands`),i=!!e.conversation_id,a=!!e.bash_command_id,c=e.status===z.COMPLETED||e.status===z.FAILED,l=!i&&c,[u,d]=(0,B.useState)(!1),[f]=(0,B.useState)(()=>new Date().toISOString()),p=Xe(Ze(e.started_at)?f:e.started_at,r.language),m=a?(0,V.jsx)(`button`,{type:`button`,onClick:e=>{e.stopPropagation(),e.preventDefault(),d(!0)},className:`rounded-md p-1 text-muted hover:bg-surface-raised hover:text-foreground focus:bg-surface-raised focus:outline-none`,"aria-label":n(s.AUTOMATIONS$DETAIL$LOGS_VIEW,{timestamp:p}),title:n(s.AUTOMATIONS$DETAIL$LOGS_VIEW_SHORT),children:(0,V.jsx)(D,{className:`size-4`})}):null,h=(0,V.jsxs)(V.Fragment,{children:[(0,V.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,V.jsx)(`span`,{className:`text-sm text-content`,children:p}),l&&(0,V.jsxs)(`span`,{className:`text-xs text-muted italic`,children:[`(`,n(s.AUTOMATIONS$DETAIL$NO_CONVERSATION),`)`]})]}),(0,V.jsxs)(`div`,{className:`flex items-center gap-2`,children:[m,(0,V.jsx)(Ie,{status:e.status})]})]});return(0,V.jsxs)(V.Fragment,{children:[i&&e.conversation_id?(0,V.jsx)(`a`,{href:Qe(e.conversation_id),className:`flex items-center justify-between px-5 py-3 transition-colors cursor-pointer hover:bg-surface-raised focus:bg-surface-raised focus:outline-none`,"aria-label":`View conversation for run at ${p}`,children:h}):(0,V.jsx)(`div`,{className:`flex items-center justify-between px-5 py-3 cursor-default`,children:h}),a&&(0,V.jsx)(Ye,{conversationId:e.conversation_id,bashCommandId:e.bash_command_id,isOpen:u,onClose:()=>d(!1),run:e,automation:t})]})}var Q=20;function et({automation:e}){let{t}=o(`openhands`),[n,r]=(0,B.useState)(Q),{data:i,isLoading:a}=M({id:e.id,limit:n,offset:0}),c=i?i.total>i.runs.length:!1;return(0,V.jsxs)(`div`,{className:`rounded-2xl border border-[var(--oh-border)] bg-[var(--oh-surface)]`,children:[(0,V.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-[var(--oh-border)] px-5 py-3`,children:[(0,V.jsx)(`span`,{className:`size-4 text-muted`,children:(0,V.jsx)(Y,{className:`size-4`})}),(0,V.jsx)(`h3`,{className:`text-sm font-medium text-content`,children:t(s.AUTOMATIONS$DETAIL$ACTIVITY_LOG)})]}),a&&(0,V.jsx)(`div`,{className:`space-y-1 p-5`,children:Array.from({length:3}).map((e,t)=>(0,V.jsxs)(`div`,{className:`flex items-center justify-between py-3`,children:[(0,V.jsx)(`div`,{className:`h-5 w-64 animate-pulse rounded bg-surface-raised`}),(0,V.jsx)(`div`,{className:`h-6 w-24 animate-pulse rounded-full bg-surface-raised`})]},`skeleton-${t}`))}),!a&&i?.runs.length===0&&(0,V.jsx)(`p`,{className:`px-5 py-8 text-center text-sm text-muted`,children:t(s.AUTOMATIONS$DETAIL$NO_RUNS)}),!a&&i&&i.runs.length>0&&(0,V.jsxs)(`div`,{children:[i.runs.map((t,n)=>(0,V.jsx)(`div`,{className:n>0?`border-t border-[var(--oh-border)]`:``,children:(0,V.jsx)($e,{run:t,automation:e})},t.id)),c&&(0,V.jsx)(`div`,{className:`border-t border-[var(--oh-border)] px-5 py-3`,children:(0,V.jsx)(`button`,{type:`button`,onClick:()=>r(e=>e+Q),className:`text-sm text-muted hover:text-foreground`,children:t(s.AUTOMATIONS$DETAIL$LOAD_MORE_RUNS)})})]})]})}function $({className:e}){return(0,V.jsx)(`div`,{className:g(`animate-pulse rounded bg-surface-raised`,e)})}function tt(){return(0,V.jsxs)(`div`,{className:`flex flex-col gap-4`,"data-testid":`detail-skeleton`,children:[(0,V.jsx)($,{className:`h-5 w-40`}),(0,V.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,V.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,V.jsx)($,{className:`h-6 w-48`}),(0,V.jsx)($,{className:`h-6 w-16 rounded-full`})]}),(0,V.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,V.jsx)($,{className:`h-6 w-11 rounded-full`}),(0,V.jsx)($,{className:`h-8 w-8`})]})]}),(0,V.jsx)($,{className:`h-5 w-96`}),(0,V.jsx)($,{className:`h-36 w-full rounded-2xl`}),(0,V.jsx)($,{className:`h-72 w-full rounded-2xl`}),(0,V.jsx)($,{className:`h-32 w-full rounded-2xl`}),(0,V.jsx)($,{className:`h-40 w-full rounded-2xl`})]})}function nt(){let{t:e}=o(`openhands`);return(0,V.jsxs)(`div`,{className:`flex flex-col items-center justify-center py-20`,children:[(0,V.jsx)(P,{className:`size-12 text-muted`}),(0,V.jsx)(`p`,{className:`mt-4 text-sm font-medium text-content`,children:e(s.AUTOMATIONS$DETAIL$NOT_FOUND_TITLE)}),(0,V.jsx)(`p`,{className:`mt-2 text-sm text-muted`,children:e(s.AUTOMATIONS$DETAIL$NOT_FOUND_MESSAGE)}),(0,V.jsx)(`div`,{className:`mt-6`,children:(0,V.jsx)(H,{})})]})}var rt=r(function(){let{t:e}=o(`openhands`),{automationId:t}=i(),{navigate:n}=C(),[r,a]=(0,B.useState)(!1),[c,l]=(0,B.useState)(!1),{data:m,isLoading:g,refetch:_}=se(),v=m?.status===`ok`,y=p(),b=(0,B.useRef)(y.backend.id).current!==y.backend.id,{data:x,isLoading:S,isError:T,error:E,refetch:D}=ne({id:t??``,enabled:v&&!b}),{trackPrebuiltAutomationEnabled:O,trackAutomationExported:k}=w(),ee=ae(),A=ie(),j=te(),M=T&&u(E)&&E.response?.status===404;if(g)return(0,V.jsx)(`div`,{className:`min-h-full`,children:(0,V.jsx)(`div`,{className:`p-6 max-w-4xl mx-auto`,children:(0,V.jsx)(tt,{})})});if(!v)return(0,V.jsx)(`div`,{className:`min-h-full`,children:(0,V.jsx)(`div`,{className:`p-6 max-w-4xl mx-auto`,children:(0,V.jsx)(de,{onRetry:_})})});if(S)return(0,V.jsx)(`div`,{className:`min-h-full`,children:(0,V.jsx)(`div`,{className:`p-6 max-w-4xl mx-auto`,children:(0,V.jsx)(tt,{})})});if(M)return(0,V.jsx)(`div`,{className:`min-h-full`,children:(0,V.jsx)(`div`,{className:`p-6 max-w-4xl mx-auto`,children:(0,V.jsx)(nt,{})})});if(T||!x)return(0,V.jsx)(`div`,{className:`min-h-full`,children:(0,V.jsx)(`div`,{className:`p-6 max-w-4xl mx-auto`,children:(0,V.jsx)(me,{onRetry:()=>D()})})});let N=()=>{let e=!x.enabled;ee.mutate({id:x.id,enabled:e}),e&&O({automationId:x.id,automationName:x.name})},P=()=>{A.mutate(x.id,{onSuccess:()=>{n?.(`/automations`)}})},F=()=>{j.mutate(x.id,{onSuccess:()=>{f(e(s.AUTOMATIONS$RUN_NOW_SUCCESS))},onError:t=>{d(u(t)?t.response?.data?.message||t.message||e(s.AUTOMATIONS$RUN_NOW_ERROR):t.message||e(s.AUTOMATIONS$RUN_NOW_ERROR))}})},I=()=>{let e=`${JSON.stringify(pe(x),null,2)}\n`;h(new Blob([e],{type:`application/json`}),he(x)),k({backendKind:y.backend.kind})},L=y.backend.kind===`local`;return(0,V.jsx)(`div`,{className:`min-h-full`,children:(0,V.jsx)(`div`,{className:`p-6 max-w-4xl mx-auto`,children:(0,V.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,V.jsx)(H,{}),(0,V.jsx)(ve,{automation:x,onToggle:N,onEdit:L?()=>l(!0):void 0,onDelete:()=>a(!0),onExport:I,onDownloadTarball:()=>re.downloadTarball(x.id,x.name),onRunNow:F,isRunningNow:j.isPending}),x.prompt&&(0,V.jsx)(xe,{prompt:x.prompt}),(0,V.jsx)(De,{automation:x}),x.plugins&&x.plugins.length>0&&(0,V.jsx)(Ae,{plugins:x.plugins}),(0,V.jsx)(Me,{createdAt:x.created_at,lastRunAt:x.last_triggered_at}),(0,V.jsx)(et,{automation:x}),(0,V.jsx)(oe,{automationName:x.name,isOpen:r,onConfirm:P,onCancel:()=>a(!1)}),L&&(0,V.jsx)(le,{automation:x,isOpen:c,onClose:()=>l(!1)})]})})})});export{rt as default};
|