@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,48 +1,70 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The automation interface seam.
|
|
3
3
|
*
|
|
4
|
-
* Every automation-specific datum the host's surfaces render —
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* from
|
|
8
|
-
* The
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
4
|
+
* Every automation-specific datum the host's surfaces render — navigation and
|
|
5
|
+
* page copy, the settable attributes, the import/export envelope, endpoint
|
|
6
|
+
* paths, the featured and responder id lists, the sub-page surface — is served
|
|
7
|
+
* from the interface manifest the pinned `@openhands/extensions` publishes.
|
|
8
|
+
* The host holds none of it. When the package publishes no manifest, or the
|
|
9
|
+
* published one fails admission, there is nothing to serve: the nav entries do
|
|
10
|
+
* not render and the routes 404. `hasAutomationInterface()` is that gate, and
|
|
11
|
+
* every accessor that needs the manifest is reachable only from behind it.
|
|
12
12
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
13
|
+
* Routes are the exception, and they are not a definition: `src/routes.ts`
|
|
14
|
+
* mounts them, so the host states them here and admission checks a manifest's
|
|
15
|
+
* routes against them. That check is what keeps a published deep link
|
|
16
|
+
* resolving to the page it named.
|
|
17
17
|
*/
|
|
18
18
|
import type { AutomationAttributeName, InterfaceDashboardFilter, InterfaceDashboardSort, InterfaceEndpointName, InterfaceIconSlug, InterfaceImportExport, InterfaceListInsights, InterfaceOverview, InterfaceSubPageId, InterfaceTemplatesPage } from "./types";
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
19
|
+
/**
|
|
20
|
+
* File-format section for portable `.automation.json` export/import. A docs
|
|
21
|
+
* pointer for the host's import picker, not interface data — the manifest's
|
|
22
|
+
* `importExport` block has no docs field.
|
|
23
|
+
*/
|
|
24
|
+
export declare const AUTOMATION_FILE_FORMAT_DOCS_URL = "https://docs.openhands.dev/openhands/usage/agent-canvas/managing-automations#exported-file-format";
|
|
25
|
+
/**
|
|
26
|
+
* Whether this deployment has an automation interface at all. The nav entries
|
|
27
|
+
* and the route loaders ask before rendering; nothing else has to.
|
|
28
|
+
*/
|
|
29
|
+
export declare function hasAutomationInterface(): boolean;
|
|
28
30
|
export declare function automationListPath(): string;
|
|
29
31
|
export declare function automationSetupPath(id: string): string;
|
|
30
32
|
export declare function automationDetailPath(id: string): string;
|
|
31
33
|
export declare function automationTemplatesPath(): string;
|
|
34
|
+
/**
|
|
35
|
+
* Whether `path` (a location pathname) is inside the automation surface: the
|
|
36
|
+
* list route itself or anything nested under it (detail, setup, templates,
|
|
37
|
+
* git-sync). Prefix-safe: "/automations-foo" does not match.
|
|
38
|
+
*/
|
|
39
|
+
export declare function isAutomationsRoute(path: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* A declared endpoint path. Empty for one the manifest may omit - the two a
|
|
42
|
+
* bundle needs were added after the block shipped - so a caller that needs one
|
|
43
|
+
* says so rather than reading a host-held default that does not exist.
|
|
44
|
+
*/
|
|
32
45
|
export declare function getAutomationEndpoint(name: InterfaceEndpointName): string;
|
|
33
46
|
/** An id-parameterized endpoint with `{id}` substituted, encoded. */
|
|
34
47
|
export declare function getAutomationIdEndpoint(name: "detail" | "dispatch" | "runs" | "tarball", id: string): string;
|
|
35
48
|
export interface InterfaceCopy {
|
|
36
|
-
sidebarLabel: string
|
|
37
|
-
commandMenuTitle: string
|
|
38
|
-
commandMenuDescription: string
|
|
39
|
-
commandMenuKeywords: string
|
|
40
|
-
listTitle: string
|
|
41
|
-
listSubtitle: string
|
|
42
|
-
detailBackLabel: string
|
|
43
|
-
editTitle: string
|
|
49
|
+
sidebarLabel: string;
|
|
50
|
+
commandMenuTitle: string;
|
|
51
|
+
commandMenuDescription: string;
|
|
52
|
+
commandMenuKeywords: string;
|
|
53
|
+
listTitle: string;
|
|
54
|
+
listSubtitle: string;
|
|
55
|
+
detailBackLabel: string;
|
|
56
|
+
editTitle: string;
|
|
44
57
|
}
|
|
45
58
|
export declare function getInterfaceCopy(): InterfaceCopy;
|
|
59
|
+
export interface AttributeSpec {
|
|
60
|
+
present: boolean;
|
|
61
|
+
label: string;
|
|
62
|
+
/** Null when the manifest states no help text for the attribute. */
|
|
63
|
+
help: string | null;
|
|
64
|
+
required: boolean;
|
|
65
|
+
min: number | null;
|
|
66
|
+
max: number | null;
|
|
67
|
+
}
|
|
46
68
|
export declare function getAttributeSpec(name: AutomationAttributeName): AttributeSpec;
|
|
47
69
|
export declare function getImportExportSpec(): InterfaceImportExport;
|
|
48
70
|
export declare function getAutomationsDocsUrl(): string;
|
|
@@ -50,14 +72,14 @@ export declare function getFeaturedAutomationIds(): readonly string[];
|
|
|
50
72
|
export declare function getResponderIntegrationIds(): readonly string[];
|
|
51
73
|
export interface SubPageNavSpec {
|
|
52
74
|
page: InterfaceSubPageId;
|
|
53
|
-
/** The page's route, resolved through the
|
|
75
|
+
/** The page's route, resolved through the host's route table. */
|
|
54
76
|
to: string;
|
|
55
77
|
label: string;
|
|
56
78
|
icon: InterfaceIconSlug;
|
|
57
79
|
}
|
|
58
80
|
/**
|
|
59
81
|
* The sub-page navigation, or null when the manifest does not declare the
|
|
60
|
-
* sub-page surface.
|
|
82
|
+
* sub-page surface.
|
|
61
83
|
*/
|
|
62
84
|
export declare function getSubPagesSpec(): SubPageNavSpec[] | null;
|
|
63
85
|
export interface DashboardSpec {
|
|
@@ -7,76 +7,73 @@ var r = {
|
|
|
7
7
|
setup: "/automations/new/:automationId",
|
|
8
8
|
detail: "/automations/:automationId",
|
|
9
9
|
templates: "/automations/templates"
|
|
10
|
-
}, i = {
|
|
11
|
-
list: "/v1",
|
|
12
|
-
detail: "/v1/{id}",
|
|
13
|
-
dispatch: "/v1/{id}/dispatch",
|
|
14
|
-
runs: "/v1/{id}/runs",
|
|
15
|
-
tarball: "/v1/{id}/tarball",
|
|
16
|
-
health: "/health",
|
|
17
|
-
capabilities: "/v1/capabilities",
|
|
18
|
-
validate: "/v1/validate",
|
|
19
|
-
createPrompt: "/v1/preset/prompt",
|
|
20
|
-
createPlugin: "/v1/preset/plugin"
|
|
21
|
-
}, a = {
|
|
22
|
-
fileKind: "automation",
|
|
23
|
-
fileVersion: 1,
|
|
24
|
-
filenameSuffix: ".automation.json",
|
|
25
|
-
importDefaults: {
|
|
26
|
-
repoProvider: "github",
|
|
27
|
-
placeholderEventSource: "agent-canvas-import"
|
|
28
|
-
}
|
|
29
10
|
};
|
|
30
|
-
function
|
|
11
|
+
function i(e) {
|
|
31
12
|
return typeof e == "object" && !!e && !Array.isArray(e);
|
|
32
13
|
}
|
|
33
|
-
function
|
|
34
|
-
return new Set(e.flatMap((e) =>
|
|
14
|
+
function a() {
|
|
15
|
+
return new Set(e.flatMap((e) => i(e) && typeof e.id == "string" ? [e.id] : []));
|
|
35
16
|
}
|
|
36
|
-
function
|
|
17
|
+
function o(e) {
|
|
37
18
|
if (e === void 0) return null;
|
|
38
19
|
let n = t(e, {
|
|
39
|
-
catalogIds:
|
|
20
|
+
catalogIds: a(),
|
|
40
21
|
mountedRoutes: r
|
|
41
22
|
});
|
|
42
23
|
return n.valid ? e : (console.warn("Rejected the automation interface manifest:", n.errors.join("; ")), null);
|
|
43
24
|
}
|
|
44
|
-
var
|
|
45
|
-
function
|
|
46
|
-
return
|
|
47
|
-
}
|
|
48
|
-
function
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
function m() {
|
|
65
|
-
return l
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
25
|
+
var s = o(n);
|
|
26
|
+
function c() {
|
|
27
|
+
return s !== null;
|
|
28
|
+
}
|
|
29
|
+
function l() {
|
|
30
|
+
if (!s) throw Error("No automation interface manifest is admitted, so this surface should not have rendered.");
|
|
31
|
+
return s;
|
|
32
|
+
}
|
|
33
|
+
function u(e, t) {
|
|
34
|
+
return e.replace(":automationId", encodeURIComponent(t));
|
|
35
|
+
}
|
|
36
|
+
function d() {
|
|
37
|
+
return r.list;
|
|
38
|
+
}
|
|
39
|
+
function f(e) {
|
|
40
|
+
return u(r.setup, e);
|
|
41
|
+
}
|
|
42
|
+
function p(e) {
|
|
43
|
+
return e === r.list || e.startsWith(`${r.list}/`);
|
|
44
|
+
}
|
|
45
|
+
function m(e) {
|
|
46
|
+
return l().endpoints[e] ?? "";
|
|
47
|
+
}
|
|
48
|
+
function h(e, t) {
|
|
49
|
+
return m(e).replace("{id}", encodeURIComponent(t));
|
|
50
|
+
}
|
|
51
|
+
function g() {
|
|
52
|
+
let e = l();
|
|
53
|
+
return {
|
|
54
|
+
sidebarLabel: e.navigation.sidebar.label,
|
|
55
|
+
commandMenuTitle: e.navigation.commandMenu.title,
|
|
56
|
+
commandMenuDescription: e.navigation.commandMenu.description,
|
|
57
|
+
commandMenuKeywords: e.navigation.commandMenu.keywords,
|
|
58
|
+
listTitle: e.pages.list.title,
|
|
59
|
+
listSubtitle: e.pages.list.subtitle,
|
|
60
|
+
detailBackLabel: e.pages.detail.backLabel,
|
|
61
|
+
editTitle: e.pages.edit.title
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function _() {
|
|
65
|
+
return l().importExport;
|
|
66
|
+
}
|
|
67
|
+
function v() {
|
|
68
|
+
return l().docsUrl;
|
|
69
|
+
}
|
|
70
|
+
function y() {
|
|
71
|
+
return l().featuredAutomationIds;
|
|
72
|
+
}
|
|
73
|
+
function b() {
|
|
74
|
+
return l().responderIntegrationIds;
|
|
78
75
|
}
|
|
79
76
|
//#endregion
|
|
80
|
-
export {
|
|
77
|
+
export { d as automationListPath, f as automationSetupPath, m as getAutomationEndpoint, h as getAutomationIdEndpoint, v as getAutomationsDocsUrl, y as getFeaturedAutomationIds, _ as getImportExportSpec, g as getInterfaceCopy, b as getResponderIntegrationIds, c as hasAutomationInterface, p as isAutomationsRoute };
|
|
81
78
|
|
|
82
79
|
//# sourceMappingURL=automation-interface.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automation-interface.js","names":[],"sources":["../../src/manifests/automation-interface.ts"],"sourcesContent":["/**\n * The automation interface seam.\n *\n * Every automation-specific datum the host's surfaces render — routes,\n * navigation and page copy, the settable attributes, the import/export\n * envelope, endpoint paths, the featured and responder id lists — is served\n * from here.\n * The published interface manifest supplies it when the pinned\n * `@openhands/extensions` ships one and it passes admission; otherwise the\n * host's own defaults do, which reproduce today's behavior exactly. Copy\n * defaults are null, meaning \"render the host's own translation\".\n *\n * The sub-page surface (navigation, overview tiles, filters, sort, run\n * insights, templates page) is the exception: the host holds no definitions\n * of its own, so its accessors return null until an admitted manifest\n * declares it, and the sub-pages simply do not render.\n */\n\nimport { AUTOMATION_CATALOG } from \"@openhands/extensions/automations\";\nimport { validateInterfaceManifest } from \"./interface-validation\";\nimport { AUTOMATION_INTERFACE_CANDIDATE } from \"./manifest-sources\";\nimport type {\n AutomationAttributeName,\n InterfaceDashboardFilter,\n InterfaceDashboardSort,\n InterfaceEndpointName,\n InterfaceIconSlug,\n InterfaceImportExport,\n InterfaceListInsights,\n InterfaceManifest,\n InterfaceOverview,\n InterfaceRoutes,\n InterfaceSubPageId,\n InterfaceTemplatesPage,\n} from \"./types\";\n\n/** The routes this host has registrations for, in `src/routes.ts`. */\nconst MOUNTED_ROUTES = {\n list: \"/automations\",\n setup: \"/automations/new/:automationId\",\n detail: \"/automations/:automationId\",\n templates: \"/automations/templates\",\n} satisfies InterfaceRoutes;\n\nconst DEFAULT_ENDPOINTS: InterfaceManifest[\"endpoints\"] = {\n list: \"/v1\",\n detail: \"/v1/{id}\",\n dispatch: \"/v1/{id}/dispatch\",\n runs: \"/v1/{id}/runs\",\n tarball: \"/v1/{id}/tarball\",\n health: \"/health\",\n capabilities: \"/v1/capabilities\",\n validate: \"/v1/validate\",\n createPrompt: \"/v1/preset/prompt\",\n createPlugin: \"/v1/preset/plugin\",\n};\n\nconst DEFAULT_IMPORT_EXPORT: InterfaceImportExport = {\n fileKind: \"automation\",\n fileVersion: 1,\n filenameSuffix: \".automation.json\",\n importDefaults: {\n repoProvider: \"github\",\n placeholderEventSource: \"agent-canvas-import\",\n },\n};\n\nconst DEFAULT_DOCS_URL =\n \"https://docs.openhands.dev/openhands/usage/automations/overview\";\n\n/**\n * Proven automations featured above the Beta group. NOT derived from\n * popularityRank (slack-standup-digest@94 outranks slack-channel-monitor@92\n * yet is Beta).\n */\nconst DEFAULT_FEATURED_AUTOMATION_IDS: readonly string[] = [\n \"github-pr-reviewer\",\n \"github-repo-monitor\",\n \"slack-channel-monitor\",\n];\n\n/**\n * Integrations whose automations are treated as event responders that poll\n * continuously, and so get the deployment-choice dialog.\n */\nconst DEFAULT_RESPONDER_INTEGRATION_IDS: readonly string[] = [\n \"github\",\n \"slack\",\n];\n\nexport interface AttributeSpec {\n present: boolean;\n /** Null means \"render the host's own translation\". */\n label: string | null;\n help: string | null;\n required: boolean;\n min: number | null;\n max: number | null;\n}\n\nconst ABSENT_ATTRIBUTE: AttributeSpec = {\n present: false,\n label: null,\n help: null,\n required: false,\n min: null,\n max: null,\n};\n\n/** Today's edit dialog, restated as specs so absence of a manifest changes nothing. */\nconst DEFAULT_ATTRIBUTES: Record<AutomationAttributeName, AttributeSpec> = {\n name: {\n present: true,\n label: null,\n help: null,\n required: true,\n min: null,\n max: null,\n },\n prompt: {\n present: true,\n label: null,\n help: null,\n required: false,\n min: null,\n max: null,\n },\n model: {\n present: true,\n label: null,\n help: null,\n required: false,\n min: null,\n max: null,\n },\n timeout: {\n present: true,\n label: null,\n help: null,\n required: false,\n min: 1,\n max: null,\n },\n schedule: {\n present: true,\n label: null,\n help: null,\n required: false,\n min: null,\n max: null,\n },\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getCatalogIds(): ReadonlySet<string> {\n return new Set(\n (AUTOMATION_CATALOG as readonly unknown[]).flatMap((entry) =>\n isRecord(entry) && typeof entry.id === \"string\" ? [entry.id] : [],\n ),\n );\n}\n\nfunction admitInterfaceManifest(candidate: unknown): InterfaceManifest | null {\n if (candidate === undefined) return null;\n\n const result = validateInterfaceManifest(candidate, {\n catalogIds: getCatalogIds(),\n mountedRoutes: MOUNTED_ROUTES,\n });\n if (!result.valid) {\n // Mirrors the setup registry: a rejected manifest is skipped loudly, and\n // the host's defaults stand.\n console.warn(\n \"Rejected the automation interface manifest:\",\n result.errors.join(\"; \"),\n );\n return null;\n }\n return candidate as InterfaceManifest;\n}\n\nconst ADMITTED = admitInterfaceManifest(AUTOMATION_INTERFACE_CANDIDATE);\n\nfunction substituteRouteParam(pattern: string, id: string): string {\n return pattern.replace(\":automationId\", encodeURIComponent(id));\n}\n\nexport function automationListPath(): string {\n return (ADMITTED?.routes ?? MOUNTED_ROUTES).list;\n}\n\nexport function automationSetupPath(id: string): string {\n return substituteRouteParam((ADMITTED?.routes ?? MOUNTED_ROUTES).setup, id);\n}\n\nexport function automationDetailPath(id: string): string {\n return substituteRouteParam((ADMITTED?.routes ?? MOUNTED_ROUTES).detail, id);\n}\n\nexport function automationTemplatesPath(): string {\n return ADMITTED?.routes.templates ?? MOUNTED_ROUTES.templates;\n}\n\nexport function getAutomationEndpoint(name: InterfaceEndpointName): string {\n return (ADMITTED?.endpoints ?? DEFAULT_ENDPOINTS)[name];\n}\n\n/** An id-parameterized endpoint with `{id}` substituted, encoded. */\nexport function getAutomationIdEndpoint(\n name: \"detail\" | \"dispatch\" | \"runs\" | \"tarball\",\n id: string,\n): string {\n return getAutomationEndpoint(name).replace(\"{id}\", encodeURIComponent(id));\n}\n\nexport interface InterfaceCopy {\n sidebarLabel: string | null;\n commandMenuTitle: string | null;\n commandMenuDescription: string | null;\n commandMenuKeywords: string | null;\n listTitle: string | null;\n listSubtitle: string | null;\n detailBackLabel: string | null;\n editTitle: string | null;\n}\n\nconst HOST_COPY: InterfaceCopy = {\n sidebarLabel: null,\n commandMenuTitle: null,\n commandMenuDescription: null,\n commandMenuKeywords: null,\n listTitle: null,\n listSubtitle: null,\n detailBackLabel: null,\n editTitle: null,\n};\n\nexport function getInterfaceCopy(): InterfaceCopy {\n if (!ADMITTED) return HOST_COPY;\n return {\n sidebarLabel: ADMITTED.navigation.sidebar.label,\n commandMenuTitle: ADMITTED.navigation.commandMenu.title,\n commandMenuDescription: ADMITTED.navigation.commandMenu.description,\n commandMenuKeywords: ADMITTED.navigation.commandMenu.keywords,\n listTitle: ADMITTED.pages.list.title,\n listSubtitle: ADMITTED.pages.list.subtitle,\n detailBackLabel: ADMITTED.pages.detail.backLabel,\n editTitle: ADMITTED.pages.edit.title,\n };\n}\n\nexport function getAttributeSpec(name: AutomationAttributeName): AttributeSpec {\n if (!ADMITTED) return DEFAULT_ATTRIBUTES[name];\n\n const attribute = ADMITTED.attributes[name];\n if (!attribute) return ABSENT_ATTRIBUTE;\n return {\n present: true,\n label: attribute.label,\n help: attribute.help ?? null,\n required: attribute.required,\n min: attribute.constraints?.min ?? null,\n max: attribute.constraints?.max ?? null,\n };\n}\n\nexport function getImportExportSpec(): InterfaceImportExport {\n return ADMITTED?.importExport ?? DEFAULT_IMPORT_EXPORT;\n}\n\nexport function getAutomationsDocsUrl(): string {\n return ADMITTED?.docsUrl ?? DEFAULT_DOCS_URL;\n}\n\nexport function getFeaturedAutomationIds(): readonly string[] {\n return ADMITTED?.featuredAutomationIds ?? DEFAULT_FEATURED_AUTOMATION_IDS;\n}\n\nexport function getResponderIntegrationIds(): readonly string[] {\n return ADMITTED?.responderIntegrationIds ?? DEFAULT_RESPONDER_INTEGRATION_IDS;\n}\n\nexport interface SubPageNavSpec {\n page: InterfaceSubPageId;\n /** The page's route, resolved through the manifest. */\n to: string;\n label: string;\n icon: InterfaceIconSlug;\n}\n\n/**\n * The sub-page navigation, or null when the manifest does not declare the\n * sub-page surface. No manifest, no sub-pages — there is no host default.\n */\nexport function getSubPagesSpec(): SubPageNavSpec[] | null {\n const subPages = ADMITTED?.navigation.subPages;\n if (!subPages) return null;\n return subPages.map((item) => ({\n page: item.page,\n to:\n item.page === \"templates\"\n ? automationTemplatesPath()\n : automationListPath(),\n label: item.label,\n icon: item.icon,\n }));\n}\n\nexport interface DashboardSpec {\n overview: InterfaceOverview;\n filters: InterfaceDashboardFilter[];\n sort: InterfaceDashboardSort;\n insights: InterfaceListInsights;\n}\n\n/**\n * The list page's dashboard composition, or null when the manifest does not\n * declare it. Admission accepts the sub-page surface whole or not at all, so\n * these four are present together.\n */\nexport function getDashboardSpec(): DashboardSpec | null {\n const list = ADMITTED?.pages.list;\n if (!list?.overview || !list.filters || !list.sort || !list.insights) {\n return null;\n }\n return {\n overview: list.overview,\n filters: list.filters,\n sort: list.sort,\n insights: list.insights,\n };\n}\n\n/** The templates page identity, or null when the manifest does not declare it. */\nexport function getTemplatesPageSpec(): InterfaceTemplatesPage | null {\n return ADMITTED?.pages.templates ?? null;\n}\n"],"mappings":";;;;AAqCA,IAAM,IAAiB;CACrB,MAAM;CACN,OAAO;CACP,QAAQ;CACR,WAAW;AACb,GAEM,IAAoD;CACxD,MAAM;CACN,QAAQ;CACR,UAAU;CACV,MAAM;CACN,SAAS;CACT,QAAQ;CACR,cAAc;CACd,UAAU;CACV,cAAc;CACd,cAAc;AAChB,GAEM,IAA+C;CACnD,UAAU;CACV,aAAa;CACb,gBAAgB;CAChB,gBAAgB;EACd,cAAc;EACd,wBAAwB;CAC1B;AACF;AAwFA,SAAS,EAAS,GAAkD;CAClE,OAAO,OAAO,KAAU,cAAY,KAAkB,CAAC,MAAM,QAAQ,CAAK;AAC5E;AAEA,SAAS,IAAqC;CAC5C,OAAO,IAAI,IACR,EAA0C,SAAS,MAClD,EAAS,CAAK,KAAK,OAAO,EAAM,MAAO,WAAW,CAAC,EAAM,EAAE,IAAI,CAAC,CAClE,CACF;AACF;AAEA,SAAS,EAAuB,GAA8C;CAC5E,IAAI,MAAc,KAAA,GAAW,OAAO;CAEpC,IAAM,IAAS,EAA0B,GAAW;EAClD,YAAY,EAAc;EAC1B,eAAe;CACjB,CAAC;CAUD,OATK,EAAO,QASL,KANL,QAAQ,KACN,+CACA,EAAO,OAAO,KAAK,IAAI,CACzB,GACO;AAGX;AAEA,IAAM,IAAW,EAAuB,CAA8B;AAMtE,SAAgB,IAA6B;CAC3C,QAAQ,GAAU,UAAU,GAAgB;AAC9C;AAcA,SAAgB,EAAsB,GAAqC;CACzE,QAAQ,GAAU,aAAa,GAAmB;AACpD;AAGA,SAAgB,EACd,GACA,GACQ;CACR,OAAO,EAAsB,CAAI,EAAE,QAAQ,QAAQ,mBAAmB,CAAE,CAAC;AAC3E;AAaA,IAAM,IAA2B;CAC/B,cAAc;CACd,kBAAkB;CAClB,wBAAwB;CACxB,qBAAqB;CACrB,WAAW;CACX,cAAc;CACd,iBAAiB;CACjB,WAAW;AACb;AAEA,SAAgB,IAAkC;CAEhD,OADK,IACE;EACL,cAAc,EAAS,WAAW,QAAQ;EAC1C,kBAAkB,EAAS,WAAW,YAAY;EAClD,wBAAwB,EAAS,WAAW,YAAY;EACxD,qBAAqB,EAAS,WAAW,YAAY;EACrD,WAAW,EAAS,MAAM,KAAK;EAC/B,cAAc,EAAS,MAAM,KAAK;EAClC,iBAAiB,EAAS,MAAM,OAAO;EACvC,WAAW,EAAS,MAAM,KAAK;CACjC,IAVsB;AAWxB;AAiBA,SAAgB,IAA6C;CAC3D,OAAO,GAAU,gBAAgB;AACnC"}
|
|
1
|
+
{"version":3,"file":"automation-interface.js","names":[],"sources":["../../src/manifests/automation-interface.ts"],"sourcesContent":["/**\n * The automation interface seam.\n *\n * Every automation-specific datum the host's surfaces render — navigation and\n * page copy, the settable attributes, the import/export envelope, endpoint\n * paths, the featured and responder id lists, the sub-page surface — is served\n * from the interface manifest the pinned `@openhands/extensions` publishes.\n * The host holds none of it. When the package publishes no manifest, or the\n * published one fails admission, there is nothing to serve: the nav entries do\n * not render and the routes 404. `hasAutomationInterface()` is that gate, and\n * every accessor that needs the manifest is reachable only from behind it.\n *\n * Routes are the exception, and they are not a definition: `src/routes.ts`\n * mounts them, so the host states them here and admission checks a manifest's\n * routes against them. That check is what keeps a published deep link\n * resolving to the page it named.\n */\n\nimport { AUTOMATION_CATALOG } from \"@openhands/extensions/automations\";\nimport { validateInterfaceManifest } from \"./interface-validation\";\nimport { AUTOMATION_INTERFACE_CANDIDATE } from \"./manifest-sources\";\nimport type {\n AutomationAttributeName,\n InterfaceDashboardFilter,\n InterfaceDashboardSort,\n InterfaceEndpointName,\n InterfaceIconSlug,\n InterfaceImportExport,\n InterfaceListInsights,\n InterfaceManifest,\n InterfaceOverview,\n InterfaceRoutes,\n InterfaceSubPageId,\n InterfaceTemplatesPage,\n} from \"./types\";\n\n/** The routes this host has registrations for, in `src/routes.ts`. */\nconst MOUNTED_ROUTES = {\n list: \"/automations\",\n setup: \"/automations/new/:automationId\",\n detail: \"/automations/:automationId\",\n templates: \"/automations/templates\",\n} satisfies InterfaceRoutes;\n\n/**\n * File-format section for portable `.automation.json` export/import. A docs\n * pointer for the host's import picker, not interface data — the manifest's\n * `importExport` block has no docs field.\n */\nexport const AUTOMATION_FILE_FORMAT_DOCS_URL =\n \"https://docs.openhands.dev/openhands/usage/agent-canvas/managing-automations#exported-file-format\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction getCatalogIds(): ReadonlySet<string> {\n return new Set(\n (AUTOMATION_CATALOG as readonly unknown[]).flatMap((entry) =>\n isRecord(entry) && typeof entry.id === \"string\" ? [entry.id] : [],\n ),\n );\n}\n\nfunction admitInterfaceManifest(candidate: unknown): InterfaceManifest | null {\n if (candidate === undefined) return null;\n\n const result = validateInterfaceManifest(candidate, {\n catalogIds: getCatalogIds(),\n mountedRoutes: MOUNTED_ROUTES,\n });\n if (!result.valid) {\n // Mirrors the setup registry: a rejected manifest is skipped loudly, and\n // the surfaces it would have described stay unrendered.\n console.warn(\n \"Rejected the automation interface manifest:\",\n result.errors.join(\"; \"),\n );\n return null;\n }\n return candidate as InterfaceManifest;\n}\n\nconst ADMITTED = admitInterfaceManifest(AUTOMATION_INTERFACE_CANDIDATE);\n\n/**\n * Whether this deployment has an automation interface at all. The nav entries\n * and the route loaders ask before rendering; nothing else has to.\n */\nexport function hasAutomationInterface(): boolean {\n return ADMITTED !== null;\n}\n\n/**\n * The admitted manifest, for the accessors that cannot answer without one.\n * Reaching one of those without a manifest means a surface rendered past its\n * gate — a wiring mistake, not a state to render.\n */\nfunction requireInterface(): InterfaceManifest {\n if (!ADMITTED) {\n throw new Error(\n \"No automation interface manifest is admitted, so this surface should not have rendered.\",\n );\n }\n return ADMITTED;\n}\n\nfunction substituteRouteParam(pattern: string, id: string): string {\n return pattern.replace(\":automationId\", encodeURIComponent(id));\n}\n\nexport function automationListPath(): string {\n return MOUNTED_ROUTES.list;\n}\n\nexport function automationSetupPath(id: string): string {\n return substituteRouteParam(MOUNTED_ROUTES.setup, id);\n}\n\nexport function automationDetailPath(id: string): string {\n return substituteRouteParam(MOUNTED_ROUTES.detail, id);\n}\n\nexport function automationTemplatesPath(): string {\n return MOUNTED_ROUTES.templates;\n}\n\n/**\n * Whether `path` (a location pathname) is inside the automation surface: the\n * list route itself or anything nested under it (detail, setup, templates,\n * git-sync). Prefix-safe: \"/automations-foo\" does not match.\n */\nexport function isAutomationsRoute(path: string): boolean {\n return (\n path === MOUNTED_ROUTES.list || path.startsWith(`${MOUNTED_ROUTES.list}/`)\n );\n}\n\n/**\n * A declared endpoint path. Empty for one the manifest may omit - the two a\n * bundle needs were added after the block shipped - so a caller that needs one\n * says so rather than reading a host-held default that does not exist.\n */\nexport function getAutomationEndpoint(name: InterfaceEndpointName): string {\n return requireInterface().endpoints[name] ?? \"\";\n}\n\n/** An id-parameterized endpoint with `{id}` substituted, encoded. */\nexport function getAutomationIdEndpoint(\n name: \"detail\" | \"dispatch\" | \"runs\" | \"tarball\",\n id: string,\n): string {\n return getAutomationEndpoint(name).replace(\"{id}\", encodeURIComponent(id));\n}\n\nexport interface InterfaceCopy {\n sidebarLabel: string;\n commandMenuTitle: string;\n commandMenuDescription: string;\n commandMenuKeywords: string;\n listTitle: string;\n listSubtitle: string;\n detailBackLabel: string;\n editTitle: string;\n}\n\nexport function getInterfaceCopy(): InterfaceCopy {\n const manifest = requireInterface();\n return {\n sidebarLabel: manifest.navigation.sidebar.label,\n commandMenuTitle: manifest.navigation.commandMenu.title,\n commandMenuDescription: manifest.navigation.commandMenu.description,\n commandMenuKeywords: manifest.navigation.commandMenu.keywords,\n listTitle: manifest.pages.list.title,\n listSubtitle: manifest.pages.list.subtitle,\n detailBackLabel: manifest.pages.detail.backLabel,\n editTitle: manifest.pages.edit.title,\n };\n}\n\nexport interface AttributeSpec {\n present: boolean;\n label: string;\n /** Null when the manifest states no help text for the attribute. */\n help: string | null;\n required: boolean;\n min: number | null;\n max: number | null;\n}\n\n/** An attribute the manifest does not declare is not offered at all. */\nconst ABSENT_ATTRIBUTE: AttributeSpec = {\n present: false,\n label: \"\",\n help: null,\n required: false,\n min: null,\n max: null,\n};\n\nexport function getAttributeSpec(name: AutomationAttributeName): AttributeSpec {\n const attribute = requireInterface().attributes[name];\n if (!attribute) return ABSENT_ATTRIBUTE;\n return {\n present: true,\n label: attribute.label,\n help: attribute.help ?? null,\n required: attribute.required,\n min: attribute.constraints?.min ?? null,\n max: attribute.constraints?.max ?? null,\n };\n}\n\nexport function getImportExportSpec(): InterfaceImportExport {\n return requireInterface().importExport;\n}\n\nexport function getAutomationsDocsUrl(): string {\n return requireInterface().docsUrl;\n}\n\nexport function getFeaturedAutomationIds(): readonly string[] {\n return requireInterface().featuredAutomationIds;\n}\n\nexport function getResponderIntegrationIds(): readonly string[] {\n return requireInterface().responderIntegrationIds;\n}\n\nexport interface SubPageNavSpec {\n page: InterfaceSubPageId;\n /** The page's route, resolved through the host's route table. */\n to: string;\n label: string;\n icon: InterfaceIconSlug;\n}\n\n/**\n * The sub-page navigation, or null when the manifest does not declare the\n * sub-page surface.\n */\nexport function getSubPagesSpec(): SubPageNavSpec[] | null {\n const subPages = ADMITTED?.navigation.subPages;\n if (!subPages) return null;\n return subPages.map((item) => ({\n page: item.page,\n to:\n item.page === \"templates\"\n ? automationTemplatesPath()\n : automationListPath(),\n label: item.label,\n icon: item.icon,\n }));\n}\n\nexport interface DashboardSpec {\n overview: InterfaceOverview;\n filters: InterfaceDashboardFilter[];\n sort: InterfaceDashboardSort;\n insights: InterfaceListInsights;\n}\n\n/**\n * The list page's dashboard composition, or null when the manifest does not\n * declare it. Admission accepts the sub-page surface whole or not at all, so\n * these four are present together.\n */\nexport function getDashboardSpec(): DashboardSpec | null {\n const list = ADMITTED?.pages.list;\n if (!list?.overview || !list.filters || !list.sort || !list.insights) {\n return null;\n }\n return {\n overview: list.overview,\n filters: list.filters,\n sort: list.sort,\n insights: list.insights,\n };\n}\n\n/** The templates page identity, or null when the manifest does not declare it. */\nexport function getTemplatesPageSpec(): InterfaceTemplatesPage | null {\n return ADMITTED?.pages.templates ?? null;\n}\n"],"mappings":";;;;AAqCA,IAAM,IAAiB;CACrB,MAAM;CACN,OAAO;CACP,QAAQ;CACR,WAAW;AACb;AAUA,SAAS,EAAS,GAAkD;CAClE,OAAO,OAAO,KAAU,cAAY,KAAkB,CAAC,MAAM,QAAQ,CAAK;AAC5E;AAEA,SAAS,IAAqC;CAC5C,OAAO,IAAI,IACR,EAA0C,SAAS,MAClD,EAAS,CAAK,KAAK,OAAO,EAAM,MAAO,WAAW,CAAC,EAAM,EAAE,IAAI,CAAC,CAClE,CACF;AACF;AAEA,SAAS,EAAuB,GAA8C;CAC5E,IAAI,MAAc,KAAA,GAAW,OAAO;CAEpC,IAAM,IAAS,EAA0B,GAAW;EAClD,YAAY,EAAc;EAC1B,eAAe;CACjB,CAAC;CAUD,OATK,EAAO,QASL,KANL,QAAQ,KACN,+CACA,EAAO,OAAO,KAAK,IAAI,CACzB,GACO;AAGX;AAEA,IAAM,IAAW,EAAuB,CAA8B;AAMtE,SAAgB,IAAkC;CAChD,OAAO,MAAa;AACtB;AAOA,SAAS,IAAsC;CAC7C,IAAI,CAAC,GACH,MAAU,MACR,yFACF;CAEF,OAAO;AACT;AAEA,SAAS,EAAqB,GAAiB,GAAoB;CACjE,OAAO,EAAQ,QAAQ,iBAAiB,mBAAmB,CAAE,CAAC;AAChE;AAEA,SAAgB,IAA6B;CAC3C,OAAO,EAAe;AACxB;AAEA,SAAgB,EAAoB,GAAoB;CACtD,OAAO,EAAqB,EAAe,OAAO,CAAE;AACtD;AAeA,SAAgB,EAAmB,GAAuB;CACxD,OACE,MAAS,EAAe,QAAQ,EAAK,WAAW,GAAG,EAAe,KAAK,EAAE;AAE7E;AAOA,SAAgB,EAAsB,GAAqC;CACzE,OAAO,EAAiB,EAAE,UAAU,MAAS;AAC/C;AAGA,SAAgB,EACd,GACA,GACQ;CACR,OAAO,EAAsB,CAAI,EAAE,QAAQ,QAAQ,mBAAmB,CAAE,CAAC;AAC3E;AAaA,SAAgB,IAAkC;CAChD,IAAM,IAAW,EAAiB;CAClC,OAAO;EACL,cAAc,EAAS,WAAW,QAAQ;EAC1C,kBAAkB,EAAS,WAAW,YAAY;EAClD,wBAAwB,EAAS,WAAW,YAAY;EACxD,qBAAqB,EAAS,WAAW,YAAY;EACrD,WAAW,EAAS,MAAM,KAAK;EAC/B,cAAc,EAAS,MAAM,KAAK;EAClC,iBAAiB,EAAS,MAAM,OAAO;EACvC,WAAW,EAAS,MAAM,KAAK;CACjC;AACF;AAmCA,SAAgB,IAA6C;CAC3D,OAAO,EAAiB,EAAE;AAC5B;AAEA,SAAgB,IAAgC;CAC9C,OAAO,EAAiB,EAAE;AAC5B;AAEA,SAAgB,IAA8C;CAC5D,OAAO,EAAiB,EAAE;AAC5B;AAEA,SAAgB,IAAgD;CAC9D,OAAO,EAAiB,EAAE;AAC5B"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../_virtual/_rolldown/runtime.cjs"),require("../utils/automation-catalog.cjs");
|
|
1
|
+
require("../_virtual/_rolldown/runtime.cjs"),require("../i18n/index.cjs"),require("../utils/automation-catalog.cjs");const e=require("./automation-interface.cjs");function t(t){return t&&i(t)?r(`createBundle`):e.getAutomationEndpoint(`createPrompt`)}function n(){return r(`uploads`)}function r(t){let n=e.getAutomationEndpoint(t);if(!n)throw Error(`The published automation interface declares no '${t}' endpoint, so this deployment cannot create an automation from a script bundle.`);return n}function i(e){return e.setup.mode===`direct`&&e.setup.bundle!==void 0}exports.automationCreateEndpoint=t,exports.automationUploadEndpoint=n;
|
|
2
2
|
//# sourceMappingURL=automation-setup.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automation-setup.cjs","names":[],"sources":["../../src/manifests/automation-setup.ts"],"sourcesContent":["/**\n * The only module that knows a setup entry configures an *automation*.\n *\n * The published contract states just what varies between entries; everything\n * derivable is the host's to generate. That derivation is here, and nowhere\n * else, so the rest of `src/manifests/` stays about forms rather than about\n * automations.\n *\n * The algorithm mirrors `tests/test_automation_setup.py::_render_payload` in\n * `OpenHands/extensions`, which is the authoritative reference: it produces the\n * request bodies published in that repository's contract fixtures, and those\n * were verified against the live service. The create model is `extra=\"forbid\"`,\n * so any divergence is a hard 422 rather than a dropped field.\n */\n\nimport { findAutomationCommand } from \"#/utils/automation-catalog\";\nimport { getAutomationEndpoint } from \"./automation-interface\";\nimport { collectFields } from \"./manifest-local-validation\";\nimport { interpolateText } from \"./manifest-template\";\nimport type {\n SetupBlock,\n SetupEntry,\n SetupFormValues,\n SetupRequestBody,\n SetupTriggerKind,\n} from \"./types\";\n\n/** The creation endpoint a derived draft would be posted to. */\nexport const AUTOMATION_CREATE_ENDPOINT = getAutomationEndpoint(\"createPrompt\");\n\n/**\n * Trigger properties a form field may fill, per trigger kind. A field under a\n * trigger kind whose name is listed here fills the trigger property of the same\n * name; anything else there, such as a phrase to match, is an input to `filter`.\n */\nconst TRIGGER_PROPERTIES: Record<SetupTriggerKind, readonly string[]> = {\n cron: [\"schedule\", \"timezone\"],\n event: [\"on\"],\n};\n\n/**\n * Repository properties a form field may fill, read the same way\n * {@link TRIGGER_PROPERTIES} is: a field whose name is listed here fills the\n * `repos[]` property of the same name. `url` and `provider` are absent because\n * neither is answered by a field of its own — they come from the repo-picker's\n * value and from its declared provider.\n *\n * These two lists are the only field names the derivation knows; everything\n * else it reads it finds by field type. An entry that wants a base branch in\n * its request therefore has to name that field `ref`.\n */\nconst REPO_PROPERTIES: readonly string[] = [\"ref\"];\n\nconst FORM_PLACEHOLDER_PATTERN = /\\{\\{form\\.([A-Za-z0-9_.]+)\\}\\}/g;\n\n/** The repository input, which supplies `repos` and an event trigger's source. */\nfunction findRepoPickerField(setup: SetupBlock) {\n const match = Object.entries(collectFields(setup)).find(\n ([, field]) => field.type === \"repo-picker\",\n );\n return match ? { name: match[0], field: match[1] } : null;\n}\n\n/** The single trigger kind a direct entry declares, with its fields. */\nfunction getTrigger(setup: SetupBlock) {\n const entries = Object.entries(setup.form.triggers ?? {});\n if (entries.length === 0) return null;\n const [kind, fields] = entries[0];\n return { kind: kind as SetupTriggerKind, fields: fields ?? {} };\n}\n\n/**\n * The create request body these form values produce.\n *\n * No entry declares it: `name` comes from the entry, `repos` from the\n * repo-picker field and its declared provider, and `trigger` from the key and\n * fields under `form.triggers`. Only `prompt` and an event `filter` are\n * declared, because only they cannot be read off the form.\n *\n * Returns null for an assisted entry, which hands setup to a conversation\n * instead of sending a body.\n */\nexport function buildCreatePayload(\n entry: SetupEntry,\n values: SetupFormValues,\n): SetupRequestBody | null {\n const { setup } = entry;\n if (setup.mode !== \"direct\" || !setup.prompt) return null;\n\n const scope = { form: values, automation: entry };\n const repoPicker = findRepoPickerField(setup);\n const repository = repoPicker ? values[repoPicker.name] : undefined;\n\n const payload: SetupRequestBody = {\n name: repository ? `${entry.name} - ${repository}` : entry.name,\n prompt: interpolateText(setup.prompt, scope),\n };\n\n if (repository && repoPicker?.field.provider) {\n const declared = REPO_PROPERTIES.filter((name) => name in values);\n payload.repos = [\n {\n url: repository,\n ...Object.fromEntries(declared.map((name) => [name, values[name]])),\n provider: repoPicker.field.provider,\n },\n ];\n }\n\n const trigger = getTrigger(setup);\n if (trigger) {\n const properties = TRIGGER_PROPERTIES[trigger.kind];\n const declared = Object.keys(trigger.fields).filter((name) =>\n properties.includes(name),\n );\n\n payload.trigger = {\n type: trigger.kind,\n ...Object.fromEntries(declared.map((name) => [name, values[name] ?? \"\"])),\n ...(trigger.kind === \"event\" && {\n source: repoPicker?.field.provider ?? \"\",\n // A filter is optional: an entry that declares none accepts every\n // delivered event, so the key is left off rather than sent empty.\n ...(setup.filter && { filter: interpolateText(setup.filter, scope) }),\n }),\n };\n }\n\n return payload;\n}\n\n/**\n * The preflight body the host sends. The same shape for every entry, so no\n * entry declares it.\n */\nexport function buildPreflightBody(\n entry: SetupEntry,\n values: SetupFormValues,\n): SetupRequestBody | null {\n const draft = buildCreatePayload(entry, values);\n if (!draft) return null;\n\n return {\n automationId: entry.id,\n endpoint: AUTOMATION_CREATE_ENDPOINT,\n draft,\n };\n}\n\n/**\n * What an assisted entry sends into the conversation that finishes setup.\n *\n * The command is not declared either: it lives once, in the owning skill's own\n * `triggers` frontmatter, and the skill defaults to the entry's id. An entry\n * whose skill is invoked by description rather than by command contributes\n * nothing here, and the answers alone open the conversation.\n */\nexport function buildAssistedMessage(\n entry: SetupEntry,\n values: SetupFormValues,\n): string {\n const command = findAutomationCommand(entry);\n const message = entry.setup.message\n ? interpolateText(entry.setup.message, { form: values, automation: entry })\n : \"\";\n\n return [command, message].filter(Boolean).join(\"\\n\\n\");\n}\n\nfunction collectPlaceholderFields(value: string): string[] {\n const names = Array.from(\n value.matchAll(FORM_PLACEHOLDER_PATTERN),\n (match) => match[1],\n );\n return Array.from(new Set(names));\n}\n\n/**\n * Which form fields built each payload path.\n *\n * Preflight and the create endpoint reject a draft by payload path, and the\n * host has to turn that back into a highlighted input. Building the body with\n * each field standing in for its own value recovers the mapping exactly, so an\n * entry does not declare it.\n */\nexport function deriveErrorMap(entry: SetupEntry): Record<string, string[]> {\n const mapping: Record<string, string[]> = {};\n\n const standIns = Object.fromEntries(\n Object.keys(collectFields(entry.setup)).map((name) => [\n name,\n `{{form.${name}}}`,\n ]),\n );\n const template = buildCreatePayload(entry, standIns);\n if (!template) return mapping;\n\n const walk = (node: unknown, path: string): void => {\n if (Array.isArray(node)) {\n node.forEach((item, index) => walk(item, `${path}[${index}]`));\n return;\n }\n if (typeof node === \"object\" && node !== null) {\n Object.entries(node).forEach(([key, item]) =>\n walk(item, path ? `${path}.${key}` : key),\n );\n return;\n }\n if (typeof node === \"string\") {\n const names = collectPlaceholderFields(node);\n if (names.length > 0) mapping[path] = names;\n }\n };\n\n walk(template, \"\");\n return mapping;\n}\n"],"mappings":"wFA4BA,IAAa,sCAA6B,EAAA,sBAAsB,cAAc"}
|
|
1
|
+
{"version":3,"file":"automation-setup.cjs","names":[],"sources":["../../src/manifests/automation-setup.ts"],"sourcesContent":["/**\n * The only module that knows a setup entry configures an *automation*.\n *\n * The published contract states just what varies between entries; everything\n * derivable is the host's to generate. That derivation is here, and nowhere\n * else, so the rest of `src/manifests/` stays about forms rather than about\n * automations.\n *\n * The algorithm mirrors `tests/test_automation_setup.py::_render_payload` in\n * `OpenHands/extensions`, which is the authoritative reference: it produces the\n * request bodies published in that repository's contract fixtures, and those\n * were verified against the live service. The create model is `extra=\"forbid\"`,\n * so any divergence is a hard 422 rather than a dropped field.\n */\n\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { findAutomationCommand } from \"#/utils/automation-catalog\";\nimport { getAutomationEndpoint } from \"./automation-interface\";\nimport {\n collectFields,\n fieldText,\n fieldValues,\n} from \"./manifest-local-validation\";\nimport { interpolateText, interpolateValue } from \"./manifest-template\";\nimport type {\n SetupBlock,\n SetupBundleConfigValue,\n SetupEntry,\n SetupFormValues,\n SetupRequestBody,\n SetupTriggerKind,\n} from \"./types\";\n\n/**\n * The creation endpoint a derived draft would be posted to. Resolved on call\n * rather than at import, because the endpoint is the interface manifest's and\n * this module loads whether or not one was admitted.\n *\n * A bundle entry is created through the raw endpoint, because what it sends is\n * a tarball it uploaded rather than arguments to a preset. Called without an\n * entry - as the import path does - it answers for a prompt.\n */\nexport function automationCreateEndpoint(entry?: SetupEntry): string {\n if (entry && isBundleEntry(entry)) {\n return requireBundleEndpoint(\"createBundle\");\n }\n return getAutomationEndpoint(\"createPrompt\");\n}\n\n/** Where a bundle's tarball is uploaded, before the create call. */\nexport function automationUploadEndpoint(): string {\n return requireBundleEndpoint(\"uploads\");\n}\n\n/** The endpoints a bundle entry cannot be created without. */\nconst BUNDLE_ENDPOINTS = [\"createBundle\", \"uploads\"] as const;\n\n/**\n * An endpoint only a bundle needs. The interface manifest may predate bundles,\n * and the host holds no path of its own to fall back to, so this is where that\n * runs out rather than somewhere deep in a request.\n */\nfunction requireBundleEndpoint(\n name: (typeof BUNDLE_ENDPOINTS)[number],\n): string {\n const path = getAutomationEndpoint(name);\n if (!path) {\n throw new Error(\n `The published automation interface declares no '${name}' endpoint, ` +\n \"so this deployment cannot create an automation from a script bundle.\",\n );\n }\n return path;\n}\n\n/**\n * The endpoints this entry needs that the published interface does not declare.\n *\n * Asked before the form renders rather than discovered at the moment of\n * creating: a pinned package that predates bundles can never answer, and the\n * dialog can say so while nothing has been filled in yet. Empty for every\n * entry that is not a bundle, which needs nothing beyond what the block has\n * always declared.\n */\nexport function missingCreateEndpoints(entry: SetupEntry): string[] {\n if (!isBundleEntry(entry)) return [];\n return BUNDLE_ENDPOINTS.filter((name) => !getAutomationEndpoint(name));\n}\n\n/** Whether this entry ships a script tarball instead of a prompt. */\nexport function isBundleEntry(entry: SetupEntry): boolean {\n return entry.setup.mode === \"direct\" && entry.setup.bundle !== undefined;\n}\n\n/**\n * The `tarball_path` a preflight draft carries.\n *\n * Preflight runs on every field blur and the upload happens once, at submit,\n * so there is no real path to send yet. The service checks this field's scheme\n * at preflight and its ownership only at creation, so a well-formed stand-in\n * validates exactly what preflight is for - the rest of the body - without\n * uploading an archive per keystroke.\n */\nexport const PREFLIGHT_TARBALL_PATH =\n \"oh-internal://uploads/00000000-0000-0000-0000-000000000000\";\n\n/**\n * Trigger properties a form field may fill, per trigger kind. A field under a\n * trigger kind whose name is listed here fills the trigger property of the same\n * name; anything else there, such as a phrase to match, is an input to `filter`.\n */\nconst TRIGGER_PROPERTIES: Record<SetupTriggerKind, readonly string[]> = {\n cron: [\"schedule\", \"timezone\"],\n event: [\"on\"],\n};\n\n/**\n * Repository properties a form field may fill, read the same way\n * {@link TRIGGER_PROPERTIES} is: a field whose name is listed here fills the\n * `repos[]` property of the same name. `url` and `provider` are absent because\n * neither is answered by a field of its own — they come from the repo-picker's\n * value and from its declared provider.\n *\n * These two lists are the only field names the derivation knows; everything\n * else it reads it finds by field type. An entry that wants a base branch in\n * its request therefore has to name that field `ref`.\n */\nconst REPO_PROPERTIES: readonly string[] = [\"ref\"];\n\nconst FORM_PLACEHOLDER_PATTERN = /\\{\\{form\\.([A-Za-z0-9_.]+)\\}\\}/g;\n\n/** The repository input, which supplies `repos` and an event trigger's source. */\nfunction findRepoPickerField(setup: SetupBlock) {\n const match = Object.entries(collectFields(setup)).find(\n ([, field]) => field.type === \"repo-picker\",\n );\n return match ? { name: match[0], field: match[1] } : null;\n}\n\n/** Every repository the form collected, whether the picker takes one or many. */\nfunction repositories(setup: SetupBlock, values: SetupFormValues): string[] {\n const picker = findRepoPickerField(setup);\n return picker ? fieldValues(values[picker.name]) : [];\n}\n\n/**\n * The created automation's name.\n *\n * One repository is worth naming; several are not, so the count stands in\n * rather than a list of names that would not fit.\n */\nfunction deriveName(entry: SetupEntry, values: SetupFormValues): string {\n const repos = repositories(entry.setup, values);\n if (repos.length === 0) return entry.name;\n if (repos.length === 1) return `${entry.name} - ${repos[0]}`;\n // The count is the one word here the host writes rather than reads off the\n // entry, so it is translated. There is no translator to pass in: the\n // derivation runs from a memo, an upload and a test alike.\n const count = i18n.t(I18nKey.SETUP$REPOSITORY_COUNT, {\n total: repos.length,\n });\n return `${entry.name} - ${count}`;\n}\n\n/** The single trigger kind a direct entry declares, with its fields. */\nfunction getTrigger(setup: SetupBlock) {\n const entries = Object.entries(setup.form.triggers ?? {});\n if (entries.length === 0) return null;\n const [kind, fields] = entries[0];\n return { kind: kind as SetupTriggerKind, fields: fields ?? {} };\n}\n\n/**\n * The create request body these form values produce.\n *\n * No entry declares it: `name` comes from the entry, `repos` from the\n * repo-picker field and its declared provider, and `trigger` from the key and\n * fields under `form.triggers`. Only `prompt` and an event `filter` are\n * declared, because only they cannot be read off the form.\n *\n * Returns null for an assisted entry, which hands setup to a conversation\n * instead of sending a body.\n */\nexport function buildCreatePayload(\n entry: SetupEntry,\n values: SetupFormValues,\n /** Bundle entries only: what the upload returned. */\n tarballPath: string = PREFLIGHT_TARBALL_PATH,\n): SetupRequestBody | null {\n const { setup } = entry;\n if (setup.mode !== \"direct\") return null;\n if (setup.bundle) return buildBundlePayload(entry, values, tarballPath);\n if (!setup.prompt) return null;\n\n const scope = { form: values, automation: entry };\n const repoPicker = findRepoPickerField(setup);\n const repos = repositories(setup, values);\n\n const payload: SetupRequestBody = {\n name: deriveName(entry, values),\n prompt: interpolateText(setup.prompt, scope),\n };\n\n if (repos.length > 0 && repoPicker?.field.provider) {\n const declared = REPO_PROPERTIES.filter((name) => name in values);\n payload.repos = repos.map((url) => ({\n url,\n ...Object.fromEntries(\n declared.map((name) => [name, fieldText(values[name])]),\n ),\n provider: repoPicker.field.provider as string,\n }));\n }\n\n // A filter is optional: an entry that declares none accepts every delivered\n // event, so the key is left off rather than sent empty.\n const trigger = buildTrigger(entry, values);\n if (trigger) payload.trigger = trigger;\n\n const template = buildTemplate(entry, values);\n if (template) payload.template = template;\n\n return payload;\n}\n\n/**\n * The `template` provenance a prompt entry sends, or undefined for one that\n * publishes no version.\n *\n * It is what lets the service recognise a second setup of the same entry as\n * the automation it already holds. The bundle path derives the same block from\n * the config the bundle declares; a prompt entry declares none, so the answer\n * to \"what was this created from\" is the form as submitted.\n */\nfunction buildTemplate(\n entry: SetupEntry,\n values: SetupFormValues,\n): SetupRequestBody | undefined {\n if (!entry.version) return undefined;\n return {\n id: entry.id,\n version: entry.version,\n config: { ...values },\n };\n}\n\n/**\n * The `trigger` object, read off the key and fields under `form.triggers`.\n *\n * Identical for both kinds of direct entry: only the create endpoint and what\n * the automation is told to do differ between a prompt and a bundle.\n */\nfunction buildTrigger(\n entry: SetupEntry,\n values: SetupFormValues,\n): SetupRequestBody | undefined {\n const trigger = getTrigger(entry.setup);\n if (!trigger) return undefined;\n\n const properties = TRIGGER_PROPERTIES[trigger.kind];\n const declared = Object.keys(trigger.fields).filter((name) =>\n properties.includes(name),\n );\n const repoPicker = findRepoPickerField(entry.setup);\n\n return {\n type: trigger.kind,\n ...Object.fromEntries(\n declared.map((name) => [name, fieldText(values[name])]),\n ),\n ...(trigger.kind === \"event\" && {\n source: repoPicker?.field.provider ?? \"\",\n ...(entry.setup.filter && {\n filter: interpolateText(entry.setup.filter, {\n form: values,\n automation: entry,\n }),\n }),\n }),\n };\n}\n\n/**\n * The raw create body a bundle entry produces.\n *\n * `tarball_path` is the one value neither declared nor derived: the host packs\n * and uploads the bundle first, and creates from what came back. `template` is\n * the provenance that makes enabling the same entry twice return the\n * automation that already exists rather than a second one.\n *\n * There is no `repos`: the raw endpoint has no such field, and a bundle's\n * script fetches what it needs itself.\n */\nfunction buildBundlePayload(\n entry: SetupEntry,\n values: SetupFormValues,\n tarballPath: string,\n): SetupRequestBody {\n const bundle = entry.setup.bundle!;\n const scope = { form: values, automation: entry };\n\n const payload: SetupRequestBody = {\n name: deriveName(entry, values),\n };\n\n const trigger = buildTrigger(entry, values);\n if (trigger) payload.trigger = trigger;\n\n payload.tarball_path = tarballPath;\n payload.entrypoint = bundle.entrypoint;\n if (bundle.setupScript) payload.setup_script_path = bundle.setupScript;\n if (bundle.timeout !== undefined) payload.timeout = bundle.timeout;\n payload.template = {\n id: entry.id,\n version: bundle.version,\n config: interpolateConfig(bundle.config, scope) as SetupRequestBody,\n };\n\n return payload;\n}\n\n/**\n * Placeholder substitution over the config tree. Only string leaves are\n * templated; a number, a boolean or a null is written through as itself, so an\n * entry can state a value the script reads as the type it expects.\n */\nfunction interpolateConfig(\n node: SetupBundleConfigValue,\n scope: Parameters<typeof interpolateText>[1],\n): SetupBundleConfigValue {\n if (typeof node === \"string\") {\n return interpolateValue(node, scope);\n }\n if (Array.isArray(node)) {\n return node.map((item) => interpolateConfig(item, scope));\n }\n if (typeof node === \"object\" && node !== null) {\n return Object.fromEntries(\n Object.entries(node).map(([key, value]) => [\n key,\n interpolateConfig(value, scope),\n ]),\n );\n }\n return node;\n}\n\n/**\n * The preflight body the host sends. The same shape for every entry, so no\n * entry declares it.\n */\nexport function buildPreflightBody(\n entry: SetupEntry,\n values: SetupFormValues,\n): SetupRequestBody | null {\n const draft = buildCreatePayload(entry, values);\n if (!draft) return null;\n\n return {\n automationId: entry.id,\n endpoint: automationCreateEndpoint(entry),\n draft,\n };\n}\n\n/**\n * What an assisted entry sends into the conversation that finishes setup.\n *\n * The command is not declared either: it lives once, in the owning skill's own\n * `triggers` frontmatter, and the skill defaults to the entry's id. An entry\n * whose skill is invoked by description rather than by command contributes\n * nothing here, and the answers alone open the conversation.\n */\nexport function buildAssistedMessage(\n entry: SetupEntry,\n values: SetupFormValues,\n): string {\n const command = findAutomationCommand(entry);\n const message = entry.setup.message\n ? interpolateText(entry.setup.message, { form: values, automation: entry })\n : \"\";\n\n return [command, message].filter(Boolean).join(\"\\n\\n\");\n}\n\nfunction collectPlaceholderFields(value: string): string[] {\n const names = Array.from(\n value.matchAll(FORM_PLACEHOLDER_PATTERN),\n (match) => match[1],\n );\n return Array.from(new Set(names));\n}\n\n/**\n * Which form fields built each payload path.\n *\n * Preflight and the create endpoint reject a draft by payload path, and the\n * host has to turn that back into a highlighted input. Building the body with\n * each field standing in for its own value recovers the mapping exactly, so an\n * entry does not declare it.\n */\nexport function deriveErrorMap(entry: SetupEntry): Record<string, string[]> {\n const mapping: Record<string, string[]> = {};\n\n const standIns = Object.fromEntries(\n Object.keys(collectFields(entry.setup)).map((name) => [\n name,\n `{{form.${name}}}`,\n ]),\n );\n const template = buildCreatePayload(entry, standIns);\n if (!template) return mapping;\n\n const walk = (node: unknown, path: string): void => {\n if (Array.isArray(node)) {\n node.forEach((item, index) => walk(item, `${path}[${index}]`));\n return;\n }\n if (typeof node === \"object\" && node !== null) {\n Object.entries(node).forEach(([key, item]) =>\n walk(item, path ? `${path}.${key}` : key),\n );\n return;\n }\n if (typeof node === \"string\") {\n const names = collectPlaceholderFields(node);\n if (names.length > 0) mapping[path] = names;\n }\n };\n\n walk(template, \"\");\n return mapping;\n}\n"],"mappings":"mKA2CA,SAAgB,EAAyB,EAA4B,CAInE,OAHI,GAAS,EAAc,CAAK,EACvB,EAAsB,cAAc,EAEtC,EAAA,sBAAsB,cAAc,CAC7C,CAGA,SAAgB,GAAmC,CACjD,OAAO,EAAsB,SAAS,CACxC,CAUA,SAAS,EACP,EACQ,CACR,IAAM,EAAO,EAAA,sBAAsB,CAAI,EACvC,GAAI,CAAC,EACH,MAAU,MACR,mDAAmD,EAAK,iFAE1D,EAEF,OAAO,CACT,CAiBA,SAAgB,EAAc,EAA4B,CACxD,OAAO,EAAM,MAAM,OAAS,UAAY,EAAM,MAAM,SAAW,IAAA,EACjE"}
|
|
@@ -13,8 +13,40 @@
|
|
|
13
13
|
* so any divergence is a hard 422 rather than a dropped field.
|
|
14
14
|
*/
|
|
15
15
|
import type { SetupEntry, SetupFormValues, SetupRequestBody } from "./types";
|
|
16
|
-
/**
|
|
17
|
-
|
|
16
|
+
/**
|
|
17
|
+
* The creation endpoint a derived draft would be posted to. Resolved on call
|
|
18
|
+
* rather than at import, because the endpoint is the interface manifest's and
|
|
19
|
+
* this module loads whether or not one was admitted.
|
|
20
|
+
*
|
|
21
|
+
* A bundle entry is created through the raw endpoint, because what it sends is
|
|
22
|
+
* a tarball it uploaded rather than arguments to a preset. Called without an
|
|
23
|
+
* entry - as the import path does - it answers for a prompt.
|
|
24
|
+
*/
|
|
25
|
+
export declare function automationCreateEndpoint(entry?: SetupEntry): string;
|
|
26
|
+
/** Where a bundle's tarball is uploaded, before the create call. */
|
|
27
|
+
export declare function automationUploadEndpoint(): string;
|
|
28
|
+
/**
|
|
29
|
+
* The endpoints this entry needs that the published interface does not declare.
|
|
30
|
+
*
|
|
31
|
+
* Asked before the form renders rather than discovered at the moment of
|
|
32
|
+
* creating: a pinned package that predates bundles can never answer, and the
|
|
33
|
+
* dialog can say so while nothing has been filled in yet. Empty for every
|
|
34
|
+
* entry that is not a bundle, which needs nothing beyond what the block has
|
|
35
|
+
* always declared.
|
|
36
|
+
*/
|
|
37
|
+
export declare function missingCreateEndpoints(entry: SetupEntry): string[];
|
|
38
|
+
/** Whether this entry ships a script tarball instead of a prompt. */
|
|
39
|
+
export declare function isBundleEntry(entry: SetupEntry): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* The `tarball_path` a preflight draft carries.
|
|
42
|
+
*
|
|
43
|
+
* Preflight runs on every field blur and the upload happens once, at submit,
|
|
44
|
+
* so there is no real path to send yet. The service checks this field's scheme
|
|
45
|
+
* at preflight and its ownership only at creation, so a well-formed stand-in
|
|
46
|
+
* validates exactly what preflight is for - the rest of the body - without
|
|
47
|
+
* uploading an archive per keystroke.
|
|
48
|
+
*/
|
|
49
|
+
export declare const PREFLIGHT_TARBALL_PATH = "oh-internal://uploads/00000000-0000-0000-0000-000000000000";
|
|
18
50
|
/**
|
|
19
51
|
* The create request body these form values produce.
|
|
20
52
|
*
|
|
@@ -26,7 +58,9 @@ export declare const AUTOMATION_CREATE_ENDPOINT: string;
|
|
|
26
58
|
* Returns null for an assisted entry, which hands setup to a conversation
|
|
27
59
|
* instead of sending a body.
|
|
28
60
|
*/
|
|
29
|
-
export declare function buildCreatePayload(entry: SetupEntry, values: SetupFormValues
|
|
61
|
+
export declare function buildCreatePayload(entry: SetupEntry, values: SetupFormValues,
|
|
62
|
+
/** Bundle entries only: what the upload returned. */
|
|
63
|
+
tarballPath?: string): SetupRequestBody | null;
|
|
30
64
|
/**
|
|
31
65
|
* The preflight body the host sends. The same shape for every entry, so no
|
|
32
66
|
* entry declares it.
|
|
@@ -1,8 +1,22 @@
|
|
|
1
|
+
import "../i18n/index.js";
|
|
1
2
|
import "../utils/automation-catalog.js";
|
|
2
3
|
import { getAutomationEndpoint as e } from "./automation-interface.js";
|
|
3
4
|
//#region src/manifests/automation-setup.ts
|
|
4
|
-
|
|
5
|
+
function t(t) {
|
|
6
|
+
return t && i(t) ? r("createBundle") : e("createPrompt");
|
|
7
|
+
}
|
|
8
|
+
function n() {
|
|
9
|
+
return r("uploads");
|
|
10
|
+
}
|
|
11
|
+
function r(t) {
|
|
12
|
+
let n = e(t);
|
|
13
|
+
if (!n) throw Error(`The published automation interface declares no '${t}' endpoint, so this deployment cannot create an automation from a script bundle.`);
|
|
14
|
+
return n;
|
|
15
|
+
}
|
|
16
|
+
function i(e) {
|
|
17
|
+
return e.setup.mode === "direct" && e.setup.bundle !== void 0;
|
|
18
|
+
}
|
|
5
19
|
//#endregion
|
|
6
|
-
export { t as
|
|
20
|
+
export { t as automationCreateEndpoint, n as automationUploadEndpoint };
|
|
7
21
|
|
|
8
22
|
//# sourceMappingURL=automation-setup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automation-setup.js","names":[],"sources":["../../src/manifests/automation-setup.ts"],"sourcesContent":["/**\n * The only module that knows a setup entry configures an *automation*.\n *\n * The published contract states just what varies between entries; everything\n * derivable is the host's to generate. That derivation is here, and nowhere\n * else, so the rest of `src/manifests/` stays about forms rather than about\n * automations.\n *\n * The algorithm mirrors `tests/test_automation_setup.py::_render_payload` in\n * `OpenHands/extensions`, which is the authoritative reference: it produces the\n * request bodies published in that repository's contract fixtures, and those\n * were verified against the live service. The create model is `extra=\"forbid\"`,\n * so any divergence is a hard 422 rather than a dropped field.\n */\n\nimport { findAutomationCommand } from \"#/utils/automation-catalog\";\nimport { getAutomationEndpoint } from \"./automation-interface\";\nimport { collectFields } from \"./manifest-local-validation\";\nimport { interpolateText } from \"./manifest-template\";\nimport type {\n SetupBlock,\n SetupEntry,\n SetupFormValues,\n SetupRequestBody,\n SetupTriggerKind,\n} from \"./types\";\n\n/** The creation endpoint a derived draft would be posted to. */\nexport const AUTOMATION_CREATE_ENDPOINT = getAutomationEndpoint(\"createPrompt\");\n\n/**\n * Trigger properties a form field may fill, per trigger kind. A field under a\n * trigger kind whose name is listed here fills the trigger property of the same\n * name; anything else there, such as a phrase to match, is an input to `filter`.\n */\nconst TRIGGER_PROPERTIES: Record<SetupTriggerKind, readonly string[]> = {\n cron: [\"schedule\", \"timezone\"],\n event: [\"on\"],\n};\n\n/**\n * Repository properties a form field may fill, read the same way\n * {@link TRIGGER_PROPERTIES} is: a field whose name is listed here fills the\n * `repos[]` property of the same name. `url` and `provider` are absent because\n * neither is answered by a field of its own — they come from the repo-picker's\n * value and from its declared provider.\n *\n * These two lists are the only field names the derivation knows; everything\n * else it reads it finds by field type. An entry that wants a base branch in\n * its request therefore has to name that field `ref`.\n */\nconst REPO_PROPERTIES: readonly string[] = [\"ref\"];\n\nconst FORM_PLACEHOLDER_PATTERN = /\\{\\{form\\.([A-Za-z0-9_.]+)\\}\\}/g;\n\n/** The repository input, which supplies `repos` and an event trigger's source. */\nfunction findRepoPickerField(setup: SetupBlock) {\n const match = Object.entries(collectFields(setup)).find(\n ([, field]) => field.type === \"repo-picker\",\n );\n return match ? { name: match[0], field: match[1] } : null;\n}\n\n/** The single trigger kind a direct entry declares, with its fields. */\nfunction getTrigger(setup: SetupBlock) {\n const entries = Object.entries(setup.form.triggers ?? {});\n if (entries.length === 0) return null;\n const [kind, fields] = entries[0];\n return { kind: kind as SetupTriggerKind, fields: fields ?? {} };\n}\n\n/**\n * The create request body these form values produce.\n *\n * No entry declares it: `name` comes from the entry, `repos` from the\n * repo-picker field and its declared provider, and `trigger` from the key and\n * fields under `form.triggers`. Only `prompt` and an event `filter` are\n * declared, because only they cannot be read off the form.\n *\n * Returns null for an assisted entry, which hands setup to a conversation\n * instead of sending a body.\n */\nexport function buildCreatePayload(\n entry: SetupEntry,\n values: SetupFormValues,\n): SetupRequestBody | null {\n const { setup } = entry;\n if (setup.mode !== \"direct\" || !setup.prompt) return null;\n\n const scope = { form: values, automation: entry };\n const repoPicker = findRepoPickerField(setup);\n const repository = repoPicker ? values[repoPicker.name] : undefined;\n\n const payload: SetupRequestBody = {\n name: repository ? `${entry.name} - ${repository}` : entry.name,\n prompt: interpolateText(setup.prompt, scope),\n };\n\n if (repository && repoPicker?.field.provider) {\n const declared = REPO_PROPERTIES.filter((name) => name in values);\n payload.repos = [\n {\n url: repository,\n ...Object.fromEntries(declared.map((name) => [name, values[name]])),\n provider: repoPicker.field.provider,\n },\n ];\n }\n\n const trigger = getTrigger(setup);\n if (trigger) {\n const properties = TRIGGER_PROPERTIES[trigger.kind];\n const declared = Object.keys(trigger.fields).filter((name) =>\n properties.includes(name),\n );\n\n payload.trigger = {\n type: trigger.kind,\n ...Object.fromEntries(declared.map((name) => [name, values[name] ?? \"\"])),\n ...(trigger.kind === \"event\" && {\n source: repoPicker?.field.provider ?? \"\",\n // A filter is optional: an entry that declares none accepts every\n // delivered event, so the key is left off rather than sent empty.\n ...(setup.filter && { filter: interpolateText(setup.filter, scope) }),\n }),\n };\n }\n\n return payload;\n}\n\n/**\n * The preflight body the host sends. The same shape for every entry, so no\n * entry declares it.\n */\nexport function buildPreflightBody(\n entry: SetupEntry,\n values: SetupFormValues,\n): SetupRequestBody | null {\n const draft = buildCreatePayload(entry, values);\n if (!draft) return null;\n\n return {\n automationId: entry.id,\n endpoint: AUTOMATION_CREATE_ENDPOINT,\n draft,\n };\n}\n\n/**\n * What an assisted entry sends into the conversation that finishes setup.\n *\n * The command is not declared either: it lives once, in the owning skill's own\n * `triggers` frontmatter, and the skill defaults to the entry's id. An entry\n * whose skill is invoked by description rather than by command contributes\n * nothing here, and the answers alone open the conversation.\n */\nexport function buildAssistedMessage(\n entry: SetupEntry,\n values: SetupFormValues,\n): string {\n const command = findAutomationCommand(entry);\n const message = entry.setup.message\n ? interpolateText(entry.setup.message, { form: values, automation: entry })\n : \"\";\n\n return [command, message].filter(Boolean).join(\"\\n\\n\");\n}\n\nfunction collectPlaceholderFields(value: string): string[] {\n const names = Array.from(\n value.matchAll(FORM_PLACEHOLDER_PATTERN),\n (match) => match[1],\n );\n return Array.from(new Set(names));\n}\n\n/**\n * Which form fields built each payload path.\n *\n * Preflight and the create endpoint reject a draft by payload path, and the\n * host has to turn that back into a highlighted input. Building the body with\n * each field standing in for its own value recovers the mapping exactly, so an\n * entry does not declare it.\n */\nexport function deriveErrorMap(entry: SetupEntry): Record<string, string[]> {\n const mapping: Record<string, string[]> = {};\n\n const standIns = Object.fromEntries(\n Object.keys(collectFields(entry.setup)).map((name) => [\n name,\n `{{form.${name}}}`,\n ]),\n );\n const template = buildCreatePayload(entry, standIns);\n if (!template) return mapping;\n\n const walk = (node: unknown, path: string): void => {\n if (Array.isArray(node)) {\n node.forEach((item, index) => walk(item, `${path}[${index}]`));\n return;\n }\n if (typeof node === \"object\" && node !== null) {\n Object.entries(node).forEach(([key, item]) =>\n walk(item, path ? `${path}.${key}` : key),\n );\n return;\n }\n if (typeof node === \"string\") {\n const names = collectPlaceholderFields(node);\n if (names.length > 0) mapping[path] = names;\n }\n };\n\n walk(template, \"\");\n return mapping;\n}\n"],"mappings":";;;AA4BA,IAAa,IAA6B,EAAsB,cAAc"}
|
|
1
|
+
{"version":3,"file":"automation-setup.js","names":[],"sources":["../../src/manifests/automation-setup.ts"],"sourcesContent":["/**\n * The only module that knows a setup entry configures an *automation*.\n *\n * The published contract states just what varies between entries; everything\n * derivable is the host's to generate. That derivation is here, and nowhere\n * else, so the rest of `src/manifests/` stays about forms rather than about\n * automations.\n *\n * The algorithm mirrors `tests/test_automation_setup.py::_render_payload` in\n * `OpenHands/extensions`, which is the authoritative reference: it produces the\n * request bodies published in that repository's contract fixtures, and those\n * were verified against the live service. The create model is `extra=\"forbid\"`,\n * so any divergence is a hard 422 rather than a dropped field.\n */\n\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport { findAutomationCommand } from \"#/utils/automation-catalog\";\nimport { getAutomationEndpoint } from \"./automation-interface\";\nimport {\n collectFields,\n fieldText,\n fieldValues,\n} from \"./manifest-local-validation\";\nimport { interpolateText, interpolateValue } from \"./manifest-template\";\nimport type {\n SetupBlock,\n SetupBundleConfigValue,\n SetupEntry,\n SetupFormValues,\n SetupRequestBody,\n SetupTriggerKind,\n} from \"./types\";\n\n/**\n * The creation endpoint a derived draft would be posted to. Resolved on call\n * rather than at import, because the endpoint is the interface manifest's and\n * this module loads whether or not one was admitted.\n *\n * A bundle entry is created through the raw endpoint, because what it sends is\n * a tarball it uploaded rather than arguments to a preset. Called without an\n * entry - as the import path does - it answers for a prompt.\n */\nexport function automationCreateEndpoint(entry?: SetupEntry): string {\n if (entry && isBundleEntry(entry)) {\n return requireBundleEndpoint(\"createBundle\");\n }\n return getAutomationEndpoint(\"createPrompt\");\n}\n\n/** Where a bundle's tarball is uploaded, before the create call. */\nexport function automationUploadEndpoint(): string {\n return requireBundleEndpoint(\"uploads\");\n}\n\n/** The endpoints a bundle entry cannot be created without. */\nconst BUNDLE_ENDPOINTS = [\"createBundle\", \"uploads\"] as const;\n\n/**\n * An endpoint only a bundle needs. The interface manifest may predate bundles,\n * and the host holds no path of its own to fall back to, so this is where that\n * runs out rather than somewhere deep in a request.\n */\nfunction requireBundleEndpoint(\n name: (typeof BUNDLE_ENDPOINTS)[number],\n): string {\n const path = getAutomationEndpoint(name);\n if (!path) {\n throw new Error(\n `The published automation interface declares no '${name}' endpoint, ` +\n \"so this deployment cannot create an automation from a script bundle.\",\n );\n }\n return path;\n}\n\n/**\n * The endpoints this entry needs that the published interface does not declare.\n *\n * Asked before the form renders rather than discovered at the moment of\n * creating: a pinned package that predates bundles can never answer, and the\n * dialog can say so while nothing has been filled in yet. Empty for every\n * entry that is not a bundle, which needs nothing beyond what the block has\n * always declared.\n */\nexport function missingCreateEndpoints(entry: SetupEntry): string[] {\n if (!isBundleEntry(entry)) return [];\n return BUNDLE_ENDPOINTS.filter((name) => !getAutomationEndpoint(name));\n}\n\n/** Whether this entry ships a script tarball instead of a prompt. */\nexport function isBundleEntry(entry: SetupEntry): boolean {\n return entry.setup.mode === \"direct\" && entry.setup.bundle !== undefined;\n}\n\n/**\n * The `tarball_path` a preflight draft carries.\n *\n * Preflight runs on every field blur and the upload happens once, at submit,\n * so there is no real path to send yet. The service checks this field's scheme\n * at preflight and its ownership only at creation, so a well-formed stand-in\n * validates exactly what preflight is for - the rest of the body - without\n * uploading an archive per keystroke.\n */\nexport const PREFLIGHT_TARBALL_PATH =\n \"oh-internal://uploads/00000000-0000-0000-0000-000000000000\";\n\n/**\n * Trigger properties a form field may fill, per trigger kind. A field under a\n * trigger kind whose name is listed here fills the trigger property of the same\n * name; anything else there, such as a phrase to match, is an input to `filter`.\n */\nconst TRIGGER_PROPERTIES: Record<SetupTriggerKind, readonly string[]> = {\n cron: [\"schedule\", \"timezone\"],\n event: [\"on\"],\n};\n\n/**\n * Repository properties a form field may fill, read the same way\n * {@link TRIGGER_PROPERTIES} is: a field whose name is listed here fills the\n * `repos[]` property of the same name. `url` and `provider` are absent because\n * neither is answered by a field of its own — they come from the repo-picker's\n * value and from its declared provider.\n *\n * These two lists are the only field names the derivation knows; everything\n * else it reads it finds by field type. An entry that wants a base branch in\n * its request therefore has to name that field `ref`.\n */\nconst REPO_PROPERTIES: readonly string[] = [\"ref\"];\n\nconst FORM_PLACEHOLDER_PATTERN = /\\{\\{form\\.([A-Za-z0-9_.]+)\\}\\}/g;\n\n/** The repository input, which supplies `repos` and an event trigger's source. */\nfunction findRepoPickerField(setup: SetupBlock) {\n const match = Object.entries(collectFields(setup)).find(\n ([, field]) => field.type === \"repo-picker\",\n );\n return match ? { name: match[0], field: match[1] } : null;\n}\n\n/** Every repository the form collected, whether the picker takes one or many. */\nfunction repositories(setup: SetupBlock, values: SetupFormValues): string[] {\n const picker = findRepoPickerField(setup);\n return picker ? fieldValues(values[picker.name]) : [];\n}\n\n/**\n * The created automation's name.\n *\n * One repository is worth naming; several are not, so the count stands in\n * rather than a list of names that would not fit.\n */\nfunction deriveName(entry: SetupEntry, values: SetupFormValues): string {\n const repos = repositories(entry.setup, values);\n if (repos.length === 0) return entry.name;\n if (repos.length === 1) return `${entry.name} - ${repos[0]}`;\n // The count is the one word here the host writes rather than reads off the\n // entry, so it is translated. There is no translator to pass in: the\n // derivation runs from a memo, an upload and a test alike.\n const count = i18n.t(I18nKey.SETUP$REPOSITORY_COUNT, {\n total: repos.length,\n });\n return `${entry.name} - ${count}`;\n}\n\n/** The single trigger kind a direct entry declares, with its fields. */\nfunction getTrigger(setup: SetupBlock) {\n const entries = Object.entries(setup.form.triggers ?? {});\n if (entries.length === 0) return null;\n const [kind, fields] = entries[0];\n return { kind: kind as SetupTriggerKind, fields: fields ?? {} };\n}\n\n/**\n * The create request body these form values produce.\n *\n * No entry declares it: `name` comes from the entry, `repos` from the\n * repo-picker field and its declared provider, and `trigger` from the key and\n * fields under `form.triggers`. Only `prompt` and an event `filter` are\n * declared, because only they cannot be read off the form.\n *\n * Returns null for an assisted entry, which hands setup to a conversation\n * instead of sending a body.\n */\nexport function buildCreatePayload(\n entry: SetupEntry,\n values: SetupFormValues,\n /** Bundle entries only: what the upload returned. */\n tarballPath: string = PREFLIGHT_TARBALL_PATH,\n): SetupRequestBody | null {\n const { setup } = entry;\n if (setup.mode !== \"direct\") return null;\n if (setup.bundle) return buildBundlePayload(entry, values, tarballPath);\n if (!setup.prompt) return null;\n\n const scope = { form: values, automation: entry };\n const repoPicker = findRepoPickerField(setup);\n const repos = repositories(setup, values);\n\n const payload: SetupRequestBody = {\n name: deriveName(entry, values),\n prompt: interpolateText(setup.prompt, scope),\n };\n\n if (repos.length > 0 && repoPicker?.field.provider) {\n const declared = REPO_PROPERTIES.filter((name) => name in values);\n payload.repos = repos.map((url) => ({\n url,\n ...Object.fromEntries(\n declared.map((name) => [name, fieldText(values[name])]),\n ),\n provider: repoPicker.field.provider as string,\n }));\n }\n\n // A filter is optional: an entry that declares none accepts every delivered\n // event, so the key is left off rather than sent empty.\n const trigger = buildTrigger(entry, values);\n if (trigger) payload.trigger = trigger;\n\n const template = buildTemplate(entry, values);\n if (template) payload.template = template;\n\n return payload;\n}\n\n/**\n * The `template` provenance a prompt entry sends, or undefined for one that\n * publishes no version.\n *\n * It is what lets the service recognise a second setup of the same entry as\n * the automation it already holds. The bundle path derives the same block from\n * the config the bundle declares; a prompt entry declares none, so the answer\n * to \"what was this created from\" is the form as submitted.\n */\nfunction buildTemplate(\n entry: SetupEntry,\n values: SetupFormValues,\n): SetupRequestBody | undefined {\n if (!entry.version) return undefined;\n return {\n id: entry.id,\n version: entry.version,\n config: { ...values },\n };\n}\n\n/**\n * The `trigger` object, read off the key and fields under `form.triggers`.\n *\n * Identical for both kinds of direct entry: only the create endpoint and what\n * the automation is told to do differ between a prompt and a bundle.\n */\nfunction buildTrigger(\n entry: SetupEntry,\n values: SetupFormValues,\n): SetupRequestBody | undefined {\n const trigger = getTrigger(entry.setup);\n if (!trigger) return undefined;\n\n const properties = TRIGGER_PROPERTIES[trigger.kind];\n const declared = Object.keys(trigger.fields).filter((name) =>\n properties.includes(name),\n );\n const repoPicker = findRepoPickerField(entry.setup);\n\n return {\n type: trigger.kind,\n ...Object.fromEntries(\n declared.map((name) => [name, fieldText(values[name])]),\n ),\n ...(trigger.kind === \"event\" && {\n source: repoPicker?.field.provider ?? \"\",\n ...(entry.setup.filter && {\n filter: interpolateText(entry.setup.filter, {\n form: values,\n automation: entry,\n }),\n }),\n }),\n };\n}\n\n/**\n * The raw create body a bundle entry produces.\n *\n * `tarball_path` is the one value neither declared nor derived: the host packs\n * and uploads the bundle first, and creates from what came back. `template` is\n * the provenance that makes enabling the same entry twice return the\n * automation that already exists rather than a second one.\n *\n * There is no `repos`: the raw endpoint has no such field, and a bundle's\n * script fetches what it needs itself.\n */\nfunction buildBundlePayload(\n entry: SetupEntry,\n values: SetupFormValues,\n tarballPath: string,\n): SetupRequestBody {\n const bundle = entry.setup.bundle!;\n const scope = { form: values, automation: entry };\n\n const payload: SetupRequestBody = {\n name: deriveName(entry, values),\n };\n\n const trigger = buildTrigger(entry, values);\n if (trigger) payload.trigger = trigger;\n\n payload.tarball_path = tarballPath;\n payload.entrypoint = bundle.entrypoint;\n if (bundle.setupScript) payload.setup_script_path = bundle.setupScript;\n if (bundle.timeout !== undefined) payload.timeout = bundle.timeout;\n payload.template = {\n id: entry.id,\n version: bundle.version,\n config: interpolateConfig(bundle.config, scope) as SetupRequestBody,\n };\n\n return payload;\n}\n\n/**\n * Placeholder substitution over the config tree. Only string leaves are\n * templated; a number, a boolean or a null is written through as itself, so an\n * entry can state a value the script reads as the type it expects.\n */\nfunction interpolateConfig(\n node: SetupBundleConfigValue,\n scope: Parameters<typeof interpolateText>[1],\n): SetupBundleConfigValue {\n if (typeof node === \"string\") {\n return interpolateValue(node, scope);\n }\n if (Array.isArray(node)) {\n return node.map((item) => interpolateConfig(item, scope));\n }\n if (typeof node === \"object\" && node !== null) {\n return Object.fromEntries(\n Object.entries(node).map(([key, value]) => [\n key,\n interpolateConfig(value, scope),\n ]),\n );\n }\n return node;\n}\n\n/**\n * The preflight body the host sends. The same shape for every entry, so no\n * entry declares it.\n */\nexport function buildPreflightBody(\n entry: SetupEntry,\n values: SetupFormValues,\n): SetupRequestBody | null {\n const draft = buildCreatePayload(entry, values);\n if (!draft) return null;\n\n return {\n automationId: entry.id,\n endpoint: automationCreateEndpoint(entry),\n draft,\n };\n}\n\n/**\n * What an assisted entry sends into the conversation that finishes setup.\n *\n * The command is not declared either: it lives once, in the owning skill's own\n * `triggers` frontmatter, and the skill defaults to the entry's id. An entry\n * whose skill is invoked by description rather than by command contributes\n * nothing here, and the answers alone open the conversation.\n */\nexport function buildAssistedMessage(\n entry: SetupEntry,\n values: SetupFormValues,\n): string {\n const command = findAutomationCommand(entry);\n const message = entry.setup.message\n ? interpolateText(entry.setup.message, { form: values, automation: entry })\n : \"\";\n\n return [command, message].filter(Boolean).join(\"\\n\\n\");\n}\n\nfunction collectPlaceholderFields(value: string): string[] {\n const names = Array.from(\n value.matchAll(FORM_PLACEHOLDER_PATTERN),\n (match) => match[1],\n );\n return Array.from(new Set(names));\n}\n\n/**\n * Which form fields built each payload path.\n *\n * Preflight and the create endpoint reject a draft by payload path, and the\n * host has to turn that back into a highlighted input. Building the body with\n * each field standing in for its own value recovers the mapping exactly, so an\n * entry does not declare it.\n */\nexport function deriveErrorMap(entry: SetupEntry): Record<string, string[]> {\n const mapping: Record<string, string[]> = {};\n\n const standIns = Object.fromEntries(\n Object.keys(collectFields(entry.setup)).map((name) => [\n name,\n `{{form.${name}}}`,\n ]),\n );\n const template = buildCreatePayload(entry, standIns);\n if (!template) return mapping;\n\n const walk = (node: unknown, path: string): void => {\n if (Array.isArray(node)) {\n node.forEach((item, index) => walk(item, `${path}[${index}]`));\n return;\n }\n if (typeof node === \"object\" && node !== null) {\n Object.entries(node).forEach(([key, item]) =>\n walk(item, path ? `${path}.${key}` : key),\n );\n return;\n }\n if (typeof node === \"string\") {\n const names = collectPlaceholderFields(node);\n if (names.length > 0) mapping[path] = names;\n }\n };\n\n walk(template, \"\");\n return mapping;\n}\n"],"mappings":";;;;AA2CA,SAAgB,EAAyB,GAA4B;CAInE,OAHI,KAAS,EAAc,CAAK,IACvB,EAAsB,cAAc,IAEtC,EAAsB,cAAc;AAC7C;AAGA,SAAgB,IAAmC;CACjD,OAAO,EAAsB,SAAS;AACxC;AAUA,SAAS,EACP,GACQ;CACR,IAAM,IAAO,EAAsB,CAAI;CACvC,IAAI,CAAC,GACH,MAAU,MACR,mDAAmD,EAAK,iFAE1D;CAEF,OAAO;AACT;AAiBA,SAAgB,EAAc,GAA4B;CACxD,OAAO,EAAM,MAAM,SAAS,YAAY,EAAM,MAAM,WAAW,KAAA;AACjE"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../_virtual/_rolldown/runtime.cjs");const e=require("./types.cjs");var t=/<[A-Za-z/!]/,n=/^[a-z0-9]+(-[a-z0-9]+)*$/,r=`https://docs.openhands.dev/`,i=/^[a-z][a-z-]*$/,a=/^\.[a-z][a-z.]*json$/,o=/^[a-z0-9][a-z0-9.-]*$/,s=/^\/[A-Za-z0-9/{}_-]*$/,c=/^[^{}]*\{id\}[^{}]*$/,l=[`github`,`gitlab`,`bitbucket`],u={name:{type:`text`,required:!0},prompt:{type:`textarea`,required:!1},model:{type:`llm-profile`,required:!1},timeout:{type:`number`,required:!1},schedule:{type:`schedule`,required:!1}},d=Object.keys(u),f=[`list`,`health`,`capabilities`,`validate`,`createPrompt`,`createPlugin`],p=[`detail`,`dispatch`,`runs`,`tarball`];function m(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function h(e,t){return typeof e==`string`&&t.includes(e)}var g=class{errors=[];fail(e,t){return this.errors.push(`${e}: ${t}`),!1}copy(e,n){return typeof e!=`string`||e.length===0?this.fail(n,`must be a non-empty string`):t.test(e)?this.fail(n,`must not contain markup`):!0}closed(e,t,n){Object.keys(e).filter(e=>!t.includes(e)).forEach(e=>this.fail(`${n}.${e}`,`is not allowed`))}record(e,t){return m(e)?!0:(this.fail(t,`must be an object`),!1)}};function _(e,t,n){e.record(t,`routes`)&&(e.closed(t,[`list`,`setup`,`detail`,`templates`],`routes`),[`list`,`setup`,`detail`].forEach(r=>{t[r]!==n[r]&&e.fail(`routes.${r}`,`must be "${n[r]}"`)}),t.templates!==void 0&&t.templates!==n.templates&&e.fail(`routes.templates`,n.templates===void 0?`is not a route this host mounts`:`must be "${n.templates}"`))}function v(t,n){if(!Array.isArray(n)||n.length===0){t.fail(`navigation.subPages`,`must be a non-empty array`);return}let r=new Set;n.forEach((n,i)=>{let a=`navigation.subPages[${i}]`;if(!t.record(n,a))return;t.closed(n,[`page`,`label`,`icon`],a);let{page:o,label:s,icon:c}=n;h(o,e.INTERFACE_SUB_PAGE_IDS)?r.has(o)?t.fail(`${a}.page`,`repeats a page`):r.add(o):t.fail(`${a}.page`,`is not a sub-page this host serves`),t.copy(s,`${a}.label`),y(t,c,`${a}.icon`)})}function y(t,n,r){h(n,e.INTERFACE_ICON_SLUGS)||t.fail(r,`is not an icon this host ships`)}function b(e,t){if(e.record(t,`navigation`)){if(e.closed(t,[`sidebar`,`commandMenu`,`subPages`],`navigation`),e.record(t.sidebar,`navigation.sidebar`)&&(e.closed(t.sidebar,[`label`],`navigation.sidebar`),e.copy(t.sidebar.label,`navigation.sidebar.label`)),e.record(t.commandMenu,`navigation.commandMenu`)){let n=t.commandMenu;e.closed(n,[`title`,`description`,`keywords`],`navigation.commandMenu`),e.copy(n.title,`navigation.commandMenu.title`),e.copy(n.description,`navigation.commandMenu.description`),e.copy(n.keywords,`navigation.commandMenu.keywords`)}t.subPages!==void 0&&v(e,t.subPages)}}function x(e,t){e.record(t,`pages`)&&(e.closed(t,[`list`,`detail`,`edit`,`templates`],`pages`),e.record(t.list,`pages.list`)&&(e.closed(t.list,[`title`,`subtitle`,`overview`,`filters`,`sort`,`insights`],`pages.list`),e.copy(t.list.title,`pages.list.title`),e.copy(t.list.subtitle,`pages.list.subtitle`),t.list.overview!==void 0&&S(e,t.list.overview),t.list.filters!==void 0&&T(e,t.list.filters),t.list.sort!==void 0&&O(e,t.list.sort),t.list.insights!==void 0&&A(e,t.list.insights)),e.record(t.detail,`pages.detail`)&&(e.closed(t.detail,[`backLabel`],`pages.detail`),e.copy(t.detail.backLabel,`pages.detail.backLabel`)),e.record(t.edit,`pages.edit`)&&(e.closed(t.edit,[`title`],`pages.edit`),e.copy(t.edit.title,`pages.edit.title`)),t.templates!==void 0&&j(e,t.templates))}function S(e,t){let n=`pages.list.overview`;if(!e.record(t,n))return;e.closed(t,[`label`,`tiles`],n),e.copy(t.label,`${n}.label`);let{tiles:r}=t;if(!Array.isArray(r)||r.length===0){e.fail(`${n}.tiles`,`must be a non-empty array`);return}let i=new Set;r.forEach((t,r)=>{C(e,t,i,`${n}.tiles[${r}]`)})}function C(t,n,r,i){if(!t.record(n,i))return;t.closed(n,[`metric`,`label`,`detail`,`zeroDetail`,`icon`],i);let{metric:a,label:o,detail:s,zeroDetail:c,icon:l}=n;if(t.copy(o,`${i}.label`),y(t,l,`${i}.icon`),!h(a,e.OVERVIEW_METRICS)){t.fail(`${i}.metric`,`is not a metric this host computes`),t.copy(s,`${i}.detail`),c!==void 0&&t.copy(c,`${i}.zeroDetail`);return}r.has(a)?t.fail(`${i}.metric`,`repeats a metric`):r.add(a),w(t,s,a,`${i}.detail`),c!==void 0&&w(t,c,a,`${i}.zeroDetail`)}function w(t,n,r,i){if(!t.copy(n,i))return;let a=e.OVERVIEW_TILE_PLACEHOLDERS[r];(a.length===0?/\{\{/:RegExp(`\\{\\{(?!(?:${a.join(`|`)})\\}\\})`)).test(n)&&t.fail(i,`uses a placeholder this metric does not expose`)}function T(e,t){let n=`pages.list.filters`;if(!Array.isArray(t)||t.length===0){e.fail(n,`must be a non-empty array`);return}let r=new Set;t.forEach((t,i)=>{E(e,t,r,`${n}[${i}]`)})}function E(t,n,r,i){if(!t.record(n,i))return;t.closed(n,[`id`,`label`,`options`],i);let{id:a,label:o,options:s}=n;if(t.copy(o,`${i}.label`),!h(a,e.DASHBOARD_FILTER_IDS)){t.fail(`${i}.id`,`is not a filter this host implements`);return}r.has(a)?t.fail(`${i}.id`,`repeats a filter`):r.add(a),D(t,s,e.DASHBOARD_FILTER_VALUES[a],`${i}.options`)}function D(e,t,n,r){if(!Array.isArray(t)||t.length<2){e.fail(r,`must offer at least two options`);return}let i=new Set;t.forEach((t,a)=>{let o=`${r}[${a}]`;if(!e.record(t,o))return;e.closed(t,[`value`,`label`],o);let{value:s,label:c}=t;h(s,n)?i.has(s)?e.fail(`${o}.value`,`repeats a value`):i.add(s):e.fail(`${o}.value`,`is not a value this host implements`),e.copy(c,`${o}.label`)}),i.has(`all`)||e.fail(r,`must offer the "all" option`)}function O(t,n){let r=`pages.list.sort`;if(!t.record(n,r))return;t.closed(n,[`label`,`options`,`default`],r);let{label:i,options:a,default:o}=n;t.copy(i,`${r}.label`);let s=new Set;!Array.isArray(a)||a.length===0?t.fail(`${r}.options`,`must be a non-empty array`):a.forEach((n,i)=>{let a=`${r}.options[${i}]`;t.record(n,a)&&(t.closed(n,[`value`,`label`],a),h(n.value,e.DASHBOARD_SORT_VALUES)?s.has(n.value)?t.fail(`${a}.value`,`repeats a value`):s.add(n.value):t.fail(`${a}.value`,`is not a sort this host implements`),t.copy(n.label,`${a}.label`))}),(typeof o!=`string`||!s.has(o))&&t.fail(`${r}.default`,`must be one of the declared option values`)}var k={health:[`healthy`,`failing`,`running`,`disabled`,`neverRun`,`checking`],lastRun:[`label`,`never`,`justNow`],stats:[`runs`,`recentSuccess`,`averageDuration`]};function A(e,t){let n=`pages.list.insights`;e.record(t,n)&&(e.closed(t,Object.keys(k),n),Object.keys(k).forEach(r=>{let i=`${n}.${r}`,a=t[r];if(!e.record(a,i))return;let o=k[r];e.closed(a,o,i),o.forEach(t=>{e.copy(a[t],`${i}.${t}`)})}))}function j(e,t){let n=`pages.templates`;e.record(t,n)&&(e.closed(t,[`title`,`description`],n),e.copy(t.title,`${n}.title`),e.copy(t.description,`${n}.description`))}function M(e,t){let n=m(t.routes)?t.routes:{},r=m(t.navigation)?t.navigation:{},i=m(t.pages)?t.pages:{},a=m(i.list)?i.list:{},o=[[`routes.templates`,n.templates],[`navigation.subPages`,r.subPages],[`pages.templates`,i.templates],[`pages.list.overview`,a.overview],[`pages.list.filters`,a.filters],[`pages.list.sort`,a.sort],[`pages.list.insights`,a.insights]],s=o.filter(([,e])=>e===void 0).map(([e])=>e);s.length===0||s.length===o.length||e.fail(`interface`,`the sub-page surface must be declared whole; missing ${s.join(`, `)}`)}function N(e,t,n,r){if(!e.record(n,r))return;e.closed(n,[`type`,`label`,`help`,`required`,`constraints`],r);let{type:i,label:a,help:o,required:s,constraints:c}=n;if(i!==t.type&&e.fail(`${r}.type`,`must be "${t.type}", the control this host renders`),e.copy(a,`${r}.label`),o!==void 0&&e.copy(o,`${r}.help`),s!==t.required&&e.fail(`${r}.required`,`must be ${t.required}, what this host enforces`),c!==void 0){if(t.type!==`number`)e.fail(`${r}.constraints`,`is only allowed on a number attribute`);else if(e.record(c,`${r}.constraints`)){e.closed(c,[`min`,`max`],`${r}.constraints`);let{min:t,max:n}=c;t!==void 0&&t!==1&&e.fail(`${r}.constraints.min`,`must be the 1 this host enforces`),n!==void 0&&(!Number.isInteger(n)||n<1)&&e.fail(`${r}.constraints.max`,`must be a positive integer`)}}}function P(e,t){if(!e.record(t,`attributes`))return;let n=Object.keys(t);n.length===0&&e.fail(`attributes`,`must declare at least one attribute`),n.forEach(n=>{if(!d.includes(n)){e.fail(`attributes.${n}`,`is not a settable attribute`);return}N(e,u[n],t[n],`attributes.${n}`)})}function F(e,t){if(!e.record(t,`importExport`))return;e.closed(t,[`fileKind`,`fileVersion`,`filenameSuffix`,`importDefaults`],`importExport`);let{fileKind:n,fileVersion:r,filenameSuffix:s,importDefaults:c}=t;(typeof n!=`string`||!i.test(n))&&e.fail(`importExport.fileKind`,`must be a lowercase slug`),r!==1&&e.fail(`importExport.fileVersion`,`must be 1`),(typeof s!=`string`||!a.test(s))&&e.fail(`importExport.filenameSuffix`,`must be a .json suffix`),e.record(c,`importExport.importDefaults`)&&(e.closed(c,[`repoProvider`,`placeholderEventSource`],`importExport.importDefaults`),(typeof c.repoProvider!=`string`||!l.includes(c.repoProvider))&&e.fail(`importExport.importDefaults.repoProvider`,`is not a supported provider`),(typeof c.placeholderEventSource!=`string`||!o.test(c.placeholderEventSource))&&e.fail(`importExport.importDefaults.placeholderEventSource`,`must be a lowercase event source`))}function I(e,t){if(!e.record(t,`endpoints`))return;let n=[...f,...p];e.closed(t,n,`endpoints`);let r=n=>{let r=t[n];return typeof r!=`string`||!s.test(r)||r.includes(`//`)?(e.fail(`endpoints.${n}`,`must be a rooted service-relative path`),null):r};f.forEach(t=>{let n=r(t);n!==null&&/[{}]/.test(n)&&e.fail(`endpoints.${t}`,`must not carry a substitution`)}),p.forEach(t=>{let n=r(t);n!==null&&!c.test(n)&&e.fail(`endpoints.${t}`,`must carry exactly one {id}`)})}function L(e,t,r){if(!Array.isArray(t)||t.length===0)return e.fail(r,`must be a non-empty array`),[];let i=t.filter(t=>typeof t==`string`&&n.test(t)?!0:(e.fail(r,`must contain only lowercase slugs`),!1));return new Set(i).size!==i.length&&e.fail(r,`must not repeat an id`),i}var R=[`version`,`routes`,`navigation`,`pages`,`docsUrl`,`attributes`,`importExport`,`endpoints`,`featuredAutomationIds`,`responderIntegrationIds`];function z(e,t){if(!m(e))return{valid:!1,errors:[`interface: must be an object`]};if(e.version!==`1.0`)return{valid:!1,errors:[`interface.version: must be "1.0"`]};let n=new g;return n.closed(e,R,`interface`),_(n,e.routes,t.mountedRoutes),b(n,e.navigation),x(n,e.pages),(typeof e.docsUrl!=`string`||!e.docsUrl.startsWith(r))&&n.fail(`docsUrl`,`must start with ${r}`),P(n,e.attributes),F(n,e.importExport),I(n,e.endpoints),L(n,e.featuredAutomationIds,`featuredAutomationIds`).forEach(e=>{t.catalogIds.has(e)||n.fail(`featuredAutomationIds`,`${e} is not a catalog entry`)}),L(n,e.responderIntegrationIds,`responderIntegrationIds`),M(n,e),{valid:n.errors.length===0,errors:n.errors}}exports.validateInterfaceManifest=z;
|
|
1
|
+
require("../_virtual/_rolldown/runtime.cjs");const e=require("./types.cjs");var t=/<[A-Za-z/!]/,n=/^[a-z0-9]+(-[a-z0-9]+)*$/,r=`https://docs.openhands.dev/`,i=/^[a-z][a-z-]*$/,a=/^\.[a-z][a-z.]*json$/,o=/^[a-z0-9][a-z0-9.-]*$/,s=/^\/[A-Za-z0-9/{}_-]*$/,c=/^[^{}]*\{id\}[^{}]*$/,l=[`github`,`gitlab`,`bitbucket`],u={name:{type:`text`,required:!0},prompt:{type:`textarea`,required:!1},model:{type:`llm-profile`,required:!1},timeout:{type:`number`,required:!1},schedule:{type:`schedule`,required:!1}},d=Object.keys(u),f=[`list`,`health`,`capabilities`,`validate`,`createPrompt`,`createPlugin`],p=[`createBundle`,`uploads`],m=[`detail`,`dispatch`,`runs`,`tarball`];function h(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function g(e,t){return typeof e==`string`&&t.includes(e)}var _=class{errors=[];fail(e,t){return this.errors.push(`${e}: ${t}`),!1}copy(e,n){return typeof e!=`string`||e.length===0?this.fail(n,`must be a non-empty string`):t.test(e)?this.fail(n,`must not contain markup`):!0}closed(e,t,n){Object.keys(e).filter(e=>!t.includes(e)).forEach(e=>this.fail(`${n}.${e}`,`is not allowed`))}record(e,t){return h(e)?!0:(this.fail(t,`must be an object`),!1)}};function v(e,t,n){e.record(t,`routes`)&&(e.closed(t,[`list`,`setup`,`detail`,`templates`],`routes`),[`list`,`setup`,`detail`].forEach(r=>{t[r]!==n[r]&&e.fail(`routes.${r}`,`must be "${n[r]}"`)}),t.templates!==void 0&&t.templates!==n.templates&&e.fail(`routes.templates`,n.templates===void 0?`is not a route this host mounts`:`must be "${n.templates}"`))}function y(t,n){if(!Array.isArray(n)||n.length===0){t.fail(`navigation.subPages`,`must be a non-empty array`);return}let r=new Set;n.forEach((n,i)=>{let a=`navigation.subPages[${i}]`;if(!t.record(n,a))return;t.closed(n,[`page`,`label`,`icon`],a);let{page:o,label:s,icon:c}=n;g(o,e.INTERFACE_SUB_PAGE_IDS)?r.has(o)?t.fail(`${a}.page`,`repeats a page`):r.add(o):t.fail(`${a}.page`,`is not a sub-page this host serves`),t.copy(s,`${a}.label`),b(t,c,`${a}.icon`)})}function b(t,n,r){g(n,e.INTERFACE_ICON_SLUGS)||t.fail(r,`is not an icon this host ships`)}function x(e,t){if(e.record(t,`navigation`)){if(e.closed(t,[`sidebar`,`commandMenu`,`subPages`],`navigation`),e.record(t.sidebar,`navigation.sidebar`)&&(e.closed(t.sidebar,[`label`],`navigation.sidebar`),e.copy(t.sidebar.label,`navigation.sidebar.label`)),e.record(t.commandMenu,`navigation.commandMenu`)){let n=t.commandMenu;e.closed(n,[`title`,`description`,`keywords`],`navigation.commandMenu`),e.copy(n.title,`navigation.commandMenu.title`),e.copy(n.description,`navigation.commandMenu.description`),e.copy(n.keywords,`navigation.commandMenu.keywords`)}t.subPages!==void 0&&y(e,t.subPages)}}function S(e,t){e.record(t,`pages`)&&(e.closed(t,[`list`,`detail`,`edit`,`templates`],`pages`),e.record(t.list,`pages.list`)&&(e.closed(t.list,[`title`,`subtitle`,`overview`,`filters`,`sort`,`insights`],`pages.list`),e.copy(t.list.title,`pages.list.title`),e.copy(t.list.subtitle,`pages.list.subtitle`),t.list.overview!==void 0&&C(e,t.list.overview),t.list.filters!==void 0&&E(e,t.list.filters),t.list.sort!==void 0&&k(e,t.list.sort),t.list.insights!==void 0&&j(e,t.list.insights)),e.record(t.detail,`pages.detail`)&&(e.closed(t.detail,[`backLabel`],`pages.detail`),e.copy(t.detail.backLabel,`pages.detail.backLabel`)),e.record(t.edit,`pages.edit`)&&(e.closed(t.edit,[`title`],`pages.edit`),e.copy(t.edit.title,`pages.edit.title`)),t.templates!==void 0&&M(e,t.templates))}function C(e,t){let n=`pages.list.overview`;if(!e.record(t,n))return;e.closed(t,[`label`,`tiles`],n),e.copy(t.label,`${n}.label`);let{tiles:r}=t;if(!Array.isArray(r)||r.length===0){e.fail(`${n}.tiles`,`must be a non-empty array`);return}let i=new Set;r.forEach((t,r)=>{w(e,t,i,`${n}.tiles[${r}]`)})}function w(t,n,r,i){if(!t.record(n,i))return;t.closed(n,[`metric`,`label`,`detail`,`zeroDetail`,`icon`],i);let{metric:a,label:o,detail:s,zeroDetail:c,icon:l}=n;if(t.copy(o,`${i}.label`),b(t,l,`${i}.icon`),!g(a,e.OVERVIEW_METRICS)){t.fail(`${i}.metric`,`is not a metric this host computes`),t.copy(s,`${i}.detail`),c!==void 0&&t.copy(c,`${i}.zeroDetail`);return}r.has(a)?t.fail(`${i}.metric`,`repeats a metric`):r.add(a),T(t,s,a,`${i}.detail`),c!==void 0&&T(t,c,a,`${i}.zeroDetail`)}function T(t,n,r,i){if(!t.copy(n,i))return;let a=e.OVERVIEW_TILE_PLACEHOLDERS[r];(a.length===0?/\{\{/:RegExp(`\\{\\{(?!(?:${a.join(`|`)})\\}\\})`)).test(n)&&t.fail(i,`uses a placeholder this metric does not expose`)}function E(e,t){let n=`pages.list.filters`;if(!Array.isArray(t)||t.length===0){e.fail(n,`must be a non-empty array`);return}let r=new Set;t.forEach((t,i)=>{D(e,t,r,`${n}[${i}]`)})}function D(t,n,r,i){if(!t.record(n,i))return;t.closed(n,[`id`,`label`,`options`],i);let{id:a,label:o,options:s}=n;if(t.copy(o,`${i}.label`),!g(a,e.DASHBOARD_FILTER_IDS)){t.fail(`${i}.id`,`is not a filter this host implements`);return}r.has(a)?t.fail(`${i}.id`,`repeats a filter`):r.add(a),O(t,s,e.DASHBOARD_FILTER_VALUES[a],`${i}.options`)}function O(e,t,n,r){if(!Array.isArray(t)||t.length<2){e.fail(r,`must offer at least two options`);return}let i=new Set;t.forEach((t,a)=>{let o=`${r}[${a}]`;if(!e.record(t,o))return;e.closed(t,[`value`,`label`],o);let{value:s,label:c}=t;g(s,n)?i.has(s)?e.fail(`${o}.value`,`repeats a value`):i.add(s):e.fail(`${o}.value`,`is not a value this host implements`),e.copy(c,`${o}.label`)}),i.has(`all`)||e.fail(r,`must offer the "all" option`)}function k(t,n){let r=`pages.list.sort`;if(!t.record(n,r))return;t.closed(n,[`label`,`options`,`default`],r);let{label:i,options:a,default:o}=n;t.copy(i,`${r}.label`);let s=new Set;!Array.isArray(a)||a.length===0?t.fail(`${r}.options`,`must be a non-empty array`):a.forEach((n,i)=>{let a=`${r}.options[${i}]`;t.record(n,a)&&(t.closed(n,[`value`,`label`],a),g(n.value,e.DASHBOARD_SORT_VALUES)?s.has(n.value)?t.fail(`${a}.value`,`repeats a value`):s.add(n.value):t.fail(`${a}.value`,`is not a sort this host implements`),t.copy(n.label,`${a}.label`))}),(typeof o!=`string`||!s.has(o))&&t.fail(`${r}.default`,`must be one of the declared option values`)}var A={health:[`healthy`,`failing`,`running`,`disabled`,`neverRun`,`checking`],lastRun:[`label`,`never`,`justNow`],stats:[`runs`,`recentSuccess`,`averageDuration`]};function j(e,t){let n=`pages.list.insights`;e.record(t,n)&&(e.closed(t,Object.keys(A),n),Object.keys(A).forEach(r=>{let i=`${n}.${r}`,a=t[r];if(!e.record(a,i))return;let o=A[r];e.closed(a,o,i),o.forEach(t=>{e.copy(a[t],`${i}.${t}`)})}))}function M(e,t){let n=`pages.templates`;e.record(t,n)&&(e.closed(t,[`title`,`description`],n),e.copy(t.title,`${n}.title`),e.copy(t.description,`${n}.description`))}function N(e,t){let n=h(t.routes)?t.routes:{},r=h(t.navigation)?t.navigation:{},i=h(t.pages)?t.pages:{},a=h(i.list)?i.list:{},o=[[`routes.templates`,n.templates],[`navigation.subPages`,r.subPages],[`pages.templates`,i.templates],[`pages.list.overview`,a.overview],[`pages.list.filters`,a.filters],[`pages.list.sort`,a.sort],[`pages.list.insights`,a.insights]],s=o.filter(([,e])=>e===void 0).map(([e])=>e);s.length===0||s.length===o.length||e.fail(`interface`,`the sub-page surface must be declared whole; missing ${s.join(`, `)}`)}function P(e,t,n,r){if(!e.record(n,r))return;e.closed(n,[`type`,`label`,`help`,`required`,`constraints`],r);let{type:i,label:a,help:o,required:s,constraints:c}=n;if(i!==t.type&&e.fail(`${r}.type`,`must be "${t.type}", the control this host renders`),e.copy(a,`${r}.label`),o!==void 0&&e.copy(o,`${r}.help`),s!==t.required&&e.fail(`${r}.required`,`must be ${t.required}, what this host enforces`),c!==void 0){if(t.type!==`number`)e.fail(`${r}.constraints`,`is only allowed on a number attribute`);else if(e.record(c,`${r}.constraints`)){e.closed(c,[`min`,`max`],`${r}.constraints`);let{min:t,max:n}=c;t!==void 0&&t!==1&&e.fail(`${r}.constraints.min`,`must be the 1 this host enforces`),n!==void 0&&(!Number.isInteger(n)||n<1)&&e.fail(`${r}.constraints.max`,`must be a positive integer`)}}}function F(e,t){if(!e.record(t,`attributes`))return;let n=Object.keys(t);n.length===0&&e.fail(`attributes`,`must declare at least one attribute`),n.forEach(n=>{if(!d.includes(n)){e.fail(`attributes.${n}`,`is not a settable attribute`);return}P(e,u[n],t[n],`attributes.${n}`)})}function I(e,t){if(!e.record(t,`importExport`))return;e.closed(t,[`fileKind`,`fileVersion`,`filenameSuffix`,`importDefaults`],`importExport`);let{fileKind:n,fileVersion:r,filenameSuffix:s,importDefaults:c}=t;(typeof n!=`string`||!i.test(n))&&e.fail(`importExport.fileKind`,`must be a lowercase slug`),r!==1&&e.fail(`importExport.fileVersion`,`must be 1`),(typeof s!=`string`||!a.test(s))&&e.fail(`importExport.filenameSuffix`,`must be a .json suffix`),e.record(c,`importExport.importDefaults`)&&(e.closed(c,[`repoProvider`,`placeholderEventSource`],`importExport.importDefaults`),(typeof c.repoProvider!=`string`||!l.includes(c.repoProvider))&&e.fail(`importExport.importDefaults.repoProvider`,`is not a supported provider`),(typeof c.placeholderEventSource!=`string`||!o.test(c.placeholderEventSource))&&e.fail(`importExport.importDefaults.placeholderEventSource`,`must be a lowercase event source`))}function L(e,t){if(!e.record(t,`endpoints`))return;let n=[...f,...p,...m];e.closed(t,n,`endpoints`);let r=n=>{let r=t[n];return typeof r!=`string`||!s.test(r)||r.includes(`//`)?(e.fail(`endpoints.${n}`,`must be a rooted service-relative path`),null):r};[...f,...p.filter(e=>e in t)].forEach(t=>{let n=r(t);n!==null&&/[{}]/.test(n)&&e.fail(`endpoints.${t}`,`must not carry a substitution`)}),m.forEach(t=>{let n=r(t);n!==null&&!c.test(n)&&e.fail(`endpoints.${t}`,`must carry exactly one {id}`)})}function R(e,t,r){if(!Array.isArray(t)||t.length===0)return e.fail(r,`must be a non-empty array`),[];let i=t.filter(t=>typeof t==`string`&&n.test(t)?!0:(e.fail(r,`must contain only lowercase slugs`),!1));return new Set(i).size!==i.length&&e.fail(r,`must not repeat an id`),i}var z=[`version`,`routes`,`navigation`,`pages`,`docsUrl`,`attributes`,`importExport`,`endpoints`,`featuredAutomationIds`,`responderIntegrationIds`];function B(e,t){if(!h(e))return{valid:!1,errors:[`interface: must be an object`]};if(e.version!==`1.0`)return{valid:!1,errors:[`interface.version: must be "1.0"`]};let n=new _;return n.closed(e,z,`interface`),v(n,e.routes,t.mountedRoutes),x(n,e.navigation),S(n,e.pages),(typeof e.docsUrl!=`string`||!e.docsUrl.startsWith(r))&&n.fail(`docsUrl`,`must start with ${r}`),F(n,e.attributes),I(n,e.importExport),L(n,e.endpoints),R(n,e.featuredAutomationIds,`featuredAutomationIds`).forEach(e=>{t.catalogIds.has(e)||n.fail(`featuredAutomationIds`,`${e} is not a catalog entry`)}),R(n,e.responderIntegrationIds,`responderIntegrationIds`),N(n,e),{valid:n.errors.length===0,errors:n.errors}}exports.validateInterfaceManifest=B;
|
|
2
2
|
//# sourceMappingURL=interface-validation.cjs.map
|