@openhands/agent-canvas 1.14.0 → 1.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/README.windows.md +2 -2
- package/build/assets/acp-providers-BKvmTf82.js +1 -0
- package/build/assets/active-backend-context-DKFSMbn3.js +2 -0
- package/build/assets/agent-context-settings-D3PjSTU1.js +1 -0
- package/build/assets/agent-profiles-settings-D4cY5U2T.js +1 -0
- package/build/assets/agent-server-conversation-service.api-DozDKIW_.js +86 -0
- package/build/assets/agent-settings-351vXWc9.js +2 -0
- package/build/assets/agent-settings-Ce7BDZ6I.js +1 -0
- package/build/assets/alert-banner-Kyy1YWZU.js +1 -0
- package/build/assets/api-error-message-BJyfWp6p.js +1 -0
- package/build/assets/api-key-entry-screen-INIxqAMs.js +1 -0
- package/build/assets/app-settings-CbHqzQus.js +1 -0
- package/build/assets/automation-detail-DXDhUwPq.js +3 -0
- package/build/assets/automation-export-BRopEHMu.js +2 -0
- package/build/assets/automation-git-sync-CzyS4cn1.js +1 -0
- package/build/assets/automation-setup-route-FRr05f_g.js +1 -0
- package/build/assets/automation-templates-C_0FZgLG.js +1 -0
- package/build/assets/automations-list-CERuQWE6.js +1 -0
- package/build/assets/back-nav-button-Dm9tIjVf.js +1 -0
- package/build/assets/backend-form-modal-DK78-jn1.js +1 -0
- package/build/assets/backend-synced-settings-badge-3fOwg6Bd.js +1 -0
- package/build/assets/badge-D4SqUCsR.js +1 -0
- package/build/assets/base-modal-C7_BDl_U.js +1 -0
- package/build/assets/bot-C-0Wu7vQ.js +1 -0
- package/build/assets/brand-button-Dxv6PDeN.js +1 -0
- package/build/assets/browser-11etCQ04.js +7 -0
- package/build/assets/browser-tab-BAl4ckJE.js +1 -0
- package/build/assets/chat-send-button-DWwR2cgI.js +1 -0
- package/build/assets/check-Cf2YoT90.js +1 -0
- package/build/assets/chevron-down-C3OQ-ehx.js +1 -0
- package/build/assets/chevron-right-CN1uUiJ1.js +1 -0
- package/build/assets/circle-check-g5yeGMd-.js +1 -0
- package/build/assets/circle-plus-check-toggle-CBh_qomE.js +1 -0
- package/build/assets/cloud-funnel-analytics-287iIERo.js +1 -0
- package/build/assets/cog-C4rrw-ZK.js +1 -0
- package/build/assets/command-menu-BZQ8S3Ke.js +1 -0
- package/build/assets/commits-tab-DZtJgaDM.js +1 -0
- package/build/assets/condenser-settings-BcNmYR4s.js +1 -0
- package/build/assets/confirmation-modal-Bk4JRcCM.js +1 -0
- package/build/assets/context-menu-list-item-lVYETtY5.js +1 -0
- package/build/assets/conversation-CchMzpGl.js +1 -0
- package/build/assets/conversation-Dpzftz57.js +93 -0
- package/build/assets/conversation-panel-CchMzpGl.js +1 -0
- package/build/assets/conversation-state-store-a9d2fxRc.js +1 -0
- package/build/assets/conversation-store-Ca3ghXap.js +6 -0
- package/build/assets/conversation-tab-empty-state-HJtkmHZj.js +1 -0
- package/build/assets/copy-to-clipboard-button-Cjkswvnj.js +1 -0
- package/build/assets/device-verify-EZhHhBT7.js +1 -0
- package/build/assets/dropdown-classes-DJe-E6MC.js +1 -0
- package/build/assets/edit-automation-modal-D-urtv8n.js +1 -0
- package/build/assets/empty-state-CvaVahVr.js +1 -0
- package/build/assets/entry.client-C7Bi2tkU.js +2 -0
- package/build/assets/enum-filter-dropdown-DliX_Lo0.js +1 -0
- package/build/assets/environment-switch-overlay-CEKrFiMw.js +1 -0
- package/build/assets/error-state-BALXiBNy.js +1 -0
- package/build/assets/extension-module-card-classes-DpeaYhYo.js +1 -0
- package/build/assets/extensions-hub-CFduxBnk.js +1 -0
- package/build/assets/extensions-navigation-BeC224yX.js +1 -0
- package/build/assets/external-link-DFpYunfj.js +1 -0
- package/build/assets/files-tab-CL3J9b3p.js +1 -0
- package/build/assets/form-control-classes-CGw40z5h.js +1 -0
- package/build/assets/get-git-path-DlAJa_i6.js +1 -0
- package/build/assets/git-repo-dropdown-DGMEhz7d.js +1 -0
- package/build/assets/git-repo-dropdown-ai8qaNkD.js +1 -0
- package/build/assets/highlighted-source-view-C3sxykQi.js +1 -0
- package/build/assets/home-BCGlNJCA.js +1 -0
- package/build/assets/home-DB1pRqTC.js +1 -0
- package/build/assets/home-automation-run-tooltip-CooFQRIG.js +1 -0
- package/build/assets/home-store-Dl1dPE58.js +1 -0
- package/build/assets/index-home-DB1pRqTC.js +1 -0
- package/build/assets/info-uYSVzX86.js +1 -0
- package/build/assets/install-server-modal-BbJdhzet.js +1 -0
- package/build/assets/kebab-menu-item-content-BYokkRHi.js +1 -0
- package/build/assets/key-Cn5za3rg.js +1 -0
- package/build/assets/launch-C1ieiOGe.js +1 -0
- package/build/assets/list-filter-OFkpRrmi.js +1 -0
- package/build/assets/list-todo-Cuu-STFc.js +1 -0
- package/build/assets/llm-not-configured-banner-BqqYnJ1t.js +27 -0
- package/build/assets/llm-settings-CnDbbmVW.js +1 -0
- package/build/assets/llm-settings-S8Yjg__1.js +1 -0
- package/build/assets/llm-subscription-service-BpPfzW4x.js +1 -0
- package/build/assets/loader-circle-nvrwthvj.js +1 -0
- package/build/assets/loading-spinner-0L3ZTToZ.js +1 -0
- package/build/assets/manage-backends-modal-BCUPswyl.js +1 -0
- package/build/assets/manifest-58597dde.js +1 -0
- package/build/assets/manifest-subpage-layout-BGhiUQbA.js +1 -0
- package/build/assets/map-provider-B9LTm23I.js +1 -0
- package/build/assets/markdown-renderer-Cb2sBWtV.js +8 -0
- package/build/assets/mcp-CKbR4Vft.js +1 -0
- package/build/assets/mcp-marketplace-utils-C13fFccR.js +1 -0
- package/build/assets/mcp-page-Bm4K2NQq.js +9 -0
- package/build/assets/messages-BTN5thLe.js +40 -0
- package/build/assets/modal-body-CMOc2tLl.js +1 -0
- package/build/assets/modal-classes-BAb4Y_BG.js +1 -0
- package/build/assets/modal-close-button-CkJ0Ktjj.js +1 -0
- package/build/assets/mouse-pointer-click-CsgRs_-r.js +1 -0
- package/build/assets/onboarding-Cx_kaiD1.js +1 -0
- package/build/assets/onboarding-modal-vMwn7ihv.js +1 -0
- package/build/assets/organization-service.api-C8XpQ0pM.js +1 -0
- package/build/assets/parse-git-remote-url-DpDM9bK6.js +1 -0
- package/build/assets/pencil-Clh1Wjvh.js +1 -0
- package/build/assets/planner-tab-DQvDU3ap.js +1 -0
- package/build/assets/plug-BuQhHSSG.js +1 -0
- package/build/assets/plugins-management-service-BjYeF0b0.js +1 -0
- package/build/assets/plus-CEKne-Yp.js +1 -0
- package/build/assets/profiles-service.api-QB-T_u-g.js +1 -0
- package/build/assets/providers-FfSZ5TXP.js +1 -0
- package/build/assets/proxy-tcFL2yTQ.js +1 -0
- package/build/assets/puzzle-A9pGxxai.js +1 -0
- package/build/assets/recommended-automations-launcher-Bw8uC4V6.js +1 -0
- package/build/assets/refresh-cw-Bh69DyYO.js +1 -0
- package/build/assets/root-BLeQfBEq.css +1 -0
- package/build/assets/root-ZKKYPR1Z.js +2 -0
- package/build/assets/root-layout-luJoE9IG.js +2 -0
- package/build/assets/schema-field-Csw5fhtN.js +1 -0
- package/build/assets/scroll-fade-state-Dw-i4SGq.js +1 -0
- package/build/assets/sdk-section-page-HTffvm7Q.js +1 -0
- package/build/assets/secret-form-HTUbYw5o.js +1 -0
- package/build/assets/secrets-service-BTor9uAU.js +1 -0
- package/build/assets/secrets-settings-BizaTEr1.js +1 -0
- package/build/assets/server-process-C9RKzd1x.js +1 -0
- package/build/assets/settings-BlmrkwRi.js +1 -0
- package/build/assets/settings-dropdown-input-tM0A0ipy.js +1 -0
- package/build/assets/settings-index-CKq0b0Vg.js +1 -0
- package/build/assets/settings-input-C03KUoSC.js +1 -0
- package/build/assets/settings-list-classes-BJ0g8rWj.js +1 -0
- package/build/assets/settings-modal-AzEF1QPP.js +1 -0
- package/build/assets/settings-service.api-B2agVfjL.js +1 -0
- package/build/assets/settings-switch-CQE0EGC-.js +1 -0
- package/build/assets/settings-utils-ClYOkbbI.js +1 -0
- package/build/assets/shared-conversation-B55pCyBG.js +1 -0
- package/build/assets/shield-check-CFDViW82.js +1 -0
- package/build/assets/sidebar-layout-D3hE08wK.js +1 -0
- package/build/assets/sidebar-mobile-menu-toggle-BOtyJHwE.js +1 -0
- package/build/assets/sidebar-nav-link-CPzhyHQg.js +1 -0
- package/build/assets/sidebar-onboarding-checklist-storage-3qYflszY.js +1 -0
- package/build/assets/sidebar-store-DtpU7zaI.js +1 -0
- package/build/assets/skill-card-pill-row-CFxjoqxn.js +1 -0
- package/build/assets/skill-filter-CWZ5kjcg.js +2 -0
- package/build/assets/skill-icon-badge-CPQJ6A-I.js +1 -0
- package/build/assets/skill-scope-CV1dkAbW.js +1 -0
- package/build/assets/skills-plugins-DGHULTq6.js +1 -0
- package/build/assets/skills-settings-CM1lFv3e.js +1 -0
- package/build/assets/styled-tooltip-Dl06rkpY.js +1 -0
- package/build/assets/task-list-tab-04GNQuii.js +1 -0
- package/build/assets/terminal-Cj0iHIW7.js +3 -0
- package/build/assets/toggle-switch-Fd_QGz0r.js +1 -0
- package/build/assets/trash-2-Dl8_RGz0.js +1 -0
- package/build/assets/trash-_RMt7Ayc.js +1 -0
- package/build/assets/triangle-alert-SM-q4NU_.js +1 -0
- package/build/assets/typography-SgFy466J.js +1 -0
- package/build/assets/usage-tab-BcfWV6db.js +1 -0
- package/build/assets/use-acp-credential-form-BsSW5NHG.js +1 -0
- package/build/assets/use-activate-agent-profile-B2NS8nA5.js +1 -0
- package/build/assets/use-agent-profiles-DWBPC0Si.js +1 -0
- package/build/assets/use-automation-health-BxXdzZMP.js +1 -0
- package/build/assets/use-automations-zYb0dUny.js +1 -0
- package/build/assets/use-can-manage-org-profiles-BWMahtUh.js +1 -0
- package/build/assets/use-cloud-current-user-id-CPHMDG-C.js +1 -0
- package/build/assets/use-config-Bft35DOK.js +1 -0
- package/build/assets/use-create-conversation-DwN5vv2f.js +1 -0
- package/build/assets/use-create-secret-BSxJMxHp.js +1 -0
- package/build/assets/use-get-secrets-BT4ihRwj.js +1 -0
- package/build/assets/use-has-permission-B3C8rQmR.js +1 -0
- package/build/assets/use-is-authed-CFGkY3-Z.js +1 -0
- package/build/assets/use-launch-skill-in-chat-BYjYihBP.js +1 -0
- package/build/assets/use-llm-configured-BI6obxsc.js +1 -0
- package/build/assets/use-llm-profiles-djGAhTWL.js +1 -0
- package/build/assets/use-manifest-capabilities-3z0-1G59.js +1 -0
- package/build/assets/use-onboarding-completion-BXpyUSsJ.js +1 -0
- package/build/assets/use-plugins-marketplace-DI4_pK56.js +1 -0
- package/build/assets/use-save-agent-profile-DdBSTdpN.js +1 -0
- package/build/assets/use-save-settings-CUZW6yXP.js +1 -0
- package/build/assets/use-settings-C5VhGpqd.js +1 -0
- package/build/assets/use-settings-nav-items-DHaUu1Dg.js +16 -0
- package/build/assets/use-tracking-D5t9otIF.js +3 -0
- package/build/assets/use-user-conversation-DT0_QCnL.js +1 -0
- package/build/assets/useInfiniteQuery-CgeUQPfs.js +1 -0
- package/build/assets/useMutation-DFnzkf6f.js +1 -0
- package/build/assets/useQueries-BhbrGEf1.js +1 -0
- package/build/assets/useQuery-BXWbZBZl.js +1 -0
- package/build/assets/utils-DaCIEEQP.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-CTvDDiXg.js +1 -0
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kepq2zme-ZixYGy6E.js +186 -0
- package/build/assets/vendor~index-home~home~conversation-panel~conversation-BTyukeM-.js +13 -0
- package/build/assets/vendor~root-layout-BlUaZ18v.js +1 -0
- package/build/assets/vendor~root-layout~conversation-panel~conversation-BYAWJwQX.js +1 -0
- package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-CHaLEBVR.js +1 -0
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-B2OLKL7N.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~hjcjabwg-Dtu7BpYk.js +48 -0
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iw7io29p-Dz-MAyNb.js +1 -0
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-DonTKfQD.js +4949 -0
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-BgxDvUcf.js +8420 -0
- package/build/assets/verification-settings-Bj6bo097.js +1 -0
- package/build/assets/wrench-hi7Q13dF.js +1 -0
- package/build/assets/x-DkgltWa0.js +1 -0
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +124 -43
- package/build/locales/ca/openhands.json +124 -43
- package/build/locales/de/openhands.json +124 -43
- package/build/locales/en/openhands.json +124 -43
- package/build/locales/es/openhands.json +124 -43
- package/build/locales/fr/openhands.json +124 -43
- package/build/locales/it/openhands.json +124 -43
- package/build/locales/ja/openhands.json +124 -43
- package/build/locales/ko-KR/openhands.json +124 -43
- package/build/locales/no/openhands.json +124 -43
- package/build/locales/pt/openhands.json +124 -43
- package/build/locales/tr/openhands.json +124 -43
- package/build/locales/uk/openhands.json +124 -43
- package/build/locales/zh-CN/openhands.json +124 -43
- package/build/locales/zh-TW/openhands.json +124 -43
- package/config/defaults.json +2 -2
- 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 +115 -110
- package/dist/api/agent-server-adapter.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/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.js +29 -24
- package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
- 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/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/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.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 +160 -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-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.js +10 -10
- 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/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 +179 -177
- package/dist/components/features/chat/chat-interface.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 +138 -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 +98 -88
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.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/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 +0 -1
- 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 +74 -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/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/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 +1 -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 +10 -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/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 +7 -7
- package/dist/components/features/settings/sdk-settings/sdk-section-page.js.map +1 -1
- 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-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 +115 -111
- package/dist/components/features/sidebar/sidebar-rail-body.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 +88 -0
- package/dist/components/features/skills/build-skill-pills.js.map +1 -0
- 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.js +166 -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 +4 -4
- 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 +2 -2
- 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/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-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/query-keys.cjs +1 -1
- package/dist/hooks/query/query-keys.cjs.map +1 -1
- package/dist/hooks/query/query-keys.d.ts +3 -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-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.js +1 -1
- package/dist/hooks/query/use-backends-health.js.map +1 -1
- package/dist/hooks/query/use-commit-changes.cjs +1 -1
- package/dist/hooks/query/use-commit-changes.js +4 -4
- 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 +3 -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 +1 -1
- 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-unified-get-git-changes.cjs +1 -1
- package/dist/hooks/query/use-unified-get-git-changes.js +4 -4
- package/dist/hooks/query/use-unified-git-commits.cjs +1 -1
- package/dist/hooks/query/use-unified-git-commits.js +4 -4
- package/dist/hooks/query/use-unified-git-diff.cjs +1 -1
- package/dist/hooks/query/use-unified-git-diff.js +4 -4
- package/dist/hooks/query/use-workspace-files.cjs +1 -1
- package/dist/hooks/query/use-workspace-files.js +6 -6
- 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-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-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 +124 -43
- 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 +2091 -714
- 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/locales/ar/openhands.json +124 -43
- package/dist/locales/ca/openhands.json +124 -43
- package/dist/locales/de/openhands.json +124 -43
- package/dist/locales/en/openhands.json +124 -43
- package/dist/locales/es/openhands.json +124 -43
- package/dist/locales/fr/openhands.json +124 -43
- package/dist/locales/it/openhands.json +124 -43
- package/dist/locales/ja/openhands.json +124 -43
- package/dist/locales/ko-KR/openhands.json +124 -43
- package/dist/locales/no/openhands.json +124 -43
- package/dist/locales/pt/openhands.json +124 -43
- package/dist/locales/tr/openhands.json +124 -43
- package/dist/locales/uk/openhands.json +124 -43
- package/dist/locales/zh-CN/openhands.json +124 -43
- package/dist/locales/zh-TW/openhands.json +124 -43
- 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 +47 -31
- package/dist/manifests/automation-interface.js +48 -54
- 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 +4843 -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 +87 -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 +98 -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 +32 -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 +29 -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-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/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 +72 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/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 +16 -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/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 +68 -66
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.cjs +1002 -47
- package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.js +59 -17
- package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
- 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/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/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/app-settings.cjs +1 -1
- package/dist/routes/app-settings.cjs.map +1 -1
- package/dist/routes/app-settings.js +87 -85
- 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 +121 -151
- 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 +137 -107
- 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/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.js +8 -0
- package/dist/types/automation.js.map +1 -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/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-relative-time.cjs +2 -0
- package/dist/utils/format-relative-time.cjs.map +1 -0
- package/dist/utils/format-relative-time.js +17 -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/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-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/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/package.json +3 -3
- package/scripts/check-translation-completeness.cjs +4 -0
- package/scripts/dev-static.mjs +49 -43
- package/scripts/dev-with-automation.mjs +13 -5
- package/scripts/seed-automation-ux-data.mjs +810 -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-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-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~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~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.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.js +0 -45
- package/dist/utils/tips.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~ew3u153i-rfV8mQ9m.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface-validation.js","names":[],"sources":["../../src/manifests/interface-validation.ts"],"sourcesContent":["/**\n * Admission policy for the extension-published Automation interface manifest.\n *\n * Like a setup entry, the interface manifest is data authored in a different\n * repository that instructs this host to render copy, build links, and address\n * requests, so the host decides what it is *permitted* to state. Admission is\n * all-or-nothing: one bad field rejects the whole manifest, and the host falls\n * back to its own defaults rather than rendering a partially-trusted mix.\n */\n\nimport type {\n AutomationAttributeName,\n InterfaceAttributeType,\n InterfaceRoutes,\n OverviewMetric,\n} from \"./types\";\nimport {\n DASHBOARD_FILTER_IDS,\n DASHBOARD_FILTER_VALUES,\n DASHBOARD_SORT_VALUES,\n INTERFACE_ICON_SLUGS,\n INTERFACE_SUB_PAGE_IDS,\n INTERFACE_VERSION,\n OVERVIEW_METRICS,\n OVERVIEW_TILE_PLACEHOLDERS,\n} from \"./types\";\n\n/** Copy must never be able to inject markup into the host. */\nconst MARKUP_PATTERN = /<[A-Za-z/!]/;\nconst SLUG_PATTERN = /^[a-z0-9]+(-[a-z0-9]+)*$/;\n/** The one URL the manifest may state, pinned to the product documentation. */\nconst DOCS_URL_PREFIX = \"https://docs.openhands.dev/\";\nconst FILE_KIND_PATTERN = /^[a-z][a-z-]*$/;\nconst FILENAME_SUFFIX_PATTERN = /^\\.[a-z][a-z.]*json$/;\nconst EVENT_SOURCE_PATTERN = /^[a-z0-9][a-z0-9.-]*$/;\n/** Service-relative only: rooted, no traversal, no query, no fragment. */\nconst ENDPOINT_PATTERN = /^\\/[A-Za-z0-9/{}_-]*$/;\n/** Exactly one `{id}` substitution and no other braces. */\nconst ID_ENDPOINT_PATTERN = /^[^{}]*\\{id\\}[^{}]*$/;\n\nconst GIT_PROVIDERS = [\"github\", \"gitlab\", \"bitbucket\"] as const;\n/**\n * The attribute semantics this host's edit dialog implements: the control it\n * renders per property and the requiredness it enforces. Admission pins a\n * declared attribute to exactly these, so an admitted manifest can never\n * promise a control, a requiredness, or (below) a minimum the form would\n * silently ignore.\n */\nconst HOST_ATTRIBUTES: Record<\n AutomationAttributeName,\n { type: InterfaceAttributeType; required: boolean }\n> = {\n name: { type: \"text\", required: true },\n prompt: { type: \"textarea\", required: false },\n model: { type: \"llm-profile\", required: false },\n timeout: { type: \"number\", required: false },\n schedule: { type: \"schedule\", required: false },\n};\nconst ATTRIBUTE_NAMES = Object.keys(HOST_ATTRIBUTES);\nconst PLAIN_ENDPOINT_NAMES = [\n \"list\",\n \"health\",\n \"capabilities\",\n \"validate\",\n \"createPrompt\",\n \"createPlugin\",\n] as const;\nconst ID_ENDPOINT_NAMES = [\"detail\", \"dispatch\", \"runs\", \"tarball\"] as const;\n\nexport interface InterfaceValidationContext {\n /** Ids of the published automation catalog, for the featured-list check. */\n catalogIds: ReadonlySet<string>;\n /** The routes this host has registrations for. A manifest must match them. */\n mountedRoutes: InterfaceRoutes;\n}\n\nexport interface InterfaceValidationResult {\n valid: boolean;\n errors: string[];\n}\n\ntype Rec = Record<string, unknown>;\n\nfunction isRecord(value: unknown): value is Rec {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isOneOf<T extends readonly string[]>(\n value: unknown,\n values: T,\n): value is T[number] {\n return (\n typeof value === \"string\" && (values as readonly string[]).includes(value)\n );\n}\n\nclass InterfaceChecker {\n readonly errors: string[] = [];\n\n fail(path: string, reason: string): false {\n this.errors.push(`${path}: ${reason}`);\n return false;\n }\n\n /** Literal user-visible copy. Carries no markup. */\n copy(value: unknown, path: string): boolean {\n if (typeof value !== \"string\" || value.length === 0) {\n return this.fail(path, \"must be a non-empty string\");\n }\n if (MARKUP_PATTERN.test(value)) {\n return this.fail(path, \"must not contain markup\");\n }\n return true;\n }\n\n /** A closed object: every present key must be an expected one. */\n closed(container: Rec, allowed: readonly string[], path: string): void {\n Object.keys(container)\n .filter((key) => !allowed.includes(key))\n .forEach((key) => this.fail(`${path}.${key}`, \"is not allowed\"));\n }\n\n record(value: unknown, path: string): value is Rec {\n if (isRecord(value)) return true;\n this.fail(path, \"must be an object\");\n return false;\n }\n}\n\nfunction checkRoutes(\n check: InterfaceChecker,\n routes: unknown,\n mounted: InterfaceRoutes,\n): void {\n if (!check.record(routes, \"routes\")) return;\n check.closed(routes, [\"list\", \"setup\", \"detail\", \"templates\"], \"routes\");\n\n // The host serves what it has registrations for, so a declared route must be\n // exactly the mounted shape — the manifest owns link construction, not the\n // router table.\n ([\"list\", \"setup\", \"detail\"] as const).forEach((name) => {\n if (routes[name] !== mounted[name]) {\n check.fail(`routes.${name}`, `must be \"${mounted[name]}\"`);\n }\n });\n if (\n routes.templates !== undefined &&\n routes.templates !== mounted.templates\n ) {\n check.fail(\n \"routes.templates\",\n mounted.templates === undefined\n ? \"is not a route this host mounts\"\n : `must be \"${mounted.templates}\"`,\n );\n }\n}\n\nfunction checkSubPages(check: InterfaceChecker, subPages: unknown): void {\n if (!Array.isArray(subPages) || subPages.length === 0) {\n check.fail(\"navigation.subPages\", \"must be a non-empty array\");\n return;\n }\n const seen = new Set<string>();\n subPages.forEach((item: unknown, index) => {\n const path = `navigation.subPages[${index}]`;\n if (!check.record(item, path)) return;\n check.closed(item, [\"page\", \"label\", \"icon\"], path);\n\n const { page, label, icon } = item;\n if (!isOneOf(page, INTERFACE_SUB_PAGE_IDS)) {\n check.fail(`${path}.page`, \"is not a sub-page this host serves\");\n } else if (seen.has(page)) {\n check.fail(`${path}.page`, \"repeats a page\");\n } else {\n seen.add(page);\n }\n check.copy(label, `${path}.label`);\n checkIconSlug(check, icon, `${path}.icon`);\n });\n}\n\nfunction checkIconSlug(\n check: InterfaceChecker,\n icon: unknown,\n path: string,\n): void {\n if (!isOneOf(icon, INTERFACE_ICON_SLUGS)) {\n check.fail(path, \"is not an icon this host ships\");\n }\n}\n\nfunction checkNavigation(check: InterfaceChecker, navigation: unknown): void {\n if (!check.record(navigation, \"navigation\")) return;\n check.closed(\n navigation,\n [\"sidebar\", \"commandMenu\", \"subPages\"],\n \"navigation\",\n );\n\n if (check.record(navigation.sidebar, \"navigation.sidebar\")) {\n check.closed(navigation.sidebar, [\"label\"], \"navigation.sidebar\");\n check.copy(navigation.sidebar.label, \"navigation.sidebar.label\");\n }\n if (check.record(navigation.commandMenu, \"navigation.commandMenu\")) {\n const menu = navigation.commandMenu;\n check.closed(\n menu,\n [\"title\", \"description\", \"keywords\"],\n \"navigation.commandMenu\",\n );\n check.copy(menu.title, \"navigation.commandMenu.title\");\n check.copy(menu.description, \"navigation.commandMenu.description\");\n check.copy(menu.keywords, \"navigation.commandMenu.keywords\");\n }\n if (navigation.subPages !== undefined) {\n checkSubPages(check, navigation.subPages);\n }\n}\n\nfunction checkPages(check: InterfaceChecker, pages: unknown): void {\n if (!check.record(pages, \"pages\")) return;\n check.closed(pages, [\"list\", \"detail\", \"edit\", \"templates\"], \"pages\");\n\n if (check.record(pages.list, \"pages.list\")) {\n check.closed(\n pages.list,\n [\"title\", \"subtitle\", \"overview\", \"filters\", \"sort\", \"insights\"],\n \"pages.list\",\n );\n check.copy(pages.list.title, \"pages.list.title\");\n check.copy(pages.list.subtitle, \"pages.list.subtitle\");\n if (pages.list.overview !== undefined) {\n checkOverview(check, pages.list.overview);\n }\n if (pages.list.filters !== undefined) {\n checkFilters(check, pages.list.filters);\n }\n if (pages.list.sort !== undefined) {\n checkSort(check, pages.list.sort);\n }\n if (pages.list.insights !== undefined) {\n checkInsights(check, pages.list.insights);\n }\n }\n if (check.record(pages.detail, \"pages.detail\")) {\n check.closed(pages.detail, [\"backLabel\"], \"pages.detail\");\n check.copy(pages.detail.backLabel, \"pages.detail.backLabel\");\n }\n if (check.record(pages.edit, \"pages.edit\")) {\n check.closed(pages.edit, [\"title\"], \"pages.edit\");\n check.copy(pages.edit.title, \"pages.edit.title\");\n }\n if (pages.templates !== undefined) {\n checkTemplatesPage(check, pages.templates);\n }\n}\n\nfunction checkOverview(check: InterfaceChecker, overview: unknown): void {\n const path = \"pages.list.overview\";\n if (!check.record(overview, path)) return;\n check.closed(overview, [\"label\", \"tiles\"], path);\n check.copy(overview.label, `${path}.label`);\n\n const { tiles } = overview;\n if (!Array.isArray(tiles) || tiles.length === 0) {\n check.fail(`${path}.tiles`, \"must be a non-empty array\");\n return;\n }\n const seen = new Set<string>();\n tiles.forEach((tile: unknown, index) => {\n checkOverviewTile(check, tile, seen, `${path}.tiles[${index}]`);\n });\n}\n\nfunction checkOverviewTile(\n check: InterfaceChecker,\n tile: unknown,\n seen: Set<string>,\n path: string,\n): void {\n if (!check.record(tile, path)) return;\n check.closed(tile, [\"metric\", \"label\", \"detail\", \"zeroDetail\", \"icon\"], path);\n\n const { metric, label, detail, zeroDetail, icon } = tile;\n check.copy(label, `${path}.label`);\n checkIconSlug(check, icon, `${path}.icon`);\n if (!isOneOf(metric, OVERVIEW_METRICS)) {\n check.fail(`${path}.metric`, \"is not a metric this host computes\");\n check.copy(detail, `${path}.detail`);\n if (zeroDetail !== undefined) check.copy(zeroDetail, `${path}.zeroDetail`);\n return;\n }\n if (seen.has(metric)) {\n check.fail(`${path}.metric`, \"repeats a metric\");\n } else {\n seen.add(metric);\n }\n checkTileCopy(check, detail, metric, `${path}.detail`);\n if (zeroDetail !== undefined) {\n checkTileCopy(check, zeroDetail, metric, `${path}.zeroDetail`);\n }\n}\n\n/**\n * Tile copy may embed `{{name}}` placeholders, but only the names the metric\n * exposes — plain substitution, never an expression.\n */\nfunction checkTileCopy(\n check: InterfaceChecker,\n value: unknown,\n metric: OverviewMetric,\n path: string,\n): void {\n if (!check.copy(value, path)) return;\n const exposed = OVERVIEW_TILE_PLACEHOLDERS[metric];\n const unknownPlaceholder =\n exposed.length === 0\n ? /\\{\\{/\n : new RegExp(`\\\\{\\\\{(?!(?:${exposed.join(\"|\")})\\\\}\\\\})`);\n if (unknownPlaceholder.test(value as string)) {\n check.fail(path, \"uses a placeholder this metric does not expose\");\n }\n}\n\nfunction checkFilters(check: InterfaceChecker, filters: unknown): void {\n const path = \"pages.list.filters\";\n if (!Array.isArray(filters) || filters.length === 0) {\n check.fail(path, \"must be a non-empty array\");\n return;\n }\n const seen = new Set<string>();\n filters.forEach((filter: unknown, index) => {\n checkFilter(check, filter, seen, `${path}[${index}]`);\n });\n}\n\nfunction checkFilter(\n check: InterfaceChecker,\n filter: unknown,\n seen: Set<string>,\n path: string,\n): void {\n if (!check.record(filter, path)) return;\n check.closed(filter, [\"id\", \"label\", \"options\"], path);\n\n const { id, label, options } = filter;\n check.copy(label, `${path}.label`);\n if (!isOneOf(id, DASHBOARD_FILTER_IDS)) {\n check.fail(`${path}.id`, \"is not a filter this host implements\");\n return;\n }\n if (seen.has(id)) {\n check.fail(`${path}.id`, \"repeats a filter\");\n } else {\n seen.add(id);\n }\n checkFilterOptions(\n check,\n options,\n DASHBOARD_FILTER_VALUES[id],\n `${path}.options`,\n );\n}\n\nfunction checkFilterOptions(\n check: InterfaceChecker,\n options: unknown,\n values: readonly string[],\n path: string,\n): void {\n if (!Array.isArray(options) || options.length < 2) {\n check.fail(path, \"must offer at least two options\");\n return;\n }\n const seen = new Set<string>();\n options.forEach((option: unknown, index) => {\n const optionPath = `${path}[${index}]`;\n if (!check.record(option, optionPath)) return;\n check.closed(option, [\"value\", \"label\"], optionPath);\n\n const { value, label } = option;\n if (!isOneOf(value, values)) {\n check.fail(`${optionPath}.value`, \"is not a value this host implements\");\n } else if (seen.has(value)) {\n check.fail(`${optionPath}.value`, \"repeats a value\");\n } else {\n seen.add(value);\n }\n check.copy(label, `${optionPath}.label`);\n });\n // \"all\" is the host's initial selection and what Clear filters resets to,\n // so a filter that does not offer it could never be neutral.\n if (!seen.has(\"all\")) {\n check.fail(path, 'must offer the \"all\" option');\n }\n}\n\nfunction checkSort(check: InterfaceChecker, sort: unknown): void {\n const path = \"pages.list.sort\";\n if (!check.record(sort, path)) return;\n check.closed(sort, [\"label\", \"options\", \"default\"], path);\n\n const { label, options, default: defaultValue } = sort;\n check.copy(label, `${path}.label`);\n const declared = new Set<string>();\n if (!Array.isArray(options) || options.length === 0) {\n check.fail(`${path}.options`, \"must be a non-empty array\");\n } else {\n options.forEach((option: unknown, index) => {\n const optionPath = `${path}.options[${index}]`;\n if (!check.record(option, optionPath)) return;\n check.closed(option, [\"value\", \"label\"], optionPath);\n\n if (!isOneOf(option.value, DASHBOARD_SORT_VALUES)) {\n check.fail(`${optionPath}.value`, \"is not a sort this host implements\");\n } else if (declared.has(option.value)) {\n check.fail(`${optionPath}.value`, \"repeats a value\");\n } else {\n declared.add(option.value);\n }\n check.copy(option.label, `${optionPath}.label`);\n });\n }\n if (typeof defaultValue !== \"string\" || !declared.has(defaultValue)) {\n check.fail(`${path}.default`, \"must be one of the declared option values\");\n }\n}\n\n/** Every insight state and stat the host renders must have a caption. */\nconst INSIGHTS_SHAPE = {\n health: [\"healthy\", \"failing\", \"running\", \"disabled\", \"neverRun\", \"checking\"],\n lastRun: [\"label\", \"never\", \"justNow\"],\n stats: [\"runs\", \"recentSuccess\", \"averageDuration\"],\n} as const;\n\nfunction checkInsights(check: InterfaceChecker, insights: unknown): void {\n const path = \"pages.list.insights\";\n if (!check.record(insights, path)) return;\n check.closed(insights, Object.keys(INSIGHTS_SHAPE), path);\n\n (Object.keys(INSIGHTS_SHAPE) as (keyof typeof INSIGHTS_SHAPE)[]).forEach(\n (section) => {\n const sectionPath = `${path}.${section}`;\n const value = insights[section];\n if (!check.record(value, sectionPath)) return;\n const keys = INSIGHTS_SHAPE[section];\n check.closed(value, keys, sectionPath);\n keys.forEach((key) => {\n check.copy(value[key], `${sectionPath}.${key}`);\n });\n },\n );\n}\n\nfunction checkTemplatesPage(check: InterfaceChecker, templates: unknown): void {\n const path = \"pages.templates\";\n if (!check.record(templates, path)) return;\n check.closed(templates, [\"title\", \"description\"], path);\n check.copy(templates.title, `${path}.title`);\n check.copy(templates.description, `${path}.description`);\n}\n\n/**\n * The sub-page surface is declared whole or not at all. Navigation that points\n * at an unrouted page, or a dashboard with filters but no insight captions,\n * would be a partially-trusted mix, and the host refuses those wholesale.\n */\nfunction checkSubPageGroup(check: InterfaceChecker, candidate: Rec): void {\n const routes = isRecord(candidate.routes) ? candidate.routes : {};\n const navigation = isRecord(candidate.navigation) ? candidate.navigation : {};\n const pages = isRecord(candidate.pages) ? candidate.pages : {};\n const list = isRecord(pages.list) ? pages.list : {};\n\n const pieces: [string, unknown][] = [\n [\"routes.templates\", routes.templates],\n [\"navigation.subPages\", navigation.subPages],\n [\"pages.templates\", pages.templates],\n [\"pages.list.overview\", list.overview],\n [\"pages.list.filters\", list.filters],\n [\"pages.list.sort\", list.sort],\n [\"pages.list.insights\", list.insights],\n ];\n const missing = pieces\n .filter(([, value]) => value === undefined)\n .map(([name]) => name);\n if (missing.length === 0 || missing.length === pieces.length) return;\n check.fail(\n \"interface\",\n `the sub-page surface must be declared whole; missing ${missing.join(\", \")}`,\n );\n}\n\nfunction checkAttribute(\n check: InterfaceChecker,\n host: { type: InterfaceAttributeType; required: boolean },\n attribute: unknown,\n path: string,\n): void {\n if (!check.record(attribute, path)) return;\n check.closed(\n attribute,\n [\"type\", \"label\", \"help\", \"required\", \"constraints\"],\n path,\n );\n\n const { type, label, help, required, constraints } = attribute;\n if (type !== host.type) {\n check.fail(\n `${path}.type`,\n `must be \"${host.type}\", the control this host renders`,\n );\n }\n check.copy(label, `${path}.label`);\n if (help !== undefined) check.copy(help, `${path}.help`);\n if (required !== host.required) {\n check.fail(\n `${path}.required`,\n `must be ${host.required}, what this host enforces`,\n );\n }\n\n if (constraints !== undefined) {\n if (host.type !== \"number\") {\n check.fail(\n `${path}.constraints`,\n \"is only allowed on a number attribute\",\n );\n } else if (check.record(constraints, `${path}.constraints`)) {\n check.closed(constraints, [\"min\", \"max\"], `${path}.constraints`);\n const { min, max } = constraints;\n // The form validates a positive integer, i.e. an effective minimum of 1;\n // any other declared minimum would be a promise it does not keep.\n if (min !== undefined && min !== 1) {\n check.fail(\n `${path}.constraints.min`,\n \"must be the 1 this host enforces\",\n );\n }\n if (\n max !== undefined &&\n (!Number.isInteger(max) || (max as number) < 1)\n ) {\n check.fail(`${path}.constraints.max`, \"must be a positive integer\");\n }\n }\n }\n}\n\nfunction checkAttributes(check: InterfaceChecker, attributes: unknown): void {\n if (!check.record(attributes, \"attributes\")) return;\n const names = Object.keys(attributes);\n if (names.length === 0) {\n check.fail(\"attributes\", \"must declare at least one attribute\");\n }\n names.forEach((name) => {\n if (!ATTRIBUTE_NAMES.includes(name)) {\n check.fail(`attributes.${name}`, \"is not a settable attribute\");\n return;\n }\n checkAttribute(\n check,\n HOST_ATTRIBUTES[name as AutomationAttributeName],\n attributes[name],\n `attributes.${name}`,\n );\n });\n}\n\nfunction checkImportExport(\n check: InterfaceChecker,\n importExport: unknown,\n): void {\n if (!check.record(importExport, \"importExport\")) return;\n check.closed(\n importExport,\n [\"fileKind\", \"fileVersion\", \"filenameSuffix\", \"importDefaults\"],\n \"importExport\",\n );\n\n const { fileKind, fileVersion, filenameSuffix, importDefaults } =\n importExport;\n if (typeof fileKind !== \"string\" || !FILE_KIND_PATTERN.test(fileKind)) {\n check.fail(\"importExport.fileKind\", \"must be a lowercase slug\");\n }\n if (fileVersion !== 1) {\n check.fail(\"importExport.fileVersion\", \"must be 1\");\n }\n if (\n typeof filenameSuffix !== \"string\" ||\n !FILENAME_SUFFIX_PATTERN.test(filenameSuffix)\n ) {\n check.fail(\"importExport.filenameSuffix\", \"must be a .json suffix\");\n }\n if (check.record(importDefaults, \"importExport.importDefaults\")) {\n check.closed(\n importDefaults,\n [\"repoProvider\", \"placeholderEventSource\"],\n \"importExport.importDefaults\",\n );\n if (\n typeof importDefaults.repoProvider !== \"string\" ||\n !(GIT_PROVIDERS as readonly string[]).includes(\n importDefaults.repoProvider,\n )\n ) {\n check.fail(\n \"importExport.importDefaults.repoProvider\",\n \"is not a supported provider\",\n );\n }\n if (\n typeof importDefaults.placeholderEventSource !== \"string\" ||\n !EVENT_SOURCE_PATTERN.test(importDefaults.placeholderEventSource)\n ) {\n check.fail(\n \"importExport.importDefaults.placeholderEventSource\",\n \"must be a lowercase event source\",\n );\n }\n }\n}\n\nfunction checkEndpoints(check: InterfaceChecker, endpoints: unknown): void {\n if (!check.record(endpoints, \"endpoints\")) return;\n const allowed = [...PLAIN_ENDPOINT_NAMES, ...ID_ENDPOINT_NAMES];\n check.closed(endpoints, allowed, \"endpoints\");\n\n const endpointAt = (name: string): string | null => {\n const value = endpoints[name];\n if (\n typeof value !== \"string\" ||\n !ENDPOINT_PATTERN.test(value) ||\n value.includes(\"//\")\n ) {\n check.fail(`endpoints.${name}`, \"must be a rooted service-relative path\");\n return null;\n }\n return value;\n };\n\n PLAIN_ENDPOINT_NAMES.forEach((name) => {\n const value = endpointAt(name);\n if (value !== null && /[{}]/.test(value)) {\n check.fail(`endpoints.${name}`, \"must not carry a substitution\");\n }\n });\n ID_ENDPOINT_NAMES.forEach((name) => {\n const value = endpointAt(name);\n if (value !== null && !ID_ENDPOINT_PATTERN.test(value)) {\n check.fail(`endpoints.${name}`, \"must carry exactly one {id}\");\n }\n });\n}\n\nfunction checkSlugList(\n check: InterfaceChecker,\n value: unknown,\n path: string,\n): string[] {\n if (!Array.isArray(value) || value.length === 0) {\n check.fail(path, \"must be a non-empty array\");\n return [];\n }\n const slugs = value.filter((item): item is string => {\n if (typeof item === \"string\" && SLUG_PATTERN.test(item)) return true;\n check.fail(path, \"must contain only lowercase slugs\");\n return false;\n });\n if (new Set(slugs).size !== slugs.length) {\n check.fail(path, \"must not repeat an id\");\n }\n return slugs;\n}\n\nconst TOP_LEVEL_KEYS = [\n \"version\",\n \"routes\",\n \"navigation\",\n \"pages\",\n \"docsUrl\",\n \"attributes\",\n \"importExport\",\n \"endpoints\",\n \"featuredAutomationIds\",\n \"responderIntegrationIds\",\n];\n\n/**\n * Decide whether this host will act on a published interface manifest.\n *\n * The version is checked first and fails closed: a format this host does not\n * recognise is refused rather than interpreted with today's rules.\n */\nexport function validateInterfaceManifest(\n candidate: unknown,\n context: InterfaceValidationContext,\n): InterfaceValidationResult {\n if (!isRecord(candidate)) {\n return { valid: false, errors: [\"interface: must be an object\"] };\n }\n if (candidate.version !== INTERFACE_VERSION) {\n return {\n valid: false,\n errors: [`interface.version: must be \"${INTERFACE_VERSION}\"`],\n };\n }\n\n const check = new InterfaceChecker();\n check.closed(candidate, TOP_LEVEL_KEYS, \"interface\");\n\n checkRoutes(check, candidate.routes, context.mountedRoutes);\n checkNavigation(check, candidate.navigation);\n checkPages(check, candidate.pages);\n if (\n typeof candidate.docsUrl !== \"string\" ||\n !candidate.docsUrl.startsWith(DOCS_URL_PREFIX)\n ) {\n check.fail(\"docsUrl\", `must start with ${DOCS_URL_PREFIX}`);\n }\n checkAttributes(check, candidate.attributes);\n checkImportExport(check, candidate.importExport);\n checkEndpoints(check, candidate.endpoints);\n\n checkSlugList(\n check,\n candidate.featuredAutomationIds,\n \"featuredAutomationIds\",\n ).forEach((id) => {\n if (!context.catalogIds.has(id)) {\n check.fail(\"featuredAutomationIds\", `${id} is not a catalog entry`);\n }\n });\n checkSlugList(\n check,\n candidate.responderIntegrationIds,\n \"responderIntegrationIds\",\n );\n\n checkSubPageGroup(check, candidate);\n\n return { valid: check.errors.length === 0, errors: check.errors };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"interface-validation.js","names":[],"sources":["../../src/manifests/interface-validation.ts"],"sourcesContent":["/**\n * Admission policy for the extension-published Automation interface manifest.\n *\n * Like a setup entry, the interface manifest is data authored in a different\n * repository that instructs this host to render copy, build links, and address\n * requests, so the host decides what it is *permitted* to state. Admission is\n * all-or-nothing: one bad field rejects the whole manifest, and the host falls\n * back to its own defaults rather than rendering a partially-trusted mix.\n */\n\nimport type {\n AutomationAttributeName,\n InterfaceAttributeType,\n InterfaceRoutes,\n OverviewMetric,\n} from \"./types\";\nimport {\n DASHBOARD_FILTER_IDS,\n DASHBOARD_FILTER_VALUES,\n DASHBOARD_SORT_VALUES,\n INTERFACE_ICON_SLUGS,\n INTERFACE_SUB_PAGE_IDS,\n INTERFACE_VERSION,\n OVERVIEW_METRICS,\n OVERVIEW_TILE_PLACEHOLDERS,\n} from \"./types\";\n\n/** Copy must never be able to inject markup into the host. */\nconst MARKUP_PATTERN = /<[A-Za-z/!]/;\nconst SLUG_PATTERN = /^[a-z0-9]+(-[a-z0-9]+)*$/;\n/** The one URL the manifest may state, pinned to the product documentation. */\nconst DOCS_URL_PREFIX = \"https://docs.openhands.dev/\";\nconst FILE_KIND_PATTERN = /^[a-z][a-z-]*$/;\nconst FILENAME_SUFFIX_PATTERN = /^\\.[a-z][a-z.]*json$/;\nconst EVENT_SOURCE_PATTERN = /^[a-z0-9][a-z0-9.-]*$/;\n/** Service-relative only: rooted, no traversal, no query, no fragment. */\nconst ENDPOINT_PATTERN = /^\\/[A-Za-z0-9/{}_-]*$/;\n/** Exactly one `{id}` substitution and no other braces. */\nconst ID_ENDPOINT_PATTERN = /^[^{}]*\\{id\\}[^{}]*$/;\n\nconst GIT_PROVIDERS = [\"github\", \"gitlab\", \"bitbucket\"] as const;\n/**\n * The attribute semantics this host's edit dialog implements: the control it\n * renders per property and the requiredness it enforces. Admission pins a\n * declared attribute to exactly these, so an admitted manifest can never\n * promise a control, a requiredness, or (below) a minimum the form would\n * silently ignore.\n */\nconst HOST_ATTRIBUTES: Record<\n AutomationAttributeName,\n { type: InterfaceAttributeType; required: boolean }\n> = {\n name: { type: \"text\", required: true },\n prompt: { type: \"textarea\", required: false },\n model: { type: \"llm-profile\", required: false },\n timeout: { type: \"number\", required: false },\n schedule: { type: \"schedule\", required: false },\n};\nconst ATTRIBUTE_NAMES = Object.keys(HOST_ATTRIBUTES);\nconst PLAIN_ENDPOINT_NAMES = [\n \"list\",\n \"health\",\n \"capabilities\",\n \"validate\",\n \"createPrompt\",\n \"createPlugin\",\n] as const;\n// Endpoints added after the block shipped. A manifest published before them is\n// still admitted - requiring them would 404 the whole surface for anyone\n// pinning an older package - so they are checked only when present, and a\n// bundle entry, which is the only thing that needs them, fails on its own if\n// its manifest predates them.\nconst OPTIONAL_PLAIN_ENDPOINT_NAMES = [\"createBundle\", \"uploads\"] as const;\nconst ID_ENDPOINT_NAMES = [\"detail\", \"dispatch\", \"runs\", \"tarball\"] as const;\n\nexport interface InterfaceValidationContext {\n /** Ids of the published automation catalog, for the featured-list check. */\n catalogIds: ReadonlySet<string>;\n /** The routes this host has registrations for. A manifest must match them. */\n mountedRoutes: InterfaceRoutes;\n}\n\nexport interface InterfaceValidationResult {\n valid: boolean;\n errors: string[];\n}\n\ntype Rec = Record<string, unknown>;\n\nfunction isRecord(value: unknown): value is Rec {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isOneOf<T extends readonly string[]>(\n value: unknown,\n values: T,\n): value is T[number] {\n return (\n typeof value === \"string\" && (values as readonly string[]).includes(value)\n );\n}\n\nclass InterfaceChecker {\n readonly errors: string[] = [];\n\n fail(path: string, reason: string): false {\n this.errors.push(`${path}: ${reason}`);\n return false;\n }\n\n /** Literal user-visible copy. Carries no markup. */\n copy(value: unknown, path: string): boolean {\n if (typeof value !== \"string\" || value.length === 0) {\n return this.fail(path, \"must be a non-empty string\");\n }\n if (MARKUP_PATTERN.test(value)) {\n return this.fail(path, \"must not contain markup\");\n }\n return true;\n }\n\n /** A closed object: every present key must be an expected one. */\n closed(container: Rec, allowed: readonly string[], path: string): void {\n Object.keys(container)\n .filter((key) => !allowed.includes(key))\n .forEach((key) => this.fail(`${path}.${key}`, \"is not allowed\"));\n }\n\n record(value: unknown, path: string): value is Rec {\n if (isRecord(value)) return true;\n this.fail(path, \"must be an object\");\n return false;\n }\n}\n\nfunction checkRoutes(\n check: InterfaceChecker,\n routes: unknown,\n mounted: InterfaceRoutes,\n): void {\n if (!check.record(routes, \"routes\")) return;\n check.closed(routes, [\"list\", \"setup\", \"detail\", \"templates\"], \"routes\");\n\n // The host serves what it has registrations for, so a declared route must be\n // exactly the mounted shape — the manifest owns link construction, not the\n // router table.\n ([\"list\", \"setup\", \"detail\"] as const).forEach((name) => {\n if (routes[name] !== mounted[name]) {\n check.fail(`routes.${name}`, `must be \"${mounted[name]}\"`);\n }\n });\n if (\n routes.templates !== undefined &&\n routes.templates !== mounted.templates\n ) {\n check.fail(\n \"routes.templates\",\n mounted.templates === undefined\n ? \"is not a route this host mounts\"\n : `must be \"${mounted.templates}\"`,\n );\n }\n}\n\nfunction checkSubPages(check: InterfaceChecker, subPages: unknown): void {\n if (!Array.isArray(subPages) || subPages.length === 0) {\n check.fail(\"navigation.subPages\", \"must be a non-empty array\");\n return;\n }\n const seen = new Set<string>();\n subPages.forEach((item: unknown, index) => {\n const path = `navigation.subPages[${index}]`;\n if (!check.record(item, path)) return;\n check.closed(item, [\"page\", \"label\", \"icon\"], path);\n\n const { page, label, icon } = item;\n if (!isOneOf(page, INTERFACE_SUB_PAGE_IDS)) {\n check.fail(`${path}.page`, \"is not a sub-page this host serves\");\n } else if (seen.has(page)) {\n check.fail(`${path}.page`, \"repeats a page\");\n } else {\n seen.add(page);\n }\n check.copy(label, `${path}.label`);\n checkIconSlug(check, icon, `${path}.icon`);\n });\n}\n\nfunction checkIconSlug(\n check: InterfaceChecker,\n icon: unknown,\n path: string,\n): void {\n if (!isOneOf(icon, INTERFACE_ICON_SLUGS)) {\n check.fail(path, \"is not an icon this host ships\");\n }\n}\n\nfunction checkNavigation(check: InterfaceChecker, navigation: unknown): void {\n if (!check.record(navigation, \"navigation\")) return;\n check.closed(\n navigation,\n [\"sidebar\", \"commandMenu\", \"subPages\"],\n \"navigation\",\n );\n\n if (check.record(navigation.sidebar, \"navigation.sidebar\")) {\n check.closed(navigation.sidebar, [\"label\"], \"navigation.sidebar\");\n check.copy(navigation.sidebar.label, \"navigation.sidebar.label\");\n }\n if (check.record(navigation.commandMenu, \"navigation.commandMenu\")) {\n const menu = navigation.commandMenu;\n check.closed(\n menu,\n [\"title\", \"description\", \"keywords\"],\n \"navigation.commandMenu\",\n );\n check.copy(menu.title, \"navigation.commandMenu.title\");\n check.copy(menu.description, \"navigation.commandMenu.description\");\n check.copy(menu.keywords, \"navigation.commandMenu.keywords\");\n }\n if (navigation.subPages !== undefined) {\n checkSubPages(check, navigation.subPages);\n }\n}\n\nfunction checkPages(check: InterfaceChecker, pages: unknown): void {\n if (!check.record(pages, \"pages\")) return;\n check.closed(pages, [\"list\", \"detail\", \"edit\", \"templates\"], \"pages\");\n\n if (check.record(pages.list, \"pages.list\")) {\n check.closed(\n pages.list,\n [\"title\", \"subtitle\", \"overview\", \"filters\", \"sort\", \"insights\"],\n \"pages.list\",\n );\n check.copy(pages.list.title, \"pages.list.title\");\n check.copy(pages.list.subtitle, \"pages.list.subtitle\");\n if (pages.list.overview !== undefined) {\n checkOverview(check, pages.list.overview);\n }\n if (pages.list.filters !== undefined) {\n checkFilters(check, pages.list.filters);\n }\n if (pages.list.sort !== undefined) {\n checkSort(check, pages.list.sort);\n }\n if (pages.list.insights !== undefined) {\n checkInsights(check, pages.list.insights);\n }\n }\n if (check.record(pages.detail, \"pages.detail\")) {\n check.closed(pages.detail, [\"backLabel\"], \"pages.detail\");\n check.copy(pages.detail.backLabel, \"pages.detail.backLabel\");\n }\n if (check.record(pages.edit, \"pages.edit\")) {\n check.closed(pages.edit, [\"title\"], \"pages.edit\");\n check.copy(pages.edit.title, \"pages.edit.title\");\n }\n if (pages.templates !== undefined) {\n checkTemplatesPage(check, pages.templates);\n }\n}\n\nfunction checkOverview(check: InterfaceChecker, overview: unknown): void {\n const path = \"pages.list.overview\";\n if (!check.record(overview, path)) return;\n check.closed(overview, [\"label\", \"tiles\"], path);\n check.copy(overview.label, `${path}.label`);\n\n const { tiles } = overview;\n if (!Array.isArray(tiles) || tiles.length === 0) {\n check.fail(`${path}.tiles`, \"must be a non-empty array\");\n return;\n }\n const seen = new Set<string>();\n tiles.forEach((tile: unknown, index) => {\n checkOverviewTile(check, tile, seen, `${path}.tiles[${index}]`);\n });\n}\n\nfunction checkOverviewTile(\n check: InterfaceChecker,\n tile: unknown,\n seen: Set<string>,\n path: string,\n): void {\n if (!check.record(tile, path)) return;\n check.closed(tile, [\"metric\", \"label\", \"detail\", \"zeroDetail\", \"icon\"], path);\n\n const { metric, label, detail, zeroDetail, icon } = tile;\n check.copy(label, `${path}.label`);\n checkIconSlug(check, icon, `${path}.icon`);\n if (!isOneOf(metric, OVERVIEW_METRICS)) {\n check.fail(`${path}.metric`, \"is not a metric this host computes\");\n check.copy(detail, `${path}.detail`);\n if (zeroDetail !== undefined) check.copy(zeroDetail, `${path}.zeroDetail`);\n return;\n }\n if (seen.has(metric)) {\n check.fail(`${path}.metric`, \"repeats a metric\");\n } else {\n seen.add(metric);\n }\n checkTileCopy(check, detail, metric, `${path}.detail`);\n if (zeroDetail !== undefined) {\n checkTileCopy(check, zeroDetail, metric, `${path}.zeroDetail`);\n }\n}\n\n/**\n * Tile copy may embed `{{name}}` placeholders, but only the names the metric\n * exposes — plain substitution, never an expression.\n */\nfunction checkTileCopy(\n check: InterfaceChecker,\n value: unknown,\n metric: OverviewMetric,\n path: string,\n): void {\n if (!check.copy(value, path)) return;\n const exposed = OVERVIEW_TILE_PLACEHOLDERS[metric];\n const unknownPlaceholder =\n exposed.length === 0\n ? /\\{\\{/\n : new RegExp(`\\\\{\\\\{(?!(?:${exposed.join(\"|\")})\\\\}\\\\})`);\n if (unknownPlaceholder.test(value as string)) {\n check.fail(path, \"uses a placeholder this metric does not expose\");\n }\n}\n\nfunction checkFilters(check: InterfaceChecker, filters: unknown): void {\n const path = \"pages.list.filters\";\n if (!Array.isArray(filters) || filters.length === 0) {\n check.fail(path, \"must be a non-empty array\");\n return;\n }\n const seen = new Set<string>();\n filters.forEach((filter: unknown, index) => {\n checkFilter(check, filter, seen, `${path}[${index}]`);\n });\n}\n\nfunction checkFilter(\n check: InterfaceChecker,\n filter: unknown,\n seen: Set<string>,\n path: string,\n): void {\n if (!check.record(filter, path)) return;\n check.closed(filter, [\"id\", \"label\", \"options\"], path);\n\n const { id, label, options } = filter;\n check.copy(label, `${path}.label`);\n if (!isOneOf(id, DASHBOARD_FILTER_IDS)) {\n check.fail(`${path}.id`, \"is not a filter this host implements\");\n return;\n }\n if (seen.has(id)) {\n check.fail(`${path}.id`, \"repeats a filter\");\n } else {\n seen.add(id);\n }\n checkFilterOptions(\n check,\n options,\n DASHBOARD_FILTER_VALUES[id],\n `${path}.options`,\n );\n}\n\nfunction checkFilterOptions(\n check: InterfaceChecker,\n options: unknown,\n values: readonly string[],\n path: string,\n): void {\n if (!Array.isArray(options) || options.length < 2) {\n check.fail(path, \"must offer at least two options\");\n return;\n }\n const seen = new Set<string>();\n options.forEach((option: unknown, index) => {\n const optionPath = `${path}[${index}]`;\n if (!check.record(option, optionPath)) return;\n check.closed(option, [\"value\", \"label\"], optionPath);\n\n const { value, label } = option;\n if (!isOneOf(value, values)) {\n check.fail(`${optionPath}.value`, \"is not a value this host implements\");\n } else if (seen.has(value)) {\n check.fail(`${optionPath}.value`, \"repeats a value\");\n } else {\n seen.add(value);\n }\n check.copy(label, `${optionPath}.label`);\n });\n // \"all\" is the host's initial selection and what Clear filters resets to,\n // so a filter that does not offer it could never be neutral.\n if (!seen.has(\"all\")) {\n check.fail(path, 'must offer the \"all\" option');\n }\n}\n\nfunction checkSort(check: InterfaceChecker, sort: unknown): void {\n const path = \"pages.list.sort\";\n if (!check.record(sort, path)) return;\n check.closed(sort, [\"label\", \"options\", \"default\"], path);\n\n const { label, options, default: defaultValue } = sort;\n check.copy(label, `${path}.label`);\n const declared = new Set<string>();\n if (!Array.isArray(options) || options.length === 0) {\n check.fail(`${path}.options`, \"must be a non-empty array\");\n } else {\n options.forEach((option: unknown, index) => {\n const optionPath = `${path}.options[${index}]`;\n if (!check.record(option, optionPath)) return;\n check.closed(option, [\"value\", \"label\"], optionPath);\n\n if (!isOneOf(option.value, DASHBOARD_SORT_VALUES)) {\n check.fail(`${optionPath}.value`, \"is not a sort this host implements\");\n } else if (declared.has(option.value)) {\n check.fail(`${optionPath}.value`, \"repeats a value\");\n } else {\n declared.add(option.value);\n }\n check.copy(option.label, `${optionPath}.label`);\n });\n }\n if (typeof defaultValue !== \"string\" || !declared.has(defaultValue)) {\n check.fail(`${path}.default`, \"must be one of the declared option values\");\n }\n}\n\n/** Every insight state and stat the host renders must have a caption. */\nconst INSIGHTS_SHAPE = {\n health: [\"healthy\", \"failing\", \"running\", \"disabled\", \"neverRun\", \"checking\"],\n lastRun: [\"label\", \"never\", \"justNow\"],\n stats: [\"runs\", \"recentSuccess\", \"averageDuration\"],\n} as const;\n\nfunction checkInsights(check: InterfaceChecker, insights: unknown): void {\n const path = \"pages.list.insights\";\n if (!check.record(insights, path)) return;\n check.closed(insights, Object.keys(INSIGHTS_SHAPE), path);\n\n (Object.keys(INSIGHTS_SHAPE) as (keyof typeof INSIGHTS_SHAPE)[]).forEach(\n (section) => {\n const sectionPath = `${path}.${section}`;\n const value = insights[section];\n if (!check.record(value, sectionPath)) return;\n const keys = INSIGHTS_SHAPE[section];\n check.closed(value, keys, sectionPath);\n keys.forEach((key) => {\n check.copy(value[key], `${sectionPath}.${key}`);\n });\n },\n );\n}\n\nfunction checkTemplatesPage(check: InterfaceChecker, templates: unknown): void {\n const path = \"pages.templates\";\n if (!check.record(templates, path)) return;\n check.closed(templates, [\"title\", \"description\"], path);\n check.copy(templates.title, `${path}.title`);\n check.copy(templates.description, `${path}.description`);\n}\n\n/**\n * The sub-page surface is declared whole or not at all. Navigation that points\n * at an unrouted page, or a dashboard with filters but no insight captions,\n * would be a partially-trusted mix, and the host refuses those wholesale.\n */\nfunction checkSubPageGroup(check: InterfaceChecker, candidate: Rec): void {\n const routes = isRecord(candidate.routes) ? candidate.routes : {};\n const navigation = isRecord(candidate.navigation) ? candidate.navigation : {};\n const pages = isRecord(candidate.pages) ? candidate.pages : {};\n const list = isRecord(pages.list) ? pages.list : {};\n\n const pieces: [string, unknown][] = [\n [\"routes.templates\", routes.templates],\n [\"navigation.subPages\", navigation.subPages],\n [\"pages.templates\", pages.templates],\n [\"pages.list.overview\", list.overview],\n [\"pages.list.filters\", list.filters],\n [\"pages.list.sort\", list.sort],\n [\"pages.list.insights\", list.insights],\n ];\n const missing = pieces\n .filter(([, value]) => value === undefined)\n .map(([name]) => name);\n if (missing.length === 0 || missing.length === pieces.length) return;\n check.fail(\n \"interface\",\n `the sub-page surface must be declared whole; missing ${missing.join(\", \")}`,\n );\n}\n\nfunction checkAttribute(\n check: InterfaceChecker,\n host: { type: InterfaceAttributeType; required: boolean },\n attribute: unknown,\n path: string,\n): void {\n if (!check.record(attribute, path)) return;\n check.closed(\n attribute,\n [\"type\", \"label\", \"help\", \"required\", \"constraints\"],\n path,\n );\n\n const { type, label, help, required, constraints } = attribute;\n if (type !== host.type) {\n check.fail(\n `${path}.type`,\n `must be \"${host.type}\", the control this host renders`,\n );\n }\n check.copy(label, `${path}.label`);\n if (help !== undefined) check.copy(help, `${path}.help`);\n if (required !== host.required) {\n check.fail(\n `${path}.required`,\n `must be ${host.required}, what this host enforces`,\n );\n }\n\n if (constraints !== undefined) {\n if (host.type !== \"number\") {\n check.fail(\n `${path}.constraints`,\n \"is only allowed on a number attribute\",\n );\n } else if (check.record(constraints, `${path}.constraints`)) {\n check.closed(constraints, [\"min\", \"max\"], `${path}.constraints`);\n const { min, max } = constraints;\n // The form validates a positive integer, i.e. an effective minimum of 1;\n // any other declared minimum would be a promise it does not keep.\n if (min !== undefined && min !== 1) {\n check.fail(\n `${path}.constraints.min`,\n \"must be the 1 this host enforces\",\n );\n }\n if (\n max !== undefined &&\n (!Number.isInteger(max) || (max as number) < 1)\n ) {\n check.fail(`${path}.constraints.max`, \"must be a positive integer\");\n }\n }\n }\n}\n\nfunction checkAttributes(check: InterfaceChecker, attributes: unknown): void {\n if (!check.record(attributes, \"attributes\")) return;\n const names = Object.keys(attributes);\n if (names.length === 0) {\n check.fail(\"attributes\", \"must declare at least one attribute\");\n }\n names.forEach((name) => {\n if (!ATTRIBUTE_NAMES.includes(name)) {\n check.fail(`attributes.${name}`, \"is not a settable attribute\");\n return;\n }\n checkAttribute(\n check,\n HOST_ATTRIBUTES[name as AutomationAttributeName],\n attributes[name],\n `attributes.${name}`,\n );\n });\n}\n\nfunction checkImportExport(\n check: InterfaceChecker,\n importExport: unknown,\n): void {\n if (!check.record(importExport, \"importExport\")) return;\n check.closed(\n importExport,\n [\"fileKind\", \"fileVersion\", \"filenameSuffix\", \"importDefaults\"],\n \"importExport\",\n );\n\n const { fileKind, fileVersion, filenameSuffix, importDefaults } =\n importExport;\n if (typeof fileKind !== \"string\" || !FILE_KIND_PATTERN.test(fileKind)) {\n check.fail(\"importExport.fileKind\", \"must be a lowercase slug\");\n }\n if (fileVersion !== 1) {\n check.fail(\"importExport.fileVersion\", \"must be 1\");\n }\n if (\n typeof filenameSuffix !== \"string\" ||\n !FILENAME_SUFFIX_PATTERN.test(filenameSuffix)\n ) {\n check.fail(\"importExport.filenameSuffix\", \"must be a .json suffix\");\n }\n if (check.record(importDefaults, \"importExport.importDefaults\")) {\n check.closed(\n importDefaults,\n [\"repoProvider\", \"placeholderEventSource\"],\n \"importExport.importDefaults\",\n );\n if (\n typeof importDefaults.repoProvider !== \"string\" ||\n !(GIT_PROVIDERS as readonly string[]).includes(\n importDefaults.repoProvider,\n )\n ) {\n check.fail(\n \"importExport.importDefaults.repoProvider\",\n \"is not a supported provider\",\n );\n }\n if (\n typeof importDefaults.placeholderEventSource !== \"string\" ||\n !EVENT_SOURCE_PATTERN.test(importDefaults.placeholderEventSource)\n ) {\n check.fail(\n \"importExport.importDefaults.placeholderEventSource\",\n \"must be a lowercase event source\",\n );\n }\n }\n}\n\nfunction checkEndpoints(check: InterfaceChecker, endpoints: unknown): void {\n if (!check.record(endpoints, \"endpoints\")) return;\n const allowed = [\n ...PLAIN_ENDPOINT_NAMES,\n ...OPTIONAL_PLAIN_ENDPOINT_NAMES,\n ...ID_ENDPOINT_NAMES,\n ];\n check.closed(endpoints, allowed, \"endpoints\");\n\n const endpointAt = (name: string): string | null => {\n const value = endpoints[name];\n if (\n typeof value !== \"string\" ||\n !ENDPOINT_PATTERN.test(value) ||\n value.includes(\"//\")\n ) {\n check.fail(`endpoints.${name}`, \"must be a rooted service-relative path\");\n return null;\n }\n return value;\n };\n\n const plainNames = [\n ...PLAIN_ENDPOINT_NAMES,\n ...OPTIONAL_PLAIN_ENDPOINT_NAMES.filter((name) => name in endpoints),\n ];\n plainNames.forEach((name) => {\n const value = endpointAt(name);\n if (value !== null && /[{}]/.test(value)) {\n check.fail(`endpoints.${name}`, \"must not carry a substitution\");\n }\n });\n ID_ENDPOINT_NAMES.forEach((name) => {\n const value = endpointAt(name);\n if (value !== null && !ID_ENDPOINT_PATTERN.test(value)) {\n check.fail(`endpoints.${name}`, \"must carry exactly one {id}\");\n }\n });\n}\n\nfunction checkSlugList(\n check: InterfaceChecker,\n value: unknown,\n path: string,\n): string[] {\n if (!Array.isArray(value) || value.length === 0) {\n check.fail(path, \"must be a non-empty array\");\n return [];\n }\n const slugs = value.filter((item): item is string => {\n if (typeof item === \"string\" && SLUG_PATTERN.test(item)) return true;\n check.fail(path, \"must contain only lowercase slugs\");\n return false;\n });\n if (new Set(slugs).size !== slugs.length) {\n check.fail(path, \"must not repeat an id\");\n }\n return slugs;\n}\n\nconst TOP_LEVEL_KEYS = [\n \"version\",\n \"routes\",\n \"navigation\",\n \"pages\",\n \"docsUrl\",\n \"attributes\",\n \"importExport\",\n \"endpoints\",\n \"featuredAutomationIds\",\n \"responderIntegrationIds\",\n];\n\n/**\n * Decide whether this host will act on a published interface manifest.\n *\n * The version is checked first and fails closed: a format this host does not\n * recognise is refused rather than interpreted with today's rules.\n */\nexport function validateInterfaceManifest(\n candidate: unknown,\n context: InterfaceValidationContext,\n): InterfaceValidationResult {\n if (!isRecord(candidate)) {\n return { valid: false, errors: [\"interface: must be an object\"] };\n }\n if (candidate.version !== INTERFACE_VERSION) {\n return {\n valid: false,\n errors: [`interface.version: must be \"${INTERFACE_VERSION}\"`],\n };\n }\n\n const check = new InterfaceChecker();\n check.closed(candidate, TOP_LEVEL_KEYS, \"interface\");\n\n checkRoutes(check, candidate.routes, context.mountedRoutes);\n checkNavigation(check, candidate.navigation);\n checkPages(check, candidate.pages);\n if (\n typeof candidate.docsUrl !== \"string\" ||\n !candidate.docsUrl.startsWith(DOCS_URL_PREFIX)\n ) {\n check.fail(\"docsUrl\", `must start with ${DOCS_URL_PREFIX}`);\n }\n checkAttributes(check, candidate.attributes);\n checkImportExport(check, candidate.importExport);\n checkEndpoints(check, candidate.endpoints);\n\n checkSlugList(\n check,\n candidate.featuredAutomationIds,\n \"featuredAutomationIds\",\n ).forEach((id) => {\n if (!context.catalogIds.has(id)) {\n check.fail(\"featuredAutomationIds\", `${id} is not a catalog entry`);\n }\n });\n checkSlugList(\n check,\n candidate.responderIntegrationIds,\n \"responderIntegrationIds\",\n );\n\n checkSubPageGroup(check, candidate);\n\n return { valid: check.errors.length === 0, errors: check.errors };\n}\n"],"mappings":";;AA4BA,IAAM,IAAiB,eACjB,IAAe,4BAEf,IAAkB,+BAClB,IAAoB,kBACpB,IAA0B,wBAC1B,IAAuB,yBAEvB,IAAmB,yBAEnB,IAAsB,wBAEtB,IAAgB;CAAC;CAAU;CAAU;AAAW,GAQhD,IAGF;CACF,MAAM;EAAE,MAAM;EAAQ,UAAU;CAAK;CACrC,QAAQ;EAAE,MAAM;EAAY,UAAU;CAAM;CAC5C,OAAO;EAAE,MAAM;EAAe,UAAU;CAAM;CAC9C,SAAS;EAAE,MAAM;EAAU,UAAU;CAAM;CAC3C,UAAU;EAAE,MAAM;EAAY,UAAU;CAAM;AAChD,GACM,IAAkB,OAAO,KAAK,CAAe,GAC7C,IAAuB;CAC3B;CACA;CACA;CACA;CACA;CACA;AACF,GAMM,IAAgC,CAAC,gBAAgB,SAAS,GAC1D,IAAoB;CAAC;CAAU;CAAY;CAAQ;AAAS;AAgBlE,SAAS,EAAS,GAA8B;CAC9C,OAAO,OAAO,KAAU,cAAY,KAAkB,CAAC,MAAM,QAAQ,CAAK;AAC5E;AAEA,SAAS,EACP,GACA,GACoB;CACpB,OACE,OAAO,KAAU,YAAa,EAA6B,SAAS,CAAK;AAE7E;AAEA,IAAM,IAAN,MAAuB;CACrB,SAA4B,CAAC;CAE7B,KAAK,GAAc,GAAuB;EAExC,OADA,KAAK,OAAO,KAAK,GAAG,EAAK,IAAI,GAAQ,GAC9B;CACT;CAGA,KAAK,GAAgB,GAAuB;EAO1C,OANI,OAAO,KAAU,YAAY,EAAM,WAAW,IACzC,KAAK,KAAK,GAAM,4BAA4B,IAEjD,EAAe,KAAK,CAAK,IACpB,KAAK,KAAK,GAAM,yBAAyB,IAE3C;CACT;CAGA,OAAO,GAAgB,GAA4B,GAAoB;EACrE,OAAO,KAAK,CAAS,EAClB,QAAQ,MAAQ,CAAC,EAAQ,SAAS,CAAG,CAAC,EACtC,SAAS,MAAQ,KAAK,KAAK,GAAG,EAAK,GAAG,KAAO,gBAAgB,CAAC;CACnE;CAEA,OAAO,GAAgB,GAA4B;EAGjD,OAFI,EAAS,CAAK,IAAU,MAC5B,KAAK,KAAK,GAAM,mBAAmB,GAC5B;CACT;AACF;AAEA,SAAS,EACP,GACA,GACA,GACM;CACD,EAAM,OAAO,GAAQ,QAAQ,MAClC,EAAM,OAAO,GAAQ;EAAC;EAAQ;EAAS;EAAU;CAAW,GAAG,QAAQ,GAKvE;EAAE;EAAQ;EAAS;CAAQ,EAAY,SAAS,MAAS;EACvD,AAAI,EAAO,OAAU,EAAQ,MAC3B,EAAM,KAAK,UAAU,KAAQ,YAAY,EAAQ,GAAM,EAAE;CAE7D,CAAC,GAEC,EAAO,cAAc,KAAA,KACrB,EAAO,cAAc,EAAQ,aAE7B,EAAM,KACJ,oBACA,EAAQ,cAAc,KAAA,IAClB,oCACA,YAAY,EAAQ,UAAU,EACpC;AAEJ;AAEA,SAAS,EAAc,GAAyB,GAAyB;CACvE,IAAI,CAAC,MAAM,QAAQ,CAAQ,KAAK,EAAS,WAAW,GAAG;EACrD,EAAM,KAAK,uBAAuB,2BAA2B;EAC7D;CACF;CACA,IAAM,oBAAO,IAAI,IAAY;CAC7B,EAAS,SAAS,GAAe,MAAU;EACzC,IAAM,IAAO,uBAAuB,EAAM;EAC1C,IAAI,CAAC,EAAM,OAAO,GAAM,CAAI,GAAG;EAC/B,EAAM,OAAO,GAAM;GAAC;GAAQ;GAAS;EAAM,GAAG,CAAI;EAElD,IAAM,EAAE,SAAM,UAAO,YAAS;EAS9B,AARK,EAAQ,GAAM,CAAsB,IAE9B,EAAK,IAAI,CAAI,IACtB,EAAM,KAAK,GAAG,EAAK,QAAQ,gBAAgB,IAE3C,EAAK,IAAI,CAAI,IAJb,EAAM,KAAK,GAAG,EAAK,QAAQ,oCAAoC,GAMjE,EAAM,KAAK,GAAO,GAAG,EAAK,OAAO,GACjC,EAAc,GAAO,GAAM,GAAG,EAAK,MAAM;CAC3C,CAAC;AACH;AAEA,SAAS,EACP,GACA,GACA,GACM;CACN,AAAK,EAAQ,GAAM,CAAoB,KACrC,EAAM,KAAK,GAAM,gCAAgC;AAErD;AAEA,SAAS,EAAgB,GAAyB,GAA2B;CACtE,MAAM,OAAO,GAAY,YAAY,GAW1C;MAVA,EAAM,OACJ,GACA;GAAC;GAAW;GAAe;EAAU,GACrC,YACF,GAEI,EAAM,OAAO,EAAW,SAAS,oBAAoB,MACvD,EAAM,OAAO,EAAW,SAAS,CAAC,OAAO,GAAG,oBAAoB,GAChE,EAAM,KAAK,EAAW,QAAQ,OAAO,0BAA0B,IAE7D,EAAM,OAAO,EAAW,aAAa,wBAAwB,GAAG;GAClE,IAAM,IAAO,EAAW;GAQxB,AAPA,EAAM,OACJ,GACA;IAAC;IAAS;IAAe;GAAU,GACnC,wBACF,GACA,EAAM,KAAK,EAAK,OAAO,8BAA8B,GACrD,EAAM,KAAK,EAAK,aAAa,oCAAoC,GACjE,EAAM,KAAK,EAAK,UAAU,iCAAiC;EAC7D;EACA,AAAI,EAAW,aAAa,KAAA,KAC1B,EAAc,GAAO,EAAW,QAAQ;CAF1C;AAIF;AAEA,SAAS,EAAW,GAAyB,GAAsB;CAC5D,EAAM,OAAO,GAAO,OAAO,MAChC,EAAM,OAAO,GAAO;EAAC;EAAQ;EAAU;EAAQ;CAAW,GAAG,OAAO,GAEhE,EAAM,OAAO,EAAM,MAAM,YAAY,MACvC,EAAM,OACJ,EAAM,MACN;EAAC;EAAS;EAAY;EAAY;EAAW;EAAQ;CAAU,GAC/D,YACF,GACA,EAAM,KAAK,EAAM,KAAK,OAAO,kBAAkB,GAC/C,EAAM,KAAK,EAAM,KAAK,UAAU,qBAAqB,GACjD,EAAM,KAAK,aAAa,KAAA,KAC1B,EAAc,GAAO,EAAM,KAAK,QAAQ,GAEtC,EAAM,KAAK,YAAY,KAAA,KACzB,EAAa,GAAO,EAAM,KAAK,OAAO,GAEpC,EAAM,KAAK,SAAS,KAAA,KACtB,EAAU,GAAO,EAAM,KAAK,IAAI,GAE9B,EAAM,KAAK,aAAa,KAAA,KAC1B,EAAc,GAAO,EAAM,KAAK,QAAQ,IAGxC,EAAM,OAAO,EAAM,QAAQ,cAAc,MAC3C,EAAM,OAAO,EAAM,QAAQ,CAAC,WAAW,GAAG,cAAc,GACxD,EAAM,KAAK,EAAM,OAAO,WAAW,wBAAwB,IAEzD,EAAM,OAAO,EAAM,MAAM,YAAY,MACvC,EAAM,OAAO,EAAM,MAAM,CAAC,OAAO,GAAG,YAAY,GAChD,EAAM,KAAK,EAAM,KAAK,OAAO,kBAAkB,IAE7C,EAAM,cAAc,KAAA,KACtB,EAAmB,GAAO,EAAM,SAAS;AAE7C;AAEA,SAAS,EAAc,GAAyB,GAAyB;CACvE,IAAM,IAAO;CACb,IAAI,CAAC,EAAM,OAAO,GAAU,CAAI,GAAG;CAEnC,AADA,EAAM,OAAO,GAAU,CAAC,SAAS,OAAO,GAAG,CAAI,GAC/C,EAAM,KAAK,EAAS,OAAO,GAAG,EAAK,OAAO;CAE1C,IAAM,EAAE,aAAU;CAClB,IAAI,CAAC,MAAM,QAAQ,CAAK,KAAK,EAAM,WAAW,GAAG;EAC/C,EAAM,KAAK,GAAG,EAAK,SAAS,2BAA2B;EACvD;CACF;CACA,IAAM,oBAAO,IAAI,IAAY;CAC7B,EAAM,SAAS,GAAe,MAAU;EACtC,EAAkB,GAAO,GAAM,GAAM,GAAG,EAAK,SAAS,EAAM,EAAE;CAChE,CAAC;AACH;AAEA,SAAS,EACP,GACA,GACA,GACA,GACM;CACN,IAAI,CAAC,EAAM,OAAO,GAAM,CAAI,GAAG;CAC/B,EAAM,OAAO,GAAM;EAAC;EAAU;EAAS;EAAU;EAAc;CAAM,GAAG,CAAI;CAE5E,IAAM,EAAE,WAAQ,UAAO,WAAQ,eAAY,YAAS;CAGpD,IAFA,EAAM,KAAK,GAAO,GAAG,EAAK,OAAO,GACjC,EAAc,GAAO,GAAM,GAAG,EAAK,MAAM,GACrC,CAAC,EAAQ,GAAQ,CAAgB,GAAG;EAGtC,AAFA,EAAM,KAAK,GAAG,EAAK,UAAU,oCAAoC,GACjE,EAAM,KAAK,GAAQ,GAAG,EAAK,QAAQ,GAC/B,MAAe,KAAA,KAAW,EAAM,KAAK,GAAY,GAAG,EAAK,YAAY;EACzE;CACF;CAOA,AANI,EAAK,IAAI,CAAM,IACjB,EAAM,KAAK,GAAG,EAAK,UAAU,kBAAkB,IAE/C,EAAK,IAAI,CAAM,GAEjB,EAAc,GAAO,GAAQ,GAAQ,GAAG,EAAK,QAAQ,GACjD,MAAe,KAAA,KACjB,EAAc,GAAO,GAAY,GAAQ,GAAG,EAAK,YAAY;AAEjE;AAMA,SAAS,EACP,GACA,GACA,GACA,GACM;CACN,IAAI,CAAC,EAAM,KAAK,GAAO,CAAI,GAAG;CAC9B,IAAM,IAAU,EAA2B;CAK3C,CAHE,EAAQ,WAAW,IACf,SACI,OAAO,eAAe,EAAQ,KAAK,GAAG,EAAE,SAAS,GACpC,KAAK,CAAe,KACzC,EAAM,KAAK,GAAM,gDAAgD;AAErE;AAEA,SAAS,EAAa,GAAyB,GAAwB;CACrE,IAAM,IAAO;CACb,IAAI,CAAC,MAAM,QAAQ,CAAO,KAAK,EAAQ,WAAW,GAAG;EACnD,EAAM,KAAK,GAAM,2BAA2B;EAC5C;CACF;CACA,IAAM,oBAAO,IAAI,IAAY;CAC7B,EAAQ,SAAS,GAAiB,MAAU;EAC1C,EAAY,GAAO,GAAQ,GAAM,GAAG,EAAK,GAAG,EAAM,EAAE;CACtD,CAAC;AACH;AAEA,SAAS,EACP,GACA,GACA,GACA,GACM;CACN,IAAI,CAAC,EAAM,OAAO,GAAQ,CAAI,GAAG;CACjC,EAAM,OAAO,GAAQ;EAAC;EAAM;EAAS;CAAS,GAAG,CAAI;CAErD,IAAM,EAAE,OAAI,UAAO,eAAY;CAE/B,IADA,EAAM,KAAK,GAAO,GAAG,EAAK,OAAO,GAC7B,CAAC,EAAQ,GAAI,CAAoB,GAAG;EACtC,EAAM,KAAK,GAAG,EAAK,MAAM,sCAAsC;EAC/D;CACF;CAMA,AALI,EAAK,IAAI,CAAE,IACb,EAAM,KAAK,GAAG,EAAK,MAAM,kBAAkB,IAE3C,EAAK,IAAI,CAAE,GAEb,EACE,GACA,GACA,EAAwB,IACxB,GAAG,EAAK,SACV;AACF;AAEA,SAAS,EACP,GACA,GACA,GACA,GACM;CACN,IAAI,CAAC,MAAM,QAAQ,CAAO,KAAK,EAAQ,SAAS,GAAG;EACjD,EAAM,KAAK,GAAM,iCAAiC;EAClD;CACF;CACA,IAAM,oBAAO,IAAI,IAAY;CAkB7B,AAjBA,EAAQ,SAAS,GAAiB,MAAU;EAC1C,IAAM,IAAa,GAAG,EAAK,GAAG,EAAM;EACpC,IAAI,CAAC,EAAM,OAAO,GAAQ,CAAU,GAAG;EACvC,EAAM,OAAO,GAAQ,CAAC,SAAS,OAAO,GAAG,CAAU;EAEnD,IAAM,EAAE,UAAO,aAAU;EAQzB,AAPK,EAAQ,GAAO,CAAM,IAEf,EAAK,IAAI,CAAK,IACvB,EAAM,KAAK,GAAG,EAAW,SAAS,iBAAiB,IAEnD,EAAK,IAAI,CAAK,IAJd,EAAM,KAAK,GAAG,EAAW,SAAS,qCAAqC,GAMzE,EAAM,KAAK,GAAO,GAAG,EAAW,OAAO;CACzC,CAAC,GAGI,EAAK,IAAI,KAAK,KACjB,EAAM,KAAK,GAAM,+BAA6B;AAElD;AAEA,SAAS,EAAU,GAAyB,GAAqB;CAC/D,IAAM,IAAO;CACb,IAAI,CAAC,EAAM,OAAO,GAAM,CAAI,GAAG;CAC/B,EAAM,OAAO,GAAM;EAAC;EAAS;EAAW;CAAS,GAAG,CAAI;CAExD,IAAM,EAAE,UAAO,YAAS,SAAS,MAAiB;CAClD,EAAM,KAAK,GAAO,GAAG,EAAK,OAAO;CACjC,IAAM,oBAAW,IAAI,IAAY;CAmBjC,AAlBI,CAAC,MAAM,QAAQ,CAAO,KAAK,EAAQ,WAAW,IAChD,EAAM,KAAK,GAAG,EAAK,WAAW,2BAA2B,IAEzD,EAAQ,SAAS,GAAiB,MAAU;EAC1C,IAAM,IAAa,GAAG,EAAK,WAAW,EAAM;EACvC,EAAM,OAAO,GAAQ,CAAU,MACpC,EAAM,OAAO,GAAQ,CAAC,SAAS,OAAO,GAAG,CAAU,GAE9C,EAAQ,EAAO,OAAO,CAAqB,IAErC,EAAS,IAAI,EAAO,KAAK,IAClC,EAAM,KAAK,GAAG,EAAW,SAAS,iBAAiB,IAEnD,EAAS,IAAI,EAAO,KAAK,IAJzB,EAAM,KAAK,GAAG,EAAW,SAAS,oCAAoC,GAMxE,EAAM,KAAK,EAAO,OAAO,GAAG,EAAW,OAAO;CAChD,CAAC,IAEC,OAAO,KAAiB,YAAY,CAAC,EAAS,IAAI,CAAY,MAChE,EAAM,KAAK,GAAG,EAAK,WAAW,2CAA2C;AAE7E;AAGA,IAAM,IAAiB;CACrB,QAAQ;EAAC;EAAW;EAAW;EAAW;EAAY;EAAY;CAAU;CAC5E,SAAS;EAAC;EAAS;EAAS;CAAS;CACrC,OAAO;EAAC;EAAQ;EAAiB;CAAiB;AACpD;AAEA,SAAS,EAAc,GAAyB,GAAyB;CACvE,IAAM,IAAO;CACR,EAAM,OAAO,GAAU,CAAI,MAChC,EAAM,OAAO,GAAU,OAAO,KAAK,CAAc,GAAG,CAAI,GAExD,OAAQ,KAAK,CAAc,EAAsC,SAC9D,MAAY;EACX,IAAM,IAAc,GAAG,EAAK,GAAG,KACzB,IAAQ,EAAS;EACvB,IAAI,CAAC,EAAM,OAAO,GAAO,CAAW,GAAG;EACvC,IAAM,IAAO,EAAe;EAE5B,AADA,EAAM,OAAO,GAAO,GAAM,CAAW,GACrC,EAAK,SAAS,MAAQ;GACpB,EAAM,KAAK,EAAM,IAAM,GAAG,EAAY,GAAG,GAAK;EAChD,CAAC;CACH,CACF;AACF;AAEA,SAAS,EAAmB,GAAyB,GAA0B;CAC7E,IAAM,IAAO;CACR,EAAM,OAAO,GAAW,CAAI,MACjC,EAAM,OAAO,GAAW,CAAC,SAAS,aAAa,GAAG,CAAI,GACtD,EAAM,KAAK,EAAU,OAAO,GAAG,EAAK,OAAO,GAC3C,EAAM,KAAK,EAAU,aAAa,GAAG,EAAK,aAAa;AACzD;AAOA,SAAS,EAAkB,GAAyB,GAAsB;CACxE,IAAM,IAAS,EAAS,EAAU,MAAM,IAAI,EAAU,SAAS,CAAC,GAC1D,IAAa,EAAS,EAAU,UAAU,IAAI,EAAU,aAAa,CAAC,GACtE,IAAQ,EAAS,EAAU,KAAK,IAAI,EAAU,QAAQ,CAAC,GACvD,IAAO,EAAS,EAAM,IAAI,IAAI,EAAM,OAAO,CAAC,GAE5C,IAA8B;EAClC,CAAC,oBAAoB,EAAO,SAAS;EACrC,CAAC,uBAAuB,EAAW,QAAQ;EAC3C,CAAC,mBAAmB,EAAM,SAAS;EACnC,CAAC,uBAAuB,EAAK,QAAQ;EACrC,CAAC,sBAAsB,EAAK,OAAO;EACnC,CAAC,mBAAmB,EAAK,IAAI;EAC7B,CAAC,uBAAuB,EAAK,QAAQ;CACvC,GACM,IAAU,EACb,QAAQ,GAAG,OAAW,MAAU,KAAA,CAAS,EACzC,KAAK,CAAC,OAAU,CAAI;CACnB,EAAQ,WAAW,KAAK,EAAQ,WAAW,EAAO,UACtD,EAAM,KACJ,aACA,wDAAwD,EAAQ,KAAK,IAAI,GAC3E;AACF;AAEA,SAAS,EACP,GACA,GACA,GACA,GACM;CACN,IAAI,CAAC,EAAM,OAAO,GAAW,CAAI,GAAG;CACpC,EAAM,OACJ,GACA;EAAC;EAAQ;EAAS;EAAQ;EAAY;CAAa,GACnD,CACF;CAEA,IAAM,EAAE,SAAM,UAAO,SAAM,aAAU,mBAAgB;CAgBrD,IAfI,MAAS,EAAK,QAChB,EAAM,KACJ,GAAG,EAAK,QACR,YAAY,EAAK,KAAK,iCACxB,GAEF,EAAM,KAAK,GAAO,GAAG,EAAK,OAAO,GAC7B,MAAS,KAAA,KAAW,EAAM,KAAK,GAAM,GAAG,EAAK,MAAM,GACnD,MAAa,EAAK,YACpB,EAAM,KACJ,GAAG,EAAK,YACR,WAAW,EAAK,SAAS,0BAC3B,GAGE,MAAgB,KAAA;MACd,EAAK,SAAS,UAChB,EAAM,KACJ,GAAG,EAAK,eACR,uCACF;OACK,IAAI,EAAM,OAAO,GAAa,GAAG,EAAK,aAAa,GAAG;GAC3D,EAAM,OAAO,GAAa,CAAC,OAAO,KAAK,GAAG,GAAG,EAAK,aAAa;GAC/D,IAAM,EAAE,QAAK,WAAQ;GASrB,AANI,MAAQ,KAAA,KAAa,MAAQ,KAC/B,EAAM,KACJ,GAAG,EAAK,mBACR,kCACF,GAGA,MAAQ,KAAA,MACP,CAAC,OAAO,UAAU,CAAG,KAAM,IAAiB,MAE7C,EAAM,KAAK,GAAG,EAAK,mBAAmB,4BAA4B;EAEtE;;AAEJ;AAEA,SAAS,EAAgB,GAAyB,GAA2B;CAC3E,IAAI,CAAC,EAAM,OAAO,GAAY,YAAY,GAAG;CAC7C,IAAM,IAAQ,OAAO,KAAK,CAAU;CAIpC,AAHI,EAAM,WAAW,KACnB,EAAM,KAAK,cAAc,qCAAqC,GAEhE,EAAM,SAAS,MAAS;EACtB,IAAI,CAAC,EAAgB,SAAS,CAAI,GAAG;GACnC,EAAM,KAAK,cAAc,KAAQ,6BAA6B;GAC9D;EACF;EACA,EACE,GACA,EAAgB,IAChB,EAAW,IACX,cAAc,GAChB;CACF,CAAC;AACH;AAEA,SAAS,EACP,GACA,GACM;CACN,IAAI,CAAC,EAAM,OAAO,GAAc,cAAc,GAAG;CACjD,EAAM,OACJ,GACA;EAAC;EAAY;EAAe;EAAkB;CAAgB,GAC9D,cACF;CAEA,IAAM,EAAE,aAAU,gBAAa,mBAAgB,sBAC7C;CAaF,CAZI,OAAO,KAAa,YAAY,CAAC,EAAkB,KAAK,CAAQ,MAClE,EAAM,KAAK,yBAAyB,0BAA0B,GAE5D,MAAgB,KAClB,EAAM,KAAK,4BAA4B,WAAW,IAGlD,OAAO,KAAmB,YAC1B,CAAC,EAAwB,KAAK,CAAc,MAE5C,EAAM,KAAK,+BAA+B,wBAAwB,GAEhE,EAAM,OAAO,GAAgB,6BAA6B,MAC5D,EAAM,OACJ,GACA,CAAC,gBAAgB,wBAAwB,GACzC,6BACF,IAEE,OAAO,EAAe,gBAAiB,YACvC,CAAE,EAAoC,SACpC,EAAe,YACjB,MAEA,EAAM,KACJ,4CACA,6BACF,IAGA,OAAO,EAAe,0BAA2B,YACjD,CAAC,EAAqB,KAAK,EAAe,sBAAsB,MAEhE,EAAM,KACJ,sDACA,kCACF;AAGN;AAEA,SAAS,EAAe,GAAyB,GAA0B;CACzE,IAAI,CAAC,EAAM,OAAO,GAAW,WAAW,GAAG;CAC3C,IAAM,IAAU;EACd,GAAG;EACH,GAAG;EACH,GAAG;CACL;CACA,EAAM,OAAO,GAAW,GAAS,WAAW;CAE5C,IAAM,KAAc,MAAgC;EAClD,IAAM,IAAQ,EAAU;EASxB,OAPE,OAAO,KAAU,YACjB,CAAC,EAAiB,KAAK,CAAK,KAC5B,EAAM,SAAS,IAAI,KAEnB,EAAM,KAAK,aAAa,KAAQ,wCAAwC,GACjE,QAEF;CACT;CAYA,AANA,CAHE,GAAG,GACH,GAAG,EAA8B,QAAQ,MAAS,KAAQ,CAAS,CAErE,EAAW,SAAS,MAAS;EAC3B,IAAM,IAAQ,EAAW,CAAI;EAC7B,AAAI,MAAU,QAAQ,OAAO,KAAK,CAAK,KACrC,EAAM,KAAK,aAAa,KAAQ,+BAA+B;CAEnE,CAAC,GACD,EAAkB,SAAS,MAAS;EAClC,IAAM,IAAQ,EAAW,CAAI;EAC7B,AAAI,MAAU,QAAQ,CAAC,EAAoB,KAAK,CAAK,KACnD,EAAM,KAAK,aAAa,KAAQ,6BAA6B;CAEjE,CAAC;AACH;AAEA,SAAS,EACP,GACA,GACA,GACU;CACV,IAAI,CAAC,MAAM,QAAQ,CAAK,KAAK,EAAM,WAAW,GAE5C,OADA,EAAM,KAAK,GAAM,2BAA2B,GACrC,CAAC;CAEV,IAAM,IAAQ,EAAM,QAAQ,MACtB,OAAO,KAAS,YAAY,EAAa,KAAK,CAAI,IAAU,MAChE,EAAM,KAAK,GAAM,mCAAmC,GAC7C,GACR;CAID,OAHI,IAAI,IAAI,CAAK,EAAE,SAAS,EAAM,UAChC,EAAM,KAAK,GAAM,uBAAuB,GAEnC;AACT;AAEA,IAAM,IAAiB;CACrB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAQA,SAAgB,EACd,GACA,GAC2B;CAC3B,IAAI,CAAC,EAAS,CAAS,GACrB,OAAO;EAAE,OAAO;EAAO,QAAQ,CAAC,8BAA8B;CAAE;CAElE,IAAI,EAAU,YAAA,OACZ,OAAO;EACL,OAAO;EACP,QAAQ,CAAC,oCAAmD;CAC9D;CAGF,IAAM,IAAQ,IAAI,EAAiB;CAiCnC,OAhCA,EAAM,OAAO,GAAW,GAAgB,WAAW,GAEnD,EAAY,GAAO,EAAU,QAAQ,EAAQ,aAAa,GAC1D,EAAgB,GAAO,EAAU,UAAU,GAC3C,EAAW,GAAO,EAAU,KAAK,IAE/B,OAAO,EAAU,WAAY,YAC7B,CAAC,EAAU,QAAQ,WAAW,CAAe,MAE7C,EAAM,KAAK,WAAW,mBAAmB,GAAiB,GAE5D,EAAgB,GAAO,EAAU,UAAU,GAC3C,EAAkB,GAAO,EAAU,YAAY,GAC/C,EAAe,GAAO,EAAU,SAAS,GAEzC,EACE,GACA,EAAU,uBACV,uBACF,EAAE,SAAS,MAAO;EAChB,AAAK,EAAQ,WAAW,IAAI,CAAE,KAC5B,EAAM,KAAK,yBAAyB,GAAG,EAAG,wBAAwB;CAEtE,CAAC,GACD,EACE,GACA,EAAU,yBACV,yBACF,GAEA,EAAkB,GAAO,CAAS,GAE3B;EAAE,OAAO,EAAM,OAAO,WAAW;EAAG,QAAQ,EAAM;CAAO;AAClE"}
|
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
* It chooses between the two outcomes this host offers, and it chooses by
|
|
7
7
|
* declaring a `mode`: a direct entry produces a create request the host derives,
|
|
8
8
|
* an assisted entry hands setup to a conversation.
|
|
9
|
+
*
|
|
10
|
+
* A direct entry that ships a bundle takes one more step before that create
|
|
11
|
+
* request - packing and uploading the archive - but it still names no host, no
|
|
12
|
+
* path and no method: the endpoints come from the interface manifest and the
|
|
13
|
+
* files from the published package.
|
|
9
14
|
*/
|
|
10
15
|
import type { SetupEntry, SetupFormValues, SetupRequestBody } from "./types";
|
|
11
16
|
export interface SetupActionResult {
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Packing what a bundle entry ships.
|
|
3
|
+
*
|
|
4
|
+
* A bundle's manifest names its files by the repository path they live at; the
|
|
5
|
+
* contents travel in the published `@openhands/extensions` package, because
|
|
6
|
+
* this host has the package and not the repository. That indirection is the
|
|
7
|
+
* whole reason this module exists: everything else about a bundle is derived
|
|
8
|
+
* the same way a prompt entry's request is.
|
|
9
|
+
*/
|
|
10
|
+
import { BUNDLE_CONFIG_FILENAME } from "./types";
|
|
11
|
+
import type { SetupEntry, SetupFormValues } from "./types";
|
|
12
|
+
/** The rendered configuration, packed beside the entrypoint. */
|
|
13
|
+
export { BUNDLE_CONFIG_FILENAME };
|
|
14
|
+
/**
|
|
15
|
+
* The files the pinned package ships for this entry.
|
|
16
|
+
*
|
|
17
|
+
* Read defensively: a package predating bundles exports no such function, and
|
|
18
|
+
* an entry that declares a bundle there would otherwise pack an empty archive
|
|
19
|
+
* that fails only once a run tries to execute it.
|
|
20
|
+
*/
|
|
21
|
+
export declare function getBundleFiles(id: string): Record<string, string>;
|
|
22
|
+
/**
|
|
23
|
+
* The archive for this entry, with the form's answers rendered into
|
|
24
|
+
* `config.json`.
|
|
25
|
+
*
|
|
26
|
+
* The config is taken from the create payload rather than rendered again here,
|
|
27
|
+
* so what the tarball carries and what the create request records as template
|
|
28
|
+
* provenance cannot disagree.
|
|
29
|
+
*/
|
|
30
|
+
export declare function packBundle(entry: SetupEntry, values: SetupFormValues): Promise<Uint8Array>;
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* Errors are returned as codes rather than sentences so the host can render
|
|
10
10
|
* them through its own translations; only manifest-authored copy is literal.
|
|
11
11
|
*/
|
|
12
|
-
import type { DeploymentCapabilities, SetupBlock, SetupFieldOption, SetupFormField, SetupFormFields, SetupFormValues } from "./types";
|
|
12
|
+
import type { DeploymentCapabilities, SetupBlock, SetupFieldOption, SetupFormField, SetupFormFields, SetupFormValue, SetupFormValues } from "./types";
|
|
13
13
|
export type SetupFieldError = {
|
|
14
14
|
code: "required";
|
|
15
15
|
} | {
|
|
@@ -50,6 +50,15 @@ export declare function collectFields(setup: SetupBlock): SetupFormFields;
|
|
|
50
50
|
export declare function resolveFieldOverrides(setup: SetupBlock, capabilities: DeploymentCapabilities | null): SetupFieldOverrides;
|
|
51
51
|
/** The options a field offers, after deployment constraints are applied. */
|
|
52
52
|
export declare function getFieldOptions(name: string, field: SetupFormField, overrides?: SetupFieldOverrides): SetupFieldOption[];
|
|
53
|
+
/**
|
|
54
|
+
* Every value a field holds, whether it collects one or many.
|
|
55
|
+
*
|
|
56
|
+
* Reading both shapes as a list is what keeps validation, interpolation and
|
|
57
|
+
* the payload mapping from branching on `multiple` at every use.
|
|
58
|
+
*/
|
|
59
|
+
export declare function fieldValues(value: SetupFormValue | undefined): string[];
|
|
60
|
+
/** The single value a field holds, or "" for a field collecting several. */
|
|
61
|
+
export declare function fieldText(value: SetupFormValue | undefined): string;
|
|
53
62
|
/** Initial form state: every declared field, seeded with its declared default. */
|
|
54
63
|
export declare function getInitialFormValues(setup: SetupBlock): SetupFormValues;
|
|
55
64
|
/** Check every declared field. Returns only the fields that failed. */
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../_virtual/_rolldown/runtime.cjs");const e=require("../node_modules/@openhands/extensions/automations/index.cjs");require("./manifest-registry.cjs").createSetupRegistry(e.default)
|
|
1
|
+
require("../_virtual/_rolldown/runtime.cjs");const e=require("../node_modules/@openhands/extensions/automations/index.cjs");var t=require("./manifest-registry.cjs").createSetupRegistry(e.default),n=e.automations_exports,r=`AUTOMATION_INTERFACE`in n?n.AUTOMATION_INTERFACE:void 0;exports.AUTOMATION_INTERFACE_CANDIDATE=r,exports.SETUP_REGISTRY=t;
|
|
2
2
|
//# sourceMappingURL=manifest-sources.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-sources.cjs","names":[],"sources":["../../src/manifests/manifest-sources.ts"],"sourcesContent":["/**\n * The one place that decides which manifests this host is offered.\n *\n * Setup manifests are published by `@openhands/extensions` as an optional\n * `setup` block on a catalog entry, so the catalog is the whole source. Entries\n * without one are skipped, which means the pinned package deciding to ship them\n * is the only step left — there is no wiring to add here.\n *\n * The catalog is passed as `unknown[]` on purpose: admission is a trust\n * boundary, so the host validates the published data rather than trusting the\n * types that shipped beside it.\n */\n\nimport * as automationsModule from \"@openhands/extensions/automations\";\nimport { AUTOMATION_CATALOG } from \"@openhands/extensions/automations\";\nimport { createSetupRegistry, type SetupRegistry } from \"./manifest-registry\";\n\nexport const SETUP_REGISTRY: SetupRegistry = createSetupRegistry(\n AUTOMATION_CATALOG as readonly unknown[],\n);\n\n/**\n * The interface manifest the pinned package publishes, if any. It is read off\n * the module namespace so a package that predates the export yields\n * `undefined` rather than a build error; admission in\n * `automation-interface.ts` decides what to do with it.\n */\nconst automationsExports: object = automationsModule;\nexport const AUTOMATION_INTERFACE_CANDIDATE: unknown =\n \"AUTOMATION_INTERFACE\" in automationsExports\n ? automationsExports.AUTOMATION_INTERFACE\n : undefined;\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"manifest-sources.cjs","names":[],"sources":["../../src/manifests/manifest-sources.ts"],"sourcesContent":["/**\n * The one place that decides which manifests this host is offered.\n *\n * Setup manifests are published by `@openhands/extensions` as an optional\n * `setup` block on a catalog entry, so the catalog is the whole source. Entries\n * without one are skipped, which means the pinned package deciding to ship them\n * is the only step left — there is no wiring to add here.\n *\n * The catalog is passed as `unknown[]` on purpose: admission is a trust\n * boundary, so the host validates the published data rather than trusting the\n * types that shipped beside it.\n */\n\nimport * as automationsModule from \"@openhands/extensions/automations\";\nimport { AUTOMATION_CATALOG } from \"@openhands/extensions/automations\";\nimport { createSetupRegistry, type SetupRegistry } from \"./manifest-registry\";\n\nexport const SETUP_REGISTRY: SetupRegistry = createSetupRegistry(\n AUTOMATION_CATALOG as readonly unknown[],\n);\n\n/**\n * The interface manifest the pinned package publishes, if any. It is read off\n * the module namespace so a package that predates the export yields\n * `undefined` rather than a build error; admission in\n * `automation-interface.ts` decides what to do with it.\n */\nconst automationsExports: object = automationsModule;\nexport const AUTOMATION_INTERFACE_CANDIDATE: unknown =\n \"AUTOMATION_INTERFACE\" in automationsExports\n ? automationsExports.AUTOMATION_INTERFACE\n : undefined;\n"],"mappings":"4HAiBA,IAAa,mCAAgC,EAAA,oBAC3C,EAAA,OACF,EAQM,EAA6B,EAAA,oBACtB,EACX,yBAA0B,EACtB,EAAmB,qBACnB,IAAA"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import e, { automations_exports as t } from "../node_modules/@openhands/extensions/automations/index.js";
|
|
2
2
|
import { createSetupRegistry as n } from "./manifest-registry.js";
|
|
3
|
-
|
|
4
|
-
var r =
|
|
3
|
+
//#region src/manifests/manifest-sources.ts
|
|
4
|
+
var r = n(e), i = t, a = "AUTOMATION_INTERFACE" in i ? i.AUTOMATION_INTERFACE : void 0;
|
|
5
5
|
//#endregion
|
|
6
|
-
export {
|
|
6
|
+
export { a as AUTOMATION_INTERFACE_CANDIDATE, r as SETUP_REGISTRY };
|
|
7
7
|
|
|
8
8
|
//# sourceMappingURL=manifest-sources.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-sources.js","names":[],"sources":["../../src/manifests/manifest-sources.ts"],"sourcesContent":["/**\n * The one place that decides which manifests this host is offered.\n *\n * Setup manifests are published by `@openhands/extensions` as an optional\n * `setup` block on a catalog entry, so the catalog is the whole source. Entries\n * without one are skipped, which means the pinned package deciding to ship them\n * is the only step left — there is no wiring to add here.\n *\n * The catalog is passed as `unknown[]` on purpose: admission is a trust\n * boundary, so the host validates the published data rather than trusting the\n * types that shipped beside it.\n */\n\nimport * as automationsModule from \"@openhands/extensions/automations\";\nimport { AUTOMATION_CATALOG } from \"@openhands/extensions/automations\";\nimport { createSetupRegistry, type SetupRegistry } from \"./manifest-registry\";\n\nexport const SETUP_REGISTRY: SetupRegistry = createSetupRegistry(\n AUTOMATION_CATALOG as readonly unknown[],\n);\n\n/**\n * The interface manifest the pinned package publishes, if any. It is read off\n * the module namespace so a package that predates the export yields\n * `undefined` rather than a build error; admission in\n * `automation-interface.ts` decides what to do with it.\n */\nconst automationsExports: object = automationsModule;\nexport const AUTOMATION_INTERFACE_CANDIDATE: unknown =\n \"AUTOMATION_INTERFACE\" in automationsExports\n ? automationsExports.AUTOMATION_INTERFACE\n : undefined;\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"manifest-sources.js","names":[],"sources":["../../src/manifests/manifest-sources.ts"],"sourcesContent":["/**\n * The one place that decides which manifests this host is offered.\n *\n * Setup manifests are published by `@openhands/extensions` as an optional\n * `setup` block on a catalog entry, so the catalog is the whole source. Entries\n * without one are skipped, which means the pinned package deciding to ship them\n * is the only step left — there is no wiring to add here.\n *\n * The catalog is passed as `unknown[]` on purpose: admission is a trust\n * boundary, so the host validates the published data rather than trusting the\n * types that shipped beside it.\n */\n\nimport * as automationsModule from \"@openhands/extensions/automations\";\nimport { AUTOMATION_CATALOG } from \"@openhands/extensions/automations\";\nimport { createSetupRegistry, type SetupRegistry } from \"./manifest-registry\";\n\nexport const SETUP_REGISTRY: SetupRegistry = createSetupRegistry(\n AUTOMATION_CATALOG as readonly unknown[],\n);\n\n/**\n * The interface manifest the pinned package publishes, if any. It is read off\n * the module namespace so a package that predates the export yields\n * `undefined` rather than a build error; admission in\n * `automation-interface.ts` decides what to do with it.\n */\nconst automationsExports: object = automationsModule;\nexport const AUTOMATION_INTERFACE_CANDIDATE: unknown =\n \"AUTOMATION_INTERFACE\" in automationsExports\n ? automationsExports.AUTOMATION_INTERFACE\n : undefined;\n"],"mappings":";;;AAiBA,IAAa,IAAgC,EAC3C,CACF,GAQM,IAA6B,GACtB,IACX,0BAA0B,IACtB,EAAmB,uBACnB,KAAA"}
|
|
@@ -14,6 +14,20 @@ export interface SetupScope {
|
|
|
14
14
|
}
|
|
15
15
|
/** Walk a dotted path through plain objects. */
|
|
16
16
|
export declare function getByPath(source: unknown, path: string): unknown;
|
|
17
|
+
/**
|
|
18
|
+
* Substitute placeholders, keeping the resolved value's own type when the
|
|
19
|
+
* template is nothing but that placeholder.
|
|
20
|
+
*
|
|
21
|
+
* This is what lets a request body state `"repos": "{{form.repositories}}"` and
|
|
22
|
+
* get an array. Inside a sentence the same placeholder still reads as text,
|
|
23
|
+
* because there is nowhere for a list to go in a string.
|
|
24
|
+
*
|
|
25
|
+
* Only the shapes a form value has are kept whole. A placeholder naming
|
|
26
|
+
* anything else - `{{automation.setup}}` resolves to the setup block itself -
|
|
27
|
+
* reads as text like it does inside a sentence, so a manifest cannot state one
|
|
28
|
+
* value and put its own object graph into the request body.
|
|
29
|
+
*/
|
|
30
|
+
export declare function interpolateValue(template: string, scope: SetupScope): string | string[];
|
|
17
31
|
/** Substitute placeholders inside a template string. */
|
|
18
32
|
export declare function interpolateText(template: string, scope: SetupScope): string;
|
|
19
33
|
/** Substitute placeholders from a flat name → value record. */
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../_virtual/_rolldown/runtime.cjs");const e=require("./types.cjs");var t=/^[a-z0-9]+(-[a-z0-9]+)*$/,n=/^[a-z][A-Za-z0-9]*$/,r=/<[A-Za-z/!]/,i=RegExp(`\\{\\{(?!(?:${e.SETUP_PLACEHOLDER_NAMESPACES.join(`|`)})\\.[A-Za-z0-9_.]+\\}\\})`),
|
|
1
|
+
require("../_virtual/_rolldown/runtime.cjs");const e=require("./types.cjs");var t=/^[a-z0-9]+(-[a-z0-9]+)*$/,n=/^[a-z][A-Za-z0-9]*$/,r=/<[A-Za-z/!]/,i=/^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)(?:-(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(?:\+[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*)?$/,a=/^[A-Za-z0-9 ._/-]+$/,o=/^[A-Za-z0-9._-]+(\/[A-Za-z0-9._-]+)*$/,s=/^(skills|automations)\/[A-Za-z0-9._-]+(\/[A-Za-z0-9._-]+)*$/,c=RegExp(`\\{\\{(?!(?:${e.SETUP_PLACEHOLDER_NAMESPACES.join(`|`)})\\.[A-Za-z0-9_.]+\\}\\})`),l=[`direct`,`assisted`],u=[`text`,`textarea`,`select`,`cron`,`timezone`,`repo-picker`],d=[`github`,`gitlab`,`bitbucket`],f=[`cron`,`event`],p=[`safeExpressionLiteral`],m=2e3;function h(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function g(e,t){return typeof e==`string`&&t.includes(e)}function _(e,t){return typeof e==`number`&&Number.isInteger(e)&&e>=t}var v=class{errors=[];fail(e,t){return this.errors.push(`${e}: ${t}`),!1}copy(e,t){return typeof e!=`string`||e.length===0?this.fail(t,`must be a non-empty string`):r.test(e)?this.fail(t,`must not contain markup`):!0}placeholders(e,t){return c.test(e)?this.fail(t,`uses an unknown placeholder namespace`):!0}templateCopy(e,t){return this.copy(e,t)&&this.placeholders(e,t)}templateValue(e,t){return typeof e!=`string`||e.length===0?this.fail(t,`must be a non-empty string`):this.placeholders(e,t)}absent(e,t,n,r){return t in e?this.fail(`${n}.${t}`,r):!0}};function y(e,t){return typeof e==`string`&&t.test(e)&&!e.split(`/`).some(e=>e===`.`||e===`..`)}function b(e){if(typeof e!=`string`||!a.test(e))return!1;let t=e.split(` `).filter(e=>e.length>0);return t.length>0&&t.every(e=>!e.startsWith(`/`)&&!e.split(`/`).some(e=>e===`..`))}function x(e,t){if(!h(t)){e.fail(`requires`,`must be an object`);return}let{integrations:n,features:r}=t;h(n)?Object.entries(n).forEach(([t,n])=>{let r=`requires.integrations.${t}`;if(!h(n)){e.fail(r,`must be an object`);return}e.copy(n.message,`${r}.message`),`required`in n&&n.required!==!1&&e.fail(`${r}.required`,`may only be false`);let i=[`message`,`required`];Object.keys(n).filter(e=>!i.includes(e)).forEach(t=>e.fail(`${r}.${t}`,`is not allowed`))}):e.fail(`requires.integrations`,`must be an object`),r!==void 0&&(!Array.isArray(r)||r.length===0?e.fail(`requires.features`,`must be a non-empty array`):r.forEach((t,n)=>{(typeof t!=`string`||t.length===0)&&e.fail(`requires.features[${n}]`,`must be a non-empty string`)}))}function S(e,t,n){if(!h(t)||Object.keys(t).length===0){e.fail(n,`must be a non-empty object`);return}let{minLength:r,maxLength:i,format:a}=t;r!==void 0&&!_(r,0)&&e.fail(`${n}.minLength`,`must be a non-negative integer`),i!==void 0&&!_(i,1)&&e.fail(`${n}.maxLength`,`must be a positive integer`),a!==void 0&&!g(a,p)&&e.fail(`${n}.format`,`is not a supported format`)}function C(e,t,n){if(!h(t)){e.fail(n,`must be an object`);return}let{type:r,label:i,help:a,placeholder:o,required:s,provider:c,options:l}=t;g(r,u)||e.fail(`${n}.type`,`is not a supported field type`),e.copy(i,`${n}.label`),e.copy(a,`${n}.help`),o!==void 0&&e.copy(o,`${n}.placeholder`),t.default!==void 0&&typeof t.default!=`string`&&e.fail(`${n}.default`,`must be a string`),typeof s!=`boolean`&&e.fail(`${n}.required`,`must be a boolean`),c!==void 0&&!g(c,d)&&e.fail(`${n}.provider`,`is not a supported provider`),r===`repo-picker`&&c===void 0&&e.fail(`${n}.provider`,`is required for a repository field`),t.multiple!==void 0&&(t.multiple!==!0||r!==`repo-picker`)&&e.fail(`${n}.multiple`,`may only be true, and only on a repository field`),l!==void 0&&(r===`select`?!Array.isArray(l)||l.length===0?e.fail(`${n}.options`,`must be a non-empty array`):l.forEach((t,r)=>{let i=`${n}.options[${r}]`;if(!h(t)){e.fail(i,`must be an object`);return}(typeof t.value!=`string`||t.value.length===0)&&e.fail(`${i}.value`,`must be a non-empty string`),e.copy(t.label,`${i}.label`)}):e.fail(`${n}.options`,`is only allowed on a select field`)),t.constraints!==void 0&&S(e,t.constraints,`${n}.constraints`)}function w(e,t,r){return!h(t)||Object.keys(t).length===0?(e.fail(r,`must be a non-empty object`),[]):Object.entries(t).map(([t,i])=>(n.test(t)||e.fail(`${r}.${t}`,`is not a valid field name`),C(e,i,`${r}.${t}`),t))}function T(e,t){if(!h(t))return e.fail(`setup.form`,`must be an object`),[];t.note!==void 0&&e.copy(t.note,`setup.form.note`);let n=w(e,t.args,`setup.form.args`),r=[];t.triggers!==void 0&&(!h(t.triggers)||Object.keys(t.triggers).length===0?e.fail(`setup.form.triggers`,`must be a non-empty object`):Object.entries(t.triggers).forEach(([t,i])=>{if(!g(t,f)){e.fail(`setup.form.triggers.${t}`,`is not a trigger kind`);return}r.push(t),n.push(...w(e,i,`setup.form.triggers.${t}`))}));let i=n.filter((e,t)=>n.indexOf(e)!==t);return Array.from(new Set(i)).forEach(t=>e.fail(`setup.form.${t}`,`is declared more than once`)),r}function E(e){return h(e)?[e.args,...Object.values(h(e.triggers)?e.triggers:{})].some(e=>h(e)&&Object.values(e).some(e=>h(e)&&e.type===`repo-picker`)):!1}function D(e,t){e.templateCopy(t,`setup.message`)&&t.length>m&&e.fail(`setup.message`,`must be at most ${m} characters`)}function O(e,t){if(!h(t)){e.fail(`setup.bundle`,`must be an object`);return}(typeof t.version!=`string`||!i.test(t.version))&&e.fail(`setup.bundle.version`,`must be a semantic version`),b(t.entrypoint)||e.fail(`setup.bundle.entrypoint`,`must be a plain command that stays inside the archive`),t.setupScript!==void 0&&!y(t.setupScript,o)&&e.fail(`setup.bundle.setupScript`,`must be a relative path`),t.timeout!==void 0&&!_(t.timeout,1)&&e.fail(`setup.bundle.timeout`,`must be a positive integer`),!h(t.files)||Object.keys(t.files).length===0?e.fail(`setup.bundle.files`,`must be a non-empty object`):(Object.entries(t.files).forEach(([t,n])=>{y(t,o)||e.fail(`setup.bundle.files.${t}`,`is not a packed path`),t===`config.json`&&e.fail(`setup.bundle.files.${t}`,`is the name the rendered config is packed under`),y(n,s)||e.fail(`setup.bundle.files.${t}`,`must name a file under skills/ or automations/`)}),typeof t.setupScript==`string`&&!(t.setupScript in t.files)&&e.fail(`setup.bundle.setupScript`,`must name a packed file`)),!h(t.config)||Object.keys(t.config).length===0?e.fail(`setup.bundle.config`,`must be a non-empty object`):k(e,t.config,`setup.bundle.config`)}function k(e,t,n){if(typeof t==`string`){e.templateValue(t,n);return}if(Array.isArray(t)){t.forEach((t,r)=>k(e,t,`${n}[${r}]`));return}if(h(t)){Object.entries(t).forEach(([t,r])=>k(e,r,`${n}.${t}`));return}t!==null&&typeof t!=`number`&&typeof t!=`boolean`&&e.fail(n,`must be a string, number, boolean, null, array or object`)}function A(e,t,n){if(!g(t.mode,l)){e.fail(`setup.mode`,`is not a supported mode`);return}if(t.mode===`direct`){let r=t.prompt!==void 0,i=t.bundle!==void 0;r===i?e.fail(`setup`,`must declare exactly one of prompt or bundle for direct setup`):i?O(e,t.bundle):e.templateValue(t.prompt,`setup.prompt`),t.message!==void 0&&D(e,t.message),n.length!==1&&e.fail(`setup.form.triggers`,`must declare exactly one trigger kind`),n.includes(`event`)&&!E(t.form)&&e.fail(`setup.form`,`must declare a repository field for an event trigger`),t.filter!==void 0&&(n.includes(`event`)?e.templateValue(t.filter,`setup.filter`):e.fail(`setup.filter`,`is only allowed for an event trigger`));return}D(e,t.message),e.absent(t,`prompt`,`setup`,`is only allowed for direct setup`),e.absent(t,`bundle`,`setup`,`is only allowed for direct setup`),e.absent(t,`filter`,`setup`,`is only allowed for direct setup`)}function j(e){return h(e)&&e.setup!==void 0}function M(e){let n=new v;if(!h(e))return{valid:!1,errors:[`manifest: must be an object`]};let{setup:r}=e;return h(r)?r.version===`1.0`?((typeof e.id!=`string`||!t.test(e.id))&&n.fail(`id`,`must be a lowercase slug`),n.copy(e.name,`name`),n.copy(e.description,`description`),e.version!==void 0&&(typeof e.version!=`string`||!i.test(e.version))&&n.fail(`version`,`must be a semantic version`),e.skill!==void 0&&(typeof e.skill!=`string`||!t.test(e.skill))&&n.fail(`skill`,`must be a lowercase slug`),x(n,e.requires),A(n,r,T(n,r.form)),{valid:n.errors.length===0,errors:n.errors}):{valid:!1,errors:[`setup.version: must be "1.0"`]}:{valid:!1,errors:[`setup: must be an object`]}}exports.hasSetupBlock=j,exports.validateSetupEntry=M;
|
|
2
2
|
//# sourceMappingURL=manifest-validation.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-validation.cjs","names":[],"sources":["../../src/manifests/manifest-validation.ts"],"sourcesContent":["/**\n * Admission policy for extension-authored catalog manifests.\n *\n * A manifest is data authored in a different repository that instructs this host\n * to render copy and compose a request. The host therefore decides what a\n * manifest is *permitted* to do rather than trusting the file — validation here\n * is a trust boundary, not a convenience check, and it deliberately does not\n * defer to a schema shipped alongside the manifests it would be validating.\n *\n * Beyond mirroring the published schema, this adds the invariants the host's own\n * derivation depends on: a single trigger kind to read, a repository field for\n * an event trigger's source, and field names unique across the form. Without\n * them the derived request body would be silently wrong rather than rejected.\n *\n * A manifest that fails any check is rejected outright. It never renders a\n * partial UI, because everything downstream treats its content as instructions.\n */\n\nimport { SETUP_PLACEHOLDER_NAMESPACES, SETUP_VERSION } from \"./types\";\n\nconst ENTRY_ID_PATTERN = /^[a-z0-9]+(-[a-z0-9]+)*$/;\nconst FIELD_NAME_PATTERN = /^[a-z][A-Za-z0-9]*$/;\n/** Copy must never be able to inject markup into the host. */\nconst MARKUP_PATTERN = /<[A-Za-z/!]/;\n/** Every `{{` must open a known namespace and close immediately. */\nconst UNKNOWN_PLACEHOLDER_PATTERN = new RegExp(\n `\\\\{\\\\{(?!(?:${SETUP_PLACEHOLDER_NAMESPACES.join(\"|\")})\\\\.[A-Za-z0-9_.]+\\\\}\\\\})`,\n);\n\nconst SETUP_MODES = [\"direct\", \"assisted\"] as const;\nconst FIELD_TYPES = [\n \"text\",\n \"textarea\",\n \"select\",\n \"cron\",\n \"timezone\",\n \"repo-picker\",\n] as const;\nconst GIT_PROVIDERS = [\"github\", \"gitlab\", \"bitbucket\"] as const;\nconst TRIGGER_KINDS = [\"cron\", \"event\"] as const;\nconst CONSTRAINT_FORMATS = [\"safeExpressionLiteral\"] as const;\n\n/** Setup context only, so this can never become a channel for runtime instructions. */\nconst MAX_MESSAGE_LENGTH = 2000;\n\nexport interface SetupValidationResult {\n valid: boolean;\n errors: string[];\n}\n\ntype Rec = Record<string, unknown>;\n\nfunction isRecord(value: unknown): value is Rec {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isOneOf<T extends readonly string[]>(\n value: unknown,\n allowed: T,\n): value is T[number] {\n return (\n typeof value === \"string\" && (allowed as readonly string[]).includes(value)\n );\n}\n\nfunction isInteger(value: unknown, minimum: number): boolean {\n return (\n typeof value === \"number\" && Number.isInteger(value) && value >= minimum\n );\n}\n\nclass SetupChecker {\n readonly errors: string[] = [];\n\n fail(path: string, reason: string): false {\n this.errors.push(`${path}: ${reason}`);\n return false;\n }\n\n /** Literal user-visible copy. Carries no markup. */\n copy(value: unknown, path: string): boolean {\n if (typeof value !== \"string\" || value.length === 0) {\n return this.fail(path, \"must be a non-empty string\");\n }\n if (MARKUP_PATTERN.test(value)) {\n return this.fail(path, \"must not contain markup\");\n }\n return true;\n }\n\n placeholders(value: string, path: string): boolean {\n if (UNKNOWN_PLACEHOLDER_PATTERN.test(value)) {\n return this.fail(path, \"uses an unknown placeholder namespace\");\n }\n return true;\n }\n\n /** Copy that may embed `{{namespace.key}}` placeholders. */\n templateCopy(value: unknown, path: string): boolean {\n return this.copy(value, path) && this.placeholders(value as string, path);\n }\n\n /**\n * A request-body string that may embed placeholders. Never rendered, so\n * expression syntax such as a JMESPath filter is allowed through.\n */\n templateValue(value: unknown, path: string): boolean {\n if (typeof value !== \"string\" || value.length === 0) {\n return this.fail(path, \"must be a non-empty string\");\n }\n return this.placeholders(value, path);\n }\n\n absent(container: Rec, key: string, path: string, reason: string): boolean {\n if (key in container) return this.fail(`${path}.${key}`, reason);\n return true;\n }\n}\n\nfunction checkRequires(check: SetupChecker, requires: unknown): void {\n if (!isRecord(requires)) {\n check.fail(\"requires\", \"must be an object\");\n return;\n }\n\n const { integrations, features } = requires;\n if (!isRecord(integrations) || Object.keys(integrations).length === 0) {\n check.fail(\"requires.integrations\", \"must be a non-empty object\");\n } else {\n Object.entries(integrations).forEach(([id, requirement]) => {\n const path = `requires.integrations.${id}`;\n if (!isRecord(requirement)) {\n check.fail(path, \"must be an object\");\n return;\n }\n check.copy(requirement.message, `${path}.message`);\n if (\"required\" in requirement && requirement.required !== false) {\n check.fail(`${path}.required`, \"may only be false\");\n }\n const allowed = [\"message\", \"required\"];\n Object.keys(requirement)\n .filter((key) => !allowed.includes(key))\n .forEach((key) => check.fail(`${path}.${key}`, \"is not allowed\"));\n });\n }\n\n if (features !== undefined) {\n if (!Array.isArray(features) || features.length === 0) {\n check.fail(\"requires.features\", \"must be a non-empty array\");\n } else {\n features.forEach((feature, index) => {\n if (typeof feature !== \"string\" || feature.length === 0) {\n check.fail(\n `requires.features[${index}]`,\n \"must be a non-empty string\",\n );\n }\n });\n }\n }\n}\n\nfunction checkConstraints(\n check: SetupChecker,\n constraints: unknown,\n path: string,\n): void {\n if (!isRecord(constraints) || Object.keys(constraints).length === 0) {\n check.fail(path, \"must be a non-empty object\");\n return;\n }\n\n const { minLength, maxLength, format } = constraints;\n if (minLength !== undefined && !isInteger(minLength, 0)) {\n check.fail(`${path}.minLength`, \"must be a non-negative integer\");\n }\n if (maxLength !== undefined && !isInteger(maxLength, 1)) {\n check.fail(`${path}.maxLength`, \"must be a positive integer\");\n }\n if (format !== undefined && !isOneOf(format, CONSTRAINT_FORMATS)) {\n check.fail(`${path}.format`, \"is not a supported format\");\n }\n}\n\nfunction checkField(check: SetupChecker, field: unknown, path: string): void {\n if (!isRecord(field)) {\n check.fail(path, \"must be an object\");\n return;\n }\n\n const { type, label, help, placeholder, required, provider, options } = field;\n\n if (!isOneOf(type, FIELD_TYPES)) {\n check.fail(`${path}.type`, \"is not a supported field type\");\n }\n check.copy(label, `${path}.label`);\n check.copy(help, `${path}.help`);\n if (placeholder !== undefined) check.copy(placeholder, `${path}.placeholder`);\n if (field.default !== undefined && typeof field.default !== \"string\") {\n check.fail(`${path}.default`, \"must be a string\");\n }\n if (typeof required !== \"boolean\") {\n check.fail(`${path}.required`, \"must be a boolean\");\n }\n if (provider !== undefined && !isOneOf(provider, GIT_PROVIDERS)) {\n check.fail(`${path}.provider`, \"is not a supported provider\");\n }\n if (type === \"repo-picker\" && provider === undefined) {\n check.fail(`${path}.provider`, \"is required for a repository field\");\n }\n\n if (options !== undefined) {\n if (type !== \"select\") {\n check.fail(`${path}.options`, \"is only allowed on a select field\");\n } else if (!Array.isArray(options) || options.length === 0) {\n check.fail(`${path}.options`, \"must be a non-empty array\");\n } else {\n options.forEach((option, index) => {\n const optionPath = `${path}.options[${index}]`;\n if (!isRecord(option)) {\n check.fail(optionPath, \"must be an object\");\n return;\n }\n if (typeof option.value !== \"string\" || option.value.length === 0) {\n check.fail(`${optionPath}.value`, \"must be a non-empty string\");\n }\n check.copy(option.label, `${optionPath}.label`);\n });\n }\n }\n\n if (field.constraints !== undefined) {\n checkConstraints(check, field.constraints, `${path}.constraints`);\n }\n}\n\n/** Returns the declared field names, so the caller can check them for collisions. */\nfunction checkFields(\n check: SetupChecker,\n fields: unknown,\n path: string,\n): string[] {\n if (!isRecord(fields) || Object.keys(fields).length === 0) {\n check.fail(path, \"must be a non-empty object\");\n return [];\n }\n\n return Object.entries(fields).map(([name, field]) => {\n if (!FIELD_NAME_PATTERN.test(name)) {\n check.fail(`${path}.${name}`, \"is not a valid field name\");\n }\n checkField(check, field, `${path}.${name}`);\n return name;\n });\n}\n\n/** Returns the trigger kinds declared, in order. */\nfunction checkForm(check: SetupChecker, form: unknown): string[] {\n if (!isRecord(form)) {\n check.fail(\"setup.form\", \"must be an object\");\n return [];\n }\n\n if (form.note !== undefined) check.copy(form.note, \"setup.form.note\");\n\n const names = checkFields(check, form.args, \"setup.form.args\");\n const kinds: string[] = [];\n\n if (form.triggers !== undefined) {\n if (!isRecord(form.triggers) || Object.keys(form.triggers).length === 0) {\n check.fail(\"setup.form.triggers\", \"must be a non-empty object\");\n } else {\n Object.entries(form.triggers).forEach(([kind, fields]) => {\n if (!isOneOf(kind, TRIGGER_KINDS)) {\n check.fail(`setup.form.triggers.${kind}`, \"is not a trigger kind\");\n return;\n }\n kinds.push(kind);\n names.push(\n ...checkFields(check, fields, `setup.form.triggers.${kind}`),\n );\n });\n }\n }\n\n // The host merges both halves into one value map, so a repeated name would\n // silently shadow a field and misaddress every error reported against it.\n const duplicates = names.filter(\n (name, index) => names.indexOf(name) !== index,\n );\n Array.from(new Set(duplicates)).forEach((name) =>\n check.fail(`setup.form.${name}`, \"is declared more than once\"),\n );\n\n return kinds;\n}\n\nfunction hasRepoPicker(form: unknown): boolean {\n if (!isRecord(form)) return false;\n const groups = [\n form.args,\n ...Object.values(isRecord(form.triggers) ? form.triggers : {}),\n ];\n return groups.some(\n (group) =>\n isRecord(group) &&\n Object.values(group).some(\n (field) => isRecord(field) && field.type === \"repo-picker\",\n ),\n );\n}\n\nfunction checkMessage(check: SetupChecker, message: unknown): void {\n if (check.templateCopy(message, \"setup.message\")) {\n if ((message as string).length > MAX_MESSAGE_LENGTH) {\n check.fail(\n \"setup.message\",\n `must be at most ${MAX_MESSAGE_LENGTH} characters`,\n );\n }\n }\n}\n\nfunction checkMode(check: SetupChecker, setup: Rec, kinds: string[]): void {\n if (!isOneOf(setup.mode, SETUP_MODES)) {\n check.fail(\"setup.mode\", \"is not a supported mode\");\n return;\n }\n\n if (setup.mode === \"direct\") {\n check.templateValue(setup.prompt, \"setup.prompt\");\n // A direct entry may carry a fallback-conversation seed for deployments\n // that cannot run the direct path, held to the same rules as an assisted\n // message.\n if (setup.message !== undefined) checkMessage(check, setup.message);\n\n // The derivation reads a single trigger kind, and an event trigger takes\n // its source from the repository field's provider.\n if (kinds.length !== 1) {\n check.fail(\n \"setup.form.triggers\",\n \"must declare exactly one trigger kind\",\n );\n }\n if (kinds.includes(\"event\") && !hasRepoPicker(setup.form)) {\n check.fail(\n \"setup.form\",\n \"must declare a repository field for an event trigger\",\n );\n }\n if (setup.filter !== undefined) {\n if (!kinds.includes(\"event\")) {\n check.fail(\"setup.filter\", \"is only allowed for an event trigger\");\n } else {\n check.templateValue(setup.filter, \"setup.filter\");\n }\n }\n return;\n }\n\n checkMessage(check, setup.message);\n check.absent(setup, \"prompt\", \"setup\", \"is only allowed for direct setup\");\n check.absent(setup, \"filter\", \"setup\", \"is only allowed for direct setup\");\n}\n\n/** Whether a catalog entry ships a setup experience at all. It is optional. */\nexport function hasSetupBlock(candidate: unknown): boolean {\n return isRecord(candidate) && candidate.setup !== undefined;\n}\n\n/**\n * Decide whether this host will act on a catalog manifest.\n *\n * The version is checked first and fails closed: a format this host does not\n * recognise is refused rather than interpreted with today's rules.\n */\nexport function validateSetupEntry(candidate: unknown): SetupValidationResult {\n const check = new SetupChecker();\n\n if (!isRecord(candidate)) {\n return { valid: false, errors: [\"manifest: must be an object\"] };\n }\n\n const { setup } = candidate;\n if (!isRecord(setup)) {\n return { valid: false, errors: [\"setup: must be an object\"] };\n }\n if (setup.version !== SETUP_VERSION) {\n return {\n valid: false,\n errors: [`setup.version: must be \"${SETUP_VERSION}\"`],\n };\n }\n\n if (\n typeof candidate.id !== \"string\" ||\n !ENTRY_ID_PATTERN.test(candidate.id)\n ) {\n check.fail(\"id\", \"must be a lowercase slug\");\n }\n check.copy(candidate.name, \"name\");\n check.copy(candidate.description, \"description\");\n if (\n candidate.skill !== undefined &&\n (typeof candidate.skill !== \"string\" ||\n !ENTRY_ID_PATTERN.test(candidate.skill))\n ) {\n check.fail(\"skill\", \"must be a lowercase slug\");\n }\n\n checkRequires(check, candidate.requires);\n const kinds = checkForm(check, setup.form);\n checkMode(check, setup, kinds);\n\n return { valid: check.errors.length === 0, errors: check.errors };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"manifest-validation.cjs","names":[],"sources":["../../src/manifests/manifest-validation.ts"],"sourcesContent":["/**\n * Admission policy for extension-authored catalog manifests.\n *\n * A manifest is data authored in a different repository that instructs this host\n * to render copy and compose a request. The host therefore decides what a\n * manifest is *permitted* to do rather than trusting the file — validation here\n * is a trust boundary, not a convenience check, and it deliberately does not\n * defer to a schema shipped alongside the manifests it would be validating.\n *\n * Beyond mirroring the published schema, this adds the invariants the host's own\n * derivation depends on: a single trigger kind to read, a repository field for\n * an event trigger's source, and field names unique across the form. Without\n * them the derived request body would be silently wrong rather than rejected.\n *\n * A manifest that fails any check is rejected outright. It never renders a\n * partial UI, because everything downstream treats its content as instructions.\n */\n\nimport {\n BUNDLE_CONFIG_FILENAME,\n SETUP_PLACEHOLDER_NAMESPACES,\n SETUP_VERSION,\n} from \"./types\";\n\nconst ENTRY_ID_PATTERN = /^[a-z0-9]+(-[a-z0-9]+)*$/;\nconst FIELD_NAME_PATTERN = /^[a-z][A-Za-z0-9]*$/;\n/** Copy must never be able to inject markup into the host. */\nconst MARKUP_PATTERN = /<[A-Za-z/!]/;\n/**\n * A template version, declared as `version` by a prompt entry and as\n * `setup.bundle.version` by a bundle one. Sent to the service as template\n * provenance, so it is checked at admission. Full semver, as the spec at\n * semver.org states it: a catalog entry published with a pre-release or build\n * suffix is still a version this host may forward, and refusing one would drop\n * the entry from the registry outright.\n */\nconst TEMPLATE_VERSION_PATTERN =\n /^(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(?:-(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(?:\\+[0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*)?$/;\n// The characters a command of plain words and paths is made of. No shell\n// metacharacters, which the service rejects anyway and a bundle has no reason\n// to need; where those words may point is `isPlainCommand`'s to say.\nconst BUNDLE_COMMAND_PATTERN = /^[A-Za-z0-9 ._/-]+$/;\nconst BUNDLE_PATH_PATTERN = /^[A-Za-z0-9._-]+(\\/[A-Za-z0-9._-]+)*$/;\nconst BUNDLE_SOURCE_PATTERN =\n /^(skills|automations)\\/[A-Za-z0-9._-]+(\\/[A-Za-z0-9._-]+)*$/;\n/** Every `{{` must open a known namespace and close immediately. */\nconst UNKNOWN_PLACEHOLDER_PATTERN = new RegExp(\n `\\\\{\\\\{(?!(?:${SETUP_PLACEHOLDER_NAMESPACES.join(\"|\")})\\\\.[A-Za-z0-9_.]+\\\\}\\\\})`,\n);\n\nconst SETUP_MODES = [\"direct\", \"assisted\"] as const;\nconst FIELD_TYPES = [\n \"text\",\n \"textarea\",\n \"select\",\n \"cron\",\n \"timezone\",\n \"repo-picker\",\n] as const;\nconst GIT_PROVIDERS = [\"github\", \"gitlab\", \"bitbucket\"] as const;\nconst TRIGGER_KINDS = [\"cron\", \"event\"] as const;\nconst CONSTRAINT_FORMATS = [\"safeExpressionLiteral\"] as const;\n\n/** Setup context only, so this can never become a channel for runtime instructions. */\nconst MAX_MESSAGE_LENGTH = 2000;\n\nexport interface SetupValidationResult {\n valid: boolean;\n errors: string[];\n}\n\ntype Rec = Record<string, unknown>;\n\nfunction isRecord(value: unknown): value is Rec {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isOneOf<T extends readonly string[]>(\n value: unknown,\n allowed: T,\n): value is T[number] {\n return (\n typeof value === \"string\" && (allowed as readonly string[]).includes(value)\n );\n}\n\nfunction isInteger(value: unknown, minimum: number): boolean {\n return (\n typeof value === \"number\" && Number.isInteger(value) && value >= minimum\n );\n}\n\nclass SetupChecker {\n readonly errors: string[] = [];\n\n fail(path: string, reason: string): false {\n this.errors.push(`${path}: ${reason}`);\n return false;\n }\n\n /** Literal user-visible copy. Carries no markup. */\n copy(value: unknown, path: string): boolean {\n if (typeof value !== \"string\" || value.length === 0) {\n return this.fail(path, \"must be a non-empty string\");\n }\n if (MARKUP_PATTERN.test(value)) {\n return this.fail(path, \"must not contain markup\");\n }\n return true;\n }\n\n placeholders(value: string, path: string): boolean {\n if (UNKNOWN_PLACEHOLDER_PATTERN.test(value)) {\n return this.fail(path, \"uses an unknown placeholder namespace\");\n }\n return true;\n }\n\n /** Copy that may embed `{{namespace.key}}` placeholders. */\n templateCopy(value: unknown, path: string): boolean {\n return this.copy(value, path) && this.placeholders(value as string, path);\n }\n\n /**\n * A request-body string that may embed placeholders. Never rendered, so\n * expression syntax such as a JMESPath filter is allowed through.\n */\n templateValue(value: unknown, path: string): boolean {\n if (typeof value !== \"string\" || value.length === 0) {\n return this.fail(path, \"must be a non-empty string\");\n }\n return this.placeholders(value, path);\n }\n\n absent(container: Rec, key: string, path: string, reason: string): boolean {\n if (key in container) return this.fail(`${path}.${key}`, reason);\n return true;\n }\n}\n\n/**\n * A relative path that stays inside the archive it names.\n *\n * The character class alone is not enough: `.` and `..` are made of allowed\n * characters, so a segment check is what actually keeps a packed file from\n * climbing out of the directory it is extracted into.\n */\nfunction isRelativePath(value: unknown, pattern: RegExp): value is string {\n return (\n typeof value === \"string\" &&\n pattern.test(value) &&\n !value.split(\"/\").some((segment) => segment === \".\" || segment === \"..\")\n );\n}\n\n/**\n * A command whose every word stays inside the archive it is run in.\n *\n * The character class is not what keeps it there: `/` and `.` are allowed\n * characters, so `/bin/sh setup.sh` and `python3 ../../etc/x.py` are made of\n * them and each names something outside the extracted directory. The segment\n * rule packed paths are held to is what refuses those, and requiring a word at\n * all is what refuses an entrypoint of nothing but spaces.\n */\nfunction isPlainCommand(value: unknown): value is string {\n if (typeof value !== \"string\" || !BUNDLE_COMMAND_PATTERN.test(value)) {\n return false;\n }\n const words = value.split(\" \").filter((word) => word.length > 0);\n return (\n words.length > 0 &&\n words.every(\n (word) =>\n !word.startsWith(\"/\") &&\n !word.split(\"/\").some((segment) => segment === \"..\"),\n )\n );\n}\n\nfunction checkRequires(check: SetupChecker, requires: unknown): void {\n if (!isRecord(requires)) {\n check.fail(\"requires\", \"must be an object\");\n return;\n }\n\n const { integrations, features } = requires;\n // Empty is meaningful rather than malformed: an automation that needs no\n // credential connects to nothing, and the key stays required so that saying\n // so is a deliberate statement instead of an omission.\n if (!isRecord(integrations)) {\n check.fail(\"requires.integrations\", \"must be an object\");\n } else {\n Object.entries(integrations).forEach(([id, requirement]) => {\n const path = `requires.integrations.${id}`;\n if (!isRecord(requirement)) {\n check.fail(path, \"must be an object\");\n return;\n }\n check.copy(requirement.message, `${path}.message`);\n if (\"required\" in requirement && requirement.required !== false) {\n check.fail(`${path}.required`, \"may only be false\");\n }\n const allowed = [\"message\", \"required\"];\n Object.keys(requirement)\n .filter((key) => !allowed.includes(key))\n .forEach((key) => check.fail(`${path}.${key}`, \"is not allowed\"));\n });\n }\n\n if (features !== undefined) {\n if (!Array.isArray(features) || features.length === 0) {\n check.fail(\"requires.features\", \"must be a non-empty array\");\n } else {\n features.forEach((feature, index) => {\n if (typeof feature !== \"string\" || feature.length === 0) {\n check.fail(\n `requires.features[${index}]`,\n \"must be a non-empty string\",\n );\n }\n });\n }\n }\n}\n\nfunction checkConstraints(\n check: SetupChecker,\n constraints: unknown,\n path: string,\n): void {\n if (!isRecord(constraints) || Object.keys(constraints).length === 0) {\n check.fail(path, \"must be a non-empty object\");\n return;\n }\n\n const { minLength, maxLength, format } = constraints;\n if (minLength !== undefined && !isInteger(minLength, 0)) {\n check.fail(`${path}.minLength`, \"must be a non-negative integer\");\n }\n if (maxLength !== undefined && !isInteger(maxLength, 1)) {\n check.fail(`${path}.maxLength`, \"must be a positive integer\");\n }\n if (format !== undefined && !isOneOf(format, CONSTRAINT_FORMATS)) {\n check.fail(`${path}.format`, \"is not a supported format\");\n }\n}\n\nfunction checkField(check: SetupChecker, field: unknown, path: string): void {\n if (!isRecord(field)) {\n check.fail(path, \"must be an object\");\n return;\n }\n\n const { type, label, help, placeholder, required, provider, options } = field;\n\n if (!isOneOf(type, FIELD_TYPES)) {\n check.fail(`${path}.type`, \"is not a supported field type\");\n }\n check.copy(label, `${path}.label`);\n check.copy(help, `${path}.help`);\n if (placeholder !== undefined) check.copy(placeholder, `${path}.placeholder`);\n if (field.default !== undefined && typeof field.default !== \"string\") {\n check.fail(`${path}.default`, \"must be a string\");\n }\n if (typeof required !== \"boolean\") {\n check.fail(`${path}.required`, \"must be a boolean\");\n }\n if (provider !== undefined && !isOneOf(provider, GIT_PROVIDERS)) {\n check.fail(`${path}.provider`, \"is not a supported provider\");\n }\n if (type === \"repo-picker\" && provider === undefined) {\n check.fail(`${path}.provider`, \"is required for a repository field\");\n }\n // The host branches on this key to decide whether a field's value is a list,\n // so a field declaring it anywhere else would be seeded with a list and\n // rendered as a string.\n if (\n field.multiple !== undefined &&\n (field.multiple !== true || type !== \"repo-picker\")\n ) {\n check.fail(\n `${path}.multiple`,\n \"may only be true, and only on a repository field\",\n );\n }\n\n if (options !== undefined) {\n if (type !== \"select\") {\n check.fail(`${path}.options`, \"is only allowed on a select field\");\n } else if (!Array.isArray(options) || options.length === 0) {\n check.fail(`${path}.options`, \"must be a non-empty array\");\n } else {\n options.forEach((option, index) => {\n const optionPath = `${path}.options[${index}]`;\n if (!isRecord(option)) {\n check.fail(optionPath, \"must be an object\");\n return;\n }\n if (typeof option.value !== \"string\" || option.value.length === 0) {\n check.fail(`${optionPath}.value`, \"must be a non-empty string\");\n }\n check.copy(option.label, `${optionPath}.label`);\n });\n }\n }\n\n if (field.constraints !== undefined) {\n checkConstraints(check, field.constraints, `${path}.constraints`);\n }\n}\n\n/** Returns the declared field names, so the caller can check them for collisions. */\nfunction checkFields(\n check: SetupChecker,\n fields: unknown,\n path: string,\n): string[] {\n if (!isRecord(fields) || Object.keys(fields).length === 0) {\n check.fail(path, \"must be a non-empty object\");\n return [];\n }\n\n return Object.entries(fields).map(([name, field]) => {\n if (!FIELD_NAME_PATTERN.test(name)) {\n check.fail(`${path}.${name}`, \"is not a valid field name\");\n }\n checkField(check, field, `${path}.${name}`);\n return name;\n });\n}\n\n/** Returns the trigger kinds declared, in order. */\nfunction checkForm(check: SetupChecker, form: unknown): string[] {\n if (!isRecord(form)) {\n check.fail(\"setup.form\", \"must be an object\");\n return [];\n }\n\n if (form.note !== undefined) check.copy(form.note, \"setup.form.note\");\n\n const names = checkFields(check, form.args, \"setup.form.args\");\n const kinds: string[] = [];\n\n if (form.triggers !== undefined) {\n if (!isRecord(form.triggers) || Object.keys(form.triggers).length === 0) {\n check.fail(\"setup.form.triggers\", \"must be a non-empty object\");\n } else {\n Object.entries(form.triggers).forEach(([kind, fields]) => {\n if (!isOneOf(kind, TRIGGER_KINDS)) {\n check.fail(`setup.form.triggers.${kind}`, \"is not a trigger kind\");\n return;\n }\n kinds.push(kind);\n names.push(\n ...checkFields(check, fields, `setup.form.triggers.${kind}`),\n );\n });\n }\n }\n\n // The host merges both halves into one value map, so a repeated name would\n // silently shadow a field and misaddress every error reported against it.\n const duplicates = names.filter(\n (name, index) => names.indexOf(name) !== index,\n );\n Array.from(new Set(duplicates)).forEach((name) =>\n check.fail(`setup.form.${name}`, \"is declared more than once\"),\n );\n\n return kinds;\n}\n\nfunction hasRepoPicker(form: unknown): boolean {\n if (!isRecord(form)) return false;\n const groups = [\n form.args,\n ...Object.values(isRecord(form.triggers) ? form.triggers : {}),\n ];\n return groups.some(\n (group) =>\n isRecord(group) &&\n Object.values(group).some(\n (field) => isRecord(field) && field.type === \"repo-picker\",\n ),\n );\n}\n\nfunction checkMessage(check: SetupChecker, message: unknown): void {\n if (check.templateCopy(message, \"setup.message\")) {\n if ((message as string).length > MAX_MESSAGE_LENGTH) {\n check.fail(\n \"setup.message\",\n `must be at most ${MAX_MESSAGE_LENGTH} characters`,\n );\n }\n }\n}\n\n/**\n * The script tarball a direct entry may ship.\n *\n * The strings here are commands and paths this host acts on, so they are held\n * to a closed character set rather than the placeholder rules copy uses: an\n * entrypoint with a shell metacharacter, or a packed path that escapes the\n * archive, is refused here rather than by the service.\n */\nfunction checkBundle(check: SetupChecker, bundle: unknown): void {\n if (!isRecord(bundle)) {\n check.fail(\"setup.bundle\", \"must be an object\");\n return;\n }\n\n if (\n typeof bundle.version !== \"string\" ||\n !TEMPLATE_VERSION_PATTERN.test(bundle.version)\n ) {\n check.fail(\"setup.bundle.version\", \"must be a semantic version\");\n }\n if (!isPlainCommand(bundle.entrypoint)) {\n check.fail(\n \"setup.bundle.entrypoint\",\n \"must be a plain command that stays inside the archive\",\n );\n }\n if (\n bundle.setupScript !== undefined &&\n !isRelativePath(bundle.setupScript, BUNDLE_PATH_PATTERN)\n ) {\n check.fail(\"setup.bundle.setupScript\", \"must be a relative path\");\n }\n if (bundle.timeout !== undefined && !isInteger(bundle.timeout, 1)) {\n check.fail(\"setup.bundle.timeout\", \"must be a positive integer\");\n }\n\n if (!isRecord(bundle.files) || Object.keys(bundle.files).length === 0) {\n check.fail(\"setup.bundle.files\", \"must be a non-empty object\");\n } else {\n Object.entries(bundle.files).forEach(([packedPath, source]) => {\n if (!isRelativePath(packedPath, BUNDLE_PATH_PATTERN)) {\n check.fail(`setup.bundle.files.${packedPath}`, \"is not a packed path\");\n }\n // The rendered config is packed under this name too, and a tar carrying\n // the name twice leaves which one the script reads to whichever\n // extractor unpacks it.\n if (packedPath === BUNDLE_CONFIG_FILENAME) {\n check.fail(\n `setup.bundle.files.${packedPath}`,\n \"is the name the rendered config is packed under\",\n );\n }\n if (!isRelativePath(source, BUNDLE_SOURCE_PATTERN)) {\n check.fail(\n `setup.bundle.files.${packedPath}`,\n \"must name a file under skills/ or automations/\",\n );\n }\n });\n\n // A setup script the archive does not carry is a create request the\n // service accepts and the first run fails on, and it is also the only\n // thing packed executable - naming an unpacked file makes that rule\n // unreachable.\n if (\n typeof bundle.setupScript === \"string\" &&\n !(bundle.setupScript in bundle.files)\n ) {\n check.fail(\"setup.bundle.setupScript\", \"must name a packed file\");\n }\n }\n\n if (!isRecord(bundle.config) || Object.keys(bundle.config).length === 0) {\n check.fail(\"setup.bundle.config\", \"must be a non-empty object\");\n } else {\n checkBundleConfig(check, bundle.config, \"setup.bundle.config\");\n }\n}\n\n/** Every string leaf of the config is a payload value: placeholders, no markup rule. */\nfunction checkBundleConfig(\n check: SetupChecker,\n node: unknown,\n path: string,\n): void {\n if (typeof node === \"string\") {\n check.templateValue(node, path);\n return;\n }\n if (Array.isArray(node)) {\n node.forEach((item, index) =>\n checkBundleConfig(check, item, `${path}[${index}]`),\n );\n return;\n }\n if (isRecord(node)) {\n Object.entries(node).forEach(([key, value]) =>\n checkBundleConfig(check, value, `${path}.${key}`),\n );\n return;\n }\n if (node !== null && typeof node !== \"number\" && typeof node !== \"boolean\") {\n check.fail(\n path,\n \"must be a string, number, boolean, null, array or object\",\n );\n }\n}\n\nfunction checkMode(check: SetupChecker, setup: Rec, kinds: string[]): void {\n if (!isOneOf(setup.mode, SETUP_MODES)) {\n check.fail(\"setup.mode\", \"is not a supported mode\");\n return;\n }\n\n if (setup.mode === \"direct\") {\n // A direct entry produces one of two things: a prompt, or a script bundle\n // the host packs and uploads. Both would be ambiguous, neither is nothing\n // to create.\n const hasPrompt = setup.prompt !== undefined;\n const hasBundle = setup.bundle !== undefined;\n if (hasPrompt === hasBundle) {\n check.fail(\n \"setup\",\n \"must declare exactly one of prompt or bundle for direct setup\",\n );\n } else if (hasBundle) {\n checkBundle(check, setup.bundle);\n } else {\n check.templateValue(setup.prompt, \"setup.prompt\");\n }\n // A direct entry may carry a fallback-conversation seed for deployments\n // that cannot run the direct path, held to the same rules as an assisted\n // message.\n if (setup.message !== undefined) checkMessage(check, setup.message);\n\n // The derivation reads a single trigger kind, and an event trigger takes\n // its source from the repository field's provider.\n if (kinds.length !== 1) {\n check.fail(\n \"setup.form.triggers\",\n \"must declare exactly one trigger kind\",\n );\n }\n if (kinds.includes(\"event\") && !hasRepoPicker(setup.form)) {\n check.fail(\n \"setup.form\",\n \"must declare a repository field for an event trigger\",\n );\n }\n if (setup.filter !== undefined) {\n if (!kinds.includes(\"event\")) {\n check.fail(\"setup.filter\", \"is only allowed for an event trigger\");\n } else {\n check.templateValue(setup.filter, \"setup.filter\");\n }\n }\n return;\n }\n\n checkMessage(check, setup.message);\n check.absent(setup, \"prompt\", \"setup\", \"is only allowed for direct setup\");\n check.absent(setup, \"bundle\", \"setup\", \"is only allowed for direct setup\");\n check.absent(setup, \"filter\", \"setup\", \"is only allowed for direct setup\");\n}\n\n/** Whether a catalog entry ships a setup experience at all. It is optional. */\nexport function hasSetupBlock(candidate: unknown): boolean {\n return isRecord(candidate) && candidate.setup !== undefined;\n}\n\n/**\n * Decide whether this host will act on a catalog manifest.\n *\n * The version is checked first and fails closed: a format this host does not\n * recognise is refused rather than interpreted with today's rules.\n */\nexport function validateSetupEntry(candidate: unknown): SetupValidationResult {\n const check = new SetupChecker();\n\n if (!isRecord(candidate)) {\n return { valid: false, errors: [\"manifest: must be an object\"] };\n }\n\n const { setup } = candidate;\n if (!isRecord(setup)) {\n return { valid: false, errors: [\"setup: must be an object\"] };\n }\n if (setup.version !== SETUP_VERSION) {\n return {\n valid: false,\n errors: [`setup.version: must be \"${SETUP_VERSION}\"`],\n };\n }\n\n if (\n typeof candidate.id !== \"string\" ||\n !ENTRY_ID_PATTERN.test(candidate.id)\n ) {\n check.fail(\"id\", \"must be a lowercase slug\");\n }\n check.copy(candidate.name, \"name\");\n check.copy(candidate.description, \"description\");\n if (\n candidate.version !== undefined &&\n (typeof candidate.version !== \"string\" ||\n !TEMPLATE_VERSION_PATTERN.test(candidate.version))\n ) {\n check.fail(\"version\", \"must be a semantic version\");\n }\n if (\n candidate.skill !== undefined &&\n (typeof candidate.skill !== \"string\" ||\n !ENTRY_ID_PATTERN.test(candidate.skill))\n ) {\n check.fail(\"skill\", \"must be a lowercase slug\");\n }\n\n checkRequires(check, candidate.requires);\n const kinds = checkForm(check, setup.form);\n checkMode(check, setup, kinds);\n\n return { valid: check.errors.length === 0, errors: check.errors };\n}\n"],"mappings":"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"}
|