@openhands/agent-canvas 1.7.2 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/README.windows.md +2 -2
- package/build/assets/{Trans-DP5rcauH.js → Trans-Bwpzk1wT.js} +1 -1
- package/build/assets/{acp-providers-BHKZvEm5.js → acp-providers-C921BlYB.js} +1 -1
- package/build/assets/active-backend-context-BiwzkzDy.js +2 -0
- package/build/assets/agent-context-settings-DXNT_dcw.js +1 -0
- package/build/assets/agent-profiles-settings-BymJf3EP.js +1 -0
- package/build/assets/agent-server-conversation-service.api-CYSWw-2g.js +41 -0
- package/build/assets/agent-settings-BjgQQe-_.js +1 -0
- package/build/assets/{agent-settings-BIOsUglV.js → agent-settings-WzqXk6B4.js} +2 -2
- package/build/assets/{alert-banner-C1nzoXBC.js → alert-banner-DR8EVyZM.js} +1 -1
- package/build/assets/api-error-message-e16L1kwH.js +1 -0
- package/build/assets/api-key-entry-screen-DI0I04O3.js +1 -0
- package/build/assets/app-settings-DGistSFV.js +1 -0
- package/build/assets/automation-C_eCrGyP.js +1 -0
- package/build/assets/automation-detail-DY6x2FW1.js +2 -0
- package/build/assets/automation-export-C09f-Lua.js +2 -0
- package/build/assets/automation-setup-route-CqKp0717.js +1 -0
- package/build/assets/automations-list-CqWJ7qXW.js +1 -0
- package/build/assets/{back-nav-button-Be_L157B.js → back-nav-button-D4ngzpSh.js} +1 -1
- package/build/assets/backend-form-modal-B8D5hBzK.js +1 -0
- package/build/assets/{backend-synced-settings-badge-BNpEylNP.js → backend-synced-settings-badge-BnzI8Ysj.js} +1 -1
- package/build/assets/{badge-DwgrwohM.js → badge-1Mf1iPcX.js} +1 -1
- package/build/assets/{base-modal-CSHhJTSr.js → base-modal-BBuy0WQQ.js} +1 -1
- package/build/assets/{brand-button-CQO8oqVo.js → brand-button-DGN6Y9o6.js} +1 -1
- package/build/assets/browser-D_ekTlTS.js +6 -0
- package/build/assets/{browser-tab-CEApjoEV.js → browser-tab-D4a4Ou_w.js} +1 -1
- package/build/assets/{chat-send-button-D4614wUz.js → chat-send-button-CgbcjD97.js} +1 -1
- package/build/assets/check-CPLXgluF.js +1 -0
- package/build/assets/chevron-down-CP4QHvyc.js +1 -0
- package/build/assets/circle-check-Dpy2_xSI.js +1 -0
- package/build/assets/{circle-plus-check-toggle-E3Ecb_gg.js → circle-plus-check-toggle-yTAS-nX3.js} +1 -1
- package/build/assets/cloud-funnel-analytics-CEOl5Gxr.js +1 -0
- package/build/assets/{combobox-caret-C8_eGdp2.js → combobox-caret-Bd2yySnF.js} +1 -1
- package/build/assets/command-menu-Bj6X4ckE.js +1 -0
- package/build/assets/condenser-settings-EAXQNR2E.js +1 -0
- package/build/assets/{confirmation-modal-gZtbojCm.js → confirmation-modal-NCUPr2-O.js} +1 -1
- package/build/assets/{context-menu-list-item-BTHGFhIx.js → context-menu-list-item-CrCrYuPF.js} +1 -1
- package/build/assets/conversation-BzyIcSwr.js +1 -0
- package/build/assets/conversation-CUJ0Vo8g.js +90 -0
- package/build/assets/conversation-panel-BzyIcSwr.js +1 -0
- package/build/assets/conversation-state-store-F62HvuI1.js +1 -0
- package/build/assets/{conversation-tab-empty-state-BCMHkGQk.js → conversation-tab-empty-state-BCZ7rUMH.js} +1 -1
- package/build/assets/{copy-B8Y5ufoR.js → copy-DCmZtz6n.js} +1 -1
- package/build/assets/{copy-to-clipboard-button-C4l3CMSd.js → copy-to-clipboard-button-D_Lp6-Fl.js} +1 -1
- package/build/assets/{device-verify-C_M7Z8xs.js → device-verify-DLmolX8Q.js} +1 -1
- package/build/assets/{dropdown-classes-DQlj-MpS.js → dropdown-classes-BB8rzqXL.js} +1 -1
- package/build/assets/{entry.client-DETaouwO.js → entry.client-BbIYOsIg.js} +2 -2
- package/build/assets/{enum-filter-dropdown-paB-lFSP.js → enum-filter-dropdown-C08-srev.js} +1 -1
- package/build/assets/{environment-switch-overlay-D0FgCMqs.js → environment-switch-overlay-BepBBX66.js} +1 -1
- package/build/assets/extensions-hub-R3KNv-5V.js +1 -0
- package/build/assets/extensions-navigation-CfWFmI1I.js +1 -0
- package/build/assets/{external-link-Cnnd6ikC.js → external-link-BdBSg8rk.js} +1 -1
- package/build/assets/files-tab-DEq8MbHu.js +1 -0
- package/build/assets/{form-control-classes-CSPevi7c.js → form-control-classes-DAfsCJTe.js} +1 -1
- package/build/assets/{format-time-delta-DuhE50B-.js → format-time-delta-CxfPJpzC.js} +1 -1
- package/build/assets/git-provider-icon-BZqqUPlm.js +1 -0
- package/build/assets/git-repo-dropdown-9WKINV6J.js +1 -0
- package/build/assets/git-repo-dropdown-DEpOwUez.js +1 -0
- package/build/assets/{highlighted-source-view-suUKd5if.js → highlighted-source-view-CX9oIoVT.js} +1 -1
- package/build/assets/home-CY0JaxiY.js +1 -0
- package/build/assets/home-CaNWlVvB.js +1 -0
- package/build/assets/home-store-Ch1ErdBc.js +1 -0
- package/build/assets/index-home-CaNWlVvB.js +1 -0
- package/build/assets/info-CmWQXtRQ.js +1 -0
- package/build/assets/install-server-modal-BWrudmZU.js +1 -0
- package/build/assets/{launch-Ccnhte5b.js → launch-B1POpHuP.js} +1 -1
- package/build/assets/{list-todo-_BXQzOiB.js → list-todo-DtiL3lTp.js} +1 -1
- package/build/assets/llm-not-configured-banner-3tMsM4K6.js +27 -0
- package/build/assets/llm-settings-CXo8iPNW.js +1 -0
- package/build/assets/llm-settings-D0W8mJDk.js +1 -0
- package/build/assets/{llm-subscription-service-W5BprsNA.js → llm-subscription-service-DBJbfd8Z.js} +1 -1
- package/build/assets/loader-circle-B4QDBARx.js +1 -0
- package/build/assets/{loading-spinner-CcpnCr_d.js → loading-spinner-DfZ_bhV7.js} +1 -1
- package/build/assets/manage-backends-modal-CwyWsiag.js +1 -0
- package/build/assets/manifest-39f4789d.js +1 -0
- package/build/assets/{markdown-renderer-CvOO0YIr.js → markdown-renderer-DgiLLhW6.js} +6 -6
- package/build/assets/mcp-DXG9LWrI.js +9 -0
- package/build/assets/mcp-marketplace-utils-DFmhKc5s.js +1 -0
- package/build/assets/messages-kBjKaAeA.js +40 -0
- package/build/assets/{modal-body-DQhiw-AR.js → modal-body-CMsDpalT.js} +1 -1
- package/build/assets/{modal-classes-YaEEa5eZ.js → modal-classes-B6PDrxXo.js} +1 -1
- package/build/assets/{modal-close-button-turIYn0t.js → modal-close-button-DyxBZaAb.js} +1 -1
- package/build/assets/{onboarding-BegDrOKn.js → onboarding-47hh2IHA.js} +1 -1
- package/build/assets/onboarding-modal-9BuvvROo.js +1 -0
- package/build/assets/organization-service.api-UDy63-oC.js +1 -0
- package/build/assets/{pencil-8_lvWDoZ.js → pencil-BjgtZmWp.js} +1 -1
- package/build/assets/{planner-tab-w6HT0N_A.js → planner-tab-BWk8885v.js} +1 -1
- package/build/assets/plugins-management-service-CjkgF2dd.js +1 -0
- package/build/assets/plus-DrKuuvMe.js +1 -0
- package/build/assets/profiles-service.api-CukSFLzz.js +1 -0
- package/build/assets/providers-CqUWC85T.js +1 -0
- package/build/assets/proxy-BBUG3sd2.js +1 -0
- package/build/assets/{puzzle-DXWdfaa7.js → puzzle-BoNc6zZ8.js} +1 -1
- package/build/assets/recommended-automations-launcher-ejxy1P27.js +1 -0
- package/build/assets/{refresh-cw-D7CYLy-d.js → refresh-cw-BrM5ZAZD.js} +1 -1
- package/build/assets/root-5S-M8SYa.js +2 -0
- package/build/assets/root-DZ39lS5f.css +1 -0
- package/build/assets/root-layout-BPqoa0gv.js +3 -0
- package/build/assets/schema-field-nImDoY6-.js +1 -0
- package/build/assets/{sdk-section-page-BW-i45yr.js → sdk-section-page-BxMrtUNV.js} +1 -1
- package/build/assets/search-Dc2qR4O2.js +1 -0
- package/build/assets/secrets-service-Dhjh3HhH.js +1 -0
- package/build/assets/{secrets-settings-D7U1ErCH.js → secrets-settings-CPdxceT_.js} +1 -1
- package/build/assets/segmented-toggle-Do6oyepX.js +1 -0
- package/build/assets/settings-BRbnfKEm.js +1 -0
- package/build/assets/{settings-dropdown-input-Dx6vlkgf.js → settings-dropdown-input-DYCULKpp.js} +1 -1
- package/build/assets/{settings-index-COAdxm2Q.js → settings-index-C9o2NBO0.js} +1 -1
- package/build/assets/settings-input-B-q2gkVy.js +1 -0
- package/build/assets/{settings-list-classes-gQdBahdt.js → settings-list-classes-WpQi0q1L.js} +1 -1
- package/build/assets/{settings-modal-CFnbQ8_4.js → settings-modal-CEK0AIx6.js} +1 -1
- package/build/assets/settings-service.api-CZiPD8__.js +1 -0
- package/build/assets/{settings-switch-UNSf8K8I.js → settings-switch-LqKdGxHL.js} +1 -1
- package/build/assets/shared-conversation-Bu-dQlgp.js +1 -0
- package/build/assets/{sidebar-layout-DXHtbEj1.js → sidebar-layout-oHBGQmLh.js} +1 -1
- package/build/assets/{sidebar-mobile-menu-toggle-U78hQRJ1.js → sidebar-mobile-menu-toggle-ND-hgygu.js} +1 -1
- package/build/assets/{sidebar-nav-link-pvUivfK2.js → sidebar-nav-link-CrujNA09.js} +1 -1
- package/build/assets/{sidebar-store-DwrYKwYr.js → sidebar-store-Bui-WNEr.js} +1 -1
- package/build/assets/{skill-card-pill-row-D7XCz5uk.js → skill-card-pill-row-CZBI7OqH.js} +1 -1
- package/build/assets/{skill-icon-badge-HqBWZ2Eq.js → skill-icon-badge-BOov_phZ.js} +1 -1
- package/build/assets/{skills-plugins-BPhaNpfx.js → skills-plugins-D0PiHWAD.js} +1 -1
- package/build/assets/{skills-settings-CcwMtnnJ.js → skills-settings-B43KArIz.js} +2 -2
- package/build/assets/{styled-tooltip-DsjDnR_W.js → styled-tooltip-C7grwnOX.js} +1 -1
- package/build/assets/{task-list-tab-BmaTwjaS.js → task-list-tab-R3ac6m7O.js} +1 -1
- package/build/assets/{terminal-BRcoba5B.js → terminal-yqkNdEAx.js} +1 -1
- package/build/assets/{toggle-switch-BptY3XRG.js → toggle-switch-BeSrbgCg.js} +1 -1
- package/build/assets/{trash-2-Bq4lHbTB.js → trash-2-wW5TWcdN.js} +1 -1
- package/build/assets/{typography-C6fuRTTT.js → typography-iYhzLlHO.js} +1 -1
- package/build/assets/{use-acp-credential-form-B0_pZ_uS.js → use-acp-credential-form-DUxbxmbq.js} +1 -1
- package/build/assets/use-activate-agent-profile-CDHA52tC.js +1 -0
- package/build/assets/use-agent-profiles-TsOdIyw5.js +1 -0
- package/build/assets/{use-can-manage-org-profiles-CrG1km7R.js → use-can-manage-org-profiles-Bt1M71u5.js} +1 -1
- package/build/assets/use-cloud-current-user-id-DWt7HCgf.js +1 -0
- package/build/assets/{use-config-Csy8EAP9.js → use-config-CxlEdf_v.js} +1 -1
- package/build/assets/{use-create-conversation-Dsa4nzU9.js → use-create-conversation-nOJ6Um5h.js} +1 -1
- package/build/assets/{use-create-secret-BnxuAjDt.js → use-create-secret-Dj5ang9x.js} +1 -1
- package/build/assets/use-is-authed-BT7Iud4U.js +1 -0
- package/build/assets/{use-is-creating-conversation-CIAcnd8M.js → use-is-creating-conversation-CAggrM75.js} +1 -1
- package/build/assets/use-llm-profiles-2Wc2db8u.js +1 -0
- package/build/assets/use-onboarding-completion-gxQlcEy2.js +1 -0
- package/build/assets/use-plugins-marketplace-CVO7sXYR.js +1 -0
- package/build/assets/use-save-agent-profile-D0wC5ExW.js +1 -0
- package/build/assets/{use-save-settings-BRh9p_fv.js → use-save-settings-L3aMaDeS.js} +1 -1
- package/build/assets/use-settings-8nt3DGxW.js +1 -0
- package/build/assets/use-settings-nav-items-DHAAD-zk.js +16 -0
- package/build/assets/use-skills-CE6miQ3r.js +1 -0
- package/build/assets/use-tracking-BGboadaZ.js +68 -0
- package/build/assets/{use-user-conversation-GnGhs_Ob.js → use-user-conversation-BIIpGUgM.js} +1 -1
- package/build/assets/useInfiniteQuery-BLRVmVPU.js +1 -0
- package/build/assets/{useMutation-DyQXZFEF.js → useMutation-CaSHLnX0.js} +1 -1
- package/build/assets/{useQueries-B3T1a7qt.js → useQueries--d_WWAzc.js} +1 -1
- package/build/assets/{useQuery-B38jBavx.js → useQuery-DiPh8LRJ.js} +1 -1
- package/build/assets/utils-BgGG1znF.js +1 -0
- package/build/assets/{vendor~browser-CIoZCqGs.js → vendor~browser-IVYgIgG1.js} +1 -1
- package/build/assets/{vendor~entry.client-Di4qO77Y.js → vendor~entry.client-BcYIVQvB.js} +1 -1
- package/build/assets/{vendor~entry.client-BfviqoVc.js → vendor~entry.client-CXM9oiAk.js} +1 -1
- package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~g4xrpilz-CJ7amdtQ.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0bpqexo-CbTboogo.js} +2 -2
- package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~f9xdmd0z-DLMP7bZx.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~d4by102p-C2f0ZhS-.js} +1 -1
- package/build/assets/{vendor~files-tab-vm3f67Pz.js → vendor~files-tab-C7RmQJwN.js} +1 -1
- package/build/assets/{vendor~index-home~home~conversation-panel~conversation-kX4LrGQC.js → vendor~index-home~home~conversation-panel~conversation-Bqp1ZqJM.js} +1 -1
- package/build/assets/{vendor~root-layout~conversation-panel~conversation-DpA6fir3.js → vendor~root-layout~conversation-panel~conversation-BCn8lzeG.js} +1 -1
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~automation-setup-route-B_L-gcOG.js +1 -0
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-sjx0x5ac.js +1 -0
- package/build/assets/vendor~root-layout~index-home~home~mcp~automations-list~automation-setup-route~onboarding-modal-D7IDevqN.js +1 -0
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~bi2r7bko-Bw4AuHN1.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~dfc8ddxy-tTyxnjXT.js} +1 -1
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hakxo2tj-ClV0p9g3.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gy8zbn65-CGt6bWRT.js} +1 -1
- package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~launch~skills-settings~a~eywn6ulz-BKxxr74w.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~dufan6ng-Dtdw8H0q.js} +17 -4
- package/build/assets/{verification-settings-CaCzojbc.js → verification-settings-DBsnSXC3.js} +1 -1
- package/build/assets/x-omAzpXkl.js +1 -0
- package/build/favicon-16x16.png +0 -0
- package/build/favicon-32x32.png +0 -0
- package/build/favicon.ico +0 -0
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +39 -2
- package/build/locales/ca/openhands.json +39 -2
- package/build/locales/de/openhands.json +39 -2
- package/build/locales/en/openhands.json +40 -3
- package/build/locales/es/openhands.json +39 -2
- package/build/locales/fr/openhands.json +39 -2
- package/build/locales/it/openhands.json +39 -2
- package/build/locales/ja/openhands.json +39 -2
- package/build/locales/ko-KR/openhands.json +39 -2
- package/build/locales/no/openhands.json +39 -2
- package/build/locales/pt/openhands.json +39 -2
- package/build/locales/tr/openhands.json +39 -2
- package/build/locales/uk/openhands.json +39 -2
- package/build/locales/zh-CN/openhands.json +39 -2
- package/build/locales/zh-TW/openhands.json +39 -2
- package/config/defaults.json +4 -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 +46 -6
- package/dist/api/agent-server-adapter.js +187 -168
- package/dist/api/agent-server-adapter.js.map +1 -1
- package/dist/api/agent-server-compatibility.cjs +1 -1
- package/dist/api/agent-server-compatibility.cjs.map +1 -1
- package/dist/api/agent-server-compatibility.d.ts +4 -0
- package/dist/api/agent-server-compatibility.js +41 -38
- package/dist/api/agent-server-compatibility.js.map +1 -1
- package/dist/api/automation-service/automation-service.api.cjs +1 -1
- package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
- package/dist/api/automation-service/automation-service.api.d.ts +20 -0
- package/dist/api/automation-service/automation-service.api.js +136 -99
- package/dist/api/automation-service/automation-service.api.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 +1 -1
- package/dist/api/backend-registry/storage.js.map +1 -1
- package/dist/api/backend-registry/types.d.ts +2 -0
- package/dist/api/cloud/conversation-service.api.cjs +1 -1
- package/dist/api/cloud/conversation-service.api.js +22 -22
- package/dist/api/mcp-service/mcp-service.api.cjs +1 -1
- package/dist/api/mcp-service/mcp-service.api.cjs.map +1 -1
- package/dist/api/mcp-service/mcp-service.api.js +19 -19
- package/dist/api/mcp-service/mcp-service.api.js.map +1 -1
- package/dist/api/settings-service/settings-service.api.cjs +1 -1
- package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
- package/dist/api/settings-service/settings-service.api.js +26 -12
- package/dist/api/settings-service/settings-service.api.js.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs +2 -0
- package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs.map +1 -0
- package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.d.ts +12 -0
- package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js +94 -0
- package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js.map +1 -0
- 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 +31 -90
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
- package/dist/components/features/automations/recommended-automations-launcher.d.ts +0 -7
- package/dist/components/features/automations/recommended-automations-section.d.ts +0 -6
- 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.js +568 -358
- package/dist/components/features/backends/backend-form-modal.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 +9 -1
- package/dist/components/features/backends/device-flow-auth.js +56 -55
- package/dist/components/features/backends/device-flow-auth.js.map +1 -1
- package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
- package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
- package/dist/components/features/backends/manage-backends-modal.js +1 -1
- package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
- package/dist/components/features/chat/chat-interface.cjs +1 -1
- package/dist/components/features/chat/chat-interface.cjs.map +1 -1
- package/dist/components/features/chat/chat-interface.js +105 -105
- package/dist/components/features/chat/chat-interface.js.map +1 -1
- package/dist/components/features/chat/chat-message.cjs +1 -1
- package/dist/components/features/chat/chat-message.cjs.map +1 -1
- package/dist/components/features/chat/chat-message.d.ts +2 -1
- package/dist/components/features/chat/chat-message.js +59 -49
- package/dist/components/features/chat/chat-message.js.map +1 -1
- package/dist/components/features/chat/pending-user-messages.cjs +1 -1
- package/dist/components/features/chat/pending-user-messages.cjs.map +1 -1
- package/dist/components/features/chat/pending-user-messages.js +4 -1
- package/dist/components/features/chat/pending-user-messages.js.map +1 -1
- package/dist/components/features/chat/typing-indicator.cjs +1 -1
- package/dist/components/features/chat/typing-indicator.cjs.map +1 -1
- package/dist/components/features/chat/typing-indicator.d.ts +8 -1
- package/dist/components/features/chat/typing-indicator.js +94 -10
- package/dist/components/features/chat/typing-indicator.js.map +1 -1
- package/dist/components/features/command-menu/command-menu-items.d.ts +5 -1
- package/dist/components/features/files-tab/segmented-toggle.cjs +1 -1
- package/dist/components/features/files-tab/segmented-toggle.cjs.map +1 -1
- package/dist/components/features/files-tab/segmented-toggle.d.ts +2 -0
- package/dist/components/features/files-tab/segmented-toggle.js +17 -14
- package/dist/components/features/files-tab/segmented-toggle.js.map +1 -1
- package/dist/components/features/manifest/manifest-form-field.d.ts +27 -0
- package/dist/components/features/manifest/manifest-prerequisites-step.d.ts +11 -0
- package/dist/components/features/manifest/manifest-review-step.d.ts +14 -0
- package/dist/components/features/manifest/manifest-setup-dialog.d.ts +14 -0
- package/dist/components/features/mcp-page/custom-server-editor.cjs +1 -1
- package/dist/components/features/mcp-page/custom-server-editor.js +16 -16
- package/dist/components/features/mcp-page/installed-server-card.cjs +1 -1
- package/dist/components/features/mcp-page/installed-server-card.cjs.map +1 -1
- package/dist/components/features/mcp-page/installed-server-card.d.ts +2 -2
- package/dist/components/features/mcp-page/installed-server-card.js +6 -7
- package/dist/components/features/mcp-page/installed-server-card.js.map +1 -1
- package/dist/components/features/mcp-page/installed-servers-section.cjs +1 -1
- package/dist/components/features/mcp-page/installed-servers-section.cjs.map +1 -1
- package/dist/components/features/mcp-page/installed-servers-section.d.ts +2 -2
- package/dist/components/features/mcp-page/installed-servers-section.js +2 -2
- package/dist/components/features/mcp-page/installed-servers-section.js.map +1 -1
- package/dist/components/features/mcp-page/mcp-server-health.cjs +1 -1
- package/dist/components/features/mcp-page/mcp-server-health.js +4 -4
- package/dist/components/features/settings/mcp-settings/mcp-server-form.cjs +1 -1
- package/dist/components/features/settings/mcp-settings/mcp-server-form.cjs.map +1 -1
- package/dist/components/features/settings/mcp-settings/mcp-server-form.js +2 -1
- package/dist/components/features/settings/mcp-settings/mcp-server-form.js.map +1 -1
- package/dist/components/features/settings/settings-input.cjs +1 -1
- package/dist/components/features/settings/settings-input.cjs.map +1 -1
- package/dist/components/features/settings/settings-input.d.ts +6 -0
- package/dist/components/features/settings/settings-input.js +13 -8
- package/dist/components/features/settings/settings-input.js.map +1 -1
- package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
- package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
- package/dist/components/features/sidebar/sidebar-rail-body.js +124 -123
- package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
- package/dist/config/defaults.cjs +1 -1
- package/dist/config/defaults.cjs.map +1 -1
- package/dist/config/defaults.js +3 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/contexts/active-backend-context.cjs +1 -1
- package/dist/contexts/active-backend-context.cjs.map +1 -1
- package/dist/contexts/active-backend-context.d.ts +3 -2
- package/dist/contexts/active-backend-context.js +55 -42
- package/dist/contexts/active-backend-context.js.map +1 -1
- package/dist/favicon-16x16.png +0 -0
- package/dist/favicon-32x32.png +0 -0
- package/dist/favicon.ico +0 -0
- package/dist/hooks/mutation/use-update-mcp-server.cjs +1 -1
- package/dist/hooks/mutation/use-update-mcp-server.js +5 -5
- package/dist/hooks/query/query-keys.cjs.map +1 -1
- package/dist/hooks/query/query-keys.d.ts +4 -0
- package/dist/hooks/query/query-keys.js.map +1 -1
- package/dist/hooks/query/use-cloud-current-user-id.cjs +1 -1
- package/dist/hooks/query/use-cloud-current-user-id.cjs.map +1 -1
- package/dist/hooks/query/use-cloud-current-user-id.js +7 -5
- package/dist/hooks/query/use-cloud-current-user-id.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.js +5 -1
- package/dist/hooks/query/use-cloud-organizations.js.map +1 -1
- package/dist/hooks/query/use-manifest-capabilities.d.ts +21 -0
- package/dist/hooks/query/use-manifest-prerequisites.d.ts +24 -0
- package/dist/hooks/use-can-manage-org-profiles.cjs +1 -1
- package/dist/hooks/use-can-manage-org-profiles.cjs.map +1 -1
- package/dist/hooks/use-can-manage-org-profiles.js +2 -1
- package/dist/hooks/use-can-manage-org-profiles.js.map +1 -1
- package/dist/hooks/use-llm-configured.cjs +1 -1
- package/dist/hooks/use-llm-configured.cjs.map +1 -1
- package/dist/hooks/use-llm-configured.js +2 -1
- package/dist/hooks/use-llm-configured.js.map +1 -1
- package/dist/hooks/use-manifest-preflight.d.ts +18 -0
- package/dist/hooks/use-tracking.cjs +1 -1
- package/dist/hooks/use-tracking.cjs.map +1 -1
- package/dist/hooks/use-tracking.d.ts +14 -0
- package/dist/hooks/use-tracking.js +28 -10
- 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 +38 -1
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/translation.cjs +2 -2
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +645 -16
- package/dist/i18n/translation.js.map +1 -1
- package/dist/icons/external-link.cjs +2 -0
- package/dist/icons/external-link.cjs.map +1 -0
- package/dist/icons/external-link.js +22 -0
- package/dist/icons/external-link.js.map +1 -0
- package/dist/icons/server.cjs +2 -0
- package/dist/icons/server.cjs.map +1 -0
- package/dist/icons/server.js +17 -0
- package/dist/icons/server.js.map +1 -0
- package/dist/locales/ar/openhands.json +39 -2
- package/dist/locales/ca/openhands.json +39 -2
- package/dist/locales/de/openhands.json +39 -2
- package/dist/locales/en/openhands.json +40 -3
- package/dist/locales/es/openhands.json +39 -2
- package/dist/locales/fr/openhands.json +39 -2
- package/dist/locales/it/openhands.json +39 -2
- package/dist/locales/ja/openhands.json +39 -2
- package/dist/locales/ko-KR/openhands.json +39 -2
- package/dist/locales/no/openhands.json +39 -2
- package/dist/locales/pt/openhands.json +39 -2
- package/dist/locales/tr/openhands.json +39 -2
- package/dist/locales/uk/openhands.json +39 -2
- package/dist/locales/zh-CN/openhands.json +39 -2
- package/dist/locales/zh-TW/openhands.json +39 -2
- package/dist/manifests/automation-interface.cjs +2 -0
- package/dist/manifests/automation-interface.cjs.map +1 -0
- package/dist/manifests/automation-interface.d.ts +44 -0
- package/dist/manifests/automation-interface.js +81 -0
- package/dist/manifests/automation-interface.js.map +1 -0
- package/dist/manifests/automation-setup.cjs +2 -0
- package/dist/manifests/automation-setup.cjs.map +1 -0
- package/dist/manifests/automation-setup.d.ts +52 -0
- package/dist/manifests/automation-setup.js +8 -0
- package/dist/manifests/automation-setup.js.map +1 -0
- package/dist/manifests/interface-validation.cjs +2 -0
- package/dist/manifests/interface-validation.cjs.map +1 -0
- package/dist/manifests/interface-validation.d.ts +27 -0
- package/dist/manifests/interface-validation.js +182 -0
- package/dist/manifests/interface-validation.js.map +1 -0
- package/dist/manifests/manifest-actions.d.ts +15 -0
- package/dist/manifests/manifest-capabilities.d.ts +25 -0
- package/dist/manifests/manifest-error-map.d.ts +40 -0
- package/dist/manifests/manifest-local-validation.d.ts +56 -0
- package/dist/manifests/manifest-registry.cjs +2 -0
- package/dist/manifests/manifest-registry.cjs.map +1 -0
- package/dist/manifests/manifest-registry.d.ts +15 -0
- package/dist/manifests/manifest-registry.js +26 -0
- package/dist/manifests/manifest-registry.js.map +1 -0
- package/dist/manifests/manifest-sources.cjs +2 -0
- package/dist/manifests/manifest-sources.cjs.map +1 -0
- package/dist/manifests/manifest-sources.d.ts +15 -0
- package/dist/manifests/manifest-sources.js +8 -0
- package/dist/manifests/manifest-sources.js.map +1 -0
- package/dist/manifests/manifest-template.d.ts +18 -0
- package/dist/manifests/manifest-validation.cjs +2 -0
- package/dist/manifests/manifest-validation.cjs.map +1 -0
- package/dist/manifests/manifest-validation.d.ts +30 -0
- package/dist/manifests/manifest-validation.js +145 -0
- package/dist/manifests/manifest-validation.js.map +1 -0
- package/dist/manifests/types.cjs +2 -0
- package/dist/manifests/types.cjs.map +1 -0
- package/dist/manifests/types.d.ts +227 -0
- package/dist/manifests/types.js +6 -0
- package/dist/manifests/types.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js +75 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js +78 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.cjs +17 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.js +89 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.cjs +10 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.js +17 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-triage-assistant/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-triage-assistant/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-triage-assistant/manifest.js +15 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-triage-assistant/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/research-brief-writer/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/research-brief-writer/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/research-brief-writer/manifest.js +18 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/research-brief-writer/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/slack-channel-monitor/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/slack-channel-monitor/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/slack-channel-monitor/manifest.js +14 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/slack-channel-monitor/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/slack-standup-digest/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/slack-standup-digest/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/slack-standup-digest/manifest.js +14 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/slack-standup-digest/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +23 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/index.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/automations/index.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/index.js +18 -0
- package/dist/node_modules/@openhands/extensions/automations/index.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/interface.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/automations/interface.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/interface.js +89 -0
- package/dist/node_modules/@openhands/extensions/automations/interface.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js +3 -3
- package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.cjs +17 -4
- package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.js +5 -5
- package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.js +9 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.js.map +1 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/monitor.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/monitor.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/monitor.js +29 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/monitor.js.map +1 -0
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +3 -3
- package/dist/package.js.map +1 -1
- package/dist/routes/app-settings.cjs +1 -1
- package/dist/routes/app-settings.js +5 -5
- package/dist/routes/mcp.cjs +1 -1
- package/dist/routes/mcp.cjs.map +1 -1
- package/dist/routes/mcp.js +73 -82
- package/dist/routes/mcp.js.map +1 -1
- package/dist/services/telemetry.cjs +1 -1
- package/dist/services/telemetry.cjs.map +1 -1
- package/dist/services/telemetry.d.ts +8 -0
- package/dist/services/telemetry.js +163 -116
- package/dist/services/telemetry.js.map +1 -1
- package/dist/types/agent-server/core/events/conversation-state-event.d.ts +2 -19
- package/dist/types/agent-server/core/events/observation-event.d.ts +2 -18
- package/dist/types/automation.d.ts +7 -3
- package/dist/types/mcp-server.d.ts +5 -0
- package/dist/types/settings.d.ts +3 -0
- package/dist/utils/api-error-message.d.ts +6 -2
- package/dist/utils/automation-catalog.cjs +2 -0
- package/dist/utils/automation-catalog.cjs.map +1 -0
- package/dist/utils/automation-catalog.d.ts +28 -0
- package/dist/utils/automation-catalog.js +5 -0
- package/dist/utils/automation-catalog.js.map +1 -0
- package/dist/utils/automation-timeout.d.ts +3 -2
- package/dist/utils/mcp-config.cjs +1 -1
- package/dist/utils/mcp-config.cjs.map +1 -1
- package/dist/utils/mcp-config.d.ts +8 -0
- package/dist/utils/mcp-config.js +25 -20
- package/dist/utils/mcp-config.js.map +1 -1
- package/dist/utils/mcp-installed-servers.cjs +1 -1
- package/dist/utils/mcp-installed-servers.cjs.map +1 -1
- package/dist/utils/mcp-installed-servers.js +6 -3
- package/dist/utils/mcp-installed-servers.js.map +1 -1
- package/dist/utils/responder-deployment.d.ts +5 -1
- package/dist/utils/transcript-export/index.cjs +5 -5
- package/dist/utils/transcript-export/index.js +12 -12
- package/package.json +3 -3
- package/scripts/check-sdk-version-sync.mjs +6 -6
- package/scripts/check-translation-completeness.cjs +1 -0
- package/scripts/dev-safe.mjs +17 -12
- package/scripts/dev-static.mjs +17 -0
- package/scripts/dev-with-automation.mjs +12 -14
- package/scripts/ingress.mjs +22 -0
- package/scripts/proxy-utils.mjs +157 -2
- package/scripts/runtime-services-info.mjs +6 -6
- package/scripts/static-build.mjs +0 -7
- package/scripts/static-server.mjs +10 -0
- package/build/assets/active-backend-context-BlZPzZNU.js +0 -1
- package/build/assets/agent-context-settings-CTaN-Iw9.js +0 -1
- package/build/assets/agent-profiles-settings-CR4VTqv_.js +0 -1
- package/build/assets/agent-server-conversation-service.api-Btmi4q6d.js +0 -41
- package/build/assets/agent-settings-KQs-occT.js +0 -1
- package/build/assets/api-key-entry-screen-BhR24gkM.js +0 -1
- package/build/assets/app-settings-Bs4sY8WP.js +0 -1
- package/build/assets/automation-BGP_I1RR.js +0 -1
- package/build/assets/automation-detail-CwDnJbYR.js +0 -2
- package/build/assets/automation-export-Bu-r-EzL.js +0 -2
- package/build/assets/automations-list-CYw7_6FR.js +0 -1
- package/build/assets/backend-form-modal-Ce-KRHOJ.js +0 -1
- package/build/assets/browser-BUDJnBg4.js +0 -6
- package/build/assets/check-BMOG005H.js +0 -1
- package/build/assets/chevron-down-CV1zZP_K.js +0 -1
- package/build/assets/circle-check-lvN_jFN5.js +0 -1
- package/build/assets/client-source-1v-kWLNU.js +0 -1
- package/build/assets/cloud-funnel-analytics-CasMM7EO.js +0 -1
- package/build/assets/command-menu-N_BriUy8.js +0 -1
- package/build/assets/condenser-settings-Czi8cKxV.js +0 -1
- package/build/assets/conversation-C25pc2dT.js +0 -1
- package/build/assets/conversation-CObLYSJd.js +0 -90
- package/build/assets/conversation-panel-C25pc2dT.js +0 -1
- package/build/assets/conversation-state-store-DTq4hFoP.js +0 -1
- package/build/assets/extensions-hub-BKftOQ-X.js +0 -1
- package/build/assets/extensions-navigation-DF24q1H1.js +0 -1
- package/build/assets/files-tab-SAiFCnS5.js +0 -1
- package/build/assets/git-provider-icon-BREx-yUX.js +0 -1
- package/build/assets/home-EPNFgzUh.js +0 -1
- package/build/assets/home-sN90Xcxp.js +0 -1
- package/build/assets/index-home-EPNFgzUh.js +0 -1
- package/build/assets/install-server-modal-BI8yUfmr.js +0 -1
- package/build/assets/llm-not-configured-banner-DTWzISnk.js +0 -27
- package/build/assets/llm-settings-BXk5_Pac.js +0 -1
- package/build/assets/llm-settings-C1vpgWam.js +0 -1
- package/build/assets/loader-circle-6zlEYCJw.js +0 -1
- package/build/assets/manage-backends-modal-DhflyGTf.js +0 -1
- package/build/assets/manifest-8082e879.js +0 -1
- package/build/assets/mcp-CxLPda-W.js +0 -9
- package/build/assets/messages-DINDkPNK.js +0 -40
- package/build/assets/onboarding-modal-DdvE6rzw.js +0 -1
- package/build/assets/organization-service.api-CT2OQlLz.js +0 -1
- package/build/assets/plugins-management-service-DVkoM3eA.js +0 -1
- package/build/assets/plus-vIbGD459.js +0 -1
- package/build/assets/profiles-service.api-CBafmAPO.js +0 -1
- package/build/assets/providers-9UzRB9mT.js +0 -1
- package/build/assets/proxy-C79PCMjo.js +0 -1
- package/build/assets/recommended-automations-launcher-BF2mtAKw.js +0 -58
- package/build/assets/root-B5JXKp1P.css +0 -1
- package/build/assets/root-Sj7W28yE.js +0 -2
- package/build/assets/root-layout-DbhKVoc7.js +0 -3
- package/build/assets/schema-field-CV6bFnoL.js +0 -1
- package/build/assets/search-sKuYKllf.js +0 -1
- package/build/assets/secrets-service-BjK-bPN2.js +0 -1
- package/build/assets/segmented-toggle-DbbD3Tve.js +0 -1
- package/build/assets/settings-Bj5Oo45A.js +0 -1
- package/build/assets/settings-input-BjW_zyTN.js +0 -1
- package/build/assets/settings-service.api-DryhKdSr.js +0 -1
- package/build/assets/shared-conversation-CnMxy7p_.js +0 -1
- package/build/assets/telemetry-cmCL3o6Z.js +0 -2
- package/build/assets/use-activate-agent-profile-DH33MvVj.js +0 -1
- package/build/assets/use-agent-profiles-Dmd_4H8q.js +0 -1
- package/build/assets/use-cloud-current-user-id-B6DP3s47.js +0 -1
- package/build/assets/use-is-authed-BsS4XwSL.js +0 -1
- package/build/assets/use-llm-profiles-BMQoc612.js +0 -1
- package/build/assets/use-onboarding-completion-B-2BTS-y.js +0 -1
- package/build/assets/use-plugins-marketplace-PBc_XNz_.js +0 -1
- package/build/assets/use-save-agent-profile-2Mk9ZX37.js +0 -1
- package/build/assets/use-settings-DBI44RnH.js +0 -1
- package/build/assets/use-settings-nav-items-Cva28C-c.js +0 -16
- package/build/assets/use-skills-RQsCtdzN.js +0 -1
- package/build/assets/use-tracking-CN1nIMnY.js +0 -1
- package/build/assets/utils-qjs_KuS4.js +0 -1
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation-EShpjxey.js +0 -1
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-DD_UNO02.js +0 -1
- package/build/assets/vendor~root-layout~index-home~home~mcp~automations-list~onboarding-modal-Be63Q2Ln.js +0 -1
- package/build/assets/x-EjvKGawc.js +0 -1
- /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~f1hl7voa-BrmgjeOw.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~emdr2jt4-BrmgjeOw.js} +0 -0
package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../../node_modules/react-i18next/dist/es/Trans.cjs"),n=require("../../../../i18n/declaration.cjs"),r=require("../../../../i18n/index.cjs")
|
|
1
|
+
const e=require("../../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../../node_modules/react-i18next/dist/es/Trans.cjs"),n=require("../../../../i18n/declaration.cjs"),r=require("../../../../i18n/index.cjs");require("../../../../constants/canvas-ui.cjs");const i=require("../../../../types/agent-server/type-guards.cjs"),a=require("./get-acp-tool-call-content.cjs"),o=require("./get-action-event-title.cjs"),s=require("../../../features/chat/mono-component.cjs"),c=require("../../../features/chat/path-component.cjs"),l=require("./get-action-content.cjs"),u=require("./get-observation-content.cjs"),d=require("../task-tracking/task-tracking-observation-content.cjs"),f=require("./create-skill-ready-event.cjs"),p=require("../../../features/chat/tool-visualizers/dispatcher.cjs");let m=require("react");m=e.__toESM(m,1);let h=require("react/jsx-runtime");var g=(e,n)=>r.default.exists(e)?(0,h.jsx)(t.Trans,{ns:`openhands`,i18nKey:e,values:n,components:{path:(0,h.jsx)(c.PathComponent,{}),cmd:(0,h.jsx)(s.MonoComponent,{})}}):e,_=e=>e.kind===`text`?e.text:g(e.key,e.values),v=(e,t)=>{if(typeof e!=`string`)return null;let n=e.trim();return n?t?o.trimEventTitleText(n,t):n:null},y=e=>{if(e.tool_name!==`inspect_image_with_vision`)return null;let t=e.action,n=v(t.profile_name);return n?`Describing image with ${n}`:`Describing image with auxiliary vision LLM`},b=(e,t)=>{let n=t?.tool_name,r=e.observation,i=v(r.tool_name);if(n!==`inspect_image_with_vision`&&i!==`inspect_image_with_vision`&&String(e.observation.kind)!==`VisionInspectObservation`)return null;let a=v((t?.action??{}).profile_name)??v(r.profile_name)??v(r.base_url,80)??v(r.endpoint,80)??v(r.model,80);return a?`Describing image with ${a}`:`Describing image with auxiliary vision LLM`},x=e=>i.isActionEvent(e)?y(e)||_(o.getActionEventTitleDescriptor(e)):``,S=(e,t)=>{if(!i.isObservationEvent(e))return``;let n=b(e,t);if(n)return n;if(t){let e=y(t);if(e)return e;let n=o.getActionSummaryTitle(t);if(n)return n}let r=e.observation.kind,a=``,s={};switch(r){case`ExecuteBashObservation`:case`TerminalObservation`:a=`OBSERVATION_MESSAGE$RUN`,s={command:e.observation.command?o.trimEventTitleText(e.observation.command,80):``};break;case`FileEditorObservation`:case`StrReplaceEditorObservation`:a=e.observation.command===`view`?`OBSERVATION_MESSAGE$READ`:`OBSERVATION_MESSAGE$EDIT`,s={path:e.observation.path||``};break;case`MCPToolObservation`:a=`OBSERVATION_MESSAGE$MCP`,s={mcp_tool_name:e.observation.tool_name};break;case`InvokeSkillObservation`:a=`OBSERVATION_MESSAGE$INVOKE_SKILL`,s={name:e.observation.skill_name};break;case`TaskObservation`:a=`OBSERVATION_MESSAGE$TASK`,s={name:e.observation.subagent};break;case`CanvasUIObservation`:a=`OBSERVATION_MESSAGE$CANVAS_UI`;break;case`ClientToolObservation`:if(e.tool_name===`canvas_ui_control`){a=`OBSERVATION_MESSAGE$CANVAS_UI`;break}return r.replace(`Observation`,``).toUpperCase();case`SwitchLLMObservation`:a=e.observation.is_error?`MODEL$SWITCH_FAILED`:`MODEL$SWITCHED_TO_PROFILE`,s={name:e.observation.profile_name};break;case`BrowserObservation`:a=`OBSERVATION_MESSAGE$BROWSE`;break;case`TaskTrackerObservation`:{let{command:t}=e.observation;a=t===`plan`?`OBSERVATION_MESSAGE$TASK_TRACKING_PLAN`:`OBSERVATION_MESSAGE$TASK_TRACKING_VIEW`;break}case`ThinkObservation`:a=`OBSERVATION_MESSAGE$THINK`;break;case`GlobObservation`:a=`OBSERVATION_MESSAGE$GLOB`,s={pattern:e.observation.pattern?o.trimEventTitleText(e.observation.pattern,50):``};break;case`GrepObservation`:a=`OBSERVATION_MESSAGE$GREP`,s={pattern:e.observation.pattern?o.trimEventTitleText(e.observation.pattern,50):``};break;default:return r.replace(`Observation`,``).toUpperCase()}return a?g(a,s):r},C=(e,t)=>e.observation.kind!==`ClientToolObservation`||e.tool_name!==`canvas_ui_control`||!t||!i.isCanvasUIActionEvent(t)?null:`UI command '${t.action.command}' dispatched to the Agent Canvas frontend.`,w=(e,t)=>{let o=``,s=``;if(f.isSkillReadyEvent(e)){let t=`OBSERVATION_MESSAGE$SKILL_READY`;o=r.default.exists(t)?g(t,{}):`Skill Ready`,s=e._skillReadyContent}else i.isActionEvent(e)?(o=x(e),s=p.resolveVisualizerBody(e)??l.getActionContent(e)):i.isObservationEvent(e)?(o=S(e,t),s=e.observation.kind===`TaskTrackerObservation`?(0,h.jsx)(d.TaskTrackingObservationContent,{event:e}):C(e,t)??p.resolveVisualizerBody(e,t)??u.getObservationContent(e)):i.isACPToolCallEvent(e)?(o=g(a.getACPToolCallTitleKey(e),{title:a.stripRedundantTitlePrefix(e)}),s=a.getACPToolCallContent(e)):e.source===`agent`&&`action`in e&&e.action!==null&&typeof e.action==`object`&&`kind`in e.action&&typeof e.action.kind==`string`&&(o=String(e.action.kind).replace(`Action`,``).toUpperCase());return{title:o||r.default.t(n.I18nKey.EVENT$UNKNOWN_EVENT),details:s}};exports.getEventContent=w;
|
|
2
2
|
//# sourceMappingURL=get-event-content.cjs.map
|
package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-event-content.cjs","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-event-content.tsx"],"sourcesContent":["import { Trans } from \"react-i18next\";\nimport React from \"react\";\nimport {\n CANVAS_UI_CLIENT_ACTION_KIND,\n CANVAS_UI_CLIENT_TOOL_NAME,\n} from \"#/constants/canvas-ui\";\nimport {\n OpenHandsEvent,\n ObservationEvent,\n ActionEvent,\n} from \"#/types/agent-server/core\";\nimport {\n isActionEvent,\n isObservationEvent,\n isACPToolCallEvent,\n isCanvasUIActionEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { MonoComponent } from \"../../../features/chat/mono-component\";\nimport { PathComponent } from \"../../../features/chat/path-component\";\nimport { getActionContent } from \"./get-action-content\";\nimport { getObservationContent } from \"./get-observation-content\";\nimport {\n getACPToolCallContent,\n getACPToolCallTitleKey,\n stripRedundantTitlePrefix,\n} from \"./get-acp-tool-call-content\";\nimport { TaskTrackingObservationContent } from \"../task-tracking/task-tracking-observation-content\";\nimport { TaskTrackerObservation } from \"#/types/agent-server/core/base/observation\";\nimport { SkillReadyEvent, isSkillReadyEvent } from \"./create-skill-ready-event\";\nimport { resolveVisualizerBody } from \"../../../features/chat/tool-visualizers/dispatcher\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\n\nconst trimText = (text: string, maxLength: number): string => {\n if (!text) return \"\";\n return text.length > maxLength ? `${text.substring(0, maxLength)}...` : text;\n};\n\n// Helper function to create title from translation key\nconst createTitleFromKey = (\n key: string,\n values: Record<string, unknown>,\n): React.ReactNode => {\n if (!i18n.exists(key)) {\n return key;\n }\n\n return (\n <Trans\n ns=\"openhands\"\n i18nKey={key}\n values={values}\n components={{\n path: <PathComponent />,\n cmd: <MonoComponent />,\n }}\n />\n );\n};\n\n/**\n * Detects the agent-server's default summary fallback, which has the shape\n * `{tool_name}: {json-args}` (see `_extract_summary` in\n * `openhands/sdk/agent/agent.py`). When the LLM omits a summary the server\n * dumps the raw arguments JSON, which renders as a huge unreadable blob in\n * the chat. Treat that case as \"no summary\" so the action-kind specific\n * title (e.g. \"Editing <path>\", \"Running <cmd>\") is used instead.\n */\nconst isServerFallbackSummary = (summary: string): boolean =>\n /^[a-z][a-z0-9_]*\\s*:\\s*[[{]/i.test(summary);\n\nconst getSummaryTitleForActionEvent = (\n event: ActionEvent,\n): React.ReactNode | null => {\n const summary = event.summary?.trim().replace(/\\s+/g, \" \") || \"\";\n if (!summary || isServerFallbackSummary(summary)) {\n return null;\n }\n return summary;\n};\n\nconst getNonEmptyString = (\n value: unknown,\n maxLength?: number,\n): string | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n return maxLength ? trimText(trimmed, maxLength) : trimmed;\n};\n\nconst getVisionInspectActionTitle = (\n event: ActionEvent,\n): React.ReactNode | null => {\n if (event.tool_name !== \"inspect_image_with_vision\") {\n return null;\n }\n\n const action = event.action as unknown as Record<string, unknown>;\n const profileName = getNonEmptyString(action.profile_name);\n\n return profileName\n ? `Describing image with ${profileName}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\nconst getVisionInspectObservationTitle = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode | null => {\n const actionToolName = correspondingAction?.tool_name;\n const observation = event.observation as unknown as Record<string, unknown>;\n const observationToolName = getNonEmptyString(observation.tool_name);\n\n if (\n actionToolName !== \"inspect_image_with_vision\" &&\n observationToolName !== \"inspect_image_with_vision\" &&\n String(event.observation.kind) !== \"VisionInspectObservation\"\n ) {\n return null;\n }\n\n const action = (correspondingAction?.action ?? {}) as unknown as Record<\n string,\n unknown\n >;\n const label =\n getNonEmptyString(action.profile_name) ??\n getNonEmptyString(observation.profile_name) ??\n getNonEmptyString(observation.base_url, 80) ??\n getNonEmptyString(observation.endpoint, 80) ??\n getNonEmptyString(observation.model, 80);\n\n return label\n ? `Describing image with ${label}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\n// Action Event Processing\nconst getActionEventTitle = (event: OpenHandsEvent): React.ReactNode => {\n // Early return if not an action event\n if (!isActionEvent(event)) {\n return \"\";\n }\n\n const visionInspectTitle = getVisionInspectActionTitle(event);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n const summaryTitle = getSummaryTitleForActionEvent(event);\n if (summaryTitle) {\n return summaryTitle;\n }\n\n const actionType = event.action.kind;\n let actionKey = \"\";\n let actionValues: Record<string, unknown> = {};\n\n switch (actionType) {\n case \"ExecuteBashAction\":\n case \"TerminalAction\":\n actionKey = \"ACTION_MESSAGE$RUN\";\n actionValues = {\n command: trimText(event.action.command, 80),\n };\n break;\n case \"FileEditorAction\":\n case \"StrReplaceEditorAction\":\n if (event.action.command === \"view\") {\n actionKey = \"ACTION_MESSAGE$READ\";\n } else if (event.action.command === \"create\") {\n actionKey = \"ACTION_MESSAGE$WRITE\";\n } else {\n actionKey = \"ACTION_MESSAGE$EDIT\";\n }\n actionValues = {\n path: event.action.path,\n };\n break;\n case \"MCPToolAction\":\n actionKey = \"ACTION_MESSAGE$CALL_TOOL_MCP\";\n actionValues = {\n mcp_tool_name: event.tool_name,\n };\n break;\n case \"InvokeSkillAction\":\n actionKey = \"ACTION_MESSAGE$INVOKE_SKILL\";\n actionValues = {\n name: event.action.name,\n };\n break;\n case \"TaskAction\":\n actionKey = \"ACTION_MESSAGE$TASK\";\n actionValues = {\n name: event.action.subagent_type,\n };\n break;\n case \"ThinkAction\":\n actionKey = \"ACTION_MESSAGE$THINK\";\n break;\n case \"FinishAction\":\n actionKey = \"ACTION_MESSAGE$FINISH\";\n break;\n case \"TaskTrackerAction\":\n actionKey = \"ACTION_MESSAGE$TASK_TRACKING\";\n break;\n case \"GrepAction\":\n actionKey = \"ACTION_MESSAGE$GREP\";\n actionValues = {\n pattern:\n \"pattern\" in event.action && event.action.pattern\n ? trimText(String(event.action.pattern), 50)\n : \"\",\n };\n break;\n case \"GlobAction\":\n actionKey = \"ACTION_MESSAGE$GLOB\";\n actionValues = {\n pattern:\n \"pattern\" in event.action && event.action.pattern\n ? trimText(String(event.action.pattern), 50)\n : \"\",\n };\n break;\n case \"BrowserNavigateAction\":\n case \"BrowserClickAction\":\n case \"BrowserTypeAction\":\n case \"BrowserGetStateAction\":\n case \"BrowserGetContentAction\":\n case \"BrowserScrollAction\":\n case \"BrowserGoBackAction\":\n case \"BrowserListTabsAction\":\n case \"BrowserSwitchTabAction\":\n case \"BrowserCloseTabAction\":\n actionKey = \"ACTION_MESSAGE$BROWSE\";\n break;\n case \"CanvasUIAction\":\n case CANVAS_UI_CLIENT_ACTION_KIND:\n return \"CANVASUI\";\n default:\n // For unknown actions, use the type name\n return String(actionType).replace(\"Action\", \"\").toUpperCase();\n }\n\n if (actionKey) {\n return createTitleFromKey(actionKey, actionValues);\n }\n\n return actionType;\n};\n\n// Observation Event Processing\nconst getObservationEventTitle = (\n event: OpenHandsEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode => {\n // Early return if not an observation event\n if (!isObservationEvent(event)) {\n return \"\";\n }\n\n const visionInspectObservationTitle = getVisionInspectObservationTitle(\n event,\n correspondingAction,\n );\n if (visionInspectObservationTitle) {\n return visionInspectObservationTitle;\n }\n\n if (correspondingAction) {\n const visionInspectTitle = getVisionInspectActionTitle(correspondingAction);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n const summaryTitle = getSummaryTitleForActionEvent(correspondingAction);\n if (summaryTitle) {\n return summaryTitle;\n }\n }\n\n const observationType = event.observation.kind;\n let observationKey = \"\";\n let observationValues: Record<string, unknown> = {};\n\n switch (observationType) {\n case \"ExecuteBashObservation\":\n case \"TerminalObservation\":\n observationKey = \"OBSERVATION_MESSAGE$RUN\";\n observationValues = {\n command: event.observation.command\n ? trimText(event.observation.command, 80)\n : \"\",\n };\n break;\n case \"FileEditorObservation\":\n case \"StrReplaceEditorObservation\":\n if (event.observation.command === \"view\") {\n observationKey = \"OBSERVATION_MESSAGE$READ\";\n } else {\n observationKey = \"OBSERVATION_MESSAGE$EDIT\";\n }\n observationValues = {\n path: event.observation.path || \"\",\n };\n break;\n case \"MCPToolObservation\":\n observationKey = \"OBSERVATION_MESSAGE$MCP\";\n observationValues = {\n mcp_tool_name: event.observation.tool_name,\n };\n break;\n case \"InvokeSkillObservation\":\n observationKey = \"OBSERVATION_MESSAGE$INVOKE_SKILL\";\n observationValues = {\n name: event.observation.skill_name,\n };\n break;\n case \"TaskObservation\":\n observationKey = \"OBSERVATION_MESSAGE$TASK\";\n observationValues = {\n name: event.observation.subagent,\n };\n break;\n case \"CanvasUIObservation\":\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n case \"ClientToolObservation\":\n if (event.tool_name === CANVAS_UI_CLIENT_TOOL_NAME) {\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n }\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n case \"SwitchLLMObservation\":\n observationKey = event.observation.is_error\n ? \"MODEL$SWITCH_FAILED\"\n : \"MODEL$SWITCHED_TO_PROFILE\";\n observationValues = {\n name: event.observation.profile_name,\n };\n break;\n case \"BrowserObservation\":\n observationKey = \"OBSERVATION_MESSAGE$BROWSE\";\n break;\n case \"TaskTrackerObservation\": {\n const { command } = event.observation;\n if (command === \"plan\") {\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_PLAN\";\n } else {\n // command === \"view\"\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_VIEW\";\n }\n break;\n }\n case \"ThinkObservation\":\n observationKey = \"OBSERVATION_MESSAGE$THINK\";\n break;\n case \"GlobObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GLOB\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n case \"GrepObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GREP\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n default:\n // For unknown observations, use the type name\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n }\n\n if (observationKey) {\n return createTitleFromKey(observationKey, observationValues);\n }\n\n return observationType;\n};\n\nconst getCanvasUIClientObservationContent = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): string | null => {\n if (\n event.observation.kind !== \"ClientToolObservation\" ||\n event.tool_name !== CANVAS_UI_CLIENT_TOOL_NAME ||\n !correspondingAction ||\n !isCanvasUIActionEvent(correspondingAction)\n ) {\n return null;\n }\n\n return `UI command '${correspondingAction.action.command}' dispatched to the Agent Canvas frontend.`;\n};\n\nexport const getEventContent = (\n event: OpenHandsEvent | SkillReadyEvent,\n correspondingAction?: ActionEvent,\n) => {\n let title: React.ReactNode = \"\";\n let details: string | React.ReactNode = \"\";\n\n // Handle Skill Ready events first\n if (isSkillReadyEvent(event)) {\n // Use translation key if available, otherwise use \"SKILL READY\"\n const skillReadyKey = \"OBSERVATION_MESSAGE$SKILL_READY\";\n if (i18n.exists(skillReadyKey)) {\n title = createTitleFromKey(skillReadyKey, {});\n } else {\n title = \"Skill Ready\";\n }\n details = event._skillReadyContent;\n } else if (isActionEvent(event)) {\n title = getActionEventTitle(event);\n // Per-tool React visualizer when one is registered; markdown otherwise.\n details = resolveVisualizerBody(event) ?? getActionContent(event);\n } else if (isObservationEvent(event)) {\n title = getObservationEventTitle(event, correspondingAction);\n\n // For TaskTrackerObservation, use React component instead of markdown\n if (event.observation.kind === \"TaskTrackerObservation\") {\n details = (\n <TaskTrackingObservationContent\n event={event as ObservationEvent<TaskTrackerObservation>}\n />\n );\n } else {\n details =\n getCanvasUIClientObservationContent(event, correspondingAction) ??\n resolveVisualizerBody(event, correspondingAction) ??\n getObservationContent(event);\n }\n } else if (isACPToolCallEvent(event)) {\n // ACP sub-agent tool calls reuse the same card shape as observations:\n // title is \"Running/Editing/Reading …\" via a translation key that\n // mirrors ACTION_MESSAGE$RUN etc.; details are markdown built from\n // raw_input + raw_output the same way getTerminalObservationContent\n // builds \"Command: / Output:\" blocks.\n title = createTitleFromKey(getACPToolCallTitleKey(event), {\n // Strip a redundant verb prefix the ACP server may have inlined\n // (Claude Code emits ``\"Read /path\"`` for a read tool; combined\n // with the ``\"Reading <cmd>{{title}}</cmd>\"`` template that lands\n // as ``\"Reading Read /path\"``). See ``stripRedundantTitlePrefix``.\n title: stripRedundantTitlePrefix(event),\n });\n details = getACPToolCallContent(event);\n } else if (\n // Lenient fallback for action-like events that fail the strict isActionEvent() guard\n // (e.g., missing tool_name or tool_call_id). Extract a title from the action kind\n // so the UI shows something meaningful instead of \"Unknown event\".\n event.source === \"agent\" &&\n \"action\" in event &&\n event.action !== null &&\n typeof event.action === \"object\" &&\n \"kind\" in event.action &&\n typeof event.action.kind === \"string\"\n ) {\n title = String(event.action.kind).replace(\"Action\", \"\").toUpperCase();\n }\n\n return {\n title: title || i18n.t(I18nKey.EVENT$UNKNOWN_EVENT),\n details,\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"get-event-content.cjs","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-event-content.tsx"],"sourcesContent":["import { Trans } from \"react-i18next\";\nimport React from \"react\";\nimport { CANVAS_UI_CLIENT_TOOL_NAME } from \"#/constants/canvas-ui\";\nimport {\n OpenHandsEvent,\n ObservationEvent,\n ActionEvent,\n} from \"#/types/agent-server/core\";\nimport {\n isActionEvent,\n isObservationEvent,\n isACPToolCallEvent,\n isCanvasUIActionEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { MonoComponent } from \"../../../features/chat/mono-component\";\nimport { PathComponent } from \"../../../features/chat/path-component\";\nimport { getActionContent } from \"./get-action-content\";\nimport { getObservationContent } from \"./get-observation-content\";\nimport {\n getACPToolCallContent,\n getACPToolCallTitleKey,\n stripRedundantTitlePrefix,\n} from \"./get-acp-tool-call-content\";\nimport { TaskTrackingObservationContent } from \"../task-tracking/task-tracking-observation-content\";\nimport { TaskTrackerObservation } from \"#/types/agent-server/core/base/observation\";\nimport { SkillReadyEvent, isSkillReadyEvent } from \"./create-skill-ready-event\";\nimport { resolveVisualizerBody } from \"../../../features/chat/tool-visualizers/dispatcher\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n getActionEventTitleDescriptor,\n getActionSummaryTitle,\n trimEventTitleText,\n type EventTitleDescriptor,\n} from \"./get-action-event-title\";\n\n// Helper function to create title from translation key\nconst createTitleFromKey = (\n key: string,\n values: Readonly<Record<string, unknown>>,\n): React.ReactNode => {\n if (!i18n.exists(key)) {\n return key;\n }\n\n return (\n <Trans\n ns=\"openhands\"\n i18nKey={key}\n values={values}\n components={{\n path: <PathComponent />,\n cmd: <MonoComponent />,\n }}\n />\n );\n};\n\nconst renderTitleDescriptor = (\n descriptor: EventTitleDescriptor,\n): React.ReactNode =>\n descriptor.kind === \"text\"\n ? descriptor.text\n : createTitleFromKey(descriptor.key, descriptor.values);\n\nconst getNonEmptyString = (\n value: unknown,\n maxLength?: number,\n): string | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n return maxLength ? trimEventTitleText(trimmed, maxLength) : trimmed;\n};\n\nconst getVisionInspectActionTitle = (\n event: ActionEvent,\n): React.ReactNode | null => {\n if (event.tool_name !== \"inspect_image_with_vision\") {\n return null;\n }\n\n const action = event.action as unknown as Record<string, unknown>;\n const profileName = getNonEmptyString(action.profile_name);\n\n return profileName\n ? `Describing image with ${profileName}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\nconst getVisionInspectObservationTitle = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode | null => {\n const actionToolName = correspondingAction?.tool_name;\n const observation = event.observation as unknown as Record<string, unknown>;\n const observationToolName = getNonEmptyString(observation.tool_name);\n\n if (\n actionToolName !== \"inspect_image_with_vision\" &&\n observationToolName !== \"inspect_image_with_vision\" &&\n String(event.observation.kind) !== \"VisionInspectObservation\"\n ) {\n return null;\n }\n\n const action = (correspondingAction?.action ?? {}) as unknown as Record<\n string,\n unknown\n >;\n const label =\n getNonEmptyString(action.profile_name) ??\n getNonEmptyString(observation.profile_name) ??\n getNonEmptyString(observation.base_url, 80) ??\n getNonEmptyString(observation.endpoint, 80) ??\n getNonEmptyString(observation.model, 80);\n\n return label\n ? `Describing image with ${label}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\n// Action Event Processing\nconst getActionEventTitle = (event: OpenHandsEvent): React.ReactNode => {\n // Early return if not an action event\n if (!isActionEvent(event)) {\n return \"\";\n }\n\n const visionInspectTitle = getVisionInspectActionTitle(event);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n return renderTitleDescriptor(getActionEventTitleDescriptor(event));\n};\n\n// Observation Event Processing\nconst getObservationEventTitle = (\n event: OpenHandsEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode => {\n // Early return if not an observation event\n if (!isObservationEvent(event)) {\n return \"\";\n }\n\n const visionInspectObservationTitle = getVisionInspectObservationTitle(\n event,\n correspondingAction,\n );\n if (visionInspectObservationTitle) {\n return visionInspectObservationTitle;\n }\n\n if (correspondingAction) {\n const visionInspectTitle = getVisionInspectActionTitle(correspondingAction);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n const summaryTitle = getActionSummaryTitle(correspondingAction);\n if (summaryTitle) {\n return summaryTitle;\n }\n }\n\n const observationType = event.observation.kind;\n let observationKey = \"\";\n let observationValues: Record<string, unknown> = {};\n\n switch (observationType) {\n case \"ExecuteBashObservation\":\n case \"TerminalObservation\":\n observationKey = \"OBSERVATION_MESSAGE$RUN\";\n observationValues = {\n command: event.observation.command\n ? trimEventTitleText(event.observation.command, 80)\n : \"\",\n };\n break;\n case \"FileEditorObservation\":\n case \"StrReplaceEditorObservation\":\n if (event.observation.command === \"view\") {\n observationKey = \"OBSERVATION_MESSAGE$READ\";\n } else {\n observationKey = \"OBSERVATION_MESSAGE$EDIT\";\n }\n observationValues = {\n path: event.observation.path || \"\",\n };\n break;\n case \"MCPToolObservation\":\n observationKey = \"OBSERVATION_MESSAGE$MCP\";\n observationValues = {\n mcp_tool_name: event.observation.tool_name,\n };\n break;\n case \"InvokeSkillObservation\":\n observationKey = \"OBSERVATION_MESSAGE$INVOKE_SKILL\";\n observationValues = {\n name: event.observation.skill_name,\n };\n break;\n case \"TaskObservation\":\n observationKey = \"OBSERVATION_MESSAGE$TASK\";\n observationValues = {\n name: event.observation.subagent,\n };\n break;\n case \"CanvasUIObservation\":\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n case \"ClientToolObservation\":\n if (event.tool_name === CANVAS_UI_CLIENT_TOOL_NAME) {\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n }\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n case \"SwitchLLMObservation\":\n observationKey = event.observation.is_error\n ? \"MODEL$SWITCH_FAILED\"\n : \"MODEL$SWITCHED_TO_PROFILE\";\n observationValues = {\n name: event.observation.profile_name,\n };\n break;\n case \"BrowserObservation\":\n observationKey = \"OBSERVATION_MESSAGE$BROWSE\";\n break;\n case \"TaskTrackerObservation\": {\n const { command } = event.observation;\n if (command === \"plan\") {\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_PLAN\";\n } else {\n // command === \"view\"\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_VIEW\";\n }\n break;\n }\n case \"ThinkObservation\":\n observationKey = \"OBSERVATION_MESSAGE$THINK\";\n break;\n case \"GlobObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GLOB\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimEventTitleText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n case \"GrepObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GREP\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimEventTitleText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n default:\n // For unknown observations, use the type name\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n }\n\n if (observationKey) {\n return createTitleFromKey(observationKey, observationValues);\n }\n\n return observationType;\n};\n\nconst getCanvasUIClientObservationContent = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): string | null => {\n if (\n event.observation.kind !== \"ClientToolObservation\" ||\n event.tool_name !== CANVAS_UI_CLIENT_TOOL_NAME ||\n !correspondingAction ||\n !isCanvasUIActionEvent(correspondingAction)\n ) {\n return null;\n }\n\n return `UI command '${correspondingAction.action.command}' dispatched to the Agent Canvas frontend.`;\n};\n\nexport const getEventContent = (\n event: OpenHandsEvent | SkillReadyEvent,\n correspondingAction?: ActionEvent,\n) => {\n let title: React.ReactNode = \"\";\n let details: string | React.ReactNode = \"\";\n\n // Handle Skill Ready events first\n if (isSkillReadyEvent(event)) {\n // Use translation key if available, otherwise use \"SKILL READY\"\n const skillReadyKey = \"OBSERVATION_MESSAGE$SKILL_READY\";\n if (i18n.exists(skillReadyKey)) {\n title = createTitleFromKey(skillReadyKey, {});\n } else {\n title = \"Skill Ready\";\n }\n details = event._skillReadyContent;\n } else if (isActionEvent(event)) {\n title = getActionEventTitle(event);\n // Per-tool React visualizer when one is registered; markdown otherwise.\n details = resolveVisualizerBody(event) ?? getActionContent(event);\n } else if (isObservationEvent(event)) {\n title = getObservationEventTitle(event, correspondingAction);\n\n // For TaskTrackerObservation, use React component instead of markdown\n if (event.observation.kind === \"TaskTrackerObservation\") {\n details = (\n <TaskTrackingObservationContent\n event={event as ObservationEvent<TaskTrackerObservation>}\n />\n );\n } else {\n details =\n getCanvasUIClientObservationContent(event, correspondingAction) ??\n resolveVisualizerBody(event, correspondingAction) ??\n getObservationContent(event);\n }\n } else if (isACPToolCallEvent(event)) {\n // ACP sub-agent tool calls reuse the same card shape as observations:\n // title is \"Running/Editing/Reading …\" via a translation key that\n // mirrors ACTION_MESSAGE$RUN etc.; details are markdown built from\n // raw_input + raw_output the same way getTerminalObservationContent\n // builds \"Command: / Output:\" blocks.\n title = createTitleFromKey(getACPToolCallTitleKey(event), {\n // Strip a redundant verb prefix the ACP server may have inlined\n // (Claude Code emits ``\"Read /path\"`` for a read tool; combined\n // with the ``\"Reading <cmd>{{title}}</cmd>\"`` template that lands\n // as ``\"Reading Read /path\"``). See ``stripRedundantTitlePrefix``.\n title: stripRedundantTitlePrefix(event),\n });\n details = getACPToolCallContent(event);\n } else if (\n // Lenient fallback for action-like events that fail the strict isActionEvent() guard\n // (e.g., missing tool_name or tool_call_id). Extract a title from the action kind\n // so the UI shows something meaningful instead of \"Unknown event\".\n event.source === \"agent\" &&\n \"action\" in event &&\n event.action !== null &&\n typeof event.action === \"object\" &&\n \"kind\" in event.action &&\n typeof event.action.kind === \"string\"\n ) {\n title = String(event.action.kind).replace(\"Action\", \"\").toUpperCase();\n }\n\n return {\n title: title || i18n.t(I18nKey.EVENT$UNKNOWN_EVENT),\n details,\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,34 +1,32 @@
|
|
|
1
1
|
import { Trans as e } from "../../../../node_modules/react-i18next/dist/es/Trans.js";
|
|
2
2
|
import { I18nKey as t } from "../../../../i18n/declaration.js";
|
|
3
3
|
import n from "../../../../i18n/index.js";
|
|
4
|
-
import
|
|
5
|
-
import { isACPToolCallEvent as
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
4
|
+
import "../../../../constants/canvas-ui.js";
|
|
5
|
+
import { isACPToolCallEvent as r, isActionEvent as i, isCanvasUIActionEvent as a, isObservationEvent as o } from "../../../../types/agent-server/type-guards.js";
|
|
6
|
+
import { getACPToolCallContent as s, getACPToolCallTitleKey as c, stripRedundantTitlePrefix as l } from "./get-acp-tool-call-content.js";
|
|
7
|
+
import { getActionEventTitleDescriptor as u, getActionSummaryTitle as d, trimEventTitleText as f } from "./get-action-event-title.js";
|
|
8
|
+
import { MonoComponent as p } from "../../../features/chat/mono-component.js";
|
|
9
|
+
import { PathComponent as m } from "../../../features/chat/path-component.js";
|
|
10
|
+
import { getActionContent as h } from "./get-action-content.js";
|
|
11
|
+
import { getObservationContent as g } from "./get-observation-content.js";
|
|
12
|
+
import { TaskTrackingObservationContent as _ } from "../task-tracking/task-tracking-observation-content.js";
|
|
13
|
+
import { isSkillReadyEvent as v } from "./create-skill-ready-event.js";
|
|
14
|
+
import { resolveVisualizerBody as y } from "../../../features/chat/tool-visualizers/dispatcher.js";
|
|
14
15
|
import "react";
|
|
15
|
-
import { jsx as
|
|
16
|
+
import { jsx as b } from "react/jsx-runtime";
|
|
16
17
|
//#region src/components/conversation-events/chat/event-content-helpers/get-event-content.tsx
|
|
17
|
-
var
|
|
18
|
+
var x = (t, r) => n.exists(t) ? /* @__PURE__ */ b(e, {
|
|
18
19
|
ns: "openhands",
|
|
19
20
|
i18nKey: t,
|
|
20
21
|
values: r,
|
|
21
22
|
components: {
|
|
22
|
-
path: /* @__PURE__ */
|
|
23
|
-
cmd: /* @__PURE__ */
|
|
23
|
+
path: /* @__PURE__ */ b(m, {}),
|
|
24
|
+
cmd: /* @__PURE__ */ b(p, {})
|
|
24
25
|
}
|
|
25
|
-
}) : t,
|
|
26
|
-
let t = e.summary?.trim().replace(/\s+/g, " ") || "";
|
|
27
|
-
return !t || x(t) ? null : t;
|
|
28
|
-
}, C = (e, t) => {
|
|
26
|
+
}) : t, S = (e) => e.kind === "text" ? e.text : x(e.key, e.values), C = (e, t) => {
|
|
29
27
|
if (typeof e != "string") return null;
|
|
30
28
|
let n = e.trim();
|
|
31
|
-
return n ? t ?
|
|
29
|
+
return n ? t ? f(n, t) : n : null;
|
|
32
30
|
}, w = (e) => {
|
|
33
31
|
if (e.tool_name !== "inspect_image_with_vision") return null;
|
|
34
32
|
let t = e.action, n = C(t.profile_name);
|
|
@@ -38,78 +36,21 @@ var y = (e, t) => e ? e.length > t ? `${e.substring(0, t)}...` : e : "", b = (t,
|
|
|
38
36
|
if (n !== "inspect_image_with_vision" && i !== "inspect_image_with_vision" && String(e.observation.kind) !== "VisionInspectObservation") return null;
|
|
39
37
|
let a = C((t?.action ?? {}).profile_name) ?? C(r.profile_name) ?? C(r.base_url, 80) ?? C(r.endpoint, 80) ?? C(r.model, 80);
|
|
40
38
|
return a ? `Describing image with ${a}` : "Describing image with auxiliary vision LLM";
|
|
41
|
-
}, E = (e) => {
|
|
42
|
-
if (!
|
|
43
|
-
let t = w(e);
|
|
44
|
-
if (t) return t;
|
|
45
|
-
let n = S(e);
|
|
46
|
-
if (n) return n;
|
|
47
|
-
let i = e.action.kind, o = "", s = {};
|
|
48
|
-
switch (i) {
|
|
49
|
-
case "ExecuteBashAction":
|
|
50
|
-
case "TerminalAction":
|
|
51
|
-
o = "ACTION_MESSAGE$RUN", s = { command: y(e.action.command, 80) };
|
|
52
|
-
break;
|
|
53
|
-
case "FileEditorAction":
|
|
54
|
-
case "StrReplaceEditorAction":
|
|
55
|
-
o = e.action.command === "view" ? "ACTION_MESSAGE$READ" : e.action.command === "create" ? "ACTION_MESSAGE$WRITE" : "ACTION_MESSAGE$EDIT", s = { path: e.action.path };
|
|
56
|
-
break;
|
|
57
|
-
case "MCPToolAction":
|
|
58
|
-
o = "ACTION_MESSAGE$CALL_TOOL_MCP", s = { mcp_tool_name: e.tool_name };
|
|
59
|
-
break;
|
|
60
|
-
case "InvokeSkillAction":
|
|
61
|
-
o = "ACTION_MESSAGE$INVOKE_SKILL", s = { name: e.action.name };
|
|
62
|
-
break;
|
|
63
|
-
case "TaskAction":
|
|
64
|
-
o = "ACTION_MESSAGE$TASK", s = { name: e.action.subagent_type };
|
|
65
|
-
break;
|
|
66
|
-
case "ThinkAction":
|
|
67
|
-
o = "ACTION_MESSAGE$THINK";
|
|
68
|
-
break;
|
|
69
|
-
case "FinishAction":
|
|
70
|
-
o = "ACTION_MESSAGE$FINISH";
|
|
71
|
-
break;
|
|
72
|
-
case "TaskTrackerAction":
|
|
73
|
-
o = "ACTION_MESSAGE$TASK_TRACKING";
|
|
74
|
-
break;
|
|
75
|
-
case "GrepAction":
|
|
76
|
-
o = "ACTION_MESSAGE$GREP", s = { pattern: "pattern" in e.action && e.action.pattern ? y(String(e.action.pattern), 50) : "" };
|
|
77
|
-
break;
|
|
78
|
-
case "GlobAction":
|
|
79
|
-
o = "ACTION_MESSAGE$GLOB", s = { pattern: "pattern" in e.action && e.action.pattern ? y(String(e.action.pattern), 50) : "" };
|
|
80
|
-
break;
|
|
81
|
-
case "BrowserNavigateAction":
|
|
82
|
-
case "BrowserClickAction":
|
|
83
|
-
case "BrowserTypeAction":
|
|
84
|
-
case "BrowserGetStateAction":
|
|
85
|
-
case "BrowserGetContentAction":
|
|
86
|
-
case "BrowserScrollAction":
|
|
87
|
-
case "BrowserGoBackAction":
|
|
88
|
-
case "BrowserListTabsAction":
|
|
89
|
-
case "BrowserSwitchTabAction":
|
|
90
|
-
case "BrowserCloseTabAction":
|
|
91
|
-
o = "ACTION_MESSAGE$BROWSE";
|
|
92
|
-
break;
|
|
93
|
-
case "CanvasUIAction":
|
|
94
|
-
case r: return "CANVASUI";
|
|
95
|
-
default: return String(i).replace("Action", "").toUpperCase();
|
|
96
|
-
}
|
|
97
|
-
return o ? b(o, s) : i;
|
|
98
|
-
}, D = (e, t) => {
|
|
99
|
-
if (!s(e)) return "";
|
|
39
|
+
}, E = (e) => i(e) ? w(e) || S(u(e)) : "", D = (e, t) => {
|
|
40
|
+
if (!o(e)) return "";
|
|
100
41
|
let n = T(e, t);
|
|
101
42
|
if (n) return n;
|
|
102
43
|
if (t) {
|
|
103
44
|
let e = w(t);
|
|
104
45
|
if (e) return e;
|
|
105
|
-
let n =
|
|
46
|
+
let n = d(t);
|
|
106
47
|
if (n) return n;
|
|
107
48
|
}
|
|
108
49
|
let r = e.observation.kind, i = "", a = {};
|
|
109
50
|
switch (r) {
|
|
110
51
|
case "ExecuteBashObservation":
|
|
111
52
|
case "TerminalObservation":
|
|
112
|
-
i = "OBSERVATION_MESSAGE$RUN", a = { command: e.observation.command ?
|
|
53
|
+
i = "OBSERVATION_MESSAGE$RUN", a = { command: e.observation.command ? f(e.observation.command, 80) : "" };
|
|
113
54
|
break;
|
|
114
55
|
case "FileEditorObservation":
|
|
115
56
|
case "StrReplaceEditorObservation":
|
|
@@ -148,23 +89,23 @@ var y = (e, t) => e ? e.length > t ? `${e.substring(0, t)}...` : e : "", b = (t,
|
|
|
148
89
|
i = "OBSERVATION_MESSAGE$THINK";
|
|
149
90
|
break;
|
|
150
91
|
case "GlobObservation":
|
|
151
|
-
i = "OBSERVATION_MESSAGE$GLOB", a = { pattern: e.observation.pattern ?
|
|
92
|
+
i = "OBSERVATION_MESSAGE$GLOB", a = { pattern: e.observation.pattern ? f(e.observation.pattern, 50) : "" };
|
|
152
93
|
break;
|
|
153
94
|
case "GrepObservation":
|
|
154
|
-
i = "OBSERVATION_MESSAGE$GREP", a = { pattern: e.observation.pattern ?
|
|
95
|
+
i = "OBSERVATION_MESSAGE$GREP", a = { pattern: e.observation.pattern ? f(e.observation.pattern, 50) : "" };
|
|
155
96
|
break;
|
|
156
97
|
default: return r.replace("Observation", "").toUpperCase();
|
|
157
98
|
}
|
|
158
|
-
return i ?
|
|
159
|
-
}, O = (e, t) => e.observation.kind !== "ClientToolObservation" || e.tool_name !== "canvas_ui_control" || !t || !
|
|
160
|
-
let
|
|
161
|
-
if (
|
|
99
|
+
return i ? x(i, a) : r;
|
|
100
|
+
}, O = (e, t) => e.observation.kind !== "ClientToolObservation" || e.tool_name !== "canvas_ui_control" || !t || !a(t) ? null : `UI command '${t.action.command}' dispatched to the Agent Canvas frontend.`, k = (e, a) => {
|
|
101
|
+
let u = "", d = "";
|
|
102
|
+
if (v(e)) {
|
|
162
103
|
let t = "OBSERVATION_MESSAGE$SKILL_READY";
|
|
163
|
-
|
|
164
|
-
} else
|
|
104
|
+
u = n.exists(t) ? x(t, {}) : "Skill Ready", d = e._skillReadyContent;
|
|
105
|
+
} else i(e) ? (u = E(e), d = y(e) ?? h(e)) : o(e) ? (u = D(e, a), d = e.observation.kind === "TaskTrackerObservation" ? /* @__PURE__ */ b(_, { event: e }) : O(e, a) ?? y(e, a) ?? g(e)) : r(e) ? (u = x(c(e), { title: l(e) }), d = s(e)) : e.source === "agent" && "action" in e && e.action !== null && typeof e.action == "object" && "kind" in e.action && typeof e.action.kind == "string" && (u = String(e.action.kind).replace("Action", "").toUpperCase());
|
|
165
106
|
return {
|
|
166
|
-
title:
|
|
167
|
-
details:
|
|
107
|
+
title: u || n.t(t.EVENT$UNKNOWN_EVENT),
|
|
108
|
+
details: d
|
|
168
109
|
};
|
|
169
110
|
};
|
|
170
111
|
//#endregion
|
package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-event-content.js","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-event-content.tsx"],"sourcesContent":["import { Trans } from \"react-i18next\";\nimport React from \"react\";\nimport {\n CANVAS_UI_CLIENT_ACTION_KIND,\n CANVAS_UI_CLIENT_TOOL_NAME,\n} from \"#/constants/canvas-ui\";\nimport {\n OpenHandsEvent,\n ObservationEvent,\n ActionEvent,\n} from \"#/types/agent-server/core\";\nimport {\n isActionEvent,\n isObservationEvent,\n isACPToolCallEvent,\n isCanvasUIActionEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { MonoComponent } from \"../../../features/chat/mono-component\";\nimport { PathComponent } from \"../../../features/chat/path-component\";\nimport { getActionContent } from \"./get-action-content\";\nimport { getObservationContent } from \"./get-observation-content\";\nimport {\n getACPToolCallContent,\n getACPToolCallTitleKey,\n stripRedundantTitlePrefix,\n} from \"./get-acp-tool-call-content\";\nimport { TaskTrackingObservationContent } from \"../task-tracking/task-tracking-observation-content\";\nimport { TaskTrackerObservation } from \"#/types/agent-server/core/base/observation\";\nimport { SkillReadyEvent, isSkillReadyEvent } from \"./create-skill-ready-event\";\nimport { resolveVisualizerBody } from \"../../../features/chat/tool-visualizers/dispatcher\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\n\nconst trimText = (text: string, maxLength: number): string => {\n if (!text) return \"\";\n return text.length > maxLength ? `${text.substring(0, maxLength)}...` : text;\n};\n\n// Helper function to create title from translation key\nconst createTitleFromKey = (\n key: string,\n values: Record<string, unknown>,\n): React.ReactNode => {\n if (!i18n.exists(key)) {\n return key;\n }\n\n return (\n <Trans\n ns=\"openhands\"\n i18nKey={key}\n values={values}\n components={{\n path: <PathComponent />,\n cmd: <MonoComponent />,\n }}\n />\n );\n};\n\n/**\n * Detects the agent-server's default summary fallback, which has the shape\n * `{tool_name}: {json-args}` (see `_extract_summary` in\n * `openhands/sdk/agent/agent.py`). When the LLM omits a summary the server\n * dumps the raw arguments JSON, which renders as a huge unreadable blob in\n * the chat. Treat that case as \"no summary\" so the action-kind specific\n * title (e.g. \"Editing <path>\", \"Running <cmd>\") is used instead.\n */\nconst isServerFallbackSummary = (summary: string): boolean =>\n /^[a-z][a-z0-9_]*\\s*:\\s*[[{]/i.test(summary);\n\nconst getSummaryTitleForActionEvent = (\n event: ActionEvent,\n): React.ReactNode | null => {\n const summary = event.summary?.trim().replace(/\\s+/g, \" \") || \"\";\n if (!summary || isServerFallbackSummary(summary)) {\n return null;\n }\n return summary;\n};\n\nconst getNonEmptyString = (\n value: unknown,\n maxLength?: number,\n): string | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n return maxLength ? trimText(trimmed, maxLength) : trimmed;\n};\n\nconst getVisionInspectActionTitle = (\n event: ActionEvent,\n): React.ReactNode | null => {\n if (event.tool_name !== \"inspect_image_with_vision\") {\n return null;\n }\n\n const action = event.action as unknown as Record<string, unknown>;\n const profileName = getNonEmptyString(action.profile_name);\n\n return profileName\n ? `Describing image with ${profileName}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\nconst getVisionInspectObservationTitle = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode | null => {\n const actionToolName = correspondingAction?.tool_name;\n const observation = event.observation as unknown as Record<string, unknown>;\n const observationToolName = getNonEmptyString(observation.tool_name);\n\n if (\n actionToolName !== \"inspect_image_with_vision\" &&\n observationToolName !== \"inspect_image_with_vision\" &&\n String(event.observation.kind) !== \"VisionInspectObservation\"\n ) {\n return null;\n }\n\n const action = (correspondingAction?.action ?? {}) as unknown as Record<\n string,\n unknown\n >;\n const label =\n getNonEmptyString(action.profile_name) ??\n getNonEmptyString(observation.profile_name) ??\n getNonEmptyString(observation.base_url, 80) ??\n getNonEmptyString(observation.endpoint, 80) ??\n getNonEmptyString(observation.model, 80);\n\n return label\n ? `Describing image with ${label}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\n// Action Event Processing\nconst getActionEventTitle = (event: OpenHandsEvent): React.ReactNode => {\n // Early return if not an action event\n if (!isActionEvent(event)) {\n return \"\";\n }\n\n const visionInspectTitle = getVisionInspectActionTitle(event);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n const summaryTitle = getSummaryTitleForActionEvent(event);\n if (summaryTitle) {\n return summaryTitle;\n }\n\n const actionType = event.action.kind;\n let actionKey = \"\";\n let actionValues: Record<string, unknown> = {};\n\n switch (actionType) {\n case \"ExecuteBashAction\":\n case \"TerminalAction\":\n actionKey = \"ACTION_MESSAGE$RUN\";\n actionValues = {\n command: trimText(event.action.command, 80),\n };\n break;\n case \"FileEditorAction\":\n case \"StrReplaceEditorAction\":\n if (event.action.command === \"view\") {\n actionKey = \"ACTION_MESSAGE$READ\";\n } else if (event.action.command === \"create\") {\n actionKey = \"ACTION_MESSAGE$WRITE\";\n } else {\n actionKey = \"ACTION_MESSAGE$EDIT\";\n }\n actionValues = {\n path: event.action.path,\n };\n break;\n case \"MCPToolAction\":\n actionKey = \"ACTION_MESSAGE$CALL_TOOL_MCP\";\n actionValues = {\n mcp_tool_name: event.tool_name,\n };\n break;\n case \"InvokeSkillAction\":\n actionKey = \"ACTION_MESSAGE$INVOKE_SKILL\";\n actionValues = {\n name: event.action.name,\n };\n break;\n case \"TaskAction\":\n actionKey = \"ACTION_MESSAGE$TASK\";\n actionValues = {\n name: event.action.subagent_type,\n };\n break;\n case \"ThinkAction\":\n actionKey = \"ACTION_MESSAGE$THINK\";\n break;\n case \"FinishAction\":\n actionKey = \"ACTION_MESSAGE$FINISH\";\n break;\n case \"TaskTrackerAction\":\n actionKey = \"ACTION_MESSAGE$TASK_TRACKING\";\n break;\n case \"GrepAction\":\n actionKey = \"ACTION_MESSAGE$GREP\";\n actionValues = {\n pattern:\n \"pattern\" in event.action && event.action.pattern\n ? trimText(String(event.action.pattern), 50)\n : \"\",\n };\n break;\n case \"GlobAction\":\n actionKey = \"ACTION_MESSAGE$GLOB\";\n actionValues = {\n pattern:\n \"pattern\" in event.action && event.action.pattern\n ? trimText(String(event.action.pattern), 50)\n : \"\",\n };\n break;\n case \"BrowserNavigateAction\":\n case \"BrowserClickAction\":\n case \"BrowserTypeAction\":\n case \"BrowserGetStateAction\":\n case \"BrowserGetContentAction\":\n case \"BrowserScrollAction\":\n case \"BrowserGoBackAction\":\n case \"BrowserListTabsAction\":\n case \"BrowserSwitchTabAction\":\n case \"BrowserCloseTabAction\":\n actionKey = \"ACTION_MESSAGE$BROWSE\";\n break;\n case \"CanvasUIAction\":\n case CANVAS_UI_CLIENT_ACTION_KIND:\n return \"CANVASUI\";\n default:\n // For unknown actions, use the type name\n return String(actionType).replace(\"Action\", \"\").toUpperCase();\n }\n\n if (actionKey) {\n return createTitleFromKey(actionKey, actionValues);\n }\n\n return actionType;\n};\n\n// Observation Event Processing\nconst getObservationEventTitle = (\n event: OpenHandsEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode => {\n // Early return if not an observation event\n if (!isObservationEvent(event)) {\n return \"\";\n }\n\n const visionInspectObservationTitle = getVisionInspectObservationTitle(\n event,\n correspondingAction,\n );\n if (visionInspectObservationTitle) {\n return visionInspectObservationTitle;\n }\n\n if (correspondingAction) {\n const visionInspectTitle = getVisionInspectActionTitle(correspondingAction);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n const summaryTitle = getSummaryTitleForActionEvent(correspondingAction);\n if (summaryTitle) {\n return summaryTitle;\n }\n }\n\n const observationType = event.observation.kind;\n let observationKey = \"\";\n let observationValues: Record<string, unknown> = {};\n\n switch (observationType) {\n case \"ExecuteBashObservation\":\n case \"TerminalObservation\":\n observationKey = \"OBSERVATION_MESSAGE$RUN\";\n observationValues = {\n command: event.observation.command\n ? trimText(event.observation.command, 80)\n : \"\",\n };\n break;\n case \"FileEditorObservation\":\n case \"StrReplaceEditorObservation\":\n if (event.observation.command === \"view\") {\n observationKey = \"OBSERVATION_MESSAGE$READ\";\n } else {\n observationKey = \"OBSERVATION_MESSAGE$EDIT\";\n }\n observationValues = {\n path: event.observation.path || \"\",\n };\n break;\n case \"MCPToolObservation\":\n observationKey = \"OBSERVATION_MESSAGE$MCP\";\n observationValues = {\n mcp_tool_name: event.observation.tool_name,\n };\n break;\n case \"InvokeSkillObservation\":\n observationKey = \"OBSERVATION_MESSAGE$INVOKE_SKILL\";\n observationValues = {\n name: event.observation.skill_name,\n };\n break;\n case \"TaskObservation\":\n observationKey = \"OBSERVATION_MESSAGE$TASK\";\n observationValues = {\n name: event.observation.subagent,\n };\n break;\n case \"CanvasUIObservation\":\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n case \"ClientToolObservation\":\n if (event.tool_name === CANVAS_UI_CLIENT_TOOL_NAME) {\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n }\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n case \"SwitchLLMObservation\":\n observationKey = event.observation.is_error\n ? \"MODEL$SWITCH_FAILED\"\n : \"MODEL$SWITCHED_TO_PROFILE\";\n observationValues = {\n name: event.observation.profile_name,\n };\n break;\n case \"BrowserObservation\":\n observationKey = \"OBSERVATION_MESSAGE$BROWSE\";\n break;\n case \"TaskTrackerObservation\": {\n const { command } = event.observation;\n if (command === \"plan\") {\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_PLAN\";\n } else {\n // command === \"view\"\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_VIEW\";\n }\n break;\n }\n case \"ThinkObservation\":\n observationKey = \"OBSERVATION_MESSAGE$THINK\";\n break;\n case \"GlobObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GLOB\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n case \"GrepObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GREP\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n default:\n // For unknown observations, use the type name\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n }\n\n if (observationKey) {\n return createTitleFromKey(observationKey, observationValues);\n }\n\n return observationType;\n};\n\nconst getCanvasUIClientObservationContent = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): string | null => {\n if (\n event.observation.kind !== \"ClientToolObservation\" ||\n event.tool_name !== CANVAS_UI_CLIENT_TOOL_NAME ||\n !correspondingAction ||\n !isCanvasUIActionEvent(correspondingAction)\n ) {\n return null;\n }\n\n return `UI command '${correspondingAction.action.command}' dispatched to the Agent Canvas frontend.`;\n};\n\nexport const getEventContent = (\n event: OpenHandsEvent | SkillReadyEvent,\n correspondingAction?: ActionEvent,\n) => {\n let title: React.ReactNode = \"\";\n let details: string | React.ReactNode = \"\";\n\n // Handle Skill Ready events first\n if (isSkillReadyEvent(event)) {\n // Use translation key if available, otherwise use \"SKILL READY\"\n const skillReadyKey = \"OBSERVATION_MESSAGE$SKILL_READY\";\n if (i18n.exists(skillReadyKey)) {\n title = createTitleFromKey(skillReadyKey, {});\n } else {\n title = \"Skill Ready\";\n }\n details = event._skillReadyContent;\n } else if (isActionEvent(event)) {\n title = getActionEventTitle(event);\n // Per-tool React visualizer when one is registered; markdown otherwise.\n details = resolveVisualizerBody(event) ?? getActionContent(event);\n } else if (isObservationEvent(event)) {\n title = getObservationEventTitle(event, correspondingAction);\n\n // For TaskTrackerObservation, use React component instead of markdown\n if (event.observation.kind === \"TaskTrackerObservation\") {\n details = (\n <TaskTrackingObservationContent\n event={event as ObservationEvent<TaskTrackerObservation>}\n />\n );\n } else {\n details =\n getCanvasUIClientObservationContent(event, correspondingAction) ??\n resolveVisualizerBody(event, correspondingAction) ??\n getObservationContent(event);\n }\n } else if (isACPToolCallEvent(event)) {\n // ACP sub-agent tool calls reuse the same card shape as observations:\n // title is \"Running/Editing/Reading …\" via a translation key that\n // mirrors ACTION_MESSAGE$RUN etc.; details are markdown built from\n // raw_input + raw_output the same way getTerminalObservationContent\n // builds \"Command: / Output:\" blocks.\n title = createTitleFromKey(getACPToolCallTitleKey(event), {\n // Strip a redundant verb prefix the ACP server may have inlined\n // (Claude Code emits ``\"Read /path\"`` for a read tool; combined\n // with the ``\"Reading <cmd>{{title}}</cmd>\"`` template that lands\n // as ``\"Reading Read /path\"``). See ``stripRedundantTitlePrefix``.\n title: stripRedundantTitlePrefix(event),\n });\n details = getACPToolCallContent(event);\n } else if (\n // Lenient fallback for action-like events that fail the strict isActionEvent() guard\n // (e.g., missing tool_name or tool_call_id). Extract a title from the action kind\n // so the UI shows something meaningful instead of \"Unknown event\".\n event.source === \"agent\" &&\n \"action\" in event &&\n event.action !== null &&\n typeof event.action === \"object\" &&\n \"kind\" in event.action &&\n typeof event.action.kind === \"string\"\n ) {\n title = String(event.action.kind).replace(\"Action\", \"\").toUpperCase();\n }\n\n return {\n title: title || i18n.t(I18nKey.EVENT$UNKNOWN_EVENT),\n details,\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"get-event-content.js","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-event-content.tsx"],"sourcesContent":["import { Trans } from \"react-i18next\";\nimport React from \"react\";\nimport { CANVAS_UI_CLIENT_TOOL_NAME } from \"#/constants/canvas-ui\";\nimport {\n OpenHandsEvent,\n ObservationEvent,\n ActionEvent,\n} from \"#/types/agent-server/core\";\nimport {\n isActionEvent,\n isObservationEvent,\n isACPToolCallEvent,\n isCanvasUIActionEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { MonoComponent } from \"../../../features/chat/mono-component\";\nimport { PathComponent } from \"../../../features/chat/path-component\";\nimport { getActionContent } from \"./get-action-content\";\nimport { getObservationContent } from \"./get-observation-content\";\nimport {\n getACPToolCallContent,\n getACPToolCallTitleKey,\n stripRedundantTitlePrefix,\n} from \"./get-acp-tool-call-content\";\nimport { TaskTrackingObservationContent } from \"../task-tracking/task-tracking-observation-content\";\nimport { TaskTrackerObservation } from \"#/types/agent-server/core/base/observation\";\nimport { SkillReadyEvent, isSkillReadyEvent } from \"./create-skill-ready-event\";\nimport { resolveVisualizerBody } from \"../../../features/chat/tool-visualizers/dispatcher\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n getActionEventTitleDescriptor,\n getActionSummaryTitle,\n trimEventTitleText,\n type EventTitleDescriptor,\n} from \"./get-action-event-title\";\n\n// Helper function to create title from translation key\nconst createTitleFromKey = (\n key: string,\n values: Readonly<Record<string, unknown>>,\n): React.ReactNode => {\n if (!i18n.exists(key)) {\n return key;\n }\n\n return (\n <Trans\n ns=\"openhands\"\n i18nKey={key}\n values={values}\n components={{\n path: <PathComponent />,\n cmd: <MonoComponent />,\n }}\n />\n );\n};\n\nconst renderTitleDescriptor = (\n descriptor: EventTitleDescriptor,\n): React.ReactNode =>\n descriptor.kind === \"text\"\n ? descriptor.text\n : createTitleFromKey(descriptor.key, descriptor.values);\n\nconst getNonEmptyString = (\n value: unknown,\n maxLength?: number,\n): string | null => {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n return maxLength ? trimEventTitleText(trimmed, maxLength) : trimmed;\n};\n\nconst getVisionInspectActionTitle = (\n event: ActionEvent,\n): React.ReactNode | null => {\n if (event.tool_name !== \"inspect_image_with_vision\") {\n return null;\n }\n\n const action = event.action as unknown as Record<string, unknown>;\n const profileName = getNonEmptyString(action.profile_name);\n\n return profileName\n ? `Describing image with ${profileName}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\nconst getVisionInspectObservationTitle = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode | null => {\n const actionToolName = correspondingAction?.tool_name;\n const observation = event.observation as unknown as Record<string, unknown>;\n const observationToolName = getNonEmptyString(observation.tool_name);\n\n if (\n actionToolName !== \"inspect_image_with_vision\" &&\n observationToolName !== \"inspect_image_with_vision\" &&\n String(event.observation.kind) !== \"VisionInspectObservation\"\n ) {\n return null;\n }\n\n const action = (correspondingAction?.action ?? {}) as unknown as Record<\n string,\n unknown\n >;\n const label =\n getNonEmptyString(action.profile_name) ??\n getNonEmptyString(observation.profile_name) ??\n getNonEmptyString(observation.base_url, 80) ??\n getNonEmptyString(observation.endpoint, 80) ??\n getNonEmptyString(observation.model, 80);\n\n return label\n ? `Describing image with ${label}`\n : \"Describing image with auxiliary vision LLM\";\n};\n\n// Action Event Processing\nconst getActionEventTitle = (event: OpenHandsEvent): React.ReactNode => {\n // Early return if not an action event\n if (!isActionEvent(event)) {\n return \"\";\n }\n\n const visionInspectTitle = getVisionInspectActionTitle(event);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n return renderTitleDescriptor(getActionEventTitleDescriptor(event));\n};\n\n// Observation Event Processing\nconst getObservationEventTitle = (\n event: OpenHandsEvent,\n correspondingAction?: ActionEvent,\n): React.ReactNode => {\n // Early return if not an observation event\n if (!isObservationEvent(event)) {\n return \"\";\n }\n\n const visionInspectObservationTitle = getVisionInspectObservationTitle(\n event,\n correspondingAction,\n );\n if (visionInspectObservationTitle) {\n return visionInspectObservationTitle;\n }\n\n if (correspondingAction) {\n const visionInspectTitle = getVisionInspectActionTitle(correspondingAction);\n if (visionInspectTitle) {\n return visionInspectTitle;\n }\n\n const summaryTitle = getActionSummaryTitle(correspondingAction);\n if (summaryTitle) {\n return summaryTitle;\n }\n }\n\n const observationType = event.observation.kind;\n let observationKey = \"\";\n let observationValues: Record<string, unknown> = {};\n\n switch (observationType) {\n case \"ExecuteBashObservation\":\n case \"TerminalObservation\":\n observationKey = \"OBSERVATION_MESSAGE$RUN\";\n observationValues = {\n command: event.observation.command\n ? trimEventTitleText(event.observation.command, 80)\n : \"\",\n };\n break;\n case \"FileEditorObservation\":\n case \"StrReplaceEditorObservation\":\n if (event.observation.command === \"view\") {\n observationKey = \"OBSERVATION_MESSAGE$READ\";\n } else {\n observationKey = \"OBSERVATION_MESSAGE$EDIT\";\n }\n observationValues = {\n path: event.observation.path || \"\",\n };\n break;\n case \"MCPToolObservation\":\n observationKey = \"OBSERVATION_MESSAGE$MCP\";\n observationValues = {\n mcp_tool_name: event.observation.tool_name,\n };\n break;\n case \"InvokeSkillObservation\":\n observationKey = \"OBSERVATION_MESSAGE$INVOKE_SKILL\";\n observationValues = {\n name: event.observation.skill_name,\n };\n break;\n case \"TaskObservation\":\n observationKey = \"OBSERVATION_MESSAGE$TASK\";\n observationValues = {\n name: event.observation.subagent,\n };\n break;\n case \"CanvasUIObservation\":\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n case \"ClientToolObservation\":\n if (event.tool_name === CANVAS_UI_CLIENT_TOOL_NAME) {\n observationKey = \"OBSERVATION_MESSAGE$CANVAS_UI\";\n break;\n }\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n case \"SwitchLLMObservation\":\n observationKey = event.observation.is_error\n ? \"MODEL$SWITCH_FAILED\"\n : \"MODEL$SWITCHED_TO_PROFILE\";\n observationValues = {\n name: event.observation.profile_name,\n };\n break;\n case \"BrowserObservation\":\n observationKey = \"OBSERVATION_MESSAGE$BROWSE\";\n break;\n case \"TaskTrackerObservation\": {\n const { command } = event.observation;\n if (command === \"plan\") {\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_PLAN\";\n } else {\n // command === \"view\"\n observationKey = \"OBSERVATION_MESSAGE$TASK_TRACKING_VIEW\";\n }\n break;\n }\n case \"ThinkObservation\":\n observationKey = \"OBSERVATION_MESSAGE$THINK\";\n break;\n case \"GlobObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GLOB\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimEventTitleText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n case \"GrepObservation\":\n observationKey = \"OBSERVATION_MESSAGE$GREP\";\n observationValues = {\n pattern: event.observation.pattern\n ? trimEventTitleText(event.observation.pattern, 50)\n : \"\",\n };\n break;\n default:\n // For unknown observations, use the type name\n return observationType.replace(\"Observation\", \"\").toUpperCase();\n }\n\n if (observationKey) {\n return createTitleFromKey(observationKey, observationValues);\n }\n\n return observationType;\n};\n\nconst getCanvasUIClientObservationContent = (\n event: ObservationEvent,\n correspondingAction?: ActionEvent,\n): string | null => {\n if (\n event.observation.kind !== \"ClientToolObservation\" ||\n event.tool_name !== CANVAS_UI_CLIENT_TOOL_NAME ||\n !correspondingAction ||\n !isCanvasUIActionEvent(correspondingAction)\n ) {\n return null;\n }\n\n return `UI command '${correspondingAction.action.command}' dispatched to the Agent Canvas frontend.`;\n};\n\nexport const getEventContent = (\n event: OpenHandsEvent | SkillReadyEvent,\n correspondingAction?: ActionEvent,\n) => {\n let title: React.ReactNode = \"\";\n let details: string | React.ReactNode = \"\";\n\n // Handle Skill Ready events first\n if (isSkillReadyEvent(event)) {\n // Use translation key if available, otherwise use \"SKILL READY\"\n const skillReadyKey = \"OBSERVATION_MESSAGE$SKILL_READY\";\n if (i18n.exists(skillReadyKey)) {\n title = createTitleFromKey(skillReadyKey, {});\n } else {\n title = \"Skill Ready\";\n }\n details = event._skillReadyContent;\n } else if (isActionEvent(event)) {\n title = getActionEventTitle(event);\n // Per-tool React visualizer when one is registered; markdown otherwise.\n details = resolveVisualizerBody(event) ?? getActionContent(event);\n } else if (isObservationEvent(event)) {\n title = getObservationEventTitle(event, correspondingAction);\n\n // For TaskTrackerObservation, use React component instead of markdown\n if (event.observation.kind === \"TaskTrackerObservation\") {\n details = (\n <TaskTrackingObservationContent\n event={event as ObservationEvent<TaskTrackerObservation>}\n />\n );\n } else {\n details =\n getCanvasUIClientObservationContent(event, correspondingAction) ??\n resolveVisualizerBody(event, correspondingAction) ??\n getObservationContent(event);\n }\n } else if (isACPToolCallEvent(event)) {\n // ACP sub-agent tool calls reuse the same card shape as observations:\n // title is \"Running/Editing/Reading …\" via a translation key that\n // mirrors ACTION_MESSAGE$RUN etc.; details are markdown built from\n // raw_input + raw_output the same way getTerminalObservationContent\n // builds \"Command: / Output:\" blocks.\n title = createTitleFromKey(getACPToolCallTitleKey(event), {\n // Strip a redundant verb prefix the ACP server may have inlined\n // (Claude Code emits ``\"Read /path\"`` for a read tool; combined\n // with the ``\"Reading <cmd>{{title}}</cmd>\"`` template that lands\n // as ``\"Reading Read /path\"``). See ``stripRedundantTitlePrefix``.\n title: stripRedundantTitlePrefix(event),\n });\n details = getACPToolCallContent(event);\n } else if (\n // Lenient fallback for action-like events that fail the strict isActionEvent() guard\n // (e.g., missing tool_name or tool_call_id). Extract a title from the action kind\n // so the UI shows something meaningful instead of \"Unknown event\".\n event.source === \"agent\" &&\n \"action\" in event &&\n event.action !== null &&\n typeof event.action === \"object\" &&\n \"kind\" in event.action &&\n typeof event.action.kind === \"string\"\n ) {\n title = String(event.action.kind).replace(\"Action\", \"\").toUpperCase();\n }\n\n return {\n title: title || i18n.t(I18nKey.EVENT$UNKNOWN_EVENT),\n details,\n };\n};\n"],"mappings":"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"}
|
|
@@ -4,12 +4,5 @@ interface RecommendedAutomationsLauncherProps {
|
|
|
4
4
|
/** When true, only the automation card grid scrolls inside its section. */
|
|
5
5
|
scrollableGrid?: boolean;
|
|
6
6
|
}
|
|
7
|
-
/**
|
|
8
|
-
* The catalog prompt (or slash command) is passed through as-is.
|
|
9
|
-
* API routing (host, auth) is discovered by the agent at runtime from
|
|
10
|
-
* `<RUNTIME_SERVICES>` in the system prompt — the skills themselves
|
|
11
|
-
* contain the instructions for reading that block.
|
|
12
|
-
*/
|
|
13
|
-
export declare function buildAutomationPrompt(basePrompt: string): string;
|
|
14
7
|
export declare function RecommendedAutomationsLauncher({ query, onLaunched, scrollableGrid, }: RecommendedAutomationsLauncherProps): import("react/jsx-runtime").JSX.Element | null;
|
|
15
8
|
export {};
|
|
@@ -9,11 +9,5 @@ interface RecommendedAutomationsSectionProps {
|
|
|
9
9
|
scrollableGrid?: boolean;
|
|
10
10
|
}
|
|
11
11
|
export declare function getAutomationsByPopularity(catalog: RecommendedAutomation[]): RecommendedAutomation[];
|
|
12
|
-
/**
|
|
13
|
-
* Launch allowlist — proven automations featured above the Beta group.
|
|
14
|
-
* NOT derived from popularityRank (slack-standup-digest@94 outranks
|
|
15
|
-
* slack-channel-monitor@92 yet is Beta). A future flag could swap this set.
|
|
16
|
-
*/
|
|
17
|
-
export declare const PROVEN_AUTOMATION_IDS: readonly ["github-pr-reviewer", "github-repo-monitor", "slack-channel-monitor"];
|
|
18
12
|
export declare function RecommendedAutomationsSection({ backendKind: _backendKind, installedServers, query, onSelect, scrollableGrid, }: RecommendedAutomationsSectionProps): import("react/jsx-runtime").JSX.Element | null;
|
|
19
13
|
export {};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),n=require("../../../i18n/declaration.cjs"),r=require("../../../utils/utils.cjs"),i=require("../../../context/navigation-context.cjs"),a=require("../../../node_modules/@openhands/typescript-client/dist/client/server-client.cjs"),o=require("../../../node_modules/@openhands/typescript-client/dist/client/device-flow-client.cjs");require("../../../node_modules/@openhands/typescript-client/dist/clients.cjs");const s=require("../../../api/agent-server-config.cjs"),c=require("../../../utils/user-facing-error.cjs"),l=require("../../../api/agent-server-client-options.cjs"),u=require("../../../api/agent-server-compatibility.cjs"),d=require("../../../node_modules/@tanstack/react-query/build/modern/useQuery.cjs"),f=require("../../../contexts/active-backend-context.cjs"),p=require("../../../hooks/use-tracking.cjs"),m=require("../../shared/modals/modal-backdrop.cjs"),h=require("../../shared/modals/modal-body.cjs"),g=require("../../../utils/modal-classes.cjs"),_=require("../../shared/modals/modal-close-button.cjs"),v=require("../settings/brand-button.cjs"),y=require("../settings/settings-input.cjs"),b=require("../../../hooks/query/use-backends-health.cjs"),x=require("../../../assets/branding/openhands-logo-white.cjs"),S=require("../files-tab/segmented-toggle.cjs");require("../../../api/device-flow-client.cjs");const C=require("../../../icons/chevron-down-small.cjs"),w=require("./backend-status-label.cjs"),T=require("./backend-status-dot.cjs"),E=require("./device-flow-auth.cjs");let D=require("react");D=e.__toESM(D,1);let O=require("react/jsx-runtime");function k(e){return o.isOpenHandsCloudHost(e)?`cloud`:`local`}function A(e){let t=e.toLowerCase().replace(/^\[|\]$/g,``);return!!(t===`localhost`||t===`::1`||t===`::`||t===`0.0.0.0`||/^127\./.test(t)||/^::ffff:127\./i.test(t)||/^10\./.test(t)||/^192\.168\./.test(t)||/^172\.(1[6-9]|2\d|3[01])\./.test(t)||/^fe[89ab][0-9a-f]:/i.test(t)||/^f[cd][0-9a-f]{2}:/i.test(t)||t.endsWith(`.local`)||!t.includes(`.`)&&!t.includes(`:`))}function j(e){let t=e.trim().replace(/\/+$/,``);if(!t)return``;if(/^https?:\/\//i.test(t))return t;let n=t.match(/^\[([^\]]+)\]/);return`${A(n?n[1]:(t.match(/:/g)??[]).length>1?t:t.split(`:`)[0])?`http`:`https`}://${t}`}function M(e){let t=e.trim();if(!t||/\s/.test(t))return!1;let n=j(t);if(!n)return!1;try{let e=new URL(n);return(e.protocol===`http:`||e.protocol===`https:`)&&e.hostname.length>0}catch{return!1}}var N=`https://app.all-hands.dev`;function P(e,t){return e(n.I18nKey.BACKEND$CONNECTION_TEST_FAILED,{host:t,interpolation:{escapeValue:!1}})}function F(e){return c.getUserFacingConnectionErrorMessage(e)}function I(e,t){let n=F(t);return n?`${e}\n${n}`:e}async function L(e){if(e.kind!==`local`)return{agentServerVersion:null};let t=await new a.ServerClient(l.getAgentServerClientOptions({host:e.host,sessionApiKey:e.apiKey||null,timeout:5e3})).getServerInfo();return u.assertAgentServerVersionIsSupported(t),{agentServerVersion:u.getDisplayAgentServerVersion(t)}}function R({backend:e,testIdRoot:r}){let{t:i}=t.useTranslation(`openhands`),o=b.useBackendsHealth([e])[e.id],s=o?.isConnected??null,c=o?.disabled===!0,f=o?.consecutiveFailures??0,p=o?.lastError??null,{data:m}=d.useQuery({queryKey:[`backend-version`,e.host,e.apiKey],queryFn:async()=>u.getDisplayAgentServerVersion(await new a.ServerClient(l.getAgentServerClientOptions({host:e.host,sessionApiKey:e.apiKey||null,timeout:5e3})).getServerInfo()),retry:!1,staleTime:6e4,enabled:e.kind===`local`&&!c}),h=w.getBackendStatusLabel(i,e,o),g=e.kind===`cloud`?i(n.I18nKey.BACKEND$KIND_CLOUD):i(n.I18nKey.BACKEND$KIND_LOCAL);return(0,O.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,O.jsxs)(`div`,{"data-testid":`${r}-status`,className:`flex items-center gap-3 text-sm`,children:[(0,O.jsx)(T.BackendStatusDot,{isConnected:s}),(0,O.jsx)(`span`,{className:`text-white`,"data-testid":`${r}-status-label`,children:h}),(0,O.jsx)(`span`,{className:`text-tertiary-alt`,children:`·`}),(0,O.jsx)(`span`,{className:`text-[var(--oh-text-tertiary)]`,children:g}),m?(0,O.jsx)(`span`,{className:`text-xs text-[var(--oh-muted)]`,"data-testid":`${r}-version`,children:i(n.I18nKey.BACKEND$VERSION_LABEL,{version:m})}):null]}),c?(0,O.jsxs)(`div`,{"data-testid":`${r}-status-error`,className:`flex flex-col gap-1 rounded-md border border-red-500/40 bg-red-500/10 p-3 text-sm`,children:[(0,O.jsx)(`span`,{className:`font-semibold text-red-300`,children:i(n.I18nKey.BACKEND$HEALTH_FAILED_TITLE)}),(0,O.jsx)(`span`,{className:`text-xs text-[var(--oh-text-tertiary)]`,children:i(n.I18nKey.BACKEND$HEALTH_FAILED_DETAIL,{count:f})}),p?(0,O.jsx)(`span`,{"data-testid":`${r}-status-error-message`,className:`text-xs text-red-300 whitespace-pre-wrap break-words`,children:p}):null]}):null]})}function z({initialName:e=``,initialHost:n=``,initialApiKey:r=``,onTestConnection:i,onSuccess:a,requireApiKey:o=!1,onSubmitOverride:s}){let{t:c}=t.useTranslation(`openhands`),[l,u]=D.default.useState(e),[d,f]=D.default.useState(n),[p,m]=D.default.useState(r),[h,g]=D.default.useState(null),[_,v]=D.default.useState(!1),[y,b]=D.default.useState(null),x=y??k(d),S=o||x!==`local`,C=l.trim().length>0&&M(d)&&(!S||p.trim().length>0);return{name:l,setName:u,host:d,setHost:f,apiKey:p,setApiKey:m,connectionError:h,setConnectionError:g,isSubmitting:_,kind:x,setKind:b,canSubmit:C,handleSubmit:D.default.useCallback(async e=>{if(e.preventDefault(),!C||_)return;let t={name:l.trim(),host:j(d),apiKey:p.trim(),kind:x};g(null),v(!0);try{s?await s(t):a(await i(t))}catch(e){g(I(P(c,t.host),e))}finally{v(!1)}},[C,_,l,d,p,x,i,a,o,s,c])}}function B({mode:e,backend:i,onSubmitted:a,renderActions:o,testIdRoot:s,hostReadOnly:c,requireApiKey:l,hideConfigurationFields:u=!1,onSubmitOverride:d}){let{t:p}=t.useTranslation(`openhands`),{addBackend:m,updateBackend:h}=f.useActiveBackendContext(),g=e===`edit`&&i?i.kind:null,{name:_,setName:b,host:x,setHost:S,apiKey:C,setApiKey:w,connectionError:T,setConnectionError:E,isSubmitting:k,kind:A,handleSubmit:P}=z({initialName:i?.name??``,initialHost:i?.host??``,initialApiKey:i?.apiKey??``,onTestConnection:L,onSuccess:async()=>{let t={name:_.trim(),host:j(x),apiKey:C.trim(),kind:g??A};e===`edit`&&i?h(i.id,t):m(t),a()},requireApiKey:l,onSubmitOverride:d}),[F,I]=D.default.useState(!1),[B,V]=D.default.useState(!1),H=g??A,U=s??(e===`edit`?`edit-backend`:`add-backend`),W=l||H!==`local`,G=_.trim().length>0&&M(x)&&(!W||C.trim().length>0),K=F&&!_.trim()?p(n.I18nKey.BACKEND$NAME_REQUIRED):void 0,q=B?x.trim()?M(x)?void 0:p(n.I18nKey.BACKEND$HOST_INVALID):p(n.I18nKey.BACKEND$HOST_REQUIRED):void 0;return(0,O.jsxs)(`form`,{"data-testid":`${U}-form`,onSubmit:async e=>{if(!G){I(!0),V(!0);return}await P(e)},className:`flex flex-col gap-4`,children:[(0,O.jsxs)(`div`,{"data-testid":`${U}-configuration-fields`,className:r.cn(`flex flex-col gap-4`,u&&`hidden`),children:[(0,O.jsx)(y.SettingsInput,{testId:`${U}-name`,name:`${U}-name`,type:`text`,label:p(n.I18nKey.BACKEND$NAME_LABEL),value:_,onChange:e=>{b(e),E(null)},onBlur:()=>I(!0),placeholder:`Production`,className:`w-full`,showRequiredTag:!0,error:K}),(0,O.jsx)(y.SettingsInput,{testId:`${U}-host`,name:`${U}-host`,type:`text`,label:p(n.I18nKey.BACKEND$HOST_LABEL),value:x,onChange:c?void 0:e=>{S(e),E(null)},onBlur:()=>V(!0),placeholder:N,className:`w-full`,showRequiredTag:!0,error:q,isDisabled:c}),(0,O.jsx)(y.SettingsInput,{testId:`${U}-api-key`,name:`${U}-api-key`,type:`password`,label:p(n.I18nKey.BACKEND$KEY_LABEL),value:C,onChange:e=>{w(e),E(null)},placeholder:``,className:`w-full`}),T?(0,O.jsx)(`div`,{role:`alert`,"data-testid":`${U}-error`,className:`rounded-md border border-red-500/40 bg-red-500/10 p-3 text-sm text-red-300 whitespace-pre-wrap break-words`,children:T}):null,e===`edit`&&i&&(0,O.jsx)(R,{backend:i,testIdRoot:U})]}),o?o({canSubmit:G&&!k,isSubmitting:k,testIdRoot:U}):(0,O.jsxs)(`div`,{className:`flex justify-end gap-2 mt-2 w-full`,children:[(0,O.jsx)(v.BrandButton,{type:`button`,variant:`secondary`,onClick:a,testId:`${U}-cancel`,children:p(n.I18nKey.BUTTON$CANCEL)}),(0,O.jsx)(v.BrandButton,{type:`submit`,variant:`primary`,isDisabled:!G||k,testId:`${U}-submit`,children:p(n.I18nKey.BACKEND$SAVE)})]})]})}function V(){let{currentPath:e,navigate:t}=i.useNavigation();return D.default.useCallback(()=>{/^\/automations\/[^/]+/.test(e)?t(`/automations`):/^\/conversations\/[^/]+/.test(e)&&t(`/conversations`)},[e,t])}function H({onConnected:e,testIdRoot:r=`add-backend`,initialManualBackend:i,requireManualApiKey:a=!1,manualSubmitLabel:o,manualSubmittingLabel:c,manualSubmitTestId:l,analyticsSource:u}){let{t:d}=t.useTranslation(`openhands`),f=s.getLockedCloudHost();return f?(0,O.jsx)(`div`,{"data-testid":`${r}-connection-options`,className:`flex justify-center`,children:(0,O.jsx)(`div`,{className:`w-full`,children:(0,O.jsx)(W,{onConnected:e,testIdRoot:r,lockedHost:f,analyticsSource:u})})}):(0,O.jsxs)(`div`,{"data-testid":`${r}-connection-options`,className:`flex flex-col gap-6 md:flex-row`,children:[(0,O.jsx)(`div`,{className:`flex-1 min-w-0`,children:(0,O.jsx)(U,{onConnected:e,testIdRoot:r,initialBackend:i,requireApiKey:a,submitLabel:o??d(n.I18nKey.BACKEND$CONNECT),submittingLabel:c??d(n.I18nKey.ONBOARDING$BACKEND_STATUS_CHECKING),submitTestId:l})}),(0,O.jsx)(`div`,{className:`flex-1 min-w-0`,children:(0,O.jsx)(W,{onConnected:e,testIdRoot:r,analyticsSource:u})})]})}function U({onConnected:e,testIdRoot:r,initialBackend:i,requireApiKey:a,submitLabel:o,submittingLabel:s,submitTestId:c}){let{t:l}=t.useTranslation(`openhands`),{name:u,setName:d,host:f,setHost:p,apiKey:m,setApiKey:h,connectionError:g,setConnectionError:_,isSubmitting:b,kind:x,setKind:C,canSubmit:w,handleSubmit:T}=z({initialName:i?.name??``,initialHost:i?.host??``,initialApiKey:i?.apiKey??``,onTestConnection:L,onSuccess:t=>{e({name:u.trim(),host:j(f),apiKey:m.trim(),kind:x},`manual`,t)},requireApiKey:a});return(0,O.jsxs)(`form`,{"data-testid":`${r}-form`,onSubmit:T,className:`flex flex-col gap-4 flex-1 min-w-0`,children:[(0,O.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,O.jsx)(y.SettingsInput,{testId:`${r}-name`,name:`${r}-name`,type:`text`,label:l(n.I18nKey.BACKEND$NAME_LABEL),value:u,onChange:e=>{d(e),_(null)},placeholder:`e.g. My Server`,className:`w-full`}),(0,O.jsx)(`p`,{className:`text-xs text-[var(--oh-muted)]`,children:l(n.I18nKey.BACKEND$NAME_HELPER)})]}),(0,O.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,O.jsx)(y.SettingsInput,{testId:`${r}-host`,name:`${r}-host`,type:`text`,label:l(n.I18nKey.BACKEND$HOST_LABEL),value:f,onChange:e=>{p(e),_(null)},placeholder:`http://localhost:8000`,className:`w-full`}),(0,O.jsx)(`p`,{className:`text-xs text-[var(--oh-muted)]`,"data-testid":`${r}-host-helper`,children:l(n.I18nKey.BACKEND$HOST_HELPER)})]}),(0,O.jsxs)(`div`,{className:`flex flex-col items-start gap-2.5`,children:[(0,O.jsx)(`span`,{className:`text-sm`,children:l(n.I18nKey.BACKEND$KIND_LABEL)}),(0,O.jsx)(S.SegmentedToggle,{value:x,options:[{value:`local`,label:l(n.I18nKey.BACKEND$KIND_LOCAL)},{value:`cloud`,label:l(n.I18nKey.BACKEND$KIND_CLOUD)}],onChange:e=>C(e),ariaLabel:l(n.I18nKey.BACKEND$KIND_LABEL),testId:`${r}-kind`})]}),(0,O.jsx)(y.SettingsInput,{testId:`${r}-api-key`,name:`${r}-api-key`,type:`password`,label:l(n.I18nKey.BACKEND$KEY_LABEL),value:m,onChange:e=>{h(e),_(null)},placeholder:`sk-••••••••••`,className:`w-full`}),g?(0,O.jsx)(`div`,{role:`alert`,"data-testid":`${r}-error`,className:`rounded-md border border-red-500/40 bg-red-500/10 p-3 text-sm text-red-300 whitespace-pre-wrap break-words`,children:g}):null,(0,O.jsx)(v.BrandButton,{type:`submit`,variant:`secondary`,isDisabled:!w||b,testId:c??`${r}-submit`,className:`w-full text-center`,children:b?s:o})]})}function W({onConnected:e,testIdRoot:i,lockedHost:a,analyticsSource:o}){let{t:s}=t.useTranslation(`openhands`),[c,l]=D.default.useState(!1),[u,d]=D.default.useState(``),f=a??(u.trim()||N);return(0,O.jsxs)(`div`,{className:`flex flex-1 min-w-0 flex-col items-center gap-3 pb-8`,children:[(0,O.jsxs)(`div`,{className:`flex flex-col items-center gap-1`,children:[(0,O.jsx)(x.default,{width:56,height:56,"aria-hidden":!0}),(0,O.jsx)(`h4`,{className:g.modalTitleLgMediumClassName,"data-testid":`${i}-cloud-title`,children:s(n.I18nKey.BACKEND$CLOUD_TITLE)})]}),(0,O.jsx)(`p`,{className:`text-center text-sm leading-relaxed text-[var(--oh-muted)]`,children:s(n.I18nKey.BACKEND$CLOUD_DESCRIPTION)}),(0,O.jsx)(E.DeviceFlowAuth,{host:f,onSuccess:t=>{e({name:`OpenHands Cloud`,host:j(f),apiKey:t,kind:`cloud`},`cloud_login`)},testIdRoot:i,analyticsSource:o}),a?null:(0,O.jsxs)(`div`,{className:`w-full`,children:[(0,O.jsxs)(`button`,{type:`button`,onClick:()=>l(e=>!e),"aria-expanded":c,"data-testid":`${i}-advanced-toggle`,className:`flex w-full cursor-pointer items-center justify-center gap-1 text-center text-xs text-[var(--oh-muted)] transition-colors hover:text-content-2`,children:[(0,O.jsx)(`span`,{children:s(n.I18nKey.BACKEND$ADVANCED)}),(0,O.jsx)(C.default,{className:r.cn(`h-4 w-4 shrink-0 text-muted transition-transform`,c&&`rotate-180`),"aria-hidden":!0})]}),(0,O.jsxs)(`div`,{className:r.cn(`pt-2`,!c&&`pointer-events-none invisible`),"aria-hidden":!c,children:[(0,O.jsx)(y.SettingsInput,{testId:`${i}-cloud-host`,name:`${i}-cloud-host`,type:`text`,label:s(n.I18nKey.BACKEND$HOST_LABEL),value:u,onChange:d,placeholder:N,className:`w-full`}),(0,O.jsx)(`p`,{className:`mt-1 text-xs text-[var(--oh-muted)]`,children:s(n.I18nKey.BACKEND$LOGIN_CLOUD_HINT)})]})]})]})}function G({onClose:e,source:t}){let{addBackend:n}=f.useActiveBackendContext(),r=V(),{trackBackendAdded:i}=p.useTracking();return(0,O.jsx)(H,{onConnected:D.default.useCallback((a,o,s)=>{n(a),i({backendKind:a.kind,connectionMethod:o,hasApiKey:!!a.apiKey,source:t,agentServerVersion:s?.agentServerVersion}),r(),e()},[n,r,e,i,t]),analyticsSource:t})}function K({mode:e,backend:i,onClose:a,source:o=`add_backend_modal`,hideCloseButton:s=!1}){let{t:c}=t.useTranslation(`openhands`);if(e===`add`)return(0,O.jsx)(m.ModalBackdrop,{onClose:s?void 0:a,closeOnEscape:!1,closeOnBackdropClick:!s,"aria-label":c(n.I18nKey.BACKEND$ADD_TITLE),children:(0,O.jsxs)(`div`,{"data-testid":s?`onboarding-modal`:`add-backend-modal`,className:r.cn(`relative rounded-xl border border-[var(--oh-border)] bg-base-secondary`,h.modalWidthClassName(`xl`),h.MODAL_MAX_WIDTH_VIEWPORT),children:[s?null:(0,O.jsx)(_.ModalCloseButton,{onClose:a,testId:`add-backend-close`}),s?null:(0,O.jsx)(`div`,{className:`px-6 pt-6 pb-2 pr-12`,children:(0,O.jsx)(`h2`,{className:g.modalTitleLgClassName,children:c(n.I18nKey.BACKEND$ADD_TITLE)})}),(0,O.jsx)(`div`,{className:r.cn(`px-6 pb-6`,s?`pt-6`:`pt-2`),children:(0,O.jsx)(G,{onClose:a,source:o})})]})});let l=`edit-backend`;return(0,O.jsx)(m.ModalBackdrop,{onClose:a,closeOnEscape:!1,"aria-label":c(n.I18nKey.BACKEND$EDIT_TITLE),children:(0,O.jsxs)(`div`,{"data-testid":`${l}-modal`,className:r.cn(`relative bg-base-secondary p-6 rounded-xl flex flex-col gap-4 border border-[var(--oh-border)]`,h.modalWidthClassName(`md`)),children:[(0,O.jsx)(_.ModalCloseButton,{onClose:a,testId:`${l}-close`}),(0,O.jsx)(`h2`,{className:r.cn(`pr-6`,g.modalTitleLgClassName),children:c(n.I18nKey.BACKEND$EDIT_TITLE)}),(0,O.jsx)(B,{mode:`edit`,backend:i,onSubmitted:a,testIdRoot:l})]})})}exports.BackendFormModal=K;
|
|
1
|
+
const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),n=require("../../../i18n/declaration.cjs"),r=require("../../../node_modules/lucide-react/dist/esm/icons/chevron-down.cjs"),i=require("../../../node_modules/lucide-react/dist/esm/icons/globe.cjs"),a=require("../../../node_modules/lucide-react/dist/esm/icons/info.cjs"),o=require("../../../node_modules/lucide-react/dist/esm/icons/monitor.cjs"),s=require("../../../utils/utils.cjs"),c=require("../../../context/navigation-context.cjs"),l=require("../../../node_modules/@openhands/typescript-client/dist/client/server-client.cjs"),u=require("../../../node_modules/@openhands/typescript-client/dist/client/device-flow-client.cjs");require("../../../node_modules/@openhands/typescript-client/dist/clients.cjs");const d=require("../../../api/agent-server-config.cjs"),f=require("../../../utils/user-facing-error.cjs"),p=require("../../../api/agent-server-client-options.cjs"),m=require("../../../api/agent-server-compatibility.cjs"),h=require("../../../node_modules/@tanstack/react-query/build/modern/useQuery.cjs"),g=require("../../../contexts/active-backend-context.cjs"),_=require("../../../hooks/use-tracking.cjs"),v=require("../../shared/modals/modal-backdrop.cjs"),y=require("../../shared/modals/modal-body.cjs"),b=require("../../../utils/modal-classes.cjs"),x=require("../../shared/modals/modal-close-button.cjs"),S=require("../settings/brand-button.cjs"),C=require("../settings/settings-input.cjs"),w=require("../../../hooks/query/use-backends-health.cjs"),T=require("../../../assets/branding/openhands-logo-white.cjs"),E=require("../files-tab/segmented-toggle.cjs");require("../../../api/device-flow-client.cjs");const D=require("../../../icons/chevron-down-small.cjs"),O=require("../../../icons/external-link.cjs"),k=require("../../../icons/server.cjs"),A=require("./backend-status-label.cjs"),j=require("./backend-status-dot.cjs"),M=require("./device-flow-auth.cjs");let N=require("react");N=e.__toESM(N,1);let P=require("react/jsx-runtime");function F(e){return u.isOpenHandsCloudHost(e)?`cloud`:`local`}function I(e){let t=e.toLowerCase().replace(/^\[|\]$/g,``);return!!(t===`localhost`||t===`::1`||t===`::`||t===`0.0.0.0`||/^127\./.test(t)||/^::ffff:127\./i.test(t)||/^10\./.test(t)||/^192\.168\./.test(t)||/^172\.(1[6-9]|2\d|3[01])\./.test(t)||/^fe[89ab][0-9a-f]:/i.test(t)||/^f[cd][0-9a-f]{2}:/i.test(t)||t.endsWith(`.local`)||!t.includes(`.`)&&!t.includes(`:`))}function L(e){let t=e.trim().replace(/\/+$/,``);if(!t)return``;if(/^https?:\/\//i.test(t))return t;let n=t.match(/^\[([^\]]+)\]/);return`${I(n?n[1]:(t.match(/:/g)??[]).length>1?t:t.split(`:`)[0])?`http`:`https`}://${t}`}function R(e){let t=e.trim();if(!t||/\s/.test(t))return!1;let n=L(t);if(!n)return!1;try{let e=new URL(n);return(e.protocol===`http:`||e.protocol===`https:`)&&e.hostname.length>0}catch{return!1}}var z=`https://app.all-hands.dev`,B=`agent-canvas --backend-only --port 8001`,V=`https://github.com/OpenHands/OpenHands/blob/main/docs/DEVELOPMENT.md#alternative-development-workflows`,H=`https://github.com/OpenHands/OpenHands/blob/main/docs/SELF_HOSTING.md`,U=`https://docs.openhands.dev/overview/introduction`;function W(e,t){return e(n.I18nKey.BACKEND$CONNECTION_TEST_FAILED,{host:t,interpolation:{escapeValue:!1}})}function G(e){return f.getUserFacingConnectionErrorMessage(e)}function K(e,t){let n=G(t);return n?`${e}\n${n}`:e}async function q(e){if(e.kind!==`local`)return{agentServerVersion:null};let t=await new l.ServerClient(p.getAgentServerClientOptions({host:e.host,sessionApiKey:e.apiKey||null,timeout:5e3})).getServerInfo();return m.assertAgentServerVersionIsSupported(t),{agentServerVersion:m.getDisplayAgentServerVersion(t)}}function J({backend:e,testIdRoot:r}){let{t:i}=t.useTranslation(`openhands`),a=w.useBackendsHealth([e])[e.id],o=a?.isConnected??null,s=a?.disabled===!0,c=a?.consecutiveFailures??0,u=a?.lastError??null,{data:d}=h.useQuery({queryKey:[`backend-version`,e.host,e.apiKey],queryFn:async()=>m.getDisplayAgentServerVersion(await new l.ServerClient(p.getAgentServerClientOptions({host:e.host,sessionApiKey:e.apiKey||null,timeout:5e3})).getServerInfo()),retry:!1,staleTime:6e4,enabled:e.kind===`local`&&!s}),f=A.getBackendStatusLabel(i,e,a),g=e.kind===`cloud`?i(n.I18nKey.BACKEND$KIND_CLOUD):i(n.I18nKey.BACKEND$KIND_LOCAL);return(0,P.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,P.jsxs)(`div`,{"data-testid":`${r}-status`,className:`flex items-center gap-3 text-sm`,children:[(0,P.jsx)(j.BackendStatusDot,{isConnected:o}),(0,P.jsx)(`span`,{className:`text-white`,"data-testid":`${r}-status-label`,children:f}),(0,P.jsx)(`span`,{className:`text-tertiary-alt`,children:`·`}),(0,P.jsx)(`span`,{className:`text-[var(--oh-text-tertiary)]`,children:g}),d?(0,P.jsx)(`span`,{className:`text-xs text-[var(--oh-muted)]`,"data-testid":`${r}-version`,children:i(n.I18nKey.BACKEND$VERSION_LABEL,{version:d})}):null]}),s?(0,P.jsxs)(`div`,{"data-testid":`${r}-status-error`,className:`flex flex-col gap-1 rounded-md border border-red-500/40 bg-red-500/10 p-3 text-sm`,children:[(0,P.jsx)(`span`,{className:`font-semibold text-red-300`,children:i(n.I18nKey.BACKEND$HEALTH_FAILED_TITLE)}),(0,P.jsx)(`span`,{className:`text-xs text-[var(--oh-text-tertiary)]`,children:i(n.I18nKey.BACKEND$HEALTH_FAILED_DETAIL,{count:c})}),u?(0,P.jsx)(`span`,{"data-testid":`${r}-status-error-message`,className:`text-xs text-red-300 whitespace-pre-wrap break-words`,children:u}):null]}):null]})}function Y({initialName:e=``,initialHost:n=``,initialApiKey:r=``,onTestConnection:i,onSuccess:a,requireApiKey:o=!1,onSubmitOverride:s,fixedKind:c}){let{t:l}=t.useTranslation(`openhands`),[u,d]=N.default.useState(e),[f,p]=N.default.useState(n),[m,h]=N.default.useState(r),[g,_]=N.default.useState(null),[v,y]=N.default.useState(!1),[b,x]=N.default.useState(null),S=c??b??F(f),C=o||S!==`local`,w=u.trim().length>0&&R(f)&&(!C||m.trim().length>0);return{name:u,setName:d,host:f,setHost:p,apiKey:m,setApiKey:h,connectionError:g,setConnectionError:_,isSubmitting:v,kind:S,setKind:x,canSubmit:w,handleSubmit:N.default.useCallback(async e=>{if(e.preventDefault(),!w||v)return;let t={name:u.trim(),host:L(f),apiKey:m.trim(),kind:S};_(null),y(!0);try{s?await s(t):a(await i(t))}catch(e){_(K(W(l,t.host),e))}finally{y(!1)}},[w,v,u,f,m,S,i,a,o,s,c,l])}}function X({mode:e,backend:r,onSubmitted:i,renderActions:a,testIdRoot:o,hostReadOnly:c,requireApiKey:l,hideConfigurationFields:u=!1,onSubmitOverride:d}){let{t:f}=t.useTranslation(`openhands`),{addBackend:p,updateBackend:m}=g.useActiveBackendContext(),h=e===`edit`&&r?r.kind:null,{name:_,setName:v,host:y,setHost:b,apiKey:x,setApiKey:w,connectionError:T,setConnectionError:E,isSubmitting:D,kind:O,handleSubmit:k}=Y({initialName:r?.name??``,initialHost:r?.host??``,initialApiKey:r?.apiKey??``,onTestConnection:q,onSuccess:async()=>{let t={name:_.trim(),host:L(y),apiKey:x.trim(),kind:h??O};e===`edit`&&r?m(r.id,t):p(t),i()},requireApiKey:l,onSubmitOverride:d}),[A,j]=N.default.useState(!1),[M,F]=N.default.useState(!1),I=h??O,B=o??(e===`edit`?`edit-backend`:`add-backend`),V=l||I!==`local`,H=_.trim().length>0&&R(y)&&(!V||x.trim().length>0),U=A&&!_.trim()?f(n.I18nKey.BACKEND$NAME_REQUIRED):void 0,W=M?y.trim()?R(y)?void 0:f(n.I18nKey.BACKEND$HOST_INVALID):f(n.I18nKey.BACKEND$HOST_REQUIRED):void 0;return(0,P.jsxs)(`form`,{"data-testid":`${B}-form`,onSubmit:async e=>{if(!H){j(!0),F(!0);return}await k(e)},className:`flex flex-col gap-4`,children:[(0,P.jsxs)(`div`,{"data-testid":`${B}-configuration-fields`,className:s.cn(`flex flex-col gap-4`,u&&`hidden`),children:[(0,P.jsx)(C.SettingsInput,{testId:`${B}-name`,name:`${B}-name`,type:`text`,label:f(n.I18nKey.BACKEND$NAME_LABEL),value:_,onChange:e=>{v(e),E(null)},onBlur:()=>j(!0),placeholder:`Production`,className:`w-full`,showRequiredTag:!0,error:U}),(0,P.jsx)(C.SettingsInput,{testId:`${B}-host`,name:`${B}-host`,type:`text`,label:f(n.I18nKey.BACKEND$HOST_LABEL),value:y,onChange:c?void 0:e=>{b(e),E(null)},onBlur:()=>F(!0),placeholder:z,className:`w-full`,showRequiredTag:!0,error:W,isDisabled:c}),(0,P.jsx)(C.SettingsInput,{testId:`${B}-api-key`,name:`${B}-api-key`,type:`password`,label:f(n.I18nKey.BACKEND$KEY_LABEL),value:x,onChange:e=>{w(e),E(null)},placeholder:``,className:`w-full`}),T?(0,P.jsx)(`div`,{role:`alert`,"data-testid":`${B}-error`,className:`rounded-md border border-red-500/40 bg-red-500/10 p-3 text-sm text-red-300 whitespace-pre-wrap break-words`,children:T}):null,e===`edit`&&r&&(0,P.jsx)(J,{backend:r,testIdRoot:B})]}),a?a({canSubmit:H&&!D,isSubmitting:D,testIdRoot:B}):(0,P.jsxs)(`div`,{className:`flex justify-end gap-2 mt-2 w-full`,children:[(0,P.jsx)(S.BrandButton,{type:`button`,variant:`secondary`,onClick:i,testId:`${B}-cancel`,children:f(n.I18nKey.BUTTON$CANCEL)}),(0,P.jsx)(S.BrandButton,{type:`submit`,variant:`primary`,isDisabled:!H||D,testId:`${B}-submit`,children:f(n.I18nKey.BACKEND$SAVE)})]})]})}function Z(){let{currentPath:e,navigate:t}=c.useNavigation();return N.default.useCallback(()=>{/^\/automations\/[^/]+/.test(e)?t(`/automations`):/^\/conversations\/[^/]+/.test(e)&&t(`/conversations`)},[e,t])}function ee({onConnected:e,testIdRoot:r,initialBackend:i,requireApiKey:a,submitLabel:o,submittingLabel:s,submitTestId:c,fixedKind:l,showKindSelector:u=!0}){let{t:d}=t.useTranslation(`openhands`),{name:f,setName:p,host:m,setHost:h,apiKey:g,setApiKey:_,connectionError:v,setConnectionError:y,isSubmitting:b,kind:x,setKind:w,canSubmit:T,handleSubmit:D}=Y({initialName:i?.name??``,initialHost:i?.host??``,initialApiKey:i?.apiKey??``,onTestConnection:q,onSuccess:t=>{e({name:f.trim(),host:L(m),apiKey:g.trim(),kind:x},`manual`,t)},requireApiKey:a,fixedKind:l});return(0,P.jsxs)(`form`,{"data-testid":`${r}-form`,onSubmit:D,className:`flex flex-col gap-4 flex-1 min-w-0`,children:[(0,P.jsx)(C.SettingsInput,{testId:`${r}-name`,name:`${r}-name`,type:`text`,label:d(n.I18nKey.BACKEND$NAME_LABEL),hint:d(n.I18nKey.BACKEND$NAME_HELPER),value:f,onChange:e=>{p(e),y(null)},placeholder:`e.g. My Server`,className:`w-full`}),(0,P.jsx)(C.SettingsInput,{testId:`${r}-host`,name:`${r}-host`,type:`text`,label:d(n.I18nKey.BACKEND$HOST_LABEL),hint:d(n.I18nKey.BACKEND$HOST_HELPER),value:m,onChange:e=>{h(e),y(null)},placeholder:`http://localhost:8000`,className:`w-full`}),u?(0,P.jsxs)(`div`,{className:`flex flex-col items-start gap-2.5`,children:[(0,P.jsx)(`span`,{className:`text-sm`,children:d(n.I18nKey.BACKEND$KIND_LABEL)}),(0,P.jsx)(E.SegmentedToggle,{value:x,options:[{value:`local`,label:d(n.I18nKey.BACKEND$KIND_LOCAL)},{value:`cloud`,label:d(n.I18nKey.BACKEND$KIND_CLOUD)}],onChange:e=>w(e),ariaLabel:d(n.I18nKey.BACKEND$KIND_LABEL),testId:`${r}-kind`})]}):null,(0,P.jsx)(C.SettingsInput,{testId:`${r}-api-key`,name:`${r}-api-key`,type:`password`,label:d(n.I18nKey.BACKEND$KEY_LABEL),value:g,onChange:e=>{_(e),y(null)},placeholder:`sk-••••••••••`,className:`w-full`}),v?(0,P.jsx)(`div`,{role:`alert`,"data-testid":`${r}-error`,className:`rounded-md border border-red-500/40 bg-red-500/10 p-3 text-sm text-red-300 whitespace-pre-wrap break-words`,children:v}):null,(0,P.jsx)(S.BrandButton,{type:`submit`,variant:`secondary`,isDisabled:!T||b,testId:c??`${r}-submit`,className:`w-full text-center`,children:b?s:o})]})}function Q({onConnected:e,testIdRoot:r,lockedHost:i,analyticsSource:a,showBranding:o=!0}){let{t:c}=t.useTranslation(`openhands`),[l,u]=N.default.useState(!1),[d,f]=N.default.useState(``),p=`${r}-advanced-panel`,m=i??(d.trim()||z);return(0,P.jsxs)(`div`,{className:`flex w-full min-w-0 flex-col items-center gap-3`,children:[o?(0,P.jsxs)(`div`,{className:`flex flex-col items-center gap-1`,children:[(0,P.jsx)(T.default,{width:56,height:56,"aria-hidden":!0}),(0,P.jsx)(`h4`,{className:b.modalTitleLgMediumClassName,"data-testid":`${r}-cloud-title`,children:c(n.I18nKey.BACKEND$CLOUD_TITLE)})]}):null,(0,P.jsx)(M.DeviceFlowAuth,{host:m,onSuccess:t=>{e({name:`OpenHands Cloud`,host:L(m),apiKey:t,kind:`cloud`},`cloud_login`)},testIdRoot:r,analyticsSource:a,className:`w-full items-center`,idleDescription:(0,P.jsx)(`p`,{className:`text-center text-sm leading-relaxed text-[var(--oh-muted)]`,"data-testid":`${r}-cloud-description`,children:c(n.I18nKey.BACKEND$CLOUD_DESCRIPTION)}),idleFooter:i?null:(0,P.jsxs)(`div`,{className:`mx-auto w-full max-w-md`,children:[(0,P.jsxs)(`button`,{type:`button`,onClick:()=>u(e=>!e),"aria-expanded":l,"aria-controls":p,"data-testid":`${r}-advanced-toggle`,className:`flex w-full cursor-pointer items-center justify-center gap-1 text-center text-xs text-[var(--oh-muted)] transition-colors hover:text-content-2`,children:[(0,P.jsx)(`span`,{children:c(n.I18nKey.BACKEND$ADVANCED)}),(0,P.jsx)(D.default,{className:s.cn(`h-4 w-4 shrink-0 text-muted transition-transform duration-200 ease-out`,l&&`rotate-180`),"aria-hidden":!0})]}),(0,P.jsx)(`div`,{className:s.cn(`grid transition-[grid-template-rows] duration-200 ease-out motion-reduce:transition-none`,l?`grid-rows-[1fr]`:`grid-rows-[0fr]`),children:(0,P.jsx)(`div`,{className:`overflow-hidden`,children:(0,P.jsxs)(`div`,{id:p,"data-testid":`${r}-advanced-panel`,"aria-hidden":!l,inert:l?void 0:!0,className:s.cn(`pt-3 transition-opacity duration-200 ease-out motion-reduce:transition-none`,l?`opacity-100`:`opacity-0`),children:[(0,P.jsx)(C.SettingsInput,{testId:`${r}-cloud-host`,name:`${r}-cloud-host`,type:`text`,label:c(n.I18nKey.BACKEND$HOST_LABEL),value:d,onChange:f,placeholder:z,className:`w-full`}),(0,P.jsx)(`p`,{className:`mt-1 text-xs text-[var(--oh-muted)]`,children:c(n.I18nKey.BACKEND$LOGIN_CLOUD_HINT)})]})})})]})})]})}function $({value:e,selectedValue:t,title:n,description:r,icon:i,onSelect:a,panelId:o,testId:c}){let l=e===t;return(0,P.jsxs)(`button`,{id:`${c}-tab`,type:`button`,role:`tab`,"aria-selected":l,"aria-controls":o,"data-testid":c,onClick:()=>a(e),className:s.cn(`relative flex min-h-16 w-full cursor-pointer items-center gap-3 px-3 py-3 text-left transition-colors`,`first:border-r first:border-r-[var(--oh-border)]`,`focus-visible:z-10 focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-blue-300`,l?`bg-[var(--oh-surface-raised)] text-white after:absolute after:inset-x-0 after:bottom-0 after:h-0.5 after:bg-primary`:`text-[var(--oh-muted)] hover:bg-[var(--oh-surface-raised)] hover:text-white`),children:[(0,P.jsx)(`span`,{className:`flex size-8 shrink-0 items-center justify-center`,"aria-hidden":!0,children:i}),(0,P.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,P.jsx)(`span`,{className:`block truncate text-sm font-medium`,children:n}),(0,P.jsx)(`span`,{className:`mt-0.5 block text-xs leading-tight text-[var(--oh-muted)]`,children:r})]})]})}function te({children:e}){let t=N.default.useRef(null),[n,r]=N.default.useState();return N.default.useLayoutEffect(()=>{let e=t.current;if(!e)return;let n=()=>{let t=e.getBoundingClientRect().height;r(t>0?t:void 0)};if(n(),typeof ResizeObserver>`u`)return;let i=new ResizeObserver(n);return i.observe(e),()=>i.disconnect()},[]),(0,P.jsx)(`div`,{"data-testid":`add-backend-panel-height`,style:n===void 0?void 0:{height:n},className:`overflow-hidden transition-[height] duration-300 ease-in-out motion-reduce:transition-none`,children:(0,P.jsx)(`div`,{ref:t,children:e})})}function ne({location:e}){let{t:i}=t.useTranslation(`openhands`),[o,c]=N.default.useState(!1),l=e===`remote`,u=i(l?n.I18nKey.BACKEND$REMOTE_SETUP_TITLE:n.I18nKey.BACKEND$BEFORE_CONNECT_TITLE),d=i(l?n.I18nKey.BACKEND$REMOTE_SETUP_DESCRIPTION:n.I18nKey.BACKEND$LOCAL_SETUP_DESCRIPTION),f=l?H:V,p=i(l?n.I18nKey.BACKEND$REMOTE_SETUP_DOCS:n.I18nKey.BACKEND$LOCAL_SETUP_DOCS),m=l?`add-backend-remote`:`add-backend-local`,h=`${m}-guidance-toggle`,g=`${m}-guidance-body`;return(0,P.jsxs)(`aside`,{"data-testid":`${m}-guidance`,className:`rounded-lg bg-[var(--oh-surface-raised)] text-sm text-[var(--oh-muted)]`,children:[(0,P.jsx)(`h4`,{className:`text-white`,children:(0,P.jsxs)(`button`,{id:h,type:`button`,onClick:()=>c(e=>!e),"aria-expanded":o,"aria-controls":g,"data-testid":h,className:s.cn(`flex w-full cursor-pointer items-center justify-between gap-2 rounded-lg px-3 py-2 text-left font-medium`,`transition-colors hover:bg-[var(--oh-interactive-hover)]`,`focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-300`),children:[(0,P.jsxs)(`span`,{className:`flex min-w-0 items-center gap-2`,children:[(0,P.jsx)(a.Info,{className:`size-4 shrink-0 text-[var(--oh-muted)]`,"aria-hidden":!0}),(0,P.jsx)(`span`,{className:`truncate`,children:u})]}),(0,P.jsx)(r.ChevronDown,{className:s.cn(`size-5 shrink-0 text-[var(--oh-muted)] transition-transform duration-200 ease-out`,o&&`rotate-180`),"aria-hidden":!0})]})}),(0,P.jsx)(`div`,{className:s.cn(`grid transition-[grid-template-rows] duration-200 ease-out motion-reduce:transition-none`,o?`grid-rows-[1fr]`:`grid-rows-[0fr]`),children:(0,P.jsx)(`div`,{className:`overflow-hidden`,children:(0,P.jsxs)(`div`,{id:g,"data-testid":g,role:`region`,"aria-labelledby":h,"aria-hidden":!o,inert:o?void 0:!0,className:s.cn(`flex flex-col gap-2 px-3 pb-3 transition-opacity duration-200 ease-out motion-reduce:transition-none`,o?`opacity-100`:`opacity-0`),children:[(0,P.jsx)(`p`,{className:`leading-5`,children:d}),l?(0,P.jsxs)(`div`,{children:[(0,P.jsx)(`h5`,{className:`font-medium text-white`,children:i(n.I18nKey.BACKEND$REMOTE_CONNECTION_TITLE)}),(0,P.jsx)(`p`,{className:`mt-1 leading-5`,children:i(n.I18nKey.BACKEND$REMOTE_CONNECTION_DESCRIPTION)})]}):(0,P.jsx)(`code`,{className:`block break-words font-mono text-xs text-white`,children:B}),(0,P.jsxs)(`a`,{href:f,target:`_blank`,rel:`noopener noreferrer`,"data-testid":`${m}-docs-link`,tabIndex:o?void 0:-1,className:`inline-flex w-fit items-center gap-1.5 text-primary hover:underline`,children:[(0,P.jsx)(`span`,{children:p}),(0,P.jsx)(O.default,{className:`size-4 shrink-0`,"aria-hidden":!0})]})]})})})]})}function re({onConnected:e,source:r}){let{t:a}=t.useTranslation(`openhands`),[c,l]=N.default.useState(`cloud`),[u,d]=N.default.useState(`local`),f=`add-backend-selected-panel`,p=`add-backend-option-${c}-tab`,m=c===`cloud`;return(0,P.jsxs)(`div`,{"data-testid":`add-backend-chooser`,className:`flex flex-col`,children:[(0,P.jsxs)(`div`,{role:`tablist`,"aria-label":a(n.I18nKey.BACKEND$CHOOSER_TITLE),className:`grid grid-cols-2 overflow-hidden rounded-lg border border-[var(--oh-border)]`,children:[(0,P.jsx)($,{value:`cloud`,selectedValue:c,title:a(n.I18nKey.BACKEND$CLOUD_TITLE),description:a(n.I18nKey.BACKEND$CLOUD_OPTION_DESCRIPTION),icon:(0,P.jsx)(T.default,{width:32,height:32,"data-testid":`add-backend-option-cloud-logo`}),onSelect:l,panelId:f,testId:`add-backend-option-cloud`}),(0,P.jsx)($,{value:`agent-server`,selectedValue:c,title:a(n.I18nKey.BACKEND$AGENT_SERVER_TITLE),description:a(n.I18nKey.BACKEND$AGENT_SERVER_OPTION_DESCRIPTION),icon:(0,P.jsx)(k.default,{className:`size-6`}),onSelect:l,panelId:f,testId:`add-backend-option-agent-server`})]}),(0,P.jsx)(`div`,{className:`mt-6`,children:(0,P.jsx)(te,{children:(0,P.jsx)(`section`,{id:f,role:`tabpanel`,"aria-labelledby":p,className:`min-w-0`,children:m?(0,P.jsx)(`div`,{"data-testid":`add-backend-cloud-panel`,className:s.cn(`relative isolate flex min-h-[13.5rem] w-full items-center justify-center rounded-xl border border-[var(--oh-border)] px-5 py-6`,`before:pointer-events-none before:absolute before:inset-0 before:-z-10 before:rounded-xl`,`before:bg-[radial-gradient(75%_75%_at_50%_50%,rgba(255,255,255,0.1)_0%,rgba(255,255,255,0)_70%)]`),children:(0,P.jsx)(Q,{onConnected:e,testIdRoot:`add-backend`,analyticsSource:r,showBranding:!1})}):(0,P.jsxs)(`div`,{"data-testid":`add-backend-agent-server-panel`,className:`mx-auto w-full max-w-xl`,children:[(0,P.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,P.jsx)(`span`,{className:`h-px flex-1 bg-[var(--oh-border)]`,"aria-hidden":!0}),(0,P.jsx)(E.SegmentedToggle,{value:u,options:[{value:`local`,label:a(n.I18nKey.BACKEND$KIND_LOCAL),icon:(0,P.jsx)(o.Monitor,{"aria-hidden":!0})},{value:`remote`,label:a(n.I18nKey.BACKEND$KIND_REMOTE),icon:(0,P.jsx)(i.Globe,{"aria-hidden":!0})}],onChange:d,ariaLabel:a(n.I18nKey.BACKEND$AGENT_SERVER_LOCATION),testId:`add-backend-location`}),(0,P.jsx)(`span`,{className:`h-px flex-1 bg-[var(--oh-border)]`,"aria-hidden":!0})]}),(0,P.jsxs)(`div`,{className:`mt-4 flex flex-col gap-4`,children:[(0,P.jsx)(ne,{location:u},u),(0,P.jsx)(ee,{onConnected:e,testIdRoot:`add-backend`,requireApiKey:u===`remote`,submitLabel:a(n.I18nKey.BACKEND$CONNECT),submittingLabel:a(n.I18nKey.ONBOARDING$BACKEND_STATUS_CHECKING),fixedKind:`local`,showKindSelector:!1})]})]})})})})]})}function ie({onClose:e,source:t}){let{addBackend:n}=g.useActiveBackendContext(),r=Z(),{trackBackendAdded:i}=_.useTracking(),a=d.getLockedCloudHost(),o=N.default.useCallback((a,o,s)=>{n(a),i({backendKind:a.kind,connectionMethod:o,hasApiKey:!!a.apiKey,source:t,agentServerVersion:s?.agentServerVersion}),r(),e()},[n,r,e,i,t]);return a?(0,P.jsx)(Q,{onConnected:o,testIdRoot:`add-backend`,lockedHost:a,analyticsSource:t}):(0,P.jsx)(re,{onConnected:o,source:t})}function ae({mode:e,backend:r,onClose:i,source:a=`add_backend_modal`,hideCloseButton:o=!1}){let{t:c}=t.useTranslation(`openhands`);if(e===`add`)return(0,P.jsx)(v.ModalBackdrop,{onClose:o?void 0:i,closeOnEscape:!1,closeOnBackdropClick:!o,"aria-label":c(n.I18nKey.BACKEND$ADD_TITLE),children:(0,P.jsxs)(`div`,{"data-testid":o?`onboarding-modal`:`add-backend-modal`,className:s.cn(`relative max-h-[92vh] w-[720px] overflow-y-auto rounded-xl border border-[var(--oh-border)] bg-base-secondary p-6`,y.MODAL_MAX_WIDTH_VIEWPORT),children:[o?null:(0,P.jsx)(x.ModalCloseButton,{onClose:i,testId:`add-backend-close`}),o?null:(0,P.jsxs)(`div`,{className:`pr-8`,children:[(0,P.jsx)(`h2`,{className:b.modalTitleLgClassName,children:c(n.I18nKey.BACKEND$CHOOSER_TITLE)}),(0,P.jsxs)(`p`,{className:`mt-2 text-sm leading-6 text-[var(--oh-muted)]`,"data-testid":`add-backend-description`,children:[c(n.I18nKey.BACKEND$CHOOSER_DESCRIPTION),` `,(0,P.jsxs)(`a`,{href:U,target:`_blank`,rel:`noopener noreferrer`,"aria-label":c(n.I18nKey.BACKEND$DEPLOYMENT_OPTIONS),"data-testid":`add-backend-deployment-options-link`,className:`text-primary hover:underline`,children:[c(n.I18nKey.CTA$LEARN_MORE),(0,P.jsx)(O.default,{className:`ml-1 inline size-3.5 align-[-0.125em]`,"aria-hidden":!0})]})]})]}),(0,P.jsx)(`div`,{className:o?void 0:`mt-5`,children:(0,P.jsx)(ie,{onClose:i,source:a})})]})});let l=`edit-backend`;return(0,P.jsx)(v.ModalBackdrop,{onClose:i,closeOnEscape:!1,"aria-label":c(n.I18nKey.BACKEND$EDIT_TITLE),children:(0,P.jsxs)(`div`,{"data-testid":`${l}-modal`,className:s.cn(`relative bg-base-secondary p-6 rounded-xl flex flex-col gap-4 border border-[var(--oh-border)]`,y.modalWidthClassName(`md`)),children:[(0,P.jsx)(x.ModalCloseButton,{onClose:i,testId:`${l}-close`}),(0,P.jsx)(`h2`,{className:s.cn(`pr-6`,b.modalTitleLgClassName),children:c(n.I18nKey.BACKEND$EDIT_TITLE)}),(0,P.jsx)(X,{mode:`edit`,backend:r,onSubmitted:i,testIdRoot:l})]})})}exports.BackendFormModal=ae;
|
|
2
2
|
//# sourceMappingURL=backend-form-modal.cjs.map
|