@openhands/agent-canvas 1.15.0 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -1
- package/README.windows.md +2 -2
- package/build/assets/{acp-providers-BKvmTf82.js → acp-providers-DrjNsPOH.js} +1 -1
- package/build/assets/active-backend-context-rZiLJRUc.js +2 -0
- package/build/assets/{agent-context-settings-D3PjSTU1.js → agent-context-settings-CJUrcBut.js} +1 -1
- package/build/assets/agent-profiles-service.api-Biieml2L.js +1 -0
- package/build/assets/agent-profiles-settings-x6RvPsq7.js +1 -0
- package/build/assets/agent-server-client-options-BikiNwTa.js +1 -0
- package/build/assets/agent-server-conversation-service.api-DYFsNHKf.js +88 -0
- package/build/assets/agent-settings-BJyovpJ_.js +1 -0
- package/build/assets/agent-settings-CpY3zObk.js +2 -0
- package/build/assets/alert-banner-vARz1idS.js +1 -0
- package/build/assets/{api-error-message-BJyfWp6p.js → api-error-message-Ve79qDcN.js} +1 -1
- package/build/assets/api-key-entry-screen-CsMuBhoP.js +1 -0
- package/build/assets/{app-settings-CbHqzQus.js → app-settings-BaJ7nfHt.js} +1 -1
- package/build/assets/automation-detail-CVoGDrKq.js +3 -0
- package/build/assets/{automation-export-BRopEHMu.js → automation-export-DxY47m3T.js} +1 -1
- package/build/assets/automation-git-sync-CRMP9Bbm.js +1 -0
- package/build/assets/automation-setup-route-072beLz1.js +3 -0
- package/build/assets/{automation-templates-C_0FZgLG.js → automation-templates-4C4PM8K7.js} +1 -1
- package/build/assets/automations-list-xuqTSQL4.js +1 -0
- package/build/assets/{back-nav-button-Dm9tIjVf.js → back-nav-button-B8tH0BEp.js} +1 -1
- package/build/assets/backend-form-modal-0aJmWdsa.js +1 -0
- package/build/assets/{backend-synced-settings-badge-3fOwg6Bd.js → backend-synced-settings-badge-B7rKWBir.js} +1 -1
- package/build/assets/{badge-D4SqUCsR.js → badge-CcGx2TaV.js} +1 -1
- package/build/assets/{base-modal-C7_BDl_U.js → base-modal-DTULovNc.js} +1 -1
- package/build/assets/bot-CLMxGFaq.js +1 -0
- package/build/assets/{brand-button-Dxv6PDeN.js → brand-button-DxPO4Lf8.js} +1 -1
- package/build/assets/browser-C-_qBasq.js +46 -0
- package/build/assets/{browser-tab-BAl4ckJE.js → browser-tab-DZanIw5m.js} +1 -1
- package/build/assets/canvas-extension-page-o_cWgE9B.js +1 -0
- package/build/assets/canvas-extensions-DSgNlCha.js +1 -0
- package/build/assets/canvas-extensions-runtime-DdnkgJXV.js +1 -0
- package/build/assets/{chat-send-button-DWwR2cgI.js → chat-send-button-B3SFSIg5.js} +1 -1
- package/build/assets/check-fDEfgSzj.js +1 -0
- package/build/assets/chevron-down-CFrWHqu8.js +1 -0
- package/build/assets/chevron-right-C5roOrJu.js +1 -0
- package/build/assets/circle-check-ClTzJTdb.js +1 -0
- package/build/assets/{circle-plus-check-toggle-CBh_qomE.js → circle-plus-check-toggle-Fr-h-mbL.js} +1 -1
- package/build/assets/{cloud-funnel-analytics-287iIERo.js → cloud-funnel-analytics-BQanUEEC.js} +1 -1
- package/build/assets/{cog-C4rrw-ZK.js → cog-VBlRo6iw.js} +1 -1
- package/build/assets/command-menu-BT3Ia5Ru.js +1 -0
- package/build/assets/commits-tab-2jhtaohl.js +1 -0
- package/build/assets/{condenser-settings-BcNmYR4s.js → condenser-settings-eVKFMvap.js} +1 -1
- package/build/assets/confirmation-modal-gIFHeZt6.js +1 -0
- package/build/assets/{context-menu-list-item-lVYETtY5.js → context-menu-list-item-DDROe12Z.js} +1 -1
- package/build/assets/conversation-BnjJSFf5.js +93 -0
- package/build/assets/conversation-DZ578rOX.js +1 -0
- package/build/assets/conversation-panel-DZ578rOX.js +1 -0
- package/build/assets/conversation-state-store-D1_G_9I-.js +1 -0
- package/build/assets/{conversation-store-Ca3ghXap.js → conversation-store-DVVfkCsk.js} +1 -1
- package/build/assets/{conversation-tab-empty-state-HJtkmHZj.js → conversation-tab-empty-state-DKlzAz5c.js} +1 -1
- package/build/assets/{copy-to-clipboard-button-Cjkswvnj.js → copy-to-clipboard-button-B3w0X7WH.js} +1 -1
- package/build/assets/{device-verify-EZhHhBT7.js → device-verify-BfkCzyFB.js} +1 -1
- package/build/assets/{dropdown-classes-DJe-E6MC.js → dropdown-classes-B9kJVDIk.js} +1 -1
- package/build/assets/edit-automation-modal-BwhJ39JT.js +1 -0
- package/build/assets/empty-state-RZz0OfnY.js +1 -0
- package/build/assets/{entry.client-C7Bi2tkU.js → entry.client-Ds8LVp-E.js} +2 -2
- package/build/assets/enum-filter-dropdown-C4pW0ORd.js +1 -0
- package/build/assets/{environment-switch-overlay-CEKrFiMw.js → environment-switch-overlay-P2ZAuzov.js} +1 -1
- package/build/assets/{error-state-BALXiBNy.js → error-state-B_5cgNPJ.js} +1 -1
- package/build/assets/extensions-hub-DsaUr4ca.js +1 -0
- package/build/assets/extensions-navigation-CRMZd-FE.js +1 -0
- package/build/assets/external-link-DQtv7eTh.js +1 -0
- package/build/assets/files-tab-CCgAcVdc.js +1 -0
- package/build/assets/{form-control-classes-CGw40z5h.js → form-control-classes-B-z85REi.js} +1 -1
- package/build/assets/format-model-name-CasAP3nd.js +1 -0
- package/build/assets/get-git-path-EHrSDxTM.js +1 -0
- package/build/assets/git-repo-dropdown-D2WEQ97X.js +1 -0
- package/build/assets/{git-repo-dropdown-ai8qaNkD.js → git-repo-dropdown-DVeCUUXG.js} +1 -1
- package/build/assets/{highlighted-source-view-C3sxykQi.js → highlighted-source-view-DjHO3SdW.js} +1 -1
- package/build/assets/home-BorS_vdS.js +1 -0
- package/build/assets/home-aIMbHw5M.js +1 -0
- package/build/assets/home-automation-run-tooltip-CpHNFiFl.js +1 -0
- package/build/assets/home-store-DyXz0w6d.js +1 -0
- package/build/assets/hooks-service-C6dpRtZM.js +1 -0
- package/build/assets/index-home-zKFuKK2B.js +1 -0
- package/build/assets/info-CTIdjttz.js +1 -0
- package/build/assets/install-server-modal-DUiZMc8u.js +1 -0
- package/build/assets/kebab-menu-item-content-mm04SBD3.js +1 -0
- package/build/assets/{key-Cn5za3rg.js → key-CfXbJa8w.js} +1 -1
- package/build/assets/{launch-C1ieiOGe.js → launch-BSIf9KEg.js} +1 -1
- package/build/assets/list-filter-CNpqTWVY.js +1 -0
- package/build/assets/{list-todo-Cuu-STFc.js → list-todo-ByXMdY4W.js} +1 -1
- package/build/assets/llm-not-configured-banner-z_QRSeV0.js +27 -0
- package/build/assets/llm-settings-B-5AHMiX.js +1 -0
- package/build/assets/llm-settings-B3SjHDmA.js +1 -0
- package/build/assets/llm-subscription-service-aDNBQ7Gq.js +1 -0
- package/build/assets/loader-circle-Dex47vVW.js +1 -0
- package/build/assets/{loading-spinner-0L3ZTToZ.js → loading-spinner-DfHI77BA.js} +1 -1
- package/build/assets/manage-backends-modal-q1NdFisr.js +1 -0
- package/build/assets/manifest-8920b615.js +1 -0
- package/build/assets/{manifest-subpage-layout-BGhiUQbA.js → manifest-subpage-layout-BQQy5ipR.js} +1 -1
- package/build/assets/{map-provider-B9LTm23I.js → map-provider-DXvssjw9.js} +1 -1
- package/build/assets/markdown-renderer-rivLvYh-.js +8 -0
- package/build/assets/{mcp-CKbR4Vft.js → mcp-CEXDhQWn.js} +1 -1
- package/build/assets/{mcp-marketplace-utils-C13fFccR.js → mcp-marketplace-utils-Cn_NIMWM.js} +1 -1
- package/build/assets/mcp-page-LGYIICMG.js +9 -0
- package/build/assets/messages-DUSeANAh.js +41 -0
- package/build/assets/{modal-body-CMOc2tLl.js → modal-body-DJw4xBki.js} +1 -1
- package/build/assets/{modal-classes-BAb4Y_BG.js → modal-classes-Dg0ngBPO.js} +1 -1
- package/build/assets/{modal-close-button-CkJ0Ktjj.js → modal-close-button-B9j4nasm.js} +1 -1
- package/build/assets/{mouse-pointer-click-CsgRs_-r.js → mouse-pointer-click-DEhsSUpu.js} +1 -1
- package/build/assets/onboarding-BjFebfs5.js +1 -0
- package/build/assets/onboarding-modal-DDTjOpyd.js +1 -0
- package/build/assets/organization-service.api-Cyg1Tn03.js +1 -0
- package/build/assets/pencil-D5c47kyN.js +1 -0
- package/build/assets/pin-C7vMagvf.js +1 -0
- package/build/assets/planner-tab-D8f2Y3rn.js +1 -0
- package/build/assets/plug-CeaqeF6u.js +1 -0
- package/build/assets/plugins-management-service-Bh_pBuf-.js +1 -0
- package/build/assets/plus-B3wvU06-.js +1 -0
- package/build/assets/profiles-service.api-BbOK0EkF.js +1 -0
- package/build/assets/providers-2gIIkz2N.js +1 -0
- package/build/assets/proxy-CBgMd2zf.js +1 -0
- package/build/assets/{puzzle-A9pGxxai.js → puzzle-DdAqbUrb.js} +1 -1
- package/build/assets/recommended-automations-launcher-YLAQTp4s.js +1 -0
- package/build/assets/refresh-cw-DEQdPCpH.js +1 -0
- package/build/assets/root-Bye_XmEL.js +2 -0
- package/build/assets/root-Cnwwzgo0.css +1 -0
- package/build/assets/root-layout-CSAwxBGM.js +2 -0
- package/build/assets/schema-field-CK0xYNbO.js +1 -0
- package/build/assets/scroll-fade-state-Dt_fx2kf.js +1 -0
- package/build/assets/sdk-section-page-Da73Rs_o.js +1 -0
- package/build/assets/secret-form-CB2VwYYg.js +1 -0
- package/build/assets/secrets-service-Cr8g8xuv.js +1 -0
- package/build/assets/{secrets-settings-BizaTEr1.js → secrets-settings-Bh0udeKv.js} +1 -1
- package/build/assets/settings-CKqk8ZnH.js +1 -0
- package/build/assets/settings-DmyIgRxO.js +1 -0
- package/build/assets/{settings-dropdown-input-tM0A0ipy.js → settings-dropdown-input-DVpyD87C.js} +1 -1
- package/build/assets/settings-index-BSJUFmjE.js +1 -0
- package/build/assets/{settings-input-C03KUoSC.js → settings-input-C0dd8Utu.js} +1 -1
- package/build/assets/{settings-list-classes-BJ0g8rWj.js → settings-list-classes-Ds4jPBHK.js} +1 -1
- package/build/assets/{settings-modal-AzEF1QPP.js → settings-modal-yStgEh2o.js} +1 -1
- package/build/assets/settings-service.api-9_xdv_mh.js +1 -0
- package/build/assets/{settings-switch-CQE0EGC-.js → settings-switch-B78Khmyz.js} +1 -1
- package/build/assets/{settings-utils-ClYOkbbI.js → settings-utils-8GIIgOQL.js} +1 -1
- package/build/assets/shared-conversation-DM96X4KV.js +1 -0
- package/build/assets/shield-check-DO7wa_eu.js +1 -0
- package/build/assets/{sidebar-layout-D3hE08wK.js → sidebar-layout-EPfWxk11.js} +1 -1
- package/build/assets/sidebar-mobile-menu-toggle-D5GR5xT9.js +1 -0
- package/build/assets/sidebar-nav-link-_t4_Ef-9.js +1 -0
- package/build/assets/{sidebar-onboarding-checklist-storage-3qYflszY.js → sidebar-onboarding-checklist-storage-DbDX-Wvj.js} +1 -1
- package/build/assets/sidebar-store-CSDFK0W5.js +1 -0
- package/build/assets/{skill-card-pill-row-CFxjoqxn.js → skill-card-pill-row-989y15jV.js} +1 -1
- package/build/assets/skill-enablement-DXeaImBz.js +1 -0
- package/build/assets/skill-filter-BBeZ4JEP.js +2 -0
- package/build/assets/{skill-icon-badge-CPQJ6A-I.js → skill-icon-badge-BDhQ-tQ0.js} +1 -1
- package/build/assets/skill-scope-Dz3kPH3P.js +1 -0
- package/build/assets/skills-plugins-e3CYGdUJ.js +1 -0
- package/build/assets/skills-settings-3e-FuHw_.js +1 -0
- package/build/assets/styled-tooltip-Pd22BIvr.js +1 -0
- package/build/assets/{task-list-tab-04GNQuii.js → task-list-tab-3Jg8ywch.js} +1 -1
- package/build/assets/{terminal-Cj0iHIW7.js → terminal-onXx0_Qz.js} +1 -1
- package/build/assets/toggle-switch-lwQtxDcm.js +1 -0
- package/build/assets/trash-2-ZhKuTLiz.js +1 -0
- package/build/assets/trash-B6OIe4yX.js +1 -0
- package/build/assets/triangle-alert-BajLPpQg.js +1 -0
- package/build/assets/{typography-SgFy466J.js → typography-HLLg_FAn.js} +1 -1
- package/build/assets/usage-tab-Cm-9j3UK.js +1 -0
- package/build/assets/use-acp-credential-form-BARcvjYE.js +1 -0
- package/build/assets/use-activate-agent-profile-BLKML6vQ.js +1 -0
- package/build/assets/use-agent-profiles-1P91KSXz.js +1 -0
- package/build/assets/{use-automation-health-BxXdzZMP.js → use-automation-health-BZkQNEA8.js} +1 -1
- package/build/assets/use-automation-permissions-B_RpvL-s.js +1 -0
- package/build/assets/{use-automations-zYb0dUny.js → use-automations-Cg0PDIZr.js} +1 -1
- package/build/assets/{use-can-manage-org-profiles-BWMahtUh.js → use-can-manage-org-profiles-BbN6KfDr.js} +1 -1
- package/build/assets/use-canvas-extensions-CFUpHat6.js +1 -0
- package/build/assets/{use-cloud-current-user-id-CPHMDG-C.js → use-cloud-current-user-id-Dk0rjr63.js} +1 -1
- package/build/assets/use-config-DpafU_QP.js +1 -0
- package/build/assets/use-create-conversation-1YgmAHt-.js +1 -0
- package/build/assets/use-create-secret-D8p9ybQj.js +1 -0
- package/build/assets/{use-get-secrets-BT4ihRwj.js → use-get-secrets-CQ4b0qK8.js} +1 -1
- package/build/assets/use-is-authed-BRPjCRKM.js +1 -0
- package/build/assets/{use-launch-skill-in-chat-BYjYihBP.js → use-launch-skill-in-chat-DeYa1tFM.js} +1 -1
- package/build/assets/use-llm-configured-DGm8FiRR.js +1 -0
- package/build/assets/use-llm-profiles-BTTtpW4z.js +1 -0
- package/build/assets/use-manifest-capabilities-AOWGcu0j.js +1 -0
- package/build/assets/use-onboarding-completion-CoINurkm.js +1 -0
- package/build/assets/use-pinned-home-route-D6krwXjy.js +1 -0
- package/build/assets/use-plugins-marketplace-mLsIDhBv.js +1 -0
- package/build/assets/use-save-agent-profile-CxyO9YG-.js +1 -0
- package/build/assets/{use-save-settings-CUZW6yXP.js → use-save-settings-3U5K9-8x.js} +1 -1
- package/build/assets/use-settings-Dn00UISA.js +1 -0
- package/build/assets/use-settings-nav-items-vrjxTqcu.js +16 -0
- package/build/assets/use-tracking-B9prBsrq.js +3 -0
- package/build/assets/{use-user-conversation-DT0_QCnL.js → use-user-conversation-ZWlXtbZb.js} +1 -1
- package/build/assets/{useInfiniteQuery-CgeUQPfs.js → useInfiniteQuery-BzrRqjLg.js} +1 -1
- package/build/assets/{useMutation-DFnzkf6f.js → useMutation-CJuK90oc.js} +1 -1
- package/build/assets/{useQueries-BhbrGEf1.js → useQueries-CykmpT-a.js} +1 -1
- package/build/assets/{useQuery-BXWbZBZl.js → useQuery-S6j94er1.js} +1 -1
- package/build/assets/utils-BOco8mxR.js +1 -0
- package/build/assets/{vendor~conversation-panel~conversation-CTvDDiXg.js → vendor~conversation-panel~conversation-4eJ0tml3.js} +1 -1
- package/build/assets/{vendor~entry.client-BFE7Llz9.js → vendor~entry.client-CoCfUXUF.js} +1 -1
- package/build/assets/{vendor~entry.client-BaKt_PIp.js → vendor~entry.client-DA2izTjq.js} +1 -1
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-Z0lly3FE.js +2 -0
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BfkNGovw.js +185 -0
- package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew3u153i-rfV8mQ9m.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-DnDoaYNi.js} +1 -1
- package/build/assets/{vendor~index-home~home~conversation-panel~conversation-BTyukeM-.js → vendor~index-home~home~conversation-panel~conversation-CSFLzmTN.js} +1 -1
- package/build/assets/vendor~root-layout-n8XCEXG8.js +1 -0
- package/build/assets/{vendor~root-layout~conversation-panel~conversation-BYAWJwQX.js → vendor~root-layout~conversation-panel~conversation-3Idg1_U3.js} +1 -1
- package/build/assets/{vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-CHaLEBVR.js → vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-DkPlXWl9.js} +1 -1
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation-DgQ564nC.js +1 -0
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-CxhwKuAd.js +1 -0
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-Dtu7BpYk.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~inibp4qe-CnsDDzeE.js} +2 -2
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-CV850oio.js +1 -0
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-DonTKfQD.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-BPjI-atc.js} +125 -15
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-BgxDvUcf.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-C7HiY4Ae.js} +42 -3
- package/build/assets/{verification-settings-Bj6bo097.js → verification-settings-u2POabjH.js} +1 -1
- package/build/assets/{wrench-hi7Q13dF.js → wrench-CkgI4rxA.js} +1 -1
- package/build/assets/x-By6qCmtY.js +1 -0
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +94 -25
- package/build/locales/ca/openhands.json +94 -25
- package/build/locales/de/openhands.json +94 -25
- package/build/locales/en/openhands.json +94 -25
- package/build/locales/es/openhands.json +94 -25
- package/build/locales/fr/openhands.json +94 -25
- package/build/locales/it/openhands.json +94 -25
- package/build/locales/ja/openhands.json +94 -25
- package/build/locales/ko-KR/openhands.json +94 -25
- package/build/locales/no/openhands.json +94 -25
- package/build/locales/pt/openhands.json +94 -25
- package/build/locales/tr/openhands.json +94 -25
- package/build/locales/uk/openhands.json +94 -25
- package/build/locales/zh-CN/openhands.json +94 -25
- package/build/locales/zh-TW/openhands.json +94 -25
- package/config/defaults.json +9 -5
- package/dist/api/agent-profiles-service/profile-field-support.d.ts +26 -0
- package/dist/api/agent-server-adapter.cjs +3 -3
- package/dist/api/agent-server-adapter.cjs.map +1 -1
- package/dist/api/agent-server-adapter.d.ts +72 -12
- package/dist/api/agent-server-adapter.js +249 -145
- package/dist/api/agent-server-adapter.js.map +1 -1
- package/dist/api/agent-server-compatibility.cjs +1 -1
- package/dist/api/agent-server-compatibility.cjs.map +1 -1
- package/dist/api/agent-server-compatibility.d.ts +21 -0
- package/dist/api/agent-server-compatibility.js +52 -38
- package/dist/api/agent-server-compatibility.js.map +1 -1
- package/dist/api/agent-server-config.cjs +1 -1
- package/dist/api/agent-server-config.cjs.map +1 -1
- package/dist/api/agent-server-config.d.ts +32 -0
- package/dist/api/agent-server-config.js +21 -5
- package/dist/api/agent-server-config.js.map +1 -1
- package/dist/api/automation-service/automation-service.api.cjs +1 -1
- package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
- package/dist/api/automation-service/automation-service.api.d.ts +2 -2
- package/dist/api/automation-service/automation-service.api.js +7 -7
- package/dist/api/automation-service/automation-service.api.js.map +1 -1
- package/dist/api/canvas-extensions-service.cjs +1 -0
- package/dist/api/canvas-extensions-service.d.ts +22 -0
- package/dist/api/canvas-extensions-service.js +4 -0
- package/dist/api/cloud/conversation-service.api.cjs +1 -1
- package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
- package/dist/api/cloud/conversation-service.api.d.ts +6 -0
- package/dist/api/cloud/conversation-service.api.js +14 -6
- package/dist/api/cloud/conversation-service.api.js.map +1 -1
- package/dist/api/cloud/provider-connections-service.api.cjs +2 -0
- package/dist/api/cloud/provider-connections-service.api.cjs.map +1 -0
- package/dist/api/cloud/provider-connections-service.api.d.ts +5 -0
- package/dist/api/cloud/provider-connections-service.api.js +50 -0
- package/dist/api/cloud/provider-connections-service.api.js.map +1 -0
- package/dist/api/cloud/skills-service.api.cjs +1 -1
- package/dist/api/cloud/skills-service.api.cjs.map +1 -1
- package/dist/api/cloud/skills-service.api.d.ts +10 -0
- package/dist/api/cloud/skills-service.api.js +11 -1
- package/dist/api/cloud/skills-service.api.js.map +1 -1
- package/dist/api/conversation-file-upload.api.cjs +1 -1
- package/dist/api/conversation-file-upload.api.js +10 -10
- package/dist/api/conversation-metadata-store.cjs +1 -1
- package/dist/api/conversation-metadata-store.cjs.map +1 -1
- package/dist/api/conversation-metadata-store.d.ts +24 -0
- package/dist/api/conversation-metadata-store.js +10 -2
- package/dist/api/conversation-metadata-store.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.d.ts +31 -0
- package/dist/api/conversation-service/agent-server-conversation-service.api.js +188 -128
- package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
- package/dist/api/event-service/event-service.api.cjs +1 -1
- package/dist/api/event-service/event-service.api.js +12 -12
- package/dist/api/git-service/agent-server-git-service.api.cjs +1 -1
- package/dist/api/git-service/agent-server-git-service.api.js +8 -8
- package/dist/api/hooks-service.cjs +2 -0
- package/dist/api/hooks-service.cjs.map +1 -0
- package/dist/api/hooks-service.d.ts +13 -0
- package/dist/api/hooks-service.js +20 -0
- package/dist/api/hooks-service.js.map +1 -0
- package/dist/api/provider-connections-service/provider-connections-service.api.cjs +1 -1
- package/dist/api/provider-connections-service/provider-connections-service.api.cjs.map +1 -1
- package/dist/api/provider-connections-service/provider-connections-service.api.js +25 -16
- package/dist/api/provider-connections-service/provider-connections-service.api.js.map +1 -1
- package/dist/api/runtime-service/agent-server-runtime-service.cjs +1 -1
- package/dist/api/runtime-service/agent-server-runtime-service.js +8 -8
- package/dist/api/settings-service/settings-service.api.cjs +1 -1
- package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
- package/dist/api/settings-service/settings-service.api.d.ts +5 -2
- package/dist/api/settings-service/settings-service.api.js +20 -11
- package/dist/api/settings-service/settings-service.api.js.map +1 -1
- package/dist/api/skills-service.cjs +1 -1
- package/dist/api/skills-service.cjs.map +1 -1
- package/dist/api/skills-service.d.ts +7 -0
- package/dist/api/skills-service.js +11 -8
- package/dist/api/skills-service.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/critic-result-display.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message-components/critic-result-display.js +5 -5
- package/dist/components/conversation-events/chat/event-message-components/event-group.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message-components/event-group.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/event-group.js +40 -36
- package/dist/components/conversation-events/chat/event-message-components/event-group.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/finish-event-message.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message-components/finish-event-message.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/finish-event-message.js +2 -1
- package/dist/components/conversation-events/chat/event-message-components/finish-event-message.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.d.ts +1 -1
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js +28 -28
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/thought-event-message.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message-components/thought-event-message.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/thought-event-message.js +2 -1
- package/dist/components/conversation-events/chat/event-message-components/thought-event-message.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.d.ts +1 -1
- package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js +37 -37
- package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message.cjs +2 -2
- package/dist/components/conversation-events/chat/event-message.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message.js +79 -70
- package/dist/components/conversation-events/chat/event-message.js.map +1 -1
- package/dist/components/conversation-events/chat/messages.cjs +1 -1
- package/dist/components/conversation-events/chat/messages.cjs.map +1 -1
- package/dist/components/conversation-events/chat/messages.js +28 -27
- package/dist/components/conversation-events/chat/messages.js.map +1 -1
- package/dist/components/features/automations/automation-card.cjs +1 -1
- package/dist/components/features/automations/automation-card.cjs.map +1 -1
- package/dist/components/features/automations/automation-card.js +118 -102
- package/dist/components/features/automations/automation-card.js.map +1 -1
- package/dist/components/features/automations/automation-list-row.cjs +1 -1
- package/dist/components/features/automations/automation-list-row.cjs.map +1 -1
- package/dist/components/features/automations/automation-list-row.js +88 -77
- package/dist/components/features/automations/automation-list-row.js.map +1 -1
- package/dist/components/features/automations/detail/detail-header.d.ts +3 -1
- package/dist/components/features/automations/detail/run-phase.cjs +2 -0
- package/dist/components/features/automations/detail/run-phase.cjs.map +1 -0
- package/dist/components/features/automations/detail/run-phase.d.ts +89 -0
- package/dist/components/features/automations/detail/run-phase.js +72 -0
- package/dist/components/features/automations/detail/run-phase.js.map +1 -0
- package/dist/components/features/automations/detail/run-status-badge.cjs +1 -1
- package/dist/components/features/automations/detail/run-status-badge.cjs.map +1 -1
- package/dist/components/features/automations/detail/run-status-badge.d.ts +2 -2
- package/dist/components/features/automations/detail/run-status-badge.js +82 -53
- package/dist/components/features/automations/detail/run-status-badge.js.map +1 -1
- package/dist/components/features/automations/kebab-menu.cjs +1 -1
- package/dist/components/features/automations/kebab-menu.cjs.map +1 -1
- package/dist/components/features/automations/kebab-menu.js +9 -5
- package/dist/components/features/automations/kebab-menu.js.map +1 -1
- package/dist/components/features/automations/recommended-automations-launcher.cjs +1 -1
- package/dist/components/features/automations/recommended-automations-launcher.cjs.map +1 -1
- package/dist/components/features/automations/recommended-automations-launcher.js +12 -12
- package/dist/components/features/automations/recommended-automations-launcher.js.map +1 -1
- package/dist/components/features/automations/recommended-automations-section.cjs +1 -1
- package/dist/components/features/automations/recommended-automations-section.js +9 -9
- package/dist/components/features/backends/backend-form-modal.cjs +1 -1
- package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
- package/dist/components/features/backends/backend-form-modal.js +5 -11
- package/dist/components/features/backends/backend-form-modal.js.map +1 -1
- package/dist/components/features/backends/backend-selector.cjs +1 -1
- package/dist/components/features/backends/backend-selector.cjs.map +1 -1
- package/dist/components/features/backends/backend-selector.js +133 -122
- package/dist/components/features/backends/backend-selector.js.map +1 -1
- package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
- package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
- package/dist/components/features/backends/manage-backends-modal.js +29 -29
- package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
- package/dist/components/features/canvas-extensions/add-canvas-extension-modal.d.ts +6 -0
- package/dist/components/features/canvas-extensions/canvas-extension-card.d.ts +9 -0
- package/dist/components/features/canvas-extensions/canvas-extensions-runtime.cjs +2 -0
- package/dist/components/features/canvas-extensions/canvas-extensions-runtime.cjs.map +1 -0
- package/dist/components/features/canvas-extensions/canvas-extensions-runtime.d.ts +23 -0
- package/dist/components/features/canvas-extensions/canvas-extensions-runtime.js +19 -0
- package/dist/components/features/canvas-extensions/canvas-extensions-runtime.js.map +1 -0
- package/dist/components/features/chat/change-agent-button.cjs +1 -1
- package/dist/components/features/chat/change-agent-button.js +4 -4
- 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 +107 -104
- package/dist/components/features/chat/chat-interface.js.map +1 -1
- package/dist/components/features/chat/chat-markdown-path-code.cjs +3 -0
- package/dist/components/features/chat/chat-markdown-path-code.cjs.map +1 -0
- package/dist/components/features/chat/chat-markdown-path-code.d.ts +27 -0
- package/dist/components/features/chat/chat-markdown-path-code.js +72 -0
- package/dist/components/features/chat/chat-markdown-path-code.js.map +1 -0
- package/dist/components/features/chat/chat-message.cjs +1 -1
- package/dist/components/features/chat/chat-message.cjs.map +1 -1
- package/dist/components/features/chat/chat-message.d.ts +2 -1
- package/dist/components/features/chat/chat-message.js +88 -79
- package/dist/components/features/chat/chat-message.js.map +1 -1
- package/dist/components/features/chat/components/context-window-meter.cjs +1 -1
- package/dist/components/features/chat/components/context-window-meter.js +4 -4
- package/dist/components/features/chat/confirmation-mode-enabled.cjs +1 -1
- package/dist/components/features/chat/confirmation-mode-enabled.js +4 -4
- package/dist/components/features/chat/generic-event-message.cjs +1 -1
- package/dist/components/features/chat/generic-event-message.cjs.map +1 -1
- package/dist/components/features/chat/generic-event-message.d.ts +2 -1
- package/dist/components/features/chat/generic-event-message.js +41 -22
- package/dist/components/features/chat/generic-event-message.js.map +1 -1
- package/dist/components/features/chat/interactive-chat-box.cjs +1 -1
- package/dist/components/features/chat/interactive-chat-box.cjs.map +1 -1
- package/dist/components/features/chat/interactive-chat-box.js +20 -19
- package/dist/components/features/chat/interactive-chat-box.js.map +1 -1
- package/dist/components/features/chat/path-component.cjs +1 -1
- package/dist/components/features/chat/path-component.cjs.map +1 -1
- package/dist/components/features/chat/path-component.d.ts +8 -2
- package/dist/components/features/chat/path-component.js +33 -21
- package/dist/components/features/chat/path-component.js.map +1 -1
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs +1 -1
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs.map +1 -1
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js +38 -43
- package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js.map +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs.map +1 -1
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.d.ts +8 -5
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js +22 -16
- package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js.map +1 -1
- package/dist/components/features/chat/user-message-body.cjs +1 -1
- package/dist/components/features/chat/user-message-body.cjs.map +1 -1
- package/dist/components/features/chat/user-message-body.d.ts +4 -0
- package/dist/components/features/chat/user-message-body.js +30 -24
- package/dist/components/features/chat/user-message-body.js.map +1 -1
- package/dist/components/features/conversation/conversation-overview-git-section.cjs +1 -1
- package/dist/components/features/conversation/conversation-overview-git-section.js +4 -4
- package/dist/components/features/conversation/conversation-overview-skills-panel.cjs +1 -1
- package/dist/components/features/conversation/conversation-overview-skills-panel.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-overview-skills-panel.js +63 -81
- package/dist/components/features/conversation/conversation-overview-skills-panel.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 +77 -78
- 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 +96 -96
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.d.ts +1 -1
- package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.js +3 -3
- package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.js.map +1 -1
- package/dist/components/features/conversation-panel/advanced-conversation-options-modal.cjs +2 -0
- package/dist/components/features/conversation-panel/advanced-conversation-options-modal.cjs.map +1 -0
- package/dist/components/features/conversation-panel/advanced-conversation-options-modal.d.ts +21 -0
- package/dist/components/features/conversation-panel/advanced-conversation-options-modal.js +239 -0
- package/dist/components/features/conversation-panel/advanced-conversation-options-modal.js.map +1 -0
- package/dist/components/features/conversation-panel/conversation-active-tag-filters.cjs +2 -0
- package/dist/components/features/conversation-panel/conversation-active-tag-filters.cjs.map +1 -0
- package/dist/components/features/conversation-panel/conversation-active-tag-filters.d.ts +28 -0
- package/dist/components/features/conversation-panel/conversation-active-tag-filters.js +69 -0
- package/dist/components/features/conversation-panel/conversation-active-tag-filters.js.map +1 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +2 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +19 -18
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.d.ts +2 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +91 -80
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +7 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.js +87 -81
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.d.ts +2 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.d.ts +2 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js +2 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-layouts-menu.cjs +2 -0
- package/dist/components/features/conversation-panel/conversation-layouts-menu.cjs.map +1 -0
- package/dist/components/features/conversation-panel/conversation-layouts-menu.d.ts +29 -0
- package/dist/components/features/conversation-panel/conversation-layouts-menu.js +177 -0
- package/dist/components/features/conversation-panel/conversation-layouts-menu.js.map +1 -0
- 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 +37 -0
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +85 -45
- 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 +296 -290
- package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
- package/dist/components/features/conversation-panel/edit-conversation-tags-modal.cjs +2 -0
- package/dist/components/features/conversation-panel/edit-conversation-tags-modal.cjs.map +1 -0
- package/dist/components/features/conversation-panel/edit-conversation-tags-modal.d.ts +22 -0
- package/dist/components/features/conversation-panel/edit-conversation-tags-modal.js +153 -0
- package/dist/components/features/conversation-panel/edit-conversation-tags-modal.js.map +1 -0
- package/dist/components/features/conversation-panel/hide-older-conversations-row.cjs +2 -0
- package/dist/components/features/conversation-panel/hide-older-conversations-row.cjs.map +1 -0
- package/dist/components/features/conversation-panel/hide-older-conversations-row.d.ts +6 -0
- package/dist/components/features/conversation-panel/hide-older-conversations-row.js +65 -0
- package/dist/components/features/conversation-panel/hide-older-conversations-row.js.map +1 -0
- package/dist/components/features/conversation-panel/menu-row.cjs +1 -1
- package/dist/components/features/conversation-panel/menu-row.cjs.map +1 -1
- package/dist/components/features/conversation-panel/menu-row.d.ts +11 -1
- package/dist/components/features/conversation-panel/menu-row.js +27 -16
- package/dist/components/features/conversation-panel/menu-row.js.map +1 -1
- package/dist/components/features/conversation-panel/skills-modal.cjs +1 -1
- package/dist/components/features/conversation-panel/skills-modal.cjs.map +1 -1
- package/dist/components/features/conversation-panel/skills-modal.js +29 -28
- package/dist/components/features/conversation-panel/skills-modal.js.map +1 -1
- package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
- package/dist/components/features/files-tab/file-content-viewer.js +5 -5
- package/dist/components/features/home/featured-automations/automation-health-indicator.cjs +1 -1
- package/dist/components/features/home/featured-automations/automation-health-indicator.cjs.map +1 -1
- package/dist/components/features/home/featured-automations/automation-health-indicator.js +1 -1
- package/dist/components/features/home/featured-automations/automation-health-indicator.js.map +1 -1
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs +1 -1
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs.map +1 -1
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.d.ts +4 -3
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js +22 -25
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js.map +1 -1
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs +1 -1
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs.map +1 -1
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.d.ts +1 -1
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js +15 -15
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js.map +1 -1
- package/dist/components/features/home/featured-automations/automation-run-health.cjs +1 -1
- package/dist/components/features/home/featured-automations/automation-run-health.cjs.map +1 -1
- package/dist/components/features/home/featured-automations/automation-run-health.d.ts +5 -3
- package/dist/components/features/home/featured-automations/automation-run-health.js +30 -23
- package/dist/components/features/home/featured-automations/automation-run-health.js.map +1 -1
- package/dist/components/features/home/featured-automations/home-automation-activity.d.ts +3 -2
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs +1 -1
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs.map +1 -1
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.d.ts +1 -1
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js +59 -37
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js.map +1 -1
- package/dist/components/features/manifest/manifest-form-field.d.ts +3 -1
- package/dist/components/features/manifest/manifest-review-step.d.ts +3 -1
- package/dist/components/features/onboarding/onboarding-host.d.ts +3 -4
- package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +5 -9
- package/dist/components/features/settings/acp-auth-status-banner.d.ts +23 -6
- package/dist/components/features/settings/cloud-settings-link.cjs +1 -1
- package/dist/components/features/settings/cloud-settings-link.cjs.map +1 -1
- package/dist/components/features/settings/cloud-settings-link.js +5 -3
- package/dist/components/features/settings/cloud-settings-link.js.map +1 -1
- package/dist/components/features/settings/integrations-settings-link.cjs +1 -1
- package/dist/components/features/settings/integrations-settings-link.cjs.map +1 -1
- package/dist/components/features/settings/integrations-settings-link.d.ts +3 -1
- package/dist/components/features/settings/integrations-settings-link.js +20 -17
- package/dist/components/features/settings/integrations-settings-link.js.map +1 -1
- package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
- package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +2 -1
- package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +2 -2
- package/dist/components/features/settings/llm-profiles/provider-connection-modal.cjs +1 -1
- package/dist/components/features/settings/llm-profiles/provider-connection-modal.js +3 -0
- package/dist/components/features/settings/sdk-settings/field-help.cjs +1 -1
- package/dist/components/features/settings/sdk-settings/field-help.cjs.map +1 -1
- package/dist/components/features/settings/sdk-settings/field-help.d.ts +1 -1
- package/dist/components/features/settings/sdk-settings/field-help.js +1 -1
- package/dist/components/features/settings/sdk-settings/field-help.js.map +1 -1
- package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs +1 -1
- package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs.map +1 -1
- package/dist/components/features/settings/sdk-settings/sdk-section-page.d.ts +8 -7
- package/dist/components/features/settings/sdk-settings/sdk-section-page.js +172 -142
- 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.cjs.map +1 -1
- package/dist/components/features/settings/secrets-settings/secret-form.js +38 -25
- package/dist/components/features/settings/secrets-settings/secret-form.js.map +1 -1
- package/dist/components/features/settings/settings-dropdown-input.cjs +1 -1
- package/dist/components/features/settings/settings-dropdown-input.js +6 -6
- package/dist/components/features/sidebar/sidebar-nav-link.cjs +1 -1
- package/dist/components/features/sidebar/sidebar-nav-link.cjs.map +1 -1
- package/dist/components/features/sidebar/sidebar-nav-link.d.ts +10 -1
- package/dist/components/features/sidebar/sidebar-nav-link.js +54 -36
- package/dist/components/features/sidebar/sidebar-nav-link.js.map +1 -1
- package/dist/components/features/sidebar/sidebar-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.d.ts +3 -1
- package/dist/components/features/sidebar/sidebar-rail-body.js +98 -58
- package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
- package/dist/components/features/sidebar/sidebar.cjs +1 -1
- package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
- package/dist/components/features/sidebar/sidebar.js +44 -43
- package/dist/components/features/sidebar/sidebar.js.map +1 -1
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.cjs +1 -1
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.js +3 -3
- package/dist/components/features/skills/build-skill-pills.cjs +1 -1
- package/dist/components/features/skills/build-skill-pills.cjs.map +1 -1
- package/dist/components/features/skills/build-skill-pills.js +60 -52
- package/dist/components/features/skills/build-skill-pills.js.map +1 -1
- package/dist/components/features/skills/extensions-navigation.cjs +1 -1
- package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
- package/dist/components/features/skills/extensions-navigation.js +54 -43
- package/dist/components/features/skills/extensions-navigation.js.map +1 -1
- package/dist/components/features/skills/skill-filter.cjs +1 -1
- package/dist/components/features/skills/skill-filter.cjs.map +1 -1
- package/dist/components/features/skills/skill-filter.d.ts +8 -3
- package/dist/components/features/skills/skill-filter.js +69 -52
- package/dist/components/features/skills/skill-filter.js.map +1 -1
- package/dist/components/shared/buttons/styled-tooltip.cjs +1 -1
- package/dist/components/shared/buttons/styled-tooltip.cjs.map +1 -1
- package/dist/components/shared/buttons/styled-tooltip.d.ts +2 -1
- package/dist/components/shared/buttons/styled-tooltip.js +2 -1
- package/dist/components/shared/buttons/styled-tooltip.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 +5 -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/confirmation-modal.cjs +1 -1
- package/dist/components/shared/modals/confirmation-modal.cjs.map +1 -1
- package/dist/components/shared/modals/confirmation-modal.d.ts +2 -1
- package/dist/components/shared/modals/confirmation-modal.js +8 -8
- package/dist/components/shared/modals/confirmation-modal.js.map +1 -1
- package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
- package/dist/components/shared/modals/settings/model-selector.js +27 -27
- package/dist/components/shared/modals/settings/settings-form.cjs +1 -1
- package/dist/components/shared/modals/settings/settings-form.js +8 -8
- package/dist/config/defaults.cjs +1 -1
- package/dist/config/defaults.cjs.map +1 -1
- package/dist/config/defaults.js +9 -5
- package/dist/config/defaults.js.map +1 -1
- package/dist/constants/settings-nav.d.ts +8 -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.d.ts +5 -0
- package/dist/contexts/conversation-websocket-context.js +194 -198
- package/dist/contexts/conversation-websocket-context.js.map +1 -1
- package/dist/contexts/websocket-provider-wrapper.cjs +1 -1
- package/dist/contexts/websocket-provider-wrapper.cjs.map +1 -1
- package/dist/contexts/websocket-provider-wrapper.js +31 -15
- package/dist/contexts/websocket-provider-wrapper.js.map +1 -1
- package/dist/extensions/canvas-extension-module-loader.d.ts +11 -0
- package/dist/hooks/chat/record-model-switch-message.cjs +1 -1
- package/dist/hooks/chat/record-model-switch-message.cjs.map +1 -1
- package/dist/hooks/chat/record-model-switch-message.d.ts +31 -0
- package/dist/hooks/chat/record-model-switch-message.js +25 -12
- package/dist/hooks/chat/record-model-switch-message.js.map +1 -1
- package/dist/hooks/chat/use-plan-mode-interceptor.cjs +2 -0
- package/dist/hooks/chat/use-plan-mode-interceptor.cjs.map +1 -0
- package/dist/hooks/chat/use-plan-mode-interceptor.d.ts +16 -0
- package/dist/hooks/chat/use-plan-mode-interceptor.js +43 -0
- package/dist/hooks/chat/use-plan-mode-interceptor.js.map +1 -0
- 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 +5 -1
- package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
- package/dist/hooks/mutation/use-manage-canvas-extensions.d.ts +12 -0
- package/dist/hooks/mutation/use-read-conversation-file.cjs +1 -1
- package/dist/hooks/mutation/use-read-conversation-file.cjs.map +1 -1
- package/dist/hooks/mutation/use-read-conversation-file.js +11 -4
- package/dist/hooks/mutation/use-read-conversation-file.js.map +1 -1
- package/dist/hooks/mutation/use-save-settings.cjs +1 -1
- package/dist/hooks/mutation/use-save-settings.js +3 -3
- package/dist/hooks/mutation/use-switch-llm-profile.cjs +1 -1
- package/dist/hooks/mutation/use-switch-llm-profile.cjs.map +1 -1
- package/dist/hooks/mutation/use-switch-llm-profile.js +13 -25
- package/dist/hooks/mutation/use-switch-llm-profile.js.map +1 -1
- package/dist/hooks/mutation/use-update-conversation-tags.cjs +2 -0
- package/dist/hooks/mutation/use-update-conversation-tags.cjs.map +1 -0
- package/dist/hooks/mutation/use-update-conversation-tags.d.ts +8 -0
- package/dist/hooks/mutation/use-update-conversation-tags.js +45 -0
- package/dist/hooks/mutation/use-update-conversation-tags.js.map +1 -0
- package/dist/hooks/query/concurrency-limiter.cjs +2 -0
- package/dist/hooks/query/concurrency-limiter.cjs.map +1 -0
- package/dist/hooks/query/concurrency-limiter.d.ts +22 -0
- package/dist/hooks/query/concurrency-limiter.js +29 -0
- package/dist/hooks/query/concurrency-limiter.js.map +1 -0
- package/dist/hooks/query/query-keys.cjs +1 -1
- package/dist/hooks/query/query-keys.cjs.map +1 -1
- package/dist/hooks/query/query-keys.d.ts +10 -0
- package/dist/hooks/query/query-keys.js +2 -2
- package/dist/hooks/query/query-keys.js.map +1 -1
- package/dist/hooks/query/use-active-conversation.cjs +1 -1
- package/dist/hooks/query/use-active-conversation.js +4 -4
- package/dist/hooks/query/use-automation-sdk-version.cjs +1 -1
- package/dist/hooks/query/use-automation-sdk-version.cjs.map +1 -1
- package/dist/hooks/query/use-automation-sdk-version.d.ts +0 -1
- package/dist/hooks/query/use-automation-sdk-version.js +30 -55
- package/dist/hooks/query/use-automation-sdk-version.js.map +1 -1
- package/dist/hooks/query/use-automations.cjs.map +1 -1
- package/dist/hooks/query/use-automations.js.map +1 -1
- package/dist/hooks/query/use-backends-health.cjs +1 -1
- package/dist/hooks/query/use-backends-health.cjs.map +1 -1
- package/dist/hooks/query/use-backends-health.d.ts +1 -1
- package/dist/hooks/query/use-backends-health.js +50 -64
- package/dist/hooks/query/use-backends-health.js.map +1 -1
- package/dist/hooks/query/use-canvas-extensions.cjs +1 -0
- package/dist/hooks/query/use-canvas-extensions.d.ts +5 -0
- package/dist/hooks/query/use-canvas-extensions.js +3 -0
- package/dist/hooks/query/use-commit-changes.cjs +1 -1
- package/dist/hooks/query/use-commit-changes.js +4 -4
- package/dist/hooks/query/use-conversation-skills.cjs +1 -1
- package/dist/hooks/query/use-conversation-skills.cjs.map +1 -1
- package/dist/hooks/query/use-conversation-skills.d.ts +14 -5
- package/dist/hooks/query/use-conversation-skills.js +20 -4
- package/dist/hooks/query/use-conversation-skills.js.map +1 -1
- package/dist/hooks/query/use-latest-automation-runs.cjs +1 -1
- package/dist/hooks/query/use-latest-automation-runs.js +1 -0
- package/dist/hooks/query/use-paginated-conversations.cjs +1 -1
- package/dist/hooks/query/use-paginated-conversations.cjs.map +1 -1
- package/dist/hooks/query/use-paginated-conversations.js +19 -16
- package/dist/hooks/query/use-paginated-conversations.js.map +1 -1
- package/dist/hooks/query/use-provider-connections.cjs +1 -1
- package/dist/hooks/query/use-provider-connections.cjs.map +1 -1
- package/dist/hooks/query/use-provider-connections.d.ts +6 -3
- package/dist/hooks/query/use-provider-connections.js +7 -3
- package/dist/hooks/query/use-provider-connections.js.map +1 -1
- package/dist/hooks/query/use-search-providers.cjs +1 -1
- package/dist/hooks/query/use-search-providers.cjs.map +1 -1
- package/dist/hooks/query/use-search-providers.js +17 -10
- package/dist/hooks/query/use-search-providers.js.map +1 -1
- package/dist/hooks/query/use-sub-conversations.cjs +1 -1
- package/dist/hooks/query/use-sub-conversations.cjs.map +1 -1
- package/dist/hooks/query/use-sub-conversations.js +16 -16
- package/dist/hooks/query/use-sub-conversations.js.map +1 -1
- 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-unified-vscode-url.cjs +1 -1
- package/dist/hooks/query/use-unified-vscode-url.cjs.map +1 -1
- package/dist/hooks/query/use-unified-vscode-url.d.ts +1 -0
- package/dist/hooks/query/use-unified-vscode-url.js +40 -26
- package/dist/hooks/query/use-unified-vscode-url.js.map +1 -1
- package/dist/hooks/query/use-workspace-file-content.cjs +1 -1
- package/dist/hooks/query/use-workspace-file-content.js +5 -5
- package/dist/hooks/query/use-workspace-files.cjs +1 -1
- package/dist/hooks/query/use-workspace-files.js +6 -6
- package/dist/hooks/use-acp-credential-form.d.ts +6 -0
- package/dist/hooks/use-acp-model-context.cjs +1 -1
- package/dist/hooks/use-acp-model-context.js +3 -3
- package/dist/hooks/use-agent-state.cjs +1 -1
- package/dist/hooks/use-agent-state.cjs.map +1 -1
- package/dist/hooks/use-agent-state.d.ts +17 -1
- package/dist/hooks/use-agent-state.js +19 -9
- package/dist/hooks/use-agent-state.js.map +1 -1
- package/dist/hooks/use-automation-permissions.cjs +2 -0
- package/dist/hooks/use-automation-permissions.cjs.map +1 -0
- package/dist/hooks/use-automation-permissions.d.ts +43 -0
- package/dist/hooks/use-automation-permissions.js +52 -0
- package/dist/hooks/use-automation-permissions.js.map +1 -0
- package/dist/hooks/use-chat-input-model-state.cjs +1 -1
- package/dist/hooks/use-chat-input-model-state.js +3 -3
- package/dist/hooks/use-conversation-overview-git-diff-stats.cjs +1 -1
- package/dist/hooks/use-conversation-overview-git-diff-stats.js +4 -4
- package/dist/hooks/use-handle-plan-click.cjs +1 -1
- package/dist/hooks/use-handle-plan-click.cjs.map +1 -1
- package/dist/hooks/use-handle-plan-click.d.ts +3 -1
- package/dist/hooks/use-handle-plan-click.js +85 -26
- package/dist/hooks/use-handle-plan-click.js.map +1 -1
- package/dist/hooks/use-home-automation-actions.cjs +1 -1
- package/dist/hooks/use-home-automation-actions.cjs.map +1 -1
- package/dist/hooks/use-home-automation-actions.js +1 -0
- package/dist/hooks/use-home-automation-actions.js.map +1 -1
- package/dist/hooks/use-llm-configured.cjs +1 -1
- package/dist/hooks/use-llm-configured.js +3 -3
- package/dist/hooks/use-manifest-preflight.d.ts +1 -1
- package/dist/hooks/use-pinned-home-route.cjs +2 -0
- package/dist/hooks/use-pinned-home-route.cjs.map +1 -0
- package/dist/hooks/use-pinned-home-route.d.ts +33 -0
- package/dist/hooks/use-pinned-home-route.js +34 -0
- package/dist/hooks/use-pinned-home-route.js.map +1 -0
- package/dist/hooks/use-skill-enablement.cjs +2 -0
- package/dist/hooks/use-skill-enablement.cjs.map +1 -0
- package/dist/hooks/use-skill-enablement.d.ts +14 -0
- package/dist/hooks/use-skill-enablement.js +80 -0
- package/dist/hooks/use-skill-enablement.js.map +1 -0
- package/dist/hooks/use-unified-websocket-status.cjs +1 -1
- package/dist/hooks/use-unified-websocket-status.cjs.map +1 -1
- package/dist/hooks/use-unified-websocket-status.d.ts +7 -0
- package/dist/hooks/use-unified-websocket-status.js +5 -1
- package/dist/hooks/use-unified-websocket-status.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 +83 -14
- 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 +1575 -402
- package/dist/i18n/translation.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +15 -14
- package/dist/lib/index.cjs +1 -1
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.js +1 -0
- package/dist/locales/ar/openhands.json +94 -25
- package/dist/locales/ca/openhands.json +94 -25
- package/dist/locales/de/openhands.json +94 -25
- package/dist/locales/en/openhands.json +94 -25
- package/dist/locales/es/openhands.json +94 -25
- package/dist/locales/fr/openhands.json +94 -25
- package/dist/locales/it/openhands.json +94 -25
- package/dist/locales/ja/openhands.json +94 -25
- package/dist/locales/ko-KR/openhands.json +94 -25
- package/dist/locales/no/openhands.json +94 -25
- package/dist/locales/pt/openhands.json +94 -25
- package/dist/locales/tr/openhands.json +94 -25
- package/dist/locales/uk/openhands.json +94 -25
- package/dist/locales/zh-CN/openhands.json +94 -25
- package/dist/locales/zh-TW/openhands.json +94 -25
- package/dist/manifests/automation-insights.cjs.map +1 -1
- package/dist/manifests/automation-insights.d.ts +10 -2
- package/dist/manifests/automation-insights.js.map +1 -1
- package/dist/manifests/automation-interface.cjs +1 -1
- package/dist/manifests/automation-interface.cjs.map +1 -1
- package/dist/manifests/automation-interface.d.ts +6 -0
- package/dist/manifests/automation-interface.js +11 -8
- 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 +9 -16
- package/dist/manifests/automation-setup.js +17 -7
- package/dist/manifests/automation-setup.js.map +1 -1
- package/dist/manifests/manifest-actions.d.ts +1 -1
- package/dist/manifests/manifest-capabilities.d.ts +3 -1
- package/dist/manifests/manifest-local-validation.cjs +2 -0
- package/dist/manifests/manifest-local-validation.cjs.map +1 -0
- package/dist/manifests/manifest-local-validation.d.ts +15 -11
- package/dist/manifests/manifest-local-validation.js +8 -0
- package/dist/manifests/manifest-local-validation.js.map +1 -0
- package/dist/manifests/manifest-template.cjs +2 -0
- package/dist/manifests/manifest-template.cjs.map +1 -0
- package/dist/manifests/manifest-template.d.ts +4 -4
- package/dist/manifests/manifest-template.js +12 -0
- package/dist/manifests/manifest-template.js.map +1 -0
- package/dist/manifests/manifest-validation.cjs +1 -1
- package/dist/manifests/manifest-validation.cjs.map +1 -1
- package/dist/manifests/manifest-validation.js +106 -28
- package/dist/manifests/manifest-validation.js.map +1 -1
- package/dist/manifests/types.cjs.map +1 -1
- package/dist/manifests/types.d.ts +39 -4
- package/dist/manifests/types.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs +45 -4
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.js +1 -1
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.cjs +8 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.js +221 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.js.map +1 -0
- 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 +5 -0
- 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-issue-to-pr/manifest.cjs +2 -2
- 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 +6 -1
- 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-pr-reviewer/manifest.cjs +2 -2
- 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 +6 -1
- 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 +1 -1
- 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 +5 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.js +21 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.js +21 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.js +21 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.js +21 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.cjs +9 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.js +21 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.js +5 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs +30 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js +65 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +28 -14
- package/dist/node_modules/@openhands/extensions/automations/catalog-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 +2 -1
- package/dist/node_modules/@openhands/extensions/automations/interface.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js +2 -2
- package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js +59 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog-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 +74 -72
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.cjs +42 -3
- package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.js +22 -3
- package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-conversation.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-conversation.js +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.js +8 -7
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/index.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/index.js +2 -2
- package/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs +1 -1
- package/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js +1 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/blocks.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/blocks.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/blocks.js +16 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/blocks.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.js +21 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.js +23 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/shrink.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/shrink.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/shrink.js +23 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/shrink.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js +43 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/tags.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/tags.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/tags.js +22 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/tags.js.map +1 -0
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +5 -5
- package/dist/package.js.map +1 -1
- package/dist/routes/agent-settings.d.ts +12 -0
- package/dist/routes/app-settings.cjs +1 -1
- package/dist/routes/app-settings.cjs.map +1 -1
- package/dist/routes/app-settings.js +11 -11
- package/dist/routes/files-tab.cjs +1 -1
- package/dist/routes/files-tab.cjs.map +1 -1
- package/dist/routes/files-tab.js +14 -14
- 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 +3 -1
- package/dist/routes/llm-settings.js +100 -91
- package/dist/routes/llm-settings.js.map +1 -1
- package/dist/routes/planner-tab.cjs +1 -1
- package/dist/routes/planner-tab.cjs.map +1 -1
- package/dist/routes/planner-tab.js +44 -28
- package/dist/routes/planner-tab.js.map +1 -1
- package/dist/services/canvas-ui.cjs +1 -1
- package/dist/services/canvas-ui.cjs.map +1 -1
- package/dist/services/canvas-ui.d.ts +5 -0
- package/dist/services/canvas-ui.js +24 -10
- package/dist/services/canvas-ui.js.map +1 -1
- package/dist/services/settings.cjs +1 -1
- package/dist/services/settings.cjs.map +1 -1
- package/dist/services/settings.js +3 -2
- package/dist/services/settings.js.map +1 -1
- package/dist/services/telemetry.cjs +1 -1
- package/dist/services/telemetry.cjs.map +1 -1
- package/dist/services/telemetry.d.ts +5 -0
- package/dist/services/telemetry.js +122 -115
- package/dist/services/telemetry.js.map +1 -1
- package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
- package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
- package/dist/stores/conversation-panel-preferences-store.d.ts +32 -5
- package/dist/stores/conversation-panel-preferences-store.js +29 -12
- package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
- package/dist/stores/conversation-state-store.cjs +1 -1
- package/dist/stores/conversation-state-store.cjs.map +1 -1
- package/dist/stores/conversation-state-store.d.ts +9 -3
- package/dist/stores/conversation-state-store.js +6 -3
- package/dist/stores/conversation-state-store.js.map +1 -1
- package/dist/stores/conversation-store.cjs +1 -1
- package/dist/stores/conversation-store.cjs.map +1 -1
- package/dist/stores/conversation-store.d.ts +2 -0
- package/dist/stores/conversation-store.js +3 -0
- package/dist/stores/conversation-store.js.map +1 -1
- package/dist/stores/model-store.cjs +1 -1
- package/dist/stores/model-store.cjs.map +1 -1
- package/dist/stores/model-store.d.ts +7 -0
- package/dist/stores/model-store.js +4 -0
- package/dist/stores/model-store.js.map +1 -1
- package/dist/types/automation.cjs.map +1 -1
- package/dist/types/automation.d.ts +66 -1
- package/dist/types/automation.js.map +1 -1
- package/dist/types/canvas-extension.cjs +2 -0
- package/dist/types/canvas-extension.cjs.map +1 -0
- package/dist/types/canvas-extension.d.ts +77 -0
- package/dist/types/canvas-extension.js +6 -0
- package/dist/types/canvas-extension.js.map +1 -0
- package/dist/types/settings.d.ts +7 -0
- package/dist/ui/context-menu.d.ts +1 -1
- package/dist/ui/help-link.cjs +1 -1
- package/dist/ui/help-link.cjs.map +1 -1
- package/dist/ui/help-link.d.ts +6 -1
- package/dist/ui/help-link.js +32 -18
- package/dist/ui/help-link.js.map +1 -1
- package/dist/ui/toggle-switch.cjs +1 -1
- package/dist/ui/toggle-switch.cjs.map +1 -1
- package/dist/ui/toggle-switch.d.ts +4 -1
- package/dist/ui/toggle-switch.js +4 -3
- package/dist/ui/toggle-switch.js.map +1 -1
- package/dist/utils/acp-auth-display.d.ts +35 -0
- package/dist/utils/automation-catalog.cjs +1 -1
- package/dist/utils/automation-catalog.cjs.map +1 -1
- package/dist/utils/automation-catalog.d.ts +12 -1
- package/dist/utils/automation-catalog.js +42 -12
- package/dist/utils/automation-catalog.js.map +1 -1
- package/dist/utils/automation-run-display.cjs +2 -0
- package/dist/utils/automation-run-display.cjs.map +1 -0
- package/dist/utils/automation-run-display.d.ts +20 -0
- package/dist/utils/automation-run-display.js +85 -0
- package/dist/utils/automation-run-display.js.map +1 -0
- package/dist/utils/automation-schedule.cjs +1 -1
- package/dist/utils/automation-schedule.cjs.map +1 -1
- package/dist/utils/automation-schedule.d.ts +16 -0
- package/dist/utils/automation-schedule.js +2 -0
- package/dist/utils/automation-schedule.js.map +1 -1
- package/dist/utils/cache-utils.cjs +1 -1
- package/dist/utils/cache-utils.js +5 -5
- package/dist/utils/constants.cjs +1 -1
- package/dist/utils/constants.cjs.map +1 -1
- package/dist/utils/constants.d.ts +4 -0
- package/dist/utils/constants.js +23 -3
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/format-event-timestamp.cjs +2 -0
- package/dist/utils/format-event-timestamp.cjs.map +1 -0
- package/dist/utils/format-event-timestamp.d.ts +1 -0
- package/dist/utils/format-event-timestamp.js +13 -0
- package/dist/utils/format-event-timestamp.js.map +1 -0
- package/dist/utils/format-model-name.cjs +1 -1
- package/dist/utils/format-model-name.cjs.map +1 -1
- package/dist/utils/format-model-name.d.ts +7 -3
- package/dist/utils/format-model-name.js +6 -11
- package/dist/utils/format-model-name.js.map +1 -1
- package/dist/utils/format-relative-time.cjs +1 -1
- package/dist/utils/format-relative-time.cjs.map +1 -1
- package/dist/utils/format-relative-time.d.ts +7 -0
- package/dist/utils/format-relative-time.js +7 -2
- package/dist/utils/format-relative-time.js.map +1 -1
- package/dist/utils/git-diff-stats.cjs +2 -2
- package/dist/utils/git-diff-stats.cjs.map +1 -1
- package/dist/utils/git-diff-stats.d.ts +4 -0
- package/dist/utils/git-diff-stats.js +12 -2
- package/dist/utils/git-diff-stats.js.map +1 -1
- package/dist/utils/path-utils.cjs +1 -1
- package/dist/utils/path-utils.cjs.map +1 -1
- package/dist/utils/path-utils.d.ts +15 -3
- package/dist/utils/path-utils.js +29 -3
- package/dist/utils/path-utils.js.map +1 -1
- package/dist/utils/plan-file.cjs +4 -0
- package/dist/utils/plan-file.cjs.map +1 -0
- package/dist/utils/plan-file.d.ts +18 -0
- package/dist/utils/plan-file.js +58 -0
- package/dist/utils/plan-file.js.map +1 -0
- package/dist/utils/recommended-automation-rail.cjs +1 -1
- package/dist/utils/recommended-automation-rail.cjs.map +1 -1
- package/dist/utils/recommended-automation-rail.js +1 -0
- package/dist/utils/recommended-automation-rail.js.map +1 -1
- package/dist/utils/scroll-fade-state.cjs +1 -1
- package/dist/utils/scroll-fade-state.cjs.map +1 -1
- package/dist/utils/scroll-fade-state.d.ts +6 -0
- package/dist/utils/scroll-fade-state.js +8 -1
- package/dist/utils/scroll-fade-state.js.map +1 -1
- package/dist/utils/sdk-settings-schema.cjs +1 -1
- package/dist/utils/sdk-settings-schema.cjs.map +1 -1
- package/dist/utils/sdk-settings-schema.d.ts +1 -0
- package/dist/utils/sdk-settings-schema.js +25 -22
- package/dist/utils/sdk-settings-schema.js.map +1 -1
- package/dist/utils/skill-enablement.cjs +2 -0
- package/dist/utils/skill-enablement.cjs.map +1 -0
- package/dist/utils/skill-enablement.d.ts +51 -0
- package/dist/utils/skill-enablement.js +31 -0
- package/dist/utils/skill-enablement.js.map +1 -0
- package/dist/utils/utils.cjs +1 -1
- package/dist/utils/utils.cjs.map +1 -1
- package/dist/utils/utils.js +11 -11
- package/dist/utils/utils.js.map +1 -1
- package/dist/utils/vscode-origin.cjs +2 -0
- package/dist/utils/vscode-origin.cjs.map +1 -0
- package/dist/utils/vscode-origin.d.ts +55 -0
- package/dist/utils/vscode-origin.js +27 -0
- package/dist/utils/vscode-origin.js.map +1 -0
- package/dist/utils/workspace-mode.d.ts +4 -0
- package/package.json +5 -5
- package/scripts/check-sdk-version-sync.mjs +6 -6
- package/scripts/check-translation-completeness.cjs +1 -0
- package/scripts/dev-extra-backend.mjs +28 -9
- package/scripts/dev-safe.mjs +81 -8
- package/scripts/dev-static.mjs +35 -37
- package/scripts/dev-with-automation.mjs +83 -2
- package/scripts/ingress.mjs +27 -1
- package/scripts/static-server.mjs +107 -2
- package/tools/canvas_ui_tool.py +19 -0
- package/build/assets/active-backend-context-DKFSMbn3.js +0 -2
- package/build/assets/agent-profiles-settings-D4cY5U2T.js +0 -1
- package/build/assets/agent-server-conversation-service.api-DozDKIW_.js +0 -86
- package/build/assets/agent-settings-351vXWc9.js +0 -2
- package/build/assets/agent-settings-Ce7BDZ6I.js +0 -1
- package/build/assets/alert-banner-Kyy1YWZU.js +0 -1
- package/build/assets/api-key-entry-screen-INIxqAMs.js +0 -1
- package/build/assets/automation-detail-DXDhUwPq.js +0 -3
- package/build/assets/automation-git-sync-CzyS4cn1.js +0 -1
- package/build/assets/automation-setup-route-FRr05f_g.js +0 -1
- package/build/assets/automations-list-CERuQWE6.js +0 -1
- package/build/assets/backend-form-modal-DK78-jn1.js +0 -1
- package/build/assets/bot-C-0Wu7vQ.js +0 -1
- package/build/assets/browser-11etCQ04.js +0 -7
- package/build/assets/check-Cf2YoT90.js +0 -1
- package/build/assets/chevron-down-C3OQ-ehx.js +0 -1
- package/build/assets/chevron-right-CN1uUiJ1.js +0 -1
- package/build/assets/circle-check-g5yeGMd-.js +0 -1
- package/build/assets/command-menu-BZQ8S3Ke.js +0 -1
- package/build/assets/commits-tab-DZtJgaDM.js +0 -1
- package/build/assets/confirmation-modal-Bk4JRcCM.js +0 -1
- package/build/assets/conversation-CchMzpGl.js +0 -1
- package/build/assets/conversation-Dpzftz57.js +0 -93
- package/build/assets/conversation-panel-CchMzpGl.js +0 -1
- package/build/assets/conversation-state-store-a9d2fxRc.js +0 -1
- package/build/assets/edit-automation-modal-D-urtv8n.js +0 -1
- package/build/assets/empty-state-CvaVahVr.js +0 -1
- package/build/assets/enum-filter-dropdown-DliX_Lo0.js +0 -1
- package/build/assets/extensions-hub-CFduxBnk.js +0 -1
- package/build/assets/extensions-navigation-BeC224yX.js +0 -1
- package/build/assets/external-link-DFpYunfj.js +0 -1
- package/build/assets/files-tab-CL3J9b3p.js +0 -1
- package/build/assets/format-model-name-BNPKVsIq.js +0 -1
- package/build/assets/get-git-path-DlAJa_i6.js +0 -1
- package/build/assets/git-repo-dropdown-DGMEhz7d.js +0 -1
- package/build/assets/home-BCGlNJCA.js +0 -1
- package/build/assets/home-DB1pRqTC.js +0 -1
- package/build/assets/home-automation-run-tooltip-CooFQRIG.js +0 -1
- package/build/assets/home-store-Dl1dPE58.js +0 -1
- package/build/assets/index-home-DB1pRqTC.js +0 -1
- package/build/assets/info-uYSVzX86.js +0 -1
- package/build/assets/install-server-modal-BbJdhzet.js +0 -1
- package/build/assets/kebab-menu-item-content-BYokkRHi.js +0 -1
- package/build/assets/list-filter-OFkpRrmi.js +0 -1
- package/build/assets/llm-not-configured-banner-BqqYnJ1t.js +0 -27
- package/build/assets/llm-settings-CnDbbmVW.js +0 -1
- package/build/assets/llm-settings-S8Yjg__1.js +0 -1
- package/build/assets/llm-subscription-service-BpPfzW4x.js +0 -1
- package/build/assets/loader-circle-nvrwthvj.js +0 -1
- package/build/assets/manage-backends-modal-BCUPswyl.js +0 -1
- package/build/assets/manifest-58597dde.js +0 -1
- package/build/assets/markdown-renderer-Cb2sBWtV.js +0 -8
- package/build/assets/mcp-page-Bm4K2NQq.js +0 -9
- package/build/assets/messages-BTN5thLe.js +0 -40
- package/build/assets/onboarding-Cx_kaiD1.js +0 -1
- package/build/assets/onboarding-modal-vMwn7ihv.js +0 -1
- package/build/assets/organization-service.api-C8XpQ0pM.js +0 -1
- package/build/assets/pencil-Clh1Wjvh.js +0 -1
- package/build/assets/planner-tab-DQvDU3ap.js +0 -1
- package/build/assets/plug-BuQhHSSG.js +0 -1
- package/build/assets/plugins-management-service-BjYeF0b0.js +0 -1
- package/build/assets/plus-CEKne-Yp.js +0 -1
- package/build/assets/profiles-service.api-QB-T_u-g.js +0 -1
- package/build/assets/providers-FfSZ5TXP.js +0 -1
- package/build/assets/proxy-tcFL2yTQ.js +0 -1
- package/build/assets/recommended-automations-launcher-Bw8uC4V6.js +0 -1
- package/build/assets/refresh-cw-Bh69DyYO.js +0 -1
- package/build/assets/root-BLeQfBEq.css +0 -1
- package/build/assets/root-ZKKYPR1Z.js +0 -2
- package/build/assets/root-layout-luJoE9IG.js +0 -2
- package/build/assets/schema-field-Csw5fhtN.js +0 -1
- package/build/assets/scroll-fade-state-Dw-i4SGq.js +0 -1
- package/build/assets/sdk-section-page-HTffvm7Q.js +0 -1
- package/build/assets/secret-form-HTUbYw5o.js +0 -1
- package/build/assets/secrets-service-BTor9uAU.js +0 -1
- package/build/assets/settings-BlmrkwRi.js +0 -1
- package/build/assets/settings-DcNPxz0v.js +0 -1
- package/build/assets/settings-index-CKq0b0Vg.js +0 -1
- package/build/assets/settings-service.api-B2agVfjL.js +0 -1
- package/build/assets/shared-conversation-B55pCyBG.js +0 -1
- package/build/assets/shield-check-CFDViW82.js +0 -1
- package/build/assets/sidebar-mobile-menu-toggle-BOtyJHwE.js +0 -1
- package/build/assets/sidebar-nav-link-CPzhyHQg.js +0 -1
- package/build/assets/sidebar-store-DtpU7zaI.js +0 -1
- package/build/assets/skill-filter-CWZ5kjcg.js +0 -2
- package/build/assets/skill-scope-CV1dkAbW.js +0 -1
- package/build/assets/skills-plugins-DGHULTq6.js +0 -1
- package/build/assets/skills-settings-CM1lFv3e.js +0 -1
- package/build/assets/styled-tooltip-Dl06rkpY.js +0 -1
- package/build/assets/toggle-switch-Fd_QGz0r.js +0 -1
- package/build/assets/trash-2-Dl8_RGz0.js +0 -1
- package/build/assets/trash-_RMt7Ayc.js +0 -1
- package/build/assets/triangle-alert-SM-q4NU_.js +0 -1
- package/build/assets/usage-tab-BcfWV6db.js +0 -1
- package/build/assets/use-acp-credential-form-BsSW5NHG.js +0 -1
- package/build/assets/use-activate-agent-profile-B2NS8nA5.js +0 -1
- package/build/assets/use-agent-profiles-DWBPC0Si.js +0 -1
- package/build/assets/use-config-Bft35DOK.js +0 -1
- package/build/assets/use-create-conversation-DwN5vv2f.js +0 -1
- package/build/assets/use-create-secret-BSxJMxHp.js +0 -1
- package/build/assets/use-has-permission-B3C8rQmR.js +0 -1
- package/build/assets/use-is-authed-CFGkY3-Z.js +0 -1
- package/build/assets/use-llm-configured-BI6obxsc.js +0 -1
- package/build/assets/use-llm-profiles-djGAhTWL.js +0 -1
- package/build/assets/use-manifest-capabilities-3z0-1G59.js +0 -1
- package/build/assets/use-onboarding-completion-BXpyUSsJ.js +0 -1
- package/build/assets/use-plugins-marketplace-DI4_pK56.js +0 -1
- package/build/assets/use-save-agent-profile-DdBSTdpN.js +0 -1
- package/build/assets/use-settings-C5VhGpqd.js +0 -1
- package/build/assets/use-settings-nav-items-DHaUu1Dg.js +0 -16
- package/build/assets/use-tracking-D5t9otIF.js +0 -3
- package/build/assets/utils-DaCIEEQP.js +0 -1
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kepq2zme-ZixYGy6E.js +0 -186
- package/build/assets/vendor~index-home~home~conversation-panel~conversation~alert-banner-B3qC_oj8.js +0 -1
- package/build/assets/vendor~root-layout-BlUaZ18v.js +0 -1
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-B2OLKL7N.js +0 -1
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iw7io29p-Dz-MAyNb.js +0 -1
- package/build/assets/x-DkgltWa0.js +0 -1
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +0 -2
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +0 -1
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +0 -35
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +0 -247
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +0 -1
- package/dist/components/features/tips/random-tip.d.ts +0 -2
- package/dist/hooks/query/use-skills.cjs +0 -2
- package/dist/hooks/query/use-skills.cjs.map +0 -1
- package/dist/hooks/query/use-skills.d.ts +0 -7
- package/dist/hooks/query/use-skills.js +0 -13
- package/dist/hooks/query/use-skills.js.map +0 -1
- package/dist/hooks/use-has-permission.cjs +0 -2
- package/dist/hooks/use-has-permission.cjs.map +0 -1
- package/dist/hooks/use-has-permission.d.ts +0 -1
- package/dist/hooks/use-has-permission.js +0 -8
- package/dist/hooks/use-has-permission.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs +0 -2
- package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/eye.js +0 -14
- package/dist/node_modules/lucide-react/dist/esm/icons/eye.js.map +0 -1
- package/dist/utils/tips.d.ts +0 -7
- package/dist/utils/workspace-relative-path.cjs +0 -2
- package/dist/utils/workspace-relative-path.cjs.map +0 -1
- package/dist/utils/workspace-relative-path.d.ts +0 -10
- package/dist/utils/workspace-relative-path.js +0 -22
- package/dist/utils/workspace-relative-path.js.map +0 -1
- /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ox0jfsa0-cHFhpUBq.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~i58xkef6-cHFhpUBq.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-fade-state.cjs","names":[],"sources":["../../src/utils/scroll-fade-state.ts"],"sourcesContent":["const SCROLL_EDGE_THRESHOLD_PX = 1;\n\nexport interface ScrollFadeState {\n left: boolean;\n right: boolean;\n}\n\n/** Whether a horizontal scroller is clipped on each edge. */\nexport function readScrollFadeState(element: HTMLElement): ScrollFadeState {\n const { scrollLeft, scrollWidth, clientWidth } = element;\n const maxScroll = scrollWidth - clientWidth;\n const hasOverflow = maxScroll > SCROLL_EDGE_THRESHOLD_PX;\n\n return {\n left: hasOverflow && scrollLeft > SCROLL_EDGE_THRESHOLD_PX,\n right: hasOverflow && scrollLeft < maxScroll - SCROLL_EDGE_THRESHOLD_PX,\n };\n}\n"],"mappings":"6CAAA,IAAM,EAA2B,
|
|
1
|
+
{"version":3,"file":"scroll-fade-state.cjs","names":[],"sources":["../../src/utils/scroll-fade-state.ts"],"sourcesContent":["const SCROLL_EDGE_THRESHOLD_PX = 1;\n\nexport interface ScrollFadeState {\n left: boolean;\n right: boolean;\n}\n\nexport interface VerticalScrollEdgeState {\n top: boolean;\n bottom: boolean;\n}\n\n/** Whether a horizontal scroller is clipped on each edge. */\nexport function readScrollFadeState(element: HTMLElement): ScrollFadeState {\n const { scrollLeft, scrollWidth, clientWidth } = element;\n const maxScroll = scrollWidth - clientWidth;\n const hasOverflow = maxScroll > SCROLL_EDGE_THRESHOLD_PX;\n\n return {\n left: hasOverflow && scrollLeft > SCROLL_EDGE_THRESHOLD_PX,\n right: hasOverflow && scrollLeft < maxScroll - SCROLL_EDGE_THRESHOLD_PX,\n };\n}\n\n/** Whether a vertical scroller is clipped on each edge. */\nexport function readVerticalScrollEdgeState(\n element: HTMLElement,\n): VerticalScrollEdgeState {\n const { scrollTop, scrollHeight, clientHeight } = element;\n const maxScroll = scrollHeight - clientHeight;\n const hasOverflow = maxScroll > SCROLL_EDGE_THRESHOLD_PX;\n\n return {\n top: hasOverflow && scrollTop > SCROLL_EDGE_THRESHOLD_PX,\n bottom: hasOverflow && scrollTop < maxScroll - SCROLL_EDGE_THRESHOLD_PX,\n };\n}\n"],"mappings":"6CAAA,IAAM,EAA2B,EAajC,SAAgB,EAAoB,EAAuC,CACzE,GAAM,CAAE,aAAY,cAAa,eAAgB,EAC3C,EAAY,EAAc,EAC1B,EAAc,EAAY,EAEhC,MAAO,CACL,KAAM,GAAe,EAAa,EAClC,MAAO,GAAe,EAAa,EAAY,CACjD,CACF,CAGA,SAAgB,EACd,EACyB,CACzB,GAAM,CAAE,YAAW,eAAc,gBAAiB,EAC5C,EAAY,EAAe,EAC3B,EAAc,EAAY,EAEhC,MAAO,CACL,IAAK,GAAe,EAAY,EAChC,OAAQ,GAAe,EAAY,EAAY,CACjD,CACF"}
|
|
@@ -2,5 +2,11 @@ export interface ScrollFadeState {
|
|
|
2
2
|
left: boolean;
|
|
3
3
|
right: boolean;
|
|
4
4
|
}
|
|
5
|
+
export interface VerticalScrollEdgeState {
|
|
6
|
+
top: boolean;
|
|
7
|
+
bottom: boolean;
|
|
8
|
+
}
|
|
5
9
|
/** Whether a horizontal scroller is clipped on each edge. */
|
|
6
10
|
export declare function readScrollFadeState(element: HTMLElement): ScrollFadeState;
|
|
11
|
+
/** Whether a vertical scroller is clipped on each edge. */
|
|
12
|
+
export declare function readVerticalScrollEdgeState(element: HTMLElement): VerticalScrollEdgeState;
|
|
@@ -7,7 +7,14 @@ function t(t) {
|
|
|
7
7
|
right: o && n < a - e
|
|
8
8
|
};
|
|
9
9
|
}
|
|
10
|
+
function n(t) {
|
|
11
|
+
let { scrollTop: n, scrollHeight: r, clientHeight: i } = t, a = r - i, o = a > e;
|
|
12
|
+
return {
|
|
13
|
+
top: o && n > e,
|
|
14
|
+
bottom: o && n < a - e
|
|
15
|
+
};
|
|
16
|
+
}
|
|
10
17
|
//#endregion
|
|
11
|
-
export { t as readScrollFadeState };
|
|
18
|
+
export { t as readScrollFadeState, n as readVerticalScrollEdgeState };
|
|
12
19
|
|
|
13
20
|
//# sourceMappingURL=scroll-fade-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-fade-state.js","names":[],"sources":["../../src/utils/scroll-fade-state.ts"],"sourcesContent":["const SCROLL_EDGE_THRESHOLD_PX = 1;\n\nexport interface ScrollFadeState {\n left: boolean;\n right: boolean;\n}\n\n/** Whether a horizontal scroller is clipped on each edge. */\nexport function readScrollFadeState(element: HTMLElement): ScrollFadeState {\n const { scrollLeft, scrollWidth, clientWidth } = element;\n const maxScroll = scrollWidth - clientWidth;\n const hasOverflow = maxScroll > SCROLL_EDGE_THRESHOLD_PX;\n\n return {\n left: hasOverflow && scrollLeft > SCROLL_EDGE_THRESHOLD_PX,\n right: hasOverflow && scrollLeft < maxScroll - SCROLL_EDGE_THRESHOLD_PX,\n };\n}\n"],"mappings":";AAAA,IAAM,IAA2B;
|
|
1
|
+
{"version":3,"file":"scroll-fade-state.js","names":[],"sources":["../../src/utils/scroll-fade-state.ts"],"sourcesContent":["const SCROLL_EDGE_THRESHOLD_PX = 1;\n\nexport interface ScrollFadeState {\n left: boolean;\n right: boolean;\n}\n\nexport interface VerticalScrollEdgeState {\n top: boolean;\n bottom: boolean;\n}\n\n/** Whether a horizontal scroller is clipped on each edge. */\nexport function readScrollFadeState(element: HTMLElement): ScrollFadeState {\n const { scrollLeft, scrollWidth, clientWidth } = element;\n const maxScroll = scrollWidth - clientWidth;\n const hasOverflow = maxScroll > SCROLL_EDGE_THRESHOLD_PX;\n\n return {\n left: hasOverflow && scrollLeft > SCROLL_EDGE_THRESHOLD_PX,\n right: hasOverflow && scrollLeft < maxScroll - SCROLL_EDGE_THRESHOLD_PX,\n };\n}\n\n/** Whether a vertical scroller is clipped on each edge. */\nexport function readVerticalScrollEdgeState(\n element: HTMLElement,\n): VerticalScrollEdgeState {\n const { scrollTop, scrollHeight, clientHeight } = element;\n const maxScroll = scrollHeight - clientHeight;\n const hasOverflow = maxScroll > SCROLL_EDGE_THRESHOLD_PX;\n\n return {\n top: hasOverflow && scrollTop > SCROLL_EDGE_THRESHOLD_PX,\n bottom: hasOverflow && scrollTop < maxScroll - SCROLL_EDGE_THRESHOLD_PX,\n };\n}\n"],"mappings":";AAAA,IAAM,IAA2B;AAajC,SAAgB,EAAoB,GAAuC;CACzE,IAAM,EAAE,eAAY,gBAAa,mBAAgB,GAC3C,IAAY,IAAc,GAC1B,IAAc,IAAY;CAEhC,OAAO;EACL,MAAM,KAAe,IAAa;EAClC,OAAO,KAAe,IAAa,IAAY;CACjD;AACF;AAGA,SAAgB,EACd,GACyB;CACzB,IAAM,EAAE,cAAW,iBAAc,oBAAiB,GAC5C,IAAY,IAAe,GAC3B,IAAc,IAAY;CAEhC,OAAO;EACL,KAAK,KAAe,IAAY;EAChC,QAAQ,KAAe,IAAY,IAAY;CACjD;AACF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../_virtual/_rolldown/runtime.cjs");const e=require("../constants/llm-subscription.cjs"),t=require("./sdk-settings-field-metadata.cjs");var n=new Set([`llm.model`,`llm.api_key`,`llm.base_url`,e.LLM_AUTH_TYPE_KEY,e.LLM_SUBSCRIPTION_VENDOR_KEY]),r={basic:new Set([`critical`]),advanced:new Set([`critical`,`major`]),all:new Set([`critical`,`major`,`minor`])};function i(e){return!!e&&Array.isArray(e.sections)}function a(e){return i(e)?e.sections.flatMap(e=>e.fields):[]}function o(e,t){if(!e)return;let n=t.split(`.`),r=e;for(let e of n){if(typeof r!=`object`||!r)return;r=r[e]}return r}function s(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e+=1){let t=r[e];(i[t]==null||typeof i[t]!=`object`||Array.isArray(i[t]))&&(i[t]={}),i=i[t]}i[r[r.length-1]]=n}function c(e,t,n=`agent_settings`){return o(e[n],t)??null}function l(e,t){return c(e,t,`agent_settings`)}function u(e){return e.choices.length>0}function d(e){return e.prominence===`critical`}function f(e){return e.prominence===`minor`}function p(e,t){let n=t??e.default;return u(e)?n==null?``:String(n):e.value_type===`boolean`?!!(n??!1):n==null?``:e.value_type===`array`||e.value_type===`object`?JSON.stringify(n,null,2):String(n)}function m(e,t){if(t===void 0)return null;if(e.value_type===`boolean`){if(typeof t==`string`){if(t===`true`)return!0;if(t===`false`)return!1}return t===null?null:!!t}if(e.value_type===`integer`||e.value_type===`number`){if(t===``||t===null)return null;let e=typeof t==`number`?t:Number(String(t));return Number.isNaN(e)?null:e}if(e.value_type===`array`||e.value_type===`object`){if(t===null||e.value_type===`object`&&typeof t==`object`&&!Array.isArray(t)&&Object.keys(t).length===0)return null;if(typeof t==`string`){let n=t.trim();if(!n)return null;try{let t=JSON.parse(n);return e.value_type===`object`&&typeof t==`object`&&t&&!Array.isArray(t)&&Object.keys(t).length===0?null:
|
|
1
|
+
require("../_virtual/_rolldown/runtime.cjs");const e=require("../constants/llm-subscription.cjs"),t=require("./sdk-settings-field-metadata.cjs");var n=new Set([`llm.model`,`llm.api_key`,`llm.base_url`,e.LLM_AUTH_TYPE_KEY,e.LLM_SUBSCRIPTION_VENDOR_KEY]),r={basic:new Set([`critical`]),advanced:new Set([`critical`,`major`]),all:new Set([`critical`,`major`,`minor`])};function i(e){return!!e&&Array.isArray(e.sections)}function a(e){return i(e)?e.sections.flatMap(e=>e.fields):[]}function o(e,t){if(!e)return;let n=t.split(`.`),r=e;for(let e of n){if(typeof r!=`object`||!r)return;r=r[e]}return r}function s(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e+=1){let t=r[e];(i[t]==null||typeof i[t]!=`object`||Array.isArray(i[t]))&&(i[t]={}),i=i[t]}i[r[r.length-1]]=n}function c(e,t,n=`agent_settings`){return o(e[n],t)??null}function l(e,t){return c(e,t,`agent_settings`)}function u(e){return e.choices.length>0}function d(e){return e.prominence===`critical`}function f(e){return e.prominence===`minor`}function p(e,t){let n=t??e.default;return u(e)?n==null?``:String(n):e.value_type===`boolean`?!!(n??!1):n==null?``:e.value_type===`array`||e.value_type===`object`?JSON.stringify(n,null,2):String(n)}function m(e){return typeof e!=`object`||!e?JSON.stringify(e):Array.isArray(e)?`[${e.map(m).join(`,`)}]`:`{${Object.entries(e).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${JSON.stringify(e)}:${m(t)}`).join(`,`)}}`}function h(e,t){if(t===void 0)return null;if(e.value_type===`boolean`){if(typeof t==`string`){if(t===`true`)return!0;if(t===`false`)return!1}return t===null?null:!!t}if(e.value_type===`integer`||e.value_type===`number`){if(t===``||t===null)return null;let e=typeof t==`number`?t:Number(String(t));return Number.isNaN(e)?null:e}if(e.value_type===`array`||e.value_type===`object`){if(t===null||e.value_type===`object`&&typeof t==`object`&&!Array.isArray(t)&&Object.keys(t).length===0)return null;if(typeof t==`string`){let n=t.trim();if(!n)return null;try{let t=JSON.parse(n);return e.value_type===`object`&&typeof t==`object`&&t&&!Array.isArray(t)&&Object.keys(t).length===0?null:m(t)}catch{return n}}return m(t)}return t===null?null:String(t)}function g(e,t,n=`agent_settings`){let r=t??(n===`conversation_settings`?e.conversation_settings_schema:e.agent_settings_schema);return r?Object.fromEntries(a(r).map(t=>[t.key,p(t,c(e,t.key,n))])):{}}function _(e,t,n=`agent_settings`){let r=t??(n===`conversation_settings`?e.conversation_settings_schema:e.agent_settings_schema);if(!r)return`basic`;let i=!1,o=!1;for(let t of a(r))d(t)||h(t,c(e,t.key,n)??t.default??null)!==h(t,t.default??null)&&(f(t)?i=!0:o=!0);return i?`all`:o?`advanced`:`basic`}function v(e,t){return e.depends_on.every(e=>t[e]===!0)}function y(e){if(typeof e==`boolean`)return e;let t=e.trim().toLowerCase();if(!t)return null;if(t===`true`)return!0;if(t===`false`)return!1;throw Error(`Expected a boolean value, received: ${e}`)}function b(e,n){if(e.value_type===`boolean`)return y(n);if(e.value_type===`integer`||e.value_type===`number`){let r=String(n).trim();if(!r)return null;let i=Number(r);if(Number.isNaN(i))throw Error(`Expected a numeric value, received: ${r}`);if(e.value_type===`integer`&&!Number.isInteger(i))throw Error(`Expected an integer value, received: ${r}`);let a=t.getSettingsFieldConstraints(e.key);if(a?.min!=null&&i<a.min)throw Error(`${e.label} must be at least ${a.min}`);if(a?.max!=null&&i>a.max)throw Error(`${e.label} must be at most ${a.max}`);return i}if(e.value_type===`array`||e.value_type===`object`){let t=String(n).trim();if(!t)return null;let r;try{r=JSON.parse(t)}catch{throw Error(`Invalid JSON for ${e.label}`)}if(e.value_type===`array`){if(!Array.isArray(r))throw Error(`${e.label} must be a JSON array`);return r}if(r===null||Array.isArray(r)||typeof r!=`object`)throw Error(`${e.label} must be a JSON object`);return r}let r=String(n);return r===``&&!e.secret?null:r}function x(e,t,n){let r={};for(let i of a(e))n[i.key]&&s(r,i.key,b(i,t[i.key]));return r}function S(e,t){return r[t].has(e.prominence)}function C(e,t,n,r){let i=x(e,t,n);for(let t of a(e))S(t,r)||s(i,t.key,t.default??null);return i}function w(e,t,r,a=n){return i(e)?e.sections.map(e=>({...e,fields:e.fields.filter(e=>!a.has(e.key)&&S(e,r)&&v(e,t))})).filter(e=>e.fields.length>0):[]}function T(e){return e?a(e).some(e=>e.prominence===`critical`):!1}function E(e){return e?a(e).some(e=>e.prominence===`major`):!1}function D(e){return e?a(e).some(e=>e.prominence===`minor`):!1}exports.buildInitialSettingsFormValues=g,exports.buildSdkSettingsPayload=x,exports.buildSdkSettingsPayloadForView=C,exports.getAgentSettingValue=l,exports.getVisibleSettingsSections=w,exports.hasAdvancedSettings=E,exports.hasCriticalSettings=T,exports.hasMinorSettings=D,exports.inferInitialView=_,exports.isValidSettingsSchema=i,exports.normalizeComparableValue=h;
|
|
2
2
|
//# sourceMappingURL=sdk-settings-schema.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-settings-schema.cjs","names":[],"sources":["../../src/utils/sdk-settings-schema.ts"],"sourcesContent":["import {\n SettingProminence,\n Settings,\n SettingsFieldSchema,\n SettingsSchema,\n SettingsSectionSchema,\n SettingsValue,\n} from \"#/types/settings\";\nimport { getSettingsFieldConstraints } from \"#/utils/sdk-settings-field-metadata\";\nimport {\n LLM_AUTH_TYPE_KEY,\n LLM_SUBSCRIPTION_VENDOR_KEY,\n} from \"#/constants/llm-subscription\";\n\nexport type SettingsFormValues = Record<string, string | boolean>;\nexport type SettingsDirtyState = Record<string, boolean>;\nexport type SdkSettingsPayload = Record<string, SettingsValue>;\nexport type SettingsValueSource = \"agent_settings\" | \"conversation_settings\";\n\nexport type SettingsView = \"basic\" | \"advanced\" | \"all\";\n\n/** Fields that are rendered by purpose-built components instead of the\n * generic `SchemaField` renderer. */\nexport const SPECIALLY_RENDERED_KEYS = new Set([\n \"llm.model\",\n \"llm.api_key\",\n \"llm.base_url\",\n LLM_AUTH_TYPE_KEY,\n LLM_SUBSCRIPTION_VENDOR_KEY,\n]);\n\n/** Prominence tiers visible at each view level. */\nconst VIEW_PROMINENCES: Record<SettingsView, Set<SettingProminence>> = {\n basic: new Set<SettingProminence>([\"critical\"]),\n advanced: new Set<SettingProminence>([\"critical\", \"major\"]),\n all: new Set<SettingProminence>([\"critical\", \"major\", \"minor\"]),\n};\n\n/**\n * True when `schema` looks like a usable `SettingsSchema` — i.e. an\n * object with an array `sections` field. Guards every helper in this\n * module against malformed/empty schema responses (e.g. when the\n * frontend ends up pointing at a host that does not actually serve\n * `/api/settings/agent-schema`, such as an unconfigured Vercel preview\n * origin that returns the React Router SPA shell for arbitrary\n * `/api/*` paths). Without this check, `schema.sections.filter(...)`\n * inside `SdkSectionPage` blows up with\n * `Cannot read properties of undefined (reading 'filter')` and React\n * Router escalates to a full-screen error page.\n */\nexport function isValidSettingsSchema(\n schema: SettingsSchema | null | undefined,\n): schema is SettingsSchema {\n return !!schema && Array.isArray((schema as SettingsSchema).sections);\n}\n\nfunction getSchemaFields(schema: SettingsSchema): SettingsFieldSchema[] {\n if (!isValidSettingsSchema(schema)) return [];\n return schema.sections.flatMap((section) => section.fields);\n}\n\n/** Traverse a nested object using a dotted key path (e.g. \"llm.model\"). */\nfunction lookupDotted(\n obj: Record<string, unknown> | null | undefined,\n key: string,\n): unknown {\n if (!obj) return undefined;\n const parts = key.split(\".\");\n let current: unknown = obj;\n for (const part of parts) {\n if (current == null || typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\n/** Set a value in a nested object at a dotted key path (e.g. \"llm.model\"). */\nfunction setDotted(\n obj: Record<string, unknown>,\n key: string,\n value: unknown,\n): void {\n const parts = key.split(\".\");\n let current: Record<string, unknown> = obj;\n for (let i = 0; i < parts.length - 1; i += 1) {\n const part = parts[i];\n if (\n current[part] == null ||\n typeof current[part] !== \"object\" ||\n Array.isArray(current[part])\n ) {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n current[parts[parts.length - 1]] = value;\n}\n\nexport function getSettingValue(\n settings: Settings,\n key: string,\n source: SettingsValueSource = \"agent_settings\",\n): SettingsValue {\n return (lookupDotted(settings[source] as Record<string, unknown>, key) ??\n null) as SettingsValue;\n}\n\nexport function getAgentSettingValue(\n settings: Settings,\n key: string,\n): SettingsValue {\n return getSettingValue(settings, key, \"agent_settings\");\n}\n\nexport function getConversationSettingValue(\n settings: Settings,\n key: string,\n): SettingsValue {\n return getSettingValue(settings, key, \"conversation_settings\");\n}\n\nfunction isChoiceField(field: SettingsFieldSchema): boolean {\n return field.choices.length > 0;\n}\n\nfunction isCriticalField(field: SettingsFieldSchema): boolean {\n return field.prominence === \"critical\";\n}\n\nfunction isMinorField(field: SettingsFieldSchema): boolean {\n return field.prominence === \"minor\";\n}\n\nexport function normalizeFieldValue(\n field: SettingsFieldSchema,\n rawValue: unknown,\n): string | boolean {\n const resolvedValue = rawValue ?? field.default;\n\n if (isChoiceField(field)) {\n return resolvedValue === null || resolvedValue === undefined\n ? \"\"\n : String(resolvedValue);\n }\n\n if (field.value_type === \"boolean\") {\n return Boolean(resolvedValue ?? false);\n }\n\n if (resolvedValue === null || resolvedValue === undefined) {\n return \"\";\n }\n\n if (field.value_type === \"array\" || field.value_type === \"object\") {\n return JSON.stringify(resolvedValue, null, 2);\n }\n\n return String(resolvedValue);\n}\n\nfunction normalizeComparableValue(\n field: SettingsFieldSchema,\n rawValue: unknown,\n): boolean | number | string | null {\n if (rawValue === undefined) {\n return null;\n }\n\n if (field.value_type === \"boolean\") {\n if (typeof rawValue === \"string\") {\n if (rawValue === \"true\") {\n return true;\n }\n if (rawValue === \"false\") {\n return false;\n }\n }\n if (rawValue === null) {\n return null;\n }\n return Boolean(rawValue);\n }\n\n if (field.value_type === \"integer\" || field.value_type === \"number\") {\n if (rawValue === \"\" || rawValue === null) {\n return null;\n }\n\n const parsedValue =\n typeof rawValue === \"number\" ? rawValue : Number(String(rawValue));\n return Number.isNaN(parsedValue) ? null : parsedValue;\n }\n\n if (field.value_type === \"array\" || field.value_type === \"object\") {\n if (rawValue === null) {\n return null;\n }\n\n // Treat empty objects as null so that serializer artifacts\n // (e.g. mcp_config: {} vs schema default null) don't trigger\n // a spurious view escalation in inferInitialView.\n if (\n field.value_type === \"object\" &&\n typeof rawValue === \"object\" &&\n !Array.isArray(rawValue) &&\n Object.keys(rawValue as Record<string, unknown>).length === 0\n ) {\n return null;\n }\n\n if (typeof rawValue === \"string\") {\n const trimmedValue = rawValue.trim();\n if (!trimmedValue) {\n return null;\n }\n try {\n const parsed: unknown = JSON.parse(trimmedValue);\n // Also normalise stringified empty objects\n if (\n field.value_type === \"object\" &&\n parsed !== null &&\n typeof parsed === \"object\" &&\n !Array.isArray(parsed) &&\n Object.keys(parsed as Record<string, unknown>).length === 0\n ) {\n return null;\n }\n return JSON.stringify(parsed);\n } catch {\n return trimmedValue;\n }\n }\n\n return JSON.stringify(rawValue);\n }\n\n if (rawValue === null) {\n return null;\n }\n\n return String(rawValue);\n}\n\nexport function buildInitialSettingsFormValues(\n settings: Settings,\n schemaOverride?: SettingsSchema | null,\n source: SettingsValueSource = \"agent_settings\",\n): SettingsFormValues {\n const schema =\n schemaOverride ??\n (source === \"conversation_settings\"\n ? settings.conversation_settings_schema\n : settings.agent_settings_schema);\n if (!schema) {\n return {};\n }\n\n return Object.fromEntries(\n getSchemaFields(schema).map((field) => [\n field.key,\n normalizeFieldValue(field, getSettingValue(settings, field.key, source)),\n ]),\n );\n}\n\nexport function inferInitialView(\n settings: Settings,\n schemaOverride?: SettingsSchema | null,\n source: SettingsValueSource = \"agent_settings\",\n): SettingsView {\n const schema =\n schemaOverride ??\n (source === \"conversation_settings\"\n ? settings.conversation_settings_schema\n : settings.agent_settings_schema);\n if (!schema) {\n return \"basic\";\n }\n\n let hasMinorOverride = false;\n let hasMajorOverride = false;\n\n for (const field of getSchemaFields(schema)) {\n if (!isCriticalField(field)) {\n const currentValue = getSettingValue(settings, field.key, source);\n const isDifferent =\n normalizeComparableValue(\n field,\n currentValue ?? field.default ?? null,\n ) !== normalizeComparableValue(field, field.default ?? null);\n\n if (isDifferent) {\n if (isMinorField(field)) {\n hasMinorOverride = true;\n } else {\n hasMajorOverride = true;\n }\n }\n }\n }\n\n if (hasMinorOverride) return \"all\";\n if (hasMajorOverride) return \"advanced\";\n return \"basic\";\n}\n\n/** Determine which view tier to default to based on whether the user has\n * overridden any non-critical settings. */\nexport function hasAdvancedSettingsOverrides(settings: Settings): boolean {\n return inferInitialView(settings) !== \"basic\";\n}\n\nexport function isSettingsFieldVisible(\n field: SettingsFieldSchema,\n values: SettingsFormValues,\n): boolean {\n return field.depends_on.every((dependency) => values[dependency] === true);\n}\n\nfunction parseBooleanFieldValue(rawValue: string | boolean): boolean | null {\n if (typeof rawValue === \"boolean\") {\n return rawValue;\n }\n\n const normalizedValue = rawValue.trim().toLowerCase();\n if (!normalizedValue) {\n return null;\n }\n if (normalizedValue === \"true\") {\n return true;\n }\n if (normalizedValue === \"false\") {\n return false;\n }\n\n throw new Error(`Expected a boolean value, received: ${rawValue}`);\n}\n\nexport function coerceFieldValue(\n field: SettingsFieldSchema,\n rawValue: string | boolean,\n): SettingsValue {\n if (field.value_type === \"boolean\") {\n return parseBooleanFieldValue(rawValue);\n }\n\n if (field.value_type === \"integer\" || field.value_type === \"number\") {\n const stringValue = String(rawValue).trim();\n if (!stringValue) {\n return null;\n }\n\n const parsedValue = Number(stringValue);\n if (Number.isNaN(parsedValue)) {\n throw new Error(`Expected a numeric value, received: ${stringValue}`);\n }\n if (field.value_type === \"integer\" && !Number.isInteger(parsedValue)) {\n throw new Error(`Expected an integer value, received: ${stringValue}`);\n }\n\n const constraints = getSettingsFieldConstraints(field.key);\n if (constraints?.min != null && parsedValue < constraints.min) {\n throw new Error(`${field.label} must be at least ${constraints.min}`);\n }\n if (constraints?.max != null && parsedValue > constraints.max) {\n throw new Error(`${field.label} must be at most ${constraints.max}`);\n }\n\n return parsedValue;\n }\n\n if (field.value_type === \"array\" || field.value_type === \"object\") {\n const stringValue = String(rawValue).trim();\n if (!stringValue) {\n return null;\n }\n\n let parsedValue: unknown;\n try {\n parsedValue = JSON.parse(stringValue);\n } catch {\n throw new Error(`Invalid JSON for ${field.label}`);\n }\n\n if (field.value_type === \"array\") {\n if (!Array.isArray(parsedValue)) {\n throw new Error(`${field.label} must be a JSON array`);\n }\n return parsedValue as SettingsValue[];\n }\n\n if (\n parsedValue === null ||\n Array.isArray(parsedValue) ||\n typeof parsedValue !== \"object\"\n ) {\n throw new Error(`${field.label} must be a JSON object`);\n }\n\n return parsedValue as { [key: string]: SettingsValue };\n }\n\n const stringValue = String(rawValue);\n if (stringValue === \"\" && !field.secret) {\n return null;\n }\n\n return stringValue;\n}\n\nexport function buildSdkSettingsPayload(\n schema: SettingsSchema,\n values: SettingsFormValues,\n dirty: SettingsDirtyState,\n): SdkSettingsPayload {\n const payload: Record<string, unknown> = {};\n\n for (const field of getSchemaFields(schema)) {\n if (dirty[field.key]) {\n setDotted(payload, field.key, coerceFieldValue(field, values[field.key]));\n }\n }\n\n return payload as SdkSettingsPayload;\n}\n\nfunction isFieldVisibleInView(\n field: SettingsFieldSchema,\n view: SettingsView,\n): boolean {\n return VIEW_PROMINENCES[view].has(field.prominence);\n}\n\nexport function buildSdkSettingsPayloadForView(\n schema: SettingsSchema,\n values: SettingsFormValues,\n dirty: SettingsDirtyState,\n view: SettingsView,\n): SdkSettingsPayload {\n const payload = buildSdkSettingsPayload(schema, values, dirty) as Record<\n string,\n unknown\n >;\n\n for (const field of getSchemaFields(schema)) {\n if (!isFieldVisibleInView(field, view)) {\n setDotted(payload, field.key, field.default ?? null);\n }\n }\n\n return payload as SdkSettingsPayload;\n}\n\n/** Return sections with fields filtered for the current view tier.\n * Specially-rendered fields are excluded from the generic list. */\nexport function getVisibleSettingsSections(\n schema: SettingsSchema,\n values: SettingsFormValues,\n view: SettingsView,\n excludeKeys: Set<string> = SPECIALLY_RENDERED_KEYS,\n): SettingsSectionSchema[] {\n if (!isValidSettingsSchema(schema)) return [];\n return schema.sections\n .map((section) => ({\n ...section,\n fields: section.fields.filter(\n (field) =>\n !excludeKeys.has(field.key) &&\n isFieldVisibleInView(field, view) &&\n isSettingsFieldVisible(field, values),\n ),\n }))\n .filter((section) => section.fields.length > 0);\n}\n\n/** Whether the schema has any \"critical\" prominence fields (the basic tier). */\nexport function hasCriticalSettings(schema: SettingsSchema | null): boolean {\n if (!schema) return false;\n return getSchemaFields(schema).some((f) => f.prominence === \"critical\");\n}\n\n/** Whether the schema has any fields visible in the \"advanced\" tier. */\nexport function hasAdvancedSettings(schema: SettingsSchema | null): boolean {\n if (!schema) return false;\n return getSchemaFields(schema).some((f) => f.prominence === \"major\");\n}\n\n/** Whether the schema has any \"minor\" prominence fields. */\nexport function hasMinorSettings(schema: SettingsSchema | null): boolean {\n if (!schema) return false;\n return getSchemaFields(schema).some((f) => f.prominence === \"minor\");\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sdk-settings-schema.cjs","names":[],"sources":["../../src/utils/sdk-settings-schema.ts"],"sourcesContent":["import {\n SettingProminence,\n Settings,\n SettingsFieldSchema,\n SettingsSchema,\n SettingsSectionSchema,\n SettingsValue,\n} from \"#/types/settings\";\nimport { getSettingsFieldConstraints } from \"#/utils/sdk-settings-field-metadata\";\nimport {\n LLM_AUTH_TYPE_KEY,\n LLM_SUBSCRIPTION_VENDOR_KEY,\n} from \"#/constants/llm-subscription\";\n\nexport type SettingsFormValues = Record<string, string | boolean>;\nexport type SettingsDirtyState = Record<string, boolean>;\nexport type SdkSettingsPayload = Record<string, SettingsValue>;\nexport type SettingsValueSource = \"agent_settings\" | \"conversation_settings\";\n\nexport type SettingsView = \"basic\" | \"advanced\" | \"all\";\n\n/** Fields that are rendered by purpose-built components instead of the\n * generic `SchemaField` renderer. */\nexport const SPECIALLY_RENDERED_KEYS = new Set([\n \"llm.model\",\n \"llm.api_key\",\n \"llm.base_url\",\n LLM_AUTH_TYPE_KEY,\n LLM_SUBSCRIPTION_VENDOR_KEY,\n]);\n\n/** Prominence tiers visible at each view level. */\nconst VIEW_PROMINENCES: Record<SettingsView, Set<SettingProminence>> = {\n basic: new Set<SettingProminence>([\"critical\"]),\n advanced: new Set<SettingProminence>([\"critical\", \"major\"]),\n all: new Set<SettingProminence>([\"critical\", \"major\", \"minor\"]),\n};\n\n/**\n * True when `schema` looks like a usable `SettingsSchema` — i.e. an\n * object with an array `sections` field. Guards every helper in this\n * module against malformed/empty schema responses (e.g. when the\n * frontend ends up pointing at a host that does not actually serve\n * `/api/settings/agent-schema`, such as an unconfigured Vercel preview\n * origin that returns the React Router SPA shell for arbitrary\n * `/api/*` paths). Without this check, `schema.sections.filter(...)`\n * inside `SdkSectionPage` blows up with\n * `Cannot read properties of undefined (reading 'filter')` and React\n * Router escalates to a full-screen error page.\n */\nexport function isValidSettingsSchema(\n schema: SettingsSchema | null | undefined,\n): schema is SettingsSchema {\n return !!schema && Array.isArray((schema as SettingsSchema).sections);\n}\n\nfunction getSchemaFields(schema: SettingsSchema): SettingsFieldSchema[] {\n if (!isValidSettingsSchema(schema)) return [];\n return schema.sections.flatMap((section) => section.fields);\n}\n\n/** Traverse a nested object using a dotted key path (e.g. \"llm.model\"). */\nfunction lookupDotted(\n obj: Record<string, unknown> | null | undefined,\n key: string,\n): unknown {\n if (!obj) return undefined;\n const parts = key.split(\".\");\n let current: unknown = obj;\n for (const part of parts) {\n if (current == null || typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\n/** Set a value in a nested object at a dotted key path (e.g. \"llm.model\"). */\nfunction setDotted(\n obj: Record<string, unknown>,\n key: string,\n value: unknown,\n): void {\n const parts = key.split(\".\");\n let current: Record<string, unknown> = obj;\n for (let i = 0; i < parts.length - 1; i += 1) {\n const part = parts[i];\n if (\n current[part] == null ||\n typeof current[part] !== \"object\" ||\n Array.isArray(current[part])\n ) {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n current[parts[parts.length - 1]] = value;\n}\n\nexport function getSettingValue(\n settings: Settings,\n key: string,\n source: SettingsValueSource = \"agent_settings\",\n): SettingsValue {\n return (lookupDotted(settings[source] as Record<string, unknown>, key) ??\n null) as SettingsValue;\n}\n\nexport function getAgentSettingValue(\n settings: Settings,\n key: string,\n): SettingsValue {\n return getSettingValue(settings, key, \"agent_settings\");\n}\n\nexport function getConversationSettingValue(\n settings: Settings,\n key: string,\n): SettingsValue {\n return getSettingValue(settings, key, \"conversation_settings\");\n}\n\nfunction isChoiceField(field: SettingsFieldSchema): boolean {\n return field.choices.length > 0;\n}\n\nfunction isCriticalField(field: SettingsFieldSchema): boolean {\n return field.prominence === \"critical\";\n}\n\nfunction isMinorField(field: SettingsFieldSchema): boolean {\n return field.prominence === \"minor\";\n}\n\nexport function normalizeFieldValue(\n field: SettingsFieldSchema,\n rawValue: unknown,\n): string | boolean {\n const resolvedValue = rawValue ?? field.default;\n\n if (isChoiceField(field)) {\n return resolvedValue === null || resolvedValue === undefined\n ? \"\"\n : String(resolvedValue);\n }\n\n if (field.value_type === \"boolean\") {\n return Boolean(resolvedValue ?? false);\n }\n\n if (resolvedValue === null || resolvedValue === undefined) {\n return \"\";\n }\n\n if (field.value_type === \"array\" || field.value_type === \"object\") {\n return JSON.stringify(resolvedValue, null, 2);\n }\n\n return String(resolvedValue);\n}\n\nfunction stableJsonStringify(value: unknown): string {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n return `[${value.map(stableJsonStringify).join(\",\")}]`;\n }\n\n const sortedEntries = Object.entries(value as Record<string, unknown>).sort(\n ([leftKey], [rightKey]) => leftKey.localeCompare(rightKey),\n );\n\n return `{${sortedEntries\n .map(\n ([key, entryValue]) =>\n `${JSON.stringify(key)}:${stableJsonStringify(entryValue)}`,\n )\n .join(\",\")}}`;\n}\n\nexport function normalizeComparableValue(\n field: SettingsFieldSchema,\n rawValue: unknown,\n): boolean | number | string | null {\n if (rawValue === undefined) {\n return null;\n }\n\n if (field.value_type === \"boolean\") {\n if (typeof rawValue === \"string\") {\n if (rawValue === \"true\") {\n return true;\n }\n if (rawValue === \"false\") {\n return false;\n }\n }\n if (rawValue === null) {\n return null;\n }\n return Boolean(rawValue);\n }\n\n if (field.value_type === \"integer\" || field.value_type === \"number\") {\n if (rawValue === \"\" || rawValue === null) {\n return null;\n }\n\n const parsedValue =\n typeof rawValue === \"number\" ? rawValue : Number(String(rawValue));\n return Number.isNaN(parsedValue) ? null : parsedValue;\n }\n\n if (field.value_type === \"array\" || field.value_type === \"object\") {\n if (rawValue === null) {\n return null;\n }\n\n // Treat empty objects as null so that serializer artifacts\n // (e.g. mcp_config: {} vs schema default null) don't trigger\n // a spurious view escalation in inferInitialView.\n if (\n field.value_type === \"object\" &&\n typeof rawValue === \"object\" &&\n !Array.isArray(rawValue) &&\n Object.keys(rawValue as Record<string, unknown>).length === 0\n ) {\n return null;\n }\n\n if (typeof rawValue === \"string\") {\n const trimmedValue = rawValue.trim();\n if (!trimmedValue) {\n return null;\n }\n try {\n const parsed: unknown = JSON.parse(trimmedValue);\n // Also normalise stringified empty objects\n if (\n field.value_type === \"object\" &&\n parsed !== null &&\n typeof parsed === \"object\" &&\n !Array.isArray(parsed) &&\n Object.keys(parsed as Record<string, unknown>).length === 0\n ) {\n return null;\n }\n return stableJsonStringify(parsed);\n } catch {\n return trimmedValue;\n }\n }\n\n return stableJsonStringify(rawValue);\n }\n\n if (rawValue === null) {\n return null;\n }\n\n return String(rawValue);\n}\n\nexport function buildInitialSettingsFormValues(\n settings: Settings,\n schemaOverride?: SettingsSchema | null,\n source: SettingsValueSource = \"agent_settings\",\n): SettingsFormValues {\n const schema =\n schemaOverride ??\n (source === \"conversation_settings\"\n ? settings.conversation_settings_schema\n : settings.agent_settings_schema);\n if (!schema) {\n return {};\n }\n\n return Object.fromEntries(\n getSchemaFields(schema).map((field) => [\n field.key,\n normalizeFieldValue(field, getSettingValue(settings, field.key, source)),\n ]),\n );\n}\n\nexport function inferInitialView(\n settings: Settings,\n schemaOverride?: SettingsSchema | null,\n source: SettingsValueSource = \"agent_settings\",\n): SettingsView {\n const schema =\n schemaOverride ??\n (source === \"conversation_settings\"\n ? settings.conversation_settings_schema\n : settings.agent_settings_schema);\n if (!schema) {\n return \"basic\";\n }\n\n let hasMinorOverride = false;\n let hasMajorOverride = false;\n\n for (const field of getSchemaFields(schema)) {\n if (!isCriticalField(field)) {\n const currentValue = getSettingValue(settings, field.key, source);\n const isDifferent =\n normalizeComparableValue(\n field,\n currentValue ?? field.default ?? null,\n ) !== normalizeComparableValue(field, field.default ?? null);\n\n if (isDifferent) {\n if (isMinorField(field)) {\n hasMinorOverride = true;\n } else {\n hasMajorOverride = true;\n }\n }\n }\n }\n\n if (hasMinorOverride) return \"all\";\n if (hasMajorOverride) return \"advanced\";\n return \"basic\";\n}\n\n/** Determine which view tier to default to based on whether the user has\n * overridden any non-critical settings. */\nexport function hasAdvancedSettingsOverrides(settings: Settings): boolean {\n return inferInitialView(settings) !== \"basic\";\n}\n\nexport function isSettingsFieldVisible(\n field: SettingsFieldSchema,\n values: SettingsFormValues,\n): boolean {\n return field.depends_on.every((dependency) => values[dependency] === true);\n}\n\nfunction parseBooleanFieldValue(rawValue: string | boolean): boolean | null {\n if (typeof rawValue === \"boolean\") {\n return rawValue;\n }\n\n const normalizedValue = rawValue.trim().toLowerCase();\n if (!normalizedValue) {\n return null;\n }\n if (normalizedValue === \"true\") {\n return true;\n }\n if (normalizedValue === \"false\") {\n return false;\n }\n\n throw new Error(`Expected a boolean value, received: ${rawValue}`);\n}\n\nexport function coerceFieldValue(\n field: SettingsFieldSchema,\n rawValue: string | boolean,\n): SettingsValue {\n if (field.value_type === \"boolean\") {\n return parseBooleanFieldValue(rawValue);\n }\n\n if (field.value_type === \"integer\" || field.value_type === \"number\") {\n const stringValue = String(rawValue).trim();\n if (!stringValue) {\n return null;\n }\n\n const parsedValue = Number(stringValue);\n if (Number.isNaN(parsedValue)) {\n throw new Error(`Expected a numeric value, received: ${stringValue}`);\n }\n if (field.value_type === \"integer\" && !Number.isInteger(parsedValue)) {\n throw new Error(`Expected an integer value, received: ${stringValue}`);\n }\n\n const constraints = getSettingsFieldConstraints(field.key);\n if (constraints?.min != null && parsedValue < constraints.min) {\n throw new Error(`${field.label} must be at least ${constraints.min}`);\n }\n if (constraints?.max != null && parsedValue > constraints.max) {\n throw new Error(`${field.label} must be at most ${constraints.max}`);\n }\n\n return parsedValue;\n }\n\n if (field.value_type === \"array\" || field.value_type === \"object\") {\n const stringValue = String(rawValue).trim();\n if (!stringValue) {\n return null;\n }\n\n let parsedValue: unknown;\n try {\n parsedValue = JSON.parse(stringValue);\n } catch {\n throw new Error(`Invalid JSON for ${field.label}`);\n }\n\n if (field.value_type === \"array\") {\n if (!Array.isArray(parsedValue)) {\n throw new Error(`${field.label} must be a JSON array`);\n }\n return parsedValue as SettingsValue[];\n }\n\n if (\n parsedValue === null ||\n Array.isArray(parsedValue) ||\n typeof parsedValue !== \"object\"\n ) {\n throw new Error(`${field.label} must be a JSON object`);\n }\n\n return parsedValue as { [key: string]: SettingsValue };\n }\n\n const stringValue = String(rawValue);\n if (stringValue === \"\" && !field.secret) {\n return null;\n }\n\n return stringValue;\n}\n\nexport function buildSdkSettingsPayload(\n schema: SettingsSchema,\n values: SettingsFormValues,\n dirty: SettingsDirtyState,\n): SdkSettingsPayload {\n const payload: Record<string, unknown> = {};\n\n for (const field of getSchemaFields(schema)) {\n if (dirty[field.key]) {\n setDotted(payload, field.key, coerceFieldValue(field, values[field.key]));\n }\n }\n\n return payload as SdkSettingsPayload;\n}\n\nfunction isFieldVisibleInView(\n field: SettingsFieldSchema,\n view: SettingsView,\n): boolean {\n return VIEW_PROMINENCES[view].has(field.prominence);\n}\n\nexport function buildSdkSettingsPayloadForView(\n schema: SettingsSchema,\n values: SettingsFormValues,\n dirty: SettingsDirtyState,\n view: SettingsView,\n): SdkSettingsPayload {\n const payload = buildSdkSettingsPayload(schema, values, dirty) as Record<\n string,\n unknown\n >;\n\n for (const field of getSchemaFields(schema)) {\n if (!isFieldVisibleInView(field, view)) {\n setDotted(payload, field.key, field.default ?? null);\n }\n }\n\n return payload as SdkSettingsPayload;\n}\n\n/** Return sections with fields filtered for the current view tier.\n * Specially-rendered fields are excluded from the generic list. */\nexport function getVisibleSettingsSections(\n schema: SettingsSchema,\n values: SettingsFormValues,\n view: SettingsView,\n excludeKeys: Set<string> = SPECIALLY_RENDERED_KEYS,\n): SettingsSectionSchema[] {\n if (!isValidSettingsSchema(schema)) return [];\n return schema.sections\n .map((section) => ({\n ...section,\n fields: section.fields.filter(\n (field) =>\n !excludeKeys.has(field.key) &&\n isFieldVisibleInView(field, view) &&\n isSettingsFieldVisible(field, values),\n ),\n }))\n .filter((section) => section.fields.length > 0);\n}\n\n/** Whether the schema has any \"critical\" prominence fields (the basic tier). */\nexport function hasCriticalSettings(schema: SettingsSchema | null): boolean {\n if (!schema) return false;\n return getSchemaFields(schema).some((f) => f.prominence === \"critical\");\n}\n\n/** Whether the schema has any fields visible in the \"advanced\" tier. */\nexport function hasAdvancedSettings(schema: SettingsSchema | null): boolean {\n if (!schema) return false;\n return getSchemaFields(schema).some((f) => f.prominence === \"major\");\n}\n\n/** Whether the schema has any \"minor\" prominence fields. */\nexport function hasMinorSettings(schema: SettingsSchema | null): boolean {\n if (!schema) return false;\n return getSchemaFields(schema).some((f) => f.prominence === \"minor\");\n}\n"],"mappings":"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"}
|
|
@@ -24,6 +24,7 @@ export declare function getSettingValue(settings: Settings, key: string, source?
|
|
|
24
24
|
export declare function getAgentSettingValue(settings: Settings, key: string): SettingsValue;
|
|
25
25
|
export declare function getConversationSettingValue(settings: Settings, key: string): SettingsValue;
|
|
26
26
|
export declare function normalizeFieldValue(field: SettingsFieldSchema, rawValue: unknown): string | boolean;
|
|
27
|
+
export declare function normalizeComparableValue(field: SettingsFieldSchema, rawValue: unknown): boolean | number | string | null;
|
|
27
28
|
export declare function buildInitialSettingsFormValues(settings: Settings, schemaOverride?: SettingsSchema | null, source?: SettingsValueSource): SettingsFormValues;
|
|
28
29
|
export declare function inferInitialView(settings: Settings, schemaOverride?: SettingsSchema | null, source?: SettingsValueSource): SettingsView;
|
|
29
30
|
/** Determine which view tier to default to based on whether the user has
|
|
@@ -58,7 +58,10 @@ function m(e, t) {
|
|
|
58
58
|
let n = t ?? e.default;
|
|
59
59
|
return d(e) ? n == null ? "" : String(n) : e.value_type === "boolean" ? !!(n ?? !1) : n == null ? "" : e.value_type === "array" || e.value_type === "object" ? JSON.stringify(n, null, 2) : String(n);
|
|
60
60
|
}
|
|
61
|
-
function h(e
|
|
61
|
+
function h(e) {
|
|
62
|
+
return typeof e != "object" || !e ? JSON.stringify(e) : Array.isArray(e) ? `[${e.map(h).join(",")}]` : `{${Object.entries(e).sort(([e], [t]) => e.localeCompare(t)).map(([e, t]) => `${JSON.stringify(e)}:${h(t)}`).join(",")}}`;
|
|
63
|
+
}
|
|
64
|
+
function g(e, t) {
|
|
62
65
|
if (t === void 0) return null;
|
|
63
66
|
if (e.value_type === "boolean") {
|
|
64
67
|
if (typeof t == "string") {
|
|
@@ -79,30 +82,30 @@ function h(e, t) {
|
|
|
79
82
|
if (!n) return null;
|
|
80
83
|
try {
|
|
81
84
|
let t = JSON.parse(n);
|
|
82
|
-
return e.value_type === "object" && typeof t == "object" && t && !Array.isArray(t) && Object.keys(t).length === 0 ? null :
|
|
85
|
+
return e.value_type === "object" && typeof t == "object" && t && !Array.isArray(t) && Object.keys(t).length === 0 ? null : h(t);
|
|
83
86
|
} catch {
|
|
84
87
|
return n;
|
|
85
88
|
}
|
|
86
89
|
}
|
|
87
|
-
return
|
|
90
|
+
return h(t);
|
|
88
91
|
}
|
|
89
92
|
return t === null ? null : String(t);
|
|
90
93
|
}
|
|
91
|
-
function
|
|
94
|
+
function _(e, t, n = "agent_settings") {
|
|
92
95
|
let r = t ?? (n === "conversation_settings" ? e.conversation_settings_schema : e.agent_settings_schema);
|
|
93
96
|
return r ? Object.fromEntries(o(r).map((t) => [t.key, m(t, l(e, t.key, n))])) : {};
|
|
94
97
|
}
|
|
95
|
-
function
|
|
98
|
+
function v(e, t, n = "agent_settings") {
|
|
96
99
|
let r = t ?? (n === "conversation_settings" ? e.conversation_settings_schema : e.agent_settings_schema);
|
|
97
100
|
if (!r) return "basic";
|
|
98
101
|
let i = !1, a = !1;
|
|
99
|
-
for (let t of o(r)) f(t) ||
|
|
102
|
+
for (let t of o(r)) f(t) || g(t, l(e, t.key, n) ?? t.default ?? null) !== g(t, t.default ?? null) && (p(t) ? i = !0 : a = !0);
|
|
100
103
|
return i ? "all" : a ? "advanced" : "basic";
|
|
101
104
|
}
|
|
102
|
-
function
|
|
105
|
+
function y(e, t) {
|
|
103
106
|
return e.depends_on.every((e) => t[e] === !0);
|
|
104
107
|
}
|
|
105
|
-
function
|
|
108
|
+
function b(e) {
|
|
106
109
|
if (typeof e == "boolean") return e;
|
|
107
110
|
let t = e.trim().toLowerCase();
|
|
108
111
|
if (!t) return null;
|
|
@@ -110,8 +113,8 @@ function y(e) {
|
|
|
110
113
|
if (t === "false") return !1;
|
|
111
114
|
throw Error(`Expected a boolean value, received: ${e}`);
|
|
112
115
|
}
|
|
113
|
-
function
|
|
114
|
-
if (e.value_type === "boolean") return
|
|
116
|
+
function x(e, t) {
|
|
117
|
+
if (e.value_type === "boolean") return b(t);
|
|
115
118
|
if (e.value_type === "integer" || e.value_type === "number") {
|
|
116
119
|
let r = String(t).trim();
|
|
117
120
|
if (!r) return null;
|
|
@@ -142,35 +145,35 @@ function b(e, t) {
|
|
|
142
145
|
let r = String(t);
|
|
143
146
|
return r === "" && !e.secret ? null : r;
|
|
144
147
|
}
|
|
145
|
-
function
|
|
148
|
+
function S(e, t, n) {
|
|
146
149
|
let r = {};
|
|
147
|
-
for (let i of o(e)) n[i.key] && c(r, i.key,
|
|
150
|
+
for (let i of o(e)) n[i.key] && c(r, i.key, x(i, t[i.key]));
|
|
148
151
|
return r;
|
|
149
152
|
}
|
|
150
|
-
function
|
|
153
|
+
function C(e, t) {
|
|
151
154
|
return i[t].has(e.prominence);
|
|
152
155
|
}
|
|
153
|
-
function
|
|
154
|
-
let i =
|
|
155
|
-
for (let t of o(e))
|
|
156
|
+
function w(e, t, n, r) {
|
|
157
|
+
let i = S(e, t, n);
|
|
158
|
+
for (let t of o(e)) C(t, r) || c(i, t.key, t.default ?? null);
|
|
156
159
|
return i;
|
|
157
160
|
}
|
|
158
|
-
function
|
|
161
|
+
function T(e, t, n, i = r) {
|
|
159
162
|
return a(e) ? e.sections.map((e) => ({
|
|
160
163
|
...e,
|
|
161
|
-
fields: e.fields.filter((e) => !i.has(e.key) &&
|
|
164
|
+
fields: e.fields.filter((e) => !i.has(e.key) && C(e, n) && y(e, t))
|
|
162
165
|
})).filter((e) => e.fields.length > 0) : [];
|
|
163
166
|
}
|
|
164
|
-
function
|
|
167
|
+
function E(e) {
|
|
165
168
|
return e ? o(e).some((e) => e.prominence === "critical") : !1;
|
|
166
169
|
}
|
|
167
|
-
function
|
|
170
|
+
function D(e) {
|
|
168
171
|
return e ? o(e).some((e) => e.prominence === "major") : !1;
|
|
169
172
|
}
|
|
170
|
-
function
|
|
173
|
+
function O(e) {
|
|
171
174
|
return e ? o(e).some((e) => e.prominence === "minor") : !1;
|
|
172
175
|
}
|
|
173
176
|
//#endregion
|
|
174
|
-
export {
|
|
177
|
+
export { _ as buildInitialSettingsFormValues, S as buildSdkSettingsPayload, w as buildSdkSettingsPayloadForView, u as getAgentSettingValue, T as getVisibleSettingsSections, D as hasAdvancedSettings, E as hasCriticalSettings, O as hasMinorSettings, v as inferInitialView, a as isValidSettingsSchema, g as normalizeComparableValue };
|
|
175
178
|
|
|
176
179
|
//# sourceMappingURL=sdk-settings-schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-settings-schema.js","names":[],"sources":["../../src/utils/sdk-settings-schema.ts"],"sourcesContent":["import {\n SettingProminence,\n Settings,\n SettingsFieldSchema,\n SettingsSchema,\n SettingsSectionSchema,\n SettingsValue,\n} from \"#/types/settings\";\nimport { getSettingsFieldConstraints } from \"#/utils/sdk-settings-field-metadata\";\nimport {\n LLM_AUTH_TYPE_KEY,\n LLM_SUBSCRIPTION_VENDOR_KEY,\n} from \"#/constants/llm-subscription\";\n\nexport type SettingsFormValues = Record<string, string | boolean>;\nexport type SettingsDirtyState = Record<string, boolean>;\nexport type SdkSettingsPayload = Record<string, SettingsValue>;\nexport type SettingsValueSource = \"agent_settings\" | \"conversation_settings\";\n\nexport type SettingsView = \"basic\" | \"advanced\" | \"all\";\n\n/** Fields that are rendered by purpose-built components instead of the\n * generic `SchemaField` renderer. */\nexport const SPECIALLY_RENDERED_KEYS = new Set([\n \"llm.model\",\n \"llm.api_key\",\n \"llm.base_url\",\n LLM_AUTH_TYPE_KEY,\n LLM_SUBSCRIPTION_VENDOR_KEY,\n]);\n\n/** Prominence tiers visible at each view level. */\nconst VIEW_PROMINENCES: Record<SettingsView, Set<SettingProminence>> = {\n basic: new Set<SettingProminence>([\"critical\"]),\n advanced: new Set<SettingProminence>([\"critical\", \"major\"]),\n all: new Set<SettingProminence>([\"critical\", \"major\", \"minor\"]),\n};\n\n/**\n * True when `schema` looks like a usable `SettingsSchema` — i.e. an\n * object with an array `sections` field. Guards every helper in this\n * module against malformed/empty schema responses (e.g. when the\n * frontend ends up pointing at a host that does not actually serve\n * `/api/settings/agent-schema`, such as an unconfigured Vercel preview\n * origin that returns the React Router SPA shell for arbitrary\n * `/api/*` paths). Without this check, `schema.sections.filter(...)`\n * inside `SdkSectionPage` blows up with\n * `Cannot read properties of undefined (reading 'filter')` and React\n * Router escalates to a full-screen error page.\n */\nexport function isValidSettingsSchema(\n schema: SettingsSchema | null | undefined,\n): schema is SettingsSchema {\n return !!schema && Array.isArray((schema as SettingsSchema).sections);\n}\n\nfunction getSchemaFields(schema: SettingsSchema): SettingsFieldSchema[] {\n if (!isValidSettingsSchema(schema)) return [];\n return schema.sections.flatMap((section) => section.fields);\n}\n\n/** Traverse a nested object using a dotted key path (e.g. \"llm.model\"). */\nfunction lookupDotted(\n obj: Record<string, unknown> | null | undefined,\n key: string,\n): unknown {\n if (!obj) return undefined;\n const parts = key.split(\".\");\n let current: unknown = obj;\n for (const part of parts) {\n if (current == null || typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\n/** Set a value in a nested object at a dotted key path (e.g. \"llm.model\"). */\nfunction setDotted(\n obj: Record<string, unknown>,\n key: string,\n value: unknown,\n): void {\n const parts = key.split(\".\");\n let current: Record<string, unknown> = obj;\n for (let i = 0; i < parts.length - 1; i += 1) {\n const part = parts[i];\n if (\n current[part] == null ||\n typeof current[part] !== \"object\" ||\n Array.isArray(current[part])\n ) {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n current[parts[parts.length - 1]] = value;\n}\n\nexport function getSettingValue(\n settings: Settings,\n key: string,\n source: SettingsValueSource = \"agent_settings\",\n): SettingsValue {\n return (lookupDotted(settings[source] as Record<string, unknown>, key) ??\n null) as SettingsValue;\n}\n\nexport function getAgentSettingValue(\n settings: Settings,\n key: string,\n): SettingsValue {\n return getSettingValue(settings, key, \"agent_settings\");\n}\n\nexport function getConversationSettingValue(\n settings: Settings,\n key: string,\n): SettingsValue {\n return getSettingValue(settings, key, \"conversation_settings\");\n}\n\nfunction isChoiceField(field: SettingsFieldSchema): boolean {\n return field.choices.length > 0;\n}\n\nfunction isCriticalField(field: SettingsFieldSchema): boolean {\n return field.prominence === \"critical\";\n}\n\nfunction isMinorField(field: SettingsFieldSchema): boolean {\n return field.prominence === \"minor\";\n}\n\nexport function normalizeFieldValue(\n field: SettingsFieldSchema,\n rawValue: unknown,\n): string | boolean {\n const resolvedValue = rawValue ?? field.default;\n\n if (isChoiceField(field)) {\n return resolvedValue === null || resolvedValue === undefined\n ? \"\"\n : String(resolvedValue);\n }\n\n if (field.value_type === \"boolean\") {\n return Boolean(resolvedValue ?? false);\n }\n\n if (resolvedValue === null || resolvedValue === undefined) {\n return \"\";\n }\n\n if (field.value_type === \"array\" || field.value_type === \"object\") {\n return JSON.stringify(resolvedValue, null, 2);\n }\n\n return String(resolvedValue);\n}\n\nfunction normalizeComparableValue(\n field: SettingsFieldSchema,\n rawValue: unknown,\n): boolean | number | string | null {\n if (rawValue === undefined) {\n return null;\n }\n\n if (field.value_type === \"boolean\") {\n if (typeof rawValue === \"string\") {\n if (rawValue === \"true\") {\n return true;\n }\n if (rawValue === \"false\") {\n return false;\n }\n }\n if (rawValue === null) {\n return null;\n }\n return Boolean(rawValue);\n }\n\n if (field.value_type === \"integer\" || field.value_type === \"number\") {\n if (rawValue === \"\" || rawValue === null) {\n return null;\n }\n\n const parsedValue =\n typeof rawValue === \"number\" ? rawValue : Number(String(rawValue));\n return Number.isNaN(parsedValue) ? null : parsedValue;\n }\n\n if (field.value_type === \"array\" || field.value_type === \"object\") {\n if (rawValue === null) {\n return null;\n }\n\n // Treat empty objects as null so that serializer artifacts\n // (e.g. mcp_config: {} vs schema default null) don't trigger\n // a spurious view escalation in inferInitialView.\n if (\n field.value_type === \"object\" &&\n typeof rawValue === \"object\" &&\n !Array.isArray(rawValue) &&\n Object.keys(rawValue as Record<string, unknown>).length === 0\n ) {\n return null;\n }\n\n if (typeof rawValue === \"string\") {\n const trimmedValue = rawValue.trim();\n if (!trimmedValue) {\n return null;\n }\n try {\n const parsed: unknown = JSON.parse(trimmedValue);\n // Also normalise stringified empty objects\n if (\n field.value_type === \"object\" &&\n parsed !== null &&\n typeof parsed === \"object\" &&\n !Array.isArray(parsed) &&\n Object.keys(parsed as Record<string, unknown>).length === 0\n ) {\n return null;\n }\n return JSON.stringify(parsed);\n } catch {\n return trimmedValue;\n }\n }\n\n return JSON.stringify(rawValue);\n }\n\n if (rawValue === null) {\n return null;\n }\n\n return String(rawValue);\n}\n\nexport function buildInitialSettingsFormValues(\n settings: Settings,\n schemaOverride?: SettingsSchema | null,\n source: SettingsValueSource = \"agent_settings\",\n): SettingsFormValues {\n const schema =\n schemaOverride ??\n (source === \"conversation_settings\"\n ? settings.conversation_settings_schema\n : settings.agent_settings_schema);\n if (!schema) {\n return {};\n }\n\n return Object.fromEntries(\n getSchemaFields(schema).map((field) => [\n field.key,\n normalizeFieldValue(field, getSettingValue(settings, field.key, source)),\n ]),\n );\n}\n\nexport function inferInitialView(\n settings: Settings,\n schemaOverride?: SettingsSchema | null,\n source: SettingsValueSource = \"agent_settings\",\n): SettingsView {\n const schema =\n schemaOverride ??\n (source === \"conversation_settings\"\n ? settings.conversation_settings_schema\n : settings.agent_settings_schema);\n if (!schema) {\n return \"basic\";\n }\n\n let hasMinorOverride = false;\n let hasMajorOverride = false;\n\n for (const field of getSchemaFields(schema)) {\n if (!isCriticalField(field)) {\n const currentValue = getSettingValue(settings, field.key, source);\n const isDifferent =\n normalizeComparableValue(\n field,\n currentValue ?? field.default ?? null,\n ) !== normalizeComparableValue(field, field.default ?? null);\n\n if (isDifferent) {\n if (isMinorField(field)) {\n hasMinorOverride = true;\n } else {\n hasMajorOverride = true;\n }\n }\n }\n }\n\n if (hasMinorOverride) return \"all\";\n if (hasMajorOverride) return \"advanced\";\n return \"basic\";\n}\n\n/** Determine which view tier to default to based on whether the user has\n * overridden any non-critical settings. */\nexport function hasAdvancedSettingsOverrides(settings: Settings): boolean {\n return inferInitialView(settings) !== \"basic\";\n}\n\nexport function isSettingsFieldVisible(\n field: SettingsFieldSchema,\n values: SettingsFormValues,\n): boolean {\n return field.depends_on.every((dependency) => values[dependency] === true);\n}\n\nfunction parseBooleanFieldValue(rawValue: string | boolean): boolean | null {\n if (typeof rawValue === \"boolean\") {\n return rawValue;\n }\n\n const normalizedValue = rawValue.trim().toLowerCase();\n if (!normalizedValue) {\n return null;\n }\n if (normalizedValue === \"true\") {\n return true;\n }\n if (normalizedValue === \"false\") {\n return false;\n }\n\n throw new Error(`Expected a boolean value, received: ${rawValue}`);\n}\n\nexport function coerceFieldValue(\n field: SettingsFieldSchema,\n rawValue: string | boolean,\n): SettingsValue {\n if (field.value_type === \"boolean\") {\n return parseBooleanFieldValue(rawValue);\n }\n\n if (field.value_type === \"integer\" || field.value_type === \"number\") {\n const stringValue = String(rawValue).trim();\n if (!stringValue) {\n return null;\n }\n\n const parsedValue = Number(stringValue);\n if (Number.isNaN(parsedValue)) {\n throw new Error(`Expected a numeric value, received: ${stringValue}`);\n }\n if (field.value_type === \"integer\" && !Number.isInteger(parsedValue)) {\n throw new Error(`Expected an integer value, received: ${stringValue}`);\n }\n\n const constraints = getSettingsFieldConstraints(field.key);\n if (constraints?.min != null && parsedValue < constraints.min) {\n throw new Error(`${field.label} must be at least ${constraints.min}`);\n }\n if (constraints?.max != null && parsedValue > constraints.max) {\n throw new Error(`${field.label} must be at most ${constraints.max}`);\n }\n\n return parsedValue;\n }\n\n if (field.value_type === \"array\" || field.value_type === \"object\") {\n const stringValue = String(rawValue).trim();\n if (!stringValue) {\n return null;\n }\n\n let parsedValue: unknown;\n try {\n parsedValue = JSON.parse(stringValue);\n } catch {\n throw new Error(`Invalid JSON for ${field.label}`);\n }\n\n if (field.value_type === \"array\") {\n if (!Array.isArray(parsedValue)) {\n throw new Error(`${field.label} must be a JSON array`);\n }\n return parsedValue as SettingsValue[];\n }\n\n if (\n parsedValue === null ||\n Array.isArray(parsedValue) ||\n typeof parsedValue !== \"object\"\n ) {\n throw new Error(`${field.label} must be a JSON object`);\n }\n\n return parsedValue as { [key: string]: SettingsValue };\n }\n\n const stringValue = String(rawValue);\n if (stringValue === \"\" && !field.secret) {\n return null;\n }\n\n return stringValue;\n}\n\nexport function buildSdkSettingsPayload(\n schema: SettingsSchema,\n values: SettingsFormValues,\n dirty: SettingsDirtyState,\n): SdkSettingsPayload {\n const payload: Record<string, unknown> = {};\n\n for (const field of getSchemaFields(schema)) {\n if (dirty[field.key]) {\n setDotted(payload, field.key, coerceFieldValue(field, values[field.key]));\n }\n }\n\n return payload as SdkSettingsPayload;\n}\n\nfunction isFieldVisibleInView(\n field: SettingsFieldSchema,\n view: SettingsView,\n): boolean {\n return VIEW_PROMINENCES[view].has(field.prominence);\n}\n\nexport function buildSdkSettingsPayloadForView(\n schema: SettingsSchema,\n values: SettingsFormValues,\n dirty: SettingsDirtyState,\n view: SettingsView,\n): SdkSettingsPayload {\n const payload = buildSdkSettingsPayload(schema, values, dirty) as Record<\n string,\n unknown\n >;\n\n for (const field of getSchemaFields(schema)) {\n if (!isFieldVisibleInView(field, view)) {\n setDotted(payload, field.key, field.default ?? null);\n }\n }\n\n return payload as SdkSettingsPayload;\n}\n\n/** Return sections with fields filtered for the current view tier.\n * Specially-rendered fields are excluded from the generic list. */\nexport function getVisibleSettingsSections(\n schema: SettingsSchema,\n values: SettingsFormValues,\n view: SettingsView,\n excludeKeys: Set<string> = SPECIALLY_RENDERED_KEYS,\n): SettingsSectionSchema[] {\n if (!isValidSettingsSchema(schema)) return [];\n return schema.sections\n .map((section) => ({\n ...section,\n fields: section.fields.filter(\n (field) =>\n !excludeKeys.has(field.key) &&\n isFieldVisibleInView(field, view) &&\n isSettingsFieldVisible(field, values),\n ),\n }))\n .filter((section) => section.fields.length > 0);\n}\n\n/** Whether the schema has any \"critical\" prominence fields (the basic tier). */\nexport function hasCriticalSettings(schema: SettingsSchema | null): boolean {\n if (!schema) return false;\n return getSchemaFields(schema).some((f) => f.prominence === \"critical\");\n}\n\n/** Whether the schema has any fields visible in the \"advanced\" tier. */\nexport function hasAdvancedSettings(schema: SettingsSchema | null): boolean {\n if (!schema) return false;\n return getSchemaFields(schema).some((f) => f.prominence === \"major\");\n}\n\n/** Whether the schema has any \"minor\" prominence fields. */\nexport function hasMinorSettings(schema: SettingsSchema | null): boolean {\n if (!schema) return false;\n return getSchemaFields(schema).some((f) => f.prominence === \"minor\");\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sdk-settings-schema.js","names":[],"sources":["../../src/utils/sdk-settings-schema.ts"],"sourcesContent":["import {\n SettingProminence,\n Settings,\n SettingsFieldSchema,\n SettingsSchema,\n SettingsSectionSchema,\n SettingsValue,\n} from \"#/types/settings\";\nimport { getSettingsFieldConstraints } from \"#/utils/sdk-settings-field-metadata\";\nimport {\n LLM_AUTH_TYPE_KEY,\n LLM_SUBSCRIPTION_VENDOR_KEY,\n} from \"#/constants/llm-subscription\";\n\nexport type SettingsFormValues = Record<string, string | boolean>;\nexport type SettingsDirtyState = Record<string, boolean>;\nexport type SdkSettingsPayload = Record<string, SettingsValue>;\nexport type SettingsValueSource = \"agent_settings\" | \"conversation_settings\";\n\nexport type SettingsView = \"basic\" | \"advanced\" | \"all\";\n\n/** Fields that are rendered by purpose-built components instead of the\n * generic `SchemaField` renderer. */\nexport const SPECIALLY_RENDERED_KEYS = new Set([\n \"llm.model\",\n \"llm.api_key\",\n \"llm.base_url\",\n LLM_AUTH_TYPE_KEY,\n LLM_SUBSCRIPTION_VENDOR_KEY,\n]);\n\n/** Prominence tiers visible at each view level. */\nconst VIEW_PROMINENCES: Record<SettingsView, Set<SettingProminence>> = {\n basic: new Set<SettingProminence>([\"critical\"]),\n advanced: new Set<SettingProminence>([\"critical\", \"major\"]),\n all: new Set<SettingProminence>([\"critical\", \"major\", \"minor\"]),\n};\n\n/**\n * True when `schema` looks like a usable `SettingsSchema` — i.e. an\n * object with an array `sections` field. Guards every helper in this\n * module against malformed/empty schema responses (e.g. when the\n * frontend ends up pointing at a host that does not actually serve\n * `/api/settings/agent-schema`, such as an unconfigured Vercel preview\n * origin that returns the React Router SPA shell for arbitrary\n * `/api/*` paths). Without this check, `schema.sections.filter(...)`\n * inside `SdkSectionPage` blows up with\n * `Cannot read properties of undefined (reading 'filter')` and React\n * Router escalates to a full-screen error page.\n */\nexport function isValidSettingsSchema(\n schema: SettingsSchema | null | undefined,\n): schema is SettingsSchema {\n return !!schema && Array.isArray((schema as SettingsSchema).sections);\n}\n\nfunction getSchemaFields(schema: SettingsSchema): SettingsFieldSchema[] {\n if (!isValidSettingsSchema(schema)) return [];\n return schema.sections.flatMap((section) => section.fields);\n}\n\n/** Traverse a nested object using a dotted key path (e.g. \"llm.model\"). */\nfunction lookupDotted(\n obj: Record<string, unknown> | null | undefined,\n key: string,\n): unknown {\n if (!obj) return undefined;\n const parts = key.split(\".\");\n let current: unknown = obj;\n for (const part of parts) {\n if (current == null || typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\n/** Set a value in a nested object at a dotted key path (e.g. \"llm.model\"). */\nfunction setDotted(\n obj: Record<string, unknown>,\n key: string,\n value: unknown,\n): void {\n const parts = key.split(\".\");\n let current: Record<string, unknown> = obj;\n for (let i = 0; i < parts.length - 1; i += 1) {\n const part = parts[i];\n if (\n current[part] == null ||\n typeof current[part] !== \"object\" ||\n Array.isArray(current[part])\n ) {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n current[parts[parts.length - 1]] = value;\n}\n\nexport function getSettingValue(\n settings: Settings,\n key: string,\n source: SettingsValueSource = \"agent_settings\",\n): SettingsValue {\n return (lookupDotted(settings[source] as Record<string, unknown>, key) ??\n null) as SettingsValue;\n}\n\nexport function getAgentSettingValue(\n settings: Settings,\n key: string,\n): SettingsValue {\n return getSettingValue(settings, key, \"agent_settings\");\n}\n\nexport function getConversationSettingValue(\n settings: Settings,\n key: string,\n): SettingsValue {\n return getSettingValue(settings, key, \"conversation_settings\");\n}\n\nfunction isChoiceField(field: SettingsFieldSchema): boolean {\n return field.choices.length > 0;\n}\n\nfunction isCriticalField(field: SettingsFieldSchema): boolean {\n return field.prominence === \"critical\";\n}\n\nfunction isMinorField(field: SettingsFieldSchema): boolean {\n return field.prominence === \"minor\";\n}\n\nexport function normalizeFieldValue(\n field: SettingsFieldSchema,\n rawValue: unknown,\n): string | boolean {\n const resolvedValue = rawValue ?? field.default;\n\n if (isChoiceField(field)) {\n return resolvedValue === null || resolvedValue === undefined\n ? \"\"\n : String(resolvedValue);\n }\n\n if (field.value_type === \"boolean\") {\n return Boolean(resolvedValue ?? false);\n }\n\n if (resolvedValue === null || resolvedValue === undefined) {\n return \"\";\n }\n\n if (field.value_type === \"array\" || field.value_type === \"object\") {\n return JSON.stringify(resolvedValue, null, 2);\n }\n\n return String(resolvedValue);\n}\n\nfunction stableJsonStringify(value: unknown): string {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n return `[${value.map(stableJsonStringify).join(\",\")}]`;\n }\n\n const sortedEntries = Object.entries(value as Record<string, unknown>).sort(\n ([leftKey], [rightKey]) => leftKey.localeCompare(rightKey),\n );\n\n return `{${sortedEntries\n .map(\n ([key, entryValue]) =>\n `${JSON.stringify(key)}:${stableJsonStringify(entryValue)}`,\n )\n .join(\",\")}}`;\n}\n\nexport function normalizeComparableValue(\n field: SettingsFieldSchema,\n rawValue: unknown,\n): boolean | number | string | null {\n if (rawValue === undefined) {\n return null;\n }\n\n if (field.value_type === \"boolean\") {\n if (typeof rawValue === \"string\") {\n if (rawValue === \"true\") {\n return true;\n }\n if (rawValue === \"false\") {\n return false;\n }\n }\n if (rawValue === null) {\n return null;\n }\n return Boolean(rawValue);\n }\n\n if (field.value_type === \"integer\" || field.value_type === \"number\") {\n if (rawValue === \"\" || rawValue === null) {\n return null;\n }\n\n const parsedValue =\n typeof rawValue === \"number\" ? rawValue : Number(String(rawValue));\n return Number.isNaN(parsedValue) ? null : parsedValue;\n }\n\n if (field.value_type === \"array\" || field.value_type === \"object\") {\n if (rawValue === null) {\n return null;\n }\n\n // Treat empty objects as null so that serializer artifacts\n // (e.g. mcp_config: {} vs schema default null) don't trigger\n // a spurious view escalation in inferInitialView.\n if (\n field.value_type === \"object\" &&\n typeof rawValue === \"object\" &&\n !Array.isArray(rawValue) &&\n Object.keys(rawValue as Record<string, unknown>).length === 0\n ) {\n return null;\n }\n\n if (typeof rawValue === \"string\") {\n const trimmedValue = rawValue.trim();\n if (!trimmedValue) {\n return null;\n }\n try {\n const parsed: unknown = JSON.parse(trimmedValue);\n // Also normalise stringified empty objects\n if (\n field.value_type === \"object\" &&\n parsed !== null &&\n typeof parsed === \"object\" &&\n !Array.isArray(parsed) &&\n Object.keys(parsed as Record<string, unknown>).length === 0\n ) {\n return null;\n }\n return stableJsonStringify(parsed);\n } catch {\n return trimmedValue;\n }\n }\n\n return stableJsonStringify(rawValue);\n }\n\n if (rawValue === null) {\n return null;\n }\n\n return String(rawValue);\n}\n\nexport function buildInitialSettingsFormValues(\n settings: Settings,\n schemaOverride?: SettingsSchema | null,\n source: SettingsValueSource = \"agent_settings\",\n): SettingsFormValues {\n const schema =\n schemaOverride ??\n (source === \"conversation_settings\"\n ? settings.conversation_settings_schema\n : settings.agent_settings_schema);\n if (!schema) {\n return {};\n }\n\n return Object.fromEntries(\n getSchemaFields(schema).map((field) => [\n field.key,\n normalizeFieldValue(field, getSettingValue(settings, field.key, source)),\n ]),\n );\n}\n\nexport function inferInitialView(\n settings: Settings,\n schemaOverride?: SettingsSchema | null,\n source: SettingsValueSource = \"agent_settings\",\n): SettingsView {\n const schema =\n schemaOverride ??\n (source === \"conversation_settings\"\n ? settings.conversation_settings_schema\n : settings.agent_settings_schema);\n if (!schema) {\n return \"basic\";\n }\n\n let hasMinorOverride = false;\n let hasMajorOverride = false;\n\n for (const field of getSchemaFields(schema)) {\n if (!isCriticalField(field)) {\n const currentValue = getSettingValue(settings, field.key, source);\n const isDifferent =\n normalizeComparableValue(\n field,\n currentValue ?? field.default ?? null,\n ) !== normalizeComparableValue(field, field.default ?? null);\n\n if (isDifferent) {\n if (isMinorField(field)) {\n hasMinorOverride = true;\n } else {\n hasMajorOverride = true;\n }\n }\n }\n }\n\n if (hasMinorOverride) return \"all\";\n if (hasMajorOverride) return \"advanced\";\n return \"basic\";\n}\n\n/** Determine which view tier to default to based on whether the user has\n * overridden any non-critical settings. */\nexport function hasAdvancedSettingsOverrides(settings: Settings): boolean {\n return inferInitialView(settings) !== \"basic\";\n}\n\nexport function isSettingsFieldVisible(\n field: SettingsFieldSchema,\n values: SettingsFormValues,\n): boolean {\n return field.depends_on.every((dependency) => values[dependency] === true);\n}\n\nfunction parseBooleanFieldValue(rawValue: string | boolean): boolean | null {\n if (typeof rawValue === \"boolean\") {\n return rawValue;\n }\n\n const normalizedValue = rawValue.trim().toLowerCase();\n if (!normalizedValue) {\n return null;\n }\n if (normalizedValue === \"true\") {\n return true;\n }\n if (normalizedValue === \"false\") {\n return false;\n }\n\n throw new Error(`Expected a boolean value, received: ${rawValue}`);\n}\n\nexport function coerceFieldValue(\n field: SettingsFieldSchema,\n rawValue: string | boolean,\n): SettingsValue {\n if (field.value_type === \"boolean\") {\n return parseBooleanFieldValue(rawValue);\n }\n\n if (field.value_type === \"integer\" || field.value_type === \"number\") {\n const stringValue = String(rawValue).trim();\n if (!stringValue) {\n return null;\n }\n\n const parsedValue = Number(stringValue);\n if (Number.isNaN(parsedValue)) {\n throw new Error(`Expected a numeric value, received: ${stringValue}`);\n }\n if (field.value_type === \"integer\" && !Number.isInteger(parsedValue)) {\n throw new Error(`Expected an integer value, received: ${stringValue}`);\n }\n\n const constraints = getSettingsFieldConstraints(field.key);\n if (constraints?.min != null && parsedValue < constraints.min) {\n throw new Error(`${field.label} must be at least ${constraints.min}`);\n }\n if (constraints?.max != null && parsedValue > constraints.max) {\n throw new Error(`${field.label} must be at most ${constraints.max}`);\n }\n\n return parsedValue;\n }\n\n if (field.value_type === \"array\" || field.value_type === \"object\") {\n const stringValue = String(rawValue).trim();\n if (!stringValue) {\n return null;\n }\n\n let parsedValue: unknown;\n try {\n parsedValue = JSON.parse(stringValue);\n } catch {\n throw new Error(`Invalid JSON for ${field.label}`);\n }\n\n if (field.value_type === \"array\") {\n if (!Array.isArray(parsedValue)) {\n throw new Error(`${field.label} must be a JSON array`);\n }\n return parsedValue as SettingsValue[];\n }\n\n if (\n parsedValue === null ||\n Array.isArray(parsedValue) ||\n typeof parsedValue !== \"object\"\n ) {\n throw new Error(`${field.label} must be a JSON object`);\n }\n\n return parsedValue as { [key: string]: SettingsValue };\n }\n\n const stringValue = String(rawValue);\n if (stringValue === \"\" && !field.secret) {\n return null;\n }\n\n return stringValue;\n}\n\nexport function buildSdkSettingsPayload(\n schema: SettingsSchema,\n values: SettingsFormValues,\n dirty: SettingsDirtyState,\n): SdkSettingsPayload {\n const payload: Record<string, unknown> = {};\n\n for (const field of getSchemaFields(schema)) {\n if (dirty[field.key]) {\n setDotted(payload, field.key, coerceFieldValue(field, values[field.key]));\n }\n }\n\n return payload as SdkSettingsPayload;\n}\n\nfunction isFieldVisibleInView(\n field: SettingsFieldSchema,\n view: SettingsView,\n): boolean {\n return VIEW_PROMINENCES[view].has(field.prominence);\n}\n\nexport function buildSdkSettingsPayloadForView(\n schema: SettingsSchema,\n values: SettingsFormValues,\n dirty: SettingsDirtyState,\n view: SettingsView,\n): SdkSettingsPayload {\n const payload = buildSdkSettingsPayload(schema, values, dirty) as Record<\n string,\n unknown\n >;\n\n for (const field of getSchemaFields(schema)) {\n if (!isFieldVisibleInView(field, view)) {\n setDotted(payload, field.key, field.default ?? null);\n }\n }\n\n return payload as SdkSettingsPayload;\n}\n\n/** Return sections with fields filtered for the current view tier.\n * Specially-rendered fields are excluded from the generic list. */\nexport function getVisibleSettingsSections(\n schema: SettingsSchema,\n values: SettingsFormValues,\n view: SettingsView,\n excludeKeys: Set<string> = SPECIALLY_RENDERED_KEYS,\n): SettingsSectionSchema[] {\n if (!isValidSettingsSchema(schema)) return [];\n return schema.sections\n .map((section) => ({\n ...section,\n fields: section.fields.filter(\n (field) =>\n !excludeKeys.has(field.key) &&\n isFieldVisibleInView(field, view) &&\n isSettingsFieldVisible(field, values),\n ),\n }))\n .filter((section) => section.fields.length > 0);\n}\n\n/** Whether the schema has any \"critical\" prominence fields (the basic tier). */\nexport function hasCriticalSettings(schema: SettingsSchema | null): boolean {\n if (!schema) return false;\n return getSchemaFields(schema).some((f) => f.prominence === \"critical\");\n}\n\n/** Whether the schema has any fields visible in the \"advanced\" tier. */\nexport function hasAdvancedSettings(schema: SettingsSchema | null): boolean {\n if (!schema) return false;\n return getSchemaFields(schema).some((f) => f.prominence === \"major\");\n}\n\n/** Whether the schema has any \"minor\" prominence fields. */\nexport function hasMinorSettings(schema: SettingsSchema | null): boolean {\n if (!schema) return false;\n return getSchemaFields(schema).some((f) => f.prominence === \"minor\");\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require("../_virtual/_rolldown/runtime.cjs");const e=require("../node_modules/@openhands/extensions/skills/index.cjs");var t=e.default.map(e=>e.name),n=new Set(t),r=new Set(e.DEFAULT_ENABLED_SKILL_NAMES);function i(e){return n.has(e)}function a(e){return r.has(e)}function o(t){return t.enabledSkills??[...e.DEFAULT_ENABLED_SKILL_NAMES]}function s(e){let t=new Set(o(e)),n=new Set(e.disabledSkills??[]);return e=>n.has(e)?!1:!i(e)||t.has(e)}function c(e){return{enabledSkills:e.enabled_skills,disabledSkills:e.disabled_skills}}var l=new Map(e.default.flatMap(e=>[`/${e.name}`,...(e.triggers??[]).filter(e=>e.startsWith(`/`))].map(t=>[t.toLowerCase(),e.name])));function u(e){let t=e?.trim().split(/\s+/,1)[0];if(t?.startsWith(`/`))return l.get(t.toLowerCase())}exports.CATALOG_SKILL_NAMES=t,exports.buildSkillEnablementFilter=s,exports.findInvokedCatalogSkill=u,exports.isCatalogSkill=i,exports.isRecommendedSkill=a,exports.resolveEnabledCatalogSkills=o,exports.toSkillEnablement=c;
|
|
2
|
+
//# sourceMappingURL=skill-enablement.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-enablement.cjs","names":[],"sources":["../../src/utils/skill-enablement.ts"],"sourcesContent":["import {\n DEFAULT_ENABLED_SKILL_NAMES,\n SKILLS_CATALOG,\n} from \"@openhands/extensions/skills\";\n\n/** Every skill bundled from `@openhands/extensions`, in catalog order. */\nexport const CATALOG_SKILL_NAMES: readonly string[] = SKILLS_CATALOG.map(\n (entry) => entry.name,\n);\n\nconst CATALOG_SKILL_NAME_SET = new Set(CATALOG_SKILL_NAMES);\nconst RECOMMENDED_SKILL_NAME_SET = new Set(DEFAULT_ENABLED_SKILL_NAMES);\n\nexport function isCatalogSkill(name: string): boolean {\n return CATALOG_SKILL_NAME_SET.has(name);\n}\n\nexport function isRecommendedSkill(name: string): boolean {\n return RECOMMENDED_SKILL_NAME_SET.has(name);\n}\n\n/**\n * The two persisted lists. They cover different populations: `enabledSkills`\n * allow-lists the bundled catalog, whose every future addition would otherwise\n * be on for everyone (#16302), while `disabledSkills` keeps denying user- and\n * project-authored skills, which should be on the moment they appear.\n *\n * `undefined` means \"never migrated\" and must survive settings hydration.\n */\nexport interface SkillEnablement {\n enabledSkills?: string[];\n disabledSkills?: string[];\n}\n\nexport function resolveEnabledCatalogSkills(\n enablement: SkillEnablement,\n): string[] {\n return enablement.enabledSkills ?? [...DEFAULT_ENABLED_SKILL_NAMES];\n}\n\n/**\n * The one rule for \"will this skill be loaded\", resolved once per caller so\n * per-skill checks stay cheap.\n *\n * The deny-list still wins over the allow-list, which only matters before the\n * migration runs: until then a pre-existing \"I turned this off\" lives in the\n * deny-list alone.\n */\nexport function buildSkillEnablementFilter(\n enablement: SkillEnablement,\n): (skillName: string) => boolean {\n const enabled = new Set(resolveEnabledCatalogSkills(enablement));\n const disabled = new Set(enablement.disabledSkills ?? []);\n\n return (skillName) => {\n if (disabled.has(skillName)) return false;\n return !isCatalogSkill(skillName) || enabled.has(skillName);\n };\n}\n\n/**\n * One-shot conversion from \"all catalog skills on, minus a deny-list\" to an\n * explicit allow-list; `undefined` once already migrated.\n *\n * A fresh workspace is migrated too, even though the resolver's fallback would\n * give it the same set: persisting an explicit list is what stops a later\n * `defaultEnabled` catalog addition from switching itself on.\n */\nexport function migrateSkillEnablement(\n enablement: SkillEnablement,\n): { enabled_skills: string[]; disabled_skills: string[] } | undefined {\n if (enablement.enabledSkills !== undefined) return undefined;\n\n const disabled = new Set(enablement.disabledSkills ?? []);\n // A deny-list naming a catalog skill is the only evidence that this\n // workspace predates the allow-list; one holding local names alone says\n // nothing about the catalog.\n const isExistingWorkspace = [...disabled].some(isCatalogSkill);\n\n return {\n enabled_skills: isExistingWorkspace\n ? CATALOG_SKILL_NAMES.filter((name) => !disabled.has(name))\n : [...DEFAULT_ENABLED_SKILL_NAMES],\n // Catalog names move to the allow-list; a leftover deny entry would veto\n // a skill the user later switches back on.\n disabled_skills: [...disabled].filter((name) => !isCatalogSkill(name)),\n };\n}\n\nexport function toSkillEnablement(settings: {\n enabled_skills?: string[];\n disabled_skills?: string[];\n}): SkillEnablement {\n return {\n enabledSkills: settings.enabled_skills,\n disabledSkills: settings.disabled_skills,\n };\n}\n\n// Both forms a user can send: the commands a skill declares in its own\n// `triggers` (what an automation card fills in — see `findAutomationCommand`),\n// and `/<skill-name>`, which the detail modal's \"Use skill\" button inserts.\nconst CATALOG_SKILL_BY_SLASH_COMMAND = new Map(\n SKILLS_CATALOG.flatMap((entry) =>\n [\n `/${entry.name}`,\n ...(entry.triggers ?? []).filter((trigger) => trigger.startsWith(\"/\")),\n ].map((command) => [command.toLowerCase(), entry.name] as const),\n ),\n);\n\n/**\n * The catalog skill a message invokes by name, if any.\n *\n * 18 of the catalog's 24 slash commands belong to skills that are off by\n * default, so without this an automation card would send its command with none\n * of the instructions behind it. Only the leading token counts: matching a\n * `/word` anywhere in prose would re-admit most of the catalog.\n */\nexport function findInvokedCatalogSkill(query?: string): string | undefined {\n const firstToken = query?.trim().split(/\\s+/, 1)[0];\n if (!firstToken?.startsWith(\"/\")) return undefined;\n return CATALOG_SKILL_BY_SLASH_COMMAND.get(firstToken.toLowerCase());\n}\n"],"mappings":"uHAMA,IAAa,EAAyC,EAAA,QAAe,IAClE,GAAU,EAAM,IACnB,EAEM,EAAyB,IAAI,IAAI,CAAmB,EACpD,EAA6B,IAAI,IAAI,EAAA,2BAA2B,EAEtE,SAAgB,EAAe,EAAuB,CACpD,OAAO,EAAuB,IAAI,CAAI,CACxC,CAEA,SAAgB,EAAmB,EAAuB,CACxD,OAAO,EAA2B,IAAI,CAAI,CAC5C,CAeA,SAAgB,EACd,EACU,CACV,OAAO,EAAW,eAAiB,CAAC,GAAG,EAAA,2BAA2B,CACpE,CAUA,SAAgB,EACd,EACgC,CAChC,IAAM,EAAU,IAAI,IAAI,EAA4B,CAAU,CAAC,EACzD,EAAW,IAAI,IAAI,EAAW,gBAAkB,CAAC,CAAC,EAExD,MAAQ,IACF,EAAS,IAAI,CAAS,EAAU,GAC7B,CAAC,EAAe,CAAS,GAAK,EAAQ,IAAI,CAAS,CAE9D,CA+BA,SAAgB,EAAkB,EAGd,CAClB,MAAO,CACL,cAAe,EAAS,eACxB,eAAgB,EAAS,eAC3B,CACF,CAKA,IAAM,EAAiC,IAAI,IACzC,EAAA,QAAe,QAAS,GACtB,CACE,IAAI,EAAM,OACV,IAAI,EAAM,UAAY,CAAC,GAAG,OAAQ,GAAY,EAAQ,WAAW,GAAG,CAAC,CACvE,EAAE,IAAK,GAAY,CAAC,EAAQ,YAAY,EAAG,EAAM,IAAI,CAAU,CACjE,CACF,EAUA,SAAgB,EAAwB,EAAoC,CAC1E,IAAM,EAAa,GAAO,KAAK,EAAE,MAAM,MAAO,CAAC,EAAE,GAC5C,MAAY,WAAW,GAAG,EAC/B,OAAO,EAA+B,IAAI,EAAW,YAAY,CAAC,CACpE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** Every skill bundled from `@openhands/extensions`, in catalog order. */
|
|
2
|
+
export declare const CATALOG_SKILL_NAMES: readonly string[];
|
|
3
|
+
export declare function isCatalogSkill(name: string): boolean;
|
|
4
|
+
export declare function isRecommendedSkill(name: string): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* The two persisted lists. They cover different populations: `enabledSkills`
|
|
7
|
+
* allow-lists the bundled catalog, whose every future addition would otherwise
|
|
8
|
+
* be on for everyone (#16302), while `disabledSkills` keeps denying user- and
|
|
9
|
+
* project-authored skills, which should be on the moment they appear.
|
|
10
|
+
*
|
|
11
|
+
* `undefined` means "never migrated" and must survive settings hydration.
|
|
12
|
+
*/
|
|
13
|
+
export interface SkillEnablement {
|
|
14
|
+
enabledSkills?: string[];
|
|
15
|
+
disabledSkills?: string[];
|
|
16
|
+
}
|
|
17
|
+
export declare function resolveEnabledCatalogSkills(enablement: SkillEnablement): string[];
|
|
18
|
+
/**
|
|
19
|
+
* The one rule for "will this skill be loaded", resolved once per caller so
|
|
20
|
+
* per-skill checks stay cheap.
|
|
21
|
+
*
|
|
22
|
+
* The deny-list still wins over the allow-list, which only matters before the
|
|
23
|
+
* migration runs: until then a pre-existing "I turned this off" lives in the
|
|
24
|
+
* deny-list alone.
|
|
25
|
+
*/
|
|
26
|
+
export declare function buildSkillEnablementFilter(enablement: SkillEnablement): (skillName: string) => boolean;
|
|
27
|
+
/**
|
|
28
|
+
* One-shot conversion from "all catalog skills on, minus a deny-list" to an
|
|
29
|
+
* explicit allow-list; `undefined` once already migrated.
|
|
30
|
+
*
|
|
31
|
+
* A fresh workspace is migrated too, even though the resolver's fallback would
|
|
32
|
+
* give it the same set: persisting an explicit list is what stops a later
|
|
33
|
+
* `defaultEnabled` catalog addition from switching itself on.
|
|
34
|
+
*/
|
|
35
|
+
export declare function migrateSkillEnablement(enablement: SkillEnablement): {
|
|
36
|
+
enabled_skills: string[];
|
|
37
|
+
disabled_skills: string[];
|
|
38
|
+
} | undefined;
|
|
39
|
+
export declare function toSkillEnablement(settings: {
|
|
40
|
+
enabled_skills?: string[];
|
|
41
|
+
disabled_skills?: string[];
|
|
42
|
+
}): SkillEnablement;
|
|
43
|
+
/**
|
|
44
|
+
* The catalog skill a message invokes by name, if any.
|
|
45
|
+
*
|
|
46
|
+
* 18 of the catalog's 24 slash commands belong to skills that are off by
|
|
47
|
+
* default, so without this an automation card would send its command with none
|
|
48
|
+
* of the instructions behind it. Only the leading token counts: matching a
|
|
49
|
+
* `/word` anywhere in prose would re-admit most of the catalog.
|
|
50
|
+
*/
|
|
51
|
+
export declare function findInvokedCatalogSkill(query?: string): string | undefined;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import e, { DEFAULT_ENABLED_SKILL_NAMES as t } from "../node_modules/@openhands/extensions/skills/index.js";
|
|
2
|
+
//#region src/utils/skill-enablement.ts
|
|
3
|
+
var n = e.map((e) => e.name), r = new Set(n), i = new Set(t);
|
|
4
|
+
function a(e) {
|
|
5
|
+
return r.has(e);
|
|
6
|
+
}
|
|
7
|
+
function o(e) {
|
|
8
|
+
return i.has(e);
|
|
9
|
+
}
|
|
10
|
+
function s(e) {
|
|
11
|
+
return e.enabledSkills ?? [...t];
|
|
12
|
+
}
|
|
13
|
+
function c(e) {
|
|
14
|
+
let t = new Set(s(e)), n = new Set(e.disabledSkills ?? []);
|
|
15
|
+
return (e) => n.has(e) ? !1 : !a(e) || t.has(e);
|
|
16
|
+
}
|
|
17
|
+
function l(e) {
|
|
18
|
+
return {
|
|
19
|
+
enabledSkills: e.enabled_skills,
|
|
20
|
+
disabledSkills: e.disabled_skills
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
var u = new Map(e.flatMap((e) => [`/${e.name}`, ...(e.triggers ?? []).filter((e) => e.startsWith("/"))].map((t) => [t.toLowerCase(), e.name])));
|
|
24
|
+
function d(e) {
|
|
25
|
+
let t = e?.trim().split(/\s+/, 1)[0];
|
|
26
|
+
if (t?.startsWith("/")) return u.get(t.toLowerCase());
|
|
27
|
+
}
|
|
28
|
+
//#endregion
|
|
29
|
+
export { n as CATALOG_SKILL_NAMES, c as buildSkillEnablementFilter, d as findInvokedCatalogSkill, a as isCatalogSkill, o as isRecommendedSkill, s as resolveEnabledCatalogSkills, l as toSkillEnablement };
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=skill-enablement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-enablement.js","names":[],"sources":["../../src/utils/skill-enablement.ts"],"sourcesContent":["import {\n DEFAULT_ENABLED_SKILL_NAMES,\n SKILLS_CATALOG,\n} from \"@openhands/extensions/skills\";\n\n/** Every skill bundled from `@openhands/extensions`, in catalog order. */\nexport const CATALOG_SKILL_NAMES: readonly string[] = SKILLS_CATALOG.map(\n (entry) => entry.name,\n);\n\nconst CATALOG_SKILL_NAME_SET = new Set(CATALOG_SKILL_NAMES);\nconst RECOMMENDED_SKILL_NAME_SET = new Set(DEFAULT_ENABLED_SKILL_NAMES);\n\nexport function isCatalogSkill(name: string): boolean {\n return CATALOG_SKILL_NAME_SET.has(name);\n}\n\nexport function isRecommendedSkill(name: string): boolean {\n return RECOMMENDED_SKILL_NAME_SET.has(name);\n}\n\n/**\n * The two persisted lists. They cover different populations: `enabledSkills`\n * allow-lists the bundled catalog, whose every future addition would otherwise\n * be on for everyone (#16302), while `disabledSkills` keeps denying user- and\n * project-authored skills, which should be on the moment they appear.\n *\n * `undefined` means \"never migrated\" and must survive settings hydration.\n */\nexport interface SkillEnablement {\n enabledSkills?: string[];\n disabledSkills?: string[];\n}\n\nexport function resolveEnabledCatalogSkills(\n enablement: SkillEnablement,\n): string[] {\n return enablement.enabledSkills ?? [...DEFAULT_ENABLED_SKILL_NAMES];\n}\n\n/**\n * The one rule for \"will this skill be loaded\", resolved once per caller so\n * per-skill checks stay cheap.\n *\n * The deny-list still wins over the allow-list, which only matters before the\n * migration runs: until then a pre-existing \"I turned this off\" lives in the\n * deny-list alone.\n */\nexport function buildSkillEnablementFilter(\n enablement: SkillEnablement,\n): (skillName: string) => boolean {\n const enabled = new Set(resolveEnabledCatalogSkills(enablement));\n const disabled = new Set(enablement.disabledSkills ?? []);\n\n return (skillName) => {\n if (disabled.has(skillName)) return false;\n return !isCatalogSkill(skillName) || enabled.has(skillName);\n };\n}\n\n/**\n * One-shot conversion from \"all catalog skills on, minus a deny-list\" to an\n * explicit allow-list; `undefined` once already migrated.\n *\n * A fresh workspace is migrated too, even though the resolver's fallback would\n * give it the same set: persisting an explicit list is what stops a later\n * `defaultEnabled` catalog addition from switching itself on.\n */\nexport function migrateSkillEnablement(\n enablement: SkillEnablement,\n): { enabled_skills: string[]; disabled_skills: string[] } | undefined {\n if (enablement.enabledSkills !== undefined) return undefined;\n\n const disabled = new Set(enablement.disabledSkills ?? []);\n // A deny-list naming a catalog skill is the only evidence that this\n // workspace predates the allow-list; one holding local names alone says\n // nothing about the catalog.\n const isExistingWorkspace = [...disabled].some(isCatalogSkill);\n\n return {\n enabled_skills: isExistingWorkspace\n ? CATALOG_SKILL_NAMES.filter((name) => !disabled.has(name))\n : [...DEFAULT_ENABLED_SKILL_NAMES],\n // Catalog names move to the allow-list; a leftover deny entry would veto\n // a skill the user later switches back on.\n disabled_skills: [...disabled].filter((name) => !isCatalogSkill(name)),\n };\n}\n\nexport function toSkillEnablement(settings: {\n enabled_skills?: string[];\n disabled_skills?: string[];\n}): SkillEnablement {\n return {\n enabledSkills: settings.enabled_skills,\n disabledSkills: settings.disabled_skills,\n };\n}\n\n// Both forms a user can send: the commands a skill declares in its own\n// `triggers` (what an automation card fills in — see `findAutomationCommand`),\n// and `/<skill-name>`, which the detail modal's \"Use skill\" button inserts.\nconst CATALOG_SKILL_BY_SLASH_COMMAND = new Map(\n SKILLS_CATALOG.flatMap((entry) =>\n [\n `/${entry.name}`,\n ...(entry.triggers ?? []).filter((trigger) => trigger.startsWith(\"/\")),\n ].map((command) => [command.toLowerCase(), entry.name] as const),\n ),\n);\n\n/**\n * The catalog skill a message invokes by name, if any.\n *\n * 18 of the catalog's 24 slash commands belong to skills that are off by\n * default, so without this an automation card would send its command with none\n * of the instructions behind it. Only the leading token counts: matching a\n * `/word` anywhere in prose would re-admit most of the catalog.\n */\nexport function findInvokedCatalogSkill(query?: string): string | undefined {\n const firstToken = query?.trim().split(/\\s+/, 1)[0];\n if (!firstToken?.startsWith(\"/\")) return undefined;\n return CATALOG_SKILL_BY_SLASH_COMMAND.get(firstToken.toLowerCase());\n}\n"],"mappings":";;AAMA,IAAa,IAAyC,EAAe,KAClE,MAAU,EAAM,IACnB,GAEM,IAAyB,IAAI,IAAI,CAAmB,GACpD,IAA6B,IAAI,IAAI,CAA2B;AAEtE,SAAgB,EAAe,GAAuB;CACpD,OAAO,EAAuB,IAAI,CAAI;AACxC;AAEA,SAAgB,EAAmB,GAAuB;CACxD,OAAO,EAA2B,IAAI,CAAI;AAC5C;AAeA,SAAgB,EACd,GACU;CACV,OAAO,EAAW,iBAAiB,CAAC,GAAG,CAA2B;AACpE;AAUA,SAAgB,EACd,GACgC;CAChC,IAAM,IAAU,IAAI,IAAI,EAA4B,CAAU,CAAC,GACzD,IAAW,IAAI,IAAI,EAAW,kBAAkB,CAAC,CAAC;CAExD,QAAQ,MACF,EAAS,IAAI,CAAS,IAAU,KAC7B,CAAC,EAAe,CAAS,KAAK,EAAQ,IAAI,CAAS;AAE9D;AA+BA,SAAgB,EAAkB,GAGd;CAClB,OAAO;EACL,eAAe,EAAS;EACxB,gBAAgB,EAAS;CAC3B;AACF;AAKA,IAAM,IAAiC,IAAI,IACzC,EAAe,SAAS,MACtB,CACE,IAAI,EAAM,QACV,IAAI,EAAM,YAAY,CAAC,GAAG,QAAQ,MAAY,EAAQ,WAAW,GAAG,CAAC,CACvE,EAAE,KAAK,MAAY,CAAC,EAAQ,YAAY,GAAG,EAAM,IAAI,CAAU,CACjE,CACF;AAUA,SAAgB,EAAwB,GAAoC;CAC1E,IAAM,IAAa,GAAO,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;CAC5C,OAAY,WAAW,GAAG,GAC/B,OAAO,EAA+B,IAAI,EAAW,YAAY,CAAC;AACpE"}
|
package/dist/utils/utils.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../_virtual/_rolldown/runtime.cjs");const e=require("../i18n/declaration.cjs"),t=require("../node_modules/clsx/dist/clsx.cjs"),n=require("../node_modules/tailwind-merge/dist/bundle-mjs.cjs"),r=require("../types/agent-state.cjs"),i=require("./status.cjs"),a=require("../constants/status-colors.cjs");function o(...e){return n.twMerge(t.default(e))}var s=(e,t)=>{let n=window.URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r),window.URL.revokeObjectURL(n)},c=(e,t)=>{let n=parseFloat(e.style.height||``);return Number.isFinite(n)?n:t},l=(e,t)=>{e.style.setProperty(`height`,`${t}px`)},u=()=>/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),d=()=>u()?!0:`ontouchstart`in window||navigator.maxTouchPoints>0?typeof window.matchMedia==`function`?!window.matchMedia(`(pointer: fine)`).matches:!0:!1,f=e=>e.split(`.`).pop()?.toUpperCase()||`FILE`,p=(e,t)=>{if(!e)return!1;switch(e){case`bitbucket`:case`bitbucket_data_center`:return!0;case`github`:return t===`cloud`;default:return!1}},m=(e,t)=>{if(t&&t.trim()!==``)return t.startsWith(`http`)?t:`https://${t}`;switch(e){case`github`:return`https://github.com`;case`gitlab`:return`https://gitlab.com`;case`bitbucket`:return`https://bitbucket.org`;case`azure_devops`:return`https://dev.azure.com`;case`forgejo`:return`https://codeberg.org`;default:return``}},h=e=>e===`gitlab`?`GitLab`:e===`bitbucket`?`Bitbucket`:e===`bitbucket_data_center`?`Bitbucket Data Center`:e===`azure_devops`?`Azure DevOps`:e===`forgejo`?`Forgejo`:`GitHub`,g=e=>e?`merge request`:`pull request`,_=e=>e?`MR`:`PR`,v=(e,t,n,r)=>{let i=m(t,r);switch(t){case`github`:return`${i}/${n}/pull/${e}`;case`forgejo`:return`${i}/${n}/pull/${e}`;case`gitlab`:return`${i}/${n}/-/merge_requests/${e}`;case`bitbucket`:return`${i}/${n}/pull-requests/${e}`;case`bitbucket_data_center`:{let[t,r]=n.split(`/`);return`${i}/projects/${t}/repos/${r}/pull-requests/${e}`}case`azure_devops`:{let t=n.split(`/`);if(t.length===3){let[n,r,a]=t;return`${i}/${n}/${r}/_git/${a}/pullrequest/${e}`}return``}default:return``}},y=(e,t,n)=>{let r=m(e,n);if(e===`bitbucket_data_center`){let[e,n]=t.split(`/`);return`${r}/projects/${e}/repos/${n}`}return`${r}/${t}`},b=(e,t,n,r)=>{let i=m(e,r);switch(e){case`github`:return`${i}/${t}/tree/${n}`;case`forgejo`:return`${i}/${t}/src/branch/${n}`;case`gitlab`:return`${i}/${t}/-/tree/${n}`;case`bitbucket`:return`${i}/${t}/src/${n}`;case`bitbucket_data_center`:{let e=t.split(`/`);if(e.length>=2){let[t,r]=e;return`${i}/projects/${t}/repos/${r}/browse?at=refs/heads/${n}`}return``}case`azure_devops`:{let e=t.split(`/`);if(e.length===3){let[t,r,a]=e;return`${i}/${t}/${r}/_git/${a}?version=GB${n}`}return``}default:return``}},
|
|
1
|
+
require("../_virtual/_rolldown/runtime.cjs");const e=require("../i18n/declaration.cjs"),t=require("../node_modules/clsx/dist/clsx.cjs"),n=require("../node_modules/tailwind-merge/dist/bundle-mjs.cjs"),r=require("../types/agent-state.cjs"),i=require("./status.cjs"),a=require("../constants/status-colors.cjs");function o(...e){return n.twMerge(t.default(e))}var s=(e,t)=>{let n=window.URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r),window.URL.revokeObjectURL(n)},c=(e,t)=>{let n=parseFloat(e.style.height||``);return Number.isFinite(n)?n:t},l=(e,t)=>{e.style.setProperty(`height`,`${t}px`)},u=()=>/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),d=()=>u()?!0:`ontouchstart`in window||navigator.maxTouchPoints>0?typeof window.matchMedia==`function`?!window.matchMedia(`(pointer: fine)`).matches:!0:!1,f=e=>e.split(`.`).pop()?.toUpperCase()||`FILE`,p=(e,t)=>{if(!e)return!1;switch(e){case`bitbucket`:case`bitbucket_data_center`:return!0;case`github`:return t===`cloud`;default:return!1}},m=(e,t)=>{if(t&&t.trim()!==``)return t.startsWith(`http`)?t:`https://${t}`;switch(e){case`github`:return`https://github.com`;case`gitlab`:return`https://gitlab.com`;case`bitbucket`:return`https://bitbucket.org`;case`azure_devops`:return`https://dev.azure.com`;case`forgejo`:return`https://codeberg.org`;default:return``}},h=e=>e===`gitlab`?`GitLab`:e===`bitbucket`?`Bitbucket`:e===`bitbucket_data_center`?`Bitbucket Data Center`:e===`azure_devops`?`Azure DevOps`:e===`forgejo`?`Forgejo`:`GitHub`,g=e=>e?`merge request`:`pull request`,_=e=>e?`MR`:`PR`,v=(e,t,n,r)=>{let i=m(t,r);switch(t){case`github`:return`${i}/${n}/pull/${e}`;case`forgejo`:return`${i}/${n}/pull/${e}`;case`gitlab`:return`${i}/${n}/-/merge_requests/${e}`;case`bitbucket`:return`${i}/${n}/pull-requests/${e}`;case`bitbucket_data_center`:{let[t,r]=n.split(`/`);return`${i}/projects/${t}/repos/${r}/pull-requests/${e}`}case`azure_devops`:{let t=n.split(`/`);if(t.length===3){let[n,r,a]=t;return`${i}/${n}/${r}/_git/${a}/pullrequest/${e}`}return``}default:return``}},y=(e,t,n)=>{let r=m(e,n);if(e===`bitbucket_data_center`){let[e,n]=t.split(`/`);return`${r}/projects/${e}/repos/${n}`}return`${r}/${t}`},b=e=>e.split(`/`).map(encodeURIComponent).join(`/`),x=(e,t,n,r)=>{let i=m(e,r);switch(e){case`github`:return`${i}/${t}/tree/${b(n)}`;case`forgejo`:return`${i}/${t}/src/branch/${b(n)}`;case`gitlab`:return`${i}/${t}/-/tree/${b(n)}`;case`bitbucket`:return`${i}/${t}/src/${b(n)}`;case`bitbucket_data_center`:{let e=t.split(`/`);if(e.length>=2){let[t,r]=e;return`${i}/projects/${t}/repos/${r}/browse?at=refs/heads/${encodeURIComponent(n)}`}return``}case`azure_devops`:{let e=t.split(`/`);if(e.length===3){let[t,r,a]=e;return`${i}/${t}/${r}/_git/${a}?version=GB${encodeURIComponent(n)}`}return``}default:return``}},S=`Please review the current changes and create a git commit with a concise, descriptive message.`,C=()=>S,w=()=>`Please pull the latest code from the repository.`,T=e=>`Please push the changes to a remote branch on ${h(e)}, but do NOT create a ${g(e===`gitlab`)}. Check your current branch name first - if it's main, master, deploy, or another common default branch name, create a new branch with a descriptive name related to your changes. Otherwise, use the exact SAME branch name as the one you are currently on.`,E=e=>{let t=h(e),n=g(e===`gitlab`);return`Please push the changes to ${t} and open a ${n}. If you're on a default branch (e.g., main, master, deploy), create a new branch with a descriptive name otherwise use the current branch. If a ${n} template exists in the repository, please follow it when creating the ${_(e===`gitlab`)} description.`},D=()=>`Please create a new branch with a descriptive name related to the work you plan to do.`,O=e=>!!e&&e!==`ERROR`&&e!==`READY`,k=e=>{let{isPausing:t,isTask:n,taskStatus:i,isStartingStatus:o,isStopStatus:s,curAgentState:c}=e;return t?`#FFD600`:n&&i?i===`ERROR`?a.OH_STATUS_ERROR_COLOR:`#FFD600`:o?`#FFD600`:s?`#ffffff`:c===r.AgentState.ERROR?a.OH_STATUS_ERROR_COLOR:a.OH_STATUS_SUCCESS_COLOR};function A({isPausing:t=!1,isTask:n,taskStatus:a,taskDetail:o,isStartingStatus:s,isStopStatus:c,curAgentState:l,errorMessage:u,t:d}){return t?d(e.I18nKey.COMMON$STOPPING):n&&a?a===`ERROR`?o||d(e.I18nKey.CONVERSATION$ERROR_STARTING_CONVERSATION):a===`READY`?d(e.I18nKey.CONVERSATION$READY):o||d(i.getTaskStatusI18nKey(a)):s?d(e.I18nKey.COMMON$STARTING):c?d(e.I18nKey.COMMON$SERVER_STOPPED):l===r.AgentState.ERROR?u||d(e.I18nKey.COMMON$ERROR):d(e.I18nKey.COMMON$RUNNING)}exports.cn=o,exports.constructBranchUrl=x,exports.constructPullRequestUrl=v,exports.constructRepositoryUrl=y,exports.downloadBlob=s,exports.getCreateNewBranchPrompt=D,exports.getCreatePRPrompt=E,exports.getFileExtension=f,exports.getGitCommitPrompt=C,exports.getGitProviderBaseUrl=m,exports.getGitPullPrompt=w,exports.getGitPushPrompt=T,exports.getProviderName=h,exports.getStatusColor=k,exports.getStatusText=A,exports.getStyleHeightPx=c,exports.isMobileDevice=d,exports.isMobileUserAgent=u,exports.isTaskPolling=O,exports.setStyleHeightPx=l,exports.shouldUseInstallationRepos=p;
|
|
2
2
|
//# sourceMappingURL=utils.cjs.map
|