@openhands/agent-canvas 1.19.0 → 1.20.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-BQ4o4vqy.js → acp-providers-DOKcGeaV.js} +1 -1
- package/build/assets/active-backend-context-BETEdaJl.js +2 -0
- package/build/assets/{agent-context-settings-D9i6ezoJ.js → agent-context-settings-Dir0loAn.js} +1 -1
- package/build/assets/{agent-profiles-service.api-U-9YzDFU.js → agent-profiles-service.api-CiMVQAIT.js} +1 -1
- package/build/assets/{agent-profiles-settings-D-bUV2PX.js → agent-profiles-settings-CT5owzRT.js} +1 -1
- package/build/assets/{agent-server-conversation-service.api-BaVQ6NpE.js → agent-server-conversation-service.api-BtOlitCD.js} +3 -3
- package/build/assets/agent-settings-BnzyTgCb.js +2 -0
- package/build/assets/agent-settings-CeXj3xK-.js +1 -0
- package/build/assets/{alert-banner-BkVt_8Or.js → alert-banner-Ccx1Du6n.js} +1 -1
- package/build/assets/{api-key-entry-screen-fAIld-n7.js → api-key-entry-screen-DXIuzBjY.js} +1 -1
- package/build/assets/{app-settings-DITbrM2u.js → app-settings-DkIJVTKL.js} +1 -1
- package/build/assets/{automation-detail-DawHmaOl.js → automation-detail-CF2SweVs.js} +1 -1
- package/build/assets/{automation-disabled-reason-DtgC8Ppt.js → automation-disabled-reason-QFtMrdOr.js} +1 -1
- package/build/assets/{automation-export-Kv6e0bHx.js → automation-export-CkvehhPF.js} +1 -1
- package/build/assets/{automation-git-sync-Dd98G_Oz.js → automation-git-sync-di4tBAyZ.js} +1 -1
- package/build/assets/automation-setup-route-FERj7WEe.js +3 -0
- package/build/assets/{automation-templates-Xhr-FDAB.js → automation-templates-DlaCRvD-.js} +1 -1
- package/build/assets/{automations-list-BeP1LuzQ.js → automations-list-yK7ETmYP.js} +1 -1
- package/build/assets/{back-nav-button-DWNiN277.js → back-nav-button-oDvIxpQ5.js} +1 -1
- package/build/assets/{backend-form-modal-DeaUJIik.js → backend-form-modal-DzYf_arO.js} +1 -1
- package/build/assets/{backend-synced-settings-badge-Br85iWIY.js → backend-synced-settings-badge-DXDDHWX4.js} +1 -1
- package/build/assets/{badge-Cdnei7Ly.js → badge-CDHZEVeN.js} +1 -1
- package/build/assets/{base-modal-Ds7grR67.js → base-modal-CZq4kB_H.js} +1 -1
- package/build/assets/{brand-button-mQq2Ld1I.js → brand-button-CGUwj6zK.js} +1 -1
- package/build/assets/{browser-Bfum8fkE.js → browser-kY6jN61T.js} +1 -1
- package/build/assets/{browser-tab-CmYT4j_r.js → browser-tab-DFyZXsnB.js} +1 -1
- package/build/assets/{canvas-extension-page-CokKSVRG.js → canvas-extension-page-DsGq1DtT.js} +1 -1
- package/build/assets/{canvas-extensions-BoQEYG-2.js → canvas-extensions-Cb2Z0Hdc.js} +1 -1
- package/build/assets/{canvas-extensions-runtime-Du2M5iEX.js → canvas-extensions-runtime-DS6eT4nK.js} +1 -1
- package/build/assets/{chat-send-button-DM3JgMc2.js → chat-send-button-B6aVaD9V.js} +1 -1
- package/build/assets/{circle-plus-check-toggle-BbYBiUwv.js → circle-plus-check-toggle-ZOXpJ3I2.js} +1 -1
- package/build/assets/{cloud-funnel-analytics-D02kgq1s.js → cloud-funnel-analytics-BH_zxjiO.js} +1 -1
- package/build/assets/{cog-Dy1eWbSZ.js → cog-DVZT1f0s.js} +1 -1
- package/build/assets/{command-menu-mehU3Evb.js → command-menu-ImeHQ6c2.js} +1 -1
- package/build/assets/{commits-tab-DhQW8CXi.js → commits-tab-B5SUF66c.js} +1 -1
- package/build/assets/{condenser-settings-eRk6Fkx6.js → condenser-settings-BlGOXEXM.js} +1 -1
- package/build/assets/{confirmation-modal-BmVt_c0I.js → confirmation-modal-oN1EId79.js} +1 -1
- package/build/assets/{context-menu-list-item-lx2zk9G7.js → context-menu-list-item-DIm5xQg6.js} +1 -1
- package/build/assets/{conversation-BOj0ENI6.js → conversation-9a53tdbO.js} +3 -3
- package/build/assets/conversation-XRsI28ZM.js +1 -0
- package/build/assets/conversation-panel-XRsI28ZM.js +1 -0
- package/build/assets/{conversation-state-store-C6YncQNo.js → conversation-state-store-Br-eE-gg.js} +1 -1
- package/build/assets/{conversation-tab-empty-state-DIhwCC2J.js → conversation-tab-empty-state-BT1GrnKP.js} +1 -1
- package/build/assets/{copy-to-clipboard-button-DVNXLylP.js → copy-to-clipboard-button-CvTHqY13.js} +1 -1
- package/build/assets/{device-verify-LP-x7nra.js → device-verify-DX0xdNjo.js} +1 -1
- package/build/assets/{dropdown-classes-goDldkiu.js → dropdown-classes-DyyMaaXl.js} +1 -1
- package/build/assets/edit-automation-modal-bfD-5NIc.js +1 -0
- package/build/assets/{empty-state-Cd-TFe7i.js → empty-state-B5advKVW.js} +1 -1
- package/build/assets/{entry.client-CJdjIvMZ.js → entry.client-D_2gnSyB.js} +2 -2
- package/build/assets/{enum-filter-dropdown-pocrz9AL.js → enum-filter-dropdown-VAJp5mqh.js} +1 -1
- package/build/assets/{environment-switch-overlay-Dwe78wRl.js → environment-switch-overlay-C7x_yhEs.js} +1 -1
- package/build/assets/{error-state-SuWwztxV.js → error-state-BgYl7YeB.js} +1 -1
- package/build/assets/{extensions-hub-O0esK3Er.js → extensions-hub-DjhOed1I.js} +1 -1
- package/build/assets/{extensions-navigation-CgCVSXje.js → extensions-navigation-Di-J2KUR.js} +1 -1
- package/build/assets/{files-tab-B_6t8ljw.js → files-tab-BNDp3e_x.js} +1 -1
- package/build/assets/{form-control-classes-lQfLxzH4.js → form-control-classes-BVI_szaj.js} +1 -1
- package/build/assets/{get-git-path-Bp5rsUkl.js → get-git-path-DOe6PM_a.js} +1 -1
- package/build/assets/git-repo-dropdown-1fZGYtYm.js +1 -0
- package/build/assets/{git-repo-dropdown-DPQVumZg.js → git-repo-dropdown-DNlinQ7r.js} +1 -1
- package/build/assets/{highlighted-source-view-Bp0sgK-f.js → highlighted-source-view-DPerL6tF.js} +1 -1
- package/build/assets/home-4lyLzYjG.js +1 -0
- package/build/assets/{home-BghzJd-D.js → home-BGaB0EeK.js} +1 -1
- package/build/assets/{home-automation-run-tooltip-BdpCckKO.js → home-automation-run-tooltip-v5n7zXR0.js} +1 -1
- package/build/assets/{home-store-DNQpfIEO.js → home-store-roz1x6D5.js} +1 -1
- package/build/assets/{hooks-service-DkxnQa4N.js → hooks-service-tzRqtAlm.js} +1 -1
- package/build/assets/index-home-6Y_Y7kOo.js +1 -0
- package/build/assets/{install-server-modal-DvxxYKia.js → install-server-modal-DkMCfj0J.js} +1 -1
- package/build/assets/{key-CwTE6XJj.js → key-DpfBWQbk.js} +1 -1
- package/build/assets/{launch-jsRGPRBx.js → launch-TrnYlJe6.js} +1 -1
- package/build/assets/llm-not-configured-banner-BdjItKQR.js +27 -0
- package/build/assets/{llm-settings-dkQ5Oq7W.js → llm-settings-CUgt39uu.js} +1 -1
- package/build/assets/llm-settings-DEfw-fUJ.js +1 -0
- package/build/assets/{llm-subscription-service-BiQaZbvv.js → llm-subscription-service-LGYVzyAc.js} +1 -1
- package/build/assets/{loading-spinner-DK1sAwVg.js → loading-spinner-BJc2J0Dw.js} +1 -1
- package/build/assets/{manage-backends-modal-DqCJohsX.js → manage-backends-modal-CIjk0B2H.js} +1 -1
- package/build/assets/manifest-23d79467.js +1 -0
- package/build/assets/{manifest-subpage-layout-sxuPqfUr.js → manifest-subpage-layout-DGYRoP_8.js} +1 -1
- package/build/assets/{markdown-renderer-BH5pqDuJ.js → markdown-renderer-DRpwRlNm.js} +1 -1
- package/build/assets/{mcp-BtaJDXnP.js → mcp-CoUOIGBF.js} +1 -1
- package/build/assets/{mcp-installed-servers-Br4ZLsjr.js → mcp-installed-servers-BW51n6PC.js} +1 -1
- package/build/assets/{mcp-page-DwbnQpVs.js → mcp-page-hZ4aJjj_.js} +1 -1
- package/build/assets/{messages-DmFJlW6c.js → messages-WUb9Yh-p.js} +1 -1
- package/build/assets/{modal-body-DBweM2EN.js → modal-body-B_95ci1c.js} +1 -1
- package/build/assets/{modal-classes-jvG85nkU.js → modal-classes-BPcBCWVj.js} +1 -1
- package/build/assets/{modal-close-button-BrM5fNnn.js → modal-close-button-Cq3dma5u.js} +1 -1
- package/build/assets/{onboarding-CQ8T6T0U.js → onboarding-Cc4Av7bi.js} +1 -1
- package/build/assets/{onboarding-modal-CnliiaSN.js → onboarding-modal-DCFD4Dsa.js} +1 -1
- package/build/assets/{organization-service.api-DmFUEmu5.js → organization-service.api-zhHpQU0t.js} +1 -1
- package/build/assets/{planner-tab-CXph_C9F.js → planner-tab-yISBVUKu.js} +1 -1
- package/build/assets/{plugins-management-service-CcEpfNKz.js → plugins-management-service-2oP6_tWr.js} +1 -1
- package/build/assets/{profiles-service.api-DdF_4Zhe.js → profiles-service.api-B5thiTI3.js} +1 -1
- package/build/assets/{providers-BWRnl31s.js → providers-Co9PsD0s.js} +1 -1
- package/build/assets/{proxy-DbEf3Nqr.js → proxy-BCCQUna8.js} +1 -1
- package/build/assets/{recommended-automations-launcher-r0oI91HN.js → recommended-automations-launcher-D1Do753p.js} +1 -1
- package/build/assets/{root-j2fFRlWS.js → root-D1y82Lhg.js} +2 -2
- package/build/assets/{root-layout-CfGgm2lo.js → root-layout-cQTYEG2w.js} +2 -2
- package/build/assets/{schema-field-c3Ncgm4x.js → schema-field-DSi0d7a8.js} +1 -1
- package/build/assets/{sdk-section-page-DFEiuiFQ.js → sdk-section-page-DCoI2dtd.js} +1 -1
- package/build/assets/{secret-form-WXXNFqTM.js → secret-form-BDvzojzN.js} +1 -1
- package/build/assets/{secrets-service-DU6wh3wX.js → secrets-service-C3CNNEpY.js} +1 -1
- package/build/assets/{secrets-settings-BEqbPvjy.js → secrets-settings-BKqfYQt5.js} +1 -1
- package/build/assets/{settings-DjaSQwFh.js → settings-C8ZLONyx.js} +1 -1
- package/build/assets/{settings-dropdown-input-BRR2OZwi.js → settings-dropdown-input-Df_HXRk4.js} +1 -1
- package/build/assets/{settings-index-DHv4XFcM.js → settings-index-BWvlGHg3.js} +1 -1
- package/build/assets/{settings-input-Cm4VxUon.js → settings-input-B3i5U9GL.js} +1 -1
- package/build/assets/{settings-list-classes-CaUfKZ33.js → settings-list-classes-DbqcSiVW.js} +1 -1
- package/build/assets/{settings-modal-djXuAnBO.js → settings-modal-DHKJSBPL.js} +1 -1
- package/build/assets/{settings-nav-DFb3hBMr.js → settings-nav-BThjwLWD.js} +1 -1
- package/build/assets/{settings-service.api-Q9lKW1TX.js → settings-service.api-CYBTLGOd.js} +1 -1
- package/build/assets/{settings-switch-seaSJc7t.js → settings-switch-CI93Iozg.js} +1 -1
- package/build/assets/{shared-conversation-x3rxVCon.js → shared-conversation-C7OILS-U.js} +1 -1
- package/build/assets/{sidebar-layout-B6mcvvdV.js → sidebar-layout-Csb6Geq0.js} +1 -1
- package/build/assets/{sidebar-mobile-menu-toggle-CEqS8KnA.js → sidebar-mobile-menu-toggle-B2xwXm4s.js} +1 -1
- package/build/assets/{sidebar-nav-link-BTHX11LG.js → sidebar-nav-link-Xv7QEMVS.js} +1 -1
- package/build/assets/{sidebar-onboarding-checklist-storage-BP1kzn6p.js → sidebar-onboarding-checklist-storage-_zxMqHS0.js} +1 -1
- package/build/assets/{skill-card-pill-row-TD39nfP3.js → skill-card-pill-row-CxOFySng.js} +1 -1
- package/build/assets/{skill-enablement-DXeaImBz.js → skill-enablement-BBKya60C.js} +1 -1
- package/build/assets/{skill-filter-CdBbbwjm.js → skill-filter-BvtbD--b.js} +1 -1
- package/build/assets/{skill-icon-badge-vUEp7gsC.js → skill-icon-badge-CVxE42yg.js} +1 -1
- package/build/assets/{skill-scope-BTRBQt0-.js → skill-scope-C0NxJnpT.js} +1 -1
- package/build/assets/{skills-plugins-k1tUNAw4.js → skills-plugins-BGjX4jve.js} +1 -1
- package/build/assets/{skills-settings-CENviPT7.js → skills-settings-d3ZwIjSP.js} +1 -1
- package/build/assets/{styled-tooltip-DVAlWYnL.js → styled-tooltip-CknPQH4Y.js} +1 -1
- package/build/assets/{task-list-tab-BLKF_x9f.js → task-list-tab-CQisRcPh.js} +1 -1
- package/build/assets/{terminal-Ckbnqb23.js → terminal-Bs50gJPC.js} +1 -1
- package/build/assets/{toggle-switch-DeiG9Mf6.js → toggle-switch-D3TBxlsc.js} +1 -1
- package/build/assets/{trash-CXN2R54L.js → trash-D1QMHInX.js} +1 -1
- package/build/assets/{typography-NarNyelM.js → typography-BdAApXGl.js} +1 -1
- package/build/assets/{usage-tab-Drd3O006.js → usage-tab-ClVHAFJy.js} +1 -1
- package/build/assets/{use-acp-credential-form-CJ5wPsQm.js → use-acp-credential-form-GfqcTJl5.js} +1 -1
- package/build/assets/{use-activate-agent-profile-iQZ0U3qV.js → use-activate-agent-profile-DO6SNPkK.js} +1 -1
- package/build/assets/{use-agent-profiles-LCvb5OXT.js → use-agent-profiles-YsBlt3tT.js} +1 -1
- package/build/assets/{use-automation-health-DdgSa8sA.js → use-automation-health-CbQ9n-k7.js} +1 -1
- package/build/assets/{use-automation-permissions-D3kEeieu.js → use-automation-permissions-gFy-2VD0.js} +1 -1
- package/build/assets/{use-automations-CEubcYTD.js → use-automations-7_XBXHQK.js} +1 -1
- package/build/assets/{use-can-manage-org-profiles-CB8ybxFK.js → use-can-manage-org-profiles-Dt4YkPO7.js} +1 -1
- package/build/assets/{use-canvas-extensions-BMacwi2v.js → use-canvas-extensions-BhYQrtMK.js} +1 -1
- package/build/assets/{use-cloud-current-user-id-BEKRd6XZ.js → use-cloud-current-user-id-Dqw6qQUg.js} +1 -1
- package/build/assets/{use-config-3WYcJsgC.js → use-config-BJ_FJCjV.js} +1 -1
- package/build/assets/use-create-conversation-D15Px574.js +1 -0
- package/build/assets/use-create-secret-D_qPU88t.js +1 -0
- package/build/assets/{use-free-models-Ci3FkKEm.js → use-free-models-FAk2nngq.js} +1 -1
- package/build/assets/{use-get-secrets-fqS0kxt6.js → use-get-secrets-Pbo9jh2A.js} +1 -1
- package/build/assets/{use-llm-configured-B71ZEVg2.js → use-llm-configured-DF9BYmIe.js} +1 -1
- package/build/assets/{use-llm-profiles-xtCBMbef.js → use-llm-profiles-U4u1gzuk.js} +1 -1
- package/build/assets/use-manifest-capabilities-D81_YdAF.js +1 -0
- package/build/assets/{use-onboarding-completion-CEgjL02y.js → use-onboarding-completion-C4W-m2Jk.js} +1 -1
- package/build/assets/{use-pinned-home-route-pK4IlJ-p.js → use-pinned-home-route-DByWTojw.js} +1 -1
- package/build/assets/{use-plugins-marketplace-B8-ZEB34.js → use-plugins-marketplace-CTRoukH0.js} +1 -1
- package/build/assets/{use-save-agent-profile-D7hJuW_u.js → use-save-agent-profile-xpHBxMZM.js} +1 -1
- package/build/assets/{use-save-settings-CikTu5xV.js → use-save-settings-CmX41wlf.js} +1 -1
- package/build/assets/{use-settings-BWIH5EuN.js → use-settings-D69cw06D.js} +1 -1
- package/build/assets/{use-settings-nav-items-DSKwLDnd.js → use-settings-nav-items-CVz0SnDr.js} +1 -1
- package/build/assets/use-tracking-BAFpgpgq.js +3 -0
- package/build/assets/{use-user-conversation-C_l65DqW.js → use-user-conversation-BBDXUbOc.js} +1 -1
- package/build/assets/utils-CbjwNcR-.js +1 -0
- package/build/assets/{vendor~browser-hbU4u2Ag.js → vendor~browser-BZ-zIfb6.js} +1 -1
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-DvZtOcoT.js +2 -0
- package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-CxhwKuAd.js → vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-BIjRfQ4u.js} +1 -1
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~inibp4qe-BFRW8wt-.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~inibp4qe-BBfdJIV9.js} +1 -1
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-3eJ4ExtV.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-fgzdgvrL.js} +3579 -165
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-C7HiY4Ae.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-BqdU447s.js} +794 -227
- package/build/assets/{verification-settings-PKtoIUUY.js → verification-settings-BXspn27q.js} +1 -1
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +8 -1
- package/build/locales/ca/openhands.json +8 -1
- package/build/locales/de/openhands.json +8 -1
- package/build/locales/en/openhands.json +8 -1
- package/build/locales/es/openhands.json +8 -1
- package/build/locales/fr/openhands.json +8 -1
- package/build/locales/it/openhands.json +8 -1
- package/build/locales/ja/openhands.json +8 -1
- package/build/locales/ko-KR/openhands.json +8 -1
- package/build/locales/no/openhands.json +8 -1
- package/build/locales/pt/openhands.json +8 -1
- package/build/locales/tr/openhands.json +8 -1
- package/build/locales/uk/openhands.json +8 -1
- package/build/locales/zh-CN/openhands.json +8 -1
- package/build/locales/zh-TW/openhands.json +8 -1
- package/config/defaults.json +3 -3
- package/dist/api/agent-profiles-service/profile-field-support.d.ts +2 -0
- package/dist/components/features/automations/agent-profile-selector.d.ts +7 -0
- package/dist/config/defaults.cjs +1 -1
- package/dist/config/defaults.cjs.map +1 -1
- package/dist/config/defaults.js +3 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/constants/profile-scope.d.ts +2 -2
- 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 +30 -19
- package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
- 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.js +11 -12
- package/dist/hooks/mutation/use-switch-acp-model.js.map +1 -1
- 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 +1 -0
- package/dist/hooks/query/query-keys.js +10 -1
- package/dist/hooks/query/query-keys.js.map +1 -1
- package/dist/hooks/query/use-active-acp-profile-detail.cjs +1 -1
- package/dist/hooks/query/use-active-acp-profile-detail.cjs.map +1 -1
- package/dist/hooks/query/use-active-acp-profile-detail.d.ts +0 -9
- package/dist/hooks/query/use-active-acp-profile-detail.js +4 -13
- package/dist/hooks/query/use-active-acp-profile-detail.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 +8 -1
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/translation.cjs +2 -2
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +119 -0
- package/dist/i18n/translation.js.map +1 -1
- package/dist/locales/ar/openhands.json +8 -1
- package/dist/locales/ca/openhands.json +8 -1
- package/dist/locales/de/openhands.json +8 -1
- package/dist/locales/en/openhands.json +8 -1
- package/dist/locales/es/openhands.json +8 -1
- package/dist/locales/fr/openhands.json +8 -1
- package/dist/locales/it/openhands.json +8 -1
- package/dist/locales/ja/openhands.json +8 -1
- package/dist/locales/ko-KR/openhands.json +8 -1
- package/dist/locales/no/openhands.json +8 -1
- package/dist/locales/pt/openhands.json +8 -1
- package/dist/locales/tr/openhands.json +8 -1
- package/dist/locales/uk/openhands.json +8 -1
- package/dist/locales/zh-CN/openhands.json +8 -1
- package/dist/locales/zh-TW/openhands.json +8 -1
- package/dist/manifests/automation-setup.cjs.map +1 -1
- package/dist/manifests/automation-setup.js.map +1 -1
- package/dist/manifests/manifest-local-validation.cjs.map +1 -1
- package/dist/manifests/manifest-local-validation.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs +3670 -247
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.js +26 -3
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js +4 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-delivery-watchdog/manifest.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-delivery-watchdog/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-delivery-watchdog/manifest.js +79 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-delivery-watchdog/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs +1 -11
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js +25 -11
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-triage/manifest.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-triage/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-triage/manifest.js +72 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-triage/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +1 -10
- 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 +24 -11
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/gitlab-issue-to-mr/manifest.cjs +12 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/gitlab-issue-to-mr/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/gitlab-issue-to-mr/manifest.js +115 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/gitlab-issue-to-mr/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 +20 -14
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/reportportal.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/reportportal.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/reportportal.js +73 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/reportportal.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 +9 -7
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.cjs +794 -227
- package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.js +46 -6
- package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js +9 -10
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.js +2 -2
- package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/clients.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/clients.js +0 -1
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation-manager.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation-manager.js +0 -1
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +3 -3
- package/dist/package.js.map +1 -1
- package/dist/routes/agent-settings.d.ts +6 -0
- package/dist/types/automation.cjs.map +1 -1
- package/dist/types/automation.d.ts +3 -1
- package/dist/types/automation.js.map +1 -1
- package/package.json +3 -3
- package/scripts/check-sdk-version-sync.mjs +6 -6
- package/scripts/dev-safe.mjs +14 -1
- package/scripts/docker-build.mjs +3 -0
- package/build/assets/active-backend-context-BsLfwrXB.js +0 -2
- package/build/assets/agent-settings-BZJHtaIK.js +0 -2
- package/build/assets/agent-settings-D4snDd6u.js +0 -1
- package/build/assets/automation-setup-route-Cdc109ZD.js +0 -3
- package/build/assets/conversation-SouWlGvs.js +0 -1
- package/build/assets/conversation-panel-SouWlGvs.js +0 -1
- package/build/assets/edit-automation-modal-BJJR9wSW.js +0 -1
- package/build/assets/git-repo-dropdown-CbD0_LPN.js +0 -1
- package/build/assets/home-CXZ8zawS.js +0 -1
- package/build/assets/index-home-Ca6Q5CtT.js +0 -1
- package/build/assets/llm-not-configured-banner-DMdL1vaX.js +0 -27
- package/build/assets/llm-settings-lNDerSlu.js +0 -1
- package/build/assets/manifest-ff93dc8c.js +0 -1
- package/build/assets/use-create-conversation-Be-eVpFp.js +0 -1
- package/build/assets/use-create-secret-Bk9ZxTjl.js +0 -1
- package/build/assets/use-manifest-capabilities-Bso6A_-A.js +0 -1
- package/build/assets/use-tracking-ChnSFChv.js +0 -3
- package/build/assets/utils-D-gOfhmN.js +0 -1
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-D6owle9R.js +0 -2
- package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs +0 -2
- package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs.map +0 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js +0 -18
- package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-local-validation.js","names":[],"sources":["../../src/manifests/manifest-local-validation.ts"],"sourcesContent":["/**\n * The form model, and the host's own check of what the user typed into it.\n *\n * Local validation is a convenience, not the authority: it is instant and needs\n * no round trip, so it catches empty required fields and obvious typos.\n * Deployment-specific questions (\"is a one-minute schedule allowed here?\")\n * belong to preflight, which is authoritative.\n *\n * Errors are returned as codes rather than sentences so the host can render\n * them through its own translations; only manifest-authored copy is literal.\n */\n\nimport type {\n DeploymentCapabilities,\n SetupActionKind,\n SetupBlock,\n SetupFieldOption,\n SetupFormField,\n SetupFormFields,\n SetupFormValue,\n SetupFormValues,\n} from \"./types\";\n\n/** Characters that would break out of an expression string literal. */\nconst UNSAFE_EXPRESSION_LITERAL_PATTERN = /[\"'\\\\]/;\n\nexport type SetupFieldError =\n | { code: \"required\" }\n | { code: \"minLength\"; length: number }\n | { code: \"maxLength\"; length: number }\n | { code: \"min\"; value: number }\n | { code: \"max\"; value: number }\n | { code: \"invalidOption\" }\n | { code: \"unsafeExpressionLiteral\" };\n\nexport type SetupFieldErrors = Record<string, SetupFieldError>;\n\n/** Field constraints supplied by the deployment rather than by the manifest. */\nexport interface SetupFieldOverride {\n options?: SetupFieldOption[];\n}\n\nexport function triggerKinds(setup: SetupBlock): string[] {\n return Object.keys(setup.form.triggers ?? {});\n}\n\nexport function initialTriggerKind(setup: SetupBlock): string | null {\n return triggerKinds(setup)[0] ?? null;\n}\n\nexport function actionKinds(setup: SetupBlock): SetupActionKind[] {\n return Object.keys(setup.actions ?? {}) as SetupActionKind[];\n}\n\nexport function initialActionKind(setup: SetupBlock): SetupActionKind | null {\n return actionKinds(setup)[0] ?? null;\n}\n\nexport type SetupFieldOverrides = Record<string, SetupFieldOverride>;\n\n/**\n * Every input the form declares, keyed by name, whichever half it is in.\n *\n * Trigger inputs come first so the user is asked when it runs before what it\n * runs on, and so every derived view of the form keeps that order. Admission\n * rejects a name declared in both halves, so the merge cannot lose a field.\n */\nexport function collectFields(\n setup: SetupBlock,\n selectedTrigger?: string | null,\n selectedAction?: string | null,\n): SetupFormFields {\n const triggers = setup.form.triggers ?? {};\n const triggerEntries = Object.entries(triggers);\n const activeTrigger =\n selectedTrigger && selectedTrigger in triggers\n ? triggers[selectedTrigger as keyof typeof triggers]\n : triggerEntries.length === 1\n ? triggerEntries[0][1]\n : {};\n const actions = setup.actions ?? {};\n const actionEntries = Object.entries(actions);\n const activeAction =\n selectedAction && selectedAction in actions\n ? actions[selectedAction as SetupActionKind]?.args\n : actionEntries.length === 1\n ? actionEntries[0][1]?.args\n : {};\n return Object.assign(\n {},\n activeTrigger,\n setup.form.args,\n activeAction,\n ) as SetupFormFields;\n}\n\n/**\n * Feed deployment values into form field constraints, so the form offers only\n * what the deployment accepts.\n *\n * A `timezone` field is the case that needs it: a manifest declares no options\n * for one, because the accepted zones belong to the deployment. The cron\n * interval floor is deliberately left to preflight — the deployment owns that\n * limit and states it in its own words, and a local approximation would\n * pre-empt the authoritative message with a worse one.\n */\nexport function resolveFieldOverrides(\n setup: SetupBlock,\n capabilities: DeploymentCapabilities | null,\n selectedTrigger?: string | null,\n selectedAction?: string | null,\n): SetupFieldOverrides {\n const overrides: SetupFieldOverrides = {};\n const fields = collectFields(setup, selectedTrigger, selectedAction);\n const timezones = capabilities?.triggers?.cron?.timezones;\n if (timezones?.length) {\n const options = timezones.map((zone) => ({ value: zone, label: zone }));\n Object.entries(fields)\n .filter(([, field]) => field.type === \"timezone\")\n .forEach(([name]) => {\n overrides[name] = { options };\n });\n }\n\n if (capabilities?.eventSources?.length) {\n const options = capabilities.eventSources.map((source) => ({\n value: source,\n label: source,\n }));\n Object.entries(fields)\n .filter(([, field]) => field.type === \"event-source\")\n .forEach(([name]) => {\n overrides[name] = { options };\n });\n }\n\n if (capabilities?.eventTypes?.length) {\n const options = capabilities.eventTypes.map((type) => ({\n value: type,\n label: type,\n }));\n Object.entries(fields)\n .filter(([, field]) => field.type === \"event-type\")\n .forEach(([name]) => {\n overrides[name] = { options };\n });\n }\n\n return overrides;\n}\n\n/** The options a field offers, after deployment constraints are applied. */\nexport function getFieldOptions(\n name: string,\n field: SetupFormField,\n overrides: SetupFieldOverrides = {},\n): SetupFieldOption[] {\n return overrides[name]?.options ?? field.options ?? [];\n}\n\n/**\n * Every value a field holds, whether it collects one or many.\n *\n * Reading both shapes as a list is what keeps validation, interpolation and\n * the payload mapping from branching on `multiple` at every use.\n */\nfunction isFileValue(value: SetupFormValue | undefined): value is File {\n return typeof File !== \"undefined\" && value instanceof File;\n}\n\nexport function fieldValues(value: SetupFormValue | undefined): string[] {\n if (Array.isArray(value)) return value.filter((item) => item.trim() !== \"\");\n if (isFileValue(value)) return value.name ? [value.name] : [];\n if (typeof value === \"string\" && value.trim() === \"\") return [];\n if (value === undefined || value === null) return [];\n return [String(value)];\n}\n\n/** The single value a field holds, or \"\" for a field collecting several. */\nexport function fieldText(value: SetupFormValue | undefined): string {\n if (Array.isArray(value) || value === undefined || value === null) return \"\";\n if (isFileValue(value)) return value.name;\n return String(value);\n}\n\n/** Initial form state: every declared field, seeded with its declared default. */\nexport function getInitialFormValues(\n setup: SetupBlock,\n selectedTrigger?: string | null,\n selectedAction?: string | null,\n): SetupFormValues {\n return Object.fromEntries(\n Object.entries(collectFields(setup, selectedTrigger, selectedAction)).map(\n ([name, field]) => [\n name,\n // A field collecting several values starts empty rather than holding one\n // blank entry, so \"required\" means \"add one\" rather than \"fill this in\".\n field.multiple ? [] : (field.default ?? \"\"),\n ],\n ),\n );\n}\n\nfunction validateField(\n name: string,\n field: SetupFormField,\n rawValue: SetupFormValue | undefined,\n overrides: SetupFieldOverrides,\n): SetupFieldError | null {\n const entered = fieldValues(rawValue);\n\n if (entered.length === 0) {\n return field.required ? { code: \"required\" } : null;\n }\n\n // Every entry of a multi-value field answers the same field, so each is held\n // to the same rules and the first failure is the one reported.\n const failures = entered\n .map((item) => validateValue(name, field, item.trim(), overrides))\n .filter((error): error is SetupFieldError => error !== null);\n return failures[0] ?? null;\n}\n\nfunction validateValue(\n name: string,\n field: SetupFormField,\n value: string,\n overrides: SetupFieldOverrides,\n): SetupFieldError | null {\n const { minLength, maxLength, min, max, format } = field.constraints ?? {};\n if (minLength !== undefined && value.length < minLength) {\n return { code: \"minLength\", length: minLength };\n }\n if (maxLength !== undefined && value.length > maxLength) {\n return { code: \"maxLength\", length: maxLength };\n }\n if (field.type === \"number\") {\n const numeric = Number(value);\n if (Number.isNaN(numeric)) return { code: \"invalidOption\" };\n if (min !== undefined && numeric < min) return { code: \"min\", value: min };\n if (max !== undefined && numeric > max) return { code: \"max\", value: max };\n }\n if (\n format === \"safeExpressionLiteral\" &&\n UNSAFE_EXPRESSION_LITERAL_PATTERN.test(value)\n ) {\n return { code: \"unsafeExpressionLiteral\" };\n }\n\n // Any field offering a closed set of values, whether the manifest declared it\n // or the deployment supplied it, must be answered from that set.\n const options = getFieldOptions(name, field, overrides);\n if (options.length > 0 && !options.some((option) => option.value === value)) {\n return { code: \"invalidOption\" };\n }\n\n return null;\n}\n\n/** Check every declared field. Returns only the fields that failed. */\nexport function validateFormValues(\n setup: SetupBlock,\n values: SetupFormValues,\n overrides: SetupFieldOverrides = {},\n selectedTrigger?: string | null,\n selectedAction?: string | null,\n): SetupFieldErrors {\n return Object.entries(\n collectFields(setup, selectedTrigger, selectedAction),\n ).reduce<SetupFieldErrors>((errors, [name, field]) => {\n const error = validateField(name, field, values[name], overrides);\n return error ? { ...errors, [name]: error } : errors;\n }, {});\n}\n"],"mappings":";AAkDA,SAAgB,EAAY,GAAsC;CAChE,OAAO,OAAO,KAAK,EAAM,WAAW,CAAC,CAAC;AACxC"}
|
|
1
|
+
{"version":3,"file":"manifest-local-validation.js","names":[],"sources":["../../src/manifests/manifest-local-validation.ts"],"sourcesContent":["/**\n * The form model, and the host's own check of what the user typed into it.\n *\n * Local validation is a convenience, not the authority: it is instant and needs\n * no round trip, so it catches empty required fields and obvious typos.\n * Deployment-specific questions (\"is a one-minute schedule allowed here?\")\n * belong to preflight, which is authoritative.\n *\n * Errors are returned as codes rather than sentences so the host can render\n * them through its own translations; only manifest-authored copy is literal.\n */\n\nimport type {\n DeploymentCapabilities,\n SetupActionKind,\n SetupBlock,\n SetupFieldOption,\n SetupFormField,\n SetupFormFields,\n SetupFormValue,\n SetupFormValues,\n} from \"./types\";\n\n/** Characters that would break out of an expression string literal. */\nconst UNSAFE_EXPRESSION_LITERAL_PATTERN = /[\"'\\\\]/;\n\nexport type SetupFieldError =\n | { code: \"required\" }\n | { code: \"minLength\"; length: number }\n | { code: \"maxLength\"; length: number }\n | { code: \"min\"; value: number }\n | { code: \"max\"; value: number }\n | { code: \"invalidOption\" }\n | { code: \"unsafeExpressionLiteral\" };\n\nexport type SetupFieldErrors = Record<string, SetupFieldError>;\n\n/** Field constraints supplied by the deployment rather than by the manifest. */\nexport interface SetupFieldOverride {\n options?: SetupFieldOption[];\n}\n\nexport function triggerKinds(setup: SetupBlock): string[] {\n return Object.keys(setup.form.triggers ?? {});\n}\n\nexport function initialTriggerKind(setup: SetupBlock): string | null {\n return triggerKinds(setup)[0] ?? null;\n}\n\nexport function actionKinds(setup: SetupBlock): SetupActionKind[] {\n return Object.keys(setup.actions ?? {}) as SetupActionKind[];\n}\n\nexport function initialActionKind(setup: SetupBlock): SetupActionKind | null {\n return actionKinds(setup)[0] ?? null;\n}\n\nexport type SetupFieldOverrides = Record<string, SetupFieldOverride>;\n\n/**\n * Every input the form declares, keyed by name, whichever half it is in.\n *\n * Trigger inputs come first so the user is asked when it runs before what it\n * runs on, and so every derived view of the form keeps that order. Admission\n * rejects a name declared in both halves, so the merge cannot lose a field.\n */\nexport function collectFields(\n setup: SetupBlock,\n selectedTrigger?: string | null,\n selectedAction?: string | null,\n): SetupFormFields {\n const triggers = setup.form.triggers ?? {};\n const triggerEntries = Object.entries(triggers);\n const activeTrigger =\n selectedTrigger && selectedTrigger in triggers\n ? triggers[selectedTrigger as keyof typeof triggers]\n : triggerEntries.length === 1\n ? triggerEntries[0][1]\n : {};\n const actions = setup.actions ?? {};\n const actionEntries = Object.entries(actions);\n const activeAction =\n selectedAction && selectedAction in actions\n ? actions[selectedAction as SetupActionKind]?.args\n : actionEntries.length === 1\n ? actionEntries[0][1]?.args\n : {};\n return Object.assign(\n {},\n activeTrigger,\n setup.form.args,\n activeAction,\n ) as SetupFormFields;\n}\n\n/**\n * Feed deployment values into form field constraints, so the form offers only\n * what the deployment accepts.\n *\n * A `timezone` field is the case that needs it: a manifest declares no options\n * for one, because the accepted zones belong to the deployment. The cron\n * interval floor is deliberately left to preflight — the deployment owns that\n * limit and states it in its own words, and a local approximation would\n * pre-empt the authoritative message with a worse one.\n */\nexport function resolveFieldOverrides(\n setup: SetupBlock,\n capabilities: DeploymentCapabilities | null,\n selectedTrigger?: string | null,\n selectedAction?: string | null,\n): SetupFieldOverrides {\n const overrides: SetupFieldOverrides = {};\n const fields = collectFields(setup, selectedTrigger, selectedAction);\n const timezones = capabilities?.triggers?.cron?.timezones;\n if (timezones?.length) {\n const options = timezones.map((zone) => ({ value: zone, label: zone }));\n Object.entries(fields)\n .filter(([, field]) => field.type === \"timezone\")\n .forEach(([name]) => {\n overrides[name] = { options };\n });\n }\n\n if (capabilities?.eventSources?.length) {\n const options = capabilities.eventSources.map((source) => ({\n value: source,\n label: source,\n }));\n Object.entries(fields)\n .filter(([, field]) => field.type === \"event-source\")\n .forEach(([name]) => {\n overrides[name] = { options };\n });\n }\n\n if (capabilities?.eventTypes?.length) {\n const options = capabilities.eventTypes.map((type) => ({\n value: type,\n label: type,\n }));\n Object.entries(fields)\n .filter(([, field]) => field.type === \"event-type\")\n .forEach(([name]) => {\n overrides[name] = { options };\n });\n }\n\n return overrides;\n}\n\n/** The options a field offers, after deployment constraints are applied. */\nexport function getFieldOptions(\n name: string,\n field: SetupFormField,\n overrides: SetupFieldOverrides = {},\n): SetupFieldOption[] {\n return overrides[name]?.options ?? field.options ?? [];\n}\n\n/**\n * Every value a field holds, whether it collects one or many.\n *\n * Reading both shapes as a list is what keeps validation, interpolation and\n * the payload mapping from branching on `multiple` at every use.\n */\nfunction isFileValue(value: SetupFormValue | undefined): value is File {\n return typeof File !== \"undefined\" && value instanceof File;\n}\n\nexport function fieldValues(value: SetupFormValue | undefined): string[] {\n if (Array.isArray(value)) return value.filter((item) => item.trim() !== \"\");\n if (isFileValue(value)) return value.name ? [value.name] : [];\n if (typeof value === \"string\" && value.trim() === \"\") return [];\n if (value === undefined || value === null) return [];\n return [String(value)];\n}\n\n/** The single value a field holds, or \"\" for a field collecting several. */\nexport function fieldText(value: SetupFormValue | undefined): string {\n if (Array.isArray(value) || value === undefined || value === null) return \"\";\n if (isFileValue(value)) return value.name;\n return String(value);\n}\n\n/** Initial form state: every declared field, seeded with its declared default. */\nexport function getInitialFormValues(\n setup: SetupBlock,\n selectedTrigger?: string | null,\n selectedAction?: string | null,\n): SetupFormValues {\n return Object.fromEntries(\n Object.entries(collectFields(setup, selectedTrigger, selectedAction)).map(\n ([name, field]) => [\n name,\n // A field collecting several values starts empty rather than holding one\n // blank entry, so \"required\" means \"add one\" rather than \"fill this in\".\n field.multiple ? [] : (field.default ?? \"\"),\n ],\n ),\n );\n}\n\nfunction validateField(\n name: string,\n field: SetupFormField,\n rawValue: SetupFormValue | undefined,\n overrides: SetupFieldOverrides,\n): SetupFieldError | null {\n const entered = fieldValues(rawValue);\n\n if (entered.length === 0) {\n return field.required ? { code: \"required\" } : null;\n }\n\n // Every entry of a multi-value field answers the same field, so each is held\n // to the same rules and the first failure is the one reported.\n const failures = entered\n .map((item) => validateValue(name, field, item.trim(), overrides))\n .filter((error): error is SetupFieldError => error !== null);\n return failures[0] ?? null;\n}\n\nfunction validateValue(\n name: string,\n field: SetupFormField,\n value: string,\n overrides: SetupFieldOverrides,\n): SetupFieldError | null {\n const { minLength, maxLength, min, max, format } = field.constraints ?? {};\n if (minLength !== undefined && value.length < minLength) {\n return { code: \"minLength\", length: minLength };\n }\n if (maxLength !== undefined && value.length > maxLength) {\n return { code: \"maxLength\", length: maxLength };\n }\n if (field.type === \"number\") {\n const numeric = Number(value);\n if (Number.isNaN(numeric)) return { code: \"invalidOption\" };\n if (min !== undefined && numeric < min) return { code: \"min\", value: min };\n if (max !== undefined && numeric > max) return { code: \"max\", value: max };\n }\n if (\n format === \"safeExpressionLiteral\" &&\n UNSAFE_EXPRESSION_LITERAL_PATTERN.test(value)\n ) {\n return { code: \"unsafeExpressionLiteral\" };\n }\n\n // Any field offering a closed set of values, whether the manifest declared it\n // or the deployment supplied it, must be answered from that set.\n const options = getFieldOptions(name, field, overrides);\n if (options.length > 0 && !options.some((option) => option.value === value)) {\n return { code: \"invalidOption\" };\n }\n\n return null;\n}\n\n/** Check every declared field. Returns only the fields that failed. */\nexport function validateFormValues(\n setup: SetupBlock,\n values: SetupFormValues,\n overrides: SetupFieldOverrides = {},\n selectedTrigger?: string | null,\n selectedAction?: string | null,\n): SetupFieldErrors {\n return Object.entries(\n collectFields(setup, selectedTrigger, selectedAction),\n ).reduce<SetupFieldErrors>((errors, [name, field]) => {\n if (values.agent_profile_id && field.type === \"llm-profile\") return errors;\n const error = validateField(name, field, values[name], overrides);\n return error ? { ...errors, [name]: error } : errors;\n }, {});\n}\n"],"mappings":";AAkDA,SAAgB,EAAY,GAAsC;CAChE,OAAO,OAAO,KAAK,EAAM,WAAW,CAAC,CAAC;AACxC"}
|