@openhands/agent-canvas 1.14.0 → 1.16.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 +15 -1
- package/README.windows.md +2 -2
- package/build/assets/acp-providers-CX3Lh9gj.js +1 -0
- package/build/assets/active-backend-context-CrHTlgvN.js +2 -0
- package/build/assets/agent-context-settings-DSZlXrLj.js +1 -0
- package/build/assets/agent-profiles-settings-Dzgb7G9z.js +1 -0
- package/build/assets/agent-server-conversation-service.api-tnqNjbpE.js +86 -0
- package/build/assets/agent-settings-DLtsqaOs.js +2 -0
- package/build/assets/agent-settings-fFvR-XC2.js +1 -0
- package/build/assets/alert-banner-HP6mX-Vr.js +1 -0
- package/build/assets/api-error-message-B-XdSk3b.js +1 -0
- package/build/assets/api-key-entry-screen-qTzrmJcr.js +1 -0
- package/build/assets/app-settings-dbnneVaV.js +1 -0
- package/build/assets/automation-detail-BmwlCUAB.js +3 -0
- package/build/assets/automation-export-D3a3of4G.js +2 -0
- package/build/assets/automation-git-sync-CprN5DcU.js +1 -0
- package/build/assets/automation-setup-route-C40kXjMY.js +1 -0
- package/build/assets/automation-templates-BRppNh99.js +1 -0
- package/build/assets/automations-list-DuNcRawl.js +1 -0
- package/build/assets/back-nav-button-Cjl_hoxq.js +1 -0
- package/build/assets/backend-form-modal-lhGwzXFI.js +1 -0
- package/build/assets/backend-synced-settings-badge-DPkz30BE.js +1 -0
- package/build/assets/badge-BU3S0VtE.js +1 -0
- package/build/assets/base-modal-D_L0oEbG.js +1 -0
- package/build/assets/bot-dMYHVfYM.js +1 -0
- package/build/assets/brand-button-BAfk4wGP.js +1 -0
- package/build/assets/browser-DSAo0tz1.js +46 -0
- package/build/assets/browser-tab-C9vy56R5.js +1 -0
- package/build/assets/canvas-extension-page-dx1gFrfW.js +1 -0
- package/build/assets/canvas-extensions-8A-XhpgP.js +1 -0
- package/build/assets/canvas-extensions-runtime-2_x5Ezmi.js +1 -0
- package/build/assets/chat-send-button-MUQqCZCS.js +1 -0
- package/build/assets/check-CS0vmpQQ.js +1 -0
- package/build/assets/chevron-down-e1QBpjVy.js +1 -0
- package/build/assets/chevron-right-ZG4R5G4Q.js +1 -0
- package/build/assets/circle-check-DzWLNsbE.js +1 -0
- package/build/assets/circle-plus-check-toggle-BO_kFZt3.js +1 -0
- package/build/assets/cloud-funnel-analytics-CztBCCPp.js +1 -0
- package/build/assets/cog-D-MPQW6G.js +1 -0
- package/build/assets/command-menu--UIlGL72.js +1 -0
- package/build/assets/commits-tab-AnZwLvh-.js +1 -0
- package/build/assets/condenser-settings-DmEOje-7.js +1 -0
- package/build/assets/confirmation-modal-Dv1ktp8K.js +1 -0
- package/build/assets/context-menu-list-item-I86vKcmM.js +1 -0
- package/build/assets/conversation-BbGrAO4Z.js +93 -0
- package/build/assets/conversation-mYT6NAoj.js +1 -0
- package/build/assets/conversation-panel-mYT6NAoj.js +1 -0
- package/build/assets/conversation-state-store-B0ImPLHO.js +1 -0
- package/build/assets/conversation-store-Ca3ghXap.js +6 -0
- package/build/assets/conversation-tab-empty-state-FIbh_lc8.js +1 -0
- package/build/assets/copy-to-clipboard-button-Ca8iSkkA.js +1 -0
- package/build/assets/device-verify-Bhn2e_Ye.js +1 -0
- package/build/assets/dropdown-classes-Bc1djN0-.js +1 -0
- package/build/assets/edit-automation-modal-DadGbJ2u.js +1 -0
- package/build/assets/empty-state-BoGVDecT.js +1 -0
- package/build/assets/entry.client-CqyPPjOq.js +2 -0
- package/build/assets/enum-filter-dropdown-Bgca129f.js +1 -0
- package/build/assets/environment-switch-overlay-BmBRT7gv.js +1 -0
- package/build/assets/error-state-Body8Ngd.js +1 -0
- package/build/assets/extension-module-card-classes-DpeaYhYo.js +1 -0
- package/build/assets/extensions-hub-CcDqq_vR.js +1 -0
- package/build/assets/extensions-navigation-Cr4yzYk4.js +1 -0
- package/build/assets/external-link-DKUlnCQV.js +1 -0
- package/build/assets/files-tab-D4o2VyE_.js +1 -0
- package/build/assets/form-control-classes-Bkh5FGrD.js +1 -0
- package/build/assets/format-model-name-CasAP3nd.js +1 -0
- package/build/assets/get-git-path-ChKDVHZp.js +1 -0
- package/build/assets/git-repo-dropdown-4ROKl2cB.js +1 -0
- package/build/assets/git-repo-dropdown-BkqzkMmM.js +1 -0
- package/build/assets/highlighted-source-view-BFRxGT_Q.js +1 -0
- package/build/assets/home-ChpSuepX.js +1 -0
- package/build/assets/home-DIsB440S.js +1 -0
- package/build/assets/home-automation-run-tooltip-BVNDWjAH.js +1 -0
- package/build/assets/home-store-CY9Ej0ux.js +1 -0
- package/build/assets/index-home-BdlrFIif.js +1 -0
- package/build/assets/info-B6RQawoW.js +1 -0
- package/build/assets/install-server-modal-Dpy89p4g.js +1 -0
- package/build/assets/kebab-menu-item-content-D8hSNGmm.js +1 -0
- package/build/assets/key-BmVyxs-2.js +1 -0
- package/build/assets/launch-IrTDEFCs.js +1 -0
- package/build/assets/list-filter-DsEK7NFC.js +1 -0
- package/build/assets/list-todo-apgLVjMw.js +1 -0
- package/build/assets/llm-not-configured-banner-CIFABh3K.js +27 -0
- package/build/assets/llm-settings-B9juXhIa.js +1 -0
- package/build/assets/llm-settings-De1d5dfr.js +1 -0
- package/build/assets/llm-subscription-service-BpJ0ouQo.js +1 -0
- package/build/assets/loader-circle-CC1au6hc.js +1 -0
- package/build/assets/loading-spinner-BY9N3pOe.js +1 -0
- package/build/assets/manage-backends-modal-BrPV3oB-.js +1 -0
- package/build/assets/manifest-80fb1c29.js +1 -0
- package/build/assets/manifest-subpage-layout-CAOYzrYp.js +1 -0
- package/build/assets/map-provider-Cu3Zgumb.js +1 -0
- package/build/assets/markdown-renderer-BzTlxI8x.js +8 -0
- package/build/assets/mcp-BTs_SXfZ.js +1 -0
- package/build/assets/mcp-marketplace-utils-AIBzzHTO.js +1 -0
- package/build/assets/mcp-page-BEBYqH_K.js +9 -0
- package/build/assets/messages-DKV9cRc2.js +41 -0
- package/build/assets/modal-body-BxZjsju9.js +1 -0
- package/build/assets/modal-classes-C8eycCwG.js +1 -0
- package/build/assets/modal-close-button-DDzdRvCs.js +1 -0
- package/build/assets/mouse-pointer-click-Co2uyaPA.js +1 -0
- package/build/assets/onboarding-DV_OXoeP.js +1 -0
- package/build/assets/onboarding-modal-rkyBYkeQ.js +1 -0
- package/build/assets/organization-service.api-DrYNkEN_.js +1 -0
- package/build/assets/parse-git-remote-url-DpDM9bK6.js +1 -0
- package/build/assets/pencil-47jAZH_V.js +1 -0
- package/build/assets/pin-By41Vl5J.js +1 -0
- package/build/assets/planner-tab-C9uZmhme.js +1 -0
- package/build/assets/plug-CG5HFcNG.js +1 -0
- package/build/assets/plugins-management-service-BMJgC3Ga.js +1 -0
- package/build/assets/plus-C7Slq-0I.js +1 -0
- package/build/assets/profiles-service.api-ChoKrL0l.js +1 -0
- package/build/assets/providers-BhMcY5nv.js +1 -0
- package/build/assets/proxy-9Fe1v5na.js +1 -0
- package/build/assets/puzzle-JM_QaRm0.js +1 -0
- package/build/assets/recommended-automations-launcher-6ABrI9Cy.js +1 -0
- package/build/assets/refresh-cw-3q3Frrii.js +1 -0
- package/build/assets/root-Dc8YmC9F.js +2 -0
- package/build/assets/root-VDaypvK4.css +1 -0
- package/build/assets/root-layout-CXkhSPYh.js +2 -0
- package/build/assets/schema-field-D-y9-LDb.js +1 -0
- package/build/assets/scroll-fade-state-Dw-i4SGq.js +1 -0
- package/build/assets/sdk-section-page-BlFiizlG.js +1 -0
- package/build/assets/secret-form-BB7the8W.js +1 -0
- package/build/assets/secrets-service-ByZVENbp.js +1 -0
- package/build/assets/secrets-settings-B_GpxKW2.js +1 -0
- package/build/assets/server-process-C9RKzd1x.js +1 -0
- package/build/assets/settings-C0EWuBtA.js +1 -0
- package/build/assets/settings-CKqk8ZnH.js +1 -0
- package/build/assets/settings-dropdown-input-BcwylHs2.js +1 -0
- package/build/assets/settings-index-5w5UW2K3.js +1 -0
- package/build/assets/settings-input-Db-1g8Ql.js +1 -0
- package/build/assets/settings-list-classes-BzeSZbF2.js +1 -0
- package/build/assets/settings-modal-DfJ3tcJQ.js +1 -0
- package/build/assets/settings-service.api-DJ1r62Zr.js +1 -0
- package/build/assets/settings-switch-CS-dJDmA.js +1 -0
- package/build/assets/settings-utils-UYpEdPuD.js +1 -0
- package/build/assets/shared-conversation-CA5ISEDy.js +1 -0
- package/build/assets/shield-check-D2aCRd16.js +1 -0
- package/build/assets/sidebar-layout-D6fS8-Gl.js +1 -0
- package/build/assets/sidebar-mobile-menu-toggle-C_fb0Jki.js +1 -0
- package/build/assets/sidebar-nav-link-DQQcMf1A.js +1 -0
- package/build/assets/sidebar-onboarding-checklist-storage-BBkeI6Bp.js +1 -0
- package/build/assets/sidebar-store-DGqHkVLw.js +1 -0
- package/build/assets/skill-card-pill-row-B27-xyig.js +1 -0
- package/build/assets/skill-enablement-DXeaImBz.js +1 -0
- package/build/assets/skill-filter-w__3UCEE.js +2 -0
- package/build/assets/skill-icon-badge-RQkq8wvl.js +1 -0
- package/build/assets/skill-scope-B42H-XOc.js +1 -0
- package/build/assets/skills-plugins-tgF8EiXC.js +1 -0
- package/build/assets/skills-settings-BgJ9PaOe.js +1 -0
- package/build/assets/styled-tooltip-C4jf5Fv9.js +1 -0
- package/build/assets/task-list-tab-C5zcaktH.js +1 -0
- package/build/assets/terminal-CNElN42a.js +3 -0
- package/build/assets/toggle-switch-ChOLXv2n.js +1 -0
- package/build/assets/trash-2-D7K26eDO.js +1 -0
- package/build/assets/trash-D-HYiVYM.js +1 -0
- package/build/assets/triangle-alert-CtdXWHUI.js +1 -0
- package/build/assets/typography-v1KN0tzi.js +1 -0
- package/build/assets/usage-tab-CVDffLPt.js +1 -0
- package/build/assets/use-acp-credential-form-XIQmpX6M.js +1 -0
- package/build/assets/use-activate-agent-profile-BLfmvDiG.js +1 -0
- package/build/assets/use-agent-profiles-Bd9Bvvp1.js +1 -0
- package/build/assets/use-automation-health-E6NZi9rb.js +1 -0
- package/build/assets/use-automations-xijQKIl9.js +1 -0
- package/build/assets/use-can-manage-org-profiles-CrJP5262.js +1 -0
- package/build/assets/use-canvas-extensions-Bi693ujJ.js +1 -0
- package/build/assets/use-cloud-current-user-id-CDfAHpPX.js +1 -0
- package/build/assets/use-config-A9QovgXO.js +1 -0
- package/build/assets/use-create-conversation-Dx3l7mFZ.js +1 -0
- package/build/assets/use-create-secret-B9cUFWRG.js +1 -0
- package/build/assets/use-get-secrets-K3jmk-LH.js +1 -0
- package/build/assets/use-has-permission-B3C8rQmR.js +1 -0
- package/build/assets/use-is-authed-nTBcM7dE.js +1 -0
- package/build/assets/use-launch-skill-in-chat-BYjYihBP.js +1 -0
- package/build/assets/use-llm-configured-BV9nZ1_j.js +1 -0
- package/build/assets/use-llm-profiles-BO-P4Oyo.js +1 -0
- package/build/assets/use-manifest-capabilities-Cw_flwEz.js +1 -0
- package/build/assets/use-onboarding-completion-D8U7k4Qb.js +1 -0
- package/build/assets/use-pinned-home-route-CckOZrmb.js +1 -0
- package/build/assets/use-plugins-marketplace-7i94Zu3Z.js +1 -0
- package/build/assets/use-save-agent-profile-BUjSsDXK.js +1 -0
- package/build/assets/use-save-settings-DYqkKv7T.js +1 -0
- package/build/assets/use-settings-DSXLbvBl.js +1 -0
- package/build/assets/use-settings-nav-items-CwRw-CmX.js +16 -0
- package/build/assets/use-tracking-D53y3TH9.js +3 -0
- package/build/assets/use-user-conversation-B9Gebw_g.js +1 -0
- package/build/assets/useInfiniteQuery-C926xzY4.js +1 -0
- package/build/assets/useMutation-B-qc391N.js +1 -0
- package/build/assets/useQueries-DlbhlH9I.js +1 -0
- package/build/assets/useQuery-BSTgq1rl.js +1 -0
- package/build/assets/utils-CN5ZfZy1.js +1 -0
- package/build/assets/vendor~browser-hbU4u2Ag.js +47 -0
- package/build/assets/vendor~commits-tab-BaO2Ce3e.js +11 -0
- package/build/assets/vendor~conversation-panel~conversation-C8Fn4XOf.js +1 -0
- package/build/assets/vendor~entry.client-CoCfUXUF.js +1 -0
- package/build/assets/vendor~entry.client-DA2izTjq.js +9 -0
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-DqZDXfg2.js +186 -0
- package/build/assets/vendor~index-home~home~conversation-panel~conversation-hWywRBaR.js +13 -0
- package/build/assets/vendor~root-layout-C9Ju9DQg.js +1 -0
- package/build/assets/vendor~root-layout~conversation-panel~conversation-BMbMgaGu.js +1 -0
- package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-BWir3rJs.js +1 -0
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation-j5MFqfSy.js +1 -0
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-cDuKr-WD.js +1 -0
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-DXqM7vqB.js +1 -0
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-Chf7vmKB.js +1 -0
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~nj1hli3r-DP9wmsjo.js +48 -0
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-CUmIwQCN.js +5053 -0
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-C7HiY4Ae.js +8459 -0
- package/build/assets/verification-settings-gw_q6vkL.js +1 -0
- package/build/assets/wrench-CUEI1krB.js +1 -0
- package/build/assets/x-DJdhbdmt.js +1 -0
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +156 -59
- package/build/locales/ca/openhands.json +156 -59
- package/build/locales/de/openhands.json +156 -59
- package/build/locales/en/openhands.json +156 -59
- package/build/locales/es/openhands.json +156 -59
- package/build/locales/fr/openhands.json +156 -59
- package/build/locales/it/openhands.json +156 -59
- package/build/locales/ja/openhands.json +156 -59
- package/build/locales/ko-KR/openhands.json +156 -59
- package/build/locales/no/openhands.json +156 -59
- package/build/locales/pt/openhands.json +156 -59
- package/build/locales/tr/openhands.json +156 -59
- package/build/locales/uk/openhands.json +156 -59
- package/build/locales/zh-CN/openhands.json +156 -59
- package/build/locales/zh-TW/openhands.json +156 -59
- package/config/defaults.json +9 -5
- package/dist/api/agent-profiles-service/profile-field-support.d.ts +26 -0
- 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 +10 -1
- package/dist/api/agent-server-adapter.js +139 -132
- 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 +21 -0
- package/dist/api/agent-server-compatibility.js +52 -38
- package/dist/api/agent-server-compatibility.js.map +1 -1
- package/dist/api/agent-server-config.cjs +1 -1
- package/dist/api/agent-server-config.cjs.map +1 -1
- package/dist/api/agent-server-config.d.ts +26 -0
- package/dist/api/agent-server-config.js +18 -5
- package/dist/api/agent-server-config.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 +13 -2
- package/dist/api/automation-service/automation-service.api.js +99 -84
- package/dist/api/automation-service/automation-service.api.js.map +1 -1
- package/dist/api/backend-registry/url-selection.cjs +1 -1
- package/dist/api/backend-registry/url-selection.cjs.map +1 -1
- package/dist/api/backend-registry/url-selection.d.ts +2 -1
- package/dist/api/backend-registry/url-selection.js +2 -2
- package/dist/api/backend-registry/url-selection.js.map +1 -1
- package/dist/api/canvas-extensions-service.cjs +1 -0
- package/dist/api/canvas-extensions-service.d.ts +22 -0
- package/dist/api/canvas-extensions-service.js +4 -0
- package/dist/api/cloud/conversation-service.api.cjs +1 -1
- package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
- package/dist/api/cloud/conversation-service.api.d.ts +6 -0
- package/dist/api/cloud/conversation-service.api.js +14 -6
- package/dist/api/cloud/conversation-service.api.js.map +1 -1
- package/dist/api/conversation-file-upload.api.cjs +1 -1
- package/dist/api/conversation-file-upload.api.js +10 -10
- package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +11 -0
- package/dist/api/conversation-service/agent-server-conversation-service.api.js +138 -122
- package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
- package/dist/api/event-service/event-service.api.cjs +1 -1
- package/dist/api/event-service/event-service.api.js +12 -12
- package/dist/api/git-provider-items-service.cjs +2 -0
- package/dist/api/git-provider-items-service.cjs.map +1 -0
- package/dist/api/git-provider-items-service.d.ts +25 -0
- package/dist/api/git-provider-items-service.js +127 -0
- package/dist/api/git-provider-items-service.js.map +1 -0
- package/dist/api/git-service/agent-server-git-service.api.cjs +1 -1
- package/dist/api/git-service/agent-server-git-service.api.js +8 -8
- package/dist/api/mcp-health/probe-mcp-server-health.cjs +1 -1
- package/dist/api/mcp-health/probe-mcp-server-health.js +31 -31
- package/dist/api/open-hands.types.d.ts +0 -19
- package/dist/api/profiles-service/profiles-service.api.cjs.map +1 -1
- package/dist/api/profiles-service/profiles-service.api.d.ts +16 -2
- package/dist/api/profiles-service/profiles-service.api.js.map +1 -1
- package/dist/api/provider-connections-service/provider-connections-service.api.cjs +2 -0
- package/dist/api/provider-connections-service/provider-connections-service.api.cjs.map +1 -0
- package/dist/api/provider-connections-service/provider-connections-service.api.d.ts +34 -0
- package/dist/api/provider-connections-service/provider-connections-service.api.js +50 -0
- package/dist/api/provider-connections-service/provider-connections-service.api.js.map +1 -0
- package/dist/api/runtime-service/agent-server-runtime-service.cjs +1 -1
- package/dist/api/runtime-service/agent-server-runtime-service.js +8 -8
- 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.d.ts +3 -2
- package/dist/api/settings-service/settings-service.api.js +2 -1
- package/dist/api/settings-service/settings-service.api.js.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/create-skill-ready-event.cjs +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/create-skill-ready-event.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/create-skill-ready-event.js +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/create-skill-ready-event.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/event-group.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message-components/event-group.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/event-group.js +40 -36
- package/dist/components/conversation-events/chat/event-message-components/event-group.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message.js +1 -1
- package/dist/components/conversation-events/chat/event-message.js.map +1 -1
- package/dist/components/conversation-events/chat/messages.cjs.map +1 -1
- package/dist/components/conversation-events/chat/messages.js.map +1 -1
- package/dist/components/features/automations/add-automation-menu.d.ts +7 -0
- package/dist/components/features/automations/add-automation-modal.cjs +2 -0
- package/dist/components/features/automations/add-automation-modal.cjs.map +1 -0
- package/dist/components/features/automations/add-automation-modal.js +42 -0
- package/dist/components/features/automations/add-automation-modal.js.map +1 -0
- package/dist/components/features/automations/automation-action-button-classes.cjs +2 -0
- package/dist/components/features/automations/automation-action-button-classes.cjs.map +1 -0
- package/dist/components/features/automations/automation-action-button-classes.d.ts +0 -2
- package/dist/components/features/automations/automation-action-button-classes.js +8 -0
- package/dist/components/features/automations/automation-action-button-classes.js.map +1 -0
- package/dist/components/features/automations/automation-card-skeleton.cjs +2 -0
- package/dist/components/features/automations/automation-card-skeleton.cjs.map +1 -0
- package/dist/components/features/automations/automation-card-skeleton.js +33 -0
- package/dist/components/features/automations/automation-card-skeleton.js.map +1 -0
- package/dist/components/features/automations/automation-card.cjs +2 -0
- package/dist/components/features/automations/automation-card.cjs.map +1 -0
- package/dist/components/features/automations/automation-card.d.ts +1 -1
- package/dist/components/features/automations/automation-card.js +170 -0
- package/dist/components/features/automations/automation-card.js.map +1 -0
- package/dist/components/features/automations/automation-group.cjs +2 -0
- package/dist/components/features/automations/automation-group.cjs.map +1 -0
- package/dist/components/features/automations/automation-group.js +54 -0
- package/dist/components/features/automations/automation-group.js.map +1 -0
- package/dist/components/features/automations/automation-list-row.cjs +2 -0
- package/dist/components/features/automations/automation-list-row.cjs.map +1 -0
- package/dist/components/features/automations/automation-list-row.js +152 -0
- package/dist/components/features/automations/automation-list-row.js.map +1 -0
- package/dist/components/features/automations/automation-run-insights.cjs +2 -0
- package/dist/components/features/automations/automation-run-insights.cjs.map +1 -0
- package/dist/components/features/automations/automation-run-insights.js +46 -0
- package/dist/components/features/automations/automation-run-insights.js.map +1 -0
- package/dist/components/features/automations/automation-view-mode.cjs +2 -0
- package/dist/components/features/automations/automation-view-mode.cjs.map +1 -0
- package/dist/components/features/automations/automation-view-mode.d.ts +5 -1
- package/dist/components/features/automations/automation-view-mode.js +6 -0
- package/dist/components/features/automations/automation-view-mode.js.map +1 -0
- package/dist/components/features/automations/backend-not-configured.cjs +2 -0
- package/dist/components/features/automations/backend-not-configured.cjs.map +1 -0
- package/dist/components/features/automations/backend-not-configured.js +34 -0
- package/dist/components/features/automations/backend-not-configured.js.map +1 -0
- package/dist/components/features/automations/build-automation-menu-items.cjs +2 -0
- package/dist/components/features/automations/build-automation-menu-items.cjs.map +1 -0
- package/dist/components/features/automations/build-automation-menu-items.js +53 -0
- package/dist/components/features/automations/build-automation-menu-items.js.map +1 -0
- package/dist/components/features/automations/build-automation-pills.cjs +2 -0
- package/dist/components/features/automations/build-automation-pills.cjs.map +1 -0
- package/dist/components/features/automations/build-automation-pills.js +71 -0
- package/dist/components/features/automations/build-automation-pills.js.map +1 -0
- package/dist/components/features/automations/create-instructions.cjs +2 -0
- package/dist/components/features/automations/create-instructions.cjs.map +1 -0
- package/dist/components/features/automations/create-instructions.js +102 -0
- package/dist/components/features/automations/create-instructions.js.map +1 -0
- package/dist/components/features/automations/dashboard/automations-dashboard-controls.d.ts +4 -3
- package/dist/components/features/automations/detail/run-phase.cjs +2 -0
- package/dist/components/features/automations/detail/run-phase.cjs.map +1 -0
- package/dist/components/features/automations/detail/run-phase.d.ts +89 -0
- package/dist/components/features/automations/detail/run-phase.js +72 -0
- package/dist/components/features/automations/detail/run-phase.js.map +1 -0
- package/dist/components/features/automations/detail/run-status-badge.cjs +2 -0
- package/dist/components/features/automations/detail/run-status-badge.cjs.map +1 -0
- package/dist/components/features/automations/detail/run-status-badge.js +102 -0
- package/dist/components/features/automations/detail/run-status-badge.js.map +1 -0
- package/dist/components/features/automations/empty-state.cjs +2 -0
- package/dist/components/features/automations/empty-state.cjs.map +1 -0
- package/dist/components/features/automations/empty-state.js +35 -0
- package/dist/components/features/automations/empty-state.js.map +1 -0
- package/dist/components/features/automations/error-state.cjs +2 -0
- package/dist/components/features/automations/error-state.cjs.map +1 -0
- package/dist/components/features/automations/error-state.js +28 -0
- package/dist/components/features/automations/error-state.js.map +1 -0
- package/dist/components/features/automations/import-automation-modal.d.ts +2 -1
- package/dist/components/features/automations/kebab-menu-item-content.cjs +2 -0
- package/dist/components/features/automations/kebab-menu-item-content.cjs.map +1 -0
- package/dist/components/features/automations/kebab-menu-item-content.js +21 -0
- package/dist/components/features/automations/kebab-menu-item-content.js.map +1 -0
- package/dist/components/features/automations/kebab-menu.cjs +2 -0
- package/dist/components/features/automations/kebab-menu.cjs.map +1 -0
- package/dist/components/features/automations/kebab-menu.d.ts +2 -1
- package/dist/components/features/automations/kebab-menu.js +76 -0
- package/dist/components/features/automations/kebab-menu.js.map +1 -0
- package/dist/components/features/automations/recommended-automations-launcher.cjs +2 -0
- package/dist/components/features/automations/recommended-automations-launcher.cjs.map +1 -0
- package/dist/components/features/automations/recommended-automations-launcher.d.ts +7 -1
- package/dist/components/features/automations/recommended-automations-launcher.js +134 -0
- package/dist/components/features/automations/recommended-automations-launcher.js.map +1 -0
- package/dist/components/features/automations/recommended-automations-rail.cjs +2 -0
- package/dist/components/features/automations/recommended-automations-rail.cjs.map +1 -0
- package/dist/components/features/automations/recommended-automations-rail.d.ts +9 -0
- package/dist/components/features/automations/recommended-automations-rail.js +127 -0
- package/dist/components/features/automations/recommended-automations-rail.js.map +1 -0
- package/dist/components/features/automations/recommended-automations-section.cjs +2 -0
- package/dist/components/features/automations/recommended-automations-section.cjs.map +1 -0
- package/dist/components/features/automations/recommended-automations-section.d.ts +2 -2
- package/dist/components/features/automations/recommended-automations-section.js +198 -0
- package/dist/components/features/automations/recommended-automations-section.js.map +1 -0
- package/dist/components/features/automations/responder-deployment-modal.cjs +2 -0
- package/dist/components/features/automations/responder-deployment-modal.cjs.map +1 -0
- package/dist/components/features/automations/responder-deployment-modal.js +75 -0
- package/dist/components/features/automations/responder-deployment-modal.js.map +1 -0
- package/dist/components/features/automations/status-badge.cjs +2 -0
- package/dist/components/features/automations/status-badge.cjs.map +1 -0
- package/dist/components/features/automations/status-badge.js +12 -0
- package/dist/components/features/automations/status-badge.js.map +1 -0
- package/dist/components/features/automations/to-latest-run-state.cjs +2 -0
- package/dist/components/features/automations/to-latest-run-state.cjs.map +1 -0
- package/dist/components/features/automations/to-latest-run-state.d.ts +6 -0
- package/dist/components/features/automations/to-latest-run-state.js +21 -0
- package/dist/components/features/automations/to-latest-run-state.js.map +1 -0
- package/dist/components/features/backends/backend-form-modal.cjs +1 -1
- package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
- package/dist/components/features/backends/backend-form-modal.js +15 -21
- package/dist/components/features/backends/backend-form-modal.js.map +1 -1
- package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
- package/dist/components/features/backends/manage-backends-modal.js +5 -5
- package/dist/components/features/canvas-extensions/add-canvas-extension-modal.d.ts +6 -0
- package/dist/components/features/canvas-extensions/canvas-extension-card.d.ts +9 -0
- package/dist/components/features/canvas-extensions/canvas-extensions-runtime.cjs +2 -0
- package/dist/components/features/canvas-extensions/canvas-extensions-runtime.cjs.map +1 -0
- package/dist/components/features/canvas-extensions/canvas-extensions-runtime.d.ts +23 -0
- package/dist/components/features/canvas-extensions/canvas-extensions-runtime.js +19 -0
- package/dist/components/features/canvas-extensions/canvas-extensions-runtime.js.map +1 -0
- package/dist/components/features/chat/chat-interface.cjs +2 -2
- package/dist/components/features/chat/chat-interface.cjs.map +1 -1
- package/dist/components/features/chat/chat-interface.js +138 -133
- package/dist/components/features/chat/chat-interface.js.map +1 -1
- package/dist/components/features/chat/chat-markdown-path-code.cjs +3 -0
- package/dist/components/features/chat/chat-markdown-path-code.cjs.map +1 -0
- package/dist/components/features/chat/chat-markdown-path-code.d.ts +27 -0
- package/dist/components/features/chat/chat-markdown-path-code.js +72 -0
- package/dist/components/features/chat/chat-markdown-path-code.js.map +1 -0
- package/dist/components/features/chat/path-component.cjs +1 -1
- package/dist/components/features/chat/path-component.cjs.map +1 -1
- package/dist/components/features/chat/path-component.d.ts +8 -2
- package/dist/components/features/chat/path-component.js +33 -21
- package/dist/components/features/chat/path-component.js.map +1 -1
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs +1 -1
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs.map +1 -1
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js +38 -43
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js.map +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs.map +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.d.ts +8 -5
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js +22 -16
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js.map +1 -1
- package/dist/components/features/chat/user-message-body.cjs +1 -1
- package/dist/components/features/chat/user-message-body.cjs.map +1 -1
- package/dist/components/features/chat/user-message-body.d.ts +4 -0
- package/dist/components/features/chat/user-message-body.js +30 -24
- package/dist/components/features/chat/user-message-body.js.map +1 -1
- package/dist/components/features/command-menu/command-menu-items.d.ts +10 -4
- package/dist/components/features/conversation/conversation-git-actions-menu.cjs +2 -0
- package/dist/components/features/conversation/conversation-git-actions-menu.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-git-actions-menu.d.ts +15 -0
- package/dist/components/features/conversation/conversation-git-actions-menu.js +123 -0
- package/dist/components/features/conversation/conversation-git-actions-menu.js.map +1 -0
- package/dist/components/features/conversation/conversation-git-actions-toggle.cjs +2 -0
- package/dist/components/features/conversation/conversation-git-actions-toggle.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-git-actions-toggle.d.ts +10 -0
- package/dist/components/features/conversation/conversation-git-actions-toggle.js +60 -0
- package/dist/components/features/conversation/conversation-git-actions-toggle.js.map +1 -0
- package/dist/components/features/conversation/conversation-main/chat-interface-wrapper.cjs +1 -1
- package/dist/components/features/conversation/conversation-main/chat-interface-wrapper.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-main/chat-interface-wrapper.js +46 -10
- package/dist/components/features/conversation/conversation-main/chat-interface-wrapper.js.map +1 -1
- package/dist/components/features/conversation/conversation-main/conversation-main.cjs +1 -1
- package/dist/components/features/conversation/conversation-main/conversation-main.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-main/conversation-main.js +49 -43
- package/dist/components/features/conversation/conversation-main/conversation-main.js.map +1 -1
- package/dist/components/features/conversation/conversation-name-with-status.cjs +1 -1
- package/dist/components/features/conversation/conversation-name-with-status.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-name-with-status.js +49 -40
- package/dist/components/features/conversation/conversation-name-with-status.js.map +1 -1
- package/dist/components/features/conversation/conversation-name.cjs +1 -1
- package/dist/components/features/conversation/conversation-name.js +4 -4
- package/dist/components/features/conversation/conversation-overview-automations-panel.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-automations-panel.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-automations-panel.d.ts +6 -0
- package/dist/components/features/conversation/conversation-overview-automations-panel.js +48 -0
- package/dist/components/features/conversation/conversation-overview-automations-panel.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-context-menu.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-context-menu.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-context-menu.d.ts +10 -0
- package/dist/components/features/conversation/conversation-overview-context-menu.js +221 -0
- package/dist/components/features/conversation/conversation-overview-context-menu.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-diffs-row.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-diffs-row.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-diffs-row.d.ts +2 -0
- package/dist/components/features/conversation/conversation-overview-diffs-row.js +88 -0
- package/dist/components/features/conversation/conversation-overview-diffs-row.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-drawer-content.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-drawer-content.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-drawer-content.d.ts +6 -0
- package/dist/components/features/conversation/conversation-overview-drawer-content.js +138 -0
- package/dist/components/features/conversation/conversation-overview-drawer-content.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-drawer-context.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-drawer-context.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-drawer-context.d.ts +17 -0
- package/dist/components/features/conversation/conversation-overview-drawer-context.js +43 -0
- package/dist/components/features/conversation/conversation-overview-drawer-context.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-drawer.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-drawer.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-drawer.constants.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-drawer.constants.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-drawer.constants.d.ts +6 -0
- package/dist/components/features/conversation/conversation-overview-drawer.constants.js +6 -0
- package/dist/components/features/conversation/conversation-overview-drawer.constants.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-drawer.d.ts +7 -0
- package/dist/components/features/conversation/conversation-overview-drawer.js +45 -0
- package/dist/components/features/conversation/conversation-overview-drawer.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-drawer.types.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-drawer.types.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-drawer.types.d.ts +12 -0
- package/dist/components/features/conversation/conversation-overview-drawer.types.js +13 -0
- package/dist/components/features/conversation/conversation-overview-drawer.types.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-git-items-panel.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-git-items-panel.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-git-items-panel.d.ts +7 -0
- package/dist/components/features/conversation/conversation-overview-git-items-panel.js +81 -0
- package/dist/components/features/conversation/conversation-overview-git-items-panel.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-git-section.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-git-section.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-git-section.d.ts +6 -0
- package/dist/components/features/conversation/conversation-overview-git-section.js +143 -0
- package/dist/components/features/conversation/conversation-overview-git-section.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-mcp-panel.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-mcp-panel.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-mcp-panel.d.ts +6 -0
- package/dist/components/features/conversation/conversation-overview-mcp-panel.js +108 -0
- package/dist/components/features/conversation/conversation-overview-mcp-panel.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-panel.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-panel.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-panel.constants.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-panel.constants.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-panel.constants.d.ts +24 -0
- package/dist/components/features/conversation/conversation-overview-panel.constants.js +12 -0
- package/dist/components/features/conversation/conversation-overview-panel.constants.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-panel.d.ts +2 -0
- package/dist/components/features/conversation/conversation-overview-panel.js +102 -0
- package/dist/components/features/conversation/conversation-overview-panel.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-project-scope-toggle.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-project-scope-toggle.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-project-scope-toggle.d.ts +8 -0
- package/dist/components/features/conversation/conversation-overview-project-scope-toggle.js +29 -0
- package/dist/components/features/conversation/conversation-overview-project-scope-toggle.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-secrets-panel.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-secrets-panel.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-secrets-panel.d.ts +6 -0
- package/dist/components/features/conversation/conversation-overview-secrets-panel.js +89 -0
- package/dist/components/features/conversation/conversation-overview-secrets-panel.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-sections.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-sections.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-sections.d.ts +43 -0
- package/dist/components/features/conversation/conversation-overview-sections.js +27 -0
- package/dist/components/features/conversation/conversation-overview-sections.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-skills-panel.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-skills-panel.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-skills-panel.d.ts +6 -0
- package/dist/components/features/conversation/conversation-overview-skills-panel.js +120 -0
- package/dist/components/features/conversation/conversation-overview-skills-panel.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-toggle.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-toggle.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-toggle.d.ts +11 -0
- package/dist/components/features/conversation/conversation-overview-toggle.js +99 -0
- package/dist/components/features/conversation/conversation-overview-toggle.js.map +1 -0
- package/dist/components/features/conversation/conversation-secondary-drawer.classes.cjs +2 -0
- package/dist/components/features/conversation/conversation-secondary-drawer.classes.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-secondary-drawer.classes.d.ts +4 -0
- package/dist/components/features/conversation/conversation-secondary-drawer.classes.js +7 -0
- package/dist/components/features/conversation/conversation-secondary-drawer.classes.js.map +1 -0
- package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js +10 -9
- package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +68 -62
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +89 -79
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.d.ts +1 -1
- package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.js +3 -3
- package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.js.map +1 -1
- package/dist/components/features/conversation/right-panel-toggle.cjs +1 -1
- package/dist/components/features/conversation/right-panel-toggle.cjs.map +1 -1
- package/dist/components/features/conversation/right-panel-toggle.d.ts +3 -2
- package/dist/components/features/conversation/right-panel-toggle.js +34 -33
- package/dist/components/features/conversation/right-panel-toggle.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +2 -1
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +14 -7
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.js +252 -225
- package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
- package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs +1 -1
- package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs.map +1 -1
- package/dist/components/features/conversation-panel/local-new-conversation-menu.js +4 -4
- package/dist/components/features/conversation-panel/local-new-conversation-menu.js.map +1 -1
- package/dist/components/features/conversation-panel/skills-modal.cjs +1 -1
- package/dist/components/features/conversation-panel/skills-modal.cjs.map +1 -1
- package/dist/components/features/conversation-panel/skills-modal.js +29 -28
- package/dist/components/features/conversation-panel/skills-modal.js.map +1 -1
- package/dist/components/features/diff-viewer/accordion-panel.cjs +2 -0
- package/dist/components/features/diff-viewer/accordion-panel.cjs.map +1 -0
- package/dist/components/features/diff-viewer/accordion-panel.d.ts +13 -0
- package/dist/components/features/diff-viewer/accordion-panel.js +41 -0
- package/dist/components/features/diff-viewer/accordion-panel.js.map +1 -0
- package/dist/components/features/diff-viewer/commit-list.cjs +1 -1
- package/dist/components/features/diff-viewer/commit-list.cjs.map +1 -1
- package/dist/components/features/diff-viewer/commit-list.d.ts +5 -1
- package/dist/components/features/diff-viewer/commit-list.js +30 -16
- package/dist/components/features/diff-viewer/commit-list.js.map +1 -1
- package/dist/components/features/diff-viewer/commit-row.cjs +1 -1
- package/dist/components/features/diff-viewer/commit-row.cjs.map +1 -1
- package/dist/components/features/diff-viewer/commit-row.d.ts +1 -2
- package/dist/components/features/diff-viewer/commit-row.js +38 -34
- package/dist/components/features/diff-viewer/commit-row.js.map +1 -1
- package/dist/components/features/diff-viewer/diff-change-list.cjs +2 -0
- package/dist/components/features/diff-viewer/diff-change-list.cjs.map +1 -0
- package/dist/components/features/diff-viewer/diff-change-list.d.ts +18 -0
- package/dist/components/features/diff-viewer/diff-change-list.js +22 -0
- package/dist/components/features/diff-viewer/diff-change-list.js.map +1 -0
- package/dist/components/features/diff-viewer/editor-container.cjs +1 -1
- package/dist/components/features/diff-viewer/editor-container.cjs.map +1 -1
- package/dist/components/features/diff-viewer/editor-container.d.ts +2 -1
- package/dist/components/features/diff-viewer/editor-container.js +8 -7
- package/dist/components/features/diff-viewer/editor-container.js.map +1 -1
- package/dist/components/features/diff-viewer/file-diff-viewer.cjs +1 -1
- package/dist/components/features/diff-viewer/file-diff-viewer.cjs.map +1 -1
- package/dist/components/features/diff-viewer/file-diff-viewer.d.ts +10 -1
- package/dist/components/features/diff-viewer/file-diff-viewer.js +138 -112
- package/dist/components/features/diff-viewer/file-diff-viewer.js.map +1 -1
- package/dist/components/features/diff-viewer/uncommitted-changes-row.cjs +2 -0
- package/dist/components/features/diff-viewer/uncommitted-changes-row.cjs.map +1 -0
- package/dist/components/features/diff-viewer/uncommitted-changes-row.d.ts +12 -0
- package/dist/components/features/diff-viewer/uncommitted-changes-row.js +51 -0
- package/dist/components/features/diff-viewer/uncommitted-changes-row.js.map +1 -0
- package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
- package/dist/components/features/files-tab/file-content-viewer.cjs.map +1 -1
- package/dist/components/features/files-tab/file-content-viewer.js +5 -6
- package/dist/components/features/files-tab/file-content-viewer.js.map +1 -1
- package/dist/components/features/files-tab/file-quick-row.cjs +1 -1
- package/dist/components/features/files-tab/file-quick-row.cjs.map +1 -1
- package/dist/components/features/files-tab/file-quick-row.d.ts +9 -7
- package/dist/components/features/files-tab/file-quick-row.js +63 -34
- package/dist/components/features/files-tab/file-quick-row.js.map +1 -1
- package/dist/components/features/files-tab/files-tab-tree.constants.cjs +2 -0
- package/dist/components/features/files-tab/files-tab-tree.constants.cjs.map +1 -0
- package/dist/components/features/files-tab/files-tab-tree.constants.d.ts +7 -0
- package/dist/components/features/files-tab/files-tab-tree.constants.js +6 -0
- package/dist/components/features/files-tab/files-tab-tree.constants.js.map +1 -0
- 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 +5 -3
- package/dist/components/features/files-tab/segmented-toggle.js +10 -13
- package/dist/components/features/files-tab/segmented-toggle.js.map +1 -1
- package/dist/components/features/files-tab/tree-node.cjs +1 -1
- package/dist/components/features/files-tab/tree-node.cjs.map +1 -1
- package/dist/components/features/files-tab/tree-node.js +34 -32
- package/dist/components/features/files-tab/tree-node.js.map +1 -1
- package/dist/components/features/files-tab/workspace-path.cjs +2 -0
- package/dist/components/features/files-tab/workspace-path.cjs.map +1 -0
- package/dist/components/features/files-tab/workspace-path.d.ts +6 -0
- package/dist/components/features/files-tab/workspace-path.js +41 -0
- package/dist/components/features/files-tab/workspace-path.js.map +1 -0
- package/dist/components/features/home/featured-automations/automation-health-indicator.cjs +2 -0
- package/dist/components/features/home/featured-automations/automation-health-indicator.cjs.map +1 -0
- package/dist/components/features/home/featured-automations/automation-health-indicator.js +22 -0
- package/dist/components/features/home/featured-automations/automation-health-indicator.js.map +1 -0
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs +2 -0
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs.map +1 -0
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js +45 -0
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js.map +1 -0
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs +2 -0
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs.map +1 -0
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js +108 -0
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js.map +1 -0
- package/dist/components/features/home/featured-automations/automation-run-health.cjs +2 -0
- package/dist/components/features/home/featured-automations/automation-run-health.cjs.map +1 -0
- package/dist/components/features/home/featured-automations/automation-run-health.js +75 -0
- package/dist/components/features/home/featured-automations/automation-run-health.js.map +1 -0
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs +2 -0
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs.map +1 -0
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js +96 -0
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js.map +1 -0
- package/dist/components/features/home/featured-automations/pinned-automation-card.d.ts +3 -3
- package/dist/components/features/home/git-repo-dropdown/use-url-search.cjs +1 -1
- package/dist/components/features/home/git-repo-dropdown/use-url-search.cjs.map +1 -1
- package/dist/components/features/home/git-repo-dropdown/use-url-search.js +1 -1
- package/dist/components/features/home/git-repo-dropdown/use-url-search.js.map +1 -1
- package/dist/components/features/home/workspace-dropdown/folder-browser-modal.cjs +1 -1
- package/dist/components/features/home/workspace-dropdown/folder-browser-modal.js +6 -6
- package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.cjs +1 -1
- package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.js +6 -6
- package/dist/components/features/manifest/manifest-form-field.d.ts +4 -3
- package/dist/components/features/manifest/manifest-icons.cjs +2 -0
- package/dist/components/features/manifest/manifest-icons.cjs.map +1 -0
- package/dist/components/features/manifest/manifest-icons.d.ts +1 -0
- package/dist/components/features/manifest/manifest-icons.js +21 -0
- package/dist/components/features/manifest/manifest-icons.js.map +1 -0
- package/dist/components/features/manifest/manifest-repository-list.d.ts +25 -0
- package/dist/components/features/markdown/markdown-table-scroll.cjs +1 -1
- package/dist/components/features/markdown/markdown-table-scroll.cjs.map +1 -1
- package/dist/components/features/markdown/markdown-table-scroll.d.ts +2 -6
- package/dist/components/features/markdown/markdown-table-scroll.js +15 -21
- package/dist/components/features/markdown/markdown-table-scroll.js.map +1 -1
- package/dist/components/features/mcp-logo-badge.cjs +1 -1
- package/dist/components/features/mcp-logo-badge.cjs.map +1 -1
- package/dist/components/features/mcp-logo-badge.d.ts +1 -1
- package/dist/components/features/mcp-logo-badge.js +1 -0
- package/dist/components/features/mcp-logo-badge.js.map +1 -1
- 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/index.cjs +1 -1
- package/dist/components/features/mcp-page/index.js +2 -2
- package/dist/components/features/mcp-page/install-server-modal.cjs +1 -1
- package/dist/components/features/mcp-page/install-server-modal.cjs.map +1 -1
- package/dist/components/features/mcp-page/install-server-modal.js +25 -25
- package/dist/components/features/mcp-page/install-server-modal.js.map +1 -1
- package/dist/components/features/mcp-page/installed-server-card.cjs +1 -1
- package/dist/components/features/mcp-page/installed-server-card.js +5 -5
- package/dist/components/features/mcp-page/marketplace-card.cjs +1 -1
- package/dist/components/features/mcp-page/marketplace-card.js +4 -4
- package/dist/components/features/mcp-page/marketplace-section.cjs +1 -1
- package/dist/components/features/mcp-page/marketplace-section.js +3 -3
- package/dist/components/features/mcp-page/mcp-logo-stack-badge.cjs +2 -0
- package/dist/components/features/mcp-page/mcp-logo-stack-badge.cjs.map +1 -0
- package/dist/components/features/mcp-page/mcp-logo-stack-badge.js +60 -0
- package/dist/components/features/mcp-page/mcp-logo-stack-badge.js.map +1 -0
- package/dist/components/features/mcp-page/mcp-server-health.cjs +1 -1
- package/dist/components/features/mcp-page/mcp-server-health.js +18 -18
- package/dist/components/features/onboarding/onboarding-host.d.ts +3 -4
- package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +5 -9
- package/dist/components/features/onboarding/use-onboarding-completion.cjs +2 -0
- package/dist/components/features/onboarding/use-onboarding-completion.cjs.map +1 -0
- package/dist/components/features/onboarding/use-onboarding-completion.js +32 -0
- package/dist/components/features/onboarding/use-onboarding-completion.js.map +1 -0
- package/dist/components/features/settings/acp-auth-status-banner.d.ts +23 -6
- package/dist/components/features/settings/app-settings/getting-started-checklist-switch.cjs +2 -0
- package/dist/components/features/settings/app-settings/getting-started-checklist-switch.cjs.map +1 -0
- package/dist/components/features/settings/app-settings/getting-started-checklist-switch.d.ts +1 -0
- package/dist/components/features/settings/app-settings/getting-started-checklist-switch.js +22 -0
- package/dist/components/features/settings/app-settings/getting-started-checklist-switch.js.map +1 -0
- package/dist/components/features/settings/brand-button.cjs +1 -1
- package/dist/components/features/settings/brand-button.cjs.map +1 -1
- package/dist/components/features/settings/brand-button.d.ts +2 -0
- package/dist/components/features/settings/brand-button.js +4 -2
- package/dist/components/features/settings/brand-button.js.map +1 -1
- package/dist/components/features/settings/llm-profiles/delete-provider-connection-modal.cjs +1 -0
- package/dist/components/features/settings/llm-profiles/delete-provider-connection-modal.d.ts +7 -0
- package/dist/components/features/settings/llm-profiles/delete-provider-connection-modal.js +7 -0
- package/dist/components/features/settings/llm-profiles/llm-profiles-manager.cjs +1 -1
- package/dist/components/features/settings/llm-profiles/llm-profiles-manager.js +3 -0
- package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
- package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +2 -0
- package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +20 -1
- package/dist/components/features/settings/llm-profiles/provider-connection-modal.cjs +1 -0
- package/dist/components/features/settings/llm-profiles/provider-connection-modal.d.ts +19 -0
- package/dist/components/features/settings/llm-profiles/provider-connection-modal.js +13 -0
- package/dist/components/features/settings/llm-profiles/provider-connection-row.cjs +1 -0
- package/dist/components/features/settings/llm-profiles/provider-connection-row.d.ts +10 -0
- package/dist/components/features/settings/llm-profiles/provider-connection-row.js +6 -0
- package/dist/components/features/settings/llm-profiles/provider-connections-manager.cjs +1 -0
- package/dist/components/features/settings/llm-profiles/provider-connections-manager.d.ts +15 -0
- package/dist/components/features/settings/llm-profiles/provider-connections-manager.js +8 -0
- package/dist/components/features/settings/sdk-settings/field-help.cjs +1 -1
- package/dist/components/features/settings/sdk-settings/field-help.cjs.map +1 -1
- package/dist/components/features/settings/sdk-settings/field-help.d.ts +1 -1
- package/dist/components/features/settings/sdk-settings/field-help.js +1 -1
- package/dist/components/features/settings/sdk-settings/field-help.js.map +1 -1
- package/dist/components/features/settings/sdk-settings/schema-field.cjs +1 -1
- package/dist/components/features/settings/sdk-settings/schema-field.js +6 -6
- package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs +1 -1
- package/dist/components/features/settings/sdk-settings/sdk-section-page.js +9 -9
- package/dist/components/features/settings/secrets-settings/secret-form.cjs +1 -1
- package/dist/components/features/settings/secrets-settings/secret-form.js +7 -7
- 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 +14 -13
- package/dist/components/features/settings/settings-input.js.map +1 -1
- package/dist/components/features/sidebar/sidebar-nav-link.cjs +1 -1
- package/dist/components/features/sidebar/sidebar-nav-link.cjs.map +1 -1
- package/dist/components/features/sidebar/sidebar-nav-link.d.ts +10 -1
- package/dist/components/features/sidebar/sidebar-nav-link.js +54 -36
- package/dist/components/features/sidebar/sidebar-nav-link.js.map +1 -1
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-icon.cjs +2 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-icon.cjs.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-icon.d.ts +7 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-icon.js +102 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-icon.js.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-preview.cjs +2 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-preview.cjs.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-preview.d.ts +8 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-preview.js +66 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-preview.js.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-llm-complete.cjs +2 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-llm-complete.cjs.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-llm-complete.d.ts +3 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-llm-complete.js +15 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-llm-complete.js.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-storage.cjs +2 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-storage.cjs.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-storage.d.ts +10 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-storage.js +39 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-storage.js.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist.cjs +2 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist.cjs.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist.constants.cjs +2 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist.constants.cjs.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist.constants.d.ts +26 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist.constants.js +78 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist.constants.js.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist.d.ts +5 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist.js +127 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist.js.map +1 -0
- 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 +137 -110
- package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
- package/dist/components/features/sidebar/sidebar.cjs +1 -1
- package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
- package/dist/components/features/sidebar/sidebar.js +1 -1
- package/dist/components/features/sidebar/sidebar.js.map +1 -1
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist-dismissed.cjs +2 -0
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist-dismissed.cjs.map +1 -0
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist-dismissed.d.ts +1 -0
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist-dismissed.js +10 -0
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist-dismissed.js.map +1 -0
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.cjs +2 -0
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.cjs.map +1 -0
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.d.ts +15 -0
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.js +75 -0
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.js.map +1 -0
- package/dist/components/features/skills/add-skill-modal.cjs +2 -0
- package/dist/components/features/skills/add-skill-modal.cjs.map +1 -0
- package/dist/components/features/skills/add-skill-modal.js +164 -0
- package/dist/components/features/skills/add-skill-modal.js.map +1 -0
- package/dist/components/features/skills/build-skill-pills.cjs +2 -0
- package/dist/components/features/skills/build-skill-pills.cjs.map +1 -0
- package/dist/components/features/skills/build-skill-pills.js +96 -0
- package/dist/components/features/skills/build-skill-pills.js.map +1 -0
- package/dist/components/features/skills/extensions-navigation.cjs +1 -1
- package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
- package/dist/components/features/skills/extensions-navigation.js +54 -43
- package/dist/components/features/skills/extensions-navigation.js.map +1 -1
- package/dist/components/features/skills/get-skill-card-description.cjs +2 -0
- package/dist/components/features/skills/get-skill-card-description.cjs.map +1 -0
- package/dist/components/features/skills/get-skill-card-description.js +34 -0
- package/dist/components/features/skills/get-skill-card-description.js.map +1 -0
- package/dist/components/features/skills/get-skill-chat-launch-message.cjs +2 -0
- package/dist/components/features/skills/get-skill-chat-launch-message.cjs.map +1 -0
- package/dist/components/features/skills/get-skill-chat-launch-message.js +9 -0
- package/dist/components/features/skills/get-skill-chat-launch-message.js.map +1 -0
- package/dist/components/features/skills/is-copyable-skill-source.cjs +2 -0
- package/dist/components/features/skills/is-copyable-skill-source.cjs.map +1 -0
- package/dist/components/features/skills/is-copyable-skill-source.js +9 -0
- package/dist/components/features/skills/is-copyable-skill-source.js.map +1 -0
- package/dist/components/features/skills/skill-card-pill-row.cjs +2 -0
- package/dist/components/features/skills/skill-card-pill-row.cjs.map +1 -0
- package/dist/components/features/skills/skill-card-pill-row.d.ts +1 -1
- package/dist/components/features/skills/skill-card-pill-row.js +137 -0
- package/dist/components/features/skills/skill-card-pill-row.js.map +1 -0
- package/dist/components/features/skills/skill-card.cjs +2 -0
- package/dist/components/features/skills/skill-card.cjs.map +1 -0
- package/dist/components/features/skills/skill-card.js +93 -0
- package/dist/components/features/skills/skill-card.js.map +1 -0
- package/dist/components/features/skills/skill-detail-modal.cjs +3 -0
- package/dist/components/features/skills/skill-detail-modal.cjs.map +1 -0
- package/dist/components/features/skills/skill-detail-modal.js +150 -0
- package/dist/components/features/skills/skill-detail-modal.js.map +1 -0
- package/dist/components/features/skills/skill-facet-rail.cjs +2 -0
- package/dist/components/features/skills/skill-facet-rail.cjs.map +1 -0
- package/dist/components/features/skills/skill-facet-rail.js +42 -0
- package/dist/components/features/skills/skill-facet-rail.js.map +1 -0
- package/dist/components/features/skills/skill-facet-row.cjs +2 -0
- package/dist/components/features/skills/skill-facet-row.cjs.map +1 -0
- package/dist/components/features/skills/skill-facet-row.js +44 -0
- package/dist/components/features/skills/skill-facet-row.js.map +1 -0
- package/dist/components/features/skills/skill-filter.cjs +2 -0
- package/dist/components/features/skills/skill-filter.cjs.map +1 -0
- package/dist/components/features/skills/skill-filter.d.ts +8 -3
- package/dist/components/features/skills/skill-filter.js +183 -0
- package/dist/components/features/skills/skill-filter.js.map +1 -0
- package/dist/components/features/skills/skill-filters-modal.cjs +2 -0
- package/dist/components/features/skills/skill-filters-modal.cjs.map +1 -0
- package/dist/components/features/skills/skill-filters-modal.js +53 -0
- package/dist/components/features/skills/skill-filters-modal.js.map +1 -0
- package/dist/components/features/skills/skill-icon-badge.cjs +2 -0
- package/dist/components/features/skills/skill-icon-badge.cjs.map +1 -0
- package/dist/components/features/skills/skill-icon-badge.js +17 -0
- package/dist/components/features/skills/skill-icon-badge.js.map +1 -0
- package/dist/components/features/skills/skill-type-badge.cjs +2 -0
- package/dist/components/features/skills/skill-type-badge.cjs.map +1 -0
- package/dist/components/features/skills/skill-type-badge.js +21 -0
- package/dist/components/features/skills/skill-type-badge.js.map +1 -0
- package/dist/components/features/skills/skills-toolbar.cjs +2 -0
- package/dist/components/features/skills/skills-toolbar.cjs.map +1 -0
- package/dist/components/features/skills/skills-toolbar.js +63 -0
- package/dist/components/features/skills/skills-toolbar.js.map +1 -0
- package/dist/components/shared/buttons/circle-plus-check-toggle.cjs +1 -1
- package/dist/components/shared/buttons/circle-plus-check-toggle.cjs.map +1 -1
- package/dist/components/shared/buttons/circle-plus-check-toggle.js +19 -6
- package/dist/components/shared/buttons/circle-plus-check-toggle.js.map +1 -1
- package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
- package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
- package/dist/components/shared/filters/enum-filter-dropdown.d.ts +4 -1
- package/dist/components/shared/filters/enum-filter-dropdown.js +14 -14
- package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
- package/dist/components/shared/modals/settings/settings-form.cjs +1 -1
- package/dist/components/shared/modals/settings/settings-form.js +6 -6
- package/dist/components/ui/resize-handle.cjs +1 -1
- package/dist/components/ui/resize-handle.cjs.map +1 -1
- package/dist/components/ui/resize-handle.d.ts +2 -1
- package/dist/components/ui/resize-handle.js +6 -5
- package/dist/components/ui/resize-handle.js.map +1 -1
- package/dist/config/defaults.cjs +1 -1
- package/dist/config/defaults.cjs.map +1 -1
- package/dist/config/defaults.js +9 -5
- package/dist/config/defaults.js.map +1 -1
- package/dist/constants/skills-docs.cjs +2 -0
- package/dist/constants/skills-docs.cjs.map +1 -0
- package/dist/constants/skills-docs.js +6 -0
- package/dist/constants/skills-docs.js.map +1 -0
- package/dist/contexts/conversation-websocket-context.cjs +3 -3
- package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
- package/dist/contexts/conversation-websocket-context.js +174 -149
- package/dist/contexts/conversation-websocket-context.js.map +1 -1
- package/dist/extensions/canvas-extension-module-loader.d.ts +11 -0
- package/dist/fixtures/home-automations-demo.cjs +2 -0
- package/dist/fixtures/home-automations-demo.cjs.map +1 -0
- package/dist/fixtures/home-automations-demo.d.ts +1 -3
- package/dist/fixtures/home-automations-demo.js +384 -0
- package/dist/fixtures/home-automations-demo.js.map +1 -0
- package/dist/hooks/chat/use-slash-command.cjs +1 -1
- package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
- package/dist/hooks/chat/use-slash-command.d.ts +1 -2
- package/dist/hooks/chat/use-slash-command.js +1 -0
- package/dist/hooks/chat/use-slash-command.js.map +1 -1
- package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
- package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
- package/dist/hooks/mutation/use-create-conversation.js +27 -30
- package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
- package/dist/hooks/mutation/use-create-provider-connection.cjs +1 -0
- package/dist/hooks/mutation/use-create-provider-connection.d.ts +2 -0
- package/dist/hooks/mutation/use-create-provider-connection.js +1 -0
- package/dist/hooks/mutation/use-delete-mcp-server.cjs +1 -1
- package/dist/hooks/mutation/use-delete-mcp-server.js +3 -3
- package/dist/hooks/mutation/use-delete-provider-connection.cjs +1 -0
- package/dist/hooks/mutation/use-delete-provider-connection.d.ts +1 -0
- package/dist/hooks/mutation/use-delete-provider-connection.js +1 -0
- package/dist/hooks/mutation/use-manage-canvas-extensions.d.ts +12 -0
- package/dist/hooks/mutation/use-switch-acp-model.cjs +1 -1
- package/dist/hooks/mutation/use-switch-acp-model.cjs.map +1 -1
- package/dist/hooks/mutation/use-switch-acp-model.d.ts +5 -3
- package/dist/hooks/mutation/use-switch-acp-model.js +9 -13
- package/dist/hooks/mutation/use-switch-acp-model.js.map +1 -1
- package/dist/hooks/mutation/use-update-mcp-server.cjs +1 -1
- package/dist/hooks/mutation/use-update-mcp-server.js +6 -6
- package/dist/hooks/mutation/use-update-provider-connection.cjs +1 -0
- package/dist/hooks/mutation/use-update-provider-connection.d.ts +7 -0
- package/dist/hooks/mutation/use-update-provider-connection.js +1 -0
- package/dist/hooks/query/concurrency-limiter.cjs +2 -0
- package/dist/hooks/query/concurrency-limiter.cjs.map +1 -0
- package/dist/hooks/query/concurrency-limiter.d.ts +22 -0
- package/dist/hooks/query/concurrency-limiter.js +29 -0
- package/dist/hooks/query/concurrency-limiter.js.map +1 -0
- package/dist/hooks/query/query-keys.cjs +1 -1
- package/dist/hooks/query/query-keys.cjs.map +1 -1
- package/dist/hooks/query/query-keys.d.ts +7 -0
- package/dist/hooks/query/query-keys.js +4 -4
- package/dist/hooks/query/query-keys.js.map +1 -1
- package/dist/hooks/query/use-active-conversation.cjs +1 -1
- package/dist/hooks/query/use-active-conversation.js +4 -4
- package/dist/hooks/query/use-automation-detail.cjs +1 -0
- package/dist/hooks/query/use-automation-detail.js +2 -0
- package/dist/hooks/query/use-automation-health.cjs +2 -0
- package/dist/hooks/query/use-automation-health.cjs.map +1 -0
- package/dist/hooks/query/use-automation-health.js +22 -0
- package/dist/hooks/query/use-automation-health.js.map +1 -0
- package/dist/hooks/query/use-automations.cjs +2 -0
- package/dist/hooks/query/use-automations.cjs.map +1 -0
- package/dist/hooks/query/use-automations.js +28 -0
- package/dist/hooks/query/use-automations.js.map +1 -0
- package/dist/hooks/query/use-backends-health.cjs +1 -1
- package/dist/hooks/query/use-backends-health.cjs.map +1 -1
- package/dist/hooks/query/use-backends-health.d.ts +1 -1
- package/dist/hooks/query/use-backends-health.js +50 -64
- package/dist/hooks/query/use-backends-health.js.map +1 -1
- package/dist/hooks/query/use-canvas-extensions.cjs +1 -0
- package/dist/hooks/query/use-canvas-extensions.d.ts +5 -0
- package/dist/hooks/query/use-canvas-extensions.js +3 -0
- package/dist/hooks/query/use-conversation-history.cjs +1 -1
- package/dist/hooks/query/use-conversation-history.cjs.map +1 -1
- package/dist/hooks/query/use-conversation-history.js +3 -1
- package/dist/hooks/query/use-conversation-history.js.map +1 -1
- package/dist/hooks/query/use-conversation-metrics.cjs +1 -1
- package/dist/hooks/query/use-conversation-metrics.js +3 -3
- package/dist/hooks/query/use-latest-automation-runs.cjs +1 -0
- package/dist/hooks/query/use-latest-automation-runs.d.ts +2 -0
- package/dist/hooks/query/use-latest-automation-runs.js +4 -0
- package/dist/hooks/query/use-llm-profiles.d.ts +1 -1
- package/dist/hooks/query/use-paginated-conversations.cjs +1 -1
- package/dist/hooks/query/use-paginated-conversations.cjs.map +1 -1
- package/dist/hooks/query/use-paginated-conversations.js +19 -16
- package/dist/hooks/query/use-paginated-conversations.js.map +1 -1
- package/dist/hooks/query/use-provider-connections.cjs +2 -0
- package/dist/hooks/query/use-provider-connections.cjs.map +1 -0
- package/dist/hooks/query/use-provider-connections.d.ts +8 -0
- package/dist/hooks/query/use-provider-connections.js +19 -0
- package/dist/hooks/query/use-provider-connections.js.map +1 -0
- package/dist/hooks/query/use-repository-git-items.cjs +2 -0
- package/dist/hooks/query/use-repository-git-items.cjs.map +1 -0
- package/dist/hooks/query/use-repository-git-items.d.ts +3 -0
- package/dist/hooks/query/use-repository-git-items.js +33 -0
- package/dist/hooks/query/use-repository-git-items.js.map +1 -0
- package/dist/hooks/query/use-search-providers.cjs +1 -1
- package/dist/hooks/query/use-search-providers.cjs.map +1 -1
- package/dist/hooks/query/use-search-providers.js +17 -10
- package/dist/hooks/query/use-search-providers.js.map +1 -1
- package/dist/hooks/query/use-unified-vscode-url.cjs +1 -1
- package/dist/hooks/query/use-unified-vscode-url.cjs.map +1 -1
- package/dist/hooks/query/use-unified-vscode-url.d.ts +1 -0
- package/dist/hooks/query/use-unified-vscode-url.js +40 -26
- package/dist/hooks/query/use-unified-vscode-url.js.map +1 -1
- package/dist/hooks/query/use-workspace-file-content.cjs +1 -1
- package/dist/hooks/query/use-workspace-file-content.js +5 -5
- package/dist/hooks/use-acp-credential-form.d.ts +6 -0
- package/dist/hooks/use-bash-command-runner.cjs +1 -1
- package/dist/hooks/use-bash-command-runner.cjs.map +1 -1
- package/dist/hooks/use-bash-command-runner.js +45 -42
- package/dist/hooks/use-bash-command-runner.js.map +1 -1
- package/dist/hooks/use-conversation-overview-column-space.cjs +2 -0
- package/dist/hooks/use-conversation-overview-column-space.cjs.map +1 -0
- package/dist/hooks/use-conversation-overview-column-space.d.ts +2 -0
- package/dist/hooks/use-conversation-overview-column-space.js +25 -0
- package/dist/hooks/use-conversation-overview-column-space.js.map +1 -0
- package/dist/hooks/use-conversation-overview-git-diff-stats.cjs +2 -0
- package/dist/hooks/use-conversation-overview-git-diff-stats.cjs.map +1 -0
- package/dist/hooks/use-conversation-overview-git-diff-stats.d.ts +7 -0
- package/dist/hooks/use-conversation-overview-git-diff-stats.js +37 -0
- package/dist/hooks/use-conversation-overview-git-diff-stats.js.map +1 -0
- package/dist/hooks/use-conversation-overview-panel-peek.cjs +2 -0
- package/dist/hooks/use-conversation-overview-panel-peek.cjs.map +1 -0
- package/dist/hooks/use-conversation-overview-panel-peek.d.ts +9 -0
- package/dist/hooks/use-conversation-overview-panel-peek.js +32 -0
- package/dist/hooks/use-conversation-overview-panel-peek.js.map +1 -0
- package/dist/hooks/use-conversation-overview-stats.cjs +2 -0
- package/dist/hooks/use-conversation-overview-stats.cjs.map +1 -0
- package/dist/hooks/use-conversation-overview-stats.d.ts +4 -0
- package/dist/hooks/use-conversation-overview-stats.js +15 -0
- package/dist/hooks/use-conversation-overview-stats.js.map +1 -0
- package/dist/hooks/use-conversation-primary-repository.cjs +2 -0
- package/dist/hooks/use-conversation-primary-repository.cjs.map +1 -0
- package/dist/hooks/use-conversation-primary-repository.d.ts +11 -0
- package/dist/hooks/use-conversation-primary-repository.js +17 -0
- package/dist/hooks/use-conversation-primary-repository.js.map +1 -0
- package/dist/hooks/use-drag-scroll.cjs +2 -0
- package/dist/hooks/use-drag-scroll.cjs.map +1 -0
- package/dist/hooks/use-drag-scroll.d.ts +12 -0
- package/dist/hooks/use-drag-scroll.js +41 -0
- package/dist/hooks/use-drag-scroll.js.map +1 -0
- package/dist/hooks/use-has-permission.cjs +2 -0
- package/dist/hooks/use-has-permission.cjs.map +1 -0
- package/dist/hooks/use-has-permission.js +8 -0
- package/dist/hooks/use-has-permission.js.map +1 -0
- package/dist/hooks/use-home-automation-actions.cjs +2 -0
- package/dist/hooks/use-home-automation-actions.cjs.map +1 -0
- package/dist/hooks/use-home-automation-actions.js +15 -0
- package/dist/hooks/use-home-automation-actions.js.map +1 -0
- package/dist/hooks/use-launch-skill-in-chat.cjs +2 -0
- package/dist/hooks/use-launch-skill-in-chat.cjs.map +1 -0
- package/dist/hooks/use-launch-skill-in-chat.js +16 -0
- package/dist/hooks/use-launch-skill-in-chat.js.map +1 -0
- package/dist/hooks/use-mcp-server-health.cjs +1 -1
- package/dist/hooks/use-mcp-server-health.js +3 -3
- package/dist/hooks/use-pinned-home-route.cjs +2 -0
- package/dist/hooks/use-pinned-home-route.cjs.map +1 -0
- package/dist/hooks/use-pinned-home-route.d.ts +33 -0
- package/dist/hooks/use-pinned-home-route.js +34 -0
- package/dist/hooks/use-pinned-home-route.js.map +1 -0
- package/dist/hooks/use-resizable-drawer-width.cjs +2 -0
- package/dist/hooks/use-resizable-drawer-width.cjs.map +1 -0
- package/dist/hooks/use-resizable-drawer-width.d.ts +22 -0
- package/dist/hooks/use-resizable-drawer-width.js +46 -0
- package/dist/hooks/use-resizable-drawer-width.js.map +1 -0
- package/dist/hooks/use-responder-url-secret.cjs +2 -0
- package/dist/hooks/use-responder-url-secret.cjs.map +1 -0
- package/dist/hooks/use-responder-url-secret.js +51 -0
- package/dist/hooks/use-responder-url-secret.js.map +1 -0
- package/dist/hooks/use-select-conversation-tab.cjs +1 -1
- package/dist/hooks/use-select-conversation-tab.cjs.map +1 -1
- package/dist/hooks/use-select-conversation-tab.d.ts +2 -0
- package/dist/hooks/use-select-conversation-tab.js +15 -7
- package/dist/hooks/use-select-conversation-tab.js.map +1 -1
- package/dist/hooks/use-skill-enablement.cjs +2 -0
- package/dist/hooks/use-skill-enablement.cjs.map +1 -0
- package/dist/hooks/use-skill-enablement.d.ts +14 -0
- package/dist/hooks/use-skill-enablement.js +80 -0
- package/dist/hooks/use-skill-enablement.js.map +1 -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 +17 -0
- package/dist/hooks/use-tracking.js +10 -0
- package/dist/hooks/use-tracking.js.map +1 -1
- package/dist/hooks/use-websocket.cjs +1 -1
- package/dist/hooks/use-websocket.cjs.map +1 -1
- package/dist/hooks/use-websocket.d.ts +1 -2
- package/dist/hooks/use-websocket.js +58 -51
- package/dist/hooks/use-websocket.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 +153 -56
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/translation.cjs +3 -3
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +2629 -980
- package/dist/i18n/translation.js.map +1 -1
- package/dist/icons/check-circle.cjs +2 -0
- package/dist/icons/check-circle.cjs.map +1 -0
- package/dist/icons/check-circle.js +20 -0
- package/dist/icons/check-circle.js.map +1 -0
- package/dist/icons/chevron-down.cjs +2 -0
- package/dist/icons/chevron-down.cjs.map +1 -0
- package/dist/icons/chevron-down.js +20 -0
- package/dist/icons/chevron-down.js.map +1 -0
- package/dist/icons/clock.cjs +2 -0
- package/dist/icons/clock.cjs.map +1 -0
- package/dist/icons/clock.js +20 -0
- package/dist/icons/clock.js.map +1 -0
- package/dist/icons/exclamation-circle.cjs +2 -0
- package/dist/icons/exclamation-circle.cjs.map +1 -0
- package/dist/icons/exclamation-circle.js +20 -0
- package/dist/icons/exclamation-circle.js.map +1 -0
- package/dist/icons/kebab-vertical.cjs +2 -0
- package/dist/icons/kebab-vertical.cjs.map +1 -0
- package/dist/icons/kebab-vertical.js +14 -0
- package/dist/icons/kebab-vertical.js.map +1 -0
- package/dist/icons/key.cjs +2 -0
- package/dist/icons/key.cjs.map +1 -0
- package/dist/icons/key.js +21 -0
- package/dist/icons/key.js.map +1 -0
- package/dist/icons/message-square-share.cjs +2 -0
- package/dist/icons/message-square-share.cjs.map +1 -0
- package/dist/icons/message-square-share.js +22 -0
- package/dist/icons/message-square-share.js.map +1 -0
- package/dist/icons/play.cjs +2 -0
- package/dist/icons/play.cjs.map +1 -0
- package/dist/icons/play.js +19 -0
- package/dist/icons/play.js.map +1 -0
- package/dist/icons/power.cjs +2 -0
- package/dist/icons/power.cjs.map +1 -0
- package/dist/icons/power.js +20 -0
- package/dist/icons/power.js.map +1 -0
- package/dist/icons/sparkle.cjs +2 -0
- package/dist/icons/sparkle.cjs.map +1 -0
- package/dist/icons/sparkle.js +20 -0
- package/dist/icons/sparkle.js.map +1 -0
- package/dist/icons/trash.cjs +2 -0
- package/dist/icons/trash.cjs.map +1 -0
- package/dist/icons/trash.js +20 -0
- package/dist/icons/trash.js.map +1 -0
- package/dist/icons/x-circle.cjs +2 -0
- package/dist/icons/x-circle.cjs.map +1 -0
- package/dist/icons/x-circle.js +20 -0
- package/dist/icons/x-circle.js.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +15 -14
- package/dist/lib/index.cjs +1 -1
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.js +1 -0
- package/dist/locales/ar/openhands.json +156 -59
- package/dist/locales/ca/openhands.json +156 -59
- package/dist/locales/de/openhands.json +156 -59
- package/dist/locales/en/openhands.json +156 -59
- package/dist/locales/es/openhands.json +156 -59
- package/dist/locales/fr/openhands.json +156 -59
- package/dist/locales/it/openhands.json +156 -59
- package/dist/locales/ja/openhands.json +156 -59
- package/dist/locales/ko-KR/openhands.json +156 -59
- package/dist/locales/no/openhands.json +156 -59
- package/dist/locales/pt/openhands.json +156 -59
- package/dist/locales/tr/openhands.json +156 -59
- package/dist/locales/uk/openhands.json +156 -59
- package/dist/locales/zh-CN/openhands.json +156 -59
- package/dist/locales/zh-TW/openhands.json +156 -59
- package/dist/manifests/automation-insights.cjs +2 -0
- package/dist/manifests/automation-insights.cjs.map +1 -0
- package/dist/manifests/automation-insights.d.ts +2 -0
- package/dist/manifests/automation-insights.js +9 -0
- package/dist/manifests/automation-insights.js.map +1 -0
- package/dist/manifests/automation-interface.cjs +1 -1
- package/dist/manifests/automation-interface.cjs.map +1 -1
- package/dist/manifests/automation-interface.d.ts +53 -31
- package/dist/manifests/automation-interface.js +56 -59
- package/dist/manifests/automation-interface.js.map +1 -1
- package/dist/manifests/automation-setup.cjs +1 -1
- package/dist/manifests/automation-setup.cjs.map +1 -1
- package/dist/manifests/automation-setup.d.ts +37 -3
- package/dist/manifests/automation-setup.js +16 -2
- package/dist/manifests/automation-setup.js.map +1 -1
- package/dist/manifests/interface-validation.cjs +1 -1
- package/dist/manifests/interface-validation.cjs.map +1 -1
- package/dist/manifests/interface-validation.js +56 -52
- package/dist/manifests/interface-validation.js.map +1 -1
- package/dist/manifests/manifest-actions.d.ts +5 -0
- package/dist/manifests/manifest-bundle.d.ts +30 -0
- package/dist/manifests/manifest-local-validation.d.ts +10 -1
- package/dist/manifests/manifest-sources.cjs +1 -1
- package/dist/manifests/manifest-sources.cjs.map +1 -1
- package/dist/manifests/manifest-sources.js +3 -3
- package/dist/manifests/manifest-sources.js.map +1 -1
- package/dist/manifests/manifest-template.d.ts +14 -0
- package/dist/manifests/manifest-validation.cjs +1 -1
- package/dist/manifests/manifest-validation.cjs.map +1 -1
- package/dist/manifests/manifest-validation.js +78 -45
- package/dist/manifests/manifest-validation.js.map +1 -1
- package/dist/manifests/types.cjs +1 -1
- package/dist/manifests/types.cjs.map +1 -1
- package/dist/manifests/types.d.ts +64 -3
- package/dist/manifests/types.js +7 -6
- package/dist/manifests/types.js.map +1 -1
- package/dist/node_modules/@heroui/popover/dist/chunk-NW7HJLND.cjs +1 -1
- package/dist/node_modules/@heroui/popover/dist/chunk-NW7HJLND.js +10 -10
- package/dist/node_modules/@heroui/ripple/dist/chunk-UIQI3AYJ.cjs +1 -1
- package/dist/node_modules/@heroui/ripple/dist/chunk-UIQI3AYJ.js +8 -8
- package/dist/node_modules/@heroui/tooltip/dist/chunk-AUA5GDXN.cjs +1 -1
- package/dist/node_modules/@heroui/tooltip/dist/chunk-AUA5GDXN.js +9 -9
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs +4884 -0
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.js +11 -0
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs +13 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js +92 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs +12 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js +103 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +9 -7
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js +37 -13
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs +2 -2
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js +34 -34
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.js +21 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.js +21 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.cjs +3 -3
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.js +2 -2
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.js +21 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.js +21 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.js +21 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.cjs +14 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.js +77 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs +30 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js +65 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +28 -10
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/index.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/index.js +18 -13
- package/dist/node_modules/@openhands/extensions/automations/index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/interface.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/interface.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/interface.js +6 -2
- package/dist/node_modules/@openhands/extensions/automations/interface.js.map +1 -1
- 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 +2 -2
- package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js +40 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.js +36 -3
- package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sonarqube.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sonarqube.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sonarqube.js +75 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sonarqube.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js +75 -71
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.cjs +1043 -49
- package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.js +78 -17
- package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-conversation.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-conversation.js +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.js +8 -7
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/index.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/index.js +2 -2
- package/dist/node_modules/lucide-react/dist/esm/icons/activity.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/activity.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/activity.js +9 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/activity.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/blocks.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/blocks.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/blocks.js +16 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/blocks.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/book-open.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/book-open.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/book-open.js +12 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/book-open.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/download.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/download.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/download.js +19 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/download.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/file-text.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/file-text.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/file-text.js +27 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/file-text.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/git-commit-horizontal.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/git-commit-horizontal.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/git-commit-horizontal.js +27 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/git-commit-horizontal.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/laptop.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/laptop.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/laptop.js +12 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/laptop.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/layout-dashboard.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/layout-dashboard.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/layout-dashboard.js +39 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/layout-dashboard.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/library.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/library.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/library.js +23 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/library.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/package.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/package.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/package.js +23 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/package.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/palette.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/palette.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/palette.js +39 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/palette.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.js +23 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/pen-line.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/pen-line.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/pen-line.js +12 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/pen-line.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/shield-check.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/shield-check.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/shield-check.js +12 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/shield-check.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/sparkles.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/sparkles.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/sparkles.js +25 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/sparkles.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/timer.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/timer.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/timer.js +27 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/timer.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/agent-settings.d.ts +10 -0
- package/dist/routes/app-settings.cjs +1 -1
- package/dist/routes/app-settings.cjs.map +1 -1
- package/dist/routes/app-settings.js +88 -86
- package/dist/routes/app-settings.js.map +1 -1
- package/dist/routes/commits-tab.cjs +1 -1
- package/dist/routes/commits-tab.cjs.map +1 -1
- package/dist/routes/commits-tab.js +27 -21
- package/dist/routes/commits-tab.js.map +1 -1
- package/dist/routes/conversation.cjs +1 -1
- package/dist/routes/conversation.cjs.map +1 -1
- package/dist/routes/conversation.js +56 -55
- package/dist/routes/conversation.js.map +1 -1
- package/dist/routes/files-tab.cjs +1 -1
- package/dist/routes/files-tab.cjs.map +1 -1
- package/dist/routes/files-tab.d.ts +4 -0
- package/dist/routes/files-tab.js +119 -149
- package/dist/routes/files-tab.js.map +1 -1
- package/dist/routes/llm-settings.cjs +1 -1
- package/dist/routes/llm-settings.cjs.map +1 -1
- package/dist/routes/llm-settings.d.ts +9 -1
- package/dist/routes/llm-settings.js +141 -103
- package/dist/routes/llm-settings.js.map +1 -1
- package/dist/routes/mcp.cjs +1 -1
- package/dist/routes/mcp.cjs.map +1 -1
- package/dist/routes/mcp.js +20 -20
- package/dist/routes/secrets-settings.cjs +1 -1
- package/dist/routes/secrets-settings.js +15 -15
- package/dist/services/canvas-ui.cjs +1 -1
- package/dist/services/canvas-ui.cjs.map +1 -1
- package/dist/services/canvas-ui.d.ts +5 -0
- package/dist/services/canvas-ui.js +24 -10
- package/dist/services/canvas-ui.js.map +1 -1
- package/dist/services/settings.cjs +1 -1
- package/dist/services/settings.cjs.map +1 -1
- package/dist/services/settings.js +3 -2
- package/dist/services/settings.js.map +1 -1
- package/dist/stores/conversation-store.cjs +1 -1
- package/dist/stores/conversation-store.cjs.map +1 -1
- package/dist/stores/conversation-store.d.ts +8 -1
- package/dist/stores/conversation-store.js +9 -0
- package/dist/stores/conversation-store.js.map +1 -1
- package/dist/stores/files-tab-store.cjs +1 -1
- package/dist/stores/files-tab-store.cjs.map +1 -1
- package/dist/stores/files-tab-store.d.ts +13 -0
- package/dist/stores/files-tab-store.js +49 -5
- package/dist/stores/files-tab-store.js.map +1 -1
- package/dist/stores/use-event-store.cjs +1 -1
- package/dist/stores/use-event-store.cjs.map +1 -1
- package/dist/stores/use-event-store.js +11 -11
- package/dist/stores/use-event-store.js.map +1 -1
- package/dist/types/agent-server/core/events/message-event.d.ts +2 -2
- package/dist/types/automation.cjs +2 -0
- package/dist/types/automation.cjs.map +1 -0
- package/dist/types/automation.d.ts +20 -0
- package/dist/types/automation.js +8 -0
- package/dist/types/automation.js.map +1 -0
- package/dist/types/canvas-extension.cjs +2 -0
- package/dist/types/canvas-extension.cjs.map +1 -0
- package/dist/types/canvas-extension.d.ts +77 -0
- package/dist/types/canvas-extension.js +6 -0
- package/dist/types/canvas-extension.js.map +1 -0
- package/dist/types/settings.d.ts +7 -0
- package/dist/ui/help-link.cjs +1 -1
- package/dist/ui/help-link.cjs.map +1 -1
- package/dist/ui/help-link.d.ts +6 -1
- package/dist/ui/help-link.js +32 -18
- package/dist/ui/help-link.js.map +1 -1
- package/dist/utils/acp-auth-display.d.ts +35 -0
- package/dist/utils/automation-catalog.cjs +1 -1
- package/dist/utils/automation-catalog.cjs.map +1 -1
- package/dist/utils/automation-catalog.d.ts +12 -0
- package/dist/utils/automation-catalog.js +20 -1
- package/dist/utils/automation-catalog.js.map +1 -1
- package/dist/utils/automation-schedule.cjs +2 -0
- package/dist/utils/automation-schedule.cjs.map +1 -0
- package/dist/utils/automation-schedule.js +8 -0
- package/dist/utils/automation-schedule.js.map +1 -0
- package/dist/utils/automation-stack-section.cjs +2 -0
- package/dist/utils/automation-stack-section.cjs.map +1 -0
- package/dist/utils/automation-stack-section.d.ts +2 -0
- package/dist/utils/automation-stack-section.js +6 -0
- package/dist/utils/automation-stack-section.js.map +1 -0
- package/dist/utils/cache-utils.cjs +1 -1
- package/dist/utils/cache-utils.js +5 -5
- package/dist/utils/constants.cjs +1 -1
- package/dist/utils/constants.cjs.map +1 -1
- package/dist/utils/constants.js +4 -0
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/conversation-local-storage.cjs +1 -1
- package/dist/utils/conversation-local-storage.cjs.map +1 -1
- package/dist/utils/conversation-local-storage.d.ts +17 -4
- package/dist/utils/conversation-local-storage.js +111 -63
- package/dist/utils/conversation-local-storage.js.map +1 -1
- package/dist/utils/conversation-metrics.cjs +1 -1
- package/dist/utils/conversation-metrics.cjs.map +1 -1
- package/dist/utils/conversation-metrics.d.ts +3 -2
- package/dist/utils/conversation-metrics.js +16 -14
- package/dist/utils/conversation-metrics.js.map +1 -1
- package/dist/utils/conversation-overview-project-scope.cjs +2 -0
- package/dist/utils/conversation-overview-project-scope.cjs.map +1 -0
- package/dist/utils/conversation-overview-project-scope.d.ts +16 -0
- package/dist/utils/conversation-overview-project-scope.js +22 -0
- package/dist/utils/conversation-overview-project-scope.js.map +1 -0
- package/dist/utils/extension-module-card-classes.cjs +1 -1
- package/dist/utils/extension-module-card-classes.cjs.map +1 -1
- package/dist/utils/extension-module-card-classes.d.ts +1 -1
- package/dist/utils/extension-module-card-classes.js +2 -2
- package/dist/utils/extension-module-card-classes.js.map +1 -1
- package/dist/utils/format-model-name.cjs +1 -1
- package/dist/utils/format-model-name.cjs.map +1 -1
- package/dist/utils/format-model-name.d.ts +7 -3
- package/dist/utils/format-model-name.js +6 -11
- package/dist/utils/format-model-name.js.map +1 -1
- package/dist/utils/format-relative-time.cjs +2 -0
- package/dist/utils/format-relative-time.cjs.map +1 -0
- package/dist/utils/format-relative-time.d.ts +7 -0
- package/dist/utils/format-relative-time.js +22 -0
- package/dist/utils/format-relative-time.js.map +1 -0
- package/dist/utils/git-diff-stats.cjs +5 -0
- package/dist/utils/git-diff-stats.cjs.map +1 -0
- package/dist/utils/git-diff-stats.d.ts +9 -0
- package/dist/utils/git-diff-stats.js +53 -0
- package/dist/utils/git-diff-stats.js.map +1 -0
- package/dist/utils/handle-event-for-ui.cjs +1 -1
- package/dist/utils/handle-event-for-ui.cjs.map +1 -1
- package/dist/utils/handle-event-for-ui.js +13 -11
- package/dist/utils/handle-event-for-ui.js.map +1 -1
- package/dist/utils/mcp-credential-validation.cjs +1 -1
- package/dist/utils/mcp-credential-validation.js +3 -3
- package/dist/utils/mcp-marketplace-utils.cjs +1 -1
- package/dist/utils/mcp-marketplace-utils.cjs.map +1 -1
- package/dist/utils/mcp-marketplace-utils.js +22 -9
- package/dist/utils/mcp-marketplace-utils.js.map +1 -1
- package/dist/utils/parse-git-remote-url.cjs +1 -1
- package/dist/utils/parse-git-remote-url.cjs.map +1 -1
- package/dist/utils/parse-git-remote-url.js +6 -7
- package/dist/utils/parse-git-remote-url.js.map +1 -1
- package/dist/utils/path-utils.cjs +1 -1
- package/dist/utils/path-utils.cjs.map +1 -1
- package/dist/utils/path-utils.d.ts +15 -3
- package/dist/utils/path-utils.js +29 -3
- package/dist/utils/path-utils.js.map +1 -1
- package/dist/utils/recommended-automation-rail.cjs +2 -0
- package/dist/utils/recommended-automation-rail.cjs.map +1 -0
- package/dist/utils/recommended-automation-rail.d.ts +22 -0
- package/dist/utils/recommended-automation-rail.js +44 -0
- package/dist/utils/recommended-automation-rail.js.map +1 -0
- package/dist/utils/responder-deployment.cjs +2 -0
- package/dist/utils/responder-deployment.cjs.map +1 -0
- package/dist/utils/responder-deployment.js +42 -0
- package/dist/utils/responder-deployment.js.map +1 -0
- package/dist/utils/scroll-fade-state.cjs +2 -0
- package/dist/utils/scroll-fade-state.cjs.map +1 -0
- package/dist/utils/scroll-fade-state.d.ts +6 -0
- package/dist/utils/scroll-fade-state.js +13 -0
- package/dist/utils/scroll-fade-state.js.map +1 -0
- package/dist/utils/skill-category.cjs +2 -0
- package/dist/utils/skill-category.cjs.map +1 -0
- package/dist/utils/skill-category.js +51 -0
- package/dist/utils/skill-category.js.map +1 -0
- package/dist/utils/skill-enablement.cjs +2 -0
- package/dist/utils/skill-enablement.cjs.map +1 -0
- package/dist/utils/skill-enablement.d.ts +51 -0
- package/dist/utils/skill-enablement.js +31 -0
- package/dist/utils/skill-enablement.js.map +1 -0
- package/dist/utils/skill-scope.cjs +1 -1
- package/dist/utils/skill-scope.cjs.map +1 -1
- package/dist/utils/skill-scope.js +1 -1
- package/dist/utils/skill-scope.js.map +1 -1
- package/dist/utils/streaming-delta-batcher.cjs +2 -0
- package/dist/utils/streaming-delta-batcher.cjs.map +1 -0
- package/dist/utils/streaming-delta-batcher.d.ts +21 -0
- package/dist/utils/streaming-delta-batcher.js +31 -0
- package/dist/utils/streaming-delta-batcher.js.map +1 -0
- package/dist/utils/tar-gzip.d.ts +26 -0
- package/dist/utils/utils.cjs +1 -1
- package/dist/utils/utils.cjs.map +1 -1
- package/dist/utils/utils.d.ts +1 -41
- package/dist/utils/utils.js +27 -6
- package/dist/utils/utils.js.map +1 -1
- package/dist/utils/vscode-origin.cjs +2 -0
- package/dist/utils/vscode-origin.cjs.map +1 -0
- package/dist/utils/vscode-origin.d.ts +55 -0
- package/dist/utils/vscode-origin.js +27 -0
- package/dist/utils/vscode-origin.js.map +1 -0
- package/dist/utils/websocket-handshake.cjs +2 -0
- package/dist/utils/websocket-handshake.cjs.map +1 -0
- package/dist/utils/websocket-handshake.d.ts +11 -0
- package/dist/utils/websocket-handshake.js +12 -0
- package/dist/utils/websocket-handshake.js.map +1 -0
- package/dist/utils/workspace-mode.d.ts +4 -0
- package/package.json +3 -3
- package/scripts/check-sdk-version-sync.mjs +6 -6
- package/scripts/check-translation-completeness.cjs +5 -0
- package/scripts/dev-extra-backend.mjs +28 -9
- package/scripts/dev-safe.mjs +81 -8
- package/scripts/dev-static.mjs +48 -44
- package/scripts/dev-with-automation.mjs +95 -6
- package/scripts/ingress.mjs +27 -1
- package/scripts/seed-automation-ux-data.mjs +810 -0
- package/scripts/static-server.mjs +74 -1
- package/tools/canvas_ui_tool.py +19 -0
- package/build/assets/acp-providers-CYy8qA2z.js +0 -1
- package/build/assets/active-backend-context-BZDG15C0.js +0 -2
- package/build/assets/agent-context-settings-DGWBBbcp.js +0 -1
- package/build/assets/agent-profiles-settings-DrkGdf4_.js +0 -1
- package/build/assets/agent-server-conversation-service.api-DK56YPTs.js +0 -86
- package/build/assets/agent-settings-DfcSgkLD.js +0 -2
- package/build/assets/agent-settings-Lrc5-twS.js +0 -1
- package/build/assets/alert-banner-BgDHhL7b.js +0 -1
- package/build/assets/api-error-message-BEIE_yD1.js +0 -1
- package/build/assets/api-key-entry-screen-DaZnOlVo.js +0 -1
- package/build/assets/app-settings-BG5NAUbC.js +0 -1
- package/build/assets/automation-detail-D4Hs831Z.js +0 -3
- package/build/assets/automation-export-n0X6FB0C.js +0 -2
- package/build/assets/automation-git-sync-CDrm8WV7.js +0 -1
- package/build/assets/automation-setup-route-CZCl4ONs.js +0 -1
- package/build/assets/automation-templates-DFF96AdL.js +0 -1
- package/build/assets/automations-list-Bl-oGOrV.js +0 -1
- package/build/assets/back-nav-button-H_ThtDA0.js +0 -1
- package/build/assets/backend-form-modal-CbCemvHt.js +0 -1
- package/build/assets/backend-not-configured-DP8KLNq_.js +0 -1
- package/build/assets/backend-synced-settings-badge-BBASWqsb.js +0 -1
- package/build/assets/badge-B-51h-SW.js +0 -1
- package/build/assets/base-modal-BbjycA8X.js +0 -1
- package/build/assets/bot-CGPCg03p.js +0 -1
- package/build/assets/brand-button-Blxv5nww.js +0 -1
- package/build/assets/browser-CuW0nWvh.js +0 -7
- package/build/assets/browser-tab-D5G0ORwt.js +0 -1
- package/build/assets/chat-send-button-BD2tii1r.js +0 -1
- package/build/assets/check-DSuS-lyr.js +0 -1
- package/build/assets/chevron-down-CgGcmtE2.js +0 -1
- package/build/assets/circle-check-CG5-NPw7.js +0 -1
- package/build/assets/circle-plus-check-toggle-ASbpB8vN.js +0 -1
- package/build/assets/cloud-funnel-analytics-GlCUG0gk.js +0 -1
- package/build/assets/cog-CZiR80uT.js +0 -1
- package/build/assets/combobox-caret-DvpEsh2O.js +0 -1
- package/build/assets/command-menu-DwUQzjYP.js +0 -1
- package/build/assets/condenser-settings-BptcoiLA.js +0 -1
- package/build/assets/confirmation-modal-CiEwxZAA.js +0 -1
- package/build/assets/context-menu-list-item-CdcamfM1.js +0 -1
- package/build/assets/conversation-DREHj4nT.js +0 -1
- package/build/assets/conversation-DotRfiDz.js +0 -90
- package/build/assets/conversation-panel-DREHj4nT.js +0 -1
- package/build/assets/conversation-state-store-DMLtlHbE.js +0 -1
- package/build/assets/conversation-store-Blc5xysY.js +0 -6
- package/build/assets/conversation-tab-empty-state-D-puECpY.js +0 -1
- package/build/assets/copy-to-clipboard-button-BGxcUbgy.js +0 -1
- package/build/assets/device-verify-CZJfWaJf.js +0 -1
- package/build/assets/dropdown-classes-tLhpwtxS.js +0 -1
- package/build/assets/entry.client-D8GnI6GZ.js +0 -2
- package/build/assets/enum-filter-dropdown-Fk8k60nk.js +0 -1
- package/build/assets/environment-switch-overlay-DeztVYuL.js +0 -1
- package/build/assets/extension-module-card-classes-Bo43vY5V.js +0 -1
- package/build/assets/extensions-hub-Cd6GCYzq.js +0 -1
- package/build/assets/extensions-navigation-C4sgZg-y.js +0 -1
- package/build/assets/external-link-C0UpBgsE.js +0 -1
- package/build/assets/file-text-C6WYtNdV.js +0 -1
- package/build/assets/files-tab-BW_qzyAm.js +0 -1
- package/build/assets/form-control-classes-CGXBLcn1.js +0 -1
- package/build/assets/format-model-name-BNPKVsIq.js +0 -1
- package/build/assets/format-relative-time-ZhQD4rsl.js +0 -1
- package/build/assets/git-provider-icon-CaQ1yLPi.js +0 -1
- package/build/assets/git-repo-dropdown-CgXR6M_E.js +0 -1
- package/build/assets/git-repo-dropdown-D2Uei3CO.js +0 -1
- package/build/assets/highlighted-source-view-C_YOp8Fo.js +0 -1
- package/build/assets/home-DNzzJcMP.js +0 -1
- package/build/assets/home-aCos-5vc.js +0 -1
- package/build/assets/home-store-DgzViC3f.js +0 -1
- package/build/assets/index-home-DNzzJcMP.js +0 -1
- package/build/assets/info-CLoC1LRo.js +0 -1
- package/build/assets/install-server-modal-D7zIqNKz.js +0 -1
- package/build/assets/kebab-menu-item-content-DERMdnDv.js +0 -1
- package/build/assets/launch-5PjKeLak.js +0 -1
- package/build/assets/list-todo-BF049YaY.js +0 -1
- package/build/assets/llm-not-configured-banner-BK9z5eS0.js +0 -27
- package/build/assets/llm-settings-BLAMK2tR.js +0 -1
- package/build/assets/llm-settings-BWsbarGM.js +0 -1
- package/build/assets/llm-subscription-service-SfnEV9Uc.js +0 -1
- package/build/assets/loader-circle-D7IagAyF.js +0 -1
- package/build/assets/loading-spinner-DBgXgra0.js +0 -1
- package/build/assets/manage-backends-modal-BTqNPhzc.js +0 -1
- package/build/assets/manifest-abebca3c.js +0 -1
- package/build/assets/manifest-subpage-layout-Rn-glaxV.js +0 -1
- package/build/assets/map-provider-BK4HnqYz.js +0 -1
- package/build/assets/markdown-renderer-Cp6DlHQN.js +0 -8
- package/build/assets/mcp-BC-Ixn4T.js +0 -9
- package/build/assets/mcp-marketplace-utils-BJWJgbB6.js +0 -1
- package/build/assets/messages-CzFKrzPG.js +0 -40
- package/build/assets/modal-body-BdKfD3Hl.js +0 -1
- package/build/assets/modal-classes-D5_b5vMi.js +0 -1
- package/build/assets/modal-close-button-objukxk_.js +0 -1
- package/build/assets/mouse-pointer-click-C_gXyLyD.js +0 -1
- package/build/assets/npm-CHVHV1MC.js +0 -1
- package/build/assets/onboarding-Diw0V51A.js +0 -1
- package/build/assets/onboarding-modal-Da4yHzsA.js +0 -1
- package/build/assets/organization-service.api-BztSy69u.js +0 -1
- package/build/assets/parse-git-remote-url-BkXN9jzl.js +0 -1
- package/build/assets/pencil-49avMHlD.js +0 -1
- package/build/assets/planner-tab-CJiSpNax.js +0 -1
- package/build/assets/plugins-management-service-lHdNKWNU.js +0 -1
- package/build/assets/plus-C0BagBpV.js +0 -1
- package/build/assets/profiles-service.api-BLr7FXec.js +0 -1
- package/build/assets/providers-CWXnb7S3.js +0 -1
- package/build/assets/proxy-DYDXxtje.js +0 -1
- package/build/assets/puzzle-Bt2B1rzf.js +0 -1
- package/build/assets/recommended-automations-launcher-CcFMfJRR.js +0 -1
- package/build/assets/refresh-cw-nmcesifB.js +0 -1
- package/build/assets/root-CT4t7apy.css +0 -1
- package/build/assets/root-DnRgLKpU.js +0 -2
- package/build/assets/root-layout-2L9tr-BN.js +0 -2
- package/build/assets/schema-field-C59lVZTA.js +0 -1
- package/build/assets/sdk-section-page-BbBEQQjq.js +0 -1
- package/build/assets/search-CYSDBczG.js +0 -1
- package/build/assets/secrets-service-BtsgYSlj.js +0 -1
- package/build/assets/secrets-settings-DJ0OKa4_.js +0 -1
- package/build/assets/segmented-toggle-DiVfTZuN.js +0 -1
- package/build/assets/settings-CDqL_Uqh.js +0 -1
- package/build/assets/settings-DcNPxz0v.js +0 -1
- package/build/assets/settings-dropdown-input-Ba1UN5Du.js +0 -1
- package/build/assets/settings-index-Cz2cKt2K.js +0 -1
- package/build/assets/settings-input-CWUEHHvS.js +0 -1
- package/build/assets/settings-list-classes-DdcLXDGn.js +0 -1
- package/build/assets/settings-modal-nEEK1Kh1.js +0 -1
- package/build/assets/settings-service.api-3yAUFcaP.js +0 -1
- package/build/assets/settings-switch-Dk9hChx1.js +0 -1
- package/build/assets/settings-utils-CxjtCSB3.js +0 -1
- package/build/assets/shared-conversation-DbAcrx3s.js +0 -1
- package/build/assets/shield-check-CiOTXxV2.js +0 -1
- package/build/assets/sidebar-layout-lrfPooIB.js +0 -1
- package/build/assets/sidebar-mobile-menu-toggle-KERXfNu1.js +0 -1
- package/build/assets/sidebar-nav-link-B8lFD6Cb.js +0 -1
- package/build/assets/sidebar-store-u6pUpxJ7.js +0 -1
- package/build/assets/skill-card-pill-row-dGIUzr_b.js +0 -1
- package/build/assets/skill-icon-badge-kkOWZ89w.js +0 -1
- package/build/assets/skill-scope-DWN1PBPH.js +0 -1
- package/build/assets/skills-plugins-DFjH2Nq6.js +0 -1
- package/build/assets/skills-settings-DIHpl3ol.js +0 -2
- package/build/assets/sparkles-ntyMLnbj.js +0 -1
- package/build/assets/styled-tooltip-B6JXcsmL.js +0 -1
- package/build/assets/task-list-tab-aEJzEcHD.js +0 -1
- package/build/assets/terminal-Dch7Ty5K.js +0 -3
- package/build/assets/toggle-switch-B2MLKsgt.js +0 -1
- package/build/assets/trash-2-yZnDM4Ji.js +0 -1
- package/build/assets/typography-DB5HoCk0.js +0 -1
- package/build/assets/usage-tab-DrEtBmBT.js +0 -1
- package/build/assets/use-acp-credential-form-c8KXAa8A.js +0 -1
- package/build/assets/use-activate-agent-profile-B0p34N3q.js +0 -1
- package/build/assets/use-agent-profiles-CPIc6wLH.js +0 -1
- package/build/assets/use-can-manage-org-profiles-Dz_8Eqkv.js +0 -1
- package/build/assets/use-cloud-current-user-id-DvUVqCle.js +0 -1
- package/build/assets/use-config-C3PO4TBw.js +0 -1
- package/build/assets/use-create-conversation-DVrA_uLD.js +0 -1
- package/build/assets/use-create-secret-DbBIpaCR.js +0 -1
- package/build/assets/use-get-secrets-6PBitf54.js +0 -1
- package/build/assets/use-has-permission-CQ31Cl8j.js +0 -1
- package/build/assets/use-is-authed-2UrDIziV.js +0 -1
- package/build/assets/use-is-creating-conversation-BvYpmb3v.js +0 -1
- package/build/assets/use-launch-skill-in-chat-COnDpxCQ.js +0 -1
- package/build/assets/use-llm-profiles-diZS4FiN.js +0 -1
- package/build/assets/use-manifest-capabilities-HIWCtIUm.js +0 -1
- package/build/assets/use-onboarding-completion-Bs8PcXik.js +0 -1
- package/build/assets/use-plugins-marketplace-BCuNLFsr.js +0 -1
- package/build/assets/use-save-agent-profile-BaMNSpBV.js +0 -1
- package/build/assets/use-save-settings-BahvC2Gw.js +0 -1
- package/build/assets/use-settings-C6ZxpBDX.js +0 -1
- package/build/assets/use-settings-nav-items-Bqn69Ggw.js +0 -16
- package/build/assets/use-tracking-Bhu7gk2y.js +0 -3
- package/build/assets/use-user-conversation-BkNXpXrd.js +0 -1
- package/build/assets/useInfiniteQuery-c_OmS3lK.js +0 -1
- package/build/assets/useMutation-6ZsQCqAn.js +0 -1
- package/build/assets/useQueries-xDrGlTO_.js +0 -1
- package/build/assets/useQuery-Bs5NFz2s.js +0 -1
- package/build/assets/utils-DUD5ScdA.js +0 -1
- package/build/assets/vendor~browser-B-fae1JU.js +0 -47
- package/build/assets/vendor~entry.client-BFE7Llz9.js +0 -1
- package/build/assets/vendor~entry.client-BaKt_PIp.js +0 -9
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kepq2zme-D87mAf6K.js +0 -186
- package/build/assets/vendor~files-tab-B6POTS66.js +0 -11
- package/build/assets/vendor~index-home~home~conversation-panel~conversation-53Q_U6uP.js +0 -13
- package/build/assets/vendor~index-home~home~conversation-panel~conversation~alert-banner-B3qC_oj8.js +0 -1
- package/build/assets/vendor~root-layout-DeQACFVA.js +0 -1
- package/build/assets/vendor~root-layout~conversation-panel~conversation-bv7ooVgH.js +0 -1
- package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-e8pX05xf.js +0 -1
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-BvS6PCK2.js +0 -1
- package/build/assets/vendor~root-layout~index-home~home~mcp~automations-list~automation-templates~automation-set~bxsimjx0-D7IDevqN.js +0 -1
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-DOPLJMH9.js +0 -48
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iw7io29p-Dz8NQve5.js +0 -1
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-BOVIFA_g.js +0 -73
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-C0JXQb_q.js +0 -7465
- package/build/assets/verification-settings-COueVXmM.js +0 -1
- package/build/assets/wrench-C95ujnYo.js +0 -1
- package/build/assets/x-86ZCfxKY.js +0 -1
- package/build/assets/zap-DRa-r-Tf.js +0 -1
- package/dist/components/features/diff-viewer/empty-changes-message.cjs +0 -2
- package/dist/components/features/diff-viewer/empty-changes-message.cjs.map +0 -1
- package/dist/components/features/diff-viewer/empty-changes-message.js +0 -17
- package/dist/components/features/diff-viewer/empty-changes-message.js.map +0 -1
- package/dist/components/features/tips/random-tip.cjs +0 -2
- package/dist/components/features/tips/random-tip.cjs.map +0 -1
- package/dist/components/features/tips/random-tip.d.ts +0 -2
- package/dist/components/features/tips/random-tip.js +0 -41
- package/dist/components/features/tips/random-tip.js.map +0 -1
- package/dist/hooks/query/use-has-git-commits.cjs +0 -2
- package/dist/hooks/query/use-has-git-commits.cjs.map +0 -1
- package/dist/hooks/query/use-has-git-commits.d.ts +0 -25
- package/dist/hooks/query/use-has-git-commits.js +0 -31
- package/dist/hooks/query/use-has-git-commits.js.map +0 -1
- package/dist/hooks/use-has-attached-source.cjs +0 -2
- package/dist/hooks/use-has-attached-source.cjs.map +0 -1
- package/dist/hooks/use-has-attached-source.d.ts +0 -18
- package/dist/hooks/use-has-attached-source.js +0 -14
- package/dist/hooks/use-has-attached-source.js.map +0 -1
- package/dist/icons/chveron-up.cjs +0 -2
- package/dist/icons/chveron-up.cjs.map +0 -1
- package/dist/icons/chveron-up.js +0 -21
- package/dist/icons/chveron-up.js.map +0 -1
- package/dist/routes/changes-tab.cjs +0 -2
- package/dist/routes/changes-tab.cjs.map +0 -1
- package/dist/routes/changes-tab.d.ts +0 -3
- package/dist/routes/changes-tab.js +0 -64
- package/dist/routes/changes-tab.js.map +0 -1
- package/dist/utils/file-priority.cjs +0 -2
- package/dist/utils/file-priority.cjs.map +0 -1
- package/dist/utils/file-priority.d.ts +0 -27
- package/dist/utils/file-priority.js +0 -61
- package/dist/utils/file-priority.js.map +0 -1
- package/dist/utils/table-row-classes.d.ts +0 -9
- package/dist/utils/tips.cjs +0 -2
- package/dist/utils/tips.cjs.map +0 -1
- package/dist/utils/tips.d.ts +0 -7
- package/dist/utils/tips.js +0 -45
- package/dist/utils/tips.js.map +0 -1
- package/dist/utils/workspace-relative-path.cjs +0 -2
- package/dist/utils/workspace-relative-path.cjs.map +0 -1
- package/dist/utils/workspace-relative-path.d.ts +0 -10
- package/dist/utils/workspace-relative-path.js +0 -22
- package/dist/utils/workspace-relative-path.js.map +0 -1
- /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~dcc51rps-rfV8mQ9m.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-rfV8mQ9m.js} +0 -0
- /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ox0jfsa0-cHFhpUBq.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~i58xkef6-cHFhpUBq.js} +0 -0
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
//#region src/utils/format-model-name.ts
|
|
2
|
-
var e = "Free", t = {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
"openhands/deepseek-v4-flash": "OpenHands DeepSeek V4 Flash (free)",
|
|
6
|
-
"openhands/minimax-m2.7": "OpenHands MiniMax M2.7 (free)"
|
|
7
|
-
}, n = `Free OpenHands models: ${Object.keys(t).join(", ")}. Other provider endpoints with similar model names may require separate billing.`, r = (e) => !!(e && e in t);
|
|
8
|
-
function i(e) {
|
|
9
|
-
return e ? r(e) ? t[e] : e : null;
|
|
2
|
+
var e = "Free", t = { "openhands/deepseek-v4-flash": "OpenHands DeepSeek V4 Flash (free)" }, n = Object.keys(t), r = (e) => !!e?.startsWith("openhands/"), i = `Free OpenHands models: ${n.join(", ")}. Other provider endpoints with similar model names may require separate billing.`, a = (e) => !!(e && e in t);
|
|
3
|
+
function o(e) {
|
|
4
|
+
return e ? a(e) ? t[e] : e : null;
|
|
10
5
|
}
|
|
11
|
-
function
|
|
12
|
-
return e ?
|
|
6
|
+
function s(e) {
|
|
7
|
+
return e ? a(e) ? t[e] : e.split("/").pop() || e : null;
|
|
13
8
|
}
|
|
14
9
|
//#endregion
|
|
15
|
-
export { e as FREE_MODEL_BADGE_LABEL,
|
|
10
|
+
export { e as FREE_MODEL_BADGE_LABEL, i as FREE_OPENHANDS_MODEL_NOTE, o as formatModelNameForDisplay, s as formatNativeModelName, a as isFreeOpenHandsModel, r as isOpenHandsProviderModel };
|
|
16
11
|
|
|
17
12
|
//# sourceMappingURL=format-model-name.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-model-name.js","names":[],"sources":["../../src/utils/format-model-name.ts"],"sourcesContent":["export const FREE_MODEL_BADGE_LABEL = \"Free\";\n\nexport const FREE_OPENHANDS_MODELS = {\n \"openhands/
|
|
1
|
+
{"version":3,"file":"format-model-name.js","names":[],"sources":["../../src/utils/format-model-name.ts"],"sourcesContent":["export const FREE_MODEL_BADGE_LABEL = \"Free\";\n\nexport const FREE_OPENHANDS_MODELS = {\n \"openhands/deepseek-v4-flash\": \"OpenHands DeepSeek V4 Flash (free)\",\n} as const;\n\nexport const FREE_OPENHANDS_MODEL_IDS = Object.keys(FREE_OPENHANDS_MODELS);\n\n/**\n * Whether a model id routes through the OpenHands provider (the `openhands/`\n * prefix). On cloud the OpenHands provider is backed by a server-minted LLM\n * key rather than a user-supplied one, so callers use this to hide the inline\n * API key / base URL inputs and strip those fields from the save payload.\n */\nexport const isOpenHandsProviderModel = (\n model: string | null | undefined,\n): boolean => Boolean(model?.startsWith(\"openhands/\"));\n\nexport const FREE_OPENHANDS_MODEL_NOTE = `Free OpenHands models: ${FREE_OPENHANDS_MODEL_IDS.join(\n \", \",\n)}. Other provider endpoints with similar model names may require separate billing.`;\n\nexport const isFreeOpenHandsModel = (\n model: string | null | undefined,\n): model is keyof typeof FREE_OPENHANDS_MODELS =>\n Boolean(model && model in FREE_OPENHANDS_MODELS);\n\nexport function formatModelNameForDisplay(\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n return isFreeOpenHandsModel(model) ? FREE_OPENHANDS_MODELS[model] : model;\n}\n\nexport function formatProviderModelNameForDisplay(\n provider: string | null | undefined,\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n const fullModel = provider ? `${provider}/${model}` : model;\n return isFreeOpenHandsModel(fullModel)\n ? FREE_OPENHANDS_MODELS[fullModel]\n : model;\n}\n\n/**\n * Format a native (OpenHands-kind) routing model string for display, stripping\n * the provider route prefix (e.g. ``\"anthropic/claude-sonnet-4-5-20250929\"`` →\n * ``\"claude-sonnet-4-5-20250929\"``, ``\"litellm_proxy/openai/gpt-4o\"`` →\n * ``\"gpt-4o\"``) so a conversation chip shows a meaningful model name rather than\n * the full routing path.\n *\n * Returns ``null`` for an empty/nullish input, and falls back to the original\n * string when stripping the prefix would leave nothing (e.g. a trailing slash)\n * — never an empty string, which would collapse the chip text.\n *\n * Display-only: unlike {@link deriveProfileNameFromModel} this does not sanitize\n * to an identifier, so it keeps the real model id intact for the chip.\n */\nexport function formatNativeModelName(\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n if (isFreeOpenHandsModel(model)) return FREE_OPENHANDS_MODELS[model];\n const lastSegment = model.split(\"/\").pop();\n return lastSegment || model;\n}\n"],"mappings":";AAAA,IAAa,IAAyB,QAEzB,IAAwB,EACnC,+BAA+B,qCACjC,GAEa,IAA2B,OAAO,KAAK,CAAqB,GAQ5D,KACX,MACY,EAAQ,GAAO,WAAW,YAAY,GAEvC,IAA4B,0BAA0B,EAAyB,KAC1F,IACF,EAAE,oFAEW,KACX,MAEA,GAAQ,KAAS,KAAS;AAE5B,SAAgB,EACd,GACe;CAEf,OADK,IACE,EAAqB,CAAK,IAAI,EAAsB,KAAS,IADjD;AAErB;AA2BA,SAAgB,EACd,GACe;CAIf,OAHK,IACD,EAAqB,CAAK,IAAU,EAAsB,KAC1C,EAAM,MAAM,GAAG,EAAE,IAC9B,KAAe,IAHH;AAIrB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require("../_virtual/_rolldown/runtime.cjs");const e=require("../i18n/declaration.cjs");function t(e,t){return new Date(e).toLocaleDateString(t,{year:`numeric`,month:`short`,day:`numeric`})}function n(e){if(!e)return!0;let t=new Date(e).getTime();return Number.isNaN(t)||t===0}function r(n,r,i){let a=Date.now()-new Date(n).getTime(),o=Math.floor(a/6e4),s=Math.floor(a/36e5),c=Math.floor(a/864e5);return o<1?i(e.I18nKey.AUTOMATIONS$DETAIL$TIME_JUST_NOW):o<60?i(e.I18nKey.AUTOMATIONS$DETAIL$TIME_MINUTES_AGO,{count:o}):s<24?i(e.I18nKey.AUTOMATIONS$DETAIL$TIME_HOURS_AGO,{count:s}):c===1?i(e.I18nKey.AUTOMATIONS$DETAIL$TIME_YESTERDAY):c<7?i(e.I18nKey.AUTOMATIONS$DETAIL$TIME_DAYS_AGO,{count:c}):t(n,r)}exports.formatRelativeTime=r,exports.isInvalidTimestamp=n;
|
|
2
|
+
//# sourceMappingURL=format-relative-time.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-relative-time.cjs","names":[],"sources":["../../src/utils/format-relative-time.ts"],"sourcesContent":["import { I18nKey } from \"#/i18n/declaration\";\n\nexport function formatDate(dateStr: string, locale: string): string {\n const date = new Date(dateStr);\n return date.toLocaleDateString(locale, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n\n/**\n * Whether a timestamp is one nothing can be computed from. Besides an\n * unparseable string, that includes the epoch: the backend leaves unset\n * datetimes at zero, and formatting one produces \"Jan 1, 1970\" rather than\n * an honest \"unknown\".\n */\nexport function isInvalidTimestamp(\n dateStr: string | null | undefined,\n): boolean {\n if (!dateStr) return true;\n const parsed = new Date(dateStr).getTime();\n return Number.isNaN(parsed) || parsed === 0;\n}\n\nexport function formatRelativeTime(\n dateStr: string,\n locale: string,\n t: (key: I18nKey, options?: Record<string, unknown>) => string,\n): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diffMs = now - then;\n const diffMins = Math.floor(diffMs / 60_000);\n const diffHours = Math.floor(diffMs / 3_600_000);\n const diffDays = Math.floor(diffMs / 86_400_000);\n\n if (diffMins < 1) return t(I18nKey.AUTOMATIONS$DETAIL$TIME_JUST_NOW);\n if (diffMins < 60)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_MINUTES_AGO, { count: diffMins });\n if (diffHours < 24)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_HOURS_AGO, { count: diffHours });\n if (diffDays === 1) return t(I18nKey.AUTOMATIONS$DETAIL$TIME_YESTERDAY);\n if (diffDays < 7)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_DAYS_AGO, { count: diffDays });\n return formatDate(dateStr, locale);\n}\n"],"mappings":"wFAEA,SAAgB,EAAW,EAAiB,EAAwB,CAElE,OAAO,IADU,KAAK,CACf,EAAK,mBAAmB,EAAQ,CACrC,KAAM,UACN,MAAO,QACP,IAAK,SACP,CAAC,CACH,CAQA,SAAgB,EACd,EACS,CACT,GAAI,CAAC,EAAS,MAAO,GACrB,IAAM,EAAS,IAAI,KAAK,CAAO,EAAE,QAAQ,EACzC,OAAO,OAAO,MAAM,CAAM,GAAK,IAAW,CAC5C,CAEA,SAAgB,EACd,EACA,EACA,EACQ,CAGR,IAAM,EAFM,KAAK,IAEF,EADF,IAAI,KAAK,CAAO,EAAE,QACV,EACf,EAAW,KAAK,MAAM,EAAS,GAAM,EACrC,EAAY,KAAK,MAAM,EAAS,IAAS,EACzC,EAAW,KAAK,MAAM,EAAS,KAAU,EAU/C,OARI,EAAW,EAAU,EAAE,EAAA,QAAQ,gCAAgC,EAC/D,EAAW,GACN,EAAE,EAAA,QAAQ,oCAAqC,CAAE,MAAO,CAAS,CAAC,EACvE,EAAY,GACP,EAAE,EAAA,QAAQ,kCAAmC,CAAE,MAAO,CAAU,CAAC,EACtE,IAAa,EAAU,EAAE,EAAA,QAAQ,iCAAiC,EAClE,EAAW,EACN,EAAE,EAAA,QAAQ,iCAAkC,CAAE,MAAO,CAAS,CAAC,EACjE,EAAW,EAAS,CAAM,CACnC"}
|
|
@@ -1,3 +1,10 @@
|
|
|
1
1
|
import { I18nKey } from "#/i18n/declaration";
|
|
2
2
|
export declare function formatDate(dateStr: string, locale: string): string;
|
|
3
|
+
/**
|
|
4
|
+
* Whether a timestamp is one nothing can be computed from. Besides an
|
|
5
|
+
* unparseable string, that includes the epoch: the backend leaves unset
|
|
6
|
+
* datetimes at zero, and formatting one produces "Jan 1, 1970" rather than
|
|
7
|
+
* an honest "unknown".
|
|
8
|
+
*/
|
|
9
|
+
export declare function isInvalidTimestamp(dateStr: string | null | undefined): boolean;
|
|
3
10
|
export declare function formatRelativeTime(dateStr: string, locale: string, t: (key: I18nKey, options?: Record<string, unknown>) => string): string;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { I18nKey as e } from "../i18n/declaration.js";
|
|
2
|
+
//#region src/utils/format-relative-time.ts
|
|
3
|
+
function t(e, t) {
|
|
4
|
+
return new Date(e).toLocaleDateString(t, {
|
|
5
|
+
year: "numeric",
|
|
6
|
+
month: "short",
|
|
7
|
+
day: "numeric"
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
function n(e) {
|
|
11
|
+
if (!e) return !0;
|
|
12
|
+
let t = new Date(e).getTime();
|
|
13
|
+
return Number.isNaN(t) || t === 0;
|
|
14
|
+
}
|
|
15
|
+
function r(n, r, i) {
|
|
16
|
+
let a = Date.now() - new Date(n).getTime(), o = Math.floor(a / 6e4), s = Math.floor(a / 36e5), c = Math.floor(a / 864e5);
|
|
17
|
+
return o < 1 ? i(e.AUTOMATIONS$DETAIL$TIME_JUST_NOW) : o < 60 ? i(e.AUTOMATIONS$DETAIL$TIME_MINUTES_AGO, { count: o }) : s < 24 ? i(e.AUTOMATIONS$DETAIL$TIME_HOURS_AGO, { count: s }) : c === 1 ? i(e.AUTOMATIONS$DETAIL$TIME_YESTERDAY) : c < 7 ? i(e.AUTOMATIONS$DETAIL$TIME_DAYS_AGO, { count: c }) : t(n, r);
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { r as formatRelativeTime, n as isInvalidTimestamp };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=format-relative-time.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-relative-time.js","names":[],"sources":["../../src/utils/format-relative-time.ts"],"sourcesContent":["import { I18nKey } from \"#/i18n/declaration\";\n\nexport function formatDate(dateStr: string, locale: string): string {\n const date = new Date(dateStr);\n return date.toLocaleDateString(locale, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n\n/**\n * Whether a timestamp is one nothing can be computed from. Besides an\n * unparseable string, that includes the epoch: the backend leaves unset\n * datetimes at zero, and formatting one produces \"Jan 1, 1970\" rather than\n * an honest \"unknown\".\n */\nexport function isInvalidTimestamp(\n dateStr: string | null | undefined,\n): boolean {\n if (!dateStr) return true;\n const parsed = new Date(dateStr).getTime();\n return Number.isNaN(parsed) || parsed === 0;\n}\n\nexport function formatRelativeTime(\n dateStr: string,\n locale: string,\n t: (key: I18nKey, options?: Record<string, unknown>) => string,\n): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diffMs = now - then;\n const diffMins = Math.floor(diffMs / 60_000);\n const diffHours = Math.floor(diffMs / 3_600_000);\n const diffDays = Math.floor(diffMs / 86_400_000);\n\n if (diffMins < 1) return t(I18nKey.AUTOMATIONS$DETAIL$TIME_JUST_NOW);\n if (diffMins < 60)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_MINUTES_AGO, { count: diffMins });\n if (diffHours < 24)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_HOURS_AGO, { count: diffHours });\n if (diffDays === 1) return t(I18nKey.AUTOMATIONS$DETAIL$TIME_YESTERDAY);\n if (diffDays < 7)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_DAYS_AGO, { count: diffDays });\n return formatDate(dateStr, locale);\n}\n"],"mappings":";;AAEA,SAAgB,EAAW,GAAiB,GAAwB;CAElE,OAAO,IADU,KAAK,CACf,EAAK,mBAAmB,GAAQ;EACrC,MAAM;EACN,OAAO;EACP,KAAK;CACP,CAAC;AACH;AAQA,SAAgB,EACd,GACS;CACT,IAAI,CAAC,GAAS,OAAO;CACrB,IAAM,IAAS,IAAI,KAAK,CAAO,EAAE,QAAQ;CACzC,OAAO,OAAO,MAAM,CAAM,KAAK,MAAW;AAC5C;AAEA,SAAgB,EACd,GACA,GACA,GACQ;CAGR,IAAM,IAFM,KAAK,IAEF,IADF,IAAI,KAAK,CAAO,EAAE,QACV,GACf,IAAW,KAAK,MAAM,IAAS,GAAM,GACrC,IAAY,KAAK,MAAM,IAAS,IAAS,GACzC,IAAW,KAAK,MAAM,IAAS,KAAU;CAU/C,OARI,IAAW,IAAU,EAAE,EAAQ,gCAAgC,IAC/D,IAAW,KACN,EAAE,EAAQ,qCAAqC,EAAE,OAAO,EAAS,CAAC,IACvE,IAAY,KACP,EAAE,EAAQ,mCAAmC,EAAE,OAAO,EAAU,CAAC,IACtE,MAAa,IAAU,EAAE,EAAQ,iCAAiC,IAClE,IAAW,IACN,EAAE,EAAQ,kCAAkC,EAAE,OAAO,EAAS,CAAC,IACjE,EAAW,GAAS,CAAM;AACnC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
require("../_virtual/_rolldown/runtime.cjs");function e(e){let t=0,n=0;for(let r of e.split(`
|
|
2
|
+
`))r.startsWith(`+++`)||r.startsWith(`---`)||r.startsWith(`@@`)||(r.startsWith(`+`)?t+=1:r.startsWith(`-`)&&(n+=1));return{additions:t,deletions:n}}function t(e,t){let n=e.length===0?[]:e.split(`
|
|
3
|
+
`),r=t.length===0?[]:t.split(`
|
|
4
|
+
`);if(n.length===0)return{additions:r.length,deletions:0};if(r.length===0)return{additions:0,deletions:n.length};let i=0,a=0,o=0,s=0;for(;o<n.length||s<r.length;){let e=n[o],t=r[s];if(o<n.length&&s<r.length&&e===t){o+=1,s+=1;continue}if(s<r.length&&(o>=n.length||!n.slice(o).includes(t))){i+=1,s+=1;continue}o<n.length&&(a+=1,o+=1)}return{additions:i,deletions:a}}function n(n){return typeof n.diff==`string`&&n.diff.length>0?e(n.diff):t(n.original??``,n.modified??``)}function r(e){return e.reduce((e,t)=>({additions:e.additions+t.additions,deletions:e.deletions+t.deletions}),{additions:0,deletions:0})}exports.countGitChangeDiffStats=n,exports.sumGitDiffLineStats=r;
|
|
5
|
+
//# sourceMappingURL=git-diff-stats.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-diff-stats.cjs","names":[],"sources":["../../src/utils/git-diff-stats.ts"],"sourcesContent":["import type { GitChangeDiff } from \"#/api/open-hands.types\";\n\nexport interface GitDiffLineStats {\n additions: number;\n deletions: number;\n}\n\nfunction countUnifiedDiffStats(diff: string): GitDiffLineStats {\n let additions = 0;\n let deletions = 0;\n\n for (const line of diff.split(\"\\n\")) {\n if (\n line.startsWith(\"+++\") ||\n line.startsWith(\"---\") ||\n line.startsWith(\"@@\")\n ) {\n continue;\n }\n if (line.startsWith(\"+\")) {\n additions += 1;\n } else if (line.startsWith(\"-\")) {\n deletions += 1;\n }\n }\n\n return { additions, deletions };\n}\n\nfunction countTextDiffStats(\n original: string,\n modified: string,\n): GitDiffLineStats {\n const originalLines = original.length === 0 ? [] : original.split(\"\\n\");\n const modifiedLines = modified.length === 0 ? [] : modified.split(\"\\n\");\n\n if (originalLines.length === 0) {\n return { additions: modifiedLines.length, deletions: 0 };\n }\n\n if (modifiedLines.length === 0) {\n return { additions: 0, deletions: originalLines.length };\n }\n\n let additions = 0;\n let deletions = 0;\n let originalIndex = 0;\n let modifiedIndex = 0;\n\n while (\n originalIndex < originalLines.length ||\n modifiedIndex < modifiedLines.length\n ) {\n const originalLine = originalLines[originalIndex];\n const modifiedLine = modifiedLines[modifiedIndex];\n\n if (\n originalIndex < originalLines.length &&\n modifiedIndex < modifiedLines.length &&\n originalLine === modifiedLine\n ) {\n originalIndex += 1;\n modifiedIndex += 1;\n continue;\n }\n\n if (\n modifiedIndex < modifiedLines.length &&\n (originalIndex >= originalLines.length ||\n !originalLines.slice(originalIndex).includes(modifiedLine))\n ) {\n additions += 1;\n modifiedIndex += 1;\n continue;\n }\n\n if (originalIndex < originalLines.length) {\n deletions += 1;\n originalIndex += 1;\n }\n }\n\n return { additions, deletions };\n}\n\nexport function countGitChangeDiffStats(\n diff: GitChangeDiff & { diff?: string },\n): GitDiffLineStats {\n if (typeof diff.diff === \"string\" && diff.diff.length > 0) {\n return countUnifiedDiffStats(diff.diff);\n }\n\n return countTextDiffStats(diff.original ?? \"\", diff.modified ?? \"\");\n}\n\nexport function sumGitDiffLineStats(\n stats: GitDiffLineStats[],\n): GitDiffLineStats {\n return stats.reduce(\n (totals, stat) => ({\n additions: totals.additions + stat.additions,\n deletions: totals.deletions + stat.deletions,\n }),\n { additions: 0, deletions: 0 },\n );\n}\n"],"mappings":"6CAOA,SAAS,EAAsB,EAAgC,CAC7D,IAAI,EAAY,EACZ,EAAY,EAEhB,IAAK,IAAM,KAAQ,EAAK,MAAM;CAAI,EAE9B,EAAK,WAAW,KAAK,GACrB,EAAK,WAAW,KAAK,GACrB,EAAK,WAAW,IAAI,IAIlB,EAAK,WAAW,GAAG,EACrB,GAAa,EACJ,EAAK,WAAW,GAAG,IAC5B,GAAa,IAIjB,MAAO,CAAE,YAAW,WAAU,CAChC,CAEA,SAAS,EACP,EACA,EACkB,CAClB,IAAM,EAAgB,EAAS,SAAW,EAAI,CAAC,EAAI,EAAS,MAAM;CAAI,EAChE,EAAgB,EAAS,SAAW,EAAI,CAAC,EAAI,EAAS,MAAM;CAAI,EAEtE,GAAI,EAAc,SAAW,EAC3B,MAAO,CAAE,UAAW,EAAc,OAAQ,UAAW,CAAE,EAGzD,GAAI,EAAc,SAAW,EAC3B,MAAO,CAAE,UAAW,EAAG,UAAW,EAAc,MAAO,EAGzD,IAAI,EAAY,EACZ,EAAY,EACZ,EAAgB,EAChB,EAAgB,EAEpB,KACE,EAAgB,EAAc,QAC9B,EAAgB,EAAc,QAC9B,CACA,IAAM,EAAe,EAAc,GAC7B,EAAe,EAAc,GAEnC,GACE,EAAgB,EAAc,QAC9B,EAAgB,EAAc,QAC9B,IAAiB,EACjB,CACA,GAAiB,EACjB,GAAiB,EACjB,QACF,CAEA,GACE,EAAgB,EAAc,SAC7B,GAAiB,EAAc,QAC9B,CAAC,EAAc,MAAM,CAAa,EAAE,SAAS,CAAY,GAC3D,CACA,GAAa,EACb,GAAiB,EACjB,QACF,CAEI,EAAgB,EAAc,SAChC,GAAa,EACb,GAAiB,EAErB,CAEA,MAAO,CAAE,YAAW,WAAU,CAChC,CAEA,SAAgB,EACd,EACkB,CAKlB,OAJI,OAAO,EAAK,MAAS,UAAY,EAAK,KAAK,OAAS,EAC/C,EAAsB,EAAK,IAAI,EAGjC,EAAmB,EAAK,UAAY,GAAI,EAAK,UAAY,EAAE,CACpE,CAEA,SAAgB,EACd,EACkB,CAClB,OAAO,EAAM,QACV,EAAQ,KAAU,CACjB,UAAW,EAAO,UAAY,EAAK,UACnC,UAAW,EAAO,UAAY,EAAK,SACrC,GACA,CAAE,UAAW,EAAG,UAAW,CAAE,CAC/B,CACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { GitChangeDiff } from "#/api/open-hands.types";
|
|
2
|
+
export interface GitDiffLineStats {
|
|
3
|
+
additions: number;
|
|
4
|
+
deletions: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function countGitChangeDiffStats(diff: GitChangeDiff & {
|
|
7
|
+
diff?: string;
|
|
8
|
+
}): GitDiffLineStats;
|
|
9
|
+
export declare function sumGitDiffLineStats(stats: GitDiffLineStats[]): GitDiffLineStats;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
//#region src/utils/git-diff-stats.ts
|
|
2
|
+
function e(e) {
|
|
3
|
+
let t = 0, n = 0;
|
|
4
|
+
for (let r of e.split("\n")) r.startsWith("+++") || r.startsWith("---") || r.startsWith("@@") || (r.startsWith("+") ? t += 1 : r.startsWith("-") && (n += 1));
|
|
5
|
+
return {
|
|
6
|
+
additions: t,
|
|
7
|
+
deletions: n
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function t(e, t) {
|
|
11
|
+
let n = e.length === 0 ? [] : e.split("\n"), r = t.length === 0 ? [] : t.split("\n");
|
|
12
|
+
if (n.length === 0) return {
|
|
13
|
+
additions: r.length,
|
|
14
|
+
deletions: 0
|
|
15
|
+
};
|
|
16
|
+
if (r.length === 0) return {
|
|
17
|
+
additions: 0,
|
|
18
|
+
deletions: n.length
|
|
19
|
+
};
|
|
20
|
+
let i = 0, a = 0, o = 0, s = 0;
|
|
21
|
+
for (; o < n.length || s < r.length;) {
|
|
22
|
+
let e = n[o], t = r[s];
|
|
23
|
+
if (o < n.length && s < r.length && e === t) {
|
|
24
|
+
o += 1, s += 1;
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (s < r.length && (o >= n.length || !n.slice(o).includes(t))) {
|
|
28
|
+
i += 1, s += 1;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
o < n.length && (a += 1, o += 1);
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
additions: i,
|
|
35
|
+
deletions: a
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function n(n) {
|
|
39
|
+
return typeof n.diff == "string" && n.diff.length > 0 ? e(n.diff) : t(n.original ?? "", n.modified ?? "");
|
|
40
|
+
}
|
|
41
|
+
function r(e) {
|
|
42
|
+
return e.reduce((e, t) => ({
|
|
43
|
+
additions: e.additions + t.additions,
|
|
44
|
+
deletions: e.deletions + t.deletions
|
|
45
|
+
}), {
|
|
46
|
+
additions: 0,
|
|
47
|
+
deletions: 0
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//#endregion
|
|
51
|
+
export { n as countGitChangeDiffStats, r as sumGitDiffLineStats };
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=git-diff-stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-diff-stats.js","names":[],"sources":["../../src/utils/git-diff-stats.ts"],"sourcesContent":["import type { GitChangeDiff } from \"#/api/open-hands.types\";\n\nexport interface GitDiffLineStats {\n additions: number;\n deletions: number;\n}\n\nfunction countUnifiedDiffStats(diff: string): GitDiffLineStats {\n let additions = 0;\n let deletions = 0;\n\n for (const line of diff.split(\"\\n\")) {\n if (\n line.startsWith(\"+++\") ||\n line.startsWith(\"---\") ||\n line.startsWith(\"@@\")\n ) {\n continue;\n }\n if (line.startsWith(\"+\")) {\n additions += 1;\n } else if (line.startsWith(\"-\")) {\n deletions += 1;\n }\n }\n\n return { additions, deletions };\n}\n\nfunction countTextDiffStats(\n original: string,\n modified: string,\n): GitDiffLineStats {\n const originalLines = original.length === 0 ? [] : original.split(\"\\n\");\n const modifiedLines = modified.length === 0 ? [] : modified.split(\"\\n\");\n\n if (originalLines.length === 0) {\n return { additions: modifiedLines.length, deletions: 0 };\n }\n\n if (modifiedLines.length === 0) {\n return { additions: 0, deletions: originalLines.length };\n }\n\n let additions = 0;\n let deletions = 0;\n let originalIndex = 0;\n let modifiedIndex = 0;\n\n while (\n originalIndex < originalLines.length ||\n modifiedIndex < modifiedLines.length\n ) {\n const originalLine = originalLines[originalIndex];\n const modifiedLine = modifiedLines[modifiedIndex];\n\n if (\n originalIndex < originalLines.length &&\n modifiedIndex < modifiedLines.length &&\n originalLine === modifiedLine\n ) {\n originalIndex += 1;\n modifiedIndex += 1;\n continue;\n }\n\n if (\n modifiedIndex < modifiedLines.length &&\n (originalIndex >= originalLines.length ||\n !originalLines.slice(originalIndex).includes(modifiedLine))\n ) {\n additions += 1;\n modifiedIndex += 1;\n continue;\n }\n\n if (originalIndex < originalLines.length) {\n deletions += 1;\n originalIndex += 1;\n }\n }\n\n return { additions, deletions };\n}\n\nexport function countGitChangeDiffStats(\n diff: GitChangeDiff & { diff?: string },\n): GitDiffLineStats {\n if (typeof diff.diff === \"string\" && diff.diff.length > 0) {\n return countUnifiedDiffStats(diff.diff);\n }\n\n return countTextDiffStats(diff.original ?? \"\", diff.modified ?? \"\");\n}\n\nexport function sumGitDiffLineStats(\n stats: GitDiffLineStats[],\n): GitDiffLineStats {\n return stats.reduce(\n (totals, stat) => ({\n additions: totals.additions + stat.additions,\n deletions: totals.deletions + stat.deletions,\n }),\n { additions: 0, deletions: 0 },\n );\n}\n"],"mappings":";AAOA,SAAS,EAAsB,GAAgC;CAC7D,IAAI,IAAY,GACZ,IAAY;CAEhB,KAAK,IAAM,KAAQ,EAAK,MAAM,IAAI,GAE9B,EAAK,WAAW,KAAK,KACrB,EAAK,WAAW,KAAK,KACrB,EAAK,WAAW,IAAI,MAIlB,EAAK,WAAW,GAAG,IACrB,KAAa,IACJ,EAAK,WAAW,GAAG,MAC5B,KAAa;CAIjB,OAAO;EAAE;EAAW;CAAU;AAChC;AAEA,SAAS,EACP,GACA,GACkB;CAClB,IAAM,IAAgB,EAAS,WAAW,IAAI,CAAC,IAAI,EAAS,MAAM,IAAI,GAChE,IAAgB,EAAS,WAAW,IAAI,CAAC,IAAI,EAAS,MAAM,IAAI;CAEtE,IAAI,EAAc,WAAW,GAC3B,OAAO;EAAE,WAAW,EAAc;EAAQ,WAAW;CAAE;CAGzD,IAAI,EAAc,WAAW,GAC3B,OAAO;EAAE,WAAW;EAAG,WAAW,EAAc;CAAO;CAGzD,IAAI,IAAY,GACZ,IAAY,GACZ,IAAgB,GAChB,IAAgB;CAEpB,OACE,IAAgB,EAAc,UAC9B,IAAgB,EAAc,SAC9B;EACA,IAAM,IAAe,EAAc,IAC7B,IAAe,EAAc;EAEnC,IACE,IAAgB,EAAc,UAC9B,IAAgB,EAAc,UAC9B,MAAiB,GACjB;GAEA,AADA,KAAiB,GACjB,KAAiB;GACjB;EACF;EAEA,IACE,IAAgB,EAAc,WAC7B,KAAiB,EAAc,UAC9B,CAAC,EAAc,MAAM,CAAa,EAAE,SAAS,CAAY,IAC3D;GAEA,AADA,KAAa,GACb,KAAiB;GACjB;EACF;EAEA,AAAI,IAAgB,EAAc,WAChC,KAAa,GACb,KAAiB;CAErB;CAEA,OAAO;EAAE;EAAW;CAAU;AAChC;AAEA,SAAgB,EACd,GACkB;CAKlB,OAJI,OAAO,EAAK,QAAS,YAAY,EAAK,KAAK,SAAS,IAC/C,EAAsB,EAAK,IAAI,IAGjC,EAAmB,EAAK,YAAY,IAAI,EAAK,YAAY,EAAE;AACpE;AAEA,SAAgB,EACd,GACkB;CAClB,OAAO,EAAM,QACV,GAAQ,OAAU;EACjB,WAAW,EAAO,YAAY,EAAK;EACnC,WAAW,EAAO,YAAY,EAAK;CACrC,IACA;EAAE,WAAW;EAAG,WAAW;CAAE,CAC/B;AACF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../_virtual/_rolldown/runtime.cjs");const e=require("../types/agent-server/type-guards.cjs"),t=require("../components/conversation-events/chat/event-thought-helpers.cjs");var n=(e,t)=>({...t,content:`${t.content??``}${e.content??``}`||null,reasoning_content:`${t.reasoning_content??``}${e.reasoning_content??``}`||null}),r=(e,t)=>!!e.isFromPlanningAgent==!!t.isFromPlanningAgent,i=t=>{for(let n=t.length-1;n>=0;--n){let r=t[n];if(e.isMessageEvent(r)&&r.source===`user`)return n}return-1},a=e=>e.filter(e=>e.type===`text`).map(e=>e.text).join(``),o=(e,t)=>{let n=0,r=0;for(let i of t){let t=e.indexOf(i,n);if(t===-1)return{matched:!1,lastMatchEnd:r};r=t+i.length,n=r}return{matched:!0,lastMatchEnd:r}},s=(t,n)=>{let a=i(t);return t.map((e,t)=>({event:e,index:t})).filter(t=>t.index>a&&e.isStreamingDeltaEvent(t.event)&&(t.event.content?.length??0)>0&&r(n,t.event))},c=(t,n)=>{let r=[];for(let i=t.length-1;i>=0;--i){let a=t[i];if(!e.isStreamingDeltaEvent(a))break;n(a)&&r.unshift({event:a,index:i})}return r},l=e=>c(e,e=>(e.content?.length??0)>0),u=(e,t)=>c(e,e=>!!e.reasoning_content&&r(t,e)),d=(t,n,r)=>{let i=new Set(n.map(({index:e})=>e)),a=[];return t.forEach((t,n)=>{if(!i.has(n)||!e.isStreamingDeltaEvent(t)){a.push(t);return}!r&&t.reasoning_content&&a.push({...t,content:null})}),a},f=(e,t)=>{let n=t.join(``),r=new Set([n,n.trimEnd(),n.trimStart(),n.trim()]);for(let t of r)if(t&&e.startsWith(t))return{matched:!0,lastMatchEnd:t.length};let i=t.length-1;return o(e,t.map((e,t)=>t===i?e.trimEnd():e))},p=n=>e.isActionEvent(n)?t.getReasoningContent(n).trim().length>0:e.isMessageEvent(n)&&n.source===`agent`?t.splitInlineThink(a(n.llm_message.content)).reasoning.length>0:!1,
|
|
1
|
+
require("../_virtual/_rolldown/runtime.cjs");const e=require("../types/agent-server/type-guards.cjs"),t=require("../components/conversation-events/chat/event-thought-helpers.cjs");var n=(e,t)=>({...t,content:`${t.content??``}${e.content??``}`||null,reasoning_content:`${t.reasoning_content??``}${e.reasoning_content??``}`||null}),r=(e,t)=>!!e.isFromPlanningAgent==!!t.isFromPlanningAgent,i=t=>{for(let n=t.length-1;n>=0;--n){let r=t[n];if(e.isMessageEvent(r)&&r.source===`user`)return n}return-1},a=e=>e.filter(e=>e.type===`text`).map(e=>e.text).join(``),o=(e,t)=>{let n=0,r=0;for(let i of t){let t=e.indexOf(i,n);if(t===-1)return{matched:!1,lastMatchEnd:r};r=t+i.length,n=r}return{matched:!0,lastMatchEnd:r}},s=(t,n)=>{let a=i(t);return t.map((e,t)=>({event:e,index:t})).filter(t=>t.index>a&&e.isStreamingDeltaEvent(t.event)&&(t.event.content?.length??0)>0&&r(n,t.event))},c=(t,n)=>{let r=[];for(let i=t.length-1;i>=0;--i){let a=t[i];if(!e.isStreamingDeltaEvent(a))break;n(a)&&r.unshift({event:a,index:i})}return r},l=(e,t)=>c(e,e=>(e.content?.length??0)>0&&r(t,e)),u=(e,t)=>c(e,e=>!!e.reasoning_content&&r(t,e)),d=(t,n,r)=>{let i=new Set(n.map(({index:e})=>e)),a=[];return t.forEach((t,n)=>{if(!i.has(n)||!e.isStreamingDeltaEvent(t)){a.push(t);return}!r&&t.reasoning_content&&a.push({...t,content:null})}),a},f=(e,t)=>{let n=t.join(``),r=new Set([n,n.trimEnd(),n.trimStart(),n.trim()]);for(let t of r)if(t&&e.startsWith(t))return{matched:!0,lastMatchEnd:t.length};let i=t.length-1;return o(e,t.map((e,t)=>t===i?e.trimEnd():e))},p=e=>e.some(e=>e.includes(`<function=`)),m=n=>e.isActionEvent(n)?t.getReasoningContent(n).trim().length>0:e.isMessageEvent(n)&&n.source===`agent`?t.splitInlineThink(a(n.llm_message.content)).reasoning.length>0:!1,h=(e,t)=>{let n=s(t,e);if(n.length===0)return null;let r=d(t,n,m(e));return r.push(e),r},g=(e,n)=>{let r=a(e.thought);if(!r)return null;let i=l(n,e);if(i.length===0)return null;let o=i.map(({event:e})=>e.content??``);return!f(r,o).matched&&!p(o)?null:d(n,i,t.getReasoningContent(e).trim().length>0)},_=(n,r)=>{if(t.getReasoningContent(n).trim().length===0)return null;let i=u(r,n);if(i.length===0)return null;let a=new Set(i.map(({index:e})=>e)),o=[];return r.forEach((t,n)=>{if(!a.has(n)||!e.isStreamingDeltaEvent(t)){o.push(t);return}t.content&&o.push({...t,reasoning_content:null})}),o},v=(t,i)=>{let a=[...i];if(e.isStreamingDeltaEvent(t)){if(t.content===null&&t.reasoning_content===null)return a;let i=a.length-1,o=a[i];return o&&e.isStreamingDeltaEvent(o)&&r(t,o)?(a[i]=n(t,o),a):(a.push(t),a)}if(e.isActionEvent(t)&&t.action.kind===`FinishAction`||e.isMessageEvent(t)&&t.source===`agent`){let e=h(t,a);if(e)return e}if(e.isActionEvent(t)&&t.action.kind!==`FinishAction`&&t.action.kind!==`ThinkAction`){let e=g(t,a)??_(t,a);if(e)return e.push(t),e}if(e.isACPToolCallEvent(t)){let n=a.findIndex(n=>e.isACPToolCallEvent(n)&&n.tool_call_id===t.tool_call_id);return n===-1?a.push(t):a[n]=t,a}if(e.isObservationEvent(t)){if(t.observation.kind===`ThinkObservation`||t.observation.kind===`FinishObservation`)return a;let e=a.findIndex(e=>e.id===t.action_id);e===-1?a.push(t):a[e]=t}else a.push(t);return a};exports.handleEventForUI=v,exports.isSameStreamingSender=r,exports.mergeStreamingDeltaEvent=n;
|
|
2
2
|
//# sourceMappingURL=handle-event-for-ui.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle-event-for-ui.cjs","names":[],"sources":["../../src/utils/handle-event-for-ui.ts"],"sourcesContent":["import {\n ActionEvent,\n ImageContent,\n OpenHandsEvent,\n TextContent,\n} from \"#/types/agent-server/core\";\nimport {\n isACPToolCallEvent,\n isActionEvent,\n isMessageEvent,\n isObservationEvent,\n isStreamingDeltaEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { StreamingDeltaEvent } from \"#/types/agent-server/core/events/streaming-delta-event\";\nimport {\n getReasoningContent,\n splitInlineThink,\n} from \"#/components/conversation-events/chat/event-thought-helpers\";\n\nexport const mergeStreamingDeltaEvent = (\n incoming: StreamingDeltaEvent,\n existing: StreamingDeltaEvent,\n): StreamingDeltaEvent => ({\n ...existing,\n content: `${existing.content ?? \"\"}${incoming.content ?? \"\"}` || null,\n reasoning_content:\n `${existing.reasoning_content ?? \"\"}${incoming.reasoning_content ?? \"\"}` ||\n null,\n});\n\n// Deltas only merge into one bubble when they share a sender; the planning flag\n// is the only discriminator (every delta has `source: \"agent\"`). Prevents a\n// planning-agent delta concatenating onto a main-agent one, misattributed (#1656).\nexport const isSameStreamingSender = (\n a: OpenHandsEvent & { isFromPlanningAgent?: boolean },\n b: OpenHandsEvent & { isFromPlanningAgent?: boolean },\n): boolean => Boolean(a.isFromPlanningAgent) === Boolean(b.isFromPlanningAgent);\n\nconst findLastUserMessageIndex = (events: OpenHandsEvent[]): number => {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (isMessageEvent(event) && event.source === \"user\") {\n return index;\n }\n }\n return -1;\n};\n\n// Join text blocks WITHOUT a separator: streaming deltas concatenate content\n// tokens directly with no separator between LLM content blocks, so using \"\\n\"\n// here would cause startsWith/findTextSegmentsInOrder to miss when reconciling\n// a multi-block message/thought against the already-rendered streaming delta.\nconst joinTextBlocks = (blocks: (TextContent | ImageContent)[]): string =>\n blocks\n .filter((block) => block.type === \"text\")\n .map((block) => block.text)\n .join(\"\");\n\nconst findTextSegmentsInOrder = (\n text: string,\n segments: string[],\n): { matched: boolean; lastMatchEnd: number } => {\n let searchStart = 0;\n let lastMatchEnd = 0;\n\n for (const segment of segments) {\n const index = text.indexOf(segment, searchStart);\n if (index === -1) {\n return { matched: false, lastMatchEnd };\n }\n lastMatchEnd = index + segment.length;\n searchStart = lastMatchEnd;\n }\n\n return { matched: true, lastMatchEnd };\n};\n\n// Content-bearing streaming deltas of the current turn (after the last user\n// message) that share the final event's sender. Reasoning-only deltas are\n// excluded: reasoning renders in its own collapsed bubble and never overlaps\n// the message text being reconciled. Sender scoping matters because the main\n// and planning sockets share this event store — without it, one agent's final\n// event would strip the other agent's still-live streamed deltas (#1656).\nconst getCurrentTurnContentDeltas = (\n uiEvents: OpenHandsEvent[],\n finalEvent: OpenHandsEvent,\n): { event: StreamingDeltaEvent; index: number }[] => {\n const lastUserMessageIndex = findLastUserMessageIndex(uiEvents);\n return uiEvents\n .map((event, index) => ({ event, index }))\n .filter(\n (item): item is { event: StreamingDeltaEvent; index: number } =>\n item.index > lastUserMessageIndex &&\n isStreamingDeltaEvent(item.event) &&\n (item.event.content?.length ?? 0) > 0 &&\n isSameStreamingSender(finalEvent, item.event),\n );\n};\n\n// The current step's streaming delta(s): the trailing run at the end of\n// `uiEvents`. Earlier steps' deltas are separated by their observations, so\n// this never folds an earlier step's delta into the current one.\nconst getTrailingDeltas = (\n uiEvents: OpenHandsEvent[],\n selects: (event: StreamingDeltaEvent) => boolean,\n): { event: StreamingDeltaEvent; index: number }[] => {\n const deltas: { event: StreamingDeltaEvent; index: number }[] = [];\n for (let index = uiEvents.length - 1; index >= 0; index -= 1) {\n const event = uiEvents[index];\n if (!isStreamingDeltaEvent(event)) {\n break;\n }\n if (selects(event)) {\n deltas.unshift({ event, index });\n }\n }\n return deltas;\n};\n\nconst getTrailingContentDeltas = (uiEvents: OpenHandsEvent[]) =>\n getTrailingDeltas(uiEvents, (event) => (event.content?.length ?? 0) > 0);\n\n// Sender-scoped: the main and planning sockets share this event store, so a\n// main-agent action must not strip the planning agent's live reasoning (#1656).\nconst getTrailingReasoningDeltas = (\n uiEvents: OpenHandsEvent[],\n finalEvent: OpenHandsEvent,\n) =>\n getTrailingDeltas(\n uiEvents,\n (event) =>\n Boolean(event.reasoning_content) &&\n isSameStreamingSender(finalEvent, event),\n );\n\n// Strip the streamed content deltas, keeping a delta only when it carries\n// reasoning the replacement itself won't render (many models stream reasoning\n// solely through the delta). Shared by the finalize and intermediate-action\n// reconciliation paths.\nconst supersedeStreamingContent = (\n uiEvents: OpenHandsEvent[],\n contentDeltas: { event: StreamingDeltaEvent; index: number }[],\n replacementRendersReasoning: boolean,\n): OpenHandsEvent[] => {\n const indexesToStrip = new Set(contentDeltas.map(({ index }) => index));\n const nextUiEvents: OpenHandsEvent[] = [];\n uiEvents.forEach((event, index) => {\n if (!indexesToStrip.has(index) || !isStreamingDeltaEvent(event)) {\n nextUiEvents.push(event);\n return;\n }\n\n // Keep the delta only to render reasoning the replacement itself lacks.\n if (!replacementRendersReasoning && event.reasoning_content) {\n nextUiEvents.push({ ...event, content: null });\n }\n });\n return nextUiEvents;\n};\n\n// Whether the streamed `segments` (in order) reconcile against `targetText`.\n// `lastMatchEnd` is the offset past the matched text, so callers can recover\n// any not-yet-streamed suffix. The SDK strips the finalized text, so tolerate\n// leading and trailing whitespace that appeared only in the stream.\nconst matchStreamedSegments = (\n targetText: string,\n segments: string[],\n): { matched: boolean; lastMatchEnd: number } => {\n const streamedText = segments.join(\"\");\n const candidates = new Set([\n streamedText,\n streamedText.trimEnd(),\n streamedText.trimStart(),\n streamedText.trim(),\n ]);\n for (const candidate of candidates) {\n if (candidate && targetText.startsWith(candidate)) {\n return { matched: true, lastMatchEnd: candidate.length };\n }\n }\n // Segments may be interleaved with not-yet-streamed text; locate them in\n // order, trimming the last segment's trailing whitespace.\n const lastIndex = segments.length - 1;\n const searchSegments = segments.map((segment, index) =>\n index === lastIndex ? segment.trimEnd() : segment,\n );\n return findTextSegmentsInOrder(targetText, searchSegments);\n};\n\n// Whether the finalized event renders its own reasoning: an ActionEvent via\n// reasoning_content/thinking_blocks, an agent MessageEvent via an inline\n// <think> block in its content. Decides if a replaced delta's reasoning must\n// be preserved separately.\nconst eventRendersReasoning = (event: OpenHandsEvent): boolean => {\n if (isActionEvent(event)) {\n return getReasoningContent(event).trim().length > 0;\n }\n\n if (isMessageEvent(event) && event.source === \"agent\") {\n return (\n splitInlineThink(joinTextBlocks(event.llm_message.content)).reasoning\n .length > 0\n );\n }\n\n return false;\n};\n\n// The final MessageEvent/FinishAction is authoritative for the turn's text. Drop\n// the provisional streamed deltas and render the canonical final event instead,\n// so the message is rendered exactly once (never holey or duplicated) and its\n// metadata — critic_result, activated_microagents — renders too. Stream-only\n// reasoning is preserved. Returns null when there is no streamed content to\n// reconcile, leaving the caller to append the final event normally.\nconst finalizeStreamingDeltasInPlace = (\n finalEvent: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n const contentStreamingDeltas = getCurrentTurnContentDeltas(\n uiEvents,\n finalEvent,\n );\n if (contentStreamingDeltas.length === 0) {\n return null;\n }\n\n const nextUiEvents = supersedeStreamingContent(\n uiEvents,\n contentStreamingDeltas,\n eventRendersReasoning(finalEvent),\n );\n nextUiEvents.push(finalEvent);\n return nextUiEvents;\n};\n\n/**\n * Reconcile the current turn's streaming delta when an intermediate\n * (tool-calling) `ActionEvent` arrives. With `stream=true` the step's\n * pre-tool-call text is streamed as delta `content`, then the action's\n * `thought` repeats it and the chat hoists that into its own message (see\n * `group-events.ts`), so the text would render twice (issue #1534).\n *\n * The action must stay because it owns the tool call. The streamed text is\n * cleared from the delta, and the delta is kept only to carry reasoning the\n * action itself lacks (for many models the delta is the sole reasoning\n * carrier), otherwise dropped.\n *\n * Only the current step's trailing delta run is considered. Returns the updated\n * array, or `null` when there is nothing to reconcile.\n */\nconst supersedeStreamedThoughtWithAction = (\n action: ActionEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n const thoughtText = joinTextBlocks(action.thought);\n if (!thoughtText) {\n return null;\n }\n\n const contentDeltas = getTrailingContentDeltas(uiEvents);\n if (contentDeltas.length === 0) {\n return null;\n }\n\n const streamingSegments = contentDeltas.map(\n ({ event }) => event.content ?? \"\",\n );\n\n // Only strip when the streamed text is the action's rendered thought.\n if (!matchStreamedSegments(thoughtText, streamingSegments).matched) {\n return null;\n }\n\n // Keeping the delta's reasoning would duplicate the action's own \"Thinking\".\n return supersedeStreamingContent(\n uiEvents,\n contentDeltas,\n getReasoningContent(action).trim().length > 0,\n );\n};\n\n// Drop the current step's streamed reasoning when the action renders that\n// reasoning itself, so \"Thinking\" renders once. Unlike\n// `supersedeStreamedThoughtWithAction` this does not require the streamed text\n// to match the thought, which models streaming reasoning-only deltas never do.\nconst supersedeStreamedReasoningWithAction = (\n action: ActionEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n if (getReasoningContent(action).trim().length === 0) {\n return null;\n }\n\n const reasoningDeltas = getTrailingReasoningDeltas(uiEvents, action);\n if (reasoningDeltas.length === 0) {\n return null;\n }\n\n const indexesToStrip = new Set(reasoningDeltas.map(({ index }) => index));\n const nextUiEvents: OpenHandsEvent[] = [];\n uiEvents.forEach((event, index) => {\n if (!indexesToStrip.has(index) || !isStreamingDeltaEvent(event)) {\n nextUiEvents.push(event);\n return;\n }\n\n // Keep the delta only for streamed text the action itself lacks.\n if (event.content) {\n nextUiEvents.push({ ...event, reasoning_content: null });\n }\n });\n return nextUiEvents;\n};\n\n/**\n * Handles adding an event to the UI events array\n * Replaces actions with observations when they arrive (so UI shows observation instead of action)\n * Exception: ThinkAction is NOT replaced because the thought content is in the action, not in the observation\n *\n * ACPToolCallEvent merge: the SDK emits two events per ``tool_call_id`` — an\n * early ``started`` event (``pending`` / ``in_progress``) and one terminal\n * (completed / failed) event, the action->observation pair for a tool call.\n * Replace the started entry in place with the terminal one so a single card\n * updates from running to its result, exactly like an observation superseding\n * its action below.\n */\nexport const handleEventForUI = (\n event: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] => {\n const newUiEvents = [...uiEvents];\n\n if (isStreamingDeltaEvent(event)) {\n if (event.content === null && event.reasoning_content === null) {\n return newUiEvents;\n }\n\n const lastIndex = newUiEvents.length - 1;\n const lastEvent = newUiEvents[lastIndex];\n if (\n lastEvent &&\n isStreamingDeltaEvent(lastEvent) &&\n isSameStreamingSender(event, lastEvent)\n ) {\n newUiEvents[lastIndex] = mergeStreamingDeltaEvent(event, lastEvent);\n return newUiEvents;\n }\n\n newUiEvents.push(event);\n return newUiEvents;\n }\n\n if (\n (isActionEvent(event) && event.action.kind === \"FinishAction\") ||\n (isMessageEvent(event) && event.source === \"agent\")\n ) {\n const finalizedUiEvents = finalizeStreamingDeltasInPlace(\n event,\n newUiEvents,\n );\n if (finalizedUiEvents) {\n return finalizedUiEvents;\n }\n }\n\n // Intermediate tool-calling action whose thought was streamed: clear the\n // duplicated text from the delta (issue #1534). ThinkAction is excluded — its\n // thought renders through its own collapsible, not a hoisted thought.\n if (\n isActionEvent(event) &&\n event.action.kind !== \"FinishAction\" &&\n event.action.kind !== \"ThinkAction\"\n ) {\n const reconciledUiEvents =\n supersedeStreamedThoughtWithAction(event, newUiEvents) ??\n supersedeStreamedReasoningWithAction(event, newUiEvents);\n if (reconciledUiEvents) {\n reconciledUiEvents.push(event);\n return reconciledUiEvents;\n }\n }\n\n if (isACPToolCallEvent(event)) {\n const existingIndex = newUiEvents.findIndex(\n (uiEvent) =>\n isACPToolCallEvent(uiEvent) &&\n uiEvent.tool_call_id === event.tool_call_id,\n );\n if (existingIndex !== -1) {\n newUiEvents[existingIndex] = event;\n } else {\n newUiEvents.push(event);\n }\n return newUiEvents;\n }\n\n if (isObservationEvent(event)) {\n // Don't add ThinkObservation at all - we keep the ThinkAction instead\n // The thought content is in the action, not the observation\n if (event.observation.kind === \"ThinkObservation\") {\n return newUiEvents;\n }\n\n // Don't add FinishObservation at all - we keep the FinishAction instead\n // Both contain the same message content, so we only need to display one\n // This also prevents duplicate messages when events arrive out of order due to React batching\n if (event.observation.kind === \"FinishObservation\") {\n return newUiEvents;\n }\n\n // Find and replace the corresponding action from uiEvents\n const actionIndex = newUiEvents.findIndex(\n (uiEvent) => uiEvent.id === event.action_id,\n );\n if (actionIndex !== -1) {\n newUiEvents[actionIndex] = event;\n } else {\n // Action not found in uiEvents, just add the observation\n newUiEvents.push(event);\n }\n } else {\n // For non-observation events, just add them to uiEvents\n newUiEvents.push(event);\n }\n\n return newUiEvents;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"handle-event-for-ui.cjs","names":[],"sources":["../../src/utils/handle-event-for-ui.ts"],"sourcesContent":["import {\n ActionEvent,\n ImageContent,\n OpenHandsEvent,\n TextContent,\n} from \"#/types/agent-server/core\";\nimport {\n isACPToolCallEvent,\n isActionEvent,\n isMessageEvent,\n isObservationEvent,\n isStreamingDeltaEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { StreamingDeltaEvent } from \"#/types/agent-server/core/events/streaming-delta-event\";\nimport {\n getReasoningContent,\n splitInlineThink,\n} from \"#/components/conversation-events/chat/event-thought-helpers\";\n\nexport const mergeStreamingDeltaEvent = (\n incoming: StreamingDeltaEvent,\n existing: StreamingDeltaEvent,\n): StreamingDeltaEvent => ({\n ...existing,\n content: `${existing.content ?? \"\"}${incoming.content ?? \"\"}` || null,\n reasoning_content:\n `${existing.reasoning_content ?? \"\"}${incoming.reasoning_content ?? \"\"}` ||\n null,\n});\n\n// Deltas only merge into one bubble when they share a sender; the planning flag\n// is the only discriminator (every delta has `source: \"agent\"`). Prevents a\n// planning-agent delta concatenating onto a main-agent one, misattributed (#1656).\nexport const isSameStreamingSender = (\n a: OpenHandsEvent & { isFromPlanningAgent?: boolean },\n b: OpenHandsEvent & { isFromPlanningAgent?: boolean },\n): boolean => Boolean(a.isFromPlanningAgent) === Boolean(b.isFromPlanningAgent);\n\nconst findLastUserMessageIndex = (events: OpenHandsEvent[]): number => {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (isMessageEvent(event) && event.source === \"user\") {\n return index;\n }\n }\n return -1;\n};\n\n// Join text blocks WITHOUT a separator: streaming deltas concatenate content\n// tokens directly with no separator between LLM content blocks, so using \"\\n\"\n// here would cause startsWith/findTextSegmentsInOrder to miss when reconciling\n// a multi-block message/thought against the already-rendered streaming delta.\nconst joinTextBlocks = (blocks: (TextContent | ImageContent)[]): string =>\n blocks\n .filter((block) => block.type === \"text\")\n .map((block) => block.text)\n .join(\"\");\n\nconst findTextSegmentsInOrder = (\n text: string,\n segments: string[],\n): { matched: boolean; lastMatchEnd: number } => {\n let searchStart = 0;\n let lastMatchEnd = 0;\n\n for (const segment of segments) {\n const index = text.indexOf(segment, searchStart);\n if (index === -1) {\n return { matched: false, lastMatchEnd };\n }\n lastMatchEnd = index + segment.length;\n searchStart = lastMatchEnd;\n }\n\n return { matched: true, lastMatchEnd };\n};\n\n// Content-bearing streaming deltas of the current turn (after the last user\n// message) that share the final event's sender. Reasoning-only deltas are\n// excluded: reasoning renders in its own collapsed bubble and never overlaps\n// the message text being reconciled. Sender scoping matters because the main\n// and planning sockets share this event store — without it, one agent's final\n// event would strip the other agent's still-live streamed deltas (#1656).\nconst getCurrentTurnContentDeltas = (\n uiEvents: OpenHandsEvent[],\n finalEvent: OpenHandsEvent,\n): { event: StreamingDeltaEvent; index: number }[] => {\n const lastUserMessageIndex = findLastUserMessageIndex(uiEvents);\n return uiEvents\n .map((event, index) => ({ event, index }))\n .filter(\n (item): item is { event: StreamingDeltaEvent; index: number } =>\n item.index > lastUserMessageIndex &&\n isStreamingDeltaEvent(item.event) &&\n (item.event.content?.length ?? 0) > 0 &&\n isSameStreamingSender(finalEvent, item.event),\n );\n};\n\n// The current step's streaming delta(s): the trailing run at the end of\n// `uiEvents`. Earlier steps' deltas are separated by their observations, so\n// this never folds an earlier step's delta into the current one.\nconst getTrailingDeltas = (\n uiEvents: OpenHandsEvent[],\n selects: (event: StreamingDeltaEvent) => boolean,\n): { event: StreamingDeltaEvent; index: number }[] => {\n const deltas: { event: StreamingDeltaEvent; index: number }[] = [];\n for (let index = uiEvents.length - 1; index >= 0; index -= 1) {\n const event = uiEvents[index];\n if (!isStreamingDeltaEvent(event)) {\n break;\n }\n if (selects(event)) {\n deltas.unshift({ event, index });\n }\n }\n return deltas;\n};\n\n// Sender-scoped for the same reason as `getTrailingReasoningDeltas` (#1656):\n// a main-agent action must not strip the planning agent's live content.\nconst getTrailingContentDeltas = (\n uiEvents: OpenHandsEvent[],\n finalEvent: OpenHandsEvent,\n) =>\n getTrailingDeltas(\n uiEvents,\n (event) =>\n (event.content?.length ?? 0) > 0 &&\n isSameStreamingSender(finalEvent, event),\n );\n\n// Sender-scoped: the main and planning sockets share this event store, so a\n// main-agent action must not strip the planning agent's live reasoning (#1656).\nconst getTrailingReasoningDeltas = (\n uiEvents: OpenHandsEvent[],\n finalEvent: OpenHandsEvent,\n) =>\n getTrailingDeltas(\n uiEvents,\n (event) =>\n Boolean(event.reasoning_content) &&\n isSameStreamingSender(finalEvent, event),\n );\n\n// Strip the streamed content deltas, keeping a delta only when it carries\n// reasoning the replacement itself won't render (many models stream reasoning\n// solely through the delta). Shared by the finalize and intermediate-action\n// reconciliation paths.\nconst supersedeStreamingContent = (\n uiEvents: OpenHandsEvent[],\n contentDeltas: { event: StreamingDeltaEvent; index: number }[],\n replacementRendersReasoning: boolean,\n): OpenHandsEvent[] => {\n const indexesToStrip = new Set(contentDeltas.map(({ index }) => index));\n const nextUiEvents: OpenHandsEvent[] = [];\n uiEvents.forEach((event, index) => {\n if (!indexesToStrip.has(index) || !isStreamingDeltaEvent(event)) {\n nextUiEvents.push(event);\n return;\n }\n\n // Keep the delta only to render reasoning the replacement itself lacks.\n if (!replacementRendersReasoning && event.reasoning_content) {\n nextUiEvents.push({ ...event, content: null });\n }\n });\n return nextUiEvents;\n};\n\n// Whether the streamed `segments` (in order) reconcile against `targetText`.\n// `lastMatchEnd` is the offset past the matched text, so callers can recover\n// any not-yet-streamed suffix. The SDK strips the finalized text, so tolerate\n// leading and trailing whitespace that appeared only in the stream.\nconst matchStreamedSegments = (\n targetText: string,\n segments: string[],\n): { matched: boolean; lastMatchEnd: number } => {\n const streamedText = segments.join(\"\");\n const candidates = new Set([\n streamedText,\n streamedText.trimEnd(),\n streamedText.trimStart(),\n streamedText.trim(),\n ]);\n for (const candidate of candidates) {\n if (candidate && targetText.startsWith(candidate)) {\n return { matched: true, lastMatchEnd: candidate.length };\n }\n }\n // Segments may be interleaved with not-yet-streamed text; locate them in\n // order, trimming the last segment's trailing whitespace.\n const lastIndex = segments.length - 1;\n const searchSegments = segments.map((segment, index) =>\n index === lastIndex ? segment.trimEnd() : segment,\n );\n return findTextSegmentsInOrder(targetText, searchSegments);\n};\n\n// A `<function=` marker means the delta still holds the raw prompted-tool-call\n// XML the SDK strips only after the response completes, so the streamed text is\n// a superset of the action's `thought` that `matchStreamedSegments` can't match.\nconst hasUnstrippedFunctionCallMarker = (segments: string[]): boolean =>\n segments.some((segment) => segment.includes(\"<function=\"));\n\n// Whether the finalized event renders its own reasoning: an ActionEvent via\n// reasoning_content/thinking_blocks, an agent MessageEvent via an inline\n// <think> block in its content. Decides if a replaced delta's reasoning must\n// be preserved separately.\nconst eventRendersReasoning = (event: OpenHandsEvent): boolean => {\n if (isActionEvent(event)) {\n return getReasoningContent(event).trim().length > 0;\n }\n\n if (isMessageEvent(event) && event.source === \"agent\") {\n return (\n splitInlineThink(joinTextBlocks(event.llm_message.content)).reasoning\n .length > 0\n );\n }\n\n return false;\n};\n\n// The final MessageEvent/FinishAction is authoritative for the turn's text. Drop\n// the provisional streamed deltas and render the canonical final event instead,\n// so the message is rendered exactly once (never holey or duplicated) and its\n// metadata — critic_result, activated_skills — renders too. Stream-only\n// reasoning is preserved. Returns null when there is no streamed content to\n// reconcile, leaving the caller to append the final event normally.\nconst finalizeStreamingDeltasInPlace = (\n finalEvent: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n const contentStreamingDeltas = getCurrentTurnContentDeltas(\n uiEvents,\n finalEvent,\n );\n if (contentStreamingDeltas.length === 0) {\n return null;\n }\n\n const nextUiEvents = supersedeStreamingContent(\n uiEvents,\n contentStreamingDeltas,\n eventRendersReasoning(finalEvent),\n );\n nextUiEvents.push(finalEvent);\n return nextUiEvents;\n};\n\n/**\n * Reconcile the current turn's streaming delta when an intermediate\n * (tool-calling) `ActionEvent` arrives. With `stream=true` the step's\n * pre-tool-call text is streamed as delta `content`, then the action's\n * `thought` repeats it and the chat hoists that into its own message (see\n * `group-events.ts`), so the text would render twice (issue #1534).\n *\n * The action must stay because it owns the tool call. The streamed text is\n * cleared from the delta, and the delta is kept only to carry reasoning the\n * action itself lacks (for many models the delta is the sole reasoning\n * carrier), otherwise dropped.\n *\n * Only the current step's trailing delta run is considered. Returns the updated\n * array, or `null` when there is nothing to reconcile.\n */\nconst supersedeStreamedThoughtWithAction = (\n action: ActionEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n const thoughtText = joinTextBlocks(action.thought);\n if (!thoughtText) {\n return null;\n }\n\n const contentDeltas = getTrailingContentDeltas(uiEvents, action);\n if (contentDeltas.length === 0) {\n return null;\n }\n\n const streamingSegments = contentDeltas.map(\n ({ event }) => event.content ?? \"\",\n );\n\n // Strip on a thought match, or on an unstripped `<function=...>` marker whose\n // streamed text is a superset of `thought` that the match can't reconcile.\n const matchedThought = matchStreamedSegments(\n thoughtText,\n streamingSegments,\n ).matched;\n if (!matchedThought && !hasUnstrippedFunctionCallMarker(streamingSegments)) {\n return null;\n }\n\n // Keeping the delta's reasoning would duplicate the action's own \"Thinking\".\n return supersedeStreamingContent(\n uiEvents,\n contentDeltas,\n getReasoningContent(action).trim().length > 0,\n );\n};\n\n// Drop the current step's streamed reasoning when the action renders that\n// reasoning itself, so \"Thinking\" renders once. Unlike\n// `supersedeStreamedThoughtWithAction` this does not require the streamed text\n// to match the thought, which models streaming reasoning-only deltas never do.\nconst supersedeStreamedReasoningWithAction = (\n action: ActionEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n if (getReasoningContent(action).trim().length === 0) {\n return null;\n }\n\n const reasoningDeltas = getTrailingReasoningDeltas(uiEvents, action);\n if (reasoningDeltas.length === 0) {\n return null;\n }\n\n const indexesToStrip = new Set(reasoningDeltas.map(({ index }) => index));\n const nextUiEvents: OpenHandsEvent[] = [];\n uiEvents.forEach((event, index) => {\n if (!indexesToStrip.has(index) || !isStreamingDeltaEvent(event)) {\n nextUiEvents.push(event);\n return;\n }\n\n // Keep the delta only for streamed text the action itself lacks.\n if (event.content) {\n nextUiEvents.push({ ...event, reasoning_content: null });\n }\n });\n return nextUiEvents;\n};\n\n/**\n * Handles adding an event to the UI events array\n * Replaces actions with observations when they arrive (so UI shows observation instead of action)\n * Exception: ThinkAction is NOT replaced because the thought content is in the action, not in the observation\n *\n * ACPToolCallEvent merge: the SDK emits two events per ``tool_call_id`` — an\n * early ``started`` event (``pending`` / ``in_progress``) and one terminal\n * (completed / failed) event, the action->observation pair for a tool call.\n * Replace the started entry in place with the terminal one so a single card\n * updates from running to its result, exactly like an observation superseding\n * its action below.\n */\nexport const handleEventForUI = (\n event: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] => {\n const newUiEvents = [...uiEvents];\n\n if (isStreamingDeltaEvent(event)) {\n if (event.content === null && event.reasoning_content === null) {\n return newUiEvents;\n }\n\n const lastIndex = newUiEvents.length - 1;\n const lastEvent = newUiEvents[lastIndex];\n if (\n lastEvent &&\n isStreamingDeltaEvent(lastEvent) &&\n isSameStreamingSender(event, lastEvent)\n ) {\n newUiEvents[lastIndex] = mergeStreamingDeltaEvent(event, lastEvent);\n return newUiEvents;\n }\n\n newUiEvents.push(event);\n return newUiEvents;\n }\n\n if (\n (isActionEvent(event) && event.action.kind === \"FinishAction\") ||\n (isMessageEvent(event) && event.source === \"agent\")\n ) {\n const finalizedUiEvents = finalizeStreamingDeltasInPlace(\n event,\n newUiEvents,\n );\n if (finalizedUiEvents) {\n return finalizedUiEvents;\n }\n }\n\n // Intermediate tool-calling action whose thought was streamed: clear the\n // duplicated text from the delta (issue #1534). ThinkAction is excluded — its\n // thought renders through its own collapsible, not a hoisted thought.\n if (\n isActionEvent(event) &&\n event.action.kind !== \"FinishAction\" &&\n event.action.kind !== \"ThinkAction\"\n ) {\n const reconciledUiEvents =\n supersedeStreamedThoughtWithAction(event, newUiEvents) ??\n supersedeStreamedReasoningWithAction(event, newUiEvents);\n if (reconciledUiEvents) {\n reconciledUiEvents.push(event);\n return reconciledUiEvents;\n }\n }\n\n if (isACPToolCallEvent(event)) {\n const existingIndex = newUiEvents.findIndex(\n (uiEvent) =>\n isACPToolCallEvent(uiEvent) &&\n uiEvent.tool_call_id === event.tool_call_id,\n );\n if (existingIndex !== -1) {\n newUiEvents[existingIndex] = event;\n } else {\n newUiEvents.push(event);\n }\n return newUiEvents;\n }\n\n if (isObservationEvent(event)) {\n // Don't add ThinkObservation at all - we keep the ThinkAction instead\n // The thought content is in the action, not the observation\n if (event.observation.kind === \"ThinkObservation\") {\n return newUiEvents;\n }\n\n // Don't add FinishObservation at all - we keep the FinishAction instead\n // Both contain the same message content, so we only need to display one\n // This also prevents duplicate messages when events arrive out of order due to React batching\n if (event.observation.kind === \"FinishObservation\") {\n return newUiEvents;\n }\n\n // Find and replace the corresponding action from uiEvents\n const actionIndex = newUiEvents.findIndex(\n (uiEvent) => uiEvent.id === event.action_id,\n );\n if (actionIndex !== -1) {\n newUiEvents[actionIndex] = event;\n } else {\n // Action not found in uiEvents, just add the observation\n newUiEvents.push(event);\n }\n } else {\n // For non-observation events, just add them to uiEvents\n newUiEvents.push(event);\n }\n\n return newUiEvents;\n};\n"],"mappings":"oLAmBA,IAAa,GACX,EACA,KACyB,CACzB,GAAG,EACH,QAAS,GAAG,EAAS,SAAW,KAAK,EAAS,SAAW,MAAQ,KACjE,kBACE,GAAG,EAAS,mBAAqB,KAAK,EAAS,mBAAqB,MACpE,IACJ,GAKa,GACX,EACA,IACY,EAAQ,EAAE,qBAAyB,EAAQ,EAAE,oBAErD,EAA4B,GAAqC,CACrE,IAAK,IAAI,EAAQ,EAAO,OAAS,EAAG,GAAS,EAAG,IAAY,CAC1D,IAAM,EAAQ,EAAO,GACrB,GAAI,EAAA,eAAe,CAAK,GAAK,EAAM,SAAW,OAC5C,OAAO,CAEX,CACA,MAAO,EACT,EAMM,EAAkB,GACtB,EACG,OAAQ,GAAU,EAAM,OAAS,MAAM,EACvC,IAAK,GAAU,EAAM,IAAI,EACzB,KAAK,EAAE,EAEN,GACJ,EACA,IAC+C,CAC/C,IAAI,EAAc,EACd,EAAe,EAEnB,IAAK,IAAM,KAAW,EAAU,CAC9B,IAAM,EAAQ,EAAK,QAAQ,EAAS,CAAW,EAC/C,GAAI,IAAU,GACZ,MAAO,CAAE,QAAS,GAAO,cAAa,EAExC,EAAe,EAAQ,EAAQ,OAC/B,EAAc,CAChB,CAEA,MAAO,CAAE,QAAS,GAAM,cAAa,CACvC,EAQM,GACJ,EACA,IACoD,CACpD,IAAM,EAAuB,EAAyB,CAAQ,EAC9D,OAAO,EACJ,KAAK,EAAO,KAAW,CAAE,QAAO,OAAM,EAAE,EACxC,OACE,GACC,EAAK,MAAQ,GACb,EAAA,sBAAsB,EAAK,KAAK,IAC/B,EAAK,MAAM,SAAS,QAAU,GAAK,GACpC,EAAsB,EAAY,EAAK,KAAK,CAChD,CACJ,EAKM,GACJ,EACA,IACoD,CACpD,IAAM,EAA0D,CAAC,EACjE,IAAK,IAAI,EAAQ,EAAS,OAAS,EAAG,GAAS,EAAG,IAAY,CAC5D,IAAM,EAAQ,EAAS,GACvB,GAAI,CAAC,EAAA,sBAAsB,CAAK,EAC9B,MAEE,EAAQ,CAAK,GACf,EAAO,QAAQ,CAAE,QAAO,OAAM,CAAC,CAEnC,CACA,OAAO,CACT,EAIM,GACJ,EACA,IAEA,EACE,EACC,IACE,EAAM,SAAS,QAAU,GAAK,GAC/B,EAAsB,EAAY,CAAK,CAC3C,EAII,GACJ,EACA,IAEA,EACE,EACC,GACC,EAAQ,EAAM,mBACd,EAAsB,EAAY,CAAK,CAC3C,EAMI,GACJ,EACA,EACA,IACqB,CACrB,IAAM,EAAiB,IAAI,IAAI,EAAc,KAAK,CAAE,WAAY,CAAK,CAAC,EAChE,EAAiC,CAAC,EAYxC,OAXA,EAAS,SAAS,EAAO,IAAU,CACjC,GAAI,CAAC,EAAe,IAAI,CAAK,GAAK,CAAC,EAAA,sBAAsB,CAAK,EAAG,CAC/D,EAAa,KAAK,CAAK,EACvB,MACF,CAGI,CAAC,GAA+B,EAAM,mBACxC,EAAa,KAAK,CAAE,GAAG,EAAO,QAAS,IAAK,CAAC,CAEjD,CAAC,EACM,CACT,EAMM,GACJ,EACA,IAC+C,CAC/C,IAAM,EAAe,EAAS,KAAK,EAAE,EAC/B,EAAa,IAAI,IAAI,CACzB,EACA,EAAa,QAAQ,EACrB,EAAa,UAAU,EACvB,EAAa,KAAK,CACpB,CAAC,EACD,IAAK,IAAM,KAAa,EACtB,GAAI,GAAa,EAAW,WAAW,CAAS,EAC9C,MAAO,CAAE,QAAS,GAAM,aAAc,EAAU,MAAO,EAK3D,IAAM,EAAY,EAAS,OAAS,EAIpC,OAAO,EAAwB,EAHR,EAAS,KAAK,EAAS,IAC5C,IAAU,EAAY,EAAQ,QAAQ,EAAI,CAED,CAAc,CAC3D,EAKM,EAAmC,GACvC,EAAS,KAAM,GAAY,EAAQ,SAAS,YAAY,CAAC,EAMrD,EAAyB,GACzB,EAAA,cAAc,CAAK,EACd,EAAA,oBAAoB,CAAK,EAAE,KAAK,EAAE,OAAS,EAGhD,EAAA,eAAe,CAAK,GAAK,EAAM,SAAW,QAE1C,EAAA,iBAAiB,EAAe,EAAM,YAAY,OAAO,CAAC,EAAE,UACzD,OAAS,EAIT,GASH,GACJ,EACA,IAC4B,CAC5B,IAAM,EAAyB,EAC7B,EACA,CACF,EACA,GAAI,EAAuB,SAAW,EACpC,OAAO,KAGT,IAAM,EAAe,EACnB,EACA,EACA,EAAsB,CAAU,CAClC,EAEA,OADA,EAAa,KAAK,CAAU,EACrB,CACT,EAiBM,GACJ,EACA,IAC4B,CAC5B,IAAM,EAAc,EAAe,EAAO,OAAO,EACjD,GAAI,CAAC,EACH,OAAO,KAGT,IAAM,EAAgB,EAAyB,EAAU,CAAM,EAC/D,GAAI,EAAc,SAAW,EAC3B,OAAO,KAGT,IAAM,EAAoB,EAAc,KACrC,CAAE,WAAY,EAAM,SAAW,EAClC,EAaA,MALI,CAJmB,EACrB,EACA,CACF,EAAE,SACqB,CAAC,EAAgC,CAAiB,EAChE,KAIF,EACL,EACA,EACA,EAAA,oBAAoB,CAAM,EAAE,KAAK,EAAE,OAAS,CAC9C,CACF,EAMM,GACJ,EACA,IAC4B,CAC5B,GAAI,EAAA,oBAAoB,CAAM,EAAE,KAAK,EAAE,SAAW,EAChD,OAAO,KAGT,IAAM,EAAkB,EAA2B,EAAU,CAAM,EACnE,GAAI,EAAgB,SAAW,EAC7B,OAAO,KAGT,IAAM,EAAiB,IAAI,IAAI,EAAgB,KAAK,CAAE,WAAY,CAAK,CAAC,EAClE,EAAiC,CAAC,EAYxC,OAXA,EAAS,SAAS,EAAO,IAAU,CACjC,GAAI,CAAC,EAAe,IAAI,CAAK,GAAK,CAAC,EAAA,sBAAsB,CAAK,EAAG,CAC/D,EAAa,KAAK,CAAK,EACvB,MACF,CAGI,EAAM,SACR,EAAa,KAAK,CAAE,GAAG,EAAO,kBAAmB,IAAK,CAAC,CAE3D,CAAC,EACM,CACT,EAca,GACX,EACA,IACqB,CACrB,IAAM,EAAc,CAAC,GAAG,CAAQ,EAEhC,GAAI,EAAA,sBAAsB,CAAK,EAAG,CAChC,GAAI,EAAM,UAAY,MAAQ,EAAM,oBAAsB,KACxD,OAAO,EAGT,IAAM,EAAY,EAAY,OAAS,EACjC,EAAY,EAAY,GAW9B,OATE,GACA,EAAA,sBAAsB,CAAS,GAC/B,EAAsB,EAAO,CAAS,GAEtC,EAAY,GAAa,EAAyB,EAAO,CAAS,EAC3D,IAGT,EAAY,KAAK,CAAK,EACf,EACT,CAEA,GACG,EAAA,cAAc,CAAK,GAAK,EAAM,OAAO,OAAS,gBAC9C,EAAA,eAAe,CAAK,GAAK,EAAM,SAAW,QAC3C,CACA,IAAM,EAAoB,EACxB,EACA,CACF,EACA,GAAI,EACF,OAAO,CAEX,CAKA,GACE,EAAA,cAAc,CAAK,GACnB,EAAM,OAAO,OAAS,gBACtB,EAAM,OAAO,OAAS,cACtB,CACA,IAAM,EACJ,EAAmC,EAAO,CAAW,GACrD,EAAqC,EAAO,CAAW,EACzD,GAAI,EAEF,OADA,EAAmB,KAAK,CAAK,EACtB,CAEX,CAEA,GAAI,EAAA,mBAAmB,CAAK,EAAG,CAC7B,IAAM,EAAgB,EAAY,UAC/B,GACC,EAAA,mBAAmB,CAAO,GAC1B,EAAQ,eAAiB,EAAM,YACnC,EAMA,OALI,IAAkB,GAGpB,EAAY,KAAK,CAAK,EAFtB,EAAY,GAAiB,EAIxB,CACT,CAEA,GAAI,EAAA,mBAAmB,CAAK,EAAG,CAU7B,GAPI,EAAM,YAAY,OAAS,oBAO3B,EAAM,YAAY,OAAS,oBAC7B,OAAO,EAIT,IAAM,EAAc,EAAY,UAC7B,GAAY,EAAQ,KAAO,EAAM,SACpC,EACI,IAAgB,GAIlB,EAAY,KAAK,CAAK,EAHtB,EAAY,GAAe,CAK/B,MAEE,EAAY,KAAK,CAAK,EAGxB,OAAO,CACT"}
|
|
@@ -42,7 +42,7 @@ var s = (e, t) => ({
|
|
|
42
42
|
});
|
|
43
43
|
}
|
|
44
44
|
return n;
|
|
45
|
-
}, m = (e) => p(e, (e) => (e.content?.length ?? 0) > 0), h = (e, t) => p(e, (e) => !!e.reasoning_content && c(t, e)), g = (e, t, n) => {
|
|
45
|
+
}, m = (e, t) => p(e, (e) => (e.content?.length ?? 0) > 0 && c(t, e)), h = (e, t) => p(e, (e) => !!e.reasoning_content && c(t, e)), g = (e, t, n) => {
|
|
46
46
|
let r = new Set(t.map(({ index: e }) => e)), a = [];
|
|
47
47
|
return e.forEach((e, t) => {
|
|
48
48
|
if (!r.has(t) || !i(e)) {
|
|
@@ -67,17 +67,19 @@ var s = (e, t) => ({
|
|
|
67
67
|
};
|
|
68
68
|
let i = t.length - 1;
|
|
69
69
|
return d(e, t.map((e, t) => t === i ? e.trimEnd() : e));
|
|
70
|
-
}, v = (e) => t(e) ? a(e).trim().length > 0 : n(e) && e.source === "agent" ? o(u(e.llm_message.content)).reasoning.length > 0 : !1,
|
|
70
|
+
}, v = (e) => e.some((e) => e.includes("<function=")), y = (e) => t(e) ? a(e).trim().length > 0 : n(e) && e.source === "agent" ? o(u(e.llm_message.content)).reasoning.length > 0 : !1, b = (e, t) => {
|
|
71
71
|
let n = f(t, e);
|
|
72
72
|
if (n.length === 0) return null;
|
|
73
|
-
let r = g(t, n,
|
|
73
|
+
let r = g(t, n, y(e));
|
|
74
74
|
return r.push(e), r;
|
|
75
|
-
},
|
|
75
|
+
}, x = (e, t) => {
|
|
76
76
|
let n = u(e.thought);
|
|
77
77
|
if (!n) return null;
|
|
78
|
-
let r = m(t);
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
let r = m(t, e);
|
|
79
|
+
if (r.length === 0) return null;
|
|
80
|
+
let i = r.map(({ event: e }) => e.content ?? "");
|
|
81
|
+
return !_(n, i).matched && !v(i) ? null : g(t, r, a(e).trim().length > 0);
|
|
82
|
+
}, S = (e, t) => {
|
|
81
83
|
if (a(e).trim().length === 0) return null;
|
|
82
84
|
let n = h(t, e);
|
|
83
85
|
if (n.length === 0) return null;
|
|
@@ -92,7 +94,7 @@ var s = (e, t) => ({
|
|
|
92
94
|
reasoning_content: null
|
|
93
95
|
});
|
|
94
96
|
}), o;
|
|
95
|
-
},
|
|
97
|
+
}, C = (a, o) => {
|
|
96
98
|
let l = [...o];
|
|
97
99
|
if (i(a)) {
|
|
98
100
|
if (a.content === null && a.reasoning_content === null) return l;
|
|
@@ -100,11 +102,11 @@ var s = (e, t) => ({
|
|
|
100
102
|
return t && i(t) && c(a, t) ? (l[e] = s(a, t), l) : (l.push(a), l);
|
|
101
103
|
}
|
|
102
104
|
if (t(a) && a.action.kind === "FinishAction" || n(a) && a.source === "agent") {
|
|
103
|
-
let e =
|
|
105
|
+
let e = b(a, l);
|
|
104
106
|
if (e) return e;
|
|
105
107
|
}
|
|
106
108
|
if (t(a) && a.action.kind !== "FinishAction" && a.action.kind !== "ThinkAction") {
|
|
107
|
-
let e =
|
|
109
|
+
let e = x(a, l) ?? S(a, l);
|
|
108
110
|
if (e) return e.push(a), e;
|
|
109
111
|
}
|
|
110
112
|
if (e(a)) {
|
|
@@ -119,6 +121,6 @@ var s = (e, t) => ({
|
|
|
119
121
|
return l;
|
|
120
122
|
};
|
|
121
123
|
//#endregion
|
|
122
|
-
export {
|
|
124
|
+
export { C as handleEventForUI, c as isSameStreamingSender, s as mergeStreamingDeltaEvent };
|
|
123
125
|
|
|
124
126
|
//# sourceMappingURL=handle-event-for-ui.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle-event-for-ui.js","names":[],"sources":["../../src/utils/handle-event-for-ui.ts"],"sourcesContent":["import {\n ActionEvent,\n ImageContent,\n OpenHandsEvent,\n TextContent,\n} from \"#/types/agent-server/core\";\nimport {\n isACPToolCallEvent,\n isActionEvent,\n isMessageEvent,\n isObservationEvent,\n isStreamingDeltaEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { StreamingDeltaEvent } from \"#/types/agent-server/core/events/streaming-delta-event\";\nimport {\n getReasoningContent,\n splitInlineThink,\n} from \"#/components/conversation-events/chat/event-thought-helpers\";\n\nexport const mergeStreamingDeltaEvent = (\n incoming: StreamingDeltaEvent,\n existing: StreamingDeltaEvent,\n): StreamingDeltaEvent => ({\n ...existing,\n content: `${existing.content ?? \"\"}${incoming.content ?? \"\"}` || null,\n reasoning_content:\n `${existing.reasoning_content ?? \"\"}${incoming.reasoning_content ?? \"\"}` ||\n null,\n});\n\n// Deltas only merge into one bubble when they share a sender; the planning flag\n// is the only discriminator (every delta has `source: \"agent\"`). Prevents a\n// planning-agent delta concatenating onto a main-agent one, misattributed (#1656).\nexport const isSameStreamingSender = (\n a: OpenHandsEvent & { isFromPlanningAgent?: boolean },\n b: OpenHandsEvent & { isFromPlanningAgent?: boolean },\n): boolean => Boolean(a.isFromPlanningAgent) === Boolean(b.isFromPlanningAgent);\n\nconst findLastUserMessageIndex = (events: OpenHandsEvent[]): number => {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (isMessageEvent(event) && event.source === \"user\") {\n return index;\n }\n }\n return -1;\n};\n\n// Join text blocks WITHOUT a separator: streaming deltas concatenate content\n// tokens directly with no separator between LLM content blocks, so using \"\\n\"\n// here would cause startsWith/findTextSegmentsInOrder to miss when reconciling\n// a multi-block message/thought against the already-rendered streaming delta.\nconst joinTextBlocks = (blocks: (TextContent | ImageContent)[]): string =>\n blocks\n .filter((block) => block.type === \"text\")\n .map((block) => block.text)\n .join(\"\");\n\nconst findTextSegmentsInOrder = (\n text: string,\n segments: string[],\n): { matched: boolean; lastMatchEnd: number } => {\n let searchStart = 0;\n let lastMatchEnd = 0;\n\n for (const segment of segments) {\n const index = text.indexOf(segment, searchStart);\n if (index === -1) {\n return { matched: false, lastMatchEnd };\n }\n lastMatchEnd = index + segment.length;\n searchStart = lastMatchEnd;\n }\n\n return { matched: true, lastMatchEnd };\n};\n\n// Content-bearing streaming deltas of the current turn (after the last user\n// message) that share the final event's sender. Reasoning-only deltas are\n// excluded: reasoning renders in its own collapsed bubble and never overlaps\n// the message text being reconciled. Sender scoping matters because the main\n// and planning sockets share this event store — without it, one agent's final\n// event would strip the other agent's still-live streamed deltas (#1656).\nconst getCurrentTurnContentDeltas = (\n uiEvents: OpenHandsEvent[],\n finalEvent: OpenHandsEvent,\n): { event: StreamingDeltaEvent; index: number }[] => {\n const lastUserMessageIndex = findLastUserMessageIndex(uiEvents);\n return uiEvents\n .map((event, index) => ({ event, index }))\n .filter(\n (item): item is { event: StreamingDeltaEvent; index: number } =>\n item.index > lastUserMessageIndex &&\n isStreamingDeltaEvent(item.event) &&\n (item.event.content?.length ?? 0) > 0 &&\n isSameStreamingSender(finalEvent, item.event),\n );\n};\n\n// The current step's streaming delta(s): the trailing run at the end of\n// `uiEvents`. Earlier steps' deltas are separated by their observations, so\n// this never folds an earlier step's delta into the current one.\nconst getTrailingDeltas = (\n uiEvents: OpenHandsEvent[],\n selects: (event: StreamingDeltaEvent) => boolean,\n): { event: StreamingDeltaEvent; index: number }[] => {\n const deltas: { event: StreamingDeltaEvent; index: number }[] = [];\n for (let index = uiEvents.length - 1; index >= 0; index -= 1) {\n const event = uiEvents[index];\n if (!isStreamingDeltaEvent(event)) {\n break;\n }\n if (selects(event)) {\n deltas.unshift({ event, index });\n }\n }\n return deltas;\n};\n\nconst getTrailingContentDeltas = (uiEvents: OpenHandsEvent[]) =>\n getTrailingDeltas(uiEvents, (event) => (event.content?.length ?? 0) > 0);\n\n// Sender-scoped: the main and planning sockets share this event store, so a\n// main-agent action must not strip the planning agent's live reasoning (#1656).\nconst getTrailingReasoningDeltas = (\n uiEvents: OpenHandsEvent[],\n finalEvent: OpenHandsEvent,\n) =>\n getTrailingDeltas(\n uiEvents,\n (event) =>\n Boolean(event.reasoning_content) &&\n isSameStreamingSender(finalEvent, event),\n );\n\n// Strip the streamed content deltas, keeping a delta only when it carries\n// reasoning the replacement itself won't render (many models stream reasoning\n// solely through the delta). Shared by the finalize and intermediate-action\n// reconciliation paths.\nconst supersedeStreamingContent = (\n uiEvents: OpenHandsEvent[],\n contentDeltas: { event: StreamingDeltaEvent; index: number }[],\n replacementRendersReasoning: boolean,\n): OpenHandsEvent[] => {\n const indexesToStrip = new Set(contentDeltas.map(({ index }) => index));\n const nextUiEvents: OpenHandsEvent[] = [];\n uiEvents.forEach((event, index) => {\n if (!indexesToStrip.has(index) || !isStreamingDeltaEvent(event)) {\n nextUiEvents.push(event);\n return;\n }\n\n // Keep the delta only to render reasoning the replacement itself lacks.\n if (!replacementRendersReasoning && event.reasoning_content) {\n nextUiEvents.push({ ...event, content: null });\n }\n });\n return nextUiEvents;\n};\n\n// Whether the streamed `segments` (in order) reconcile against `targetText`.\n// `lastMatchEnd` is the offset past the matched text, so callers can recover\n// any not-yet-streamed suffix. The SDK strips the finalized text, so tolerate\n// leading and trailing whitespace that appeared only in the stream.\nconst matchStreamedSegments = (\n targetText: string,\n segments: string[],\n): { matched: boolean; lastMatchEnd: number } => {\n const streamedText = segments.join(\"\");\n const candidates = new Set([\n streamedText,\n streamedText.trimEnd(),\n streamedText.trimStart(),\n streamedText.trim(),\n ]);\n for (const candidate of candidates) {\n if (candidate && targetText.startsWith(candidate)) {\n return { matched: true, lastMatchEnd: candidate.length };\n }\n }\n // Segments may be interleaved with not-yet-streamed text; locate them in\n // order, trimming the last segment's trailing whitespace.\n const lastIndex = segments.length - 1;\n const searchSegments = segments.map((segment, index) =>\n index === lastIndex ? segment.trimEnd() : segment,\n );\n return findTextSegmentsInOrder(targetText, searchSegments);\n};\n\n// Whether the finalized event renders its own reasoning: an ActionEvent via\n// reasoning_content/thinking_blocks, an agent MessageEvent via an inline\n// <think> block in its content. Decides if a replaced delta's reasoning must\n// be preserved separately.\nconst eventRendersReasoning = (event: OpenHandsEvent): boolean => {\n if (isActionEvent(event)) {\n return getReasoningContent(event).trim().length > 0;\n }\n\n if (isMessageEvent(event) && event.source === \"agent\") {\n return (\n splitInlineThink(joinTextBlocks(event.llm_message.content)).reasoning\n .length > 0\n );\n }\n\n return false;\n};\n\n// The final MessageEvent/FinishAction is authoritative for the turn's text. Drop\n// the provisional streamed deltas and render the canonical final event instead,\n// so the message is rendered exactly once (never holey or duplicated) and its\n// metadata — critic_result, activated_microagents — renders too. Stream-only\n// reasoning is preserved. Returns null when there is no streamed content to\n// reconcile, leaving the caller to append the final event normally.\nconst finalizeStreamingDeltasInPlace = (\n finalEvent: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n const contentStreamingDeltas = getCurrentTurnContentDeltas(\n uiEvents,\n finalEvent,\n );\n if (contentStreamingDeltas.length === 0) {\n return null;\n }\n\n const nextUiEvents = supersedeStreamingContent(\n uiEvents,\n contentStreamingDeltas,\n eventRendersReasoning(finalEvent),\n );\n nextUiEvents.push(finalEvent);\n return nextUiEvents;\n};\n\n/**\n * Reconcile the current turn's streaming delta when an intermediate\n * (tool-calling) `ActionEvent` arrives. With `stream=true` the step's\n * pre-tool-call text is streamed as delta `content`, then the action's\n * `thought` repeats it and the chat hoists that into its own message (see\n * `group-events.ts`), so the text would render twice (issue #1534).\n *\n * The action must stay because it owns the tool call. The streamed text is\n * cleared from the delta, and the delta is kept only to carry reasoning the\n * action itself lacks (for many models the delta is the sole reasoning\n * carrier), otherwise dropped.\n *\n * Only the current step's trailing delta run is considered. Returns the updated\n * array, or `null` when there is nothing to reconcile.\n */\nconst supersedeStreamedThoughtWithAction = (\n action: ActionEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n const thoughtText = joinTextBlocks(action.thought);\n if (!thoughtText) {\n return null;\n }\n\n const contentDeltas = getTrailingContentDeltas(uiEvents);\n if (contentDeltas.length === 0) {\n return null;\n }\n\n const streamingSegments = contentDeltas.map(\n ({ event }) => event.content ?? \"\",\n );\n\n // Only strip when the streamed text is the action's rendered thought.\n if (!matchStreamedSegments(thoughtText, streamingSegments).matched) {\n return null;\n }\n\n // Keeping the delta's reasoning would duplicate the action's own \"Thinking\".\n return supersedeStreamingContent(\n uiEvents,\n contentDeltas,\n getReasoningContent(action).trim().length > 0,\n );\n};\n\n// Drop the current step's streamed reasoning when the action renders that\n// reasoning itself, so \"Thinking\" renders once. Unlike\n// `supersedeStreamedThoughtWithAction` this does not require the streamed text\n// to match the thought, which models streaming reasoning-only deltas never do.\nconst supersedeStreamedReasoningWithAction = (\n action: ActionEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n if (getReasoningContent(action).trim().length === 0) {\n return null;\n }\n\n const reasoningDeltas = getTrailingReasoningDeltas(uiEvents, action);\n if (reasoningDeltas.length === 0) {\n return null;\n }\n\n const indexesToStrip = new Set(reasoningDeltas.map(({ index }) => index));\n const nextUiEvents: OpenHandsEvent[] = [];\n uiEvents.forEach((event, index) => {\n if (!indexesToStrip.has(index) || !isStreamingDeltaEvent(event)) {\n nextUiEvents.push(event);\n return;\n }\n\n // Keep the delta only for streamed text the action itself lacks.\n if (event.content) {\n nextUiEvents.push({ ...event, reasoning_content: null });\n }\n });\n return nextUiEvents;\n};\n\n/**\n * Handles adding an event to the UI events array\n * Replaces actions with observations when they arrive (so UI shows observation instead of action)\n * Exception: ThinkAction is NOT replaced because the thought content is in the action, not in the observation\n *\n * ACPToolCallEvent merge: the SDK emits two events per ``tool_call_id`` — an\n * early ``started`` event (``pending`` / ``in_progress``) and one terminal\n * (completed / failed) event, the action->observation pair for a tool call.\n * Replace the started entry in place with the terminal one so a single card\n * updates from running to its result, exactly like an observation superseding\n * its action below.\n */\nexport const handleEventForUI = (\n event: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] => {\n const newUiEvents = [...uiEvents];\n\n if (isStreamingDeltaEvent(event)) {\n if (event.content === null && event.reasoning_content === null) {\n return newUiEvents;\n }\n\n const lastIndex = newUiEvents.length - 1;\n const lastEvent = newUiEvents[lastIndex];\n if (\n lastEvent &&\n isStreamingDeltaEvent(lastEvent) &&\n isSameStreamingSender(event, lastEvent)\n ) {\n newUiEvents[lastIndex] = mergeStreamingDeltaEvent(event, lastEvent);\n return newUiEvents;\n }\n\n newUiEvents.push(event);\n return newUiEvents;\n }\n\n if (\n (isActionEvent(event) && event.action.kind === \"FinishAction\") ||\n (isMessageEvent(event) && event.source === \"agent\")\n ) {\n const finalizedUiEvents = finalizeStreamingDeltasInPlace(\n event,\n newUiEvents,\n );\n if (finalizedUiEvents) {\n return finalizedUiEvents;\n }\n }\n\n // Intermediate tool-calling action whose thought was streamed: clear the\n // duplicated text from the delta (issue #1534). ThinkAction is excluded — its\n // thought renders through its own collapsible, not a hoisted thought.\n if (\n isActionEvent(event) &&\n event.action.kind !== \"FinishAction\" &&\n event.action.kind !== \"ThinkAction\"\n ) {\n const reconciledUiEvents =\n supersedeStreamedThoughtWithAction(event, newUiEvents) ??\n supersedeStreamedReasoningWithAction(event, newUiEvents);\n if (reconciledUiEvents) {\n reconciledUiEvents.push(event);\n return reconciledUiEvents;\n }\n }\n\n if (isACPToolCallEvent(event)) {\n const existingIndex = newUiEvents.findIndex(\n (uiEvent) =>\n isACPToolCallEvent(uiEvent) &&\n uiEvent.tool_call_id === event.tool_call_id,\n );\n if (existingIndex !== -1) {\n newUiEvents[existingIndex] = event;\n } else {\n newUiEvents.push(event);\n }\n return newUiEvents;\n }\n\n if (isObservationEvent(event)) {\n // Don't add ThinkObservation at all - we keep the ThinkAction instead\n // The thought content is in the action, not the observation\n if (event.observation.kind === \"ThinkObservation\") {\n return newUiEvents;\n }\n\n // Don't add FinishObservation at all - we keep the FinishAction instead\n // Both contain the same message content, so we only need to display one\n // This also prevents duplicate messages when events arrive out of order due to React batching\n if (event.observation.kind === \"FinishObservation\") {\n return newUiEvents;\n }\n\n // Find and replace the corresponding action from uiEvents\n const actionIndex = newUiEvents.findIndex(\n (uiEvent) => uiEvent.id === event.action_id,\n );\n if (actionIndex !== -1) {\n newUiEvents[actionIndex] = event;\n } else {\n // Action not found in uiEvents, just add the observation\n newUiEvents.push(event);\n }\n } else {\n // For non-observation events, just add them to uiEvents\n newUiEvents.push(event);\n }\n\n return newUiEvents;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"handle-event-for-ui.js","names":[],"sources":["../../src/utils/handle-event-for-ui.ts"],"sourcesContent":["import {\n ActionEvent,\n ImageContent,\n OpenHandsEvent,\n TextContent,\n} from \"#/types/agent-server/core\";\nimport {\n isACPToolCallEvent,\n isActionEvent,\n isMessageEvent,\n isObservationEvent,\n isStreamingDeltaEvent,\n} from \"#/types/agent-server/type-guards\";\nimport { StreamingDeltaEvent } from \"#/types/agent-server/core/events/streaming-delta-event\";\nimport {\n getReasoningContent,\n splitInlineThink,\n} from \"#/components/conversation-events/chat/event-thought-helpers\";\n\nexport const mergeStreamingDeltaEvent = (\n incoming: StreamingDeltaEvent,\n existing: StreamingDeltaEvent,\n): StreamingDeltaEvent => ({\n ...existing,\n content: `${existing.content ?? \"\"}${incoming.content ?? \"\"}` || null,\n reasoning_content:\n `${existing.reasoning_content ?? \"\"}${incoming.reasoning_content ?? \"\"}` ||\n null,\n});\n\n// Deltas only merge into one bubble when they share a sender; the planning flag\n// is the only discriminator (every delta has `source: \"agent\"`). Prevents a\n// planning-agent delta concatenating onto a main-agent one, misattributed (#1656).\nexport const isSameStreamingSender = (\n a: OpenHandsEvent & { isFromPlanningAgent?: boolean },\n b: OpenHandsEvent & { isFromPlanningAgent?: boolean },\n): boolean => Boolean(a.isFromPlanningAgent) === Boolean(b.isFromPlanningAgent);\n\nconst findLastUserMessageIndex = (events: OpenHandsEvent[]): number => {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index];\n if (isMessageEvent(event) && event.source === \"user\") {\n return index;\n }\n }\n return -1;\n};\n\n// Join text blocks WITHOUT a separator: streaming deltas concatenate content\n// tokens directly with no separator between LLM content blocks, so using \"\\n\"\n// here would cause startsWith/findTextSegmentsInOrder to miss when reconciling\n// a multi-block message/thought against the already-rendered streaming delta.\nconst joinTextBlocks = (blocks: (TextContent | ImageContent)[]): string =>\n blocks\n .filter((block) => block.type === \"text\")\n .map((block) => block.text)\n .join(\"\");\n\nconst findTextSegmentsInOrder = (\n text: string,\n segments: string[],\n): { matched: boolean; lastMatchEnd: number } => {\n let searchStart = 0;\n let lastMatchEnd = 0;\n\n for (const segment of segments) {\n const index = text.indexOf(segment, searchStart);\n if (index === -1) {\n return { matched: false, lastMatchEnd };\n }\n lastMatchEnd = index + segment.length;\n searchStart = lastMatchEnd;\n }\n\n return { matched: true, lastMatchEnd };\n};\n\n// Content-bearing streaming deltas of the current turn (after the last user\n// message) that share the final event's sender. Reasoning-only deltas are\n// excluded: reasoning renders in its own collapsed bubble and never overlaps\n// the message text being reconciled. Sender scoping matters because the main\n// and planning sockets share this event store — without it, one agent's final\n// event would strip the other agent's still-live streamed deltas (#1656).\nconst getCurrentTurnContentDeltas = (\n uiEvents: OpenHandsEvent[],\n finalEvent: OpenHandsEvent,\n): { event: StreamingDeltaEvent; index: number }[] => {\n const lastUserMessageIndex = findLastUserMessageIndex(uiEvents);\n return uiEvents\n .map((event, index) => ({ event, index }))\n .filter(\n (item): item is { event: StreamingDeltaEvent; index: number } =>\n item.index > lastUserMessageIndex &&\n isStreamingDeltaEvent(item.event) &&\n (item.event.content?.length ?? 0) > 0 &&\n isSameStreamingSender(finalEvent, item.event),\n );\n};\n\n// The current step's streaming delta(s): the trailing run at the end of\n// `uiEvents`. Earlier steps' deltas are separated by their observations, so\n// this never folds an earlier step's delta into the current one.\nconst getTrailingDeltas = (\n uiEvents: OpenHandsEvent[],\n selects: (event: StreamingDeltaEvent) => boolean,\n): { event: StreamingDeltaEvent; index: number }[] => {\n const deltas: { event: StreamingDeltaEvent; index: number }[] = [];\n for (let index = uiEvents.length - 1; index >= 0; index -= 1) {\n const event = uiEvents[index];\n if (!isStreamingDeltaEvent(event)) {\n break;\n }\n if (selects(event)) {\n deltas.unshift({ event, index });\n }\n }\n return deltas;\n};\n\n// Sender-scoped for the same reason as `getTrailingReasoningDeltas` (#1656):\n// a main-agent action must not strip the planning agent's live content.\nconst getTrailingContentDeltas = (\n uiEvents: OpenHandsEvent[],\n finalEvent: OpenHandsEvent,\n) =>\n getTrailingDeltas(\n uiEvents,\n (event) =>\n (event.content?.length ?? 0) > 0 &&\n isSameStreamingSender(finalEvent, event),\n );\n\n// Sender-scoped: the main and planning sockets share this event store, so a\n// main-agent action must not strip the planning agent's live reasoning (#1656).\nconst getTrailingReasoningDeltas = (\n uiEvents: OpenHandsEvent[],\n finalEvent: OpenHandsEvent,\n) =>\n getTrailingDeltas(\n uiEvents,\n (event) =>\n Boolean(event.reasoning_content) &&\n isSameStreamingSender(finalEvent, event),\n );\n\n// Strip the streamed content deltas, keeping a delta only when it carries\n// reasoning the replacement itself won't render (many models stream reasoning\n// solely through the delta). Shared by the finalize and intermediate-action\n// reconciliation paths.\nconst supersedeStreamingContent = (\n uiEvents: OpenHandsEvent[],\n contentDeltas: { event: StreamingDeltaEvent; index: number }[],\n replacementRendersReasoning: boolean,\n): OpenHandsEvent[] => {\n const indexesToStrip = new Set(contentDeltas.map(({ index }) => index));\n const nextUiEvents: OpenHandsEvent[] = [];\n uiEvents.forEach((event, index) => {\n if (!indexesToStrip.has(index) || !isStreamingDeltaEvent(event)) {\n nextUiEvents.push(event);\n return;\n }\n\n // Keep the delta only to render reasoning the replacement itself lacks.\n if (!replacementRendersReasoning && event.reasoning_content) {\n nextUiEvents.push({ ...event, content: null });\n }\n });\n return nextUiEvents;\n};\n\n// Whether the streamed `segments` (in order) reconcile against `targetText`.\n// `lastMatchEnd` is the offset past the matched text, so callers can recover\n// any not-yet-streamed suffix. The SDK strips the finalized text, so tolerate\n// leading and trailing whitespace that appeared only in the stream.\nconst matchStreamedSegments = (\n targetText: string,\n segments: string[],\n): { matched: boolean; lastMatchEnd: number } => {\n const streamedText = segments.join(\"\");\n const candidates = new Set([\n streamedText,\n streamedText.trimEnd(),\n streamedText.trimStart(),\n streamedText.trim(),\n ]);\n for (const candidate of candidates) {\n if (candidate && targetText.startsWith(candidate)) {\n return { matched: true, lastMatchEnd: candidate.length };\n }\n }\n // Segments may be interleaved with not-yet-streamed text; locate them in\n // order, trimming the last segment's trailing whitespace.\n const lastIndex = segments.length - 1;\n const searchSegments = segments.map((segment, index) =>\n index === lastIndex ? segment.trimEnd() : segment,\n );\n return findTextSegmentsInOrder(targetText, searchSegments);\n};\n\n// A `<function=` marker means the delta still holds the raw prompted-tool-call\n// XML the SDK strips only after the response completes, so the streamed text is\n// a superset of the action's `thought` that `matchStreamedSegments` can't match.\nconst hasUnstrippedFunctionCallMarker = (segments: string[]): boolean =>\n segments.some((segment) => segment.includes(\"<function=\"));\n\n// Whether the finalized event renders its own reasoning: an ActionEvent via\n// reasoning_content/thinking_blocks, an agent MessageEvent via an inline\n// <think> block in its content. Decides if a replaced delta's reasoning must\n// be preserved separately.\nconst eventRendersReasoning = (event: OpenHandsEvent): boolean => {\n if (isActionEvent(event)) {\n return getReasoningContent(event).trim().length > 0;\n }\n\n if (isMessageEvent(event) && event.source === \"agent\") {\n return (\n splitInlineThink(joinTextBlocks(event.llm_message.content)).reasoning\n .length > 0\n );\n }\n\n return false;\n};\n\n// The final MessageEvent/FinishAction is authoritative for the turn's text. Drop\n// the provisional streamed deltas and render the canonical final event instead,\n// so the message is rendered exactly once (never holey or duplicated) and its\n// metadata — critic_result, activated_skills — renders too. Stream-only\n// reasoning is preserved. Returns null when there is no streamed content to\n// reconcile, leaving the caller to append the final event normally.\nconst finalizeStreamingDeltasInPlace = (\n finalEvent: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n const contentStreamingDeltas = getCurrentTurnContentDeltas(\n uiEvents,\n finalEvent,\n );\n if (contentStreamingDeltas.length === 0) {\n return null;\n }\n\n const nextUiEvents = supersedeStreamingContent(\n uiEvents,\n contentStreamingDeltas,\n eventRendersReasoning(finalEvent),\n );\n nextUiEvents.push(finalEvent);\n return nextUiEvents;\n};\n\n/**\n * Reconcile the current turn's streaming delta when an intermediate\n * (tool-calling) `ActionEvent` arrives. With `stream=true` the step's\n * pre-tool-call text is streamed as delta `content`, then the action's\n * `thought` repeats it and the chat hoists that into its own message (see\n * `group-events.ts`), so the text would render twice (issue #1534).\n *\n * The action must stay because it owns the tool call. The streamed text is\n * cleared from the delta, and the delta is kept only to carry reasoning the\n * action itself lacks (for many models the delta is the sole reasoning\n * carrier), otherwise dropped.\n *\n * Only the current step's trailing delta run is considered. Returns the updated\n * array, or `null` when there is nothing to reconcile.\n */\nconst supersedeStreamedThoughtWithAction = (\n action: ActionEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n const thoughtText = joinTextBlocks(action.thought);\n if (!thoughtText) {\n return null;\n }\n\n const contentDeltas = getTrailingContentDeltas(uiEvents, action);\n if (contentDeltas.length === 0) {\n return null;\n }\n\n const streamingSegments = contentDeltas.map(\n ({ event }) => event.content ?? \"\",\n );\n\n // Strip on a thought match, or on an unstripped `<function=...>` marker whose\n // streamed text is a superset of `thought` that the match can't reconcile.\n const matchedThought = matchStreamedSegments(\n thoughtText,\n streamingSegments,\n ).matched;\n if (!matchedThought && !hasUnstrippedFunctionCallMarker(streamingSegments)) {\n return null;\n }\n\n // Keeping the delta's reasoning would duplicate the action's own \"Thinking\".\n return supersedeStreamingContent(\n uiEvents,\n contentDeltas,\n getReasoningContent(action).trim().length > 0,\n );\n};\n\n// Drop the current step's streamed reasoning when the action renders that\n// reasoning itself, so \"Thinking\" renders once. Unlike\n// `supersedeStreamedThoughtWithAction` this does not require the streamed text\n// to match the thought, which models streaming reasoning-only deltas never do.\nconst supersedeStreamedReasoningWithAction = (\n action: ActionEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] | null => {\n if (getReasoningContent(action).trim().length === 0) {\n return null;\n }\n\n const reasoningDeltas = getTrailingReasoningDeltas(uiEvents, action);\n if (reasoningDeltas.length === 0) {\n return null;\n }\n\n const indexesToStrip = new Set(reasoningDeltas.map(({ index }) => index));\n const nextUiEvents: OpenHandsEvent[] = [];\n uiEvents.forEach((event, index) => {\n if (!indexesToStrip.has(index) || !isStreamingDeltaEvent(event)) {\n nextUiEvents.push(event);\n return;\n }\n\n // Keep the delta only for streamed text the action itself lacks.\n if (event.content) {\n nextUiEvents.push({ ...event, reasoning_content: null });\n }\n });\n return nextUiEvents;\n};\n\n/**\n * Handles adding an event to the UI events array\n * Replaces actions with observations when they arrive (so UI shows observation instead of action)\n * Exception: ThinkAction is NOT replaced because the thought content is in the action, not in the observation\n *\n * ACPToolCallEvent merge: the SDK emits two events per ``tool_call_id`` — an\n * early ``started`` event (``pending`` / ``in_progress``) and one terminal\n * (completed / failed) event, the action->observation pair for a tool call.\n * Replace the started entry in place with the terminal one so a single card\n * updates from running to its result, exactly like an observation superseding\n * its action below.\n */\nexport const handleEventForUI = (\n event: OpenHandsEvent,\n uiEvents: OpenHandsEvent[],\n): OpenHandsEvent[] => {\n const newUiEvents = [...uiEvents];\n\n if (isStreamingDeltaEvent(event)) {\n if (event.content === null && event.reasoning_content === null) {\n return newUiEvents;\n }\n\n const lastIndex = newUiEvents.length - 1;\n const lastEvent = newUiEvents[lastIndex];\n if (\n lastEvent &&\n isStreamingDeltaEvent(lastEvent) &&\n isSameStreamingSender(event, lastEvent)\n ) {\n newUiEvents[lastIndex] = mergeStreamingDeltaEvent(event, lastEvent);\n return newUiEvents;\n }\n\n newUiEvents.push(event);\n return newUiEvents;\n }\n\n if (\n (isActionEvent(event) && event.action.kind === \"FinishAction\") ||\n (isMessageEvent(event) && event.source === \"agent\")\n ) {\n const finalizedUiEvents = finalizeStreamingDeltasInPlace(\n event,\n newUiEvents,\n );\n if (finalizedUiEvents) {\n return finalizedUiEvents;\n }\n }\n\n // Intermediate tool-calling action whose thought was streamed: clear the\n // duplicated text from the delta (issue #1534). ThinkAction is excluded — its\n // thought renders through its own collapsible, not a hoisted thought.\n if (\n isActionEvent(event) &&\n event.action.kind !== \"FinishAction\" &&\n event.action.kind !== \"ThinkAction\"\n ) {\n const reconciledUiEvents =\n supersedeStreamedThoughtWithAction(event, newUiEvents) ??\n supersedeStreamedReasoningWithAction(event, newUiEvents);\n if (reconciledUiEvents) {\n reconciledUiEvents.push(event);\n return reconciledUiEvents;\n }\n }\n\n if (isACPToolCallEvent(event)) {\n const existingIndex = newUiEvents.findIndex(\n (uiEvent) =>\n isACPToolCallEvent(uiEvent) &&\n uiEvent.tool_call_id === event.tool_call_id,\n );\n if (existingIndex !== -1) {\n newUiEvents[existingIndex] = event;\n } else {\n newUiEvents.push(event);\n }\n return newUiEvents;\n }\n\n if (isObservationEvent(event)) {\n // Don't add ThinkObservation at all - we keep the ThinkAction instead\n // The thought content is in the action, not the observation\n if (event.observation.kind === \"ThinkObservation\") {\n return newUiEvents;\n }\n\n // Don't add FinishObservation at all - we keep the FinishAction instead\n // Both contain the same message content, so we only need to display one\n // This also prevents duplicate messages when events arrive out of order due to React batching\n if (event.observation.kind === \"FinishObservation\") {\n return newUiEvents;\n }\n\n // Find and replace the corresponding action from uiEvents\n const actionIndex = newUiEvents.findIndex(\n (uiEvent) => uiEvent.id === event.action_id,\n );\n if (actionIndex !== -1) {\n newUiEvents[actionIndex] = event;\n } else {\n // Action not found in uiEvents, just add the observation\n newUiEvents.push(event);\n }\n } else {\n // For non-observation events, just add them to uiEvents\n newUiEvents.push(event);\n }\n\n return newUiEvents;\n};\n"],"mappings":";;;AAmBA,IAAa,KACX,GACA,OACyB;CACzB,GAAG;CACH,SAAS,GAAG,EAAS,WAAW,KAAK,EAAS,WAAW,QAAQ;CACjE,mBACE,GAAG,EAAS,qBAAqB,KAAK,EAAS,qBAAqB,QACpE;AACJ,IAKa,KACX,GACA,MACY,EAAQ,EAAE,uBAAyB,EAAQ,EAAE,qBAErD,KAA4B,MAAqC;CACrE,KAAK,IAAI,IAAQ,EAAO,SAAS,GAAG,KAAS,GAAG,KAAY;EAC1D,IAAM,IAAQ,EAAO;EACrB,IAAI,EAAe,CAAK,KAAK,EAAM,WAAW,QAC5C,OAAO;CAEX;CACA,OAAO;AACT,GAMM,KAAkB,MACtB,EACG,QAAQ,MAAU,EAAM,SAAS,MAAM,EACvC,KAAK,MAAU,EAAM,IAAI,EACzB,KAAK,EAAE,GAEN,KACJ,GACA,MAC+C;CAC/C,IAAI,IAAc,GACd,IAAe;CAEnB,KAAK,IAAM,KAAW,GAAU;EAC9B,IAAM,IAAQ,EAAK,QAAQ,GAAS,CAAW;EAC/C,IAAI,MAAU,IACZ,OAAO;GAAE,SAAS;GAAO;EAAa;EAGxC,AADA,IAAe,IAAQ,EAAQ,QAC/B,IAAc;CAChB;CAEA,OAAO;EAAE,SAAS;EAAM;CAAa;AACvC,GAQM,KACJ,GACA,MACoD;CACpD,IAAM,IAAuB,EAAyB,CAAQ;CAC9D,OAAO,EACJ,KAAK,GAAO,OAAW;EAAE;EAAO;CAAM,EAAE,EACxC,QACE,MACC,EAAK,QAAQ,KACb,EAAsB,EAAK,KAAK,MAC/B,EAAK,MAAM,SAAS,UAAU,KAAK,KACpC,EAAsB,GAAY,EAAK,KAAK,CAChD;AACJ,GAKM,KACJ,GACA,MACoD;CACpD,IAAM,IAA0D,CAAC;CACjE,KAAK,IAAI,IAAQ,EAAS,SAAS,GAAG,KAAS,GAAG,KAAY;EAC5D,IAAM,IAAQ,EAAS;EACvB,IAAI,CAAC,EAAsB,CAAK,GAC9B;EAEF,AAAI,EAAQ,CAAK,KACf,EAAO,QAAQ;GAAE;GAAO;EAAM,CAAC;CAEnC;CACA,OAAO;AACT,GAIM,KACJ,GACA,MAEA,EACE,IACC,OACE,EAAM,SAAS,UAAU,KAAK,KAC/B,EAAsB,GAAY,CAAK,CAC3C,GAII,KACJ,GACA,MAEA,EACE,IACC,MACC,EAAQ,EAAM,qBACd,EAAsB,GAAY,CAAK,CAC3C,GAMI,KACJ,GACA,GACA,MACqB;CACrB,IAAM,IAAiB,IAAI,IAAI,EAAc,KAAK,EAAE,eAAY,CAAK,CAAC,GAChE,IAAiC,CAAC;CAYxC,OAXA,EAAS,SAAS,GAAO,MAAU;EACjC,IAAI,CAAC,EAAe,IAAI,CAAK,KAAK,CAAC,EAAsB,CAAK,GAAG;GAC/D,EAAa,KAAK,CAAK;GACvB;EACF;EAGA,AAAI,CAAC,KAA+B,EAAM,qBACxC,EAAa,KAAK;GAAE,GAAG;GAAO,SAAS;EAAK,CAAC;CAEjD,CAAC,GACM;AACT,GAMM,KACJ,GACA,MAC+C;CAC/C,IAAM,IAAe,EAAS,KAAK,EAAE,GAC/B,IAAa,IAAI,IAAI;EACzB;EACA,EAAa,QAAQ;EACrB,EAAa,UAAU;EACvB,EAAa,KAAK;CACpB,CAAC;CACD,KAAK,IAAM,KAAa,GACtB,IAAI,KAAa,EAAW,WAAW,CAAS,GAC9C,OAAO;EAAE,SAAS;EAAM,cAAc,EAAU;CAAO;CAK3D,IAAM,IAAY,EAAS,SAAS;CAIpC,OAAO,EAAwB,GAHR,EAAS,KAAK,GAAS,MAC5C,MAAU,IAAY,EAAQ,QAAQ,IAAI,CAED,CAAc;AAC3D,GAKM,KAAmC,MACvC,EAAS,MAAM,MAAY,EAAQ,SAAS,YAAY,CAAC,GAMrD,KAAyB,MACzB,EAAc,CAAK,IACd,EAAoB,CAAK,EAAE,KAAK,EAAE,SAAS,IAGhD,EAAe,CAAK,KAAK,EAAM,WAAW,UAE1C,EAAiB,EAAe,EAAM,YAAY,OAAO,CAAC,EAAE,UACzD,SAAS,IAIT,IASH,KACJ,GACA,MAC4B;CAC5B,IAAM,IAAyB,EAC7B,GACA,CACF;CACA,IAAI,EAAuB,WAAW,GACpC,OAAO;CAGT,IAAM,IAAe,EACnB,GACA,GACA,EAAsB,CAAU,CAClC;CAEA,OADA,EAAa,KAAK,CAAU,GACrB;AACT,GAiBM,KACJ,GACA,MAC4B;CAC5B,IAAM,IAAc,EAAe,EAAO,OAAO;CACjD,IAAI,CAAC,GACH,OAAO;CAGT,IAAM,IAAgB,EAAyB,GAAU,CAAM;CAC/D,IAAI,EAAc,WAAW,GAC3B,OAAO;CAGT,IAAM,IAAoB,EAAc,KACrC,EAAE,eAAY,EAAM,WAAW,EAClC;CAaA,OALI,CAJmB,EACrB,GACA,CACF,EAAE,WACqB,CAAC,EAAgC,CAAiB,IAChE,OAIF,EACL,GACA,GACA,EAAoB,CAAM,EAAE,KAAK,EAAE,SAAS,CAC9C;AACF,GAMM,KACJ,GACA,MAC4B;CAC5B,IAAI,EAAoB,CAAM,EAAE,KAAK,EAAE,WAAW,GAChD,OAAO;CAGT,IAAM,IAAkB,EAA2B,GAAU,CAAM;CACnE,IAAI,EAAgB,WAAW,GAC7B,OAAO;CAGT,IAAM,IAAiB,IAAI,IAAI,EAAgB,KAAK,EAAE,eAAY,CAAK,CAAC,GAClE,IAAiC,CAAC;CAYxC,OAXA,EAAS,SAAS,GAAO,MAAU;EACjC,IAAI,CAAC,EAAe,IAAI,CAAK,KAAK,CAAC,EAAsB,CAAK,GAAG;GAC/D,EAAa,KAAK,CAAK;GACvB;EACF;EAGA,AAAI,EAAM,WACR,EAAa,KAAK;GAAE,GAAG;GAAO,mBAAmB;EAAK,CAAC;CAE3D,CAAC,GACM;AACT,GAca,KACX,GACA,MACqB;CACrB,IAAM,IAAc,CAAC,GAAG,CAAQ;CAEhC,IAAI,EAAsB,CAAK,GAAG;EAChC,IAAI,EAAM,YAAY,QAAQ,EAAM,sBAAsB,MACxD,OAAO;EAGT,IAAM,IAAY,EAAY,SAAS,GACjC,IAAY,EAAY;EAW9B,OATE,KACA,EAAsB,CAAS,KAC/B,EAAsB,GAAO,CAAS,KAEtC,EAAY,KAAa,EAAyB,GAAO,CAAS,GAC3D,MAGT,EAAY,KAAK,CAAK,GACf;CACT;CAEA,IACG,EAAc,CAAK,KAAK,EAAM,OAAO,SAAS,kBAC9C,EAAe,CAAK,KAAK,EAAM,WAAW,SAC3C;EACA,IAAM,IAAoB,EACxB,GACA,CACF;EACA,IAAI,GACF,OAAO;CAEX;CAKA,IACE,EAAc,CAAK,KACnB,EAAM,OAAO,SAAS,kBACtB,EAAM,OAAO,SAAS,eACtB;EACA,IAAM,IACJ,EAAmC,GAAO,CAAW,KACrD,EAAqC,GAAO,CAAW;EACzD,IAAI,GAEF,OADA,EAAmB,KAAK,CAAK,GACtB;CAEX;CAEA,IAAI,EAAmB,CAAK,GAAG;EAC7B,IAAM,IAAgB,EAAY,WAC/B,MACC,EAAmB,CAAO,KAC1B,EAAQ,iBAAiB,EAAM,YACnC;EAMA,OALI,MAAkB,KAGpB,EAAY,KAAK,CAAK,IAFtB,EAAY,KAAiB,GAIxB;CACT;CAEA,IAAI,EAAmB,CAAK,GAAG;EAU7B,IAPI,EAAM,YAAY,SAAS,sBAO3B,EAAM,YAAY,SAAS,qBAC7B,OAAO;EAIT,IAAM,IAAc,EAAY,WAC7B,MAAY,EAAQ,OAAO,EAAM,SACpC;EACA,AAAI,MAAgB,KAIlB,EAAY,KAAK,CAAK,IAHtB,EAAY,KAAe;CAK/B,OAEE,EAAY,KAAK,CAAK;CAGxB,OAAO;AACT"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../_virtual/_rolldown/runtime.cjs");const e=require("
|
|
1
|
+
require("../_virtual/_rolldown/runtime.cjs");const e=require("../node_modules/@openhands/extensions/integrations/index.cjs"),t=require("./mcp-marketplace-utils.cjs");var n=new Set([`invalid_auth`,`not_authed`,`account_inactive`,`token_revoked`,`token_expired`]),r=e=>e.is_error?e.text||`tool call failed`:null,i={github:{toolCall:{name:`get_me`,arguments:{}},interpret:r},linear:{toolCall:{name:`list_teams`,arguments:{}},interpret:r},slack:{toolCall:{name:`slack_list_channels`,arguments:{limit:1}},interpret:e=>{if(e.is_error)return e.text||`tool call failed`;try{let t=JSON.parse(e.text);if(t?.ok===!1&&n.has(t.error))return String(t.error)}catch{}return null}}};function a(n){let r=t.findCatalogEntryForServer(n,t.getMcpMarketplaceCatalog(e.default));return r?i[r.id]:void 0}exports.getCredentialValidationForServer=a;
|
|
2
2
|
//# sourceMappingURL=mcp-credential-validation.cjs.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import n from "
|
|
1
|
+
import e from "../node_modules/@openhands/extensions/integrations/index.js";
|
|
2
|
+
import { findCatalogEntryForServer as t, getMcpMarketplaceCatalog as n } from "./mcp-marketplace-utils.js";
|
|
3
3
|
//#region src/utils/mcp-credential-validation.ts
|
|
4
4
|
var r = new Set([
|
|
5
5
|
"invalid_auth",
|
|
@@ -38,7 +38,7 @@ var r = new Set([
|
|
|
38
38
|
}
|
|
39
39
|
};
|
|
40
40
|
function o(r) {
|
|
41
|
-
let i =
|
|
41
|
+
let i = t(r, n(e));
|
|
42
42
|
return i ? a[i.id] : void 0;
|
|
43
43
|
}
|
|
44
44
|
//#endregion
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../_virtual/_rolldown/runtime.cjs");function e(e){return e.connectionOptions.filter(e=>e.provider===`mcp`&&!!e.transport)}function t(t){return e(t)[0]}function n(e){if(e.auth.strategy!==`oauth2`)return!0;let t=e.auth.oauth;return t?!t.authorizationUrl&&!t.tokenUrl&&!t.registrationUrl&&!t.additionalAuthorizationParams&&!t.additionalTokenParams:!1}function r(t){return e(t).find(n)}function i(e){return t(e)?.transport}function a(e){switch(e){case`none`:return`none`;case`body`:return`client_secret_post`;case`basic`:return`client_secret_basic`;default:return}}function o(e){if(e.auth.strategy!==`oauth2`)return;let t={type:`oauth`},n=a(e.auth.oauth?.clientAuthentication);return n&&(t.client_auth_method=n),e.auth.oauth?.scopes?.length&&(t.scopes=e.auth.oauth.scopes),Object.keys(t).length>1?t:void 0}function s(e){return e.filter(c)}function c(e){return!!t(e)}var l=e=>{try{return new URL(e)}catch{return null}};function u(e,t){let n=typeof e==`string`?e:``,r=typeof t==`string`?t:``;if(!n||!r)return!1;let i=l(n),a=l(r);return!i||!a?n.replace(/\/+$/,``)===r.replace(/\/+$/,``):i.protocol===a.protocol&&i.host===a.host&&i.pathname.replace(/\/+$/,``)===a.pathname.replace(/\/+$/,``)}function d(e,t){if(e.kind===`shttp`){let n=e.url;return t.type===`shttp`&&!!t.url&&u(t.url,n)}if(e.kind===`sse`){let n=e.url;return t.type===`sse`&&!!t.url&&u(t.url,n)}return t.type===`stdio`&&t.name===e.serverName}function
|
|
1
|
+
require("../_virtual/_rolldown/runtime.cjs");function e(e){return e.connectionOptions.filter(e=>e.provider===`mcp`&&!!e.transport)}function t(t){return e(t)[0]}function n(e){if(e.auth.strategy!==`oauth2`)return!0;let t=e.auth.oauth;return t?!t.authorizationUrl&&!t.tokenUrl&&!t.registrationUrl&&!t.additionalAuthorizationParams&&!t.additionalTokenParams:!1}function r(t){return e(t).find(n)}function i(e){return t(e)?.transport}function a(e){switch(e){case`none`:return`none`;case`body`:return`client_secret_post`;case`basic`:return`client_secret_basic`;default:return}}function o(e){if(e.auth.strategy!==`oauth2`)return;let t={type:`oauth`},n=a(e.auth.oauth?.clientAuthentication);return n&&(t.client_auth_method=n),e.auth.oauth?.scopes?.length&&(t.scopes=e.auth.oauth.scopes),Object.keys(t).length>1?t:void 0}function s(e){return e.filter(c)}function c(e){return!!t(e)}var l=e=>{try{return new URL(e)}catch{return null}};function u(e,t){let n=typeof e==`string`?e:``,r=typeof t==`string`?t:``;if(!n||!r)return!1;let i=l(n),a=l(r);return!i||!a?n.replace(/\/+$/,``)===r.replace(/\/+$/,``):i.protocol===a.protocol&&i.host===a.host&&i.pathname.replace(/\/+$/,``)===a.pathname.replace(/\/+$/,``)}function d(e,t){return t.find(t=>p(e,t))??null}function f(t,n){for(let r of e(t)){let e=d(r.transport,n);if(e)return e}return null}function p(e,t){if(e.kind===`shttp`){let n=e.url;return t.type===`shttp`&&!!t.url&&u(t.url,n)}if(e.kind===`sse`){let n=e.url;return t.type===`sse`&&!!t.url&&u(t.url,n)}return t.type===`stdio`&&t.name===e.serverName}function m(e){return e.trim().toLowerCase()}function h(e){return e.map((e,t)=>({entry:e,index:t})).sort((e,t)=>(t.entry.popularityRank??0)-(e.entry.popularityRank??0)||e.index-t.index).map(({entry:e})=>e)}function g(e,t){return t.find(t=>t.id===e)}function _(e,t){let n=m(t);return n?[e.name,e.description,e.id,...e.keywords??[]].join(` `).toLowerCase().includes(n):!0}function v(e,t,n){let r=m(n);return r?[e.type,`name`in e?e.name:void 0,`command`in e?e.command:void 0,`args`in e?e.args?.join(` `):void 0,`url`in e?e.url:void 0,t?.name,t?.description,t?.id,...t?.keywords??[]].filter(Boolean).join(` `).toLowerCase().includes(r):!0}function y(t,n){return n.find(n=>e(n).some(e=>p(e.transport,t)))}exports.findCatalogEntryForServer=y,exports.findInstalledEntryMatch=f,exports.getDefaultMcpTransport=i,exports.getInstallableMcpConnectionOption=r,exports.getMarketplaceEntriesByPopularity=h,exports.getMarketplaceEntryById=g,exports.getMcpMarketplaceCatalog=s,exports.getMcpOAuthAuthenticationConfig=o,exports.installedServerMatchesQuery=v,exports.isMcpInstallableEntry=c,exports.marketplaceEntryMatchesQuery=_;
|
|
2
2
|
//# sourceMappingURL=mcp-marketplace-utils.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-marketplace-utils.cjs","names":[],"sources":["../../src/utils/mcp-marketplace-utils.ts"],"sourcesContent":["import { MCPServerConfig } from \"#/types/mcp-server\";\nimport type {\n MCPAuthenticationConfig,\n MCPOAuthClientAuthMethod,\n} from \"#/types/mcp-auth\";\nimport type {\n IntegrationAuthConfig,\n IntegrationCatalogEntry as MarketplaceEntry,\n IntegrationConnectionOption,\n IntegrationOAuthConfig,\n IntegrationTransport,\n} from \"@openhands/extensions/integrations\";\n\nexport type { MarketplaceEntry };\n\ntype McpIntegrationAuthConfig = IntegrationAuthConfig & {\n credentialSecretName?: string;\n saveCredentialAsSecretByDefault?: boolean;\n};\n\nexport type McpMarketplaceConnectionOption = Omit<\n IntegrationConnectionOption,\n \"auth\" | \"provider\" | \"transport\"\n> & {\n provider: \"mcp\";\n transport: IntegrationTransport;\n auth: McpIntegrationAuthConfig;\n};\n\nexport function getMcpConnectionOptions(\n entry: MarketplaceEntry,\n): McpMarketplaceConnectionOption[] {\n return entry.connectionOptions.filter(\n (option): option is McpMarketplaceConnectionOption =>\n option.provider === \"mcp\" && !!option.transport,\n );\n}\n\nexport function getDefaultMcpConnectionOption(\n entry: MarketplaceEntry,\n): McpMarketplaceConnectionOption | undefined {\n return getMcpConnectionOptions(entry)[0];\n}\n\nfunction isLocallyInstallableMcpOption(\n option: McpMarketplaceConnectionOption,\n): boolean {\n if (option.auth.strategy !== \"oauth2\") return true;\n\n const oauth = option.auth.oauth;\n if (!oauth) return false;\n\n // Local agent-server installs only support OAuth flows initiated by the MCP\n // server itself through fastmcp. Catalog entries that specify provider OAuth\n // endpoints still need the hosted integration-auth flow and should not be\n // exposed as locally installable static MCP configs.\n return (\n !oauth.authorizationUrl &&\n !oauth.tokenUrl &&\n !oauth.registrationUrl &&\n !oauth.additionalAuthorizationParams &&\n !oauth.additionalTokenParams\n );\n}\n\nexport function getInstallableMcpConnectionOption(\n entry: MarketplaceEntry,\n): McpMarketplaceConnectionOption | undefined {\n return getMcpConnectionOptions(entry).find(isLocallyInstallableMcpOption);\n}\n\nexport function getDefaultMcpTransport(\n entry: MarketplaceEntry,\n): IntegrationTransport | undefined {\n return getDefaultMcpConnectionOption(entry)?.transport;\n}\n\nfunction toMcpOAuthClientAuthMethod(\n value: IntegrationOAuthConfig[\"clientAuthentication\"] | undefined,\n): MCPOAuthClientAuthMethod | undefined {\n switch (value) {\n case \"none\":\n return \"none\";\n case \"body\":\n return \"client_secret_post\";\n case \"basic\":\n return \"client_secret_basic\";\n default:\n return undefined;\n }\n}\n\nexport function getMcpOAuthAuthenticationConfig(\n option: McpMarketplaceConnectionOption,\n): MCPAuthenticationConfig | undefined {\n if (option.auth.strategy !== \"oauth2\") return undefined;\n const authentication: MCPAuthenticationConfig = { type: \"oauth\" };\n const clientAuthMethod = toMcpOAuthClientAuthMethod(\n option.auth.oauth?.clientAuthentication,\n );\n if (clientAuthMethod) {\n authentication.client_auth_method = clientAuthMethod;\n }\n if (option.auth.oauth?.scopes?.length) {\n authentication.scopes = option.auth.oauth.scopes;\n }\n return Object.keys(authentication).length > 1 ? authentication : undefined;\n}\n\nexport function getMcpMarketplaceCatalog(\n catalog: MarketplaceEntry[],\n): MarketplaceEntry[] {\n return catalog.filter(isMcpInstallableEntry);\n}\n\n/**\n * Whether this backend can install/configure the entry as an MCP server.\n * Entries whose only connection options use another provider or transport\n * (e.g. Jira's HTTP/OpenAPI option) exist in the catalog but cannot go\n * through the local MCP install flow.\n */\nexport function isMcpInstallableEntry(entry: MarketplaceEntry): boolean {\n return !!getDefaultMcpConnectionOption(entry);\n}\n\nconst tryUrl = (raw: string): URL | null => {\n try {\n return new URL(raw);\n } catch {\n return null;\n }\n};\n\n/**\n * Loose URL match that ignores query strings, trailing slashes, and\n * default ports. We want clicking \"Linear\" to flag the entry as\n * installed even if the user pasted the URL with extra trailing slash\n * or a different port-equivalent variant.\n *\n * Defensive against runtime data that doesn't match the static type:\n * if either input is not a string (e.g. parsed from an older settings\n * blob), we fall through the URL parsing path and the safe trim\n * fallback below, never calling `.replace` on undefined.\n */\nexport function urlsMatch(a: unknown, b: unknown): boolean {\n const aStr = typeof a === \"string\" ? a : \"\";\n const bStr = typeof b === \"string\" ? b : \"\";\n if (!aStr || !bStr) return false;\n const left = tryUrl(aStr);\n const right = tryUrl(bStr);\n if (!left || !right) {\n return aStr.replace(/\\/+$/, \"\") === bStr.replace(/\\/+$/, \"\");\n }\n return (\n left.protocol === right.protocol &&\n left.host === right.host &&\n left.pathname.replace(/\\/+$/, \"\") === right.pathname.replace(/\\/+$/, \"\")\n );\n}\n\n/**\n * Decide whether a marketplace template is already represented by one\n * of the installed MCP servers. Used to render an \"Installed\" badge on\n * the marketplace tile. Returns the first matching server, or null.\n */\nexport function findInstalledMatch(\n transport: IntegrationTransport,\n servers: MCPServerConfig[],\n): MCPServerConfig | null {\n return (\n servers.find((server) => transportMatchesServer(transport, server)) ?? null\n );\n}\n\nexport function findInstalledEntryMatch(\n entry: MarketplaceEntry,\n servers: MCPServerConfig[],\n): MCPServerConfig | null {\n for (const option of getMcpConnectionOptions(entry)) {\n const match = findInstalledMatch(option.transport, servers);\n if (match) return match;\n }\n return null;\n}\n\nfunction transportMatchesServer(\n transport: IntegrationTransport,\n server: MCPServerConfig,\n): boolean {\n if (transport.kind === \"shttp\") {\n const tplUrl = transport.url;\n return (\n server.type === \"shttp\" && !!server.url && urlsMatch(server.url, tplUrl)\n );\n }\n\n if (transport.kind === \"sse\") {\n const tplUrl = transport.url;\n return (\n server.type === \"sse\" && !!server.url && urlsMatch(server.url, tplUrl)\n );\n }\n\n // stdio: match on the registered server name.\n return server.type === \"stdio\" && server.name === transport.serverName;\n}\n\nfunction normalize(query: string): string {\n return query.trim().toLowerCase();\n}\n\n/**\n * Case-insensitive substring match against the catalog entry's\n * user-visible identity (name, description, id, keywords). Empty\n * queries always match.\n */\nexport function getMarketplaceEntriesByPopularity(\n catalog: MarketplaceEntry[],\n): MarketplaceEntry[] {\n return catalog\n .map((entry, index) => ({ entry, index }))\n .sort((a, b) => {\n const byPopularity =\n (b.entry.popularityRank ?? 0) - (a.entry.popularityRank ?? 0);\n return byPopularity || a.index - b.index;\n })\n .map(({ entry }) => entry);\n}\n\nexport function getMarketplaceEntryById(\n id: string,\n catalog: MarketplaceEntry[],\n): MarketplaceEntry | undefined {\n return catalog.find((entry) => entry.id === id);\n}\n\nexport function marketplaceEntryMatchesQuery(\n entry: MarketplaceEntry,\n rawQuery: string,\n): boolean {\n const q = normalize(rawQuery);\n if (!q) return true;\n const haystack = [\n entry.name,\n entry.description,\n entry.id,\n ...(entry.keywords ?? []),\n ]\n .join(\" \")\n .toLowerCase();\n return haystack.includes(q);\n}\n\n/**\n * Search match for an installed (already-configured) server. We\n * search the server's own identifying fields and — if it's a catalog\n * entry — its catalog name/keywords too, so typing \"Slack\" matches\n * the installed Slack tile even though the persisted server is just\n * `{ type: \"stdio\", name: \"slack\", ... }`.\n */\nexport function installedServerMatchesQuery(\n server: MCPServerConfig,\n catalogEntry: MarketplaceEntry | undefined,\n rawQuery: string,\n): boolean {\n const q = normalize(rawQuery);\n if (!q) return true;\n const haystack = [\n server.type,\n \"name\" in server ? server.name : undefined,\n \"command\" in server ? server.command : undefined,\n \"args\" in server ? server.args?.join(\" \") : undefined,\n \"url\" in server ? server.url : undefined,\n catalogEntry?.name,\n catalogEntry?.description,\n catalogEntry?.id,\n ...(catalogEntry?.keywords ?? []),\n ]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase();\n return haystack.includes(q);\n}\n\n/**\n * Look up the catalog entry that best matches an installed server.\n * Mirrors the lookup used in `installed-server-card.tsx` for\n * rendering the friendly icon.\n */\nexport function findCatalogEntryForServer(\n server: MCPServerConfig,\n catalog: MarketplaceEntry[],\n): MarketplaceEntry | undefined {\n return catalog.find((entry) => {\n // Check every MCP option rather than only the default. Some unified\n // integration entries default to OAuth-hosted MCP while still exposing\n // an API/stdio option; existing installed servers should match either.\n return getMcpConnectionOptions(entry).some((option) =>\n transportMatchesServer(option.transport, server),\n );\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mcp-marketplace-utils.cjs","names":[],"sources":["../../src/utils/mcp-marketplace-utils.ts"],"sourcesContent":["import { MCPServerConfig } from \"#/types/mcp-server\";\nimport type {\n MCPAuthenticationConfig,\n MCPOAuthClientAuthMethod,\n} from \"#/types/mcp-auth\";\nimport type {\n IntegrationAuthConfig,\n IntegrationCatalogEntry as MarketplaceEntry,\n IntegrationConnectionOption,\n IntegrationOAuthConfig,\n IntegrationTransport,\n} from \"@openhands/extensions/integrations\";\n\nexport type { MarketplaceEntry };\n\ntype McpIntegrationAuthConfig = IntegrationAuthConfig & {\n credentialSecretName?: string;\n saveCredentialAsSecretByDefault?: boolean;\n};\n\nexport type McpMarketplaceConnectionOption = Omit<\n IntegrationConnectionOption,\n \"auth\" | \"provider\" | \"transport\"\n> & {\n provider: \"mcp\";\n transport: IntegrationTransport;\n auth: McpIntegrationAuthConfig;\n};\n\nexport function getMcpConnectionOptions(\n entry: MarketplaceEntry,\n): McpMarketplaceConnectionOption[] {\n return entry.connectionOptions.filter(\n (option): option is McpMarketplaceConnectionOption =>\n option.provider === \"mcp\" && !!option.transport,\n );\n}\n\nexport function getDefaultMcpConnectionOption(\n entry: MarketplaceEntry,\n): McpMarketplaceConnectionOption | undefined {\n return getMcpConnectionOptions(entry)[0];\n}\n\nfunction isLocallyInstallableMcpOption(\n option: McpMarketplaceConnectionOption,\n): boolean {\n if (option.auth.strategy !== \"oauth2\") return true;\n\n const oauth = option.auth.oauth;\n if (!oauth) return false;\n\n // Local agent-server installs only support OAuth flows initiated by the MCP\n // server itself through fastmcp. Catalog entries that specify provider OAuth\n // endpoints still need the hosted integration-auth flow and should not be\n // exposed as locally installable static MCP configs.\n return (\n !oauth.authorizationUrl &&\n !oauth.tokenUrl &&\n !oauth.registrationUrl &&\n !oauth.additionalAuthorizationParams &&\n !oauth.additionalTokenParams\n );\n}\n\nexport function getInstallableMcpConnectionOption(\n entry: MarketplaceEntry,\n): McpMarketplaceConnectionOption | undefined {\n return getMcpConnectionOptions(entry).find(isLocallyInstallableMcpOption);\n}\n\nexport function getDefaultMcpTransport(\n entry: MarketplaceEntry,\n): IntegrationTransport | undefined {\n return getDefaultMcpConnectionOption(entry)?.transport;\n}\n\nfunction toMcpOAuthClientAuthMethod(\n value: IntegrationOAuthConfig[\"clientAuthentication\"] | undefined,\n): MCPOAuthClientAuthMethod | undefined {\n switch (value) {\n case \"none\":\n return \"none\";\n case \"body\":\n return \"client_secret_post\";\n case \"basic\":\n return \"client_secret_basic\";\n default:\n return undefined;\n }\n}\n\nexport function getMcpOAuthAuthenticationConfig(\n option: McpMarketplaceConnectionOption,\n): MCPAuthenticationConfig | undefined {\n if (option.auth.strategy !== \"oauth2\") return undefined;\n const authentication: MCPAuthenticationConfig = { type: \"oauth\" };\n const clientAuthMethod = toMcpOAuthClientAuthMethod(\n option.auth.oauth?.clientAuthentication,\n );\n if (clientAuthMethod) {\n authentication.client_auth_method = clientAuthMethod;\n }\n if (option.auth.oauth?.scopes?.length) {\n authentication.scopes = option.auth.oauth.scopes;\n }\n return Object.keys(authentication).length > 1 ? authentication : undefined;\n}\n\nexport function getMcpMarketplaceCatalog(\n catalog: MarketplaceEntry[],\n): MarketplaceEntry[] {\n return catalog.filter(isMcpInstallableEntry);\n}\n\n/**\n * Whether this backend can install/configure the entry as an MCP server.\n * Entries whose only connection options use another provider or transport\n * (e.g. Jira's HTTP/OpenAPI option) exist in the catalog but cannot go\n * through the local MCP install flow.\n */\nexport function isMcpInstallableEntry(entry: MarketplaceEntry): boolean {\n return !!getDefaultMcpConnectionOption(entry);\n}\n\nconst tryUrl = (raw: string): URL | null => {\n try {\n return new URL(raw);\n } catch {\n return null;\n }\n};\n\n/**\n * Loose URL match that ignores query strings, trailing slashes, and\n * default ports. We want clicking \"Linear\" to flag the entry as\n * installed even if the user pasted the URL with extra trailing slash\n * or a different port-equivalent variant.\n *\n * Defensive against runtime data that doesn't match the static type:\n * if either input is not a string (e.g. parsed from an older settings\n * blob), we fall through the URL parsing path and the safe trim\n * fallback below, never calling `.replace` on undefined.\n */\nexport function urlsMatch(a: unknown, b: unknown): boolean {\n const aStr = typeof a === \"string\" ? a : \"\";\n const bStr = typeof b === \"string\" ? b : \"\";\n if (!aStr || !bStr) return false;\n const left = tryUrl(aStr);\n const right = tryUrl(bStr);\n if (!left || !right) {\n return aStr.replace(/\\/+$/, \"\") === bStr.replace(/\\/+$/, \"\");\n }\n return (\n left.protocol === right.protocol &&\n left.host === right.host &&\n left.pathname.replace(/\\/+$/, \"\") === right.pathname.replace(/\\/+$/, \"\")\n );\n}\n\n/**\n * Decide whether a marketplace template is already represented by one\n * of the installed MCP servers. Used to render an \"Installed\" badge on\n * the marketplace tile. Returns the first matching server, or null.\n */\nexport function findInstalledMatch(\n transport: IntegrationTransport,\n servers: MCPServerConfig[],\n): MCPServerConfig | null {\n return (\n servers.find((server) => transportMatchesServer(transport, server)) ?? null\n );\n}\n\nexport function findInstalledEntryMatch(\n entry: MarketplaceEntry,\n servers: MCPServerConfig[],\n): MCPServerConfig | null {\n for (const option of getMcpConnectionOptions(entry)) {\n const match = findInstalledMatch(option.transport, servers);\n if (match) return match;\n }\n return null;\n}\n\nfunction transportMatchesServer(\n transport: IntegrationTransport,\n server: MCPServerConfig,\n): boolean {\n if (transport.kind === \"shttp\") {\n const tplUrl = transport.url;\n return (\n server.type === \"shttp\" && !!server.url && urlsMatch(server.url, tplUrl)\n );\n }\n\n if (transport.kind === \"sse\") {\n const tplUrl = transport.url;\n return (\n server.type === \"sse\" && !!server.url && urlsMatch(server.url, tplUrl)\n );\n }\n\n // stdio: match on the registered server name.\n return server.type === \"stdio\" && server.name === transport.serverName;\n}\n\nfunction normalize(query: string): string {\n return query.trim().toLowerCase();\n}\n\n/**\n * Case-insensitive substring match against the catalog entry's\n * user-visible identity (name, description, id, keywords). Empty\n * queries always match.\n */\nexport function getMarketplaceEntriesByPopularity(\n catalog: MarketplaceEntry[],\n): MarketplaceEntry[] {\n return catalog\n .map((entry, index) => ({ entry, index }))\n .sort((a, b) => {\n const byPopularity =\n (b.entry.popularityRank ?? 0) - (a.entry.popularityRank ?? 0);\n return byPopularity || a.index - b.index;\n })\n .map(({ entry }) => entry);\n}\n\nexport function getMarketplaceEntryById(\n id: string,\n catalog: MarketplaceEntry[],\n): MarketplaceEntry | undefined {\n return catalog.find((entry) => entry.id === id);\n}\n\nexport function marketplaceEntryMatchesQuery(\n entry: MarketplaceEntry,\n rawQuery: string,\n): boolean {\n const q = normalize(rawQuery);\n if (!q) return true;\n const haystack = [\n entry.name,\n entry.description,\n entry.id,\n ...(entry.keywords ?? []),\n ]\n .join(\" \")\n .toLowerCase();\n return haystack.includes(q);\n}\n\n/**\n * Search match for an installed (already-configured) server. We\n * search the server's own identifying fields and — if it's a catalog\n * entry — its catalog name/keywords too, so typing \"Slack\" matches\n * the installed Slack tile even though the persisted server is just\n * `{ type: \"stdio\", name: \"slack\", ... }`.\n */\nexport function installedServerMatchesQuery(\n server: MCPServerConfig,\n catalogEntry: MarketplaceEntry | undefined,\n rawQuery: string,\n): boolean {\n const q = normalize(rawQuery);\n if (!q) return true;\n const haystack = [\n server.type,\n \"name\" in server ? server.name : undefined,\n \"command\" in server ? server.command : undefined,\n \"args\" in server ? server.args?.join(\" \") : undefined,\n \"url\" in server ? server.url : undefined,\n catalogEntry?.name,\n catalogEntry?.description,\n catalogEntry?.id,\n ...(catalogEntry?.keywords ?? []),\n ]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase();\n return haystack.includes(q);\n}\n\n/**\n * Look up the catalog entry that best matches an installed server.\n * Mirrors the lookup used in `installed-server-card.tsx` for\n * rendering the friendly icon.\n */\nexport function findCatalogEntryForServer(\n server: MCPServerConfig,\n catalog: MarketplaceEntry[],\n): MarketplaceEntry | undefined {\n return catalog.find((entry) => {\n // Check every MCP option rather than only the default. Some unified\n // integration entries default to OAuth-hosted MCP while still exposing\n // an API/stdio option; existing installed servers should match either.\n return getMcpConnectionOptions(entry).some((option) =>\n transportMatchesServer(option.transport, server),\n );\n });\n}\n"],"mappings":"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"}
|