@openhands/agent-canvas 1.7.2 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/README.windows.md +2 -2
- package/build/assets/{Trans-DP5rcauH.js → Trans-Bwpzk1wT.js} +1 -1
- package/build/assets/{acp-providers-BHKZvEm5.js → acp-providers-C921BlYB.js} +1 -1
- package/build/assets/active-backend-context-BiwzkzDy.js +2 -0
- package/build/assets/agent-context-settings-DXNT_dcw.js +1 -0
- package/build/assets/agent-profiles-settings-BymJf3EP.js +1 -0
- package/build/assets/agent-server-conversation-service.api-CYSWw-2g.js +41 -0
- package/build/assets/agent-settings-BjgQQe-_.js +1 -0
- package/build/assets/{agent-settings-BIOsUglV.js → agent-settings-WzqXk6B4.js} +2 -2
- package/build/assets/{alert-banner-C1nzoXBC.js → alert-banner-DR8EVyZM.js} +1 -1
- package/build/assets/api-error-message-e16L1kwH.js +1 -0
- package/build/assets/api-key-entry-screen-DI0I04O3.js +1 -0
- package/build/assets/app-settings-DGistSFV.js +1 -0
- package/build/assets/automation-C_eCrGyP.js +1 -0
- package/build/assets/automation-detail-DY6x2FW1.js +2 -0
- package/build/assets/automation-export-C09f-Lua.js +2 -0
- package/build/assets/automation-setup-route-CqKp0717.js +1 -0
- package/build/assets/automations-list-CqWJ7qXW.js +1 -0
- package/build/assets/{back-nav-button-Be_L157B.js → back-nav-button-D4ngzpSh.js} +1 -1
- package/build/assets/backend-form-modal-B8D5hBzK.js +1 -0
- package/build/assets/{backend-synced-settings-badge-BNpEylNP.js → backend-synced-settings-badge-BnzI8Ysj.js} +1 -1
- package/build/assets/{badge-DwgrwohM.js → badge-1Mf1iPcX.js} +1 -1
- package/build/assets/{base-modal-CSHhJTSr.js → base-modal-BBuy0WQQ.js} +1 -1
- package/build/assets/{brand-button-CQO8oqVo.js → brand-button-DGN6Y9o6.js} +1 -1
- package/build/assets/browser-D_ekTlTS.js +6 -0
- package/build/assets/{browser-tab-CEApjoEV.js → browser-tab-D4a4Ou_w.js} +1 -1
- package/build/assets/{chat-send-button-D4614wUz.js → chat-send-button-CgbcjD97.js} +1 -1
- package/build/assets/check-CPLXgluF.js +1 -0
- package/build/assets/chevron-down-CP4QHvyc.js +1 -0
- package/build/assets/circle-check-Dpy2_xSI.js +1 -0
- package/build/assets/{circle-plus-check-toggle-E3Ecb_gg.js → circle-plus-check-toggle-yTAS-nX3.js} +1 -1
- package/build/assets/cloud-funnel-analytics-CEOl5Gxr.js +1 -0
- package/build/assets/{combobox-caret-C8_eGdp2.js → combobox-caret-Bd2yySnF.js} +1 -1
- package/build/assets/command-menu-Bj6X4ckE.js +1 -0
- package/build/assets/condenser-settings-EAXQNR2E.js +1 -0
- package/build/assets/{confirmation-modal-gZtbojCm.js → confirmation-modal-NCUPr2-O.js} +1 -1
- package/build/assets/{context-menu-list-item-BTHGFhIx.js → context-menu-list-item-CrCrYuPF.js} +1 -1
- package/build/assets/conversation-BzyIcSwr.js +1 -0
- package/build/assets/conversation-CUJ0Vo8g.js +90 -0
- package/build/assets/conversation-panel-BzyIcSwr.js +1 -0
- package/build/assets/conversation-state-store-F62HvuI1.js +1 -0
- package/build/assets/{conversation-tab-empty-state-BCMHkGQk.js → conversation-tab-empty-state-BCZ7rUMH.js} +1 -1
- package/build/assets/{copy-B8Y5ufoR.js → copy-DCmZtz6n.js} +1 -1
- package/build/assets/{copy-to-clipboard-button-C4l3CMSd.js → copy-to-clipboard-button-D_Lp6-Fl.js} +1 -1
- package/build/assets/{device-verify-C_M7Z8xs.js → device-verify-DLmolX8Q.js} +1 -1
- package/build/assets/{dropdown-classes-DQlj-MpS.js → dropdown-classes-BB8rzqXL.js} +1 -1
- package/build/assets/{entry.client-DETaouwO.js → entry.client-BbIYOsIg.js} +2 -2
- package/build/assets/{enum-filter-dropdown-paB-lFSP.js → enum-filter-dropdown-C08-srev.js} +1 -1
- package/build/assets/{environment-switch-overlay-D0FgCMqs.js → environment-switch-overlay-BepBBX66.js} +1 -1
- package/build/assets/extensions-hub-R3KNv-5V.js +1 -0
- package/build/assets/extensions-navigation-CfWFmI1I.js +1 -0
- package/build/assets/{external-link-Cnnd6ikC.js → external-link-BdBSg8rk.js} +1 -1
- package/build/assets/files-tab-DEq8MbHu.js +1 -0
- package/build/assets/{form-control-classes-CSPevi7c.js → form-control-classes-DAfsCJTe.js} +1 -1
- package/build/assets/{format-time-delta-DuhE50B-.js → format-time-delta-CxfPJpzC.js} +1 -1
- package/build/assets/git-provider-icon-BZqqUPlm.js +1 -0
- package/build/assets/git-repo-dropdown-9WKINV6J.js +1 -0
- package/build/assets/git-repo-dropdown-DEpOwUez.js +1 -0
- package/build/assets/{highlighted-source-view-suUKd5if.js → highlighted-source-view-CX9oIoVT.js} +1 -1
- package/build/assets/home-CY0JaxiY.js +1 -0
- package/build/assets/home-CaNWlVvB.js +1 -0
- package/build/assets/home-store-Ch1ErdBc.js +1 -0
- package/build/assets/index-home-CaNWlVvB.js +1 -0
- package/build/assets/info-CmWQXtRQ.js +1 -0
- package/build/assets/install-server-modal-BWrudmZU.js +1 -0
- package/build/assets/{launch-Ccnhte5b.js → launch-B1POpHuP.js} +1 -1
- package/build/assets/{list-todo-_BXQzOiB.js → list-todo-DtiL3lTp.js} +1 -1
- package/build/assets/llm-not-configured-banner-3tMsM4K6.js +27 -0
- package/build/assets/llm-settings-CXo8iPNW.js +1 -0
- package/build/assets/llm-settings-D0W8mJDk.js +1 -0
- package/build/assets/{llm-subscription-service-W5BprsNA.js → llm-subscription-service-DBJbfd8Z.js} +1 -1
- package/build/assets/loader-circle-B4QDBARx.js +1 -0
- package/build/assets/{loading-spinner-CcpnCr_d.js → loading-spinner-DfZ_bhV7.js} +1 -1
- package/build/assets/manage-backends-modal-CwyWsiag.js +1 -0
- package/build/assets/manifest-39f4789d.js +1 -0
- package/build/assets/{markdown-renderer-CvOO0YIr.js → markdown-renderer-DgiLLhW6.js} +6 -6
- package/build/assets/mcp-DXG9LWrI.js +9 -0
- package/build/assets/mcp-marketplace-utils-DFmhKc5s.js +1 -0
- package/build/assets/messages-kBjKaAeA.js +40 -0
- package/build/assets/{modal-body-DQhiw-AR.js → modal-body-CMsDpalT.js} +1 -1
- package/build/assets/{modal-classes-YaEEa5eZ.js → modal-classes-B6PDrxXo.js} +1 -1
- package/build/assets/{modal-close-button-turIYn0t.js → modal-close-button-DyxBZaAb.js} +1 -1
- package/build/assets/{onboarding-BegDrOKn.js → onboarding-47hh2IHA.js} +1 -1
- package/build/assets/onboarding-modal-9BuvvROo.js +1 -0
- package/build/assets/organization-service.api-UDy63-oC.js +1 -0
- package/build/assets/{pencil-8_lvWDoZ.js → pencil-BjgtZmWp.js} +1 -1
- package/build/assets/{planner-tab-w6HT0N_A.js → planner-tab-BWk8885v.js} +1 -1
- package/build/assets/plugins-management-service-CjkgF2dd.js +1 -0
- package/build/assets/plus-DrKuuvMe.js +1 -0
- package/build/assets/profiles-service.api-CukSFLzz.js +1 -0
- package/build/assets/providers-CqUWC85T.js +1 -0
- package/build/assets/proxy-BBUG3sd2.js +1 -0
- package/build/assets/{puzzle-DXWdfaa7.js → puzzle-BoNc6zZ8.js} +1 -1
- package/build/assets/recommended-automations-launcher-ejxy1P27.js +1 -0
- package/build/assets/{refresh-cw-D7CYLy-d.js → refresh-cw-BrM5ZAZD.js} +1 -1
- package/build/assets/root-5S-M8SYa.js +2 -0
- package/build/assets/root-DZ39lS5f.css +1 -0
- package/build/assets/root-layout-BPqoa0gv.js +3 -0
- package/build/assets/schema-field-nImDoY6-.js +1 -0
- package/build/assets/{sdk-section-page-BW-i45yr.js → sdk-section-page-BxMrtUNV.js} +1 -1
- package/build/assets/search-Dc2qR4O2.js +1 -0
- package/build/assets/secrets-service-Dhjh3HhH.js +1 -0
- package/build/assets/{secrets-settings-D7U1ErCH.js → secrets-settings-CPdxceT_.js} +1 -1
- package/build/assets/segmented-toggle-Do6oyepX.js +1 -0
- package/build/assets/settings-BRbnfKEm.js +1 -0
- package/build/assets/{settings-dropdown-input-Dx6vlkgf.js → settings-dropdown-input-DYCULKpp.js} +1 -1
- package/build/assets/{settings-index-COAdxm2Q.js → settings-index-C9o2NBO0.js} +1 -1
- package/build/assets/settings-input-B-q2gkVy.js +1 -0
- package/build/assets/{settings-list-classes-gQdBahdt.js → settings-list-classes-WpQi0q1L.js} +1 -1
- package/build/assets/{settings-modal-CFnbQ8_4.js → settings-modal-CEK0AIx6.js} +1 -1
- package/build/assets/settings-service.api-CZiPD8__.js +1 -0
- package/build/assets/{settings-switch-UNSf8K8I.js → settings-switch-LqKdGxHL.js} +1 -1
- package/build/assets/shared-conversation-Bu-dQlgp.js +1 -0
- package/build/assets/{sidebar-layout-DXHtbEj1.js → sidebar-layout-oHBGQmLh.js} +1 -1
- package/build/assets/{sidebar-mobile-menu-toggle-U78hQRJ1.js → sidebar-mobile-menu-toggle-ND-hgygu.js} +1 -1
- package/build/assets/{sidebar-nav-link-pvUivfK2.js → sidebar-nav-link-CrujNA09.js} +1 -1
- package/build/assets/{sidebar-store-DwrYKwYr.js → sidebar-store-Bui-WNEr.js} +1 -1
- package/build/assets/{skill-card-pill-row-D7XCz5uk.js → skill-card-pill-row-CZBI7OqH.js} +1 -1
- package/build/assets/{skill-icon-badge-HqBWZ2Eq.js → skill-icon-badge-BOov_phZ.js} +1 -1
- package/build/assets/{skills-plugins-BPhaNpfx.js → skills-plugins-D0PiHWAD.js} +1 -1
- package/build/assets/{skills-settings-CcwMtnnJ.js → skills-settings-B43KArIz.js} +2 -2
- package/build/assets/{styled-tooltip-DsjDnR_W.js → styled-tooltip-C7grwnOX.js} +1 -1
- package/build/assets/{task-list-tab-BmaTwjaS.js → task-list-tab-R3ac6m7O.js} +1 -1
- package/build/assets/{terminal-BRcoba5B.js → terminal-yqkNdEAx.js} +1 -1
- package/build/assets/{toggle-switch-BptY3XRG.js → toggle-switch-BeSrbgCg.js} +1 -1
- package/build/assets/{trash-2-Bq4lHbTB.js → trash-2-wW5TWcdN.js} +1 -1
- package/build/assets/{typography-C6fuRTTT.js → typography-iYhzLlHO.js} +1 -1
- package/build/assets/{use-acp-credential-form-B0_pZ_uS.js → use-acp-credential-form-DUxbxmbq.js} +1 -1
- package/build/assets/use-activate-agent-profile-CDHA52tC.js +1 -0
- package/build/assets/use-agent-profiles-TsOdIyw5.js +1 -0
- package/build/assets/{use-can-manage-org-profiles-CrG1km7R.js → use-can-manage-org-profiles-Bt1M71u5.js} +1 -1
- package/build/assets/use-cloud-current-user-id-DWt7HCgf.js +1 -0
- package/build/assets/{use-config-Csy8EAP9.js → use-config-CxlEdf_v.js} +1 -1
- package/build/assets/{use-create-conversation-Dsa4nzU9.js → use-create-conversation-nOJ6Um5h.js} +1 -1
- package/build/assets/{use-create-secret-BnxuAjDt.js → use-create-secret-Dj5ang9x.js} +1 -1
- package/build/assets/use-is-authed-BT7Iud4U.js +1 -0
- package/build/assets/{use-is-creating-conversation-CIAcnd8M.js → use-is-creating-conversation-CAggrM75.js} +1 -1
- package/build/assets/use-llm-profiles-2Wc2db8u.js +1 -0
- package/build/assets/use-onboarding-completion-gxQlcEy2.js +1 -0
- package/build/assets/use-plugins-marketplace-CVO7sXYR.js +1 -0
- package/build/assets/use-save-agent-profile-D0wC5ExW.js +1 -0
- package/build/assets/{use-save-settings-BRh9p_fv.js → use-save-settings-L3aMaDeS.js} +1 -1
- package/build/assets/use-settings-8nt3DGxW.js +1 -0
- package/build/assets/use-settings-nav-items-DHAAD-zk.js +16 -0
- package/build/assets/use-skills-CE6miQ3r.js +1 -0
- package/build/assets/use-tracking-BGboadaZ.js +68 -0
- package/build/assets/{use-user-conversation-GnGhs_Ob.js → use-user-conversation-BIIpGUgM.js} +1 -1
- package/build/assets/useInfiniteQuery-BLRVmVPU.js +1 -0
- package/build/assets/{useMutation-DyQXZFEF.js → useMutation-CaSHLnX0.js} +1 -1
- package/build/assets/{useQueries-B3T1a7qt.js → useQueries--d_WWAzc.js} +1 -1
- package/build/assets/{useQuery-B38jBavx.js → useQuery-DiPh8LRJ.js} +1 -1
- package/build/assets/utils-BgGG1znF.js +1 -0
- package/build/assets/{vendor~browser-CIoZCqGs.js → vendor~browser-IVYgIgG1.js} +1 -1
- package/build/assets/{vendor~entry.client-Di4qO77Y.js → vendor~entry.client-BcYIVQvB.js} +1 -1
- package/build/assets/{vendor~entry.client-BfviqoVc.js → vendor~entry.client-CXM9oiAk.js} +1 -1
- package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~g4xrpilz-CJ7amdtQ.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0bpqexo-CbTboogo.js} +2 -2
- package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~f9xdmd0z-DLMP7bZx.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~d4by102p-C2f0ZhS-.js} +1 -1
- package/build/assets/{vendor~files-tab-vm3f67Pz.js → vendor~files-tab-C7RmQJwN.js} +1 -1
- package/build/assets/{vendor~index-home~home~conversation-panel~conversation-kX4LrGQC.js → vendor~index-home~home~conversation-panel~conversation-Bqp1ZqJM.js} +1 -1
- package/build/assets/{vendor~root-layout~conversation-panel~conversation-DpA6fir3.js → vendor~root-layout~conversation-panel~conversation-BCn8lzeG.js} +1 -1
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~automation-setup-route-B_L-gcOG.js +1 -0
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-sjx0x5ac.js +1 -0
- package/build/assets/vendor~root-layout~index-home~home~mcp~automations-list~automation-setup-route~onboarding-modal-D7IDevqN.js +1 -0
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~bi2r7bko-Bw4AuHN1.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~dfc8ddxy-tTyxnjXT.js} +1 -1
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hakxo2tj-ClV0p9g3.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gy8zbn65-CGt6bWRT.js} +1 -1
- package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~launch~skills-settings~a~eywn6ulz-BKxxr74w.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~dufan6ng-Dtdw8H0q.js} +17 -4
- package/build/assets/{verification-settings-CaCzojbc.js → verification-settings-DBsnSXC3.js} +1 -1
- package/build/assets/x-omAzpXkl.js +1 -0
- package/build/favicon-16x16.png +0 -0
- package/build/favicon-32x32.png +0 -0
- package/build/favicon.ico +0 -0
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +39 -2
- package/build/locales/ca/openhands.json +39 -2
- package/build/locales/de/openhands.json +39 -2
- package/build/locales/en/openhands.json +40 -3
- package/build/locales/es/openhands.json +39 -2
- package/build/locales/fr/openhands.json +39 -2
- package/build/locales/it/openhands.json +39 -2
- package/build/locales/ja/openhands.json +39 -2
- package/build/locales/ko-KR/openhands.json +39 -2
- package/build/locales/no/openhands.json +39 -2
- package/build/locales/pt/openhands.json +39 -2
- package/build/locales/tr/openhands.json +39 -2
- package/build/locales/uk/openhands.json +39 -2
- package/build/locales/zh-CN/openhands.json +39 -2
- package/build/locales/zh-TW/openhands.json +39 -2
- package/config/defaults.json +4 -4
- package/dist/api/agent-server-adapter.cjs +3 -3
- package/dist/api/agent-server-adapter.cjs.map +1 -1
- package/dist/api/agent-server-adapter.d.ts +46 -6
- package/dist/api/agent-server-adapter.js +187 -168
- package/dist/api/agent-server-adapter.js.map +1 -1
- package/dist/api/agent-server-compatibility.cjs +1 -1
- package/dist/api/agent-server-compatibility.cjs.map +1 -1
- package/dist/api/agent-server-compatibility.d.ts +4 -0
- package/dist/api/agent-server-compatibility.js +41 -38
- package/dist/api/agent-server-compatibility.js.map +1 -1
- package/dist/api/automation-service/automation-service.api.cjs +1 -1
- package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
- package/dist/api/automation-service/automation-service.api.d.ts +20 -0
- package/dist/api/automation-service/automation-service.api.js +136 -99
- package/dist/api/automation-service/automation-service.api.js.map +1 -1
- package/dist/api/backend-registry/storage.cjs +1 -1
- package/dist/api/backend-registry/storage.cjs.map +1 -1
- package/dist/api/backend-registry/storage.js +1 -1
- package/dist/api/backend-registry/storage.js.map +1 -1
- package/dist/api/backend-registry/types.d.ts +2 -0
- package/dist/api/cloud/conversation-service.api.cjs +1 -1
- package/dist/api/cloud/conversation-service.api.js +22 -22
- package/dist/api/mcp-service/mcp-service.api.cjs +1 -1
- package/dist/api/mcp-service/mcp-service.api.cjs.map +1 -1
- package/dist/api/mcp-service/mcp-service.api.js +19 -19
- package/dist/api/mcp-service/mcp-service.api.js.map +1 -1
- package/dist/api/settings-service/settings-service.api.cjs +1 -1
- package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
- package/dist/api/settings-service/settings-service.api.js +26 -12
- package/dist/api/settings-service/settings-service.api.js.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs +2 -0
- package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs.map +1 -0
- package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.d.ts +12 -0
- package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js +94 -0
- package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js.map +1 -0
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +31 -90
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
- package/dist/components/features/automations/recommended-automations-launcher.d.ts +0 -7
- package/dist/components/features/automations/recommended-automations-section.d.ts +0 -6
- package/dist/components/features/backends/backend-form-modal.cjs +1 -1
- package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
- package/dist/components/features/backends/backend-form-modal.js +568 -358
- package/dist/components/features/backends/backend-form-modal.js.map +1 -1
- package/dist/components/features/backends/device-flow-auth.cjs +1 -1
- package/dist/components/features/backends/device-flow-auth.cjs.map +1 -1
- package/dist/components/features/backends/device-flow-auth.d.ts +9 -1
- package/dist/components/features/backends/device-flow-auth.js +56 -55
- package/dist/components/features/backends/device-flow-auth.js.map +1 -1
- package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
- package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
- package/dist/components/features/backends/manage-backends-modal.js +1 -1
- package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
- package/dist/components/features/chat/chat-interface.cjs +1 -1
- package/dist/components/features/chat/chat-interface.cjs.map +1 -1
- package/dist/components/features/chat/chat-interface.js +105 -105
- package/dist/components/features/chat/chat-interface.js.map +1 -1
- package/dist/components/features/chat/chat-message.cjs +1 -1
- package/dist/components/features/chat/chat-message.cjs.map +1 -1
- package/dist/components/features/chat/chat-message.d.ts +2 -1
- package/dist/components/features/chat/chat-message.js +59 -49
- package/dist/components/features/chat/chat-message.js.map +1 -1
- package/dist/components/features/chat/pending-user-messages.cjs +1 -1
- package/dist/components/features/chat/pending-user-messages.cjs.map +1 -1
- package/dist/components/features/chat/pending-user-messages.js +4 -1
- package/dist/components/features/chat/pending-user-messages.js.map +1 -1
- package/dist/components/features/chat/typing-indicator.cjs +1 -1
- package/dist/components/features/chat/typing-indicator.cjs.map +1 -1
- package/dist/components/features/chat/typing-indicator.d.ts +8 -1
- package/dist/components/features/chat/typing-indicator.js +94 -10
- package/dist/components/features/chat/typing-indicator.js.map +1 -1
- package/dist/components/features/command-menu/command-menu-items.d.ts +5 -1
- package/dist/components/features/files-tab/segmented-toggle.cjs +1 -1
- package/dist/components/features/files-tab/segmented-toggle.cjs.map +1 -1
- package/dist/components/features/files-tab/segmented-toggle.d.ts +2 -0
- package/dist/components/features/files-tab/segmented-toggle.js +17 -14
- package/dist/components/features/files-tab/segmented-toggle.js.map +1 -1
- package/dist/components/features/manifest/manifest-form-field.d.ts +27 -0
- package/dist/components/features/manifest/manifest-prerequisites-step.d.ts +11 -0
- package/dist/components/features/manifest/manifest-review-step.d.ts +14 -0
- package/dist/components/features/manifest/manifest-setup-dialog.d.ts +14 -0
- package/dist/components/features/mcp-page/custom-server-editor.cjs +1 -1
- package/dist/components/features/mcp-page/custom-server-editor.js +16 -16
- package/dist/components/features/mcp-page/installed-server-card.cjs +1 -1
- package/dist/components/features/mcp-page/installed-server-card.cjs.map +1 -1
- package/dist/components/features/mcp-page/installed-server-card.d.ts +2 -2
- package/dist/components/features/mcp-page/installed-server-card.js +6 -7
- package/dist/components/features/mcp-page/installed-server-card.js.map +1 -1
- package/dist/components/features/mcp-page/installed-servers-section.cjs +1 -1
- package/dist/components/features/mcp-page/installed-servers-section.cjs.map +1 -1
- package/dist/components/features/mcp-page/installed-servers-section.d.ts +2 -2
- package/dist/components/features/mcp-page/installed-servers-section.js +2 -2
- package/dist/components/features/mcp-page/installed-servers-section.js.map +1 -1
- package/dist/components/features/mcp-page/mcp-server-health.cjs +1 -1
- package/dist/components/features/mcp-page/mcp-server-health.js +4 -4
- package/dist/components/features/settings/mcp-settings/mcp-server-form.cjs +1 -1
- package/dist/components/features/settings/mcp-settings/mcp-server-form.cjs.map +1 -1
- package/dist/components/features/settings/mcp-settings/mcp-server-form.js +2 -1
- package/dist/components/features/settings/mcp-settings/mcp-server-form.js.map +1 -1
- package/dist/components/features/settings/settings-input.cjs +1 -1
- package/dist/components/features/settings/settings-input.cjs.map +1 -1
- package/dist/components/features/settings/settings-input.d.ts +6 -0
- package/dist/components/features/settings/settings-input.js +13 -8
- package/dist/components/features/settings/settings-input.js.map +1 -1
- package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
- package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
- package/dist/components/features/sidebar/sidebar-rail-body.js +124 -123
- package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
- package/dist/config/defaults.cjs +1 -1
- package/dist/config/defaults.cjs.map +1 -1
- package/dist/config/defaults.js +3 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/contexts/active-backend-context.cjs +1 -1
- package/dist/contexts/active-backend-context.cjs.map +1 -1
- package/dist/contexts/active-backend-context.d.ts +3 -2
- package/dist/contexts/active-backend-context.js +55 -42
- package/dist/contexts/active-backend-context.js.map +1 -1
- package/dist/favicon-16x16.png +0 -0
- package/dist/favicon-32x32.png +0 -0
- package/dist/favicon.ico +0 -0
- package/dist/hooks/mutation/use-update-mcp-server.cjs +1 -1
- package/dist/hooks/mutation/use-update-mcp-server.js +5 -5
- package/dist/hooks/query/query-keys.cjs.map +1 -1
- package/dist/hooks/query/query-keys.d.ts +4 -0
- package/dist/hooks/query/query-keys.js.map +1 -1
- package/dist/hooks/query/use-cloud-current-user-id.cjs +1 -1
- package/dist/hooks/query/use-cloud-current-user-id.cjs.map +1 -1
- package/dist/hooks/query/use-cloud-current-user-id.js +7 -5
- package/dist/hooks/query/use-cloud-current-user-id.js.map +1 -1
- package/dist/hooks/query/use-cloud-organizations.cjs +1 -1
- package/dist/hooks/query/use-cloud-organizations.cjs.map +1 -1
- package/dist/hooks/query/use-cloud-organizations.js +5 -1
- package/dist/hooks/query/use-cloud-organizations.js.map +1 -1
- package/dist/hooks/query/use-manifest-capabilities.d.ts +21 -0
- package/dist/hooks/query/use-manifest-prerequisites.d.ts +24 -0
- package/dist/hooks/use-can-manage-org-profiles.cjs +1 -1
- package/dist/hooks/use-can-manage-org-profiles.cjs.map +1 -1
- package/dist/hooks/use-can-manage-org-profiles.js +2 -1
- package/dist/hooks/use-can-manage-org-profiles.js.map +1 -1
- package/dist/hooks/use-llm-configured.cjs +1 -1
- package/dist/hooks/use-llm-configured.cjs.map +1 -1
- package/dist/hooks/use-llm-configured.js +2 -1
- package/dist/hooks/use-llm-configured.js.map +1 -1
- package/dist/hooks/use-manifest-preflight.d.ts +18 -0
- package/dist/hooks/use-tracking.cjs +1 -1
- package/dist/hooks/use-tracking.cjs.map +1 -1
- package/dist/hooks/use-tracking.d.ts +14 -0
- package/dist/hooks/use-tracking.js +28 -10
- package/dist/hooks/use-tracking.js.map +1 -1
- package/dist/i18n/declaration.cjs +1 -1
- package/dist/i18n/declaration.cjs.map +1 -1
- package/dist/i18n/declaration.d.ts +38 -1
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/translation.cjs +2 -2
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +645 -16
- package/dist/i18n/translation.js.map +1 -1
- package/dist/icons/external-link.cjs +2 -0
- package/dist/icons/external-link.cjs.map +1 -0
- package/dist/icons/external-link.js +22 -0
- package/dist/icons/external-link.js.map +1 -0
- package/dist/icons/server.cjs +2 -0
- package/dist/icons/server.cjs.map +1 -0
- package/dist/icons/server.js +17 -0
- package/dist/icons/server.js.map +1 -0
- package/dist/locales/ar/openhands.json +39 -2
- package/dist/locales/ca/openhands.json +39 -2
- package/dist/locales/de/openhands.json +39 -2
- package/dist/locales/en/openhands.json +40 -3
- package/dist/locales/es/openhands.json +39 -2
- package/dist/locales/fr/openhands.json +39 -2
- package/dist/locales/it/openhands.json +39 -2
- package/dist/locales/ja/openhands.json +39 -2
- package/dist/locales/ko-KR/openhands.json +39 -2
- package/dist/locales/no/openhands.json +39 -2
- package/dist/locales/pt/openhands.json +39 -2
- package/dist/locales/tr/openhands.json +39 -2
- package/dist/locales/uk/openhands.json +39 -2
- package/dist/locales/zh-CN/openhands.json +39 -2
- package/dist/locales/zh-TW/openhands.json +39 -2
- package/dist/manifests/automation-interface.cjs +2 -0
- package/dist/manifests/automation-interface.cjs.map +1 -0
- package/dist/manifests/automation-interface.d.ts +44 -0
- package/dist/manifests/automation-interface.js +81 -0
- package/dist/manifests/automation-interface.js.map +1 -0
- package/dist/manifests/automation-setup.cjs +2 -0
- package/dist/manifests/automation-setup.cjs.map +1 -0
- package/dist/manifests/automation-setup.d.ts +52 -0
- package/dist/manifests/automation-setup.js +8 -0
- package/dist/manifests/automation-setup.js.map +1 -0
- package/dist/manifests/interface-validation.cjs +2 -0
- package/dist/manifests/interface-validation.cjs.map +1 -0
- package/dist/manifests/interface-validation.d.ts +27 -0
- package/dist/manifests/interface-validation.js +182 -0
- package/dist/manifests/interface-validation.js.map +1 -0
- package/dist/manifests/manifest-actions.d.ts +15 -0
- package/dist/manifests/manifest-capabilities.d.ts +25 -0
- package/dist/manifests/manifest-error-map.d.ts +40 -0
- package/dist/manifests/manifest-local-validation.d.ts +56 -0
- package/dist/manifests/manifest-registry.cjs +2 -0
- package/dist/manifests/manifest-registry.cjs.map +1 -0
- package/dist/manifests/manifest-registry.d.ts +15 -0
- package/dist/manifests/manifest-registry.js +26 -0
- package/dist/manifests/manifest-registry.js.map +1 -0
- package/dist/manifests/manifest-sources.cjs +2 -0
- package/dist/manifests/manifest-sources.cjs.map +1 -0
- package/dist/manifests/manifest-sources.d.ts +15 -0
- package/dist/manifests/manifest-sources.js +8 -0
- package/dist/manifests/manifest-sources.js.map +1 -0
- package/dist/manifests/manifest-template.d.ts +18 -0
- package/dist/manifests/manifest-validation.cjs +2 -0
- package/dist/manifests/manifest-validation.cjs.map +1 -0
- package/dist/manifests/manifest-validation.d.ts +30 -0
- package/dist/manifests/manifest-validation.js +145 -0
- package/dist/manifests/manifest-validation.js.map +1 -0
- package/dist/manifests/types.cjs +2 -0
- package/dist/manifests/types.cjs.map +1 -0
- package/dist/manifests/types.d.ts +227 -0
- package/dist/manifests/types.js +6 -0
- package/dist/manifests/types.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js +75 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js +78 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.cjs +17 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.js +89 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.cjs +10 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.js +17 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-triage-assistant/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-triage-assistant/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-triage-assistant/manifest.js +15 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-triage-assistant/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/research-brief-writer/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/research-brief-writer/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/research-brief-writer/manifest.js +18 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/research-brief-writer/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/slack-channel-monitor/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/slack-channel-monitor/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/slack-channel-monitor/manifest.js +14 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/slack-channel-monitor/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/slack-standup-digest/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/slack-standup-digest/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/slack-standup-digest/manifest.js +14 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/slack-standup-digest/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +23 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/index.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/automations/index.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/index.js +18 -0
- package/dist/node_modules/@openhands/extensions/automations/index.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/interface.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/automations/interface.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/interface.js +89 -0
- package/dist/node_modules/@openhands/extensions/automations/interface.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js +3 -3
- package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.cjs +17 -4
- package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.js +5 -5
- package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.js +9 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.js.map +1 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/monitor.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/monitor.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/monitor.js +29 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/monitor.js.map +1 -0
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +3 -3
- package/dist/package.js.map +1 -1
- package/dist/routes/app-settings.cjs +1 -1
- package/dist/routes/app-settings.js +5 -5
- package/dist/routes/mcp.cjs +1 -1
- package/dist/routes/mcp.cjs.map +1 -1
- package/dist/routes/mcp.js +73 -82
- package/dist/routes/mcp.js.map +1 -1
- package/dist/services/telemetry.cjs +1 -1
- package/dist/services/telemetry.cjs.map +1 -1
- package/dist/services/telemetry.d.ts +8 -0
- package/dist/services/telemetry.js +163 -116
- package/dist/services/telemetry.js.map +1 -1
- package/dist/types/agent-server/core/events/conversation-state-event.d.ts +2 -19
- package/dist/types/agent-server/core/events/observation-event.d.ts +2 -18
- package/dist/types/automation.d.ts +7 -3
- package/dist/types/mcp-server.d.ts +5 -0
- package/dist/types/settings.d.ts +3 -0
- package/dist/utils/api-error-message.d.ts +6 -2
- package/dist/utils/automation-catalog.cjs +2 -0
- package/dist/utils/automation-catalog.cjs.map +1 -0
- package/dist/utils/automation-catalog.d.ts +28 -0
- package/dist/utils/automation-catalog.js +5 -0
- package/dist/utils/automation-catalog.js.map +1 -0
- package/dist/utils/automation-timeout.d.ts +3 -2
- package/dist/utils/mcp-config.cjs +1 -1
- package/dist/utils/mcp-config.cjs.map +1 -1
- package/dist/utils/mcp-config.d.ts +8 -0
- package/dist/utils/mcp-config.js +25 -20
- package/dist/utils/mcp-config.js.map +1 -1
- package/dist/utils/mcp-installed-servers.cjs +1 -1
- package/dist/utils/mcp-installed-servers.cjs.map +1 -1
- package/dist/utils/mcp-installed-servers.js +6 -3
- package/dist/utils/mcp-installed-servers.js.map +1 -1
- package/dist/utils/responder-deployment.d.ts +5 -1
- package/dist/utils/transcript-export/index.cjs +5 -5
- package/dist/utils/transcript-export/index.js +12 -12
- package/package.json +3 -3
- package/scripts/check-sdk-version-sync.mjs +6 -6
- package/scripts/check-translation-completeness.cjs +1 -0
- package/scripts/dev-safe.mjs +17 -12
- package/scripts/dev-static.mjs +17 -0
- package/scripts/dev-with-automation.mjs +12 -14
- package/scripts/ingress.mjs +22 -0
- package/scripts/proxy-utils.mjs +157 -2
- package/scripts/runtime-services-info.mjs +6 -6
- package/scripts/static-build.mjs +0 -7
- package/scripts/static-server.mjs +10 -0
- package/build/assets/active-backend-context-BlZPzZNU.js +0 -1
- package/build/assets/agent-context-settings-CTaN-Iw9.js +0 -1
- package/build/assets/agent-profiles-settings-CR4VTqv_.js +0 -1
- package/build/assets/agent-server-conversation-service.api-Btmi4q6d.js +0 -41
- package/build/assets/agent-settings-KQs-occT.js +0 -1
- package/build/assets/api-key-entry-screen-BhR24gkM.js +0 -1
- package/build/assets/app-settings-Bs4sY8WP.js +0 -1
- package/build/assets/automation-BGP_I1RR.js +0 -1
- package/build/assets/automation-detail-CwDnJbYR.js +0 -2
- package/build/assets/automation-export-Bu-r-EzL.js +0 -2
- package/build/assets/automations-list-CYw7_6FR.js +0 -1
- package/build/assets/backend-form-modal-Ce-KRHOJ.js +0 -1
- package/build/assets/browser-BUDJnBg4.js +0 -6
- package/build/assets/check-BMOG005H.js +0 -1
- package/build/assets/chevron-down-CV1zZP_K.js +0 -1
- package/build/assets/circle-check-lvN_jFN5.js +0 -1
- package/build/assets/client-source-1v-kWLNU.js +0 -1
- package/build/assets/cloud-funnel-analytics-CasMM7EO.js +0 -1
- package/build/assets/command-menu-N_BriUy8.js +0 -1
- package/build/assets/condenser-settings-Czi8cKxV.js +0 -1
- package/build/assets/conversation-C25pc2dT.js +0 -1
- package/build/assets/conversation-CObLYSJd.js +0 -90
- package/build/assets/conversation-panel-C25pc2dT.js +0 -1
- package/build/assets/conversation-state-store-DTq4hFoP.js +0 -1
- package/build/assets/extensions-hub-BKftOQ-X.js +0 -1
- package/build/assets/extensions-navigation-DF24q1H1.js +0 -1
- package/build/assets/files-tab-SAiFCnS5.js +0 -1
- package/build/assets/git-provider-icon-BREx-yUX.js +0 -1
- package/build/assets/home-EPNFgzUh.js +0 -1
- package/build/assets/home-sN90Xcxp.js +0 -1
- package/build/assets/index-home-EPNFgzUh.js +0 -1
- package/build/assets/install-server-modal-BI8yUfmr.js +0 -1
- package/build/assets/llm-not-configured-banner-DTWzISnk.js +0 -27
- package/build/assets/llm-settings-BXk5_Pac.js +0 -1
- package/build/assets/llm-settings-C1vpgWam.js +0 -1
- package/build/assets/loader-circle-6zlEYCJw.js +0 -1
- package/build/assets/manage-backends-modal-DhflyGTf.js +0 -1
- package/build/assets/manifest-8082e879.js +0 -1
- package/build/assets/mcp-CxLPda-W.js +0 -9
- package/build/assets/messages-DINDkPNK.js +0 -40
- package/build/assets/onboarding-modal-DdvE6rzw.js +0 -1
- package/build/assets/organization-service.api-CT2OQlLz.js +0 -1
- package/build/assets/plugins-management-service-DVkoM3eA.js +0 -1
- package/build/assets/plus-vIbGD459.js +0 -1
- package/build/assets/profiles-service.api-CBafmAPO.js +0 -1
- package/build/assets/providers-9UzRB9mT.js +0 -1
- package/build/assets/proxy-C79PCMjo.js +0 -1
- package/build/assets/recommended-automations-launcher-BF2mtAKw.js +0 -58
- package/build/assets/root-B5JXKp1P.css +0 -1
- package/build/assets/root-Sj7W28yE.js +0 -2
- package/build/assets/root-layout-DbhKVoc7.js +0 -3
- package/build/assets/schema-field-CV6bFnoL.js +0 -1
- package/build/assets/search-sKuYKllf.js +0 -1
- package/build/assets/secrets-service-BjK-bPN2.js +0 -1
- package/build/assets/segmented-toggle-DbbD3Tve.js +0 -1
- package/build/assets/settings-Bj5Oo45A.js +0 -1
- package/build/assets/settings-input-BjW_zyTN.js +0 -1
- package/build/assets/settings-service.api-DryhKdSr.js +0 -1
- package/build/assets/shared-conversation-CnMxy7p_.js +0 -1
- package/build/assets/telemetry-cmCL3o6Z.js +0 -2
- package/build/assets/use-activate-agent-profile-DH33MvVj.js +0 -1
- package/build/assets/use-agent-profiles-Dmd_4H8q.js +0 -1
- package/build/assets/use-cloud-current-user-id-B6DP3s47.js +0 -1
- package/build/assets/use-is-authed-BsS4XwSL.js +0 -1
- package/build/assets/use-llm-profiles-BMQoc612.js +0 -1
- package/build/assets/use-onboarding-completion-B-2BTS-y.js +0 -1
- package/build/assets/use-plugins-marketplace-PBc_XNz_.js +0 -1
- package/build/assets/use-save-agent-profile-2Mk9ZX37.js +0 -1
- package/build/assets/use-settings-DBI44RnH.js +0 -1
- package/build/assets/use-settings-nav-items-Cva28C-c.js +0 -16
- package/build/assets/use-skills-RQsCtdzN.js +0 -1
- package/build/assets/use-tracking-CN1nIMnY.js +0 -1
- package/build/assets/utils-qjs_KuS4.js +0 -1
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation-EShpjxey.js +0 -1
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-DD_UNO02.js +0 -1
- package/build/assets/vendor~root-layout~index-home~home~mcp~automations-list~onboarding-modal-Be63Q2Ln.js +0 -1
- package/build/assets/x-EjvKGawc.js +0 -1
- /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~f1hl7voa-BrmgjeOw.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~emdr2jt4-BrmgjeOw.js} +0 -0
|
@@ -4,10 +4,10 @@ import { isACPToolCallEvent as n, isActionEvent as r, isAgentErrorEvent as i, is
|
|
|
4
4
|
import { getActionThoughtText as f, getReasoningContent as p, splitInlineThink as m } from "../../components/conversation-events/chat/event-thought-helpers.js";
|
|
5
5
|
import { handleEventForUI as h } from "../handle-event-for-ui.js";
|
|
6
6
|
import { shouldRenderEvent as g } from "../../components/conversation-events/chat/event-content-helpers/should-render-event.js";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
7
|
+
import { getACPToolCallContent as _, stripRedundantTitlePrefix as v } from "../../components/conversation-events/chat/event-content-helpers/get-acp-tool-call-content.js";
|
|
8
|
+
import { parseMessageFromEvent as y } from "../../components/conversation-events/chat/event-content-helpers/parse-message-from-event.js";
|
|
9
|
+
import { getActionContent as b } from "../../components/conversation-events/chat/event-content-helpers/get-action-content.js";
|
|
10
|
+
import { getObservationContent as x } from "../../components/conversation-events/chat/event-content-helpers/get-observation-content.js";
|
|
11
11
|
import { groupEvents as S } from "../../components/conversation-events/chat/group-events.js";
|
|
12
12
|
//#region src/utils/transcript-export/index.ts
|
|
13
13
|
var C = new Set([
|
|
@@ -60,7 +60,7 @@ var C = new Set([
|
|
|
60
60
|
i ? `${t.t(e.TASK$QUERY)}:\n${i.prompt}` : "",
|
|
61
61
|
`${t.t(e.TASK$RESULT)}:\n${I(n.content)}`
|
|
62
62
|
].filter(Boolean).join("\n\n");
|
|
63
|
-
}, z = (e) => e.action.kind === "TaskAction" ? L(e.action) : C.has(e.action.kind) ?
|
|
63
|
+
}, z = (e) => e.action.kind === "TaskAction" ? L(e.action) : C.has(e.action.kind) ? b(e) : "", B = (e, t) => e.observation.kind === "TaskObservation" ? R(e.observation, t) : w.has(e.observation.kind) ? x(e) : "", V = (e) => s(e) ? [
|
|
64
64
|
e.reason,
|
|
65
65
|
e.error,
|
|
66
66
|
e.stdout,
|
|
@@ -70,13 +70,13 @@ var C = new Set([
|
|
|
70
70
|
"SwitchLLMAction",
|
|
71
71
|
"ThinkAction"
|
|
72
72
|
].includes(e.action.kind), W = (f, p) => {
|
|
73
|
-
let
|
|
73
|
+
let b = f.reduce((e, t) => {
|
|
74
74
|
try {
|
|
75
75
|
return h(t, e);
|
|
76
76
|
} catch {
|
|
77
77
|
return e;
|
|
78
78
|
}
|
|
79
|
-
}, []),
|
|
79
|
+
}, []), x = new Map(f.filter(r).map((e) => [e.id, e])), C = [], w = /* @__PURE__ */ new Set(), D = S(b.filter((e) => d(e) && !e.observation.is_error || g(e)), 2 ** 53 - 1, f), O = (e) => {
|
|
80
80
|
if (w.has(e.id) || !U(e)) return;
|
|
81
81
|
w.add(e.id);
|
|
82
82
|
let t = H(e);
|
|
@@ -95,7 +95,7 @@ var C = new Set([
|
|
|
95
95
|
}
|
|
96
96
|
let { event: h } = f;
|
|
97
97
|
try {
|
|
98
|
-
let f = r(h) ? h : l(h) ?
|
|
98
|
+
let f = r(h) ? h : l(h) ? x.get(h.action_id) : void 0;
|
|
99
99
|
if (f && O(f), d(h) && !h.observation.is_error) {
|
|
100
100
|
C.push({
|
|
101
101
|
kind: "note",
|
|
@@ -106,7 +106,7 @@ var C = new Set([
|
|
|
106
106
|
continue;
|
|
107
107
|
}
|
|
108
108
|
if (c(h)) {
|
|
109
|
-
let e =
|
|
109
|
+
let e = y(h).trim();
|
|
110
110
|
if (h.source === "agent") {
|
|
111
111
|
let { reasoning: t, message: n } = m(e);
|
|
112
112
|
[t, n].filter(Boolean).forEach((e) => {
|
|
@@ -166,7 +166,7 @@ var C = new Set([
|
|
|
166
166
|
continue;
|
|
167
167
|
}
|
|
168
168
|
if (l(h)) {
|
|
169
|
-
let e =
|
|
169
|
+
let e = x.get(h.action_id);
|
|
170
170
|
C.push({
|
|
171
171
|
kind: "tool",
|
|
172
172
|
summary: F(h, e),
|
|
@@ -178,8 +178,8 @@ var C = new Set([
|
|
|
178
178
|
if (n(h)) {
|
|
179
179
|
C.push({
|
|
180
180
|
kind: "tool",
|
|
181
|
-
summary:
|
|
182
|
-
details: p ?
|
|
181
|
+
summary: v(h) || t.t(e.ACTION_MESSAGE$ACP_TOOL),
|
|
182
|
+
details: p ? _(h) : "",
|
|
183
183
|
timestamp: h.timestamp
|
|
184
184
|
});
|
|
185
185
|
continue;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openhands/agent-canvas",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.0",
|
|
4
4
|
"description": "Agent Canvas UI for OpenHands - run AI coding agents with a visual interface",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"private": false,
|
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
"@heroui/react": "2.8.10",
|
|
24
24
|
"@microlink/react-json-view": "1.31.20",
|
|
25
25
|
"@monaco-editor/react": "4.7.0",
|
|
26
|
-
"@openhands/extensions": "0.
|
|
27
|
-
"@openhands/typescript-client": "1.
|
|
26
|
+
"@openhands/extensions": "0.13.0",
|
|
27
|
+
"@openhands/typescript-client": "1.36.1",
|
|
28
28
|
"@react-router/node": "7.17.0",
|
|
29
29
|
"@react-router/serve": "7.17.0",
|
|
30
30
|
"@tailwindcss/vite": "4.2.4",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
*
|
|
20
20
|
* Usage:
|
|
21
21
|
* node scripts/check-sdk-version-sync.mjs
|
|
22
|
-
* EXPECTED_SDK_VERSION=1.
|
|
22
|
+
* EXPECTED_SDK_VERSION=1.39.1 node scripts/check-sdk-version-sync.mjs
|
|
23
23
|
* node scripts/check-sdk-version-sync.mjs --check-pypi
|
|
24
24
|
*
|
|
25
25
|
* Environment variables:
|
|
@@ -78,7 +78,7 @@ Triggering from other repos:
|
|
|
78
78
|
-H "Authorization: token \$GITHUB_TOKEN" \\
|
|
79
79
|
-H "Accept: application/vnd.github.v3+json" \\
|
|
80
80
|
https://api.github.com/repos/OpenHands/OpenHands/dispatches \\
|
|
81
|
-
-d '{"event_type": "sdk-version-check", "client_payload": {"version": "1.
|
|
81
|
+
-d '{"event_type": "sdk-version-check", "client_payload": {"version": "1.39.1"}}'
|
|
82
82
|
`);
|
|
83
83
|
process.exit(0);
|
|
84
84
|
}
|
|
@@ -260,9 +260,9 @@ async function fetchPyPIDependencies(packageName, version) {
|
|
|
260
260
|
* Parse PyPI requires_dist array and extract SDK package versions
|
|
261
261
|
*
|
|
262
262
|
* PyPI returns dependencies in PEP 508 format like:
|
|
263
|
-
* "openhands-sdk>=1.
|
|
264
|
-
* "openhands-tools==1.
|
|
265
|
-
* "openhands-workspace (>=1.
|
|
263
|
+
* "openhands-sdk>=1.39.1,<2.0.0"
|
|
264
|
+
* "openhands-tools==1.39.1"
|
|
265
|
+
* "openhands-workspace (>=1.39.1)"
|
|
266
266
|
*/
|
|
267
267
|
function parseSdkVersionsFromRequiresDist(requiresDist) {
|
|
268
268
|
const versions = {};
|
|
@@ -276,7 +276,7 @@ function parseSdkVersionsFromRequiresDist(requiresDist) {
|
|
|
276
276
|
}
|
|
277
277
|
|
|
278
278
|
// Extract the version number - look for patterns like:
|
|
279
|
-
// ">=1.
|
|
279
|
+
// ">=1.39.1", "==1.39.1", "(>=1.39.1)", "~=1.39.1"
|
|
280
280
|
// After the package name and before any comma or closing paren
|
|
281
281
|
const versionPattern = /[><=~!]+\s*([0-9]+(?:\.[0-9]+)*)/;
|
|
282
282
|
const match = dep.match(versionPattern);
|
package/scripts/dev-safe.mjs
CHANGED
|
@@ -48,7 +48,7 @@ const LOCAL_AGENT_SERVER_SUBDIRS = [
|
|
|
48
48
|
"openhands-workspace",
|
|
49
49
|
];
|
|
50
50
|
const DEFAULT_AGENT_SERVER_VERSION = SHARED_DEFAULTS.versions.agentServer;
|
|
51
|
-
// Temporary transitive-dep pin: openhands-sdk 1.
|
|
51
|
+
// Temporary transitive-dep pin: openhands-sdk 1.39.1 leaves agent-client-protocol
|
|
52
52
|
// unbounded (>=0.10.1), but acp 0.11.0 reordered the ACP prompt() args and breaks
|
|
53
53
|
// the SDK's ACP client. Hold acp <0.11 until a fixed SDK ships. See config/defaults.json.
|
|
54
54
|
const AGENT_CLIENT_PROTOCOL_CONSTRAINT =
|
|
@@ -264,7 +264,9 @@ export async function assertPortsFree(portConfigs, host = "127.0.0.1") {
|
|
|
264
264
|
const busy = results.filter(({ free }) => !free);
|
|
265
265
|
if (busy.length === 0) return;
|
|
266
266
|
|
|
267
|
-
const lines = busy
|
|
267
|
+
const lines = busy
|
|
268
|
+
.map(({ name, port }) => ` • ${name}: port ${port}`)
|
|
269
|
+
.join("\n");
|
|
268
270
|
throw new Error(
|
|
269
271
|
`Cannot start: the following ports are already in use:\n\n${lines}\n\n` +
|
|
270
272
|
`Another agent-canvas instance may already be running.\n` +
|
|
@@ -399,7 +401,7 @@ export function validateFrontendDependencies(
|
|
|
399
401
|
* edits are picked up without a manual reinstall. The agent-server itself
|
|
400
402
|
* is rebuilt from local source on each invocation (--reinstall).
|
|
401
403
|
* - OH_AGENT_SERVER_GIT_REF: Git commit SHA or branch name
|
|
402
|
-
* - OH_AGENT_SERVER_VERSION: Specific PyPI version (e.g., "1.
|
|
404
|
+
* - OH_AGENT_SERVER_VERSION: Specific PyPI version (e.g., "1.39.1")
|
|
403
405
|
*
|
|
404
406
|
* If none are set, defaults to the released version specified by
|
|
405
407
|
* DEFAULT_AGENT_SERVER_VERSION. Set OH_AGENT_SERVER_GIT_REF to use a
|
|
@@ -619,8 +621,7 @@ function buildConfigFromPorts(ports, cwd, env) {
|
|
|
619
621
|
// ~/.openhands/agent-canvas/secret-key.txt. Persisting ensures dev mode
|
|
620
622
|
// and Docker mode share the same encryption key when they mount the same
|
|
621
623
|
// ~/.openhands directory (docker/entrypoint.sh reads/writes the same file).
|
|
622
|
-
const secretKeyPath =
|
|
623
|
-
env.OH_SECRET_KEY_PATH || DEFAULT_SECRET_KEY_PATH;
|
|
624
|
+
const secretKeyPath = env.OH_SECRET_KEY_PATH || DEFAULT_SECRET_KEY_PATH;
|
|
624
625
|
const secretKey =
|
|
625
626
|
env.OH_SECRET_KEY || getOrCreatePersistedApiKey(secretKeyPath, "secret");
|
|
626
627
|
// Use the user-provided LOCAL_BACKEND_API_KEY or fall back to a key
|
|
@@ -958,10 +959,6 @@ async function main() {
|
|
|
958
959
|
}
|
|
959
960
|
|
|
960
961
|
const frontendCommand = buildNpmScriptCommand("dev:frontend");
|
|
961
|
-
const runtimeServicesInfo = buildRuntimeServicesInfo({
|
|
962
|
-
mode: "dev:safe",
|
|
963
|
-
agentServerPort: config.backendPort,
|
|
964
|
-
});
|
|
965
962
|
frontend = spawnProcess(frontendCommand.command, frontendCommand.args, {
|
|
966
963
|
cwd: config.cwd,
|
|
967
964
|
env: {
|
|
@@ -971,9 +968,17 @@ async function main() {
|
|
|
971
968
|
VITE_WORKING_DIR: config.workingDir,
|
|
972
969
|
// Pass session API key so frontend can authenticate with agent-server
|
|
973
970
|
VITE_SESSION_API_KEY: config.sessionApiKey,
|
|
974
|
-
//
|
|
975
|
-
//
|
|
976
|
-
|
|
971
|
+
// dev:minimal deliberately does NOT supply runtime-services info (the
|
|
972
|
+
// frontend here talks straight to the agent-server over
|
|
973
|
+
// VITE_BACKEND_BASE_URL — there is no ingress or static-server in front
|
|
974
|
+
// of it to append `runtime_services` to `/server_info`, and the
|
|
975
|
+
// frontend's own VITE_RUNTIME_SERVICES_INFO env var is no longer read).
|
|
976
|
+
// It is a bare agent-server + Vite stack with no companion services to
|
|
977
|
+
// advertise, so `fetchBackendRuntimeServicesInfo()` correctly returns
|
|
978
|
+
// null and conversations simply omit the <RUNTIME_SERVICES> block.
|
|
979
|
+
// Stacks with automation/ingress/frontend services should use
|
|
980
|
+
// `npm run dev` / `dev:static`, which pass runtime-services info through
|
|
981
|
+
// ingress/static-server instead.
|
|
977
982
|
},
|
|
978
983
|
});
|
|
979
984
|
|
package/scripts/dev-static.mjs
CHANGED
|
@@ -61,6 +61,7 @@ import {
|
|
|
61
61
|
buildAgentServerAutomationEnv,
|
|
62
62
|
buildAutomationCommand,
|
|
63
63
|
buildAutomationTelemetryEnv,
|
|
64
|
+
buildAutomationRuntimeServicesInfo,
|
|
64
65
|
buildConfig,
|
|
65
66
|
} from "./dev-with-automation.mjs";
|
|
66
67
|
|
|
@@ -379,6 +380,12 @@ function startStaticServer(config) {
|
|
|
379
380
|
// is forwarded to the agent-server instead of falling back to the SPA
|
|
380
381
|
// shell). Without this, /server_info on :3001 returns index.html.
|
|
381
382
|
const staticServerScript = join(projectRoot, "scripts", "static-server.mjs");
|
|
383
|
+
const runtimeServicesInfo = JSON.stringify(
|
|
384
|
+
buildAutomationRuntimeServicesInfo({
|
|
385
|
+
...config,
|
|
386
|
+
frontendKind: "static",
|
|
387
|
+
}),
|
|
388
|
+
);
|
|
382
389
|
spawnService(
|
|
383
390
|
"static",
|
|
384
391
|
"node",
|
|
@@ -396,6 +403,8 @@ function startStaticServer(config) {
|
|
|
396
403
|
...(config.sessionApiKey
|
|
397
404
|
? ["--session-api-key", config.sessionApiKey]
|
|
398
405
|
: []),
|
|
406
|
+
"--runtime-services-info",
|
|
407
|
+
runtimeServicesInfo,
|
|
399
408
|
"--route",
|
|
400
409
|
`/api/automation=http://localhost:${config.autoBackendPort}`,
|
|
401
410
|
"--route",
|
|
@@ -428,6 +437,12 @@ function startIngress(config) {
|
|
|
428
437
|
logService("ingress", `Starting on port ${config.ingressPort}...`, c.yellow);
|
|
429
438
|
|
|
430
439
|
const ingressScript = join(projectRoot, "scripts", "ingress.mjs");
|
|
440
|
+
const runtimeServicesInfo = JSON.stringify(
|
|
441
|
+
buildAutomationRuntimeServicesInfo({
|
|
442
|
+
...config,
|
|
443
|
+
frontendKind: "static",
|
|
444
|
+
}),
|
|
445
|
+
);
|
|
431
446
|
|
|
432
447
|
spawnService(
|
|
433
448
|
"ingress",
|
|
@@ -436,6 +451,8 @@ function startIngress(config) {
|
|
|
436
451
|
ingressScript,
|
|
437
452
|
"--port",
|
|
438
453
|
config.ingressPort.toString(),
|
|
454
|
+
"--runtime-services-info",
|
|
455
|
+
runtimeServicesInfo,
|
|
439
456
|
"--route",
|
|
440
457
|
`/api/automation=http://localhost:${config.autoBackendPort}`,
|
|
441
458
|
"--route",
|
|
@@ -958,12 +958,16 @@ function shutdown() {
|
|
|
958
958
|
|
|
959
959
|
process.on("SIGINT", shutdown);
|
|
960
960
|
process.on("SIGTERM", shutdown);
|
|
961
|
+
process.on("SIGHUP", shutdown);
|
|
961
962
|
|
|
962
963
|
function startIngress(config) {
|
|
963
964
|
logService("ingress", `Starting on port ${config.ingressPort}...`, c.yellow);
|
|
964
965
|
|
|
965
966
|
const ingressScript = join(projectRoot, "scripts", "ingress.mjs");
|
|
966
967
|
const frontendBackend = getFrontendBackend(config);
|
|
968
|
+
const runtimeServicesInfo = config.launchAgentServer
|
|
969
|
+
? JSON.stringify(buildAutomationRuntimeServicesInfo(config))
|
|
970
|
+
: null;
|
|
967
971
|
|
|
968
972
|
spawnService(
|
|
969
973
|
"ingress",
|
|
@@ -972,6 +976,9 @@ function startIngress(config) {
|
|
|
972
976
|
ingressScript,
|
|
973
977
|
"--port",
|
|
974
978
|
config.ingressPort.toString(),
|
|
979
|
+
...(runtimeServicesInfo
|
|
980
|
+
? ["--runtime-services-info", runtimeServicesInfo]
|
|
981
|
+
: []),
|
|
975
982
|
...buildRouteArgs(getLocalServiceRoutes(config)),
|
|
976
983
|
...(frontendBackend ? ["--default", frontendBackend] : []),
|
|
977
984
|
],
|
|
@@ -984,8 +991,8 @@ function startIngress(config) {
|
|
|
984
991
|
|
|
985
992
|
/**
|
|
986
993
|
* Build the JSON-serializable runtime services info for an automation
|
|
987
|
-
* stack.
|
|
988
|
-
*
|
|
994
|
+
* stack. Backend-serving processes append this to `/server_info` so any
|
|
995
|
+
* frontend connected to the backend can populate the agent's
|
|
989
996
|
* `<RUNTIME_SERVICES>` system-prompt block.
|
|
990
997
|
*/
|
|
991
998
|
export function buildAutomationRuntimeServicesInfo(config) {
|
|
@@ -1009,9 +1016,6 @@ function startVite(config) {
|
|
|
1009
1016
|
logService("vite", `Starting on port ${config.vitePort}...`, c.magenta);
|
|
1010
1017
|
|
|
1011
1018
|
const frontendCommand = buildNpmScriptCommand("dev:frontend");
|
|
1012
|
-
const runtimeServicesInfo = config.launchAgentServer
|
|
1013
|
-
? buildAutomationRuntimeServicesInfo(config)
|
|
1014
|
-
: null;
|
|
1015
1019
|
|
|
1016
1020
|
const viteEnv = {
|
|
1017
1021
|
// Full-stack mode points Vite at this launcher's ingress. Frontend-only
|
|
@@ -1023,12 +1027,6 @@ function startVite(config) {
|
|
|
1023
1027
|
viteEnv.VITE_WORKING_DIR = config.viteWorkingDir;
|
|
1024
1028
|
}
|
|
1025
1029
|
|
|
1026
|
-
if (runtimeServicesInfo) {
|
|
1027
|
-
// Inform the frontend (and downstream, the agent's system prompt) about
|
|
1028
|
-
// which services are available in this dev stack.
|
|
1029
|
-
viteEnv.VITE_RUNTIME_SERVICES_INFO = JSON.stringify(runtimeServicesInfo);
|
|
1030
|
-
}
|
|
1031
|
-
|
|
1032
1030
|
// In local mode, bake the session key into the frontend so the user
|
|
1033
1031
|
// never has to paste it. In public mode, omit the key and set
|
|
1034
1032
|
// VITE_AUTH_REQUIRED so the frontend shows the API key entry screen
|
|
@@ -1442,9 +1440,9 @@ function startStaticFrontend(config, staticDir) {
|
|
|
1442
1440
|
logService("static", `Starting on port ${config.vitePort}...`, c.magenta);
|
|
1443
1441
|
logService("static", `Serving from: ${staticDir}`, c.dim);
|
|
1444
1442
|
|
|
1445
|
-
// Build the runtime-services info JSON so
|
|
1446
|
-
//
|
|
1447
|
-
//
|
|
1443
|
+
// Build the runtime-services info JSON so static-server can append it to
|
|
1444
|
+
// /server_info. The static-server also injects the old window global for
|
|
1445
|
+
// compatibility with previously built frontend bundles.
|
|
1448
1446
|
const runtimeServicesInfo = config.launchAgentServer
|
|
1449
1447
|
? JSON.stringify(buildAutomationRuntimeServicesInfo(config))
|
|
1450
1448
|
: null;
|
package/scripts/ingress.mjs
CHANGED
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
* INGRESS_PORT - Port to listen on (default: 8000)
|
|
14
14
|
* INGRESS_ROUTES - JSON object of path prefix -> backend URL
|
|
15
15
|
* INGRESS_DEFAULT - Default backend for unmatched routes
|
|
16
|
+
* INGRESS_RUNTIME_SERVICES_INFO - Runtime services JSON appended to
|
|
17
|
+
* /server_info
|
|
16
18
|
*
|
|
17
19
|
* Route matching:
|
|
18
20
|
* - Routes are matched by longest prefix first
|
|
@@ -27,6 +29,8 @@ import {
|
|
|
27
29
|
createProxyHandlers,
|
|
28
30
|
createRouter,
|
|
29
31
|
isBenignSocketError,
|
|
32
|
+
isServerInfoRequest,
|
|
33
|
+
proxyServerInfoRequest,
|
|
30
34
|
} from "./proxy-utils.mjs";
|
|
31
35
|
|
|
32
36
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -39,6 +43,7 @@ function parseArgs() {
|
|
|
39
43
|
port: 8000,
|
|
40
44
|
routes: {},
|
|
41
45
|
defaultBackend: null,
|
|
46
|
+
runtimeServicesInfo: null,
|
|
42
47
|
};
|
|
43
48
|
|
|
44
49
|
for (let i = 0; i < args.length; i++) {
|
|
@@ -57,6 +62,9 @@ function parseArgs() {
|
|
|
57
62
|
case "--default":
|
|
58
63
|
config.defaultBackend = args[++i];
|
|
59
64
|
break;
|
|
65
|
+
case "--runtime-services-info":
|
|
66
|
+
config.runtimeServicesInfo = args[++i] || null;
|
|
67
|
+
break;
|
|
60
68
|
case "-h":
|
|
61
69
|
case "--help":
|
|
62
70
|
showHelp();
|
|
@@ -80,12 +88,15 @@ OPTIONS:
|
|
|
80
88
|
-p, --port <port> Port to listen on (default: 8000)
|
|
81
89
|
-r, --route <path=url> Add a route (can be repeated)
|
|
82
90
|
-d, --default <url> Default backend for unmatched routes
|
|
91
|
+
--runtime-services-info Runtime services JSON for /server_info
|
|
83
92
|
-h, --help Show this help
|
|
84
93
|
|
|
85
94
|
ENVIRONMENT VARIABLES:
|
|
86
95
|
INGRESS_PORT Port to listen on
|
|
87
96
|
INGRESS_ROUTES JSON object: {"path": "url", ...}
|
|
88
97
|
INGRESS_DEFAULT Default backend URL
|
|
98
|
+
INGRESS_RUNTIME_SERVICES_INFO
|
|
99
|
+
Runtime services JSON for /server_info
|
|
89
100
|
|
|
90
101
|
EXAMPLES:
|
|
91
102
|
# Basic setup with agent server and automation
|
|
@@ -125,6 +136,8 @@ function buildConfig(args, env = process.env) {
|
|
|
125
136
|
port: args.port || parseInt(env.INGRESS_PORT, 10) || 8000,
|
|
126
137
|
routes,
|
|
127
138
|
defaultBackend: args.defaultBackend || env.INGRESS_DEFAULT || null,
|
|
139
|
+
runtimeServicesInfo:
|
|
140
|
+
args.runtimeServicesInfo || env.INGRESS_RUNTIME_SERVICES_INFO || null,
|
|
128
141
|
};
|
|
129
142
|
}
|
|
130
143
|
|
|
@@ -146,6 +159,15 @@ export function startIngress(config) {
|
|
|
146
159
|
return;
|
|
147
160
|
}
|
|
148
161
|
|
|
162
|
+
if (
|
|
163
|
+
config.runtimeServicesInfo &&
|
|
164
|
+
isServerInfoRequest(req) &&
|
|
165
|
+
(req.method === "GET" || req.method === "HEAD")
|
|
166
|
+
) {
|
|
167
|
+
proxyServerInfoRequest(req, res, backend, config.runtimeServicesInfo);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
|
|
149
171
|
proxy.proxyHttp(req, res, backend);
|
|
150
172
|
});
|
|
151
173
|
|
package/scripts/proxy-utils.mjs
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import { request as httpRequest } from "node:http";
|
|
2
|
+
import { request as httpsRequest } from "node:https";
|
|
1
3
|
import { createProxyServer } from "httpxy";
|
|
2
4
|
|
|
3
5
|
const DEFAULT_PROXY_TIMEOUT_MS = 120_000;
|
|
6
|
+
const SERVER_INFO_PATH = "/server_info";
|
|
4
7
|
const BENIGN_SOCKET_ERRORS = new Set([
|
|
5
8
|
"ECONNRESET",
|
|
6
9
|
"EPIPE",
|
|
@@ -35,6 +38,152 @@ export function isBenignSocketError(err) {
|
|
|
35
38
|
return Boolean(err && BENIGN_SOCKET_ERRORS.has(err.code));
|
|
36
39
|
}
|
|
37
40
|
|
|
41
|
+
function parseBackendUrl(backendUrl) {
|
|
42
|
+
const url = new URL(backendUrl);
|
|
43
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
44
|
+
throw new Error("Invalid backend URL");
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
hostname: url.hostname,
|
|
48
|
+
port: Number.parseInt(url.port, 10) || (url.protocol === "https:" ? 443 : 80),
|
|
49
|
+
protocol: url.protocol,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function writeInvalidBackendUrlResponse(req, res) {
|
|
54
|
+
const message = "Invalid backend URL";
|
|
55
|
+
console.error(`Proxy error for ${req.url}: ${message}`);
|
|
56
|
+
if (!res.headersSent) {
|
|
57
|
+
res.writeHead(502, { "Content-Type": "text/plain; charset=utf-8" });
|
|
58
|
+
res.end(`Bad Gateway: ${message}`);
|
|
59
|
+
} else {
|
|
60
|
+
res.destroy();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function isServerInfoRequest(req) {
|
|
65
|
+
const pathname = new URL(req.url ?? "/", "http://localhost").pathname;
|
|
66
|
+
return pathname === SERVER_INFO_PATH;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function proxyServerInfoRequest(
|
|
70
|
+
req,
|
|
71
|
+
res,
|
|
72
|
+
backendUrl,
|
|
73
|
+
runtimeServicesInfo,
|
|
74
|
+
) {
|
|
75
|
+
let backend;
|
|
76
|
+
try {
|
|
77
|
+
backend = parseBackendUrl(backendUrl);
|
|
78
|
+
} catch {
|
|
79
|
+
writeInvalidBackendUrlResponse(req, res);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const request = backend.protocol === "https:" ? httpsRequest : httpRequest;
|
|
84
|
+
const proxyReq = request(
|
|
85
|
+
{
|
|
86
|
+
hostname: backend.hostname,
|
|
87
|
+
port: backend.port,
|
|
88
|
+
path: req.url,
|
|
89
|
+
method: req.method,
|
|
90
|
+
headers: {
|
|
91
|
+
...req.headers,
|
|
92
|
+
host: `${backend.hostname}:${backend.port}`,
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
(proxyRes) => {
|
|
96
|
+
const chunks = [];
|
|
97
|
+
|
|
98
|
+
proxyRes.on("data", (chunk) => {
|
|
99
|
+
chunks.push(Buffer.from(chunk));
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
proxyRes.on("error", (err) => {
|
|
103
|
+
if (!isBenignSocketError(err)) {
|
|
104
|
+
console.error(`Upstream response error for ${req.url}:`, err.message);
|
|
105
|
+
}
|
|
106
|
+
if (!res.headersSent) {
|
|
107
|
+
res.writeHead(502);
|
|
108
|
+
res.end(`Bad Gateway: ${err.message}`);
|
|
109
|
+
} else {
|
|
110
|
+
res.destroy();
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
proxyRes.on("end", () => {
|
|
115
|
+
const statusCode = proxyRes.statusCode ?? 502;
|
|
116
|
+
const headers = { ...proxyRes.headers };
|
|
117
|
+
const originalBody = Buffer.concat(chunks);
|
|
118
|
+
|
|
119
|
+
if (statusCode < 200 || statusCode >= 300 || req.method === "HEAD") {
|
|
120
|
+
res.writeHead(statusCode, headers);
|
|
121
|
+
res.end(req.method === "HEAD" ? "" : originalBody);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
try {
|
|
126
|
+
const serverInfo = JSON.parse(originalBody.toString("utf8"));
|
|
127
|
+
const runtimeServices =
|
|
128
|
+
typeof runtimeServicesInfo === "string"
|
|
129
|
+
? JSON.parse(runtimeServicesInfo)
|
|
130
|
+
: runtimeServicesInfo;
|
|
131
|
+
const body = Buffer.from(
|
|
132
|
+
JSON.stringify({
|
|
133
|
+
...serverInfo,
|
|
134
|
+
runtime_services: runtimeServices,
|
|
135
|
+
}),
|
|
136
|
+
"utf8",
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
delete headers["content-length"];
|
|
140
|
+
delete headers["transfer-encoding"];
|
|
141
|
+
headers["content-type"] = "application/json; charset=utf-8";
|
|
142
|
+
headers["cache-control"] = "no-store";
|
|
143
|
+
res.writeHead(statusCode, headers);
|
|
144
|
+
res.end(body);
|
|
145
|
+
} catch (err) {
|
|
146
|
+
console.warn(
|
|
147
|
+
`Could not append runtime_services to ${SERVER_INFO_PATH}: ${
|
|
148
|
+
err instanceof Error ? err.message : String(err)
|
|
149
|
+
}`,
|
|
150
|
+
);
|
|
151
|
+
res.writeHead(statusCode, headers);
|
|
152
|
+
res.end(originalBody);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
},
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
proxyReq.on("error", (err) => {
|
|
159
|
+
if (!isBenignSocketError(err)) {
|
|
160
|
+
console.error(`Proxy error for ${req.url}:`, err.message);
|
|
161
|
+
}
|
|
162
|
+
if (!res.headersSent) {
|
|
163
|
+
res.writeHead(502);
|
|
164
|
+
res.end(`Bad Gateway: ${err.message}`);
|
|
165
|
+
} else {
|
|
166
|
+
res.destroy();
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
req.on("error", (err) => {
|
|
171
|
+
if (!isBenignSocketError(err)) {
|
|
172
|
+
console.error(`Client request error for ${req.url}:`, err.message);
|
|
173
|
+
}
|
|
174
|
+
proxyReq.destroy();
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
res.on("error", (err) => {
|
|
178
|
+
if (!isBenignSocketError(err)) {
|
|
179
|
+
console.error(`Client response error for ${req.url}:`, err.message);
|
|
180
|
+
}
|
|
181
|
+
proxyReq.destroy();
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
req.pipe(proxyReq, { end: true });
|
|
185
|
+
}
|
|
186
|
+
|
|
38
187
|
function once(fn) {
|
|
39
188
|
let called = false;
|
|
40
189
|
return (...args) => {
|
|
@@ -97,7 +246,7 @@ export function createProxyHandlers({
|
|
|
97
246
|
res.on("finish", finish);
|
|
98
247
|
res.on("error", finish);
|
|
99
248
|
|
|
100
|
-
|
|
249
|
+
const handleProxyError = (err) => {
|
|
101
250
|
metrics.totalErrors += 1;
|
|
102
251
|
if (!isBenignSocketError(err)) {
|
|
103
252
|
console.error(
|
|
@@ -107,7 +256,13 @@ export function createProxyHandlers({
|
|
|
107
256
|
}
|
|
108
257
|
writeProxyError(res, err instanceof Error ? err.message : String(err));
|
|
109
258
|
finish();
|
|
110
|
-
}
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
try {
|
|
262
|
+
proxy.web(req, res, { target }).catch(handleProxyError);
|
|
263
|
+
} catch (err) {
|
|
264
|
+
handleProxyError(err);
|
|
265
|
+
}
|
|
111
266
|
}
|
|
112
267
|
|
|
113
268
|
function proxyWebSocket(req, socket, head, target) {
|
|
@@ -2,19 +2,19 @@
|
|
|
2
2
|
* Single source of truth for the `<RUNTIME_SERVICES>` block.
|
|
3
3
|
*
|
|
4
4
|
* Builds a structured description of the services that are reachable from
|
|
5
|
-
* inside the agent's sandbox.
|
|
6
|
-
*
|
|
7
|
-
* `AgentContext.system_message_suffix`, so the agent sees a
|
|
5
|
+
* inside the agent's sandbox. Agent Canvas backend-serving processes attach it
|
|
6
|
+
* to `/server_info.runtime_services`; the frontend renders that backend value
|
|
7
|
+
* into `AgentContext.system_message_suffix`, so the agent sees a
|
|
8
8
|
* `<RUNTIME_SERVICES>` block listing what's available without having to probe.
|
|
9
9
|
*
|
|
10
10
|
* Two callers share this one definition:
|
|
11
11
|
* - the dev launchers (scripts/dev-*.mjs), which know the stack as a set of
|
|
12
|
-
* ports and
|
|
12
|
+
* ports and pass the result to ingress/static-server for `/server_info`;
|
|
13
13
|
* - docker/entrypoint.sh, which runs this file as a CLI (see the bottom of
|
|
14
14
|
* this module) because in a container the URLs are *runtime* config — the
|
|
15
15
|
* ports and base URLs are overridable at `docker run` and therefore cannot
|
|
16
|
-
* be baked into the image at build time. The JSON it prints is
|
|
17
|
-
*
|
|
16
|
+
* be baked into the image at build time. The JSON it prints is passed to
|
|
17
|
+
* scripts/static-server.mjs and exposed through `/server_info`.
|
|
18
18
|
*
|
|
19
19
|
* URLs are written from the *agent's* point of view (i.e. as the agent should
|
|
20
20
|
* curl/fetch them from inside its sandbox), which is deliberately not the
|
package/scripts/static-build.mjs
CHANGED
|
@@ -3,7 +3,6 @@ import { existsSync } from "node:fs";
|
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
|
|
5
5
|
import {
|
|
6
|
-
buildAutomationRuntimeServicesInfo,
|
|
7
6
|
c,
|
|
8
7
|
logError,
|
|
9
8
|
logService,
|
|
@@ -45,12 +44,6 @@ export function buildFrontend(config, args = {}) {
|
|
|
45
44
|
// Bake the session API key — used by the frontend for both agent-server
|
|
46
45
|
// and automation auth via the `X-Session-API-Key` header.
|
|
47
46
|
VITE_SESSION_API_KEY: config.sessionApiKey,
|
|
48
|
-
// Bake a description of the runtime services in this dev stack so the
|
|
49
|
-
// frontend can populate the agent's <RUNTIME_SERVICES> system-prompt
|
|
50
|
-
// block when creating a conversation.
|
|
51
|
-
VITE_RUNTIME_SERVICES_INFO: JSON.stringify(
|
|
52
|
-
buildAutomationRuntimeServicesInfo(config),
|
|
53
|
-
),
|
|
54
47
|
// Intentionally do NOT set VITE_BACKEND_BASE_URL: leaving it unset makes
|
|
55
48
|
// the runtime fall back to window.location.origin, which keeps the build
|
|
56
49
|
// portable across localhost, LAN hosts, and tunnels such as ngrok.
|