@openhands/agent-canvas 1.8.0 → 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-B7lYw4uD.js → Trans-Bwpzk1wT.js} +1 -1
- package/build/assets/{acp-providers-WUD4tfSq.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-BGTyoT6X.js → agent-settings-WzqXk6B4.js} +2 -2
- package/build/assets/{alert-banner-eRyIwDyU.js → alert-banner-DR8EVyZM.js} +1 -1
- package/build/assets/api-error-message-e16L1kwH.js +1 -0
- package/build/assets/{api-key-entry-screen-JOx3SH1-.js → api-key-entry-screen-DI0I04O3.js} +1 -1
- package/build/assets/{app-settings-D53QZy5p.js → app-settings-DGistSFV.js} +1 -1
- 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-C02hGa8t.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-CQ9xtNWm.js → backend-synced-settings-badge-BnzI8Ysj.js} +1 -1
- package/build/assets/{badge-CzXbf7tR.js → badge-1Mf1iPcX.js} +1 -1
- package/build/assets/{base-modal-DkVyzFMt.js → base-modal-BBuy0WQQ.js} +1 -1
- package/build/assets/{brand-button-BUlDL-mz.js → brand-button-DGN6Y9o6.js} +1 -1
- package/build/assets/browser-D_ekTlTS.js +6 -0
- package/build/assets/{browser-tab-BijpUbdt.js → browser-tab-D4a4Ou_w.js} +1 -1
- package/build/assets/{chat-send-button-BKsVjhtA.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-DdjUiOo1.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-Dl9UtvD6.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-CRBJSllP.js → confirmation-modal-NCUPr2-O.js} +1 -1
- package/build/assets/{context-menu-list-item-FGaafXGh.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-CDjvNgpG.js → conversation-tab-empty-state-BCZ7rUMH.js} +1 -1
- package/build/assets/{copy-Drwu97Gx.js → copy-DCmZtz6n.js} +1 -1
- package/build/assets/{copy-to-clipboard-button-NbN1clVr.js → copy-to-clipboard-button-D_Lp6-Fl.js} +1 -1
- package/build/assets/{device-verify-CDm_WrVu.js → device-verify-DLmolX8Q.js} +1 -1
- package/build/assets/{dropdown-classes-CqA2BTCL.js → dropdown-classes-BB8rzqXL.js} +1 -1
- package/build/assets/{entry.client-BO2KQj0y.js → entry.client-BbIYOsIg.js} +2 -2
- package/build/assets/{enum-filter-dropdown-DSqPZnsD.js → enum-filter-dropdown-C08-srev.js} +1 -1
- package/build/assets/{environment-switch-overlay-mGl2pqqx.js → environment-switch-overlay-BepBBX66.js} +1 -1
- package/build/assets/{extensions-hub-Br3Lgynp.js → extensions-hub-R3KNv-5V.js} +1 -1
- package/build/assets/{extensions-navigation-BQmstKDZ.js → extensions-navigation-CfWFmI1I.js} +1 -1
- package/build/assets/{external-link-D9B2QMPf.js → external-link-BdBSg8rk.js} +1 -1
- package/build/assets/files-tab-DEq8MbHu.js +1 -0
- package/build/assets/{form-control-classes-CtVAktAy.js → form-control-classes-DAfsCJTe.js} +1 -1
- package/build/assets/{format-time-delta-DICE64sz.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-KMsA9c4a.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-DjkKw55l.js → launch-B1POpHuP.js} +1 -1
- package/build/assets/{list-todo-BpAf7aOT.js → list-todo-DtiL3lTp.js} +1 -1
- package/build/assets/llm-not-configured-banner-3tMsM4K6.js +27 -0
- package/build/assets/{llm-settings-D8zNkIlP.js → llm-settings-CXo8iPNW.js} +1 -1
- package/build/assets/llm-settings-D0W8mJDk.js +1 -0
- package/build/assets/{llm-subscription-service-COTgZc1C.js → llm-subscription-service-DBJbfd8Z.js} +1 -1
- package/build/assets/loader-circle-B4QDBARx.js +1 -0
- package/build/assets/{loading-spinner-DRFyh6Iy.js → loading-spinner-DfZ_bhV7.js} +1 -1
- package/build/assets/{manage-backends-modal-DiRWE3tJ.js → manage-backends-modal-CwyWsiag.js} +1 -1
- package/build/assets/manifest-39f4789d.js +1 -0
- package/build/assets/markdown-renderer-DgiLLhW6.js +8 -0
- 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-C3bGicn4.js → modal-body-CMsDpalT.js} +1 -1
- package/build/assets/{modal-classes-DFFO6BMU.js → modal-classes-B6PDrxXo.js} +1 -1
- package/build/assets/{modal-close-button-vxkAIRyZ.js → modal-close-button-DyxBZaAb.js} +1 -1
- package/build/assets/{onboarding-DWuFieEA.js → onboarding-47hh2IHA.js} +1 -1
- package/build/assets/{onboarding-modal-C8m72Dpb.js → onboarding-modal-9BuvvROo.js} +1 -1
- package/build/assets/{organization-service.api-CQ73CB-S.js → organization-service.api-UDy63-oC.js} +1 -1
- package/build/assets/{pencil-DzW2GB2M.js → pencil-BjgtZmWp.js} +1 -1
- package/build/assets/{planner-tab-YG0bGxDY.js → planner-tab-BWk8885v.js} +1 -1
- package/build/assets/{plugins-management-service-ijhH8OSh.js → plugins-management-service-CjkgF2dd.js} +1 -1
- package/build/assets/plus-DrKuuvMe.js +1 -0
- package/build/assets/{profiles-service.api-C32pPm70.js → profiles-service.api-CukSFLzz.js} +1 -1
- package/build/assets/{providers-DuSn9s2i.js → providers-CqUWC85T.js} +1 -1
- package/build/assets/{proxy-BiyDhMBd.js → proxy-BBUG3sd2.js} +1 -1
- package/build/assets/{puzzle-DlqT0yvr.js → puzzle-BoNc6zZ8.js} +1 -1
- package/build/assets/recommended-automations-launcher-ejxy1P27.js +1 -0
- package/build/assets/{refresh-cw-Br5254f4.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-htfNouTG.js → schema-field-nImDoY6-.js} +1 -1
- package/build/assets/{sdk-section-page-D0K1dBQY.js → sdk-section-page-BxMrtUNV.js} +1 -1
- package/build/assets/search-Dc2qR4O2.js +1 -0
- package/build/assets/{secrets-service-Dbv5Zb8G.js → secrets-service-Dhjh3HhH.js} +1 -1
- package/build/assets/{secrets-settings-Da4SSaX9.js → secrets-settings-CPdxceT_.js} +1 -1
- package/build/assets/segmented-toggle-Do6oyepX.js +1 -0
- package/build/assets/{settings-F4a09IxY.js → settings-BRbnfKEm.js} +1 -1
- package/build/assets/{settings-dropdown-input-jOiv5Yrk.js → settings-dropdown-input-DYCULKpp.js} +1 -1
- package/build/assets/{settings-index-CyJBf5NA.js → settings-index-C9o2NBO0.js} +1 -1
- package/build/assets/settings-input-B-q2gkVy.js +1 -0
- package/build/assets/{settings-list-classes-VqMzkYYt.js → settings-list-classes-WpQi0q1L.js} +1 -1
- package/build/assets/{settings-modal-C-S1NpbC.js → settings-modal-CEK0AIx6.js} +1 -1
- package/build/assets/{settings-service.api-CTJRrvMu.js → settings-service.api-CZiPD8__.js} +1 -1
- package/build/assets/{settings-switch-B405oU_v.js → settings-switch-LqKdGxHL.js} +1 -1
- package/build/assets/shared-conversation-Bu-dQlgp.js +1 -0
- package/build/assets/{sidebar-layout-BGMuyC86.js → sidebar-layout-oHBGQmLh.js} +1 -1
- package/build/assets/{sidebar-mobile-menu-toggle-xiKoUfGa.js → sidebar-mobile-menu-toggle-ND-hgygu.js} +1 -1
- package/build/assets/{sidebar-nav-link-DA4_ct9G.js → sidebar-nav-link-CrujNA09.js} +1 -1
- package/build/assets/{sidebar-store-FRJ3rADB.js → sidebar-store-Bui-WNEr.js} +1 -1
- package/build/assets/{skill-card-pill-row-BMdhr_sd.js → skill-card-pill-row-CZBI7OqH.js} +1 -1
- package/build/assets/{skill-icon-badge-CGUkgcVH.js → skill-icon-badge-BOov_phZ.js} +1 -1
- package/build/assets/{skills-plugins-C5eJnyft.js → skills-plugins-D0PiHWAD.js} +1 -1
- package/build/assets/{skills-settings-pUxMr6WZ.js → skills-settings-B43KArIz.js} +2 -2
- package/build/assets/{styled-tooltip-B3kIdVyH.js → styled-tooltip-C7grwnOX.js} +1 -1
- package/build/assets/{task-list-tab-B3k4W1cK.js → task-list-tab-R3ac6m7O.js} +1 -1
- package/build/assets/{terminal-CBI_41Zc.js → terminal-yqkNdEAx.js} +1 -1
- package/build/assets/{toggle-switch-DYRr9CAR.js → toggle-switch-BeSrbgCg.js} +1 -1
- package/build/assets/{trash-2-gZPlx23R.js → trash-2-wW5TWcdN.js} +1 -1
- package/build/assets/{typography-B1UxuuEC.js → typography-iYhzLlHO.js} +1 -1
- package/build/assets/{use-acp-credential-form-CjSvKWFH.js → use-acp-credential-form-DUxbxmbq.js} +1 -1
- package/build/assets/{use-activate-agent-profile-DCRf47e-.js → use-activate-agent-profile-CDHA52tC.js} +1 -1
- package/build/assets/use-agent-profiles-TsOdIyw5.js +1 -0
- package/build/assets/{use-can-manage-org-profiles-vBiP7rHF.js → use-can-manage-org-profiles-Bt1M71u5.js} +1 -1
- package/build/assets/{use-cloud-current-user-id-BMq9gw93.js → use-cloud-current-user-id-DWt7HCgf.js} +1 -1
- package/build/assets/use-config-CxlEdf_v.js +1 -0
- package/build/assets/{use-create-conversation-CakhLF0X.js → use-create-conversation-nOJ6Um5h.js} +1 -1
- package/build/assets/{use-create-secret-RT4QtSS9.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-CJU4MNAY.js → use-onboarding-completion-gxQlcEy2.js} +1 -1
- package/build/assets/{use-plugins-marketplace-D-93nqtJ.js → use-plugins-marketplace-CVO7sXYR.js} +1 -1
- package/build/assets/use-save-agent-profile-D0wC5ExW.js +1 -0
- package/build/assets/{use-save-settings--C6LZXfI.js → use-save-settings-L3aMaDeS.js} +1 -1
- package/build/assets/{use-settings-DIAo5KFk.js → use-settings-8nt3DGxW.js} +1 -1
- package/build/assets/use-settings-nav-items-DHAAD-zk.js +16 -0
- package/build/assets/{use-skills-D_mLhYNa.js → use-skills-CE6miQ3r.js} +1 -1
- package/build/assets/use-tracking-BGboadaZ.js +68 -0
- package/build/assets/{use-user-conversation-DhcAEyJX.js → use-user-conversation-BIIpGUgM.js} +1 -1
- package/build/assets/useInfiniteQuery-BLRVmVPU.js +1 -0
- package/build/assets/{useMutation-DHLpZ6J0.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-CYPMCkX1.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0bpqexo-CbTboogo.js} +1 -1
- 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-atebg0iG.js → vendor~files-tab-C7RmQJwN.js} +1 -1
- package/build/assets/{vendor~index-home~home~conversation-panel~conversation-G9DMrR7m.js → vendor~index-home~home~conversation-panel~conversation-Bqp1ZqJM.js} +1 -1
- package/build/assets/{vendor~root-layout~conversation-panel~conversation-DEhW1h3I.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-VFnwct3q.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-Vr5cN4md.js → verification-settings-DBsnSXC3.js} +1 -1
- package/build/assets/x-omAzpXkl.js +1 -0
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +37 -2
- package/build/locales/ca/openhands.json +37 -2
- package/build/locales/de/openhands.json +37 -2
- package/build/locales/en/openhands.json +38 -3
- package/build/locales/es/openhands.json +37 -2
- package/build/locales/fr/openhands.json +37 -2
- package/build/locales/it/openhands.json +37 -2
- package/build/locales/ja/openhands.json +37 -2
- package/build/locales/ko-KR/openhands.json +37 -2
- package/build/locales/no/openhands.json +37 -2
- package/build/locales/pt/openhands.json +37 -2
- package/build/locales/tr/openhands.json +37 -2
- package/build/locales/uk/openhands.json +37 -2
- package/build/locales/zh-CN/openhands.json +37 -2
- package/build/locales/zh-TW/openhands.json +37 -2
- package/config/defaults.json +1 -1
- 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 +99 -62
- package/dist/api/automation-service/automation-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/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 +1 -1
- package/dist/config/defaults.js.map +1 -1
- 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-manifest-capabilities.d.ts +21 -0
- package/dist/hooks/query/use-manifest-prerequisites.d.ts +24 -0
- 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 +19 -1
- package/dist/hooks/use-tracking.js.map +1 -1
- package/dist/i18n/declaration.cjs +1 -1
- package/dist/i18n/declaration.cjs.map +1 -1
- package/dist/i18n/declaration.d.ts +36 -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 +611 -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 +37 -2
- package/dist/locales/ca/openhands.json +37 -2
- package/dist/locales/de/openhands.json +37 -2
- package/dist/locales/en/openhands.json +38 -3
- package/dist/locales/es/openhands.json +37 -2
- package/dist/locales/fr/openhands.json +37 -2
- package/dist/locales/it/openhands.json +37 -2
- package/dist/locales/ja/openhands.json +37 -2
- package/dist/locales/ko-KR/openhands.json +37 -2
- package/dist/locales/no/openhands.json +37 -2
- package/dist/locales/pt/openhands.json +37 -2
- package/dist/locales/tr/openhands.json +37 -2
- package/dist/locales/uk/openhands.json +37 -2
- package/dist/locales/zh-CN/openhands.json +37 -2
- package/dist/locales/zh-TW/openhands.json +37 -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/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 +2 -2
- package/dist/package.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/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/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 +2 -2
- package/scripts/check-translation-completeness.cjs +1 -0
- package/scripts/dev-safe.mjs +15 -10
- 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-mY7Gff5c.js +0 -2
- package/build/assets/agent-context-settings-BTUmWEzL.js +0 -1
- package/build/assets/agent-profiles-settings-Ilqid_R5.js +0 -1
- package/build/assets/agent-server-conversation-service.api-C_7YnjzP.js +0 -41
- package/build/assets/agent-settings-CxfT4ksO.js +0 -1
- package/build/assets/automation-BGP_I1RR.js +0 -1
- package/build/assets/automation-detail-nEflClmc.js +0 -2
- package/build/assets/automation-export-BO_kfqC8.js +0 -2
- package/build/assets/automations-list-BYncC7gv.js +0 -1
- package/build/assets/backend-form-modal-CKrBF80P.js +0 -1
- package/build/assets/browser-3QjrEr1D.js +0 -6
- package/build/assets/check-CrxQfJZ2.js +0 -1
- package/build/assets/chevron-down-D_LsyTA7.js +0 -1
- package/build/assets/circle-check-DZn9HkLE.js +0 -1
- package/build/assets/cloud-funnel-analytics-NlmDoeo2.js +0 -1
- package/build/assets/command-menu-CvLPs7dg.js +0 -1
- package/build/assets/condenser-settings-C4Y9CzQV.js +0 -1
- package/build/assets/conversation-D_ORtpKC.js +0 -1
- package/build/assets/conversation-Dpc5nmGi.js +0 -90
- package/build/assets/conversation-panel-D_ORtpKC.js +0 -1
- package/build/assets/conversation-state-store-CGRQemtx.js +0 -1
- package/build/assets/files-tab-4c9HFSLo.js +0 -1
- package/build/assets/git-provider-icon-0PqmIS_S.js +0 -1
- package/build/assets/home-D9JsyEmE.js +0 -1
- package/build/assets/home-TFhnmZLx.js +0 -1
- package/build/assets/index-home-D9JsyEmE.js +0 -1
- package/build/assets/install-server-modal-BgGRnqA0.js +0 -1
- package/build/assets/llm-not-configured-banner-Y4W9-sar.js +0 -27
- package/build/assets/llm-settings-nPwv7hKu.js +0 -1
- package/build/assets/loader-circle-CGD6-Vak.js +0 -1
- package/build/assets/manifest-1cf33a7b.js +0 -1
- package/build/assets/markdown-renderer-U40HF0Ak.js +0 -8
- package/build/assets/mcp-xDMaHzOw.js +0 -9
- package/build/assets/messages-CdNfZPgd.js +0 -40
- package/build/assets/plus-CTGLo3aa.js +0 -1
- package/build/assets/recommended-automations-launcher-Dru1yN46.js +0 -58
- package/build/assets/root-B5JXKp1P.css +0 -1
- package/build/assets/root-DOLLQteU.js +0 -2
- package/build/assets/root-layout-xmylWoew.js +0 -3
- package/build/assets/search-BrpWXWUi.js +0 -1
- package/build/assets/segmented-toggle-CZKOdIly.js +0 -1
- package/build/assets/settings-input-BEaTCem1.js +0 -1
- package/build/assets/shared-conversation-BvWtTwES.js +0 -1
- package/build/assets/use-agent-profiles-DmT9zxAN.js +0 -1
- package/build/assets/use-config-C959QcRC.js +0 -1
- package/build/assets/use-is-authed-BsS4XwSL.js +0 -1
- package/build/assets/use-llm-profiles-CdaxVpyY.js +0 -1
- package/build/assets/use-save-agent-profile-DGJ3-u0M.js +0 -1
- package/build/assets/use-settings-nav-items-DPK5sxvR.js +0 -16
- package/build/assets/use-tracking-COqZLobY.js +0 -1
- package/build/assets/utils-DsWhWn2F.js +0 -1
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation-Acmf1sKj.js +0 -1
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-CmzCY1BT.js +0 -1
- package/build/assets/vendor~root-layout~index-home~home~mcp~automations-list~onboarding-modal-C7Yh77RT.js +0 -1
- package/build/assets/x-Dx_JbpHA.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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automation-service.api.js","names":[],"sources":["../../../src/api/automation-service/automation-service.api.ts"],"sourcesContent":["import axios from \"axios\";\nimport {\n clearPendingLocalTelemetryRevocation,\n getTelemetryConsent,\n getTelemetryDistinctId,\n getTelemetryDistinctIdForConsentSync,\n type TelemetryConsent,\n} from \"#/services/telemetry\";\nimport type {\n Automation,\n AutomationRun,\n AutomationSpec,\n AutomationTrigger,\n AutomationsResponse,\n AutomationRunsResponse,\n} from \"#/types/automation\";\nimport type { Backend, ResolvedActiveBackend } from \"../backend-registry/types\";\nimport {\n getActiveBackend,\n getEffectiveLocalBackend,\n} from \"../backend-registry/active-store\";\nimport { NoBackendAvailableError } from \"../agent-server-client-options\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport {\n AGENT_CANVAS_CLIENT_HEADERS,\n OPENHANDS_TELEMETRY_DISTINCT_ID_HEADER,\n} from \"../client-source\";\n\nconst AUTOMATION_BASE_PATH = \"/api/automation\";\n\nexport interface AutomationHealthResponse {\n status: \"ok\" | \"error\";\n message?: string;\n}\n\ntype AutomationSdkVersionResponse =\n | string\n | {\n sdk_version?: unknown;\n version?: unknown;\n };\n\n// Local automation calls go to the automation sidecar that\n// `scripts/dev-with-automation.mjs` mounts behind the local agent-server.\n// Both backends use the same session API key and the same `X-Session-API-Key`\n// header for consistency.\nconst localAutomationAxios = axios.create();\n\nasync function buildAutomationRequestHeaders(\n extraHeaders: Record<string, string> = {},\n): Promise<Record<string, string>> {\n const telemetryDistinctId = await getTelemetryDistinctId();\n return {\n ...AGENT_CANVAS_CLIENT_HEADERS,\n ...(telemetryDistinctId\n ? { [OPENHANDS_TELEMETRY_DISTINCT_ID_HEADER]: telemetryDistinctId }\n : {}),\n ...extraHeaders,\n };\n}\n\nlocalAutomationAxios.interceptors.request.use(async (config) => {\n const requestHeaders = await buildAutomationRequestHeaders();\n Object.entries(requestHeaders).forEach(([name, value]) => {\n config.headers.set(name, value);\n });\n\n // Import uses an explicit baseURL/header pair so its POST, PATCH, and\n // cleanup stay pinned to the backend selected when the mutation started.\n if (config.baseURL) return config;\n\n // Resolve the local backend on every call so it tracks the\n // currently-active local backend (and any host/key edits made via the\n // manage-backends UI), rather than freezing whatever value the\n // agent-server-config produced at module load time.\n // Using the backend registry (rather than the build-time VITE_SESSION_API_KEY\n // env var) ensures the published npm package picks up the runtime-injected\n // session key that scripts/static-server.mjs seeds into localStorage, fixing\n // the 401 errors reported in issue #829.\n const backend = getEffectiveLocalBackend();\n if (!backend) throw new NoBackendAvailableError();\n // eslint-disable-next-line no-param-reassign\n config.baseURL = backend.host;\n\n const apiKey = backend.apiKey?.trim();\n if (apiKey) {\n config.headers.set(\"X-Session-API-Key\", apiKey);\n }\n return config;\n});\n\nfunction normalizeAutomationSdkVersion(version: unknown): string | null {\n if (typeof version !== \"string\") return null;\n const trimmed = version.trim();\n return trimmed || null;\n}\n\nfunction getAutomationSdkVersionFromResponse(\n response: AutomationSdkVersionResponse,\n): string | null {\n if (typeof response === \"string\") {\n return normalizeAutomationSdkVersion(response);\n }\n return (\n normalizeAutomationSdkVersion(response.sdk_version) ??\n normalizeAutomationSdkVersion(response.version)\n );\n}\n\nfunction buildPaginationQuery(limit: number, offset: number): string {\n const params = new URLSearchParams();\n params.set(\"limit\", String(limit));\n params.set(\"offset\", String(offset));\n return params.toString();\n}\n\nfunction buildImportedTrigger(spec: AutomationSpec): AutomationTrigger {\n if (spec.trigger.type === \"event\") {\n return {\n type: \"event\",\n source: spec.trigger.source,\n on: spec.trigger.on,\n ...(spec.trigger.filter && { filter: spec.trigger.filter }),\n };\n }\n\n return {\n type: \"cron\",\n schedule: spec.trigger.schedule,\n timezone: spec.timezone ?? spec.trigger.timezone ?? \"UTC\",\n };\n}\n\nfunction generatePendingImportEvent(): string {\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return `pending.${crypto.randomUUID()}`;\n }\n return `pending.${Date.now()}.${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction buildCreateAutomationRequest(spec: AutomationSpec) {\n if (!spec.prompt) {\n throw new Error(\"An automation prompt is required for import.\");\n }\n\n const repos = spec.repository\n ? [\n {\n url: spec.repository,\n ...(spec.branch && { ref: spec.branch }),\n ...(!spec.repository.includes(\"://\") &&\n !spec.repository.startsWith(\"git@\") && { provider: \"github\" }),\n },\n ]\n : undefined;\n\n return {\n path: `${AUTOMATION_BASE_PATH}/v1/preset/${spec.plugins?.length ? \"plugin\" : \"prompt\"}`,\n body: {\n name: spec.name,\n prompt: spec.prompt,\n // Preset creation defaults to enabled. A unique event trigger keeps the\n // new record inert until the real trigger and disabled state are applied\n // together in the follow-up PATCH.\n trigger: {\n type: \"event\",\n source: \"agent-canvas-import\",\n on: generatePendingImportEvent(),\n },\n ...(spec.model && { model: spec.model }),\n ...(repos && { repos }),\n ...(spec.plugins?.length && {\n plugins: spec.plugins.map((source) => ({ source })),\n }),\n ...(spec.timeout != null && { timeout: spec.timeout }),\n },\n };\n}\n\nasync function buildPinnedLocalConfig(backend: Backend) {\n const apiKey = backend.apiKey.trim();\n return {\n baseURL: backend.host,\n headers: await buildAutomationRequestHeaders(\n apiKey ? { \"X-Session-API-Key\": apiKey } : {},\n ),\n };\n}\n\nasync function buildPinnedCloudHeaders(active: ResolvedActiveBackend) {\n return buildAutomationRequestHeaders(\n active.orgId ? { \"X-Org-Id\": active.orgId } : {},\n );\n}\n\nclass AutomationService {\n static async syncTelemetryConsent(\n consent: TelemetryConsent = getTelemetryConsent(),\n ): Promise<void> {\n const active = getActiveBackend();\n if (active.backend.kind !== \"local\") return;\n\n const frontendDistinctId = await getTelemetryDistinctIdForConsentSync();\n await localAutomationAxios.post(\n `${AUTOMATION_BASE_PATH}/v1/telemetry/consent`,\n {\n consent_granted: consent === \"granted\",\n frontend_distinct_id: frontendDistinctId,\n },\n { timeout: 5000 },\n );\n if (consent !== \"granted\" && frontendDistinctId) {\n clearPendingLocalTelemetryRevocation(frontendDistinctId);\n }\n }\n\n static async getSdkVersion(): Promise<string | null> {\n const active = getActiveBackend();\n const path = `${AUTOMATION_BASE_PATH}/sdk-version`;\n\n try {\n let response: AutomationSdkVersionResponse;\n if (active.backend.kind === \"cloud\") {\n response = await callCloudProxy<AutomationSdkVersionResponse>({\n backend: active.backend,\n method: \"GET\",\n path,\n headers: await buildPinnedCloudHeaders(active),\n timeoutSeconds: 5,\n });\n } else {\n const { data } =\n await localAutomationAxios.get<AutomationSdkVersionResponse>(path, {\n timeout: 5000,\n });\n response = data;\n }\n\n return getAutomationSdkVersionFromResponse(response);\n } catch {\n return null;\n }\n }\n\n static async listAutomations(\n params: { limit?: number; offset?: number } = {},\n ): Promise<AutomationsResponse> {\n const { limit = 50, offset = 0 } = params;\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationsResponse>({\n backend: active,\n method: \"GET\",\n path: `${AUTOMATION_BASE_PATH}/v1?${buildPaginationQuery(limit, offset)}`,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.get<AutomationsResponse>(\n `${AUTOMATION_BASE_PATH}/v1`,\n { params: { limit, offset } },\n );\n return data;\n }\n\n static async getAutomations(\n limit = 50,\n offset = 0,\n ): Promise<AutomationsResponse> {\n return AutomationService.listAutomations({ limit, offset });\n }\n\n static async getAutomation(id: string): Promise<Automation> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/${encodeURIComponent(id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<Automation>({\n backend: active,\n method: \"GET\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.get<Automation>(path);\n return data;\n }\n\n static async createAutomation(spec: AutomationSpec): Promise<Automation> {\n const active = getActiveBackend();\n const { path, body } = buildCreateAutomationRequest(spec);\n\n let created: Automation;\n if (active.backend.kind === \"cloud\") {\n created = await callCloudProxy<Automation>({\n backend: active.backend,\n method: \"POST\",\n path,\n body,\n headers: await buildPinnedCloudHeaders(active),\n });\n } else {\n const { data } = await localAutomationAxios.post<Automation>(\n path,\n body,\n await buildPinnedLocalConfig(active.backend),\n );\n created = data;\n }\n\n const updatePath = `${AUTOMATION_BASE_PATH}/v1/${encodeURIComponent(created.id)}`;\n const updateBody: Partial<Automation> = {\n trigger: buildImportedTrigger(spec),\n enabled: false,\n };\n\n try {\n if (active.backend.kind === \"cloud\") {\n return await callCloudProxy<Automation>({\n backend: active.backend,\n method: \"PATCH\",\n path: updatePath,\n body: updateBody,\n headers: await buildPinnedCloudHeaders(active),\n });\n }\n\n const { data } = await localAutomationAxios.patch<Automation>(\n updatePath,\n updateBody,\n await buildPinnedLocalConfig(active.backend),\n );\n return data;\n } catch (updateError) {\n try {\n if (active.backend.kind === \"cloud\") {\n await callCloudProxy<unknown>({\n backend: active.backend,\n method: \"DELETE\",\n path: updatePath,\n headers: await buildPinnedCloudHeaders(active),\n });\n } else {\n await localAutomationAxios.delete(\n updatePath,\n await buildPinnedLocalConfig(active.backend),\n );\n }\n } catch (cleanupError) {\n throw new AggregateError(\n [updateError, cleanupError],\n \"Failed to disable the imported automation and clean it up.\",\n );\n }\n throw updateError;\n }\n }\n\n static async updateAutomation(\n id: string,\n body: Partial<Automation>,\n ): Promise<Automation> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/${encodeURIComponent(id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<Automation>({\n backend: active,\n method: \"PATCH\",\n path,\n body: body as Record<string, unknown>,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.patch<Automation>(path, body);\n return data;\n }\n\n static async deleteAutomation(id: string): Promise<void> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/${encodeURIComponent(id)}`;\n\n if (active.kind === \"cloud\") {\n await callCloudProxy<unknown>({\n backend: active,\n method: \"DELETE\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n return;\n }\n\n await localAutomationAxios.delete(path);\n }\n\n static async dispatchAutomation(id: string): Promise<AutomationRun> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/${encodeURIComponent(id)}/dispatch`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationRun>({\n backend: active,\n method: \"POST\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.post<AutomationRun>(path);\n return data;\n }\n\n static async listAutomationRuns(\n id: string,\n params: { limit?: number; offset?: number } = {},\n ): Promise<AutomationRunsResponse> {\n const { limit = 50, offset = 0 } = params;\n const active = getActiveBackend().backend;\n const basePath = `${AUTOMATION_BASE_PATH}/v1/${encodeURIComponent(id)}/runs`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationRunsResponse>({\n backend: active,\n method: \"GET\",\n path: `${basePath}?${buildPaginationQuery(limit, offset)}`,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.get<AutomationRunsResponse>(\n basePath,\n { params: { limit, offset } },\n );\n return data;\n }\n\n static async getAutomationRuns(\n id: string,\n limit = 50,\n offset = 0,\n ): Promise<AutomationRunsResponse> {\n return AutomationService.listAutomationRuns(id, { limit, offset });\n }\n\n static async toggleAutomation(\n id: string,\n enabled: boolean,\n ): Promise<Automation> {\n return AutomationService.updateAutomation(id, { enabled });\n }\n\n static async downloadTarball(id: string, name: string): Promise<void> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/${encodeURIComponent(id)}/tarball`;\n\n let blob: Blob;\n if (active.kind === \"cloud\") {\n blob = await callCloudProxy<Blob>({\n backend: active,\n method: \"GET\",\n path,\n responseType: \"blob\",\n headers: await buildAutomationRequestHeaders(),\n });\n } else {\n const { data } = await localAutomationAxios.get<Blob>(path, {\n responseType: \"blob\",\n });\n blob = data;\n }\n\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${name}.tar`;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n static async checkHealth(): Promise<AutomationHealthResponse> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/health`;\n\n try {\n if (active.kind === \"cloud\") {\n const response = await callCloudProxy<AutomationHealthResponse>({\n backend: active,\n method: \"GET\",\n path,\n // Fail fast, matching the local branch's 5s timeout below.\n timeoutSeconds: 5,\n headers: await buildAutomationRequestHeaders(),\n });\n return response;\n }\n\n const { data } = await localAutomationAxios.get<AutomationHealthResponse>(\n path,\n { timeout: 5000 },\n );\n return data;\n } catch {\n return { status: \"error\" };\n }\n }\n}\n\nexport default AutomationService;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"automation-service.api.js","names":[],"sources":["../../../src/api/automation-service/automation-service.api.ts"],"sourcesContent":["import axios from \"axios\";\nimport {\n clearPendingLocalTelemetryRevocation,\n getTelemetryConsent,\n getTelemetryDistinctId,\n getTelemetryDistinctIdForConsentSync,\n type TelemetryConsent,\n} from \"#/services/telemetry\";\nimport type {\n Automation,\n AutomationRun,\n AutomationSpec,\n AutomationTrigger,\n AutomationsResponse,\n AutomationRunsResponse,\n} from \"#/types/automation\";\nimport { AUTOMATION_CREATE_ENDPOINT } from \"#/manifests/automation-setup\";\nimport {\n getAutomationEndpoint,\n getAutomationIdEndpoint,\n getImportExportSpec,\n} from \"#/manifests/automation-interface\";\nimport type {\n DeploymentCapabilities,\n SetupRequestBody,\n ValidateDraftResponse,\n} from \"#/manifests/types\";\nimport type { Backend, ResolvedActiveBackend } from \"../backend-registry/types\";\nimport {\n getActiveBackend,\n getEffectiveLocalBackend,\n} from \"../backend-registry/active-store\";\nimport { NoBackendAvailableError } from \"../agent-server-client-options\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport {\n AGENT_CANVAS_CLIENT_HEADERS,\n OPENHANDS_TELEMETRY_DISTINCT_ID_HEADER,\n} from \"../client-source\";\n\nconst AUTOMATION_BASE_PATH = \"/api/automation\";\n\nexport interface AutomationHealthResponse {\n status: \"ok\" | \"error\";\n message?: string;\n}\n\ntype AutomationSdkVersionResponse =\n | string\n | {\n sdk_version?: unknown;\n version?: unknown;\n };\n\n// Local automation calls go to the automation sidecar that\n// `scripts/dev-with-automation.mjs` mounts behind the local agent-server.\n// Both backends use the same session API key and the same `X-Session-API-Key`\n// header for consistency.\nconst localAutomationAxios = axios.create();\n\nasync function buildAutomationRequestHeaders(\n extraHeaders: Record<string, string> = {},\n): Promise<Record<string, string>> {\n const telemetryDistinctId = await getTelemetryDistinctId();\n return {\n ...AGENT_CANVAS_CLIENT_HEADERS,\n ...(telemetryDistinctId\n ? { [OPENHANDS_TELEMETRY_DISTINCT_ID_HEADER]: telemetryDistinctId }\n : {}),\n ...extraHeaders,\n };\n}\n\nlocalAutomationAxios.interceptors.request.use(async (config) => {\n const requestHeaders = await buildAutomationRequestHeaders();\n Object.entries(requestHeaders).forEach(([name, value]) => {\n config.headers.set(name, value);\n });\n\n // Import uses an explicit baseURL/header pair so its POST, PATCH, and\n // cleanup stay pinned to the backend selected when the mutation started.\n if (config.baseURL) return config;\n\n // Resolve the local backend on every call so it tracks the\n // currently-active local backend (and any host/key edits made via the\n // manage-backends UI), rather than freezing whatever value the\n // agent-server-config produced at module load time.\n // Using the backend registry (rather than the build-time VITE_SESSION_API_KEY\n // env var) ensures the published npm package picks up the runtime-injected\n // session key that scripts/static-server.mjs seeds into localStorage, fixing\n // the 401 errors reported in issue #829.\n const backend = getEffectiveLocalBackend();\n if (!backend) throw new NoBackendAvailableError();\n // eslint-disable-next-line no-param-reassign\n config.baseURL = backend.host;\n\n const apiKey = backend.apiKey?.trim();\n if (apiKey) {\n config.headers.set(\"X-Session-API-Key\", apiKey);\n }\n return config;\n});\n\nfunction normalizeAutomationSdkVersion(version: unknown): string | null {\n if (typeof version !== \"string\") return null;\n const trimmed = version.trim();\n return trimmed || null;\n}\n\nfunction getAutomationSdkVersionFromResponse(\n response: AutomationSdkVersionResponse,\n): string | null {\n if (typeof response === \"string\") {\n return normalizeAutomationSdkVersion(response);\n }\n return (\n normalizeAutomationSdkVersion(response.sdk_version) ??\n normalizeAutomationSdkVersion(response.version)\n );\n}\n\nfunction buildPaginationQuery(limit: number, offset: number): string {\n const params = new URLSearchParams();\n params.set(\"limit\", String(limit));\n params.set(\"offset\", String(offset));\n return params.toString();\n}\n\nfunction buildImportedTrigger(spec: AutomationSpec): AutomationTrigger {\n if (spec.trigger.type === \"event\") {\n return {\n type: \"event\",\n source: spec.trigger.source,\n on: spec.trigger.on,\n ...(spec.trigger.filter && { filter: spec.trigger.filter }),\n };\n }\n\n return {\n type: \"cron\",\n schedule: spec.trigger.schedule,\n timezone: spec.timezone ?? spec.trigger.timezone ?? \"UTC\",\n };\n}\n\nfunction generatePendingImportEvent(): string {\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return `pending.${crypto.randomUUID()}`;\n }\n return `pending.${Date.now()}.${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction buildCreateAutomationRequest(spec: AutomationSpec) {\n if (!spec.prompt) {\n throw new Error(\"An automation prompt is required for import.\");\n }\n\n const { importDefaults } = getImportExportSpec();\n const repos = spec.repository\n ? [\n {\n url: spec.repository,\n ...(spec.branch && { ref: spec.branch }),\n ...(!spec.repository.includes(\"://\") &&\n !spec.repository.startsWith(\"git@\") && {\n provider: importDefaults.repoProvider,\n }),\n },\n ]\n : undefined;\n\n return {\n path: `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\n spec.plugins?.length ? \"createPlugin\" : \"createPrompt\",\n )}`,\n body: {\n name: spec.name,\n prompt: spec.prompt,\n // Preset creation defaults to enabled. A unique event trigger keeps the\n // new record inert until the real trigger and disabled state are applied\n // together in the follow-up PATCH.\n trigger: {\n type: \"event\",\n source: importDefaults.placeholderEventSource,\n on: generatePendingImportEvent(),\n },\n ...(spec.model && { model: spec.model }),\n ...(repos && { repos }),\n ...(spec.plugins?.length && {\n plugins: spec.plugins.map((source) => ({ source })),\n }),\n ...(spec.timeout != null && { timeout: spec.timeout }),\n },\n };\n}\n\nasync function buildPinnedLocalConfig(backend: Backend) {\n const apiKey = backend.apiKey.trim();\n return {\n baseURL: backend.host,\n headers: await buildAutomationRequestHeaders(\n apiKey ? { \"X-Session-API-Key\": apiKey } : {},\n ),\n };\n}\n\nasync function buildPinnedCloudHeaders(active: ResolvedActiveBackend) {\n return buildAutomationRequestHeaders(\n active.orgId ? { \"X-Org-Id\": active.orgId } : {},\n );\n}\n\nclass AutomationService {\n static async syncTelemetryConsent(\n consent: TelemetryConsent = getTelemetryConsent(),\n ): Promise<void> {\n const active = getActiveBackend();\n if (active.backend.kind !== \"local\") return;\n\n const frontendDistinctId = await getTelemetryDistinctIdForConsentSync();\n await localAutomationAxios.post(\n `${AUTOMATION_BASE_PATH}/v1/telemetry/consent`,\n {\n consent_granted: consent === \"granted\",\n frontend_distinct_id: frontendDistinctId,\n },\n { timeout: 5000 },\n );\n if (consent !== \"granted\" && frontendDistinctId) {\n clearPendingLocalTelemetryRevocation(frontendDistinctId);\n }\n }\n\n static async getSdkVersion(): Promise<string | null> {\n const active = getActiveBackend();\n const path = `${AUTOMATION_BASE_PATH}/sdk-version`;\n\n try {\n let response: AutomationSdkVersionResponse;\n if (active.backend.kind === \"cloud\") {\n response = await callCloudProxy<AutomationSdkVersionResponse>({\n backend: active.backend,\n method: \"GET\",\n path,\n headers: await buildPinnedCloudHeaders(active),\n timeoutSeconds: 5,\n });\n } else {\n const { data } =\n await localAutomationAxios.get<AutomationSdkVersionResponse>(path, {\n timeout: 5000,\n });\n response = data;\n }\n\n return getAutomationSdkVersionFromResponse(response);\n } catch {\n return null;\n }\n }\n\n static async listAutomations(\n params: { limit?: number; offset?: number } = {},\n ): Promise<AutomationsResponse> {\n const { limit = 50, offset = 0 } = params;\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationsResponse>({\n backend: active,\n method: \"GET\",\n path: `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"list\")}?${buildPaginationQuery(limit, offset)}`,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.get<AutomationsResponse>(\n `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"list\")}`,\n { params: { limit, offset } },\n );\n return data;\n }\n\n static async getAutomations(\n limit = 50,\n offset = 0,\n ): Promise<AutomationsResponse> {\n return AutomationService.listAutomations({ limit, offset });\n }\n\n static async getAutomation(id: string): Promise<Automation> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"detail\", id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<Automation>({\n backend: active,\n method: \"GET\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.get<Automation>(path);\n return data;\n }\n\n static async createAutomation(spec: AutomationSpec): Promise<Automation> {\n const active = getActiveBackend();\n const { path, body } = buildCreateAutomationRequest(spec);\n\n let created: Automation;\n if (active.backend.kind === \"cloud\") {\n created = await callCloudProxy<Automation>({\n backend: active.backend,\n method: \"POST\",\n path,\n body,\n headers: await buildPinnedCloudHeaders(active),\n });\n } else {\n const { data } = await localAutomationAxios.post<Automation>(\n path,\n body,\n await buildPinnedLocalConfig(active.backend),\n );\n created = data;\n }\n\n const updatePath = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"detail\", created.id)}`;\n const updateBody: Partial<Automation> = {\n trigger: buildImportedTrigger(spec),\n enabled: false,\n };\n\n try {\n if (active.backend.kind === \"cloud\") {\n return await callCloudProxy<Automation>({\n backend: active.backend,\n method: \"PATCH\",\n path: updatePath,\n body: updateBody,\n headers: await buildPinnedCloudHeaders(active),\n });\n }\n\n const { data } = await localAutomationAxios.patch<Automation>(\n updatePath,\n updateBody,\n await buildPinnedLocalConfig(active.backend),\n );\n return data;\n } catch (updateError) {\n try {\n if (active.backend.kind === \"cloud\") {\n await callCloudProxy<unknown>({\n backend: active.backend,\n method: \"DELETE\",\n path: updatePath,\n headers: await buildPinnedCloudHeaders(active),\n });\n } else {\n await localAutomationAxios.delete(\n updatePath,\n await buildPinnedLocalConfig(active.backend),\n );\n }\n } catch (cleanupError) {\n throw new AggregateError(\n [updateError, cleanupError],\n \"Failed to disable the imported automation and clean it up.\",\n );\n }\n throw updateError;\n }\n }\n\n static async updateAutomation(\n id: string,\n body: Partial<Automation>,\n ): Promise<Automation> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"detail\", id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<Automation>({\n backend: active,\n method: \"PATCH\",\n path,\n body: body as Record<string, unknown>,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.patch<Automation>(path, body);\n return data;\n }\n\n static async deleteAutomation(id: string): Promise<void> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"detail\", id)}`;\n\n if (active.kind === \"cloud\") {\n await callCloudProxy<unknown>({\n backend: active,\n method: \"DELETE\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n return;\n }\n\n await localAutomationAxios.delete(path);\n }\n\n static async dispatchAutomation(id: string): Promise<AutomationRun> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"dispatch\", id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationRun>({\n backend: active,\n method: \"POST\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.post<AutomationRun>(path);\n return data;\n }\n\n static async listAutomationRuns(\n id: string,\n params: { limit?: number; offset?: number } = {},\n ): Promise<AutomationRunsResponse> {\n const { limit = 50, offset = 0 } = params;\n const active = getActiveBackend().backend;\n const basePath = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"runs\", id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationRunsResponse>({\n backend: active,\n method: \"GET\",\n path: `${basePath}?${buildPaginationQuery(limit, offset)}`,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.get<AutomationRunsResponse>(\n basePath,\n { params: { limit, offset } },\n );\n return data;\n }\n\n static async getAutomationRuns(\n id: string,\n limit = 50,\n offset = 0,\n ): Promise<AutomationRunsResponse> {\n return AutomationService.listAutomationRuns(id, { limit, offset });\n }\n\n static async toggleAutomation(\n id: string,\n enabled: boolean,\n ): Promise<Automation> {\n return AutomationService.updateAutomation(id, { enabled });\n }\n\n static async downloadTarball(id: string, name: string): Promise<void> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"tarball\", id)}`;\n\n let blob: Blob;\n if (active.kind === \"cloud\") {\n blob = await callCloudProxy<Blob>({\n backend: active,\n method: \"GET\",\n path,\n responseType: \"blob\",\n headers: await buildAutomationRequestHeaders(),\n });\n } else {\n const { data } = await localAutomationAxios.get<Blob>(path, {\n responseType: \"blob\",\n });\n blob = data;\n }\n\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${name}.tar`;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n /**\n * Ask what this deployment supports, before a setup form renders.\n *\n * The setup endpoints answer a contract authored in `OpenHands/extensions`,\n * so their bodies are camelCase where the rest of this service is snake_case.\n */\n static async getCapabilities(): Promise<DeploymentCapabilities> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"capabilities\")}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<DeploymentCapabilities>({\n backend: active,\n method: \"GET\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } =\n await localAutomationAxios.get<DeploymentCapabilities>(path);\n return data;\n }\n\n /**\n * Validate a draft without creating it. An invalid draft is a 200 carrying\n * field-addressed errors; only a malformed envelope is a 4xx.\n */\n static async validateDraft(\n body: SetupRequestBody,\n ): Promise<ValidateDraftResponse> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"validate\")}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<ValidateDraftResponse>({\n backend: active,\n method: \"POST\",\n path,\n body,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.post<ValidateDraftResponse>(\n path,\n body,\n );\n return data;\n }\n\n /**\n * Create from a draft a setup form derived. Unlike {@link\n * AutomationService.createAutomation}, which exists for import and has to\n * park the record on a placeholder trigger, this sends the finished record in\n * one request.\n */\n static async createAutomationDraft(\n body: SetupRequestBody,\n ): Promise<Record<string, unknown>> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${AUTOMATION_CREATE_ENDPOINT}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<Record<string, unknown>>({\n backend: active,\n method: \"POST\",\n path,\n body,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.post<Record<string, unknown>>(\n path,\n body,\n );\n return data;\n }\n\n static async checkHealth(): Promise<AutomationHealthResponse> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"health\")}`;\n\n try {\n if (active.kind === \"cloud\") {\n const response = await callCloudProxy<AutomationHealthResponse>({\n backend: active,\n method: \"GET\",\n path,\n // Fail fast, matching the local branch's 5s timeout below.\n timeoutSeconds: 5,\n headers: await buildAutomationRequestHeaders(),\n });\n return response;\n }\n\n const { data } = await localAutomationAxios.get<AutomationHealthResponse>(\n path,\n { timeout: 5000 },\n );\n return data;\n } catch {\n return { status: \"error\" };\n }\n }\n}\n\nexport default AutomationService;\n"],"mappings":"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"}
|
package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require("../../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../../constants/canvas-ui.cjs");var t=(e,t)=>e?e.length>t?`${e.substring(0,t)}...`:e:``,n=e=>/^[a-z][a-z0-9_]*\s*:\s*[[{]/i.test(e),r=e=>{let t=e.summary?.trim().replace(/\s+/g,` `)||``;return!t||n(t)?null:t},i=n=>{let i=r(n);if(i)return{kind:`text`,text:i};let a=n.action.kind;switch(a){case`ExecuteBashAction`:case`TerminalAction`:return{kind:`translation`,key:`ACTION_MESSAGE$RUN`,values:{command:t(n.action.command,80)}};case`FileEditorAction`:case`StrReplaceEditorAction`:return{kind:`translation`,key:n.action.command===`view`?`ACTION_MESSAGE$READ`:n.action.command===`create`?`ACTION_MESSAGE$WRITE`:`ACTION_MESSAGE$EDIT`,values:{path:n.action.path}};case`MCPToolAction`:return{kind:`translation`,key:`ACTION_MESSAGE$CALL_TOOL_MCP`,values:{mcp_tool_name:n.tool_name}};case`InvokeSkillAction`:return{kind:`translation`,key:`ACTION_MESSAGE$INVOKE_SKILL`,values:{name:n.action.name}};case`TaskAction`:return{kind:`translation`,key:`ACTION_MESSAGE$TASK`,values:{name:n.action.subagent_type}};case`ThinkAction`:return{kind:`translation`,key:`ACTION_MESSAGE$THINK`,values:{}};case`FinishAction`:return{kind:`translation`,key:`ACTION_MESSAGE$FINISH`,values:{}};case`TaskTrackerAction`:return{kind:`translation`,key:`ACTION_MESSAGE$TASK_TRACKING`,values:{}};case`GrepAction`:return{kind:`translation`,key:`ACTION_MESSAGE$GREP`,values:{pattern:n.action.pattern?t(n.action.pattern,50):``}};case`GlobAction`:return{kind:`translation`,key:`ACTION_MESSAGE$GLOB`,values:{pattern:n.action.pattern?t(n.action.pattern,50):``}};case`BrowserNavigateAction`:case`BrowserClickAction`:case`BrowserTypeAction`:case`BrowserGetStateAction`:case`BrowserGetContentAction`:case`BrowserScrollAction`:case`BrowserGoBackAction`:case`BrowserListTabsAction`:case`BrowserSwitchTabAction`:case`BrowserCloseTabAction`:return{kind:`translation`,key:`ACTION_MESSAGE$BROWSE`,values:{}};case`CanvasUIAction`:case e.CANVAS_UI_CLIENT_ACTION_KIND:return{kind:`text`,text:`CANVASUI`};default:return{kind:`text`,text:String(a).replace(`Action`,``).toUpperCase()}}};exports.getActionEventTitleDescriptor=i,exports.getActionSummaryTitle=r,exports.trimEventTitleText=t;
|
|
2
|
+
//# sourceMappingURL=get-action-event-title.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-action-event-title.cjs","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-action-event-title.ts"],"sourcesContent":["import { CANVAS_UI_CLIENT_ACTION_KIND } from \"#/constants/canvas-ui\";\nimport type { ActionEvent } from \"#/types/agent-server/core\";\n\nexport type EventTitleDescriptor =\n | {\n readonly kind: \"translation\";\n readonly key: string;\n readonly values: Readonly<Record<string, unknown>>;\n }\n | {\n readonly kind: \"text\";\n readonly text: string;\n };\n\nexport const trimEventTitleText = (text: string, maxLength: number): string => {\n if (!text) return \"\";\n return text.length > maxLength ? `${text.substring(0, maxLength)}...` : text;\n};\n\nconst isServerFallbackSummary = (summary: string): boolean =>\n /^[a-z][a-z0-9_]*\\s*:\\s*[[{]/i.test(summary);\n\nexport const getActionSummaryTitle = (event: ActionEvent): string | null => {\n const summary = event.summary?.trim().replace(/\\s+/g, \" \") || \"\";\n return !summary || isServerFallbackSummary(summary) ? null : summary;\n};\n\nexport const getActionEventTitleDescriptor = (\n event: ActionEvent,\n): EventTitleDescriptor => {\n const summary = getActionSummaryTitle(event);\n if (summary) {\n return { kind: \"text\", text: summary };\n }\n\n const actionType = event.action.kind;\n\n switch (actionType) {\n case \"ExecuteBashAction\":\n case \"TerminalAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$RUN\",\n values: { command: trimEventTitleText(event.action.command, 80) },\n };\n case \"FileEditorAction\":\n case \"StrReplaceEditorAction\": {\n const key =\n event.action.command === \"view\"\n ? \"ACTION_MESSAGE$READ\"\n : event.action.command === \"create\"\n ? \"ACTION_MESSAGE$WRITE\"\n : \"ACTION_MESSAGE$EDIT\";\n return {\n kind: \"translation\",\n key,\n values: { path: event.action.path },\n };\n }\n case \"MCPToolAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$CALL_TOOL_MCP\",\n values: { mcp_tool_name: event.tool_name },\n };\n case \"InvokeSkillAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$INVOKE_SKILL\",\n values: { name: event.action.name },\n };\n case \"TaskAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$TASK\",\n values: { name: event.action.subagent_type },\n };\n case \"ThinkAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$THINK\",\n values: {},\n };\n case \"FinishAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$FINISH\",\n values: {},\n };\n case \"TaskTrackerAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$TASK_TRACKING\",\n values: {},\n };\n case \"GrepAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$GREP\",\n values: {\n pattern: event.action.pattern\n ? trimEventTitleText(event.action.pattern, 50)\n : \"\",\n },\n };\n case \"GlobAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$GLOB\",\n values: {\n pattern: event.action.pattern\n ? trimEventTitleText(event.action.pattern, 50)\n : \"\",\n },\n };\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 return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$BROWSE\",\n values: {},\n };\n case \"CanvasUIAction\":\n case CANVAS_UI_CLIENT_ACTION_KIND:\n return { kind: \"text\", text: \"CANVASUI\" };\n default:\n return {\n kind: \"text\",\n text: String(actionType).replace(\"Action\", \"\").toUpperCase(),\n };\n }\n};\n"],"mappings":"6GAcA,IAAa,GAAsB,EAAc,IAC1C,EACE,EAAK,OAAS,EAAY,GAAG,EAAK,UAAU,EAAG,CAAS,EAAE,KAAO,EADtD,GAId,EAA2B,GAC/B,+BAA+B,KAAK,CAAO,EAEhC,EAAyB,GAAsC,CAC1E,IAAM,EAAU,EAAM,SAAS,KAAK,EAAE,QAAQ,OAAQ,GAAG,GAAK,GAC9D,MAAO,CAAC,GAAW,EAAwB,CAAO,EAAI,KAAO,CAC/D,EAEa,EACX,GACyB,CACzB,IAAM,EAAU,EAAsB,CAAK,EAC3C,GAAI,EACF,MAAO,CAAE,KAAM,OAAQ,KAAM,CAAQ,EAGvC,IAAM,EAAa,EAAM,OAAO,KAEhC,OAAQ,EAAR,CACE,IAAK,oBACL,IAAK,iBACH,MAAO,CACL,KAAM,cACN,IAAK,qBACL,OAAQ,CAAE,QAAS,EAAmB,EAAM,OAAO,QAAS,EAAE,CAAE,CAClE,EACF,IAAK,mBACL,IAAK,yBAOH,MAAO,CACL,KAAM,cACN,IAPA,EAAM,OAAO,UAAY,OACrB,sBACA,EAAM,OAAO,UAAY,SACvB,uBACA,sBAIN,OAAQ,CAAE,KAAM,EAAM,OAAO,IAAK,CACpC,EAEF,IAAK,gBACH,MAAO,CACL,KAAM,cACN,IAAK,+BACL,OAAQ,CAAE,cAAe,EAAM,SAAU,CAC3C,EACF,IAAK,oBACH,MAAO,CACL,KAAM,cACN,IAAK,8BACL,OAAQ,CAAE,KAAM,EAAM,OAAO,IAAK,CACpC,EACF,IAAK,aACH,MAAO,CACL,KAAM,cACN,IAAK,sBACL,OAAQ,CAAE,KAAM,EAAM,OAAO,aAAc,CAC7C,EACF,IAAK,cACH,MAAO,CACL,KAAM,cACN,IAAK,uBACL,OAAQ,CAAC,CACX,EACF,IAAK,eACH,MAAO,CACL,KAAM,cACN,IAAK,wBACL,OAAQ,CAAC,CACX,EACF,IAAK,oBACH,MAAO,CACL,KAAM,cACN,IAAK,+BACL,OAAQ,CAAC,CACX,EACF,IAAK,aACH,MAAO,CACL,KAAM,cACN,IAAK,sBACL,OAAQ,CACN,QAAS,EAAM,OAAO,QAClB,EAAmB,EAAM,OAAO,QAAS,EAAE,EAC3C,EACN,CACF,EACF,IAAK,aACH,MAAO,CACL,KAAM,cACN,IAAK,sBACL,OAAQ,CACN,QAAS,EAAM,OAAO,QAClB,EAAmB,EAAM,OAAO,QAAS,EAAE,EAC3C,EACN,CACF,EACF,IAAK,wBACL,IAAK,qBACL,IAAK,oBACL,IAAK,wBACL,IAAK,0BACL,IAAK,sBACL,IAAK,sBACL,IAAK,wBACL,IAAK,yBACL,IAAK,wBACH,MAAO,CACL,KAAM,cACN,IAAK,wBACL,OAAQ,CAAC,CACX,EACF,IAAK,iBACL,KAAK,EAAA,6BACH,MAAO,CAAE,KAAM,OAAQ,KAAM,UAAW,EAC1C,QACE,MAAO,CACL,KAAM,OACN,KAAM,OAAO,CAAU,EAAE,QAAQ,SAAU,EAAE,EAAE,YAAY,CAC7D,CACJ,CACF"}
|
package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ActionEvent } from "#/types/agent-server/core";
|
|
2
|
+
export type EventTitleDescriptor = {
|
|
3
|
+
readonly kind: "translation";
|
|
4
|
+
readonly key: string;
|
|
5
|
+
readonly values: Readonly<Record<string, unknown>>;
|
|
6
|
+
} | {
|
|
7
|
+
readonly kind: "text";
|
|
8
|
+
readonly text: string;
|
|
9
|
+
};
|
|
10
|
+
export declare const trimEventTitleText: (text: string, maxLength: number) => string;
|
|
11
|
+
export declare const getActionSummaryTitle: (event: ActionEvent) => string | null;
|
|
12
|
+
export declare const getActionEventTitleDescriptor: (event: ActionEvent) => EventTitleDescriptor;
|
package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { CANVAS_UI_CLIENT_ACTION_KIND as e } from "../../../../constants/canvas-ui.js";
|
|
2
|
+
//#region src/components/conversation-events/chat/event-content-helpers/get-action-event-title.ts
|
|
3
|
+
var t = (e, t) => e ? e.length > t ? `${e.substring(0, t)}...` : e : "", n = (e) => /^[a-z][a-z0-9_]*\s*:\s*[[{]/i.test(e), r = (e) => {
|
|
4
|
+
let t = e.summary?.trim().replace(/\s+/g, " ") || "";
|
|
5
|
+
return !t || n(t) ? null : t;
|
|
6
|
+
}, i = (n) => {
|
|
7
|
+
let i = r(n);
|
|
8
|
+
if (i) return {
|
|
9
|
+
kind: "text",
|
|
10
|
+
text: i
|
|
11
|
+
};
|
|
12
|
+
let a = n.action.kind;
|
|
13
|
+
switch (a) {
|
|
14
|
+
case "ExecuteBashAction":
|
|
15
|
+
case "TerminalAction": return {
|
|
16
|
+
kind: "translation",
|
|
17
|
+
key: "ACTION_MESSAGE$RUN",
|
|
18
|
+
values: { command: t(n.action.command, 80) }
|
|
19
|
+
};
|
|
20
|
+
case "FileEditorAction":
|
|
21
|
+
case "StrReplaceEditorAction": return {
|
|
22
|
+
kind: "translation",
|
|
23
|
+
key: n.action.command === "view" ? "ACTION_MESSAGE$READ" : n.action.command === "create" ? "ACTION_MESSAGE$WRITE" : "ACTION_MESSAGE$EDIT",
|
|
24
|
+
values: { path: n.action.path }
|
|
25
|
+
};
|
|
26
|
+
case "MCPToolAction": return {
|
|
27
|
+
kind: "translation",
|
|
28
|
+
key: "ACTION_MESSAGE$CALL_TOOL_MCP",
|
|
29
|
+
values: { mcp_tool_name: n.tool_name }
|
|
30
|
+
};
|
|
31
|
+
case "InvokeSkillAction": return {
|
|
32
|
+
kind: "translation",
|
|
33
|
+
key: "ACTION_MESSAGE$INVOKE_SKILL",
|
|
34
|
+
values: { name: n.action.name }
|
|
35
|
+
};
|
|
36
|
+
case "TaskAction": return {
|
|
37
|
+
kind: "translation",
|
|
38
|
+
key: "ACTION_MESSAGE$TASK",
|
|
39
|
+
values: { name: n.action.subagent_type }
|
|
40
|
+
};
|
|
41
|
+
case "ThinkAction": return {
|
|
42
|
+
kind: "translation",
|
|
43
|
+
key: "ACTION_MESSAGE$THINK",
|
|
44
|
+
values: {}
|
|
45
|
+
};
|
|
46
|
+
case "FinishAction": return {
|
|
47
|
+
kind: "translation",
|
|
48
|
+
key: "ACTION_MESSAGE$FINISH",
|
|
49
|
+
values: {}
|
|
50
|
+
};
|
|
51
|
+
case "TaskTrackerAction": return {
|
|
52
|
+
kind: "translation",
|
|
53
|
+
key: "ACTION_MESSAGE$TASK_TRACKING",
|
|
54
|
+
values: {}
|
|
55
|
+
};
|
|
56
|
+
case "GrepAction": return {
|
|
57
|
+
kind: "translation",
|
|
58
|
+
key: "ACTION_MESSAGE$GREP",
|
|
59
|
+
values: { pattern: n.action.pattern ? t(n.action.pattern, 50) : "" }
|
|
60
|
+
};
|
|
61
|
+
case "GlobAction": return {
|
|
62
|
+
kind: "translation",
|
|
63
|
+
key: "ACTION_MESSAGE$GLOB",
|
|
64
|
+
values: { pattern: n.action.pattern ? t(n.action.pattern, 50) : "" }
|
|
65
|
+
};
|
|
66
|
+
case "BrowserNavigateAction":
|
|
67
|
+
case "BrowserClickAction":
|
|
68
|
+
case "BrowserTypeAction":
|
|
69
|
+
case "BrowserGetStateAction":
|
|
70
|
+
case "BrowserGetContentAction":
|
|
71
|
+
case "BrowserScrollAction":
|
|
72
|
+
case "BrowserGoBackAction":
|
|
73
|
+
case "BrowserListTabsAction":
|
|
74
|
+
case "BrowserSwitchTabAction":
|
|
75
|
+
case "BrowserCloseTabAction": return {
|
|
76
|
+
kind: "translation",
|
|
77
|
+
key: "ACTION_MESSAGE$BROWSE",
|
|
78
|
+
values: {}
|
|
79
|
+
};
|
|
80
|
+
case "CanvasUIAction":
|
|
81
|
+
case e: return {
|
|
82
|
+
kind: "text",
|
|
83
|
+
text: "CANVASUI"
|
|
84
|
+
};
|
|
85
|
+
default: return {
|
|
86
|
+
kind: "text",
|
|
87
|
+
text: String(a).replace("Action", "").toUpperCase()
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
//#endregion
|
|
92
|
+
export { i as getActionEventTitleDescriptor, r as getActionSummaryTitle, t as trimEventTitleText };
|
|
93
|
+
|
|
94
|
+
//# sourceMappingURL=get-action-event-title.js.map
|
package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-action-event-title.js","names":[],"sources":["../../../../../src/components/conversation-events/chat/event-content-helpers/get-action-event-title.ts"],"sourcesContent":["import { CANVAS_UI_CLIENT_ACTION_KIND } from \"#/constants/canvas-ui\";\nimport type { ActionEvent } from \"#/types/agent-server/core\";\n\nexport type EventTitleDescriptor =\n | {\n readonly kind: \"translation\";\n readonly key: string;\n readonly values: Readonly<Record<string, unknown>>;\n }\n | {\n readonly kind: \"text\";\n readonly text: string;\n };\n\nexport const trimEventTitleText = (text: string, maxLength: number): string => {\n if (!text) return \"\";\n return text.length > maxLength ? `${text.substring(0, maxLength)}...` : text;\n};\n\nconst isServerFallbackSummary = (summary: string): boolean =>\n /^[a-z][a-z0-9_]*\\s*:\\s*[[{]/i.test(summary);\n\nexport const getActionSummaryTitle = (event: ActionEvent): string | null => {\n const summary = event.summary?.trim().replace(/\\s+/g, \" \") || \"\";\n return !summary || isServerFallbackSummary(summary) ? null : summary;\n};\n\nexport const getActionEventTitleDescriptor = (\n event: ActionEvent,\n): EventTitleDescriptor => {\n const summary = getActionSummaryTitle(event);\n if (summary) {\n return { kind: \"text\", text: summary };\n }\n\n const actionType = event.action.kind;\n\n switch (actionType) {\n case \"ExecuteBashAction\":\n case \"TerminalAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$RUN\",\n values: { command: trimEventTitleText(event.action.command, 80) },\n };\n case \"FileEditorAction\":\n case \"StrReplaceEditorAction\": {\n const key =\n event.action.command === \"view\"\n ? \"ACTION_MESSAGE$READ\"\n : event.action.command === \"create\"\n ? \"ACTION_MESSAGE$WRITE\"\n : \"ACTION_MESSAGE$EDIT\";\n return {\n kind: \"translation\",\n key,\n values: { path: event.action.path },\n };\n }\n case \"MCPToolAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$CALL_TOOL_MCP\",\n values: { mcp_tool_name: event.tool_name },\n };\n case \"InvokeSkillAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$INVOKE_SKILL\",\n values: { name: event.action.name },\n };\n case \"TaskAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$TASK\",\n values: { name: event.action.subagent_type },\n };\n case \"ThinkAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$THINK\",\n values: {},\n };\n case \"FinishAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$FINISH\",\n values: {},\n };\n case \"TaskTrackerAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$TASK_TRACKING\",\n values: {},\n };\n case \"GrepAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$GREP\",\n values: {\n pattern: event.action.pattern\n ? trimEventTitleText(event.action.pattern, 50)\n : \"\",\n },\n };\n case \"GlobAction\":\n return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$GLOB\",\n values: {\n pattern: event.action.pattern\n ? trimEventTitleText(event.action.pattern, 50)\n : \"\",\n },\n };\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 return {\n kind: \"translation\",\n key: \"ACTION_MESSAGE$BROWSE\",\n values: {},\n };\n case \"CanvasUIAction\":\n case CANVAS_UI_CLIENT_ACTION_KIND:\n return { kind: \"text\", text: \"CANVASUI\" };\n default:\n return {\n kind: \"text\",\n text: String(actionType).replace(\"Action\", \"\").toUpperCase(),\n };\n }\n};\n"],"mappings":";;AAcA,IAAa,KAAsB,GAAc,MAC1C,IACE,EAAK,SAAS,IAAY,GAAG,EAAK,UAAU,GAAG,CAAS,EAAE,OAAO,IADtD,IAId,KAA2B,MAC/B,+BAA+B,KAAK,CAAO,GAEhC,KAAyB,MAAsC;CAC1E,IAAM,IAAU,EAAM,SAAS,KAAK,EAAE,QAAQ,QAAQ,GAAG,KAAK;CAC9D,OAAO,CAAC,KAAW,EAAwB,CAAO,IAAI,OAAO;AAC/D,GAEa,KACX,MACyB;CACzB,IAAM,IAAU,EAAsB,CAAK;CAC3C,IAAI,GACF,OAAO;EAAE,MAAM;EAAQ,MAAM;CAAQ;CAGvC,IAAM,IAAa,EAAM,OAAO;CAEhC,QAAQ,GAAR;EACE,KAAK;EACL,KAAK,kBACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,EAAE,SAAS,EAAmB,EAAM,OAAO,SAAS,EAAE,EAAE;EAClE;EACF,KAAK;EACL,KAAK,0BAOH,OAAO;GACL,MAAM;GACN,KAPA,EAAM,OAAO,YAAY,SACrB,wBACA,EAAM,OAAO,YAAY,WACvB,yBACA;GAIN,QAAQ,EAAE,MAAM,EAAM,OAAO,KAAK;EACpC;EAEF,KAAK,iBACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,EAAE,eAAe,EAAM,UAAU;EAC3C;EACF,KAAK,qBACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,EAAE,MAAM,EAAM,OAAO,KAAK;EACpC;EACF,KAAK,cACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,EAAE,MAAM,EAAM,OAAO,cAAc;EAC7C;EACF,KAAK,eACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,CAAC;EACX;EACF,KAAK,gBACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,CAAC;EACX;EACF,KAAK,qBACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,CAAC;EACX;EACF,KAAK,cACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,EACN,SAAS,EAAM,OAAO,UAClB,EAAmB,EAAM,OAAO,SAAS,EAAE,IAC3C,GACN;EACF;EACF,KAAK,cACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,EACN,SAAS,EAAM,OAAO,UAClB,EAAmB,EAAM,OAAO,SAAS,EAAE,IAC3C,GACN;EACF;EACF,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,yBACH,OAAO;GACL,MAAM;GACN,KAAK;GACL,QAAQ,CAAC;EACX;EACF,KAAK;EACL,KAAK,GACH,OAAO;GAAE,MAAM;GAAQ,MAAM;EAAW;EAC1C,SACE,OAAO;GACL,MAAM;GACN,MAAM,OAAO,CAAU,EAAE,QAAQ,UAAU,EAAE,EAAE,YAAY;EAC7D;CACJ;AACF"}
|
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
|