@openhands/agent-canvas 1.16.0 → 1.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/README.windows.md +2 -2
- package/build/assets/{acp-providers-CX3Lh9gj.js → acp-providers-DcY_mKYa.js} +1 -1
- package/build/assets/active-backend-context-BnH4-L8h.js +2 -0
- package/build/assets/{agent-context-settings-DSZlXrLj.js → agent-context-settings-D3peZkjX.js} +1 -1
- package/build/assets/agent-profiles-service.api-DkeZaqIl.js +1 -0
- package/build/assets/agent-profiles-settings-7yMWYjGF.js +1 -0
- package/build/assets/agent-server-client-options-EHB23gyx.js +1 -0
- package/build/assets/agent-server-config-C_x8Otd9.js +1 -0
- package/build/assets/agent-server-conversation-service.api-jiCopc2E.js +88 -0
- package/build/assets/agent-settings-BF8hM6wb.js +2 -0
- package/build/assets/agent-settings-YPutBAeR.js +1 -0
- package/build/assets/alert-banner-eYyqvHL3.js +1 -0
- package/build/assets/{api-error-message-B-XdSk3b.js → api-error-message-BXo0lCI5.js} +1 -1
- package/build/assets/api-key-entry-screen-CCBvBD8u.js +1 -0
- package/build/assets/app-settings-BtYDs-Be.js +1 -0
- package/build/assets/automation-detail-BxXhb_m2.js +3 -0
- package/build/assets/{automation-export-D3a3of4G.js → automation-export-BJsfi7n2.js} +1 -1
- package/build/assets/automation-git-sync-B7o_Nbl-.js +1 -0
- package/build/assets/automation-setup-route-qaJ6lLCf.js +3 -0
- package/build/assets/{automation-templates-BRppNh99.js → automation-templates-Bb98r-kx.js} +1 -1
- package/build/assets/automations-list-DEPVNud3.js +1 -0
- package/build/assets/{back-nav-button-Cjl_hoxq.js → back-nav-button-B2yBiVMB.js} +1 -1
- package/build/assets/backend-form-modal-DxisQV_6.js +1 -0
- package/build/assets/backend-synced-settings-badge-DLEp6cq7.js +1 -0
- package/build/assets/badge-ehL-kgeO.js +1 -0
- package/build/assets/{base-modal-D_L0oEbG.js → base-modal-C1a0TsSx.js} +1 -1
- package/build/assets/bot-ByolqPEr.js +1 -0
- package/build/assets/{brand-button-BAfk4wGP.js → brand-button-CUMfjb99.js} +1 -1
- package/build/assets/browser-SE24Tk8g.js +46 -0
- package/build/assets/browser-tab-HjJxHA0V.js +1 -0
- package/build/assets/canvas-extension-page-BsUGBb1T.js +1 -0
- package/build/assets/canvas-extensions-C9Tm6s_E.js +1 -0
- package/build/assets/{canvas-extensions-runtime-2_x5Ezmi.js → canvas-extensions-runtime-B8kxM4rO.js} +1 -1
- package/build/assets/{chat-send-button-MUQqCZCS.js → chat-send-button-CGvc2wpE.js} +1 -1
- package/build/assets/check-Bo8s5Ylg.js +1 -0
- package/build/assets/chevron-down-Cr6Fn_wS.js +1 -0
- package/build/assets/chevron-right-CfdfRn-8.js +1 -0
- package/build/assets/circle-check-5pH3qCji.js +1 -0
- package/build/assets/circle-plus-check-toggle-BDX_ctNs.js +1 -0
- package/build/assets/{cloud-funnel-analytics-CztBCCPp.js → cloud-funnel-analytics-D5uJ_4JE.js} +1 -1
- package/build/assets/{cog-D-MPQW6G.js → cog-CAEugqtV.js} +1 -1
- package/build/assets/command-menu-CQxs4mtX.js +1 -0
- package/build/assets/commits-tab-D0xgjipP.js +1 -0
- package/build/assets/{condenser-settings-DmEOje-7.js → condenser-settings-D63NJRBT.js} +1 -1
- package/build/assets/confirmation-modal-78sd9Vny.js +1 -0
- package/build/assets/{context-menu-list-item-I86vKcmM.js → context-menu-list-item-Cm7-7Y-7.js} +1 -1
- package/build/assets/conversation-B_nweu5p.js +93 -0
- package/build/assets/conversation-edjzrv5w.js +1 -0
- package/build/assets/conversation-panel-edjzrv5w.js +1 -0
- package/build/assets/conversation-state-store-9D_3P7q4.js +1 -0
- package/build/assets/conversation-store-DC-JlJuq.js +6 -0
- package/build/assets/{conversation-tab-empty-state-FIbh_lc8.js → conversation-tab-empty-state-B3dpJXX0.js} +1 -1
- package/build/assets/copy-to-clipboard-button-B1ljgNxO.js +1 -0
- package/build/assets/device-verify-D5QRIS_x.js +1 -0
- package/build/assets/{dropdown-classes-Bc1djN0-.js → dropdown-classes-BGvOvW2_.js} +1 -1
- package/build/assets/edit-automation-modal-D_JWSmxT.js +1 -0
- package/build/assets/empty-state-FK_s1B60.js +1 -0
- package/build/assets/{entry.client-CqyPPjOq.js → entry.client-BMafTpjO.js} +2 -2
- package/build/assets/enum-filter-dropdown-UNaom12H.js +1 -0
- package/build/assets/environment-switch-overlay-COibRUA-.js +1 -0
- package/build/assets/error-state-Cf8LRuuY.js +1 -0
- package/build/assets/extensions-hub-C_6ahIua.js +1 -0
- package/build/assets/extensions-navigation-C5GfpzFe.js +1 -0
- package/build/assets/external-link-Bd7Tga-1.js +1 -0
- package/build/assets/files-tab-D5PPIWI1.js +1 -0
- package/build/assets/{form-control-classes-Bkh5FGrD.js → form-control-classes-Dbq-7YP_.js} +1 -1
- package/build/assets/format-model-name-Dfh9Udrx.js +1 -0
- package/build/assets/get-git-path-jU2zjqIB.js +1 -0
- package/build/assets/git-repo-dropdown-BoDDWXfX.js +1 -0
- package/build/assets/git-repo-dropdown-uxlFw2gn.js +1 -0
- package/build/assets/highlighted-source-view-C7pAXrT0.js +1 -0
- package/build/assets/home-BM5_Wz_R.js +1 -0
- package/build/assets/home-Ivfm7KC4.js +1 -0
- package/build/assets/home-automation-run-tooltip-B1N2uO9p.js +1 -0
- package/build/assets/home-store-DCbei3DX.js +1 -0
- package/build/assets/hooks-service-Dnmhqc0Z.js +1 -0
- package/build/assets/index-home-td9BN2T3.js +1 -0
- package/build/assets/info-BcajzHn1.js +1 -0
- package/build/assets/install-server-modal-B81I-5OE.js +1 -0
- package/build/assets/kebab-menu-item-content-SCJBwZnp.js +1 -0
- package/build/assets/{key-BmVyxs-2.js → key-O84CMFHb.js} +1 -1
- package/build/assets/launch-ZLxI4opd.js +1 -0
- package/build/assets/list-filter-B8PQk3RA.js +1 -0
- package/build/assets/{list-todo-apgLVjMw.js → list-todo-Caa8E1X_.js} +1 -1
- package/build/assets/llm-not-configured-banner-Dh_ajcM8.js +27 -0
- package/build/assets/llm-settings-CODhjQzy.js +1 -0
- package/build/assets/llm-settings-CZaXYgtw.js +1 -0
- package/build/assets/llm-subscription-service-CgIDc38n.js +1 -0
- package/build/assets/loader-circle-BxJgk73D.js +1 -0
- package/build/assets/{loading-spinner-BY9N3pOe.js → loading-spinner-BeLV0IXf.js} +1 -1
- package/build/assets/manage-backends-modal-cMXqCb-B.js +1 -0
- package/build/assets/manifest-bfeccb98.js +1 -0
- package/build/assets/manifest-subpage-layout-CVZgVKoY.js +1 -0
- package/build/assets/{map-provider-Cu3Zgumb.js → map-provider-iRs80q_6.js} +1 -1
- package/build/assets/markdown-renderer-DyFl9-mL.js +8 -0
- package/build/assets/mcp-CraxoXQv.js +1 -0
- package/build/assets/{mcp-marketplace-utils-AIBzzHTO.js → mcp-marketplace-utils-C7PYr293.js} +1 -1
- package/build/assets/mcp-page-CteH_K0N.js +9 -0
- package/build/assets/messages-Bk1xhbU2.js +41 -0
- package/build/assets/{modal-body-BxZjsju9.js → modal-body-C24WsdFb.js} +1 -1
- package/build/assets/{modal-classes-C8eycCwG.js → modal-classes-B0b9eiL8.js} +1 -1
- package/build/assets/modal-close-button-DfqfB2Nj.js +1 -0
- package/build/assets/{mouse-pointer-click-Co2uyaPA.js → mouse-pointer-click-BXlRN92t.js} +1 -1
- package/build/assets/onboarding-DXFBRqEy.js +1 -0
- package/build/assets/onboarding-modal-BT3Gx_sZ.js +1 -0
- package/build/assets/organization-service.api-B5CvmnYQ.js +1 -0
- package/build/assets/pencil-q-ihqDYv.js +1 -0
- package/build/assets/pin-BdroVQdN.js +1 -0
- package/build/assets/planner-tab-CstoOlAB.js +1 -0
- package/build/assets/plug-7ACOEbMs.js +1 -0
- package/build/assets/plugins-management-service-5rqVPEGN.js +1 -0
- package/build/assets/plus-C2e21TFC.js +1 -0
- package/build/assets/profiles-service.api-D1XKMgr0.js +1 -0
- package/build/assets/providers-XmZ9HM4Q.js +1 -0
- package/build/assets/proxy-XP6U1Dhv.js +1 -0
- package/build/assets/{puzzle-JM_QaRm0.js → puzzle-LJYnuxKe.js} +1 -1
- package/build/assets/react-BX7IV650.js +1 -0
- package/build/assets/recommended-automations-launcher-DEHRKIAg.js +1 -0
- package/build/assets/refresh-cw-BtdC3T8P.js +1 -0
- package/build/assets/root-CM6IZHlg.css +1 -0
- package/build/assets/root-DdFkodKW.js +2 -0
- package/build/assets/root-layout-DUquNZTU.js +2 -0
- package/build/assets/schema-field-Y3F8JvXd.js +1 -0
- package/build/assets/scroll-fade-state-Dt_fx2kf.js +1 -0
- package/build/assets/sdk-section-page-CNZTLwH9.js +1 -0
- package/build/assets/secret-form-9-BoGA40.js +1 -0
- package/build/assets/secrets-service-BOIsfD9j.js +1 -0
- package/build/assets/secrets-settings-CBJgFr42.js +1 -0
- package/build/assets/settings-D4hdToD4.js +1 -0
- package/build/assets/settings-dropdown-input-DBvsZ7-Q.js +1 -0
- package/build/assets/settings-index-DeQphyBK.js +1 -0
- package/build/assets/settings-input-dVuzapBA.js +1 -0
- package/build/assets/{settings-list-classes-BzeSZbF2.js → settings-list-classes-DhAPuXm6.js} +1 -1
- package/build/assets/settings-modal-tHiJ8iYV.js +1 -0
- package/build/assets/settings-nav-GAQjW1a-.js +16 -0
- package/build/assets/settings-service.api-C1vZH9Vh.js +1 -0
- package/build/assets/settings-switch-DDd1cQ8t.js +1 -0
- package/build/assets/{settings-utils-UYpEdPuD.js → settings-utils-BTaaRhLZ.js} +1 -1
- package/build/assets/shared-conversation-Cyg7m7ns.js +1 -0
- package/build/assets/shield-check-C3Rl0NF8.js +1 -0
- package/build/assets/{sidebar-layout-D6fS8-Gl.js → sidebar-layout-DH0E-5KW.js} +1 -1
- package/build/assets/sidebar-mobile-menu-toggle-CQ4iky__.js +1 -0
- package/build/assets/{sidebar-nav-link-DQQcMf1A.js → sidebar-nav-link-oLQiKUBu.js} +1 -1
- package/build/assets/{sidebar-onboarding-checklist-storage-BBkeI6Bp.js → sidebar-onboarding-checklist-storage-TfvNNnnr.js} +1 -1
- package/build/assets/sidebar-store-DAZVH-DR.js +1 -0
- package/build/assets/skill-card-pill-row-DfjIfj0K.js +1 -0
- package/build/assets/{skill-filter-w__3UCEE.js → skill-filter-DsNLmn76.js} +2 -2
- package/build/assets/{skill-icon-badge-RQkq8wvl.js → skill-icon-badge-0MK_68Nc.js} +1 -1
- package/build/assets/skill-scope-BE-H9TSZ.js +1 -0
- package/build/assets/skills-plugins-vzSdxSk_.js +1 -0
- package/build/assets/skills-settings-BiPOH9H9.js +1 -0
- package/build/assets/styled-tooltip-CejG0rqv.js +1 -0
- package/build/assets/task-list-tab-OkZSqnTp.js +1 -0
- package/build/assets/{terminal-CNElN42a.js → terminal-Dph60VFZ.js} +2 -2
- package/build/assets/toggle-switch-B2uXaAUS.js +1 -0
- package/build/assets/trash-2-Bb40zQzs.js +1 -0
- package/build/assets/trash-Ckh7yCaB.js +1 -0
- package/build/assets/triangle-alert-DEdu-b_L.js +1 -0
- package/build/assets/{typography-v1KN0tzi.js → typography-DgcLGdHk.js} +1 -1
- package/build/assets/usage-tab-MCmNRAnR.js +1 -0
- package/build/assets/use-acp-credential-form-ychoGqjC.js +1 -0
- package/build/assets/use-activate-agent-profile-8L8Xdghy.js +1 -0
- package/build/assets/use-agent-profiles-Bi8hSkze.js +1 -0
- package/build/assets/{use-automation-health-E6NZi9rb.js → use-automation-health-U99vvHxx.js} +1 -1
- package/build/assets/use-automation-permissions-Buus0R6h.js +1 -0
- package/build/assets/{use-automations-xijQKIl9.js → use-automations-Bq5hVuv0.js} +1 -1
- package/build/assets/{use-can-manage-org-profiles-CrJP5262.js → use-can-manage-org-profiles-MzIeEV8F.js} +1 -1
- package/build/assets/use-canvas-extensions-Ca9KoVEm.js +1 -0
- package/build/assets/{use-cloud-current-user-id-CDfAHpPX.js → use-cloud-current-user-id-B4ZLUZSa.js} +1 -1
- package/build/assets/use-config-l5tkDHyD.js +1 -0
- package/build/assets/use-create-conversation-i_PdFdIs.js +1 -0
- package/build/assets/use-create-secret-CjWq0J4O.js +1 -0
- package/build/assets/use-free-models-gCsJ5BV0.js +1 -0
- package/build/assets/{use-get-secrets-K3jmk-LH.js → use-get-secrets-CMTuWEp_.js} +1 -1
- package/build/assets/use-is-authed-A2Yinlt0.js +1 -0
- package/build/assets/{use-launch-skill-in-chat-BYjYihBP.js → use-launch-skill-in-chat-QbXDhiHr.js} +1 -1
- package/build/assets/use-llm-configured-Dl4zg8ht.js +1 -0
- package/build/assets/use-llm-profiles-SWsuFmFu.js +1 -0
- package/build/assets/use-manifest-capabilities-CdqYfUAC.js +1 -0
- package/build/assets/use-onboarding-completion-Xl63ZvzQ.js +1 -0
- package/build/assets/use-pinned-home-route-BXDIUaxQ.js +1 -0
- package/build/assets/use-plugins-marketplace-BIIaPiaB.js +1 -0
- package/build/assets/use-save-agent-profile-D-ZHHE94.js +1 -0
- package/build/assets/{use-save-settings-DYqkKv7T.js → use-save-settings-Dapkf4cC.js} +1 -1
- package/build/assets/use-settings-C2KKQKVC.js +1 -0
- package/build/assets/use-settings-nav-items-TOc0Rsfd.js +1 -0
- package/build/assets/use-tracking-j4uo9VEW.js +3 -0
- package/build/assets/{use-user-conversation-B9Gebw_g.js → use-user-conversation-5UFqMoO4.js} +1 -1
- package/build/assets/{useInfiniteQuery-C926xzY4.js → useInfiniteQuery-CtSRG7uW.js} +1 -1
- package/build/assets/{useMutation-B-qc391N.js → useMutation-Cszf8mKy.js} +1 -1
- package/build/assets/useQueries-pUohFMSP.js +1 -0
- package/build/assets/useQuery-DAAacS7O.js +1 -0
- package/build/assets/useTranslation-CCgUjPJF.js +1 -0
- package/build/assets/utils-BgLSZdyy.js +1 -0
- package/build/assets/{vendor~conversation-panel~conversation-C8Fn4XOf.js → vendor~conversation-panel~conversation-C22sJuWZ.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-BXXGJNDU.js +185 -0
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-40UR63Gt.js +1 -0
- package/build/assets/{vendor~index-home~home~conversation-panel~conversation-hWywRBaR.js → vendor~index-home~home~conversation-panel~conversation-UTl7gUo9.js} +1 -1
- package/build/assets/vendor~root-layout-CcdIqs-C.js +1 -0
- package/build/assets/{vendor~root-layout~conversation-panel~conversation-BMbMgaGu.js → vendor~root-layout~conversation-panel~conversation-C3EBV3kp.js} +1 -1
- package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-BCe0JJVy.js +1 -0
- package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation-j5MFqfSy.js → vendor~root-layout~index-home~home~conversation-panel~conversation-BGGbPcYh.js} +1 -1
- 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~nj1hli3r-DP9wmsjo.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~inibp4qe-CnsDDzeE.js} +1 -1
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-CUmIwQCN.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-3eJ4ExtV.js} +12 -6
- package/build/assets/{verification-settings-gw_q6vkL.js → verification-settings-DdBpaVPz.js} +1 -1
- package/build/assets/{wrench-CUEI1krB.js → wrench-B8Wg_nbp.js} +1 -1
- package/build/assets/x-CX8lVGwm.js +1 -0
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +79 -22
- package/build/locales/ca/openhands.json +79 -22
- package/build/locales/de/openhands.json +79 -22
- package/build/locales/en/openhands.json +79 -22
- package/build/locales/es/openhands.json +79 -22
- package/build/locales/fr/openhands.json +79 -22
- package/build/locales/it/openhands.json +79 -22
- package/build/locales/ja/openhands.json +79 -22
- package/build/locales/ko-KR/openhands.json +79 -22
- package/build/locales/no/openhands.json +79 -22
- package/build/locales/pt/openhands.json +79 -22
- package/build/locales/tr/openhands.json +79 -22
- package/build/locales/uk/openhands.json +79 -22
- package/build/locales/zh-CN/openhands.json +79 -22
- package/build/locales/zh-TW/openhands.json +79 -22
- package/config/defaults.json +3 -3
- 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 +234 -132
- package/dist/api/agent-server-adapter.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 +6 -0
- package/dist/api/agent-server-config.js +6 -3
- 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/cloud/organization-service.api.cjs.map +1 -1
- package/dist/api/cloud/organization-service.api.d.ts +9 -1
- package/dist/api/cloud/organization-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/config-service/config-service.api.cjs +1 -1
- package/dist/api/config-service/config-service.api.cjs.map +1 -1
- package/dist/api/config-service/config-service.api.js +6 -2
- package/dist/api/config-service/config-service.api.js.map +1 -1
- package/dist/api/config-service/config-service.types.d.ts +13 -0
- 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 +20 -0
- package/dist/api/conversation-service/agent-server-conversation-service.api.js +126 -77
- package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
- 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/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 +2 -0
- package/dist/api/settings-service/settings-service.api.js +18 -10
- 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/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 +104 -97
- 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 +89 -77
- package/dist/components/features/automations/automation-list-row.js.map +1 -1
- package/dist/components/features/automations/build-automation-menu-items.cjs +1 -1
- package/dist/components/features/automations/build-automation-menu-items.cjs.map +1 -1
- package/dist/components/features/automations/build-automation-menu-items.d.ts +3 -1
- package/dist/components/features/automations/build-automation-menu-items.js +12 -11
- package/dist/components/features/automations/build-automation-menu-items.js.map +1 -1
- package/dist/components/features/automations/detail/configuration-section.d.ts +7 -1
- package/dist/components/features/automations/detail/detail-header.d.ts +10 -5
- 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-selector.cjs +1 -1
- package/dist/components/features/backends/backend-selector.cjs.map +1 -1
- package/dist/components/features/backends/backend-selector.js +123 -112
- 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/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 +137 -137
- package/dist/components/features/chat/chat-interface.js.map +1 -1
- 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/chat-input-llm-profile-picker.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs.map +1 -1
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.js +62 -61
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.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/model-messages.cjs +1 -1
- package/dist/components/features/chat/model-messages.cjs.map +1 -1
- package/dist/components/features/chat/model-messages.js +27 -26
- package/dist/components/features/chat/model-messages.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.js +4 -4
- 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 +88 -88
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.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/budget-display.cjs +1 -1
- package/dist/components/features/conversation-panel/budget-display.cjs.map +1 -1
- package/dist/components/features/conversation-panel/budget-display.d.ts +1 -2
- package/dist/components/features/conversation-panel/budget-display.js +12 -19
- package/dist/components/features/conversation-panel/budget-display.js.map +1 -1
- 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-footer.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +45 -44
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.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/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/build-home-automation-menu-items.d.ts +1 -2
- package/dist/components/features/home/featured-automations/build-pinned-automation-menu-items.d.ts +0 -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 +42 -42
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js.map +1 -1
- package/dist/components/features/images/image-lightbox.cjs +2 -0
- package/dist/components/features/images/image-lightbox.cjs.map +1 -0
- package/dist/components/features/images/image-lightbox.d.ts +11 -0
- package/dist/components/features/images/image-lightbox.js +37 -0
- package/dist/components/features/images/image-lightbox.js.map +1 -0
- package/dist/components/features/images/image-preview.cjs +1 -1
- package/dist/components/features/images/image-preview.cjs.map +1 -1
- package/dist/components/features/images/image-preview.d.ts +2 -1
- package/dist/components/features/images/image-preview.js +33 -13
- package/dist/components/features/images/image-preview.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/steps/setup-llm-step.d.ts +3 -4
- 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.d.ts +3 -1
- package/dist/components/features/settings/cloud-settings-link.js +22 -19
- 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 +3 -2
- package/dist/components/features/settings/llm-profiles/profile-row.cjs +1 -1
- package/dist/components/features/settings/llm-profiles/profile-row.js +1 -1
- package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +2 -2
- 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-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 +4 -1
- package/dist/components/features/sidebar/sidebar-rail-body.js +157 -139
- 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 +28 -26
- 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/extensions-navigation.cjs +1 -1
- package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
- package/dist/components/features/skills/extensions-navigation.js +3 -3
- package/dist/components/features/skills/extensions-navigation.js.map +1 -1
- package/dist/components/providers/agent-server-ui-providers.cjs +1 -1
- package/dist/components/providers/agent-server-ui-providers.cjs.map +1 -1
- package/dist/components/providers/agent-server-ui-providers.js +33 -29
- package/dist/components/providers/agent-server-ui-providers.js.map +1 -1
- package/dist/components/shared/buttons/remove-button.cjs +1 -1
- package/dist/components/shared/buttons/remove-button.cjs.map +1 -1
- package/dist/components/shared/buttons/remove-button.d.ts +2 -1
- package/dist/components/shared/buttons/remove-button.js +2 -1
- package/dist/components/shared/buttons/remove-button.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/free-models-note.cjs +2 -0
- package/dist/components/shared/free-models-note.cjs.map +1 -0
- package/dist/components/shared/free-models-note.d.ts +3 -0
- package/dist/components/shared/free-models-note.js +20 -0
- package/dist/components/shared/free-models-note.js.map +1 -0
- 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.cjs.map +1 -1
- package/dist/components/shared/modals/settings/model-selector.js +102 -112
- package/dist/components/shared/modals/settings/model-selector.js.map +1 -1
- package/dist/config/defaults.cjs +1 -1
- package/dist/config/defaults.cjs.map +1 -1
- package/dist/config/defaults.js +3 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/constants/acp-providers.cjs.map +1 -1
- package/dist/constants/acp-providers.d.ts +12 -0
- package/dist/constants/acp-providers.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/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/chat/use-slash-command.cjs +1 -1
- package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
- package/dist/hooks/chat/use-slash-command.js +63 -62
- package/dist/hooks/chat/use-slash-command.js.map +1 -1
- package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
- package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
- package/dist/hooks/mutation/use-create-conversation.js +5 -1
- package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
- 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/query-keys.cjs +1 -1
- package/dist/hooks/query/query-keys.cjs.map +1 -1
- package/dist/hooks/query/query-keys.d.ts +6 -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-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-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-free-models.cjs +2 -0
- package/dist/hooks/query/use-free-models.cjs.map +1 -0
- package/dist/hooks/query/use-free-models.d.ts +23 -0
- package/dist/hooks/query/use-free-models.js +67 -0
- package/dist/hooks/query/use-free-models.js.map +1 -0
- package/dist/hooks/query/use-local-git-info.cjs.map +1 -1
- package/dist/hooks/query/use-local-git-info.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-provider-models.cjs +1 -1
- package/dist/hooks/query/use-provider-models.cjs.map +1 -1
- package/dist/hooks/query/use-provider-models.js +34 -25
- package/dist/hooks/query/use-provider-models.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 +31 -19
- 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/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-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.d.ts +1 -2
- package/dist/hooks/use-home-automation-actions.js +1 -1
- 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-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 +71 -14
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/translation.cjs +2 -2
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +1281 -312
- package/dist/i18n/translation.js.map +1 -1
- package/dist/locales/ar/openhands.json +79 -22
- package/dist/locales/ca/openhands.json +79 -22
- package/dist/locales/de/openhands.json +79 -22
- package/dist/locales/en/openhands.json +79 -22
- package/dist/locales/es/openhands.json +79 -22
- package/dist/locales/fr/openhands.json +79 -22
- package/dist/locales/it/openhands.json +79 -22
- package/dist/locales/ja/openhands.json +79 -22
- package/dist/locales/ko-KR/openhands.json +79 -22
- package/dist/locales/no/openhands.json +79 -22
- package/dist/locales/pt/openhands.json +79 -22
- package/dist/locales/tr/openhands.json +79 -22
- package/dist/locales/uk/openhands.json +79 -22
- package/dist/locales/zh-CN/openhands.json +79 -22
- package/dist/locales/zh-TW/openhands.json +79 -22
- 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-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/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-issue-to-pr/manifest.cjs +1 -1
- 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 +1 -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 +1 -1
- 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 +1 -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/qa-changes/manifest.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js.map +1 -1
- 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 +22 -20
- 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/gitlab.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js +24 -5
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js.map +1 -1
- 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/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/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 +4 -4
- package/dist/package.js.map +1 -1
- package/dist/routes/agent-settings.d.ts +2 -0
- package/dist/routes/app-settings.cjs +1 -1
- package/dist/routes/app-settings.cjs.map +1 -1
- package/dist/routes/app-settings.js +53 -48
- package/dist/routes/app-settings.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 +120 -127
- 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/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/free-models-store.cjs +2 -0
- package/dist/stores/free-models-store.cjs.map +1 -0
- package/dist/stores/free-models-store.d.ts +30 -0
- package/dist/stores/free-models-store.js +22 -0
- package/dist/stores/free-models-store.js.map +1 -0
- 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 +46 -1
- package/dist/types/automation.js.map +1 -1
- package/dist/ui/context-menu.d.ts +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/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/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 +27 -6
- package/dist/utils/format-model-name.js +14 -6
- package/dist/utils/format-model-name.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/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/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/package.json +4 -4
- package/scripts/check-sdk-version-sync.mjs +6 -6
- package/scripts/dev-safe.mjs +1 -1
- package/scripts/dev-with-automation.mjs +1 -1
- package/scripts/static-server.mjs +33 -1
- package/build/assets/active-backend-context-CrHTlgvN.js +0 -2
- package/build/assets/agent-profiles-settings-Dzgb7G9z.js +0 -1
- package/build/assets/agent-server-conversation-service.api-tnqNjbpE.js +0 -86
- package/build/assets/agent-settings-DLtsqaOs.js +0 -2
- package/build/assets/agent-settings-fFvR-XC2.js +0 -1
- package/build/assets/alert-banner-HP6mX-Vr.js +0 -1
- package/build/assets/api-key-entry-screen-qTzrmJcr.js +0 -1
- package/build/assets/app-settings-dbnneVaV.js +0 -1
- package/build/assets/automation-detail-BmwlCUAB.js +0 -3
- package/build/assets/automation-git-sync-CprN5DcU.js +0 -1
- package/build/assets/automation-setup-route-C40kXjMY.js +0 -1
- package/build/assets/automations-list-DuNcRawl.js +0 -1
- package/build/assets/backend-form-modal-lhGwzXFI.js +0 -1
- package/build/assets/backend-synced-settings-badge-DPkz30BE.js +0 -1
- package/build/assets/badge-BU3S0VtE.js +0 -1
- package/build/assets/bot-dMYHVfYM.js +0 -1
- package/build/assets/browser-DSAo0tz1.js +0 -46
- package/build/assets/browser-tab-C9vy56R5.js +0 -1
- package/build/assets/canvas-extension-page-dx1gFrfW.js +0 -1
- package/build/assets/canvas-extensions-8A-XhpgP.js +0 -1
- package/build/assets/check-CS0vmpQQ.js +0 -1
- package/build/assets/chevron-down-e1QBpjVy.js +0 -1
- package/build/assets/chevron-right-ZG4R5G4Q.js +0 -1
- package/build/assets/circle-check-DzWLNsbE.js +0 -1
- package/build/assets/circle-plus-check-toggle-BO_kFZt3.js +0 -1
- package/build/assets/command-menu--UIlGL72.js +0 -1
- package/build/assets/commits-tab-AnZwLvh-.js +0 -1
- package/build/assets/confirmation-modal-Dv1ktp8K.js +0 -1
- package/build/assets/conversation-BbGrAO4Z.js +0 -93
- package/build/assets/conversation-mYT6NAoj.js +0 -1
- package/build/assets/conversation-panel-mYT6NAoj.js +0 -1
- package/build/assets/conversation-state-store-B0ImPLHO.js +0 -1
- package/build/assets/conversation-store-Ca3ghXap.js +0 -6
- package/build/assets/copy-to-clipboard-button-Ca8iSkkA.js +0 -1
- package/build/assets/device-verify-Bhn2e_Ye.js +0 -1
- package/build/assets/edit-automation-modal-DadGbJ2u.js +0 -1
- package/build/assets/empty-state-BoGVDecT.js +0 -1
- package/build/assets/enum-filter-dropdown-Bgca129f.js +0 -1
- package/build/assets/environment-switch-overlay-BmBRT7gv.js +0 -1
- package/build/assets/error-state-Body8Ngd.js +0 -1
- package/build/assets/extensions-hub-CcDqq_vR.js +0 -1
- package/build/assets/extensions-navigation-Cr4yzYk4.js +0 -1
- package/build/assets/external-link-DKUlnCQV.js +0 -1
- package/build/assets/files-tab-D4o2VyE_.js +0 -1
- package/build/assets/format-model-name-CasAP3nd.js +0 -1
- package/build/assets/get-git-path-ChKDVHZp.js +0 -1
- package/build/assets/git-repo-dropdown-4ROKl2cB.js +0 -1
- package/build/assets/git-repo-dropdown-BkqzkMmM.js +0 -1
- package/build/assets/highlighted-source-view-BFRxGT_Q.js +0 -1
- package/build/assets/home-ChpSuepX.js +0 -1
- package/build/assets/home-DIsB440S.js +0 -1
- package/build/assets/home-automation-run-tooltip-BVNDWjAH.js +0 -1
- package/build/assets/home-store-CY9Ej0ux.js +0 -1
- package/build/assets/index-home-BdlrFIif.js +0 -1
- package/build/assets/info-B6RQawoW.js +0 -1
- package/build/assets/install-server-modal-Dpy89p4g.js +0 -1
- package/build/assets/kebab-menu-item-content-D8hSNGmm.js +0 -1
- package/build/assets/launch-IrTDEFCs.js +0 -1
- package/build/assets/list-filter-DsEK7NFC.js +0 -1
- package/build/assets/llm-not-configured-banner-CIFABh3K.js +0 -27
- package/build/assets/llm-settings-B9juXhIa.js +0 -1
- package/build/assets/llm-settings-De1d5dfr.js +0 -1
- package/build/assets/llm-subscription-service-BpJ0ouQo.js +0 -1
- package/build/assets/loader-circle-CC1au6hc.js +0 -1
- package/build/assets/manage-backends-modal-BrPV3oB-.js +0 -1
- package/build/assets/manifest-80fb1c29.js +0 -1
- package/build/assets/manifest-subpage-layout-CAOYzrYp.js +0 -1
- package/build/assets/markdown-renderer-BzTlxI8x.js +0 -8
- package/build/assets/mcp-BTs_SXfZ.js +0 -1
- package/build/assets/mcp-page-BEBYqH_K.js +0 -9
- package/build/assets/messages-DKV9cRc2.js +0 -41
- package/build/assets/modal-close-button-DDzdRvCs.js +0 -1
- package/build/assets/onboarding-DV_OXoeP.js +0 -1
- package/build/assets/onboarding-modal-rkyBYkeQ.js +0 -1
- package/build/assets/organization-service.api-DrYNkEN_.js +0 -1
- package/build/assets/pencil-47jAZH_V.js +0 -1
- package/build/assets/pin-By41Vl5J.js +0 -1
- package/build/assets/planner-tab-C9uZmhme.js +0 -1
- package/build/assets/plug-CG5HFcNG.js +0 -1
- package/build/assets/plugins-management-service-BMJgC3Ga.js +0 -1
- package/build/assets/plus-C7Slq-0I.js +0 -1
- package/build/assets/profiles-service.api-ChoKrL0l.js +0 -1
- package/build/assets/providers-BhMcY5nv.js +0 -1
- package/build/assets/proxy-9Fe1v5na.js +0 -1
- package/build/assets/recommended-automations-launcher-6ABrI9Cy.js +0 -1
- package/build/assets/refresh-cw-3q3Frrii.js +0 -1
- package/build/assets/root-Dc8YmC9F.js +0 -2
- package/build/assets/root-VDaypvK4.css +0 -1
- package/build/assets/root-layout-CXkhSPYh.js +0 -2
- package/build/assets/schema-field-D-y9-LDb.js +0 -1
- package/build/assets/scroll-fade-state-Dw-i4SGq.js +0 -1
- package/build/assets/sdk-section-page-BlFiizlG.js +0 -1
- package/build/assets/secret-form-BB7the8W.js +0 -1
- package/build/assets/secrets-service-ByZVENbp.js +0 -1
- package/build/assets/secrets-settings-B_GpxKW2.js +0 -1
- package/build/assets/settings-C0EWuBtA.js +0 -1
- package/build/assets/settings-dropdown-input-BcwylHs2.js +0 -1
- package/build/assets/settings-index-5w5UW2K3.js +0 -1
- package/build/assets/settings-input-Db-1g8Ql.js +0 -1
- package/build/assets/settings-modal-DfJ3tcJQ.js +0 -1
- package/build/assets/settings-service.api-DJ1r62Zr.js +0 -1
- package/build/assets/settings-switch-CS-dJDmA.js +0 -1
- package/build/assets/shared-conversation-CA5ISEDy.js +0 -1
- package/build/assets/shield-check-D2aCRd16.js +0 -1
- package/build/assets/sidebar-mobile-menu-toggle-C_fb0Jki.js +0 -1
- package/build/assets/sidebar-store-DGqHkVLw.js +0 -1
- package/build/assets/skill-card-pill-row-B27-xyig.js +0 -1
- package/build/assets/skill-scope-B42H-XOc.js +0 -1
- package/build/assets/skills-plugins-tgF8EiXC.js +0 -1
- package/build/assets/skills-settings-BgJ9PaOe.js +0 -1
- package/build/assets/styled-tooltip-C4jf5Fv9.js +0 -1
- package/build/assets/task-list-tab-C5zcaktH.js +0 -1
- package/build/assets/toggle-switch-ChOLXv2n.js +0 -1
- package/build/assets/trash-2-D7K26eDO.js +0 -1
- package/build/assets/trash-D-HYiVYM.js +0 -1
- package/build/assets/triangle-alert-CtdXWHUI.js +0 -1
- package/build/assets/usage-tab-CVDffLPt.js +0 -1
- package/build/assets/use-acp-credential-form-XIQmpX6M.js +0 -1
- package/build/assets/use-activate-agent-profile-BLfmvDiG.js +0 -1
- package/build/assets/use-agent-profiles-Bd9Bvvp1.js +0 -1
- package/build/assets/use-canvas-extensions-Bi693ujJ.js +0 -1
- package/build/assets/use-config-A9QovgXO.js +0 -1
- package/build/assets/use-create-conversation-Dx3l7mFZ.js +0 -1
- package/build/assets/use-create-secret-B9cUFWRG.js +0 -1
- package/build/assets/use-has-permission-B3C8rQmR.js +0 -1
- package/build/assets/use-is-authed-nTBcM7dE.js +0 -1
- package/build/assets/use-llm-configured-BV9nZ1_j.js +0 -1
- package/build/assets/use-llm-profiles-BO-P4Oyo.js +0 -1
- package/build/assets/use-manifest-capabilities-Cw_flwEz.js +0 -1
- package/build/assets/use-onboarding-completion-D8U7k4Qb.js +0 -1
- package/build/assets/use-pinned-home-route-CckOZrmb.js +0 -1
- package/build/assets/use-plugins-marketplace-7i94Zu3Z.js +0 -1
- package/build/assets/use-save-agent-profile-BUjSsDXK.js +0 -1
- package/build/assets/use-settings-DSXLbvBl.js +0 -1
- package/build/assets/use-settings-nav-items-CwRw-CmX.js +0 -16
- package/build/assets/use-tracking-D53y3TH9.js +0 -3
- package/build/assets/useQueries-DlbhlH9I.js +0 -1
- package/build/assets/useQuery-BSTgq1rl.js +0 -1
- package/build/assets/utils-CN5ZfZy1.js +0 -1
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-DqZDXfg2.js +0 -186
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-rfV8mQ9m.js +0 -1
- package/build/assets/vendor~root-layout-C9Ju9DQg.js +0 -1
- package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-BWir3rJs.js +0 -1
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-cDuKr-WD.js +0 -1
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-Chf7vmKB.js +0 -1
- package/build/assets/x-DJdhbdmt.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/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
|
@@ -3,7 +3,14 @@ import t from "../package.js";
|
|
|
3
3
|
import { AGENT_CANVAS_CLIENT_SOURCE as n, AGENT_CANVAS_CLIENT_VERSION as r } from "../api/client-source.js";
|
|
4
4
|
import { getBackendTelemetryProperties as i, getCloudTelemetryProperties as a } from "./telemetry-context.js";
|
|
5
5
|
//#region src/services/telemetry.ts
|
|
6
|
-
var o = "openhands-telemetry-consent", s = "openhands-telemetry-consent-pending-cloud-sync", c = "openhands-telemetry-consent-pending-local-revocation", l = "openhands-telemetry-consent-change", u = "openhands-telemetry-first-use", d = "openhands-telemetry-session", f = "agent-canvas", p = "history_change",
|
|
6
|
+
var o = "openhands-telemetry-consent", s = "openhands-telemetry-consent-pending-cloud-sync", c = "openhands-telemetry-consent-pending-local-revocation", l = "openhands-telemetry-consent-change", u = "openhands-telemetry-first-use", d = "openhands-telemetry-session", f = "agent-canvas", p = "history_change", ee = "phc_BgzfxKdgsYMLFTmJqt424ZoyVHvKFfrwttLimzdYTKFK", m = "https://z.openhands.dev", h = "https://us.posthog.com", g = null, _ = null, v, y = {}, b = !1;
|
|
7
|
+
function x() {
|
|
8
|
+
return typeof window < "u" && window.__AGENT_CANVAS_DO_NOT_TRACK__ === !0;
|
|
9
|
+
}
|
|
10
|
+
function S() {
|
|
11
|
+
return b || x();
|
|
12
|
+
}
|
|
13
|
+
var C, w = 0, T = -1, te = Object.freeze({
|
|
7
14
|
client_source: n,
|
|
8
15
|
client_version: r,
|
|
9
16
|
package_name: t.name,
|
|
@@ -15,65 +22,65 @@ function O(e) {
|
|
|
15
22
|
function k(e) {
|
|
16
23
|
D = a(e);
|
|
17
24
|
}
|
|
18
|
-
function
|
|
25
|
+
function A(e) {
|
|
19
26
|
return e ? {
|
|
20
27
|
...e,
|
|
21
28
|
properties: {
|
|
22
29
|
...E,
|
|
23
30
|
...D,
|
|
24
31
|
...e.properties,
|
|
25
|
-
...
|
|
32
|
+
...te
|
|
26
33
|
}
|
|
27
34
|
} : null;
|
|
28
35
|
}
|
|
29
|
-
function
|
|
30
|
-
|
|
36
|
+
function j(e) {
|
|
37
|
+
b || B() !== "granted" ? e.opt_out_capturing() : e.opt_in_capturing();
|
|
31
38
|
}
|
|
32
|
-
function
|
|
33
|
-
e.reset(t),
|
|
39
|
+
function M(e, t = !1) {
|
|
40
|
+
e.reset(t), T = -1, j(e);
|
|
34
41
|
}
|
|
35
|
-
function
|
|
36
|
-
if (
|
|
37
|
-
let t =
|
|
38
|
-
if (n != null && n !== t &&
|
|
39
|
-
|
|
42
|
+
function N(e) {
|
|
43
|
+
if (C === void 0 || !X()) return;
|
|
44
|
+
let t = C?.distinctId, n = e.get_property("$user_id");
|
|
45
|
+
if (n != null && n !== t && M(e), C === null) {
|
|
46
|
+
T = w;
|
|
40
47
|
return;
|
|
41
48
|
}
|
|
42
|
-
(e.get_property("$user_id") !==
|
|
49
|
+
(e.get_property("$user_id") !== C.distinctId || T !== w) && (e.identify(C.distinctId, C.properties), T = w);
|
|
43
50
|
}
|
|
44
|
-
function
|
|
51
|
+
function ne(e, t) {
|
|
45
52
|
let n = Object.keys(e);
|
|
46
53
|
return n.length === Object.keys(t).length && n.every((n) => e[n] === t[n]);
|
|
47
54
|
}
|
|
48
|
-
function
|
|
55
|
+
function re(e) {
|
|
49
56
|
if (e === !1) {
|
|
50
|
-
if (
|
|
51
|
-
|
|
57
|
+
if (b) return;
|
|
58
|
+
b = !0, g?.opt_out_capturing(), U();
|
|
52
59
|
return;
|
|
53
60
|
}
|
|
54
|
-
let t =
|
|
55
|
-
if (
|
|
61
|
+
let t = b;
|
|
62
|
+
if (b = !1, !g && !_) {
|
|
56
63
|
let t = Object.fromEntries(Object.entries(e).filter(([, e]) => e !== void 0));
|
|
57
|
-
|
|
58
|
-
...
|
|
64
|
+
y = {
|
|
65
|
+
...y,
|
|
59
66
|
...t
|
|
60
67
|
};
|
|
61
68
|
}
|
|
62
|
-
t && (
|
|
69
|
+
t && (g && (j(g), N(g)), U());
|
|
63
70
|
}
|
|
64
|
-
function
|
|
65
|
-
return
|
|
66
|
-
apiKey:
|
|
67
|
-
apiHost:
|
|
68
|
-
uiHost:
|
|
71
|
+
function P() {
|
|
72
|
+
return S() ? null : {
|
|
73
|
+
apiKey: y.apiKey || ee,
|
|
74
|
+
apiHost: y.apiHost || m,
|
|
75
|
+
uiHost: y.uiHost || h
|
|
69
76
|
};
|
|
70
77
|
}
|
|
71
|
-
function
|
|
78
|
+
function F() {
|
|
72
79
|
return typeof window < "u" && typeof localStorage < "u";
|
|
73
80
|
}
|
|
74
|
-
async function
|
|
75
|
-
if (!
|
|
76
|
-
if (
|
|
81
|
+
async function I() {
|
|
82
|
+
if (!F()) return null;
|
|
83
|
+
if (g) return g;
|
|
77
84
|
try {
|
|
78
85
|
let { default: e } = await import("../node_modules/posthog-js/dist/module.js");
|
|
79
86
|
return e;
|
|
@@ -81,19 +88,19 @@ async function L() {
|
|
|
81
88
|
return null;
|
|
82
89
|
}
|
|
83
90
|
}
|
|
84
|
-
function
|
|
85
|
-
return !!(x || typeof process < "u" && process.env?.DO_NOT_TRACK === "1" || typeof navigator < "u" && (navigator.doNotTrack === "1" || typeof window < "u" && window.doNotTrack === "1"));
|
|
91
|
+
function L() {
|
|
92
|
+
return !!(b || x() || typeof process < "u" && process.env?.DO_NOT_TRACK === "1" || typeof navigator < "u" && (navigator.doNotTrack === "1" || typeof window < "u" && window.doNotTrack === "1"));
|
|
86
93
|
}
|
|
87
|
-
function
|
|
88
|
-
|
|
94
|
+
function R(e) {
|
|
95
|
+
g || (v = e);
|
|
89
96
|
}
|
|
90
|
-
async function
|
|
97
|
+
async function z(e = !1) {
|
|
98
|
+
if (g) return g;
|
|
91
99
|
if (_) return _;
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
let t = F();
|
|
100
|
+
_ = (async () => {
|
|
101
|
+
let t = P();
|
|
95
102
|
if (!t) return null;
|
|
96
|
-
let n = await
|
|
103
|
+
let n = await I();
|
|
97
104
|
if (!n) return null;
|
|
98
105
|
let r = n.init(t.apiKey, {
|
|
99
106
|
api_host: t.apiHost,
|
|
@@ -106,20 +113,20 @@ async function B(e = !1) {
|
|
|
106
113
|
capture_pageview: p,
|
|
107
114
|
autocapture: !0,
|
|
108
115
|
disable_session_recording: !0,
|
|
109
|
-
bootstrap:
|
|
110
|
-
before_send:
|
|
116
|
+
bootstrap: v,
|
|
117
|
+
before_send: A
|
|
111
118
|
}, f);
|
|
112
|
-
return r ? (
|
|
119
|
+
return r ? (g = r, v = void 0, b ? g.opt_out_capturing() : B() === "granted" ? (g.opt_in_capturing(), N(g)) : e || g.opt_out_capturing(), g) : null;
|
|
113
120
|
})();
|
|
114
121
|
try {
|
|
115
|
-
return await
|
|
122
|
+
return await _;
|
|
116
123
|
} finally {
|
|
117
|
-
|
|
124
|
+
g || (_ = null);
|
|
118
125
|
}
|
|
119
126
|
}
|
|
120
|
-
function
|
|
121
|
-
if (!
|
|
122
|
-
if (
|
|
127
|
+
function B() {
|
|
128
|
+
if (!F()) return "pending";
|
|
129
|
+
if (L()) return "denied";
|
|
123
130
|
if (e() === "cookie") return "granted";
|
|
124
131
|
try {
|
|
125
132
|
let e = localStorage.getItem(o);
|
|
@@ -127,16 +134,16 @@ function V() {
|
|
|
127
134
|
} catch {}
|
|
128
135
|
return "pending";
|
|
129
136
|
}
|
|
130
|
-
function
|
|
131
|
-
if (!
|
|
137
|
+
function V() {
|
|
138
|
+
if (!F()) return null;
|
|
132
139
|
try {
|
|
133
140
|
return localStorage.getItem(c);
|
|
134
141
|
} catch {
|
|
135
142
|
return null;
|
|
136
143
|
}
|
|
137
144
|
}
|
|
138
|
-
function
|
|
139
|
-
if (!
|
|
145
|
+
function H(e) {
|
|
146
|
+
if (!F()) return () => {};
|
|
140
147
|
let t = (t) => {
|
|
141
148
|
(t.key === o || t.key === s) && e();
|
|
142
149
|
};
|
|
@@ -144,138 +151,138 @@ function U(e) {
|
|
|
144
151
|
window.removeEventListener(l, e), window.removeEventListener("storage", t);
|
|
145
152
|
};
|
|
146
153
|
}
|
|
147
|
-
function
|
|
148
|
-
|
|
154
|
+
function U() {
|
|
155
|
+
F() && window.dispatchEvent(new Event(l));
|
|
149
156
|
}
|
|
150
|
-
function
|
|
151
|
-
if (
|
|
157
|
+
function W(e) {
|
|
158
|
+
if (F()) try {
|
|
152
159
|
localStorage.setItem(s, e);
|
|
153
160
|
} catch {}
|
|
154
161
|
}
|
|
155
|
-
function
|
|
156
|
-
if (!(!
|
|
162
|
+
function G(e) {
|
|
163
|
+
if (!(!F() || !e)) try {
|
|
157
164
|
localStorage.setItem(c, e);
|
|
158
165
|
} catch {}
|
|
159
166
|
}
|
|
160
|
-
function
|
|
161
|
-
if (
|
|
167
|
+
function K(e) {
|
|
168
|
+
if (F()) try {
|
|
162
169
|
if (localStorage.getItem(c) !== e) return;
|
|
163
170
|
localStorage.removeItem(c);
|
|
164
171
|
} catch {}
|
|
165
172
|
}
|
|
166
|
-
function
|
|
167
|
-
if (
|
|
173
|
+
function q(e) {
|
|
174
|
+
if (F()) try {
|
|
168
175
|
if (e !== void 0 && localStorage.getItem(s) !== e) return;
|
|
169
|
-
localStorage.removeItem(s),
|
|
176
|
+
localStorage.removeItem(s), U();
|
|
170
177
|
} catch {}
|
|
171
178
|
}
|
|
172
|
-
async function
|
|
173
|
-
if (
|
|
174
|
-
let t =
|
|
175
|
-
if (localStorage.setItem(o, e),
|
|
176
|
-
let n =
|
|
179
|
+
async function J(e, { syncToCloud: t = !0 } = {}) {
|
|
180
|
+
if (F()) try {
|
|
181
|
+
let t = B() === e;
|
|
182
|
+
if (localStorage.setItem(o, e), S() || t) return;
|
|
183
|
+
let n = g ?? await z();
|
|
177
184
|
if (!n) return;
|
|
178
|
-
e === "granted" ? (n.opt_in_capturing(),
|
|
185
|
+
e === "granted" ? (n.opt_in_capturing(), N(n)) : (G(n.get_distinct_id?.() ?? null), n.get_property?.("$user_id") == null ? n.opt_out_capturing() : M(n));
|
|
179
186
|
} catch {} finally {
|
|
180
|
-
t &&
|
|
187
|
+
t && W(e), U();
|
|
181
188
|
}
|
|
182
189
|
}
|
|
183
|
-
async function
|
|
190
|
+
async function Y(e, t = {}) {
|
|
184
191
|
let n = e === null ? null : {
|
|
185
192
|
distinctId: e,
|
|
186
193
|
properties: t
|
|
187
194
|
};
|
|
188
|
-
if (
|
|
189
|
-
let r =
|
|
190
|
-
r &&
|
|
195
|
+
if (C === n || C != null && n !== null && C.distinctId === n.distinctId && ne(C.properties, t) || (C = n, w += 1, T = -1, !X())) return;
|
|
196
|
+
let r = g ?? await z();
|
|
197
|
+
r && X() && N(r);
|
|
191
198
|
}
|
|
192
|
-
function
|
|
193
|
-
return
|
|
199
|
+
function X() {
|
|
200
|
+
return B() === "granted";
|
|
194
201
|
}
|
|
195
|
-
function
|
|
196
|
-
if (!
|
|
202
|
+
function Z() {
|
|
203
|
+
if (!F()) return !1;
|
|
197
204
|
try {
|
|
198
205
|
return localStorage.getItem(u) === "true";
|
|
199
206
|
} catch {
|
|
200
207
|
return !1;
|
|
201
208
|
}
|
|
202
209
|
}
|
|
203
|
-
function
|
|
204
|
-
if (
|
|
210
|
+
function ie() {
|
|
211
|
+
if (F()) try {
|
|
205
212
|
localStorage.setItem(u, "true");
|
|
206
213
|
} catch {}
|
|
207
214
|
}
|
|
208
|
-
async function
|
|
209
|
-
if (
|
|
210
|
-
let e = await
|
|
211
|
-
!e ||
|
|
215
|
+
async function ae() {
|
|
216
|
+
if (L() || Z()) return;
|
|
217
|
+
let e = await z(!0);
|
|
218
|
+
!e || L() || ((e.has_opted_out_capturing?.() ?? !1) && e.opt_in_capturing(), e.capture("canvas_install", {
|
|
212
219
|
platform: typeof navigator < "u" ? navigator.platform : "unknown",
|
|
213
220
|
user_agent: typeof navigator < "u" ? navigator.userAgent : "unknown",
|
|
214
221
|
referrer: typeof document < "u" ? document.referrer : "",
|
|
215
222
|
url_origin: typeof window < "u" ? window.location.origin : "",
|
|
216
223
|
embedded: typeof window < "u" && window.self !== window.top
|
|
217
|
-
}),
|
|
224
|
+
}), ie(), B() !== "granted" && e.opt_out_capturing());
|
|
218
225
|
}
|
|
219
|
-
function
|
|
220
|
-
if (!
|
|
226
|
+
function oe() {
|
|
227
|
+
if (!F()) return !1;
|
|
221
228
|
try {
|
|
222
229
|
return sessionStorage.getItem(d) === "true";
|
|
223
230
|
} catch {
|
|
224
231
|
return !1;
|
|
225
232
|
}
|
|
226
233
|
}
|
|
227
|
-
function
|
|
228
|
-
if (
|
|
234
|
+
function se() {
|
|
235
|
+
if (F()) try {
|
|
229
236
|
sessionStorage.setItem(d, "true");
|
|
230
237
|
} catch {}
|
|
231
238
|
}
|
|
232
|
-
async function
|
|
233
|
-
if (!
|
|
234
|
-
let e = await
|
|
235
|
-
return !e || !
|
|
239
|
+
async function Q() {
|
|
240
|
+
if (!X() || B() !== "granted") return null;
|
|
241
|
+
let e = await z();
|
|
242
|
+
return !e || !X() ? null : (e.has_opted_out_capturing?.() && e.opt_in_capturing(), N(e), e);
|
|
236
243
|
}
|
|
237
|
-
async function
|
|
238
|
-
if (
|
|
239
|
-
let e = await
|
|
240
|
-
e && (e.capture("canvas_new_session", { is_first_use: !
|
|
244
|
+
async function ce() {
|
|
245
|
+
if (oe()) return;
|
|
246
|
+
let e = await Q();
|
|
247
|
+
e && (e.capture("canvas_new_session", { is_first_use: !Z() }), se());
|
|
241
248
|
}
|
|
242
|
-
async function
|
|
243
|
-
return (await
|
|
249
|
+
async function le() {
|
|
250
|
+
return (await Q())?.get_distinct_id?.() ?? null;
|
|
244
251
|
}
|
|
245
|
-
async function
|
|
246
|
-
if (!
|
|
247
|
-
if (
|
|
248
|
-
let e =
|
|
252
|
+
async function $() {
|
|
253
|
+
if (!F()) return null;
|
|
254
|
+
if (B() !== "granted") {
|
|
255
|
+
let e = V();
|
|
249
256
|
if (e) return e;
|
|
250
257
|
}
|
|
251
|
-
return
|
|
258
|
+
return b || L() ? null : (await z())?.get_distinct_id?.() ?? null;
|
|
252
259
|
}
|
|
253
|
-
async function
|
|
254
|
-
let n = await
|
|
260
|
+
async function ue(e, t = {}) {
|
|
261
|
+
let n = await Q();
|
|
255
262
|
n && n.capture(e, t);
|
|
256
263
|
}
|
|
257
|
-
async function
|
|
258
|
-
if (
|
|
264
|
+
async function de() {
|
|
265
|
+
if (F()) {
|
|
259
266
|
try {
|
|
260
|
-
|
|
267
|
+
G(g?.get_distinct_id?.() ?? null), localStorage.removeItem(o), localStorage.removeItem(u);
|
|
261
268
|
} catch {}
|
|
262
|
-
|
|
269
|
+
q();
|
|
263
270
|
try {
|
|
264
271
|
sessionStorage.removeItem(d);
|
|
265
272
|
} catch {}
|
|
266
|
-
E = i({}), D = a(),
|
|
273
|
+
E = i({}), D = a(), C = null, w += 1, T = -1;
|
|
267
274
|
try {
|
|
268
|
-
|
|
275
|
+
g && M(g, !0);
|
|
269
276
|
} catch {
|
|
270
277
|
try {
|
|
271
|
-
|
|
278
|
+
g?.opt_out_capturing();
|
|
272
279
|
} catch {}
|
|
273
280
|
} finally {
|
|
274
|
-
|
|
281
|
+
U();
|
|
275
282
|
}
|
|
276
283
|
}
|
|
277
284
|
}
|
|
278
285
|
//#endregion
|
|
279
|
-
export {
|
|
286
|
+
export { K as clearPendingLocalTelemetryRevocation, de as clearTelemetryData, R as configurePostHogBootstrap, re as configureTelemetry, B as getTelemetryConsent, le as getTelemetryDistinctId, $ as getTelemetryDistinctIdForConsentSync, z as initializePostHogClient, X as isTelemetryEnabled, O as setTelemetryBackendContext, k as setTelemetryCloudContext, J as setTelemetryConsent, Y as setTelemetryIdentity, H as subscribeTelemetryConsent, ue as trackEvent, ae as trackInstall, ce as trackSessionStart };
|
|
280
287
|
|
|
281
288
|
//# sourceMappingURL=telemetry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","names":[],"sources":["../../src/services/telemetry.ts"],"sourcesContent":["/**\n * Telemetry service for tracking library usage.\n *\n * This module handles anonymous telemetry for the @openhands/agent-canvas package\n * using the PostHog SDK for reliable event delivery with batching, retry logic,\n * and offline support.\n *\n * TRACKING PHILOSOPHY:\n * - Install event (canvas_install): Sent immediately on first use, regardless of consent.\n * This is anonymous and contains no PII - just basic browser info and a random ID.\n * - Session/custom events: Only sent after user grants consent via the consent modal.\n * - Users can opt out of all future tracking by declining consent.\n *\n * AD BLOCKER BYPASS:\n * By default, telemetry is routed through OpenHands' reverse proxy (z.openhands.dev)\n * to avoid being blocked by ad blockers. Library consumers can override this with:\n * - VITE_POSTHOG_HOST: Custom proxy URL or direct PostHog URL\n * - VITE_POSTHOG_UI_HOST: PostHog UI host (defaults to https://us.posthog.com)\n *\n * IMPORTANT: By default, telemetry is sent to the OpenHands PostHog project.\n * Source builds can override this with VITE_POSTHOG_API_KEY. Precompiled\n * library consumers can pass the same settings to configureTelemetry().\n *\n * Users can disable all telemetry (including install tracking) via:\n * - Setting VITE_DO_NOT_TRACK=1 environment variable\n * - Browser's Do Not Track setting\n */\n\nimport type { BootstrapConfig, CaptureResult, PostHog } from \"posthog-js\";\nimport { getLockedCloudAuthMode } from \"#/api/agent-server-config\";\nimport defaults from \"../../config/defaults.json\";\n\nimport packageJson from \"../../package.json\";\nimport {\n AGENT_CANVAS_CLIENT_SOURCE,\n AGENT_CANVAS_CLIENT_VERSION,\n} from \"#/api/client-source\";\nimport {\n getBackendTelemetryProperties,\n getCloudTelemetryProperties,\n type BackendTelemetryContextInput,\n type CloudTelemetryContextInput,\n} from \"#/services/telemetry-context\";\n\nconst TELEMETRY_CONSENT_KEY = \"openhands-telemetry-consent\";\nconst TELEMETRY_CONSENT_PENDING_CLOUD_SYNC_KEY =\n \"openhands-telemetry-consent-pending-cloud-sync\";\nconst TELEMETRY_CONSENT_PENDING_LOCAL_REVOCATION_KEY =\n \"openhands-telemetry-consent-pending-local-revocation\";\nconst TELEMETRY_CONSENT_CHANGE_EVENT = \"openhands-telemetry-consent-change\";\nconst TELEMETRY_FIRST_USE_KEY = \"openhands-telemetry-first-use\";\nconst TELEMETRY_SESSION_KEY = \"openhands-telemetry-session\";\nconst POSTHOG_INSTANCE_NAME = \"agent-canvas\";\nconst POSTHOG_PAGEVIEW_CAPTURE_MODE = \"history_change\";\n\n// Unconfigured source builds use staging. Production release workflows pass\n// VITE_POSTHOG_API_KEY explicitly for both the app and library artifacts.\nconst DEFAULT_POSTHOG_API_KEY: string =\n (import.meta.env.VITE_POSTHOG_API_KEY as string | undefined) ||\n defaults.telemetry.posthogApiKey;\n\n// Default to OpenHands' reverse proxy to bypass ad blockers.\n// The proxy at z.openhands.dev routes to PostHog's US region.\n// Library consumers can override this with their own proxy or direct PostHog URL.\nconst DEFAULT_POSTHOG_HOST =\n import.meta.env.VITE_POSTHOG_HOST || \"https://z.openhands.dev\";\n\n// UI host is needed for PostHog features like toolbar to work correctly\n// when using a reverse proxy. Defaults to US region.\nconst DEFAULT_POSTHOG_UI_HOST =\n import.meta.env.VITE_POSTHOG_UI_HOST || \"https://us.posthog.com\";\n\nexport interface TelemetryConfig {\n /** PostHog project key. Useful for precompiled library consumers. */\n apiKey?: string;\n /** Event ingestion host or reverse proxy. */\n apiHost?: string;\n /** PostHog UI host used by toolbar links and other UI features. */\n uiHost?: string;\n}\n\nexport type TelemetryConfiguration = TelemetryConfig | false;\n\nexport type TelemetryConsent = \"granted\" | \"denied\" | \"pending\";\nexport type ResolvedTelemetryConsent = Exclude<TelemetryConsent, \"pending\">;\n\nexport interface SetTelemetryConsentOptions {\n /** Do not persist a value mirrored from backend settings back to Cloud. */\n syncToCloud?: boolean;\n}\n\nlet posthogInstance: PostHog | null = null;\nlet initializationPromise: Promise<PostHog | null> | null = null;\nlet pendingBootstrap: BootstrapConfig | undefined;\nlet telemetryConfig: TelemetryConfig = {};\nlet telemetryDisabled = false;\n\ninterface TelemetryIdentity {\n distinctId: string;\n properties: Record<string, unknown>;\n}\n\n// undefined means that Cloud identity has not resolved yet; null means that it\n// resolved without a user. This distinction prevents startup from resetting a\n// persisted identity while the current account is still loading.\nlet desiredTelemetryIdentity: TelemetryIdentity | null | undefined;\nlet desiredIdentityRevision = 0;\nlet appliedIdentityRevision = -1;\n\nconst CANVAS_EVENT_PROPERTIES = Object.freeze({\n client_source: AGENT_CANVAS_CLIENT_SOURCE,\n client_version: AGENT_CANVAS_CLIENT_VERSION,\n package_name: packageJson.name,\n package_version: packageJson.version,\n});\n\nlet telemetryBackendContext = getBackendTelemetryProperties({});\nlet telemetryCloudContext = getCloudTelemetryProperties();\n\nexport function setTelemetryBackendContext(\n context: BackendTelemetryContextInput,\n): void {\n telemetryBackendContext = getBackendTelemetryProperties(context);\n}\n\nexport function setTelemetryCloudContext(\n context: CloudTelemetryContextInput | null,\n): void {\n telemetryCloudContext = getCloudTelemetryProperties(context);\n}\n\nfunction addCanvasEventProperties(\n event: CaptureResult | null,\n): CaptureResult | null {\n if (!event) return null;\n\n return {\n ...event,\n properties: {\n ...telemetryBackendContext,\n ...telemetryCloudContext,\n ...event.properties,\n ...CANVAS_EVENT_PROPERTIES,\n },\n };\n}\n\nfunction restorePostHogConsent(posthog: PostHog): void {\n if (telemetryDisabled || getTelemetryConsent() !== \"granted\") {\n posthog.opt_out_capturing();\n } else {\n posthog.opt_in_capturing();\n }\n}\n\nfunction resetPostHogIdentity(posthog: PostHog, resetDeviceId = false): void {\n posthog.reset(resetDeviceId);\n appliedIdentityRevision = -1;\n // PostHog reset clears its own consent persistence, so immediately restore\n // the canonical Canvas decision kept in localStorage.\n restorePostHogConsent(posthog);\n}\n\nfunction applyDesiredTelemetryIdentity(posthog: PostHog): void {\n if (desiredTelemetryIdentity === undefined || !isTelemetryEnabled()) return;\n\n const desiredId = desiredTelemetryIdentity?.distinctId;\n const currentId = posthog.get_property(\"$user_id\");\n if (currentId != null && currentId !== desiredId) {\n resetPostHogIdentity(posthog);\n }\n\n if (desiredTelemetryIdentity === null) {\n appliedIdentityRevision = desiredIdentityRevision;\n return;\n }\n\n if (\n posthog.get_property(\"$user_id\") !== desiredTelemetryIdentity.distinctId ||\n appliedIdentityRevision !== desiredIdentityRevision\n ) {\n posthog.identify(\n desiredTelemetryIdentity.distinctId,\n desiredTelemetryIdentity.properties,\n );\n appliedIdentityRevision = desiredIdentityRevision;\n }\n}\n\nfunction propertiesEqual(\n left: Record<string, unknown>,\n right: Record<string, unknown>,\n): boolean {\n const keys = Object.keys(left);\n return (\n keys.length === Object.keys(right).length &&\n keys.every((key) => left[key] === right[key])\n );\n}\n\n/**\n * Configure the single Canvas telemetry client before its first use.\n * Passing false disables telemetry and install tracking for embedded hosts.\n */\nexport function configureTelemetry(config: TelemetryConfiguration): void {\n if (config === false) {\n if (telemetryDisabled) return;\n telemetryDisabled = true;\n posthogInstance?.opt_out_capturing();\n notifyTelemetryConsentListeners();\n return;\n }\n\n const wasDisabled = telemetryDisabled;\n telemetryDisabled = false;\n\n if (!posthogInstance && !initializationPromise) {\n const definedConfig = Object.fromEntries(\n Object.entries(config).filter(([, value]) => value !== undefined),\n ) as TelemetryConfig;\n telemetryConfig = { ...telemetryConfig, ...definedConfig };\n }\n\n if (wasDisabled) {\n if (posthogInstance) {\n restorePostHogConsent(posthogInstance);\n applyDesiredTelemetryIdentity(posthogInstance);\n }\n notifyTelemetryConsentListeners();\n }\n}\n\nfunction getResolvedTelemetryConfig(): Required<TelemetryConfig> | null {\n if (telemetryDisabled) return null;\n\n return {\n apiKey: telemetryConfig.apiKey || DEFAULT_POSTHOG_API_KEY,\n apiHost: telemetryConfig.apiHost || DEFAULT_POSTHOG_HOST,\n uiHost: telemetryConfig.uiHost || DEFAULT_POSTHOG_UI_HOST,\n };\n}\n\n/**\n * Check if we're in a browser environment\n */\nfunction isBrowser(): boolean {\n return typeof window !== \"undefined\" && typeof localStorage !== \"undefined\";\n}\n\n/**\n * Lazily load PostHog to avoid SSR/Node.js issues.\n * PostHog is a browser-only library, so we dynamically import it only when needed.\n */\nasync function getPostHog(): Promise<PostHog | null> {\n if (!isBrowser()) {\n return null;\n }\n\n if (posthogInstance) {\n return posthogInstance;\n }\n\n try {\n const { default: posthog } = await import(\"posthog-js\");\n return posthog;\n } catch {\n // Failed to load PostHog - telemetry will be disabled\n return null;\n }\n}\n\n/**\n * Check if telemetry is disabled via environment variable or browser setting.\n * Works in both Node.js and browser (Vite) environments.\n */\nfunction isDoNotTrackEnabled(): boolean {\n if (telemetryDisabled) {\n return true;\n }\n\n // Check Vite environment variable (browser)\n if (\n typeof import.meta !== \"undefined\" &&\n import.meta.env?.VITE_DO_NOT_TRACK === \"1\"\n ) {\n return true;\n }\n\n // Check Node.js environment variable (SSR/testing)\n if (typeof process !== \"undefined\" && process.env?.DO_NOT_TRACK === \"1\") {\n return true;\n }\n\n // Check browser's navigator.doNotTrack standard\n if (\n typeof navigator !== \"undefined\" &&\n (navigator.doNotTrack === \"1\" ||\n // @ts-expect-error - Some browsers use window.doNotTrack\n (typeof window !== \"undefined\" && window.doNotTrack === \"1\"))\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Initialize PostHog SDK.\n *\n * @param enableCapturing - If true, enable capturing immediately (for install tracking).\n * If false, start with capturing disabled (for consent-gated tracking).\n */\nexport function configurePostHogBootstrap(\n bootstrap: BootstrapConfig | undefined,\n): void {\n if (!posthogInstance) {\n pendingBootstrap = bootstrap;\n }\n}\n\nexport async function initializePostHogClient(\n enableCapturing = false,\n): Promise<PostHog | null> {\n if (posthogInstance) {\n return posthogInstance;\n }\n\n if (initializationPromise) {\n return initializationPromise;\n }\n\n initializationPromise = (async () => {\n const config = getResolvedTelemetryConfig();\n if (!config) {\n return null;\n }\n\n const posthog = await getPostHog();\n if (!posthog) {\n return null;\n }\n\n // A named instance isolates Canvas configuration, consent, identity, and\n // persistence from a host application's default PostHog singleton.\n const initializedPostHog = posthog.init(\n config.apiKey,\n {\n api_host: config.apiHost,\n ui_host: config.uiHost,\n opt_out_capturing_by_default: !enableCapturing,\n persistence: \"localStorage\",\n persistence_name: POSTHOG_INSTANCE_NAME,\n consent_persistence_name: `${POSTHOG_INSTANCE_NAME}-consent`,\n person_profiles: \"always\",\n capture_pageview: POSTHOG_PAGEVIEW_CAPTURE_MODE,\n autocapture: true,\n disable_session_recording: true,\n bootstrap: pendingBootstrap,\n before_send: addCanvasEventProperties,\n },\n POSTHOG_INSTANCE_NAME,\n );\n if (!initializedPostHog) return null;\n\n posthogInstance = initializedPostHog;\n pendingBootstrap = undefined;\n\n if (telemetryDisabled) {\n posthogInstance.opt_out_capturing();\n } else if (getTelemetryConsent() === \"granted\") {\n posthogInstance.opt_in_capturing();\n applyDesiredTelemetryIdentity(posthogInstance);\n } else if (!enableCapturing) {\n posthogInstance.opt_out_capturing();\n }\n\n return posthogInstance;\n })();\n\n try {\n return await initializationPromise;\n } finally {\n if (!posthogInstance) {\n initializationPromise = null;\n }\n }\n}\n\n/**\n * Get user's telemetry consent preference\n */\nexport function getTelemetryConsent(): TelemetryConsent {\n if (!isBrowser()) {\n return \"pending\";\n }\n\n // Check environment variable for opt-out\n if (isDoNotTrackEnabled()) {\n return \"denied\";\n }\n\n if (getLockedCloudAuthMode() === \"cookie\") {\n return \"granted\";\n }\n\n try {\n const consent = localStorage.getItem(TELEMETRY_CONSENT_KEY);\n if (consent === \"granted\" || consent === \"denied\") {\n return consent;\n }\n } catch {\n // Ignore storage errors\n }\n\n return \"pending\";\n}\n\n/**\n * Return an explicit browser choice that still needs to survive a Cloud login.\n * It remains pending across local backends so their settings cannot consume a\n * decision that must still be applied after the user connects to Cloud.\n */\nexport function getPendingCloudTelemetryConsent(): ResolvedTelemetryConsent | null {\n if (!isBrowser()) return null;\n\n try {\n const consent = localStorage.getItem(\n TELEMETRY_CONSENT_PENDING_CLOUD_SYNC_KEY,\n );\n return consent === \"granted\" || consent === \"denied\" ? consent : null;\n } catch {\n return null;\n }\n}\n\n/** Return the pre-reset actor whose local Automation consent must be revoked. */\nexport function getPendingLocalTelemetryRevocationId(): string | null {\n if (!isBrowser()) return null;\n\n try {\n return localStorage.getItem(TELEMETRY_CONSENT_PENDING_LOCAL_REVOCATION_KEY);\n } catch {\n return null;\n }\n}\n\nexport function subscribeTelemetryConsent(listener: () => void): () => void {\n if (!isBrowser()) return () => {};\n const handleStorage = (event: StorageEvent) => {\n if (\n event.key === TELEMETRY_CONSENT_KEY ||\n event.key === TELEMETRY_CONSENT_PENDING_CLOUD_SYNC_KEY\n ) {\n listener();\n }\n };\n window.addEventListener(TELEMETRY_CONSENT_CHANGE_EVENT, listener);\n window.addEventListener(\"storage\", handleStorage);\n\n return () => {\n window.removeEventListener(TELEMETRY_CONSENT_CHANGE_EVENT, listener);\n window.removeEventListener(\"storage\", handleStorage);\n };\n}\n\nfunction notifyTelemetryConsentListeners(): void {\n if (isBrowser())\n window.dispatchEvent(new Event(TELEMETRY_CONSENT_CHANGE_EVENT));\n}\n\nfunction markTelemetryConsentForCloudSync(\n consent: ResolvedTelemetryConsent,\n): void {\n if (!isBrowser()) return;\n\n try {\n localStorage.setItem(TELEMETRY_CONSENT_PENDING_CLOUD_SYNC_KEY, consent);\n } catch {\n // Ignore storage errors; the in-browser consent decision still applies.\n }\n}\n\nfunction markPendingLocalTelemetryRevocation(distinctId: string | null): void {\n if (!isBrowser() || !distinctId) return;\n\n try {\n localStorage.setItem(\n TELEMETRY_CONSENT_PENDING_LOCAL_REVOCATION_KEY,\n distinctId,\n );\n } catch {\n // Ignore storage errors; browser capture is still disabled below.\n }\n}\n\nexport function clearPendingLocalTelemetryRevocation(\n expectedDistinctId: string,\n): void {\n if (!isBrowser()) return;\n\n try {\n if (\n localStorage.getItem(TELEMETRY_CONSENT_PENDING_LOCAL_REVOCATION_KEY) !==\n expectedDistinctId\n ) {\n return;\n }\n localStorage.removeItem(TELEMETRY_CONSENT_PENDING_LOCAL_REVOCATION_KEY);\n } catch {\n // Ignore storage errors.\n }\n}\n\nexport function clearPendingCloudTelemetryConsent(\n expected?: ResolvedTelemetryConsent,\n): void {\n if (!isBrowser()) return;\n\n try {\n if (\n expected !== undefined &&\n localStorage.getItem(TELEMETRY_CONSENT_PENDING_CLOUD_SYNC_KEY) !==\n expected\n ) {\n return;\n }\n localStorage.removeItem(TELEMETRY_CONSENT_PENDING_CLOUD_SYNC_KEY);\n notifyTelemetryConsentListeners();\n } catch {\n // Ignore storage errors.\n }\n}\n\n/**\n * Set user's telemetry consent preference\n */\nexport async function setTelemetryConsent(\n consent: ResolvedTelemetryConsent,\n { syncToCloud = true }: SetTelemetryConsentOptions = {},\n): Promise<void> {\n if (!isBrowser()) {\n return;\n }\n\n try {\n const previousConsent = getTelemetryConsent();\n const unchanged = previousConsent === consent;\n localStorage.setItem(TELEMETRY_CONSENT_KEY, consent);\n if (telemetryDisabled) return;\n if (unchanged) return;\n\n // Reuse an initialized client synchronously so a same-flush identify()\n // cannot run before consent is applied. Only the cold path awaits import.\n const posthog = posthogInstance ?? (await initializePostHogClient());\n if (!posthog) {\n return;\n }\n\n if (consent === \"granted\") {\n posthog.opt_in_capturing();\n applyDesiredTelemetryIdentity(posthog);\n } else {\n markPendingLocalTelemetryRevocation(posthog.get_distinct_id?.() ?? null);\n if (posthog.get_property?.(\"$user_id\") != null) {\n resetPostHogIdentity(posthog);\n } else {\n posthog.opt_out_capturing();\n }\n }\n } catch {\n // Ignore storage errors\n } finally {\n // Notify UI/backend/identity reconcilers only after the browser capture state\n // reflects this decision. Otherwise a pre-login grant can trigger an\n // identify while PostHog is still opted out and lose funnel continuity.\n if (syncToCloud) {\n markTelemetryConsentForCloudSync(consent);\n }\n notifyTelemetryConsentListeners();\n }\n}\n\n/**\n * Declare the current Cloud identity. The telemetry service applies it only\n * after consent and owns all reset/account-switch semantics.\n */\nexport async function setTelemetryIdentity(\n distinctId: string | null,\n properties: Record<string, unknown> = {},\n): Promise<void> {\n const nextIdentity = distinctId === null ? null : { distinctId, properties };\n const unchanged =\n desiredTelemetryIdentity === nextIdentity ||\n (desiredTelemetryIdentity !== undefined &&\n desiredTelemetryIdentity !== null &&\n nextIdentity !== null &&\n desiredTelemetryIdentity.distinctId === nextIdentity.distinctId &&\n propertiesEqual(desiredTelemetryIdentity.properties, properties));\n if (unchanged) return;\n\n desiredTelemetryIdentity = nextIdentity;\n desiredIdentityRevision += 1;\n appliedIdentityRevision = -1;\n\n if (!isTelemetryEnabled()) return;\n const posthog = posthogInstance ?? (await initializePostHogClient());\n if (posthog && isTelemetryEnabled()) {\n // Read the desired identity after the await so a newer account always wins\n // if identity changes while the SDK is loading.\n applyDesiredTelemetryIdentity(posthog);\n }\n}\n\n/**\n * Check if telemetry is enabled (user has granted consent)\n */\nexport function isTelemetryEnabled(): boolean {\n return getTelemetryConsent() === \"granted\";\n}\n\n/**\n * Check if first use event has already been sent\n */\nfunction hasFirstUseSent(): boolean {\n if (!isBrowser()) {\n return false;\n }\n\n try {\n return localStorage.getItem(TELEMETRY_FIRST_USE_KEY) === \"true\";\n } catch {\n return false;\n }\n}\n\n/**\n * Mark first use event as sent\n */\nfunction markFirstUseSent(): void {\n if (!isBrowser()) {\n return;\n }\n\n try {\n localStorage.setItem(TELEMETRY_FIRST_USE_KEY, \"true\");\n } catch {\n // Ignore storage errors\n }\n}\n\n/**\n * Track the initial install of the library.\n *\n * IMPORTANT: This is sent immediately on first use, regardless of consent status.\n * This allows us to track library adoption even if users haven't made a consent choice yet.\n *\n * The event is:\n * - Completely anonymous (no PII, just a random PostHog distinct_id)\n * - Sent only once per installation (tracked via localStorage, persists across sessions)\n * - Still respects DO_NOT_TRACK environment variable and browser setting\n *\n * Users who want complete privacy can:\n * - Set VITE_DO_NOT_TRACK=1 or browser's Do Not Track\n * - Later deny consent to prevent all future tracking\n */\nexport async function trackInstall(): Promise<void> {\n // Respect hard opt-out via environment variable or browser setting\n if (isDoNotTrackEnabled()) {\n return;\n }\n\n // Already sent install event (persisted in localStorage - survives app relaunches)\n if (hasFirstUseSent()) {\n return;\n }\n\n // Initialize PostHog with capturing enabled (for this one event)\n const posthog = await initializePostHogClient(true);\n if (!posthog || isDoNotTrackEnabled()) {\n return;\n }\n\n // Temporarily enable capturing if it was disabled\n const wasOptedOut = posthog.has_opted_out_capturing?.() ?? false;\n if (wasOptedOut) {\n posthog.opt_in_capturing();\n }\n\n // Capture the install event\n posthog.capture(\"canvas_install\", {\n platform: typeof navigator !== \"undefined\" ? navigator.platform : \"unknown\",\n user_agent:\n typeof navigator !== \"undefined\" ? navigator.userAgent : \"unknown\",\n referrer: typeof document !== \"undefined\" ? document.referrer : \"\",\n url_origin: typeof window !== \"undefined\" ? window.location.origin : \"\",\n embedded: typeof window !== \"undefined\" && window.self !== window.top,\n });\n\n // Mark as sent (stored in localStorage - persists across browser sessions)\n markFirstUseSent();\n\n // Restore opt-out state if user hasn't granted consent yet\n // This ensures we only send the install event, not subsequent events\n const currentConsent = getTelemetryConsent();\n if (currentConsent !== \"granted\") {\n posthog.opt_out_capturing();\n }\n}\n\n/**\n * Check if session start event has already been sent (this browser session)\n */\nfunction hasSessionSent(): boolean {\n if (!isBrowser()) {\n return false;\n }\n\n try {\n return sessionStorage.getItem(TELEMETRY_SESSION_KEY) === \"true\";\n } catch {\n return false;\n }\n}\n\n/**\n * Mark session start event as sent (uses sessionStorage so it resets on new tabs/sessions)\n */\nfunction markSessionSent(): void {\n if (!isBrowser()) {\n return;\n }\n\n try {\n sessionStorage.setItem(TELEMETRY_SESSION_KEY, \"true\");\n } catch {\n // Ignore storage errors\n }\n}\n\n/** Return the shared client only when a consented capture is safe to emit. */\nasync function getPostHogForConsentedCapture(): Promise<PostHog | null> {\n if (!isTelemetryEnabled() || getTelemetryConsent() !== \"granted\") return null;\n\n const posthog = await initializePostHogClient();\n if (!posthog || !isTelemetryEnabled()) return null;\n\n // The browser preference is the canonical capture decision. PostHog may\n // still carry an older opt-out marker while backend consent is loading or\n // after a previous backend temporarily reported a stale value. Heal that\n // drift at the event boundary so capture() cannot silently discard an event\n // that the user has explicitly allowed.\n if (posthog.has_opted_out_capturing?.()) {\n posthog.opt_in_capturing();\n }\n\n applyDesiredTelemetryIdentity(posthog);\n\n return posthog;\n}\n\n/**\n * Track a session start event.\n * Called each time a new browser session starts (respects consent).\n * Uses sessionStorage for deduplication - only sends once per browser session.\n */\nexport async function trackSessionStart(): Promise<void> {\n // Already sent session event this browser session\n if (hasSessionSent()) {\n return;\n }\n\n const posthog = await getPostHogForConsentedCapture();\n if (!posthog) return;\n\n posthog.capture(\"canvas_new_session\", {\n is_first_use: !hasFirstUseSent(),\n });\n\n // Mark as sent for this session\n markSessionSent();\n}\n\n/** Return the active PostHog distinct ID when consent allows capture. */\nexport async function getTelemetryDistinctId(): Promise<string | null> {\n const posthog = await getPostHogForConsentedCapture();\n return posthog?.get_distinct_id?.() ?? null;\n}\n\n/** Return the PostHog distinct ID for local consent sync without emitting capture. */\nexport async function getTelemetryDistinctIdForConsentSync(): Promise<\n string | null\n> {\n if (!isBrowser()) return null;\n\n if (getTelemetryConsent() !== \"granted\") {\n const pendingRevocationId = getPendingLocalTelemetryRevocationId();\n if (pendingRevocationId) return pendingRevocationId;\n }\n\n if (telemetryDisabled || isDoNotTrackEnabled()) return null;\n\n const posthog = await initializePostHogClient();\n return posthog?.get_distinct_id?.() ?? null;\n}\n\n/**\n * Track a custom event (respects consent).\n */\nexport async function trackEvent(\n eventName: string,\n properties: Record<string, unknown> = {},\n): Promise<void> {\n const posthog = await getPostHogForConsentedCapture();\n if (!posthog) return;\n\n posthog.capture(eventName, properties);\n}\n\n/** Track an exception through the same consent-aware client as custom events. */\nexport async function trackException(\n error: unknown,\n properties: Record<string, unknown> = {},\n): Promise<void> {\n const posthog = await getPostHogForConsentedCapture();\n if (!posthog) return;\n\n posthog.captureException(error, properties);\n}\n\n/**\n * Clear all telemetry data (for privacy/GDPR requests)\n */\nexport async function clearTelemetryData(): Promise<void> {\n if (!isBrowser()) {\n return;\n }\n\n try {\n markPendingLocalTelemetryRevocation(\n posthogInstance?.get_distinct_id?.() ?? null,\n );\n localStorage.removeItem(TELEMETRY_CONSENT_KEY);\n localStorage.removeItem(TELEMETRY_FIRST_USE_KEY);\n } catch {\n // Continue clearing the in-memory and SDK identity if storage is blocked.\n }\n clearPendingCloudTelemetryConsent();\n try {\n sessionStorage.removeItem(TELEMETRY_SESSION_KEY);\n } catch {\n // Continue clearing the in-memory and SDK identity if storage is blocked.\n }\n\n telemetryBackendContext = getBackendTelemetryProperties({});\n telemetryCloudContext = getCloudTelemetryProperties();\n desiredTelemetryIdentity = null;\n desiredIdentityRevision += 1;\n appliedIdentityRevision = -1;\n\n try {\n if (posthogInstance) {\n resetPostHogIdentity(posthogInstance, true);\n }\n } catch {\n // A reset failure must not leave capture enabled after a privacy clear.\n try {\n posthogInstance?.opt_out_capturing();\n } catch {\n // Telemetry failures must not break the application.\n }\n } finally {\n notifyTelemetryConsentListeners();\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"telemetry.js","names":[],"sources":["../../src/services/telemetry.ts"],"sourcesContent":["/**\n * Telemetry service for tracking library usage.\n *\n * This module handles anonymous telemetry for the @openhands/agent-canvas package\n * using the PostHog SDK for reliable event delivery with batching, retry logic,\n * and offline support.\n *\n * TRACKING PHILOSOPHY:\n * - Install event (canvas_install): Sent immediately on first use, regardless of consent.\n * This is anonymous and contains no PII - just basic browser info and a random ID.\n * - Session/custom events: Only sent after user grants consent via the consent modal.\n * - Users can opt out of all future tracking by declining consent.\n *\n * AD BLOCKER BYPASS:\n * By default, telemetry is routed through OpenHands' reverse proxy (z.openhands.dev)\n * to avoid being blocked by ad blockers. Library consumers can override this with:\n * - VITE_POSTHOG_HOST: Custom proxy URL or direct PostHog URL\n * - VITE_POSTHOG_UI_HOST: PostHog UI host (defaults to https://us.posthog.com)\n *\n * IMPORTANT: By default, telemetry is sent to the OpenHands PostHog project.\n * Source builds can override this with VITE_POSTHOG_API_KEY. Precompiled\n * library consumers can pass the same settings to configureTelemetry().\n *\n * Users can disable all telemetry (including install tracking) via:\n * - Setting VITE_DO_NOT_TRACK=1 environment variable\n * - Browser's Do Not Track setting\n * - Injecting window.__AGENT_CANVAS_DO_NOT_TRACK__ = true at runtime, which the\n * static server does from AGENT_CANVAS_DISABLE_TELEMETRY=1 (or the equivalent\n * --disable-telemetry flag) so a precompiled bundle can opt out without\n * VITE_DO_NOT_TRACK baked into the image. Under this flag the PostHog client\n * is never initialized, so consent mirrored from a backend cannot opt it in.\n */\n\nimport type { BootstrapConfig, CaptureResult, PostHog } from \"posthog-js\";\nimport { getLockedCloudAuthMode } from \"#/api/agent-server-config\";\nimport defaults from \"../../config/defaults.json\";\n\nimport packageJson from \"../../package.json\";\nimport {\n AGENT_CANVAS_CLIENT_SOURCE,\n AGENT_CANVAS_CLIENT_VERSION,\n} from \"#/api/client-source\";\nimport {\n getBackendTelemetryProperties,\n getCloudTelemetryProperties,\n type BackendTelemetryContextInput,\n type CloudTelemetryContextInput,\n} from \"#/services/telemetry-context\";\n\nconst TELEMETRY_CONSENT_KEY = \"openhands-telemetry-consent\";\nconst TELEMETRY_CONSENT_PENDING_CLOUD_SYNC_KEY =\n \"openhands-telemetry-consent-pending-cloud-sync\";\nconst TELEMETRY_CONSENT_PENDING_LOCAL_REVOCATION_KEY =\n \"openhands-telemetry-consent-pending-local-revocation\";\nconst TELEMETRY_CONSENT_CHANGE_EVENT = \"openhands-telemetry-consent-change\";\nconst TELEMETRY_FIRST_USE_KEY = \"openhands-telemetry-first-use\";\nconst TELEMETRY_SESSION_KEY = \"openhands-telemetry-session\";\nconst POSTHOG_INSTANCE_NAME = \"agent-canvas\";\nconst POSTHOG_PAGEVIEW_CAPTURE_MODE = \"history_change\";\n\n// Unconfigured source builds use staging. Production release workflows pass\n// VITE_POSTHOG_API_KEY explicitly for both the app and library artifacts.\nconst DEFAULT_POSTHOG_API_KEY: string =\n (import.meta.env.VITE_POSTHOG_API_KEY as string | undefined) ||\n defaults.telemetry.posthogApiKey;\n\n// Default to OpenHands' reverse proxy to bypass ad blockers.\n// The proxy at z.openhands.dev routes to PostHog's US region.\n// Library consumers can override this with their own proxy or direct PostHog URL.\nconst DEFAULT_POSTHOG_HOST =\n import.meta.env.VITE_POSTHOG_HOST || \"https://z.openhands.dev\";\n\n// UI host is needed for PostHog features like toolbar to work correctly\n// when using a reverse proxy. Defaults to US region.\nconst DEFAULT_POSTHOG_UI_HOST =\n import.meta.env.VITE_POSTHOG_UI_HOST || \"https://us.posthog.com\";\n\nexport interface TelemetryConfig {\n /** PostHog project key. Useful for precompiled library consumers. */\n apiKey?: string;\n /** Event ingestion host or reverse proxy. */\n apiHost?: string;\n /** PostHog UI host used by toolbar links and other UI features. */\n uiHost?: string;\n}\n\nexport type TelemetryConfiguration = TelemetryConfig | false;\n\nexport type TelemetryConsent = \"granted\" | \"denied\" | \"pending\";\nexport type ResolvedTelemetryConsent = Exclude<TelemetryConsent, \"pending\">;\n\nexport interface SetTelemetryConsentOptions {\n /** Do not persist a value mirrored from backend settings back to Cloud. */\n syncToCloud?: boolean;\n}\n\nlet posthogInstance: PostHog | null = null;\nlet initializationPromise: Promise<PostHog | null> | null = null;\nlet pendingBootstrap: BootstrapConfig | undefined;\nlet telemetryConfig: TelemetryConfig = {};\nlet telemetryDisabled = false;\n\n/** Deployment-level opt-out injected by static-server.mjs (see file header). */\nfunction isRuntimeDoNotTrackEnabled(): boolean {\n return (\n typeof window !== \"undefined\" &&\n (window as unknown as Record<string, unknown>)\n .__AGENT_CANVAS_DO_NOT_TRACK__ === true\n );\n}\n\n/** True when telemetry must stay fully off: the SDK is never initialized. */\nfunction isTelemetryHardDisabled(): boolean {\n return telemetryDisabled || isRuntimeDoNotTrackEnabled();\n}\n\ninterface TelemetryIdentity {\n distinctId: string;\n properties: Record<string, unknown>;\n}\n\n// undefined means that Cloud identity has not resolved yet; null means that it\n// resolved without a user. This distinction prevents startup from resetting a\n// persisted identity while the current account is still loading.\nlet desiredTelemetryIdentity: TelemetryIdentity | null | undefined;\nlet desiredIdentityRevision = 0;\nlet appliedIdentityRevision = -1;\n\nconst CANVAS_EVENT_PROPERTIES = Object.freeze({\n client_source: AGENT_CANVAS_CLIENT_SOURCE,\n client_version: AGENT_CANVAS_CLIENT_VERSION,\n package_name: packageJson.name,\n package_version: packageJson.version,\n});\n\nlet telemetryBackendContext = getBackendTelemetryProperties({});\nlet telemetryCloudContext = getCloudTelemetryProperties();\n\nexport function setTelemetryBackendContext(\n context: BackendTelemetryContextInput,\n): void {\n telemetryBackendContext = getBackendTelemetryProperties(context);\n}\n\nexport function setTelemetryCloudContext(\n context: CloudTelemetryContextInput | null,\n): void {\n telemetryCloudContext = getCloudTelemetryProperties(context);\n}\n\nfunction addCanvasEventProperties(\n event: CaptureResult | null,\n): CaptureResult | null {\n if (!event) return null;\n\n return {\n ...event,\n properties: {\n ...telemetryBackendContext,\n ...telemetryCloudContext,\n ...event.properties,\n ...CANVAS_EVENT_PROPERTIES,\n },\n };\n}\n\nfunction restorePostHogConsent(posthog: PostHog): void {\n if (telemetryDisabled || getTelemetryConsent() !== \"granted\") {\n posthog.opt_out_capturing();\n } else {\n posthog.opt_in_capturing();\n }\n}\n\nfunction resetPostHogIdentity(posthog: PostHog, resetDeviceId = false): void {\n posthog.reset(resetDeviceId);\n appliedIdentityRevision = -1;\n // PostHog reset clears its own consent persistence, so immediately restore\n // the canonical Canvas decision kept in localStorage.\n restorePostHogConsent(posthog);\n}\n\nfunction applyDesiredTelemetryIdentity(posthog: PostHog): void {\n if (desiredTelemetryIdentity === undefined || !isTelemetryEnabled()) return;\n\n const desiredId = desiredTelemetryIdentity?.distinctId;\n const currentId = posthog.get_property(\"$user_id\");\n if (currentId != null && currentId !== desiredId) {\n resetPostHogIdentity(posthog);\n }\n\n if (desiredTelemetryIdentity === null) {\n appliedIdentityRevision = desiredIdentityRevision;\n return;\n }\n\n if (\n posthog.get_property(\"$user_id\") !== desiredTelemetryIdentity.distinctId ||\n appliedIdentityRevision !== desiredIdentityRevision\n ) {\n posthog.identify(\n desiredTelemetryIdentity.distinctId,\n desiredTelemetryIdentity.properties,\n );\n appliedIdentityRevision = desiredIdentityRevision;\n }\n}\n\nfunction propertiesEqual(\n left: Record<string, unknown>,\n right: Record<string, unknown>,\n): boolean {\n const keys = Object.keys(left);\n return (\n keys.length === Object.keys(right).length &&\n keys.every((key) => left[key] === right[key])\n );\n}\n\n/**\n * Configure the single Canvas telemetry client before its first use.\n * Passing false disables telemetry and install tracking for embedded hosts.\n */\nexport function configureTelemetry(config: TelemetryConfiguration): void {\n if (config === false) {\n if (telemetryDisabled) return;\n telemetryDisabled = true;\n posthogInstance?.opt_out_capturing();\n notifyTelemetryConsentListeners();\n return;\n }\n\n const wasDisabled = telemetryDisabled;\n telemetryDisabled = false;\n\n if (!posthogInstance && !initializationPromise) {\n const definedConfig = Object.fromEntries(\n Object.entries(config).filter(([, value]) => value !== undefined),\n ) as TelemetryConfig;\n telemetryConfig = { ...telemetryConfig, ...definedConfig };\n }\n\n if (wasDisabled) {\n if (posthogInstance) {\n restorePostHogConsent(posthogInstance);\n applyDesiredTelemetryIdentity(posthogInstance);\n }\n notifyTelemetryConsentListeners();\n }\n}\n\nfunction getResolvedTelemetryConfig(): Required<TelemetryConfig> | null {\n if (isTelemetryHardDisabled()) return null;\n\n return {\n apiKey: telemetryConfig.apiKey || DEFAULT_POSTHOG_API_KEY,\n apiHost: telemetryConfig.apiHost || DEFAULT_POSTHOG_HOST,\n uiHost: telemetryConfig.uiHost || DEFAULT_POSTHOG_UI_HOST,\n };\n}\n\n/**\n * Check if we're in a browser environment\n */\nfunction isBrowser(): boolean {\n return typeof window !== \"undefined\" && typeof localStorage !== \"undefined\";\n}\n\n/**\n * Lazily load PostHog to avoid SSR/Node.js issues.\n * PostHog is a browser-only library, so we dynamically import it only when needed.\n */\nasync function getPostHog(): Promise<PostHog | null> {\n if (!isBrowser()) {\n return null;\n }\n\n if (posthogInstance) {\n return posthogInstance;\n }\n\n try {\n const { default: posthog } = await import(\"posthog-js\");\n return posthog;\n } catch {\n // Failed to load PostHog - telemetry will be disabled\n return null;\n }\n}\n\n/**\n * Check if telemetry is disabled via environment variable or browser setting.\n * Works in both Node.js and browser (Vite) environments.\n */\nfunction isDoNotTrackEnabled(): boolean {\n if (telemetryDisabled) {\n return true;\n }\n\n // Check Vite environment variable (browser)\n if (\n typeof import.meta !== \"undefined\" &&\n import.meta.env?.VITE_DO_NOT_TRACK === \"1\"\n ) {\n return true;\n }\n\n // Runtime-injected window global (see file header).\n if (isRuntimeDoNotTrackEnabled()) {\n return true;\n }\n\n // Check Node.js environment variable (SSR/testing)\n if (typeof process !== \"undefined\" && process.env?.DO_NOT_TRACK === \"1\") {\n return true;\n }\n\n // Check browser's navigator.doNotTrack standard\n if (\n typeof navigator !== \"undefined\" &&\n (navigator.doNotTrack === \"1\" ||\n // @ts-expect-error - Some browsers use window.doNotTrack\n (typeof window !== \"undefined\" && window.doNotTrack === \"1\"))\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Initialize PostHog SDK.\n *\n * @param enableCapturing - If true, enable capturing immediately (for install tracking).\n * If false, start with capturing disabled (for consent-gated tracking).\n */\nexport function configurePostHogBootstrap(\n bootstrap: BootstrapConfig | undefined,\n): void {\n if (!posthogInstance) {\n pendingBootstrap = bootstrap;\n }\n}\n\nexport async function initializePostHogClient(\n enableCapturing = false,\n): Promise<PostHog | null> {\n if (posthogInstance) {\n return posthogInstance;\n }\n\n if (initializationPromise) {\n return initializationPromise;\n }\n\n initializationPromise = (async () => {\n const config = getResolvedTelemetryConfig();\n if (!config) {\n return null;\n }\n\n const posthog = await getPostHog();\n if (!posthog) {\n return null;\n }\n\n // A named instance isolates Canvas configuration, consent, identity, and\n // persistence from a host application's default PostHog singleton.\n const initializedPostHog = posthog.init(\n config.apiKey,\n {\n api_host: config.apiHost,\n ui_host: config.uiHost,\n opt_out_capturing_by_default: !enableCapturing,\n persistence: \"localStorage\",\n persistence_name: POSTHOG_INSTANCE_NAME,\n consent_persistence_name: `${POSTHOG_INSTANCE_NAME}-consent`,\n person_profiles: \"always\",\n capture_pageview: POSTHOG_PAGEVIEW_CAPTURE_MODE,\n autocapture: true,\n disable_session_recording: true,\n bootstrap: pendingBootstrap,\n before_send: addCanvasEventProperties,\n },\n POSTHOG_INSTANCE_NAME,\n );\n if (!initializedPostHog) return null;\n\n posthogInstance = initializedPostHog;\n pendingBootstrap = undefined;\n\n if (telemetryDisabled) {\n posthogInstance.opt_out_capturing();\n } else if (getTelemetryConsent() === \"granted\") {\n posthogInstance.opt_in_capturing();\n applyDesiredTelemetryIdentity(posthogInstance);\n } else if (!enableCapturing) {\n posthogInstance.opt_out_capturing();\n }\n\n return posthogInstance;\n })();\n\n try {\n return await initializationPromise;\n } finally {\n if (!posthogInstance) {\n initializationPromise = null;\n }\n }\n}\n\n/**\n * Get user's telemetry consent preference\n */\nexport function getTelemetryConsent(): TelemetryConsent {\n if (!isBrowser()) {\n return \"pending\";\n }\n\n // Check environment variable for opt-out\n if (isDoNotTrackEnabled()) {\n return \"denied\";\n }\n\n if (getLockedCloudAuthMode() === \"cookie\") {\n return \"granted\";\n }\n\n try {\n const consent = localStorage.getItem(TELEMETRY_CONSENT_KEY);\n if (consent === \"granted\" || consent === \"denied\") {\n return consent;\n }\n } catch {\n // Ignore storage errors\n }\n\n return \"pending\";\n}\n\n/**\n * Return an explicit browser choice that still needs to survive a Cloud login.\n * It remains pending across local backends so their settings cannot consume a\n * decision that must still be applied after the user connects to Cloud.\n */\nexport function getPendingCloudTelemetryConsent(): ResolvedTelemetryConsent | null {\n if (!isBrowser()) return null;\n\n try {\n const consent = localStorage.getItem(\n TELEMETRY_CONSENT_PENDING_CLOUD_SYNC_KEY,\n );\n return consent === \"granted\" || consent === \"denied\" ? consent : null;\n } catch {\n return null;\n }\n}\n\n/** Return the pre-reset actor whose local Automation consent must be revoked. */\nexport function getPendingLocalTelemetryRevocationId(): string | null {\n if (!isBrowser()) return null;\n\n try {\n return localStorage.getItem(TELEMETRY_CONSENT_PENDING_LOCAL_REVOCATION_KEY);\n } catch {\n return null;\n }\n}\n\nexport function subscribeTelemetryConsent(listener: () => void): () => void {\n if (!isBrowser()) return () => {};\n const handleStorage = (event: StorageEvent) => {\n if (\n event.key === TELEMETRY_CONSENT_KEY ||\n event.key === TELEMETRY_CONSENT_PENDING_CLOUD_SYNC_KEY\n ) {\n listener();\n }\n };\n window.addEventListener(TELEMETRY_CONSENT_CHANGE_EVENT, listener);\n window.addEventListener(\"storage\", handleStorage);\n\n return () => {\n window.removeEventListener(TELEMETRY_CONSENT_CHANGE_EVENT, listener);\n window.removeEventListener(\"storage\", handleStorage);\n };\n}\n\nfunction notifyTelemetryConsentListeners(): void {\n if (isBrowser())\n window.dispatchEvent(new Event(TELEMETRY_CONSENT_CHANGE_EVENT));\n}\n\nfunction markTelemetryConsentForCloudSync(\n consent: ResolvedTelemetryConsent,\n): void {\n if (!isBrowser()) return;\n\n try {\n localStorage.setItem(TELEMETRY_CONSENT_PENDING_CLOUD_SYNC_KEY, consent);\n } catch {\n // Ignore storage errors; the in-browser consent decision still applies.\n }\n}\n\nfunction markPendingLocalTelemetryRevocation(distinctId: string | null): void {\n if (!isBrowser() || !distinctId) return;\n\n try {\n localStorage.setItem(\n TELEMETRY_CONSENT_PENDING_LOCAL_REVOCATION_KEY,\n distinctId,\n );\n } catch {\n // Ignore storage errors; browser capture is still disabled below.\n }\n}\n\nexport function clearPendingLocalTelemetryRevocation(\n expectedDistinctId: string,\n): void {\n if (!isBrowser()) return;\n\n try {\n if (\n localStorage.getItem(TELEMETRY_CONSENT_PENDING_LOCAL_REVOCATION_KEY) !==\n expectedDistinctId\n ) {\n return;\n }\n localStorage.removeItem(TELEMETRY_CONSENT_PENDING_LOCAL_REVOCATION_KEY);\n } catch {\n // Ignore storage errors.\n }\n}\n\nexport function clearPendingCloudTelemetryConsent(\n expected?: ResolvedTelemetryConsent,\n): void {\n if (!isBrowser()) return;\n\n try {\n if (\n expected !== undefined &&\n localStorage.getItem(TELEMETRY_CONSENT_PENDING_CLOUD_SYNC_KEY) !==\n expected\n ) {\n return;\n }\n localStorage.removeItem(TELEMETRY_CONSENT_PENDING_CLOUD_SYNC_KEY);\n notifyTelemetryConsentListeners();\n } catch {\n // Ignore storage errors.\n }\n}\n\n/**\n * Set user's telemetry consent preference\n */\nexport async function setTelemetryConsent(\n consent: ResolvedTelemetryConsent,\n { syncToCloud = true }: SetTelemetryConsentOptions = {},\n): Promise<void> {\n if (!isBrowser()) {\n return;\n }\n\n try {\n const previousConsent = getTelemetryConsent();\n const unchanged = previousConsent === consent;\n localStorage.setItem(TELEMETRY_CONSENT_KEY, consent);\n if (isTelemetryHardDisabled()) return;\n if (unchanged) return;\n\n // Reuse an initialized client synchronously so a same-flush identify()\n // cannot run before consent is applied. Only the cold path awaits import.\n const posthog = posthogInstance ?? (await initializePostHogClient());\n if (!posthog) {\n return;\n }\n\n if (consent === \"granted\") {\n posthog.opt_in_capturing();\n applyDesiredTelemetryIdentity(posthog);\n } else {\n markPendingLocalTelemetryRevocation(posthog.get_distinct_id?.() ?? null);\n if (posthog.get_property?.(\"$user_id\") != null) {\n resetPostHogIdentity(posthog);\n } else {\n posthog.opt_out_capturing();\n }\n }\n } catch {\n // Ignore storage errors\n } finally {\n // Notify UI/backend/identity reconcilers only after the browser capture state\n // reflects this decision. Otherwise a pre-login grant can trigger an\n // identify while PostHog is still opted out and lose funnel continuity.\n if (syncToCloud) {\n markTelemetryConsentForCloudSync(consent);\n }\n notifyTelemetryConsentListeners();\n }\n}\n\n/**\n * Declare the current Cloud identity. The telemetry service applies it only\n * after consent and owns all reset/account-switch semantics.\n */\nexport async function setTelemetryIdentity(\n distinctId: string | null,\n properties: Record<string, unknown> = {},\n): Promise<void> {\n const nextIdentity = distinctId === null ? null : { distinctId, properties };\n const unchanged =\n desiredTelemetryIdentity === nextIdentity ||\n (desiredTelemetryIdentity !== undefined &&\n desiredTelemetryIdentity !== null &&\n nextIdentity !== null &&\n desiredTelemetryIdentity.distinctId === nextIdentity.distinctId &&\n propertiesEqual(desiredTelemetryIdentity.properties, properties));\n if (unchanged) return;\n\n desiredTelemetryIdentity = nextIdentity;\n desiredIdentityRevision += 1;\n appliedIdentityRevision = -1;\n\n if (!isTelemetryEnabled()) return;\n const posthog = posthogInstance ?? (await initializePostHogClient());\n if (posthog && isTelemetryEnabled()) {\n // Read the desired identity after the await so a newer account always wins\n // if identity changes while the SDK is loading.\n applyDesiredTelemetryIdentity(posthog);\n }\n}\n\n/**\n * Check if telemetry is enabled (user has granted consent)\n */\nexport function isTelemetryEnabled(): boolean {\n return getTelemetryConsent() === \"granted\";\n}\n\n/**\n * Check if first use event has already been sent\n */\nfunction hasFirstUseSent(): boolean {\n if (!isBrowser()) {\n return false;\n }\n\n try {\n return localStorage.getItem(TELEMETRY_FIRST_USE_KEY) === \"true\";\n } catch {\n return false;\n }\n}\n\n/**\n * Mark first use event as sent\n */\nfunction markFirstUseSent(): void {\n if (!isBrowser()) {\n return;\n }\n\n try {\n localStorage.setItem(TELEMETRY_FIRST_USE_KEY, \"true\");\n } catch {\n // Ignore storage errors\n }\n}\n\n/**\n * Track the initial install of the library.\n *\n * IMPORTANT: This is sent immediately on first use, regardless of consent status.\n * This allows us to track library adoption even if users haven't made a consent choice yet.\n *\n * The event is:\n * - Completely anonymous (no PII, just a random PostHog distinct_id)\n * - Sent only once per installation (tracked via localStorage, persists across sessions)\n * - Still respects DO_NOT_TRACK environment variable and browser setting\n *\n * Users who want complete privacy can:\n * - Set VITE_DO_NOT_TRACK=1 or browser's Do Not Track\n * - Later deny consent to prevent all future tracking\n */\nexport async function trackInstall(): Promise<void> {\n // Respect hard opt-out via environment variable or browser setting\n if (isDoNotTrackEnabled()) {\n return;\n }\n\n // Already sent install event (persisted in localStorage - survives app relaunches)\n if (hasFirstUseSent()) {\n return;\n }\n\n // Initialize PostHog with capturing enabled (for this one event)\n const posthog = await initializePostHogClient(true);\n if (!posthog || isDoNotTrackEnabled()) {\n return;\n }\n\n // Temporarily enable capturing if it was disabled\n const wasOptedOut = posthog.has_opted_out_capturing?.() ?? false;\n if (wasOptedOut) {\n posthog.opt_in_capturing();\n }\n\n // Capture the install event\n posthog.capture(\"canvas_install\", {\n platform: typeof navigator !== \"undefined\" ? navigator.platform : \"unknown\",\n user_agent:\n typeof navigator !== \"undefined\" ? navigator.userAgent : \"unknown\",\n referrer: typeof document !== \"undefined\" ? document.referrer : \"\",\n url_origin: typeof window !== \"undefined\" ? window.location.origin : \"\",\n embedded: typeof window !== \"undefined\" && window.self !== window.top,\n });\n\n // Mark as sent (stored in localStorage - persists across browser sessions)\n markFirstUseSent();\n\n // Restore opt-out state if user hasn't granted consent yet\n // This ensures we only send the install event, not subsequent events\n const currentConsent = getTelemetryConsent();\n if (currentConsent !== \"granted\") {\n posthog.opt_out_capturing();\n }\n}\n\n/**\n * Check if session start event has already been sent (this browser session)\n */\nfunction hasSessionSent(): boolean {\n if (!isBrowser()) {\n return false;\n }\n\n try {\n return sessionStorage.getItem(TELEMETRY_SESSION_KEY) === \"true\";\n } catch {\n return false;\n }\n}\n\n/**\n * Mark session start event as sent (uses sessionStorage so it resets on new tabs/sessions)\n */\nfunction markSessionSent(): void {\n if (!isBrowser()) {\n return;\n }\n\n try {\n sessionStorage.setItem(TELEMETRY_SESSION_KEY, \"true\");\n } catch {\n // Ignore storage errors\n }\n}\n\n/** Return the shared client only when a consented capture is safe to emit. */\nasync function getPostHogForConsentedCapture(): Promise<PostHog | null> {\n if (!isTelemetryEnabled() || getTelemetryConsent() !== \"granted\") return null;\n\n const posthog = await initializePostHogClient();\n if (!posthog || !isTelemetryEnabled()) return null;\n\n // The browser preference is the canonical capture decision. PostHog may\n // still carry an older opt-out marker while backend consent is loading or\n // after a previous backend temporarily reported a stale value. Heal that\n // drift at the event boundary so capture() cannot silently discard an event\n // that the user has explicitly allowed.\n if (posthog.has_opted_out_capturing?.()) {\n posthog.opt_in_capturing();\n }\n\n applyDesiredTelemetryIdentity(posthog);\n\n return posthog;\n}\n\n/**\n * Track a session start event.\n * Called each time a new browser session starts (respects consent).\n * Uses sessionStorage for deduplication - only sends once per browser session.\n */\nexport async function trackSessionStart(): Promise<void> {\n // Already sent session event this browser session\n if (hasSessionSent()) {\n return;\n }\n\n const posthog = await getPostHogForConsentedCapture();\n if (!posthog) return;\n\n posthog.capture(\"canvas_new_session\", {\n is_first_use: !hasFirstUseSent(),\n });\n\n // Mark as sent for this session\n markSessionSent();\n}\n\n/** Return the active PostHog distinct ID when consent allows capture. */\nexport async function getTelemetryDistinctId(): Promise<string | null> {\n const posthog = await getPostHogForConsentedCapture();\n return posthog?.get_distinct_id?.() ?? null;\n}\n\n/** Return the PostHog distinct ID for local consent sync without emitting capture. */\nexport async function getTelemetryDistinctIdForConsentSync(): Promise<\n string | null\n> {\n if (!isBrowser()) return null;\n\n if (getTelemetryConsent() !== \"granted\") {\n const pendingRevocationId = getPendingLocalTelemetryRevocationId();\n if (pendingRevocationId) return pendingRevocationId;\n }\n\n if (telemetryDisabled || isDoNotTrackEnabled()) return null;\n\n const posthog = await initializePostHogClient();\n return posthog?.get_distinct_id?.() ?? null;\n}\n\n/**\n * Track a custom event (respects consent).\n */\nexport async function trackEvent(\n eventName: string,\n properties: Record<string, unknown> = {},\n): Promise<void> {\n const posthog = await getPostHogForConsentedCapture();\n if (!posthog) return;\n\n posthog.capture(eventName, properties);\n}\n\n/** Track an exception through the same consent-aware client as custom events. */\nexport async function trackException(\n error: unknown,\n properties: Record<string, unknown> = {},\n): Promise<void> {\n const posthog = await getPostHogForConsentedCapture();\n if (!posthog) return;\n\n posthog.captureException(error, properties);\n}\n\n/**\n * Clear all telemetry data (for privacy/GDPR requests)\n */\nexport async function clearTelemetryData(): Promise<void> {\n if (!isBrowser()) {\n return;\n }\n\n try {\n markPendingLocalTelemetryRevocation(\n posthogInstance?.get_distinct_id?.() ?? null,\n );\n localStorage.removeItem(TELEMETRY_CONSENT_KEY);\n localStorage.removeItem(TELEMETRY_FIRST_USE_KEY);\n } catch {\n // Continue clearing the in-memory and SDK identity if storage is blocked.\n }\n clearPendingCloudTelemetryConsent();\n try {\n sessionStorage.removeItem(TELEMETRY_SESSION_KEY);\n } catch {\n // Continue clearing the in-memory and SDK identity if storage is blocked.\n }\n\n telemetryBackendContext = getBackendTelemetryProperties({});\n telemetryCloudContext = getCloudTelemetryProperties();\n desiredTelemetryIdentity = null;\n desiredIdentityRevision += 1;\n appliedIdentityRevision = -1;\n\n try {\n if (posthogInstance) {\n resetPostHogIdentity(posthogInstance, true);\n }\n } catch {\n // A reset failure must not leave capture enabled after a privacy clear.\n try {\n posthogInstance?.opt_out_capturing();\n } catch {\n // Telemetry failures must not break the application.\n }\n } finally {\n notifyTelemetryConsentListeners();\n }\n}\n"],"mappings":";;;;;AAiDA,IAAM,IAAwB,+BACxB,IACJ,kDACI,IACJ,wDACI,IAAiC,sCACjC,IAA0B,iCAC1B,IAAwB,+BACxB,IAAwB,gBACxB,IAAgC,kBAIhC,KAAA,oDAOA,IACiC,2BAIjC,IACoC,0BAqBtC,IAAkC,MAClC,IAAwD,MACxD,GACA,IAAmC,CAAC,GACpC,IAAoB;AAGxB,SAAS,IAAsC;CAC7C,OACE,OAAO,SAAW,OACjB,OACE,kCAAkC;AAEzC;AAGA,SAAS,IAAmC;CAC1C,OAAO,KAAqB,EAA2B;AACzD;AAUA,IAAI,GACA,IAA0B,GAC1B,IAA0B,IAExB,KAA0B,OAAO,OAAO;CAC5C,eAAe;CACf,gBAAgB;CAChB,cAAc,EAAY;CAC1B,iBAAiB,EAAY;AAC/B,CAAC,GAEG,IAA0B,EAA8B,CAAC,CAAC,GAC1D,IAAwB,EAA4B;AAExD,SAAgB,EACd,GACM;CACN,IAA0B,EAA8B,CAAO;AACjE;AAEA,SAAgB,EACd,GACM;CACN,IAAwB,EAA4B,CAAO;AAC7D;AAEA,SAAS,EACP,GACsB;CAGtB,OAFK,IAEE;EACL,GAAG;EACH,YAAY;GACV,GAAG;GACH,GAAG;GACH,GAAG,EAAM;GACT,GAAG;EACL;CACF,IAVmB;AAWrB;AAEA,SAAS,EAAsB,GAAwB;CACrD,AAAI,KAAqB,EAAoB,MAAM,YACjD,EAAQ,kBAAkB,IAE1B,EAAQ,iBAAiB;AAE7B;AAEA,SAAS,EAAqB,GAAkB,IAAgB,IAAa;CAK3E,AAJA,EAAQ,MAAM,CAAa,GAC3B,IAA0B,IAG1B,EAAsB,CAAO;AAC/B;AAEA,SAAS,EAA8B,GAAwB;CAC7D,IAAI,MAA6B,KAAA,KAAa,CAAC,EAAmB,GAAG;CAErE,IAAM,IAAY,GAA0B,YACtC,IAAY,EAAQ,aAAa,UAAU;CAKjD,IAJI,KAAa,QAAQ,MAAc,KACrC,EAAqB,CAAO,GAG1B,MAA6B,MAAM;EACrC,IAA0B;EAC1B;CACF;CAEA,CACE,EAAQ,aAAa,UAAU,MAAM,EAAyB,cAC9D,MAA4B,OAE5B,EAAQ,SACN,EAAyB,YACzB,EAAyB,UAC3B,GACA,IAA0B;AAE9B;AAEA,SAAS,GACP,GACA,GACS;CACT,IAAM,IAAO,OAAO,KAAK,CAAI;CAC7B,OACE,EAAK,WAAW,OAAO,KAAK,CAAK,EAAE,UACnC,EAAK,OAAO,MAAQ,EAAK,OAAS,EAAM,EAAI;AAEhD;AAMA,SAAgB,GAAmB,GAAsC;CACvE,IAAI,MAAW,IAAO;EACpB,IAAI,GAAmB;EAGvB,AAFA,IAAoB,IACpB,GAAiB,kBAAkB,GACnC,EAAgC;EAChC;CACF;CAEA,IAAM,IAAc;CAGpB,IAFA,IAAoB,IAEhB,CAAC,KAAmB,CAAC,GAAuB;EAC9C,IAAM,IAAgB,OAAO,YAC3B,OAAO,QAAQ,CAAM,EAAE,QAAQ,GAAG,OAAW,MAAU,KAAA,CAAS,CAClE;EACA,IAAkB;GAAE,GAAG;GAAiB,GAAG;EAAc;CAC3D;CAEA,AAAI,MACE,MACF,EAAsB,CAAe,GACrC,EAA8B,CAAe,IAE/C,EAAgC;AAEpC;AAEA,SAAS,IAA+D;CAGtE,OAFI,EAAwB,IAAU,OAE/B;EACL,QAAQ,EAAgB,UAAU;EAClC,SAAS,EAAgB,WAAW;EACpC,QAAQ,EAAgB,UAAU;CACpC;AACF;AAKA,SAAS,IAAqB;CAC5B,OAAO,OAAO,SAAW,OAAe,OAAO,eAAiB;AAClE;AAMA,eAAe,IAAsC;CACnD,IAAI,CAAC,EAAU,GACb,OAAO;CAGT,IAAI,GACF,OAAO;CAGT,IAAI;EACF,IAAM,EAAE,SAAS,MAAY,MAAM,OAAO;EAC1C,OAAO;CACT,QAAQ;EAEN,OAAO;CACT;AACF;AAMA,SAAS,IAA+B;CAiCtC,OATA,GAvBI,KAaA,EAA2B,KAK3B,OAAO,UAAY,OAAe,QAAQ,KAAK,iBAAiB,OAMlE,OAAO,YAAc,QACpB,UAAU,eAAe,OAEvB,OAAO,SAAW,OAAe,OAAO,eAAe;AAM9D;AAQA,SAAgB,EACd,GACM;CACN,AAAK,MACH,IAAmB;AAEvB;AAEA,eAAsB,EACpB,IAAkB,IACO;CACzB,IAAI,GACF,OAAO;CAGT,IAAI,GACF,OAAO;CAGT,KAAyB,YAAY;EACnC,IAAM,IAAS,EAA2B;EAC1C,IAAI,CAAC,GACH,OAAO;EAGT,IAAM,IAAU,MAAM,EAAW;EACjC,IAAI,CAAC,GACH,OAAO;EAKT,IAAM,IAAqB,EAAQ,KACjC,EAAO,QACP;GACE,UAAU,EAAO;GACjB,SAAS,EAAO;GAChB,8BAA8B,CAAC;GAC/B,aAAa;GACb,kBAAkB;GAClB,0BAA0B,GAAG,EAAsB;GACnD,iBAAiB;GACjB,kBAAkB;GAClB,aAAa;GACb,2BAA2B;GAC3B,WAAW;GACX,aAAa;EACf,GACA,CACF;EAeA,OAdK,KAEL,IAAkB,GAClB,IAAmB,KAAA,GAEf,IACF,EAAgB,kBAAkB,IACzB,EAAoB,MAAM,aACnC,EAAgB,iBAAiB,GACjC,EAA8B,CAAe,KACnC,KACV,EAAgB,kBAAkB,GAG7B,KAdyB;CAelC,GAAG;CAEH,IAAI;EACF,OAAO,MAAM;CACf,UAAU;EACR,AAAK,MACH,IAAwB;CAE5B;AACF;AAKA,SAAgB,IAAwC;CACtD,IAAI,CAAC,EAAU,GACb,OAAO;CAIT,IAAI,EAAoB,GACtB,OAAO;CAGT,IAAI,EAAuB,MAAM,UAC/B,OAAO;CAGT,IAAI;EACF,IAAM,IAAU,aAAa,QAAQ,CAAqB;EAC1D,IAAI,MAAY,aAAa,MAAY,UACvC,OAAO;CAEX,QAAQ,CAER;CAEA,OAAO;AACT;AAqBA,SAAgB,IAAsD;CACpE,IAAI,CAAC,EAAU,GAAG,OAAO;CAEzB,IAAI;EACF,OAAO,aAAa,QAAQ,CAA8C;CAC5E,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAgB,EAA0B,GAAkC;CAC1E,IAAI,CAAC,EAAU,GAAG,aAAa,CAAC;CAChC,IAAM,KAAiB,MAAwB;EAC7C,CACE,EAAM,QAAQ,KACd,EAAM,QAAQ,MAEd,EAAS;CAEb;CAIA,OAHA,OAAO,iBAAiB,GAAgC,CAAQ,GAChE,OAAO,iBAAiB,WAAW,CAAa,SAEnC;EAEX,AADA,OAAO,oBAAoB,GAAgC,CAAQ,GACnE,OAAO,oBAAoB,WAAW,CAAa;CACrD;AACF;AAEA,SAAS,IAAwC;CAC/C,AAAI,EAAU,KACZ,OAAO,cAAc,IAAI,MAAM,CAA8B,CAAC;AAClE;AAEA,SAAS,EACP,GACM;CACD,MAAU,GAEf,IAAI;EACF,aAAa,QAAQ,GAA0C,CAAO;CACxE,QAAQ,CAER;AACF;AAEA,SAAS,EAAoC,GAAiC;CACxE,OAAC,EAAU,KAAK,CAAC,IAErB,IAAI;EACF,aAAa,QACX,GACA,CACF;CACF,QAAQ,CAER;AACF;AAEA,SAAgB,EACd,GACM;CACD,MAAU,GAEf,IAAI;EACF,IACE,aAAa,QAAQ,CAA8C,MACnE,GAEA;EAEF,aAAa,WAAW,CAA8C;CACxE,QAAQ,CAER;AACF;AAEA,SAAgB,EACd,GACM;CACD,MAAU,GAEf,IAAI;EACF,IACE,MAAa,KAAA,KACb,aAAa,QAAQ,CAAwC,MAC3D,GAEF;EAGF,AADA,aAAa,WAAW,CAAwC,GAChE,EAAgC;CAClC,QAAQ,CAER;AACF;AAKA,eAAsB,EACpB,GACA,EAAE,iBAAc,OAAqC,CAAC,GACvC;CACV,MAAU,GAIf,IAAI;EAEF,IAAM,IADkB,EACN,MAAoB;EAGtC,IAFA,aAAa,QAAQ,GAAuB,CAAO,GAC/C,EAAwB,KACxB,GAAW;EAIf,IAAM,IAAU,KAAoB,MAAM,EAAwB;EAClE,IAAI,CAAC,GACH;EAGF,AAAI,MAAY,aACd,EAAQ,iBAAiB,GACzB,EAA8B,CAAO,MAErC,EAAoC,EAAQ,kBAAkB,KAAK,IAAI,GACnE,EAAQ,eAAe,UAAU,KAAK,OAGxC,EAAQ,kBAAkB,IAF1B,EAAqB,CAAO;CAKlC,QAAQ,CAER,UAAU;EAOR,AAHI,KACF,EAAiC,CAAO,GAE1C,EAAgC;CAClC;AACF;AAMA,eAAsB,EACpB,GACA,IAAsC,CAAC,GACxB;CACf,IAAM,IAAe,MAAe,OAAO,OAAO;EAAE;EAAY;CAAW;CAc3E,IAZE,MAA6B,KAC5B,KAC8B,QAC7B,MAAiB,QACjB,EAAyB,eAAe,EAAa,cACrD,GAAgB,EAAyB,YAAY,CAAU,MAGnE,IAA2B,GAC3B,KAA2B,GAC3B,IAA0B,IAEtB,CAAC,EAAmB,IAAG;CAC3B,IAAM,IAAU,KAAoB,MAAM,EAAwB;CAClE,AAAI,KAAW,EAAmB,KAGhC,EAA8B,CAAO;AAEzC;AAKA,SAAgB,IAA8B;CAC5C,OAAO,EAAoB,MAAM;AACnC;AAKA,SAAS,IAA2B;CAClC,IAAI,CAAC,EAAU,GACb,OAAO;CAGT,IAAI;EACF,OAAO,aAAa,QAAQ,CAAuB,MAAM;CAC3D,QAAQ;EACN,OAAO;CACT;AACF;AAKA,SAAS,KAAyB;CAC3B,MAAU,GAIf,IAAI;EACF,aAAa,QAAQ,GAAyB,MAAM;CACtD,QAAQ,CAER;AACF;AAiBA,eAAsB,KAA8B;CAOlD,IALI,EAAoB,KAKpB,EAAgB,GAClB;CAIF,IAAM,IAAU,MAAM,EAAwB,EAAI;CAC9C,CAAC,KAAW,EAAoB,OAKhB,EAAQ,0BAA0B,KAAK,OAEzD,EAAQ,iBAAiB,GAI3B,EAAQ,QAAQ,kBAAkB;EAChC,UAAU,OAAO,YAAc,MAAc,UAAU,WAAW;EAClE,YACE,OAAO,YAAc,MAAc,UAAU,YAAY;EAC3D,UAAU,OAAO,WAAa,MAAc,SAAS,WAAW;EAChE,YAAY,OAAO,SAAW,MAAc,OAAO,SAAS,SAAS;EACrE,UAAU,OAAO,SAAW,OAAe,OAAO,SAAS,OAAO;CACpE,CAAC,GAGD,GAAiB,GAIM,EACnB,MAAmB,aACrB,EAAQ,kBAAkB;AAE9B;AAKA,SAAS,KAA0B;CACjC,IAAI,CAAC,EAAU,GACb,OAAO;CAGT,IAAI;EACF,OAAO,eAAe,QAAQ,CAAqB,MAAM;CAC3D,QAAQ;EACN,OAAO;CACT;AACF;AAKA,SAAS,KAAwB;CAC1B,MAAU,GAIf,IAAI;EACF,eAAe,QAAQ,GAAuB,MAAM;CACtD,QAAQ,CAER;AACF;AAGA,eAAe,IAAyD;CACtE,IAAI,CAAC,EAAmB,KAAK,EAAoB,MAAM,WAAW,OAAO;CAEzE,IAAM,IAAU,MAAM,EAAwB;CAc9C,OAbI,CAAC,KAAW,CAAC,EAAmB,IAAU,QAO1C,EAAQ,0BAA0B,KACpC,EAAQ,iBAAiB,GAG3B,EAA8B,CAAO,GAE9B;AACT;AAOA,eAAsB,KAAmC;CAEvD,IAAI,GAAe,GACjB;CAGF,IAAM,IAAU,MAAM,EAA8B;CAC/C,MAEL,EAAQ,QAAQ,sBAAsB,EACpC,cAAc,CAAC,EAAgB,EACjC,CAAC,GAGD,GAAgB;AAClB;AAGA,eAAsB,KAAiD;CAErE,QAAO,MADe,EAA8B,IACpC,kBAAkB,KAAK;AACzC;AAGA,eAAsB,IAEpB;CACA,IAAI,CAAC,EAAU,GAAG,OAAO;CAEzB,IAAI,EAAoB,MAAM,WAAW;EACvC,IAAM,IAAsB,EAAqC;EACjE,IAAI,GAAqB,OAAO;CAClC;CAKA,OAHI,KAAqB,EAAoB,IAAU,QAGhD,MADe,EAAwB,IAC9B,kBAAkB,KAAK;AACzC;AAKA,eAAsB,GACpB,GACA,IAAsC,CAAC,GACxB;CACf,IAAM,IAAU,MAAM,EAA8B;CAC/C,KAEL,EAAQ,QAAQ,GAAW,CAAU;AACvC;AAgBA,eAAsB,KAAoC;CACnD,MAAU,GAIf;MAAI;GAKF,AAJA,EACE,GAAiB,kBAAkB,KAAK,IAC1C,GACA,aAAa,WAAW,CAAqB,GAC7C,aAAa,WAAW,CAAuB;EACjD,QAAQ,CAER;EACA,EAAkC;EAClC,IAAI;GACF,eAAe,WAAW,CAAqB;EACjD,QAAQ,CAER;EAMA,AAJA,IAA0B,EAA8B,CAAC,CAAC,GAC1D,IAAwB,EAA4B,GACpD,IAA2B,MAC3B,KAA2B,GAC3B,IAA0B;EAE1B,IAAI;GACF,AAAI,KACF,EAAqB,GAAiB,EAAI;EAE9C,QAAQ;GAEN,IAAI;IACF,GAAiB,kBAAkB;GACrC,QAAQ,CAER;EACF,UAAU;GACR,EAAgC;EAClC;CA3BA;AA4BF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../_virtual/_rolldown/runtime.cjs");const e=require("../node_modules/zustand/esm/react.cjs"),t=require("../node_modules/zustand/esm/middleware.cjs");var
|
|
1
|
+
require("../_virtual/_rolldown/runtime.cjs");const e=require("../node_modules/zustand/esm/react.cjs"),t=require("../node_modules/zustand/esm/middleware.cjs"),n=require("../components/features/conversation-panel/conversation-panel-list-helpers.cjs");var r={organizeMode:`chronological`,conversationSort:`updated`,threadScope:`all`,showOlderConversations:!0,showRepoBranchMetadata:!1,showLlmProfiles:!1,showTagsMetadata:!0,showHoverMetadata:!0},i={...r,olderConversationCutoff:`7d`,showArchivedConversations:!1,automationFilterMode:`all`,selectedAutomationNames:[],selectedTagFacets:[],groupFolderOrder:[]},a=e.create()(t.persist(e=>({...i,setShowOlderConversations:t=>e(()=>({showOlderConversations:t})),toggleShowOlderConversations:()=>e(e=>({showOlderConversations:!e.showOlderConversations})),setOlderConversationCutoff:t=>e(()=>({olderConversationCutoff:n.isOlderConversationCutoff(t)?t:`7d`})),setShowArchivedConversations:t=>e(()=>({showArchivedConversations:t})),toggleShowArchivedConversations:()=>e(e=>({showArchivedConversations:!e.showArchivedConversations})),setShowRepoBranchMetadata:t=>e(()=>({showRepoBranchMetadata:t})),toggleShowRepoBranchMetadata:()=>e(e=>({showRepoBranchMetadata:!e.showRepoBranchMetadata})),setShowLlmProfiles:t=>e(()=>({showLlmProfiles:t})),toggleShowLlmProfiles:()=>e(e=>({showLlmProfiles:!e.showLlmProfiles})),setShowTagsMetadata:t=>e(()=>({showTagsMetadata:t})),toggleShowTagsMetadata:()=>e(e=>({showTagsMetadata:!e.showTagsMetadata})),setShowHoverMetadata:t=>e(()=>({showHoverMetadata:t})),toggleShowHoverMetadata:()=>e(e=>({showHoverMetadata:!e.showHoverMetadata})),setOrganizeMode:t=>e(()=>({organizeMode:t})),setConversationSort:t=>e(()=>({conversationSort:t})),setThreadScope:t=>e(()=>({threadScope:t})),setAutomationFilterMode:t=>e(e=>({automationFilterMode:t,selectedAutomationNames:t===`only-automations`?e.selectedAutomationNames:[]})),toggleAutomationName:t=>e(e=>({selectedAutomationNames:e.selectedAutomationNames.includes(t)?e.selectedAutomationNames.filter(e=>e!==t):[...e.selectedAutomationNames,t]})),clearFilterSelections:()=>e(()=>({selectedTagFacets:[],selectedAutomationNames:[]})),toggleTagFacet:t=>e(e=>({selectedTagFacets:e.selectedTagFacets.includes(t)?e.selectedTagFacets.filter(e=>e!==t):[...e.selectedTagFacets,t]})),setGroupFolderOrder:t=>e(()=>({groupFolderOrder:[...t]})),applyLayoutSettings:t=>e(()=>({...t}))}),{name:`conversation-panel-preferences`,storage:t.createJSONStorage(()=>localStorage),partialize:e=>({showOlderConversations:e.showOlderConversations,olderConversationCutoff:n.isOlderConversationCutoff(e.olderConversationCutoff)?e.olderConversationCutoff:`7d`,showArchivedConversations:e.showArchivedConversations,showRepoBranchMetadata:e.showRepoBranchMetadata,showLlmProfiles:e.showLlmProfiles,showTagsMetadata:e.showTagsMetadata,showHoverMetadata:e.showHoverMetadata,organizeMode:e.organizeMode,conversationSort:e.conversationSort,threadScope:e.threadScope,automationFilterMode:e.automationFilterMode,selectedAutomationNames:e.selectedAutomationNames,selectedTagFacets:e.selectedTagFacets,groupFolderOrder:e.groupFolderOrder})}));exports.DEFAULT_LAYOUT_SETTINGS=r,exports.useConversationPanelPreferencesStore=a;
|
|
2
2
|
//# sourceMappingURL=conversation-panel-preferences-store.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-panel-preferences-store.cjs","names":[],"sources":["../../src/stores/conversation-panel-preferences-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { persist, createJSONStorage } from \"zustand/middleware\";\nimport {\n type AutomationFilterMode,\n type ConversationSortField,\n type OrganizeMode,\n type ThreadScope,\n} from \"#/components/features/conversation-panel/conversation-panel-list-helpers\";\n\n/**\n * User-toggleable display preferences for the sidebar conversation list\n * filter menu. These are intentionally persisted to localStorage (via the\n * same `zustand/persist` pattern used by `home-store` and `workspaces-store`)\n * so the menu state survives full reloads.\n *\n * To add a new preference exposed by the filter menu:\n * 1. Add a field here with a sensible default in `initialState`.\n * 2. Add matching `setX`/`toggleX` actions below.\n * 3. Read/write through the store in `conversation-panel.tsx`.\n * No additional plumbing (storage keys, sanitization, etc.) is required —\n * `persist` handles migration of unknown fields gracefully.\n */\ninterface ConversationPanelPreferencesState {\n showOlderConversations: boolean;\n showArchivedConversations: boolean;\n showRepoBranchMetadata: boolean;\n showLlmProfiles: boolean;\n showTagsMetadata: boolean;\n showHoverMetadata: boolean;\n organizeMode: OrganizeMode;\n conversationSort: ConversationSortField;\n threadScope: ThreadScope;\n automationFilterMode: AutomationFilterMode;\n selectedAutomationNames: string[];\n groupFolderOrder: string[];\n}\n\ninterface ConversationPanelPreferencesActions {\n setShowOlderConversations: (value: boolean) => void;\n toggleShowOlderConversations: () => void;\n setShowArchivedConversations: (value: boolean) => void;\n toggleShowArchivedConversations: () => void;\n setShowRepoBranchMetadata: (value: boolean) => void;\n toggleShowRepoBranchMetadata: () => void;\n setShowLlmProfiles: (value: boolean) => void;\n toggleShowLlmProfiles: () => void;\n setShowTagsMetadata: (value: boolean) => void;\n toggleShowTagsMetadata: () => void;\n setShowHoverMetadata: (value: boolean) => void;\n toggleShowHoverMetadata: () => void;\n setOrganizeMode: (value: OrganizeMode) => void;\n setConversationSort: (value: ConversationSortField) => void;\n setThreadScope: (value: ThreadScope) => void;\n setAutomationFilterMode: (value: AutomationFilterMode) => void;\n toggleAutomationName: (name: string) => void;\n setGroupFolderOrder: (order: readonly string[]) => void;\n}\n\ntype ConversationPanelPreferencesStore = ConversationPanelPreferencesState &\n ConversationPanelPreferencesActions;\n\nconst initialState: ConversationPanelPreferencesState = {\n showOlderConversations: true,\n showArchivedConversations: false,\n showRepoBranchMetadata: false,\n showLlmProfiles: false,\n showTagsMetadata: false,\n showHoverMetadata: true,\n organizeMode: \"chronological\",\n conversationSort: \"updated\",\n threadScope: \"all\",\n automationFilterMode: \"all\",\n selectedAutomationNames: [],\n groupFolderOrder: [],\n};\n\nexport const useConversationPanelPreferencesStore =\n create<ConversationPanelPreferencesStore>()(\n persist(\n (set) => ({\n ...initialState,\n\n setShowOlderConversations: (value) =>\n set(() => ({ showOlderConversations: value })),\n toggleShowOlderConversations: () =>\n set((state) => ({\n showOlderConversations: !state.showOlderConversations,\n })),\n\n setShowArchivedConversations: (value) =>\n set(() => ({ showArchivedConversations: value })),\n toggleShowArchivedConversations: () =>\n set((state) => ({\n showArchivedConversations: !state.showArchivedConversations,\n })),\n\n setShowRepoBranchMetadata: (value) =>\n set(() => ({ showRepoBranchMetadata: value })),\n toggleShowRepoBranchMetadata: () =>\n set((state) => ({\n showRepoBranchMetadata: !state.showRepoBranchMetadata,\n })),\n\n setShowLlmProfiles: (value) => set(() => ({ showLlmProfiles: value })),\n toggleShowLlmProfiles: () =>\n set((state) => ({\n showLlmProfiles: !state.showLlmProfiles,\n })),\n\n setShowTagsMetadata: (value) =>\n set(() => ({ showTagsMetadata: value })),\n toggleShowTagsMetadata: () =>\n set((state) => ({\n showTagsMetadata: !state.showTagsMetadata,\n })),\n\n setShowHoverMetadata: (value) =>\n set(() => ({ showHoverMetadata: value })),\n toggleShowHoverMetadata: () =>\n set((state) => ({\n showHoverMetadata: !state.showHoverMetadata,\n })),\n\n setOrganizeMode: (value) => set(() => ({ organizeMode: value })),\n setConversationSort: (value) =>\n set(() => ({ conversationSort: value })),\n setThreadScope: (value) => set(() => ({ threadScope: value })),\n setAutomationFilterMode: (value) =>\n set(() => ({ automationFilterMode: value })),\n toggleAutomationName: (name) =>\n set((state) => ({\n selectedAutomationNames: state.selectedAutomationNames.includes(\n name,\n )\n ? state.selectedAutomationNames.filter(\n (existing) => existing !== name,\n )\n : [...state.selectedAutomationNames, name],\n })),\n setGroupFolderOrder: (order) =>\n set(() => ({ groupFolderOrder: [...order] })),\n }),\n {\n name: \"conversation-panel-preferences\",\n storage: createJSONStorage(() => localStorage),\n // Only persist the data fields — actions are recreated on each load.\n partialize: (state): ConversationPanelPreferencesState => ({\n showOlderConversations: state.showOlderConversations,\n showArchivedConversations: state.showArchivedConversations,\n showRepoBranchMetadata: state.showRepoBranchMetadata,\n showLlmProfiles: state.showLlmProfiles,\n showTagsMetadata: state.showTagsMetadata,\n showHoverMetadata: state.showHoverMetadata,\n organizeMode: state.organizeMode,\n conversationSort: state.conversationSort,\n threadScope: state.threadScope,\n automationFilterMode: state.automationFilterMode,\n selectedAutomationNames: state.selectedAutomationNames,\n groupFolderOrder: state.groupFolderOrder,\n }),\n },\n ),\n );\n"],"mappings":"8JA6DA,IAAM,EAAkD,CACtD,uBAAwB,GACxB,0BAA2B,GAC3B,uBAAwB,GACxB,gBAAiB,GACjB,iBAAkB,GAClB,kBAAmB,GACnB,aAAc,gBACd,iBAAkB,UAClB,YAAa,MACb,qBAAsB,MACtB,wBAAyB,CAAC,EAC1B,iBAAkB,CAAC,CACrB,EAEa,EACX,EAAA,OAA0C,EACxC,EAAA,QACG,IAAS,CACR,GAAG,EAEH,0BAA4B,GAC1B,OAAW,CAAE,uBAAwB,CAAM,EAAE,EAC/C,iCACE,EAAK,IAAW,CACd,uBAAwB,CAAC,EAAM,sBACjC,EAAE,EAEJ,6BAA+B,GAC7B,OAAW,CAAE,0BAA2B,CAAM,EAAE,EAClD,oCACE,EAAK,IAAW,CACd,0BAA2B,CAAC,EAAM,yBACpC,EAAE,EAEJ,0BAA4B,GAC1B,OAAW,CAAE,uBAAwB,CAAM,EAAE,EAC/C,iCACE,EAAK,IAAW,CACd,uBAAwB,CAAC,EAAM,sBACjC,EAAE,EAEJ,mBAAqB,GAAU,OAAW,CAAE,gBAAiB,CAAM,EAAE,EACrE,0BACE,EAAK,IAAW,CACd,gBAAiB,CAAC,EAAM,eAC1B,EAAE,EAEJ,oBAAsB,GACpB,OAAW,CAAE,iBAAkB,CAAM,EAAE,EACzC,2BACE,EAAK,IAAW,CACd,iBAAkB,CAAC,EAAM,gBAC3B,EAAE,EAEJ,qBAAuB,GACrB,OAAW,CAAE,kBAAmB,CAAM,EAAE,EAC1C,4BACE,EAAK,IAAW,CACd,kBAAmB,CAAC,EAAM,iBAC5B,EAAE,EAEJ,gBAAkB,GAAU,OAAW,CAAE,aAAc,CAAM,EAAE,EAC/D,oBAAsB,GACpB,OAAW,CAAE,iBAAkB,CAAM,EAAE,EACzC,eAAiB,GAAU,OAAW,CAAE,YAAa,CAAM,EAAE,EAC7D,wBAA0B,GACxB,OAAW,CAAE,qBAAsB,CAAM,EAAE,EAC7C,qBAAuB,GACrB,EAAK,IAAW,CACd,wBAAyB,EAAM,wBAAwB,SACrD,CACF,EACI,EAAM,wBAAwB,OAC3B,GAAa,IAAa,CAC7B,EACA,CAAC,GAAG,EAAM,wBAAyB,CAAI,CAC7C,EAAE,EACJ,oBAAsB,GACpB,OAAW,CAAE,iBAAkB,CAAC,GAAG,CAAK,CAAE,EAAE,CAChD,GACA,CACE,KAAM,iCACN,QAAS,EAAA,sBAAwB,YAAY,EAE7C,WAAa,IAA8C,CACzD,uBAAwB,EAAM,uBAC9B,0BAA2B,EAAM,0BACjC,uBAAwB,EAAM,uBAC9B,gBAAiB,EAAM,gBACvB,iBAAkB,EAAM,iBACxB,kBAAmB,EAAM,kBACzB,aAAc,EAAM,aACpB,iBAAkB,EAAM,iBACxB,YAAa,EAAM,YACnB,qBAAsB,EAAM,qBAC5B,wBAAyB,EAAM,wBAC/B,iBAAkB,EAAM,gBAC1B,EACF,CACF,CACF"}
|
|
1
|
+
{"version":3,"file":"conversation-panel-preferences-store.cjs","names":[],"sources":["../../src/stores/conversation-panel-preferences-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { persist, createJSONStorage } from \"zustand/middleware\";\nimport {\n DEFAULT_OLDER_CONVERSATION_CUTOFF,\n isOlderConversationCutoff,\n type AutomationFilterMode,\n type ConversationSortField,\n type OlderConversationCutoff,\n type OrganizeMode,\n type ThreadScope,\n} from \"#/components/features/conversation-panel/conversation-panel-list-helpers\";\n\n/**\n * User-toggleable display preferences for the sidebar conversation list\n * (the layouts menu and the advanced-options modal behind it). These are\n * intentionally persisted to localStorage (via the same `zustand/persist`\n * pattern used by `home-store` and `workspaces-store`) so the menu state\n * survives full reloads.\n *\n * Every persisted narrowing field must have a control that can see and undo\n * it, or a reload silently hides conversations with nothing on screen to say\n * why — see `ConversationActiveTagFilters`.\n *\n * To add a new preference exposed by those menus:\n * 1. Add a field here with a sensible default in `initialState`.\n * 2. Add matching `setX`/`toggleX` actions below.\n * 3. Read/write through the store in `conversation-panel.tsx`.\n * No additional plumbing (storage keys, sanitization, etc.) is required —\n * `persist` handles migration of unknown fields gracefully.\n */\ninterface ConversationPanelPreferencesState {\n showOlderConversations: boolean;\n /**\n * Age threshold used when `showOlderConversations` is false. Conversations\n * last updated before this interval are hidden.\n */\n olderConversationCutoff: OlderConversationCutoff;\n showArchivedConversations: boolean;\n showRepoBranchMetadata: boolean;\n showLlmProfiles: boolean;\n showTagsMetadata: boolean;\n showHoverMetadata: boolean;\n organizeMode: OrganizeMode;\n conversationSort: ConversationSortField;\n threadScope: ThreadScope;\n automationFilterMode: AutomationFilterMode;\n selectedAutomationNames: string[];\n selectedTagFacets: string[];\n groupFolderOrder: string[];\n}\n\n/** The complete preference bundle controlled by conversation layout presets. */\nexport type LayoutSettingsSlice = Pick<\n ConversationPanelPreferencesState,\n | \"organizeMode\"\n | \"conversationSort\"\n | \"threadScope\"\n | \"showOlderConversations\"\n | \"showRepoBranchMetadata\"\n | \"showLlmProfiles\"\n | \"showTagsMetadata\"\n | \"showHoverMetadata\"\n>;\n\nexport const DEFAULT_LAYOUT_SETTINGS: LayoutSettingsSlice = {\n organizeMode: \"chronological\",\n conversationSort: \"updated\",\n threadScope: \"all\",\n showOlderConversations: true,\n showRepoBranchMetadata: false,\n showLlmProfiles: false,\n showTagsMetadata: true,\n showHoverMetadata: true,\n};\n\ninterface ConversationPanelPreferencesActions {\n setShowOlderConversations: (value: boolean) => void;\n toggleShowOlderConversations: () => void;\n setOlderConversationCutoff: (value: OlderConversationCutoff) => void;\n setShowArchivedConversations: (value: boolean) => void;\n toggleShowArchivedConversations: () => void;\n setShowRepoBranchMetadata: (value: boolean) => void;\n toggleShowRepoBranchMetadata: () => void;\n setShowLlmProfiles: (value: boolean) => void;\n toggleShowLlmProfiles: () => void;\n setShowTagsMetadata: (value: boolean) => void;\n toggleShowTagsMetadata: () => void;\n setShowHoverMetadata: (value: boolean) => void;\n toggleShowHoverMetadata: () => void;\n setOrganizeMode: (value: OrganizeMode) => void;\n setConversationSort: (value: ConversationSortField) => void;\n setThreadScope: (value: ThreadScope) => void;\n setAutomationFilterMode: (value: AutomationFilterMode) => void;\n toggleAutomationName: (name: string) => void;\n /**\n * Clears both facet selections (tags and automation names) — the two\n * narrowings the active-filter strip renders as chips.\n *\n * Deliberately leaves `automationFilterMode` alone: the strip shows no chip\n * for the mode, and it must not silently switch a surface it doesn't show.\n * The mode keeps its own rows in the advanced-options modal.\n */\n clearFilterSelections: () => void;\n toggleTagFacet: (facet: string) => void;\n /** Applies a layout preset's partial bundle in one set(). */\n applyLayoutSettings: (settings: Partial<LayoutSettingsSlice>) => void;\n setGroupFolderOrder: (order: readonly string[]) => void;\n}\n\ntype ConversationPanelPreferencesStore = ConversationPanelPreferencesState &\n ConversationPanelPreferencesActions;\n\nconst initialState: ConversationPanelPreferencesState = {\n ...DEFAULT_LAYOUT_SETTINGS,\n olderConversationCutoff: DEFAULT_OLDER_CONVERSATION_CUTOFF,\n showArchivedConversations: false,\n automationFilterMode: \"all\",\n selectedAutomationNames: [],\n selectedTagFacets: [],\n groupFolderOrder: [],\n};\n\nexport const useConversationPanelPreferencesStore =\n create<ConversationPanelPreferencesStore>()(\n persist(\n (set) => ({\n ...initialState,\n\n setShowOlderConversations: (value) =>\n set(() => ({ showOlderConversations: value })),\n toggleShowOlderConversations: () =>\n set((state) => ({\n showOlderConversations: !state.showOlderConversations,\n })),\n setOlderConversationCutoff: (value) =>\n set(() => ({\n olderConversationCutoff: isOlderConversationCutoff(value)\n ? value\n : DEFAULT_OLDER_CONVERSATION_CUTOFF,\n })),\n\n setShowArchivedConversations: (value) =>\n set(() => ({ showArchivedConversations: value })),\n toggleShowArchivedConversations: () =>\n set((state) => ({\n showArchivedConversations: !state.showArchivedConversations,\n })),\n\n setShowRepoBranchMetadata: (value) =>\n set(() => ({ showRepoBranchMetadata: value })),\n toggleShowRepoBranchMetadata: () =>\n set((state) => ({\n showRepoBranchMetadata: !state.showRepoBranchMetadata,\n })),\n\n setShowLlmProfiles: (value) => set(() => ({ showLlmProfiles: value })),\n toggleShowLlmProfiles: () =>\n set((state) => ({\n showLlmProfiles: !state.showLlmProfiles,\n })),\n\n setShowTagsMetadata: (value) =>\n set(() => ({ showTagsMetadata: value })),\n toggleShowTagsMetadata: () =>\n set((state) => ({\n showTagsMetadata: !state.showTagsMetadata,\n })),\n\n setShowHoverMetadata: (value) =>\n set(() => ({ showHoverMetadata: value })),\n toggleShowHoverMetadata: () =>\n set((state) => ({\n showHoverMetadata: !state.showHoverMetadata,\n })),\n\n setOrganizeMode: (value) => set(() => ({ organizeMode: value })),\n setConversationSort: (value) =>\n set(() => ({ conversationSort: value })),\n setThreadScope: (value) => set(() => ({ threadScope: value })),\n setAutomationFilterMode: (value) =>\n set((state) => ({\n automationFilterMode: value,\n // Name selections only make sense in only-automations mode;\n // leaving the mode clears them (self-healing — a stale selection\n // must never silently narrow an unfiltered-looking list).\n selectedAutomationNames:\n value === \"only-automations\" ? state.selectedAutomationNames : [],\n })),\n toggleAutomationName: (name) =>\n set((state) => ({\n selectedAutomationNames: state.selectedAutomationNames.includes(\n name,\n )\n ? state.selectedAutomationNames.filter(\n (existing) => existing !== name,\n )\n : [...state.selectedAutomationNames, name],\n })),\n clearFilterSelections: () =>\n set(() => ({\n selectedTagFacets: [],\n selectedAutomationNames: [],\n })),\n toggleTagFacet: (facet) =>\n set((state) => ({\n selectedTagFacets: state.selectedTagFacets.includes(facet)\n ? state.selectedTagFacets.filter((existing) => existing !== facet)\n : [...state.selectedTagFacets, facet],\n })),\n setGroupFolderOrder: (order) =>\n set(() => ({ groupFolderOrder: [...order] })),\n\n applyLayoutSettings: (settings) => set(() => ({ ...settings })),\n }),\n {\n name: \"conversation-panel-preferences\",\n storage: createJSONStorage(() => localStorage),\n // Only persist the data fields — actions are recreated on each load.\n partialize: (state): ConversationPanelPreferencesState => ({\n showOlderConversations: state.showOlderConversations,\n olderConversationCutoff: isOlderConversationCutoff(\n state.olderConversationCutoff,\n )\n ? state.olderConversationCutoff\n : DEFAULT_OLDER_CONVERSATION_CUTOFF,\n showArchivedConversations: state.showArchivedConversations,\n showRepoBranchMetadata: state.showRepoBranchMetadata,\n showLlmProfiles: state.showLlmProfiles,\n showTagsMetadata: state.showTagsMetadata,\n showHoverMetadata: state.showHoverMetadata,\n organizeMode: state.organizeMode,\n conversationSort: state.conversationSort,\n threadScope: state.threadScope,\n automationFilterMode: state.automationFilterMode,\n selectedAutomationNames: state.selectedAutomationNames,\n selectedTagFacets: state.selectedTagFacets,\n groupFolderOrder: state.groupFolderOrder,\n }),\n },\n ),\n );\n"],"mappings":"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"}
|