@openhands/agent-canvas 1.13.0 → 1.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/README.windows.md +2 -2
- package/build/assets/acp-providers-BKvmTf82.js +1 -0
- package/build/assets/active-backend-context-DKFSMbn3.js +2 -0
- package/build/assets/agent-context-settings-D3PjSTU1.js +1 -0
- package/build/assets/agent-profiles-settings-D4cY5U2T.js +1 -0
- package/build/assets/agent-server-conversation-service.api-DozDKIW_.js +86 -0
- package/build/assets/agent-settings-351vXWc9.js +2 -0
- package/build/assets/agent-settings-Ce7BDZ6I.js +1 -0
- package/build/assets/alert-banner-Kyy1YWZU.js +1 -0
- package/build/assets/api-error-message-BJyfWp6p.js +1 -0
- package/build/assets/api-key-entry-screen-INIxqAMs.js +1 -0
- package/build/assets/app-settings-CbHqzQus.js +1 -0
- package/build/assets/automation-detail-DXDhUwPq.js +3 -0
- package/build/assets/automation-export-BRopEHMu.js +2 -0
- package/build/assets/automation-git-sync-CzyS4cn1.js +1 -0
- package/build/assets/automation-setup-route-FRr05f_g.js +1 -0
- package/build/assets/automation-templates-C_0FZgLG.js +1 -0
- package/build/assets/automations-list-CERuQWE6.js +1 -0
- package/build/assets/back-nav-button-Dm9tIjVf.js +1 -0
- package/build/assets/backend-form-modal-DK78-jn1.js +1 -0
- package/build/assets/backend-synced-settings-badge-3fOwg6Bd.js +1 -0
- package/build/assets/badge-D4SqUCsR.js +1 -0
- package/build/assets/base-modal-C7_BDl_U.js +1 -0
- package/build/assets/bot-C-0Wu7vQ.js +1 -0
- package/build/assets/brand-button-Dxv6PDeN.js +1 -0
- package/build/assets/browser-11etCQ04.js +7 -0
- package/build/assets/browser-tab-BAl4ckJE.js +1 -0
- package/build/assets/chat-send-button-DWwR2cgI.js +1 -0
- package/build/assets/check-Cf2YoT90.js +1 -0
- package/build/assets/chevron-down-C3OQ-ehx.js +1 -0
- package/build/assets/chevron-right-CN1uUiJ1.js +1 -0
- package/build/assets/circle-check-g5yeGMd-.js +1 -0
- package/build/assets/circle-plus-check-toggle-CBh_qomE.js +1 -0
- package/build/assets/cloud-funnel-analytics-287iIERo.js +1 -0
- package/build/assets/cog-C4rrw-ZK.js +1 -0
- package/build/assets/command-menu-BZQ8S3Ke.js +1 -0
- package/build/assets/commits-tab-DZtJgaDM.js +1 -0
- package/build/assets/condenser-settings-BcNmYR4s.js +1 -0
- package/build/assets/confirmation-modal-Bk4JRcCM.js +1 -0
- package/build/assets/context-menu-list-item-lVYETtY5.js +1 -0
- package/build/assets/conversation-CchMzpGl.js +1 -0
- package/build/assets/conversation-Dpzftz57.js +93 -0
- package/build/assets/conversation-panel-CchMzpGl.js +1 -0
- package/build/assets/conversation-state-store-a9d2fxRc.js +1 -0
- package/build/assets/conversation-store-Ca3ghXap.js +6 -0
- package/build/assets/conversation-tab-empty-state-HJtkmHZj.js +1 -0
- package/build/assets/copy-to-clipboard-button-Cjkswvnj.js +1 -0
- package/build/assets/device-verify-EZhHhBT7.js +1 -0
- package/build/assets/dropdown-classes-DJe-E6MC.js +1 -0
- package/build/assets/edit-automation-modal-D-urtv8n.js +1 -0
- package/build/assets/empty-state-CvaVahVr.js +1 -0
- package/build/assets/entry.client-C7Bi2tkU.js +2 -0
- package/build/assets/enum-filter-dropdown-DliX_Lo0.js +1 -0
- package/build/assets/environment-switch-overlay-CEKrFiMw.js +1 -0
- package/build/assets/error-state-BALXiBNy.js +1 -0
- package/build/assets/extension-module-card-classes-DpeaYhYo.js +1 -0
- package/build/assets/extensions-hub-CFduxBnk.js +1 -0
- package/build/assets/extensions-navigation-BeC224yX.js +1 -0
- package/build/assets/external-link-DFpYunfj.js +1 -0
- package/build/assets/files-tab-CL3J9b3p.js +1 -0
- package/build/assets/form-control-classes-CGw40z5h.js +1 -0
- package/build/assets/format-model-name-BNPKVsIq.js +1 -0
- package/build/assets/get-git-path-DlAJa_i6.js +1 -0
- package/build/assets/git-repo-dropdown-DGMEhz7d.js +1 -0
- package/build/assets/git-repo-dropdown-ai8qaNkD.js +1 -0
- package/build/assets/highlighted-source-view-C3sxykQi.js +1 -0
- package/build/assets/home-BCGlNJCA.js +1 -0
- package/build/assets/home-DB1pRqTC.js +1 -0
- package/build/assets/home-automation-run-tooltip-CooFQRIG.js +1 -0
- package/build/assets/home-store-Dl1dPE58.js +1 -0
- package/build/assets/index-home-DB1pRqTC.js +1 -0
- package/build/assets/info-uYSVzX86.js +1 -0
- package/build/assets/install-server-modal-BbJdhzet.js +1 -0
- package/build/assets/kebab-menu-item-content-BYokkRHi.js +1 -0
- package/build/assets/key-Cn5za3rg.js +1 -0
- package/build/assets/launch-C1ieiOGe.js +1 -0
- package/build/assets/list-filter-OFkpRrmi.js +1 -0
- package/build/assets/list-todo-Cuu-STFc.js +1 -0
- package/build/assets/llm-not-configured-banner-BqqYnJ1t.js +27 -0
- package/build/assets/llm-settings-CnDbbmVW.js +1 -0
- package/build/assets/llm-settings-S8Yjg__1.js +1 -0
- package/build/assets/llm-subscription-service-BpPfzW4x.js +1 -0
- package/build/assets/loader-circle-nvrwthvj.js +1 -0
- package/build/assets/loading-spinner-0L3ZTToZ.js +1 -0
- package/build/assets/manage-backends-modal-BCUPswyl.js +1 -0
- package/build/assets/manifest-58597dde.js +1 -0
- package/build/assets/manifest-subpage-layout-BGhiUQbA.js +1 -0
- package/build/assets/map-provider-B9LTm23I.js +1 -0
- package/build/assets/markdown-renderer-Cb2sBWtV.js +8 -0
- package/build/assets/mcp-CKbR4Vft.js +1 -0
- package/build/assets/mcp-marketplace-utils-C13fFccR.js +1 -0
- package/build/assets/mcp-page-Bm4K2NQq.js +9 -0
- package/build/assets/messages-BTN5thLe.js +40 -0
- package/build/assets/modal-body-CMOc2tLl.js +1 -0
- package/build/assets/modal-classes-BAb4Y_BG.js +1 -0
- package/build/assets/modal-close-button-CkJ0Ktjj.js +1 -0
- package/build/assets/mouse-pointer-click-CsgRs_-r.js +1 -0
- package/build/assets/onboarding-Cx_kaiD1.js +1 -0
- package/build/assets/onboarding-modal-vMwn7ihv.js +1 -0
- package/build/assets/organization-service.api-C8XpQ0pM.js +1 -0
- package/build/assets/parse-git-remote-url-DpDM9bK6.js +1 -0
- package/build/assets/pencil-Clh1Wjvh.js +1 -0
- package/build/assets/planner-tab-DQvDU3ap.js +1 -0
- package/build/assets/plug-BuQhHSSG.js +1 -0
- package/build/assets/plugins-management-service-BjYeF0b0.js +1 -0
- package/build/assets/plus-CEKne-Yp.js +1 -0
- package/build/assets/profiles-service.api-QB-T_u-g.js +1 -0
- package/build/assets/providers-FfSZ5TXP.js +1 -0
- package/build/assets/proxy-tcFL2yTQ.js +1 -0
- package/build/assets/puzzle-A9pGxxai.js +1 -0
- package/build/assets/recommended-automations-launcher-Bw8uC4V6.js +1 -0
- package/build/assets/refresh-cw-Bh69DyYO.js +1 -0
- package/build/assets/root-BLeQfBEq.css +1 -0
- package/build/assets/root-ZKKYPR1Z.js +2 -0
- package/build/assets/root-layout-luJoE9IG.js +2 -0
- package/build/assets/schema-field-Csw5fhtN.js +1 -0
- package/build/assets/scroll-fade-state-Dw-i4SGq.js +1 -0
- package/build/assets/sdk-section-page-HTffvm7Q.js +1 -0
- package/build/assets/secret-form-HTUbYw5o.js +1 -0
- package/build/assets/secrets-service-BTor9uAU.js +1 -0
- package/build/assets/secrets-settings-BizaTEr1.js +1 -0
- package/build/assets/server-process-C9RKzd1x.js +1 -0
- package/build/assets/settings-BlmrkwRi.js +1 -0
- package/build/assets/settings-DcNPxz0v.js +1 -0
- package/build/assets/settings-dropdown-input-tM0A0ipy.js +1 -0
- package/build/assets/settings-index-CKq0b0Vg.js +1 -0
- package/build/assets/settings-input-C03KUoSC.js +1 -0
- package/build/assets/settings-list-classes-BJ0g8rWj.js +1 -0
- package/build/assets/settings-modal-AzEF1QPP.js +1 -0
- package/build/assets/settings-service.api-B2agVfjL.js +1 -0
- package/build/assets/settings-switch-CQE0EGC-.js +1 -0
- package/build/assets/settings-utils-ClYOkbbI.js +1 -0
- package/build/assets/shared-conversation-B55pCyBG.js +1 -0
- package/build/assets/shield-check-CFDViW82.js +1 -0
- package/build/assets/sidebar-layout-D3hE08wK.js +1 -0
- package/build/assets/sidebar-mobile-menu-toggle-BOtyJHwE.js +1 -0
- package/build/assets/sidebar-nav-link-CPzhyHQg.js +1 -0
- package/build/assets/sidebar-onboarding-checklist-storage-3qYflszY.js +1 -0
- package/build/assets/sidebar-store-DtpU7zaI.js +1 -0
- package/build/assets/skill-card-pill-row-CFxjoqxn.js +1 -0
- package/build/assets/skill-filter-CWZ5kjcg.js +2 -0
- package/build/assets/skill-icon-badge-CPQJ6A-I.js +1 -0
- package/build/assets/skill-scope-CV1dkAbW.js +1 -0
- package/build/assets/skills-plugins-DGHULTq6.js +1 -0
- package/build/assets/skills-settings-CM1lFv3e.js +1 -0
- package/build/assets/styled-tooltip-Dl06rkpY.js +1 -0
- package/build/assets/task-list-tab-04GNQuii.js +1 -0
- package/build/assets/terminal-Cj0iHIW7.js +3 -0
- package/build/assets/toggle-switch-Fd_QGz0r.js +1 -0
- package/build/assets/trash-2-Dl8_RGz0.js +1 -0
- package/build/assets/trash-_RMt7Ayc.js +1 -0
- package/build/assets/triangle-alert-SM-q4NU_.js +1 -0
- package/build/assets/typography-SgFy466J.js +1 -0
- package/build/assets/usage-tab-BcfWV6db.js +1 -0
- package/build/assets/use-acp-credential-form-BsSW5NHG.js +1 -0
- package/build/assets/use-activate-agent-profile-B2NS8nA5.js +1 -0
- package/build/assets/use-agent-profiles-DWBPC0Si.js +1 -0
- package/build/assets/use-automation-health-BxXdzZMP.js +1 -0
- package/build/assets/use-automations-zYb0dUny.js +1 -0
- package/build/assets/use-can-manage-org-profiles-BWMahtUh.js +1 -0
- package/build/assets/use-cloud-current-user-id-CPHMDG-C.js +1 -0
- package/build/assets/use-config-Bft35DOK.js +1 -0
- package/build/assets/use-create-conversation-DwN5vv2f.js +1 -0
- package/build/assets/use-create-secret-BSxJMxHp.js +1 -0
- package/build/assets/use-get-secrets-BT4ihRwj.js +1 -0
- package/build/assets/use-has-permission-B3C8rQmR.js +1 -0
- package/build/assets/use-is-authed-CFGkY3-Z.js +1 -0
- package/build/assets/use-launch-skill-in-chat-BYjYihBP.js +1 -0
- package/build/assets/use-llm-configured-BI6obxsc.js +1 -0
- package/build/assets/use-llm-profiles-djGAhTWL.js +1 -0
- package/build/assets/use-manifest-capabilities-3z0-1G59.js +1 -0
- package/build/assets/use-onboarding-completion-BXpyUSsJ.js +1 -0
- package/build/assets/use-plugins-marketplace-DI4_pK56.js +1 -0
- package/build/assets/use-save-agent-profile-DdBSTdpN.js +1 -0
- package/build/assets/use-save-settings-CUZW6yXP.js +1 -0
- package/build/assets/use-settings-C5VhGpqd.js +1 -0
- package/build/assets/use-settings-nav-items-DHaUu1Dg.js +16 -0
- package/build/assets/use-tracking-D5t9otIF.js +3 -0
- package/build/assets/use-user-conversation-DT0_QCnL.js +1 -0
- package/build/assets/useInfiniteQuery-CgeUQPfs.js +1 -0
- package/build/assets/useMutation-DFnzkf6f.js +1 -0
- package/build/assets/useQueries-BhbrGEf1.js +1 -0
- package/build/assets/useQuery-BXWbZBZl.js +1 -0
- package/build/assets/utils-DaCIEEQP.js +1 -0
- package/build/assets/vendor~browser-hbU4u2Ag.js +47 -0
- package/build/assets/vendor~commits-tab-BaO2Ce3e.js +11 -0
- package/build/assets/vendor~conversation-panel~conversation-CTvDDiXg.js +1 -0
- package/build/assets/vendor~entry.client-BFE7Llz9.js +1 -0
- package/build/assets/vendor~entry.client-BaKt_PIp.js +9 -0
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kepq2zme-ZixYGy6E.js +186 -0
- package/build/assets/vendor~index-home~home~conversation-panel~conversation-BTyukeM-.js +13 -0
- package/build/assets/vendor~root-layout-BlUaZ18v.js +1 -0
- package/build/assets/vendor~root-layout~conversation-panel~conversation-BYAWJwQX.js +1 -0
- package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-CHaLEBVR.js +1 -0
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-B2OLKL7N.js +1 -0
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-DXqM7vqB.js +1 -0
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-Dtu7BpYk.js +48 -0
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iw7io29p-Dz-MAyNb.js +1 -0
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-DonTKfQD.js +4949 -0
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-BgxDvUcf.js +8420 -0
- package/build/assets/verification-settings-Bj6bo097.js +1 -0
- package/build/assets/wrench-hi7Q13dF.js +1 -0
- package/build/assets/x-DkgltWa0.js +1 -0
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +183 -44
- package/build/locales/ca/openhands.json +183 -44
- package/build/locales/de/openhands.json +183 -44
- package/build/locales/en/openhands.json +183 -44
- package/build/locales/es/openhands.json +183 -44
- package/build/locales/fr/openhands.json +183 -44
- package/build/locales/it/openhands.json +183 -44
- package/build/locales/ja/openhands.json +183 -44
- package/build/locales/ko-KR/openhands.json +183 -44
- package/build/locales/no/openhands.json +183 -44
- package/build/locales/pt/openhands.json +183 -44
- package/build/locales/tr/openhands.json +183 -44
- package/build/locales/uk/openhands.json +183 -44
- package/build/locales/zh-CN/openhands.json +183 -44
- package/build/locales/zh-TW/openhands.json +183 -44
- package/config/defaults.json +2 -2
- package/dist/api/agent-server-adapter.cjs +3 -3
- package/dist/api/agent-server-adapter.cjs.map +1 -1
- package/dist/api/agent-server-adapter.d.ts +10 -1
- package/dist/api/agent-server-adapter.js +115 -110
- package/dist/api/agent-server-adapter.js.map +1 -1
- package/dist/api/automation-service/automation-service.api.cjs +1 -1
- package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
- package/dist/api/automation-service/automation-service.api.d.ts +23 -2
- package/dist/api/automation-service/automation-service.api.js +130 -73
- package/dist/api/automation-service/automation-service.api.js.map +1 -1
- package/dist/api/backend-registry/url-selection.cjs +1 -1
- package/dist/api/backend-registry/url-selection.cjs.map +1 -1
- package/dist/api/backend-registry/url-selection.d.ts +2 -1
- package/dist/api/backend-registry/url-selection.js +2 -2
- package/dist/api/backend-registry/url-selection.js.map +1 -1
- package/dist/api/cloud/conversation-service.api.cjs +1 -1
- package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
- package/dist/api/cloud/conversation-service.api.d.ts +9 -0
- package/dist/api/cloud/conversation-service.api.js +11 -1
- package/dist/api/cloud/conversation-service.api.js.map +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.js +29 -24
- package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
- package/dist/api/git-provider-items-service.cjs +2 -0
- package/dist/api/git-provider-items-service.cjs.map +1 -0
- package/dist/api/git-provider-items-service.d.ts +25 -0
- package/dist/api/git-provider-items-service.js +127 -0
- package/dist/api/git-provider-items-service.js.map +1 -0
- package/dist/api/mcp-health/probe-mcp-server-health.cjs +1 -1
- package/dist/api/mcp-health/probe-mcp-server-health.js +31 -31
- package/dist/api/open-hands.types.d.ts +0 -19
- package/dist/api/profiles-service/profiles-service.api.cjs +1 -1
- package/dist/api/profiles-service/profiles-service.api.cjs.map +1 -1
- package/dist/api/profiles-service/profiles-service.api.d.ts +29 -2
- package/dist/api/profiles-service/profiles-service.api.js +25 -2
- package/dist/api/profiles-service/profiles-service.api.js.map +1 -1
- package/dist/api/provider-connections-service/provider-connections-service.api.cjs +2 -0
- package/dist/api/provider-connections-service/provider-connections-service.api.cjs.map +1 -0
- package/dist/api/provider-connections-service/provider-connections-service.api.d.ts +34 -0
- package/dist/api/provider-connections-service/provider-connections-service.api.js +50 -0
- package/dist/api/provider-connections-service/provider-connections-service.api.js.map +1 -0
- package/dist/api/secrets-service.cjs +1 -1
- package/dist/api/secrets-service.cjs.map +1 -1
- package/dist/api/secrets-service.d.ts +5 -0
- package/dist/api/secrets-service.js +12 -6
- package/dist/api/secrets-service.js.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/create-skill-ready-event.cjs +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/create-skill-ready-event.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/create-skill-ready-event.js +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/create-skill-ready-event.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/index.d.ts +0 -1
- package/dist/components/conversation-events/chat/event-message.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message.js +1 -1
- package/dist/components/conversation-events/chat/event-message.js.map +1 -1
- package/dist/components/conversation-events/chat/messages.cjs.map +1 -1
- package/dist/components/conversation-events/chat/messages.js.map +1 -1
- package/dist/components/features/automations/add-automation-menu.d.ts +7 -0
- package/dist/components/features/automations/add-automation-modal.cjs +2 -0
- package/dist/components/features/automations/add-automation-modal.cjs.map +1 -0
- package/dist/components/features/automations/add-automation-modal.js +42 -0
- package/dist/components/features/automations/add-automation-modal.js.map +1 -0
- package/dist/components/features/automations/automation-action-button-classes.cjs +2 -0
- package/dist/components/features/automations/automation-action-button-classes.cjs.map +1 -0
- package/dist/components/features/automations/automation-action-button-classes.d.ts +0 -2
- package/dist/components/features/automations/automation-action-button-classes.js +8 -0
- package/dist/components/features/automations/automation-action-button-classes.js.map +1 -0
- package/dist/components/features/automations/automation-card-skeleton.cjs +2 -0
- package/dist/components/features/automations/automation-card-skeleton.cjs.map +1 -0
- package/dist/components/features/automations/automation-card-skeleton.js +33 -0
- package/dist/components/features/automations/automation-card-skeleton.js.map +1 -0
- package/dist/components/features/automations/automation-card.cjs +2 -0
- package/dist/components/features/automations/automation-card.cjs.map +1 -0
- package/dist/components/features/automations/automation-card.d.ts +1 -1
- package/dist/components/features/automations/automation-card.js +160 -0
- package/dist/components/features/automations/automation-card.js.map +1 -0
- package/dist/components/features/automations/automation-group.cjs +2 -0
- package/dist/components/features/automations/automation-group.cjs.map +1 -0
- package/dist/components/features/automations/automation-group.js +54 -0
- package/dist/components/features/automations/automation-group.js.map +1 -0
- package/dist/components/features/automations/automation-list-row.cjs +2 -0
- package/dist/components/features/automations/automation-list-row.cjs.map +1 -0
- package/dist/components/features/automations/automation-list-row.js +152 -0
- package/dist/components/features/automations/automation-list-row.js.map +1 -0
- package/dist/components/features/automations/automation-run-insights.cjs +2 -0
- package/dist/components/features/automations/automation-run-insights.cjs.map +1 -0
- package/dist/components/features/automations/automation-run-insights.js +46 -0
- package/dist/components/features/automations/automation-run-insights.js.map +1 -0
- package/dist/components/features/automations/automation-view-mode.cjs +2 -0
- package/dist/components/features/automations/automation-view-mode.cjs.map +1 -0
- package/dist/components/features/automations/automation-view-mode.d.ts +5 -1
- package/dist/components/features/automations/automation-view-mode.js +6 -0
- package/dist/components/features/automations/automation-view-mode.js.map +1 -0
- package/dist/components/features/automations/backend-not-configured.cjs +2 -0
- package/dist/components/features/automations/backend-not-configured.cjs.map +1 -0
- package/dist/components/features/automations/backend-not-configured.js +34 -0
- package/dist/components/features/automations/backend-not-configured.js.map +1 -0
- package/dist/components/features/automations/build-automation-menu-items.cjs +2 -0
- package/dist/components/features/automations/build-automation-menu-items.cjs.map +1 -0
- package/dist/components/features/automations/build-automation-menu-items.js +53 -0
- package/dist/components/features/automations/build-automation-menu-items.js.map +1 -0
- package/dist/components/features/automations/build-automation-pills.cjs +2 -0
- package/dist/components/features/automations/build-automation-pills.cjs.map +1 -0
- package/dist/components/features/automations/build-automation-pills.js +71 -0
- package/dist/components/features/automations/build-automation-pills.js.map +1 -0
- package/dist/components/features/automations/create-instructions.cjs +2 -0
- package/dist/components/features/automations/create-instructions.cjs.map +1 -0
- package/dist/components/features/automations/create-instructions.js +102 -0
- package/dist/components/features/automations/create-instructions.js.map +1 -0
- package/dist/components/features/automations/dashboard/automations-dashboard-controls.d.ts +4 -3
- package/dist/components/features/automations/detail/run-status-badge.cjs +2 -0
- package/dist/components/features/automations/detail/run-status-badge.cjs.map +1 -0
- package/dist/components/features/automations/detail/run-status-badge.js +102 -0
- package/dist/components/features/automations/detail/run-status-badge.js.map +1 -0
- package/dist/components/features/automations/empty-state.cjs +2 -0
- package/dist/components/features/automations/empty-state.cjs.map +1 -0
- package/dist/components/features/automations/empty-state.js +35 -0
- package/dist/components/features/automations/empty-state.js.map +1 -0
- package/dist/components/features/automations/error-state.cjs +2 -0
- package/dist/components/features/automations/error-state.cjs.map +1 -0
- package/dist/components/features/automations/error-state.js +28 -0
- package/dist/components/features/automations/error-state.js.map +1 -0
- package/dist/components/features/automations/git-sync/git-sync-activity-row.d.ts +15 -0
- package/dist/components/features/automations/git-sync/git-sync-config-form.d.ts +13 -0
- package/dist/components/features/automations/git-sync/git-sync-error-banner.d.ts +6 -0
- package/dist/components/features/automations/git-sync/git-sync-not-local-state.d.ts +1 -0
- package/dist/components/features/automations/git-sync/git-sync-overview-section.d.ts +12 -0
- package/dist/components/features/automations/git-sync/git-sync-skeleton.d.ts +1 -0
- package/dist/components/features/automations/git-sync/git-sync-status-pill.d.ts +7 -0
- package/dist/components/features/automations/git-sync/git-sync-unsupported-state.d.ts +7 -0
- package/dist/components/features/automations/import-automation-modal.d.ts +2 -1
- package/dist/components/features/automations/kebab-menu-item-content.cjs +2 -0
- package/dist/components/features/automations/kebab-menu-item-content.cjs.map +1 -0
- package/dist/components/features/automations/kebab-menu-item-content.js +21 -0
- package/dist/components/features/automations/kebab-menu-item-content.js.map +1 -0
- package/dist/components/features/automations/kebab-menu.cjs +2 -0
- package/dist/components/features/automations/kebab-menu.cjs.map +1 -0
- package/dist/components/features/automations/kebab-menu.d.ts +2 -1
- package/dist/components/features/automations/kebab-menu.js +76 -0
- package/dist/components/features/automations/kebab-menu.js.map +1 -0
- package/dist/components/features/automations/recommended-automations-launcher.cjs +2 -0
- package/dist/components/features/automations/recommended-automations-launcher.cjs.map +1 -0
- package/dist/components/features/automations/recommended-automations-launcher.d.ts +7 -1
- package/dist/components/features/automations/recommended-automations-launcher.js +134 -0
- package/dist/components/features/automations/recommended-automations-launcher.js.map +1 -0
- package/dist/components/features/automations/recommended-automations-rail.cjs +2 -0
- package/dist/components/features/automations/recommended-automations-rail.cjs.map +1 -0
- package/dist/components/features/automations/recommended-automations-rail.d.ts +9 -0
- package/dist/components/features/automations/recommended-automations-rail.js +127 -0
- package/dist/components/features/automations/recommended-automations-rail.js.map +1 -0
- package/dist/components/features/automations/recommended-automations-section.cjs +2 -0
- package/dist/components/features/automations/recommended-automations-section.cjs.map +1 -0
- package/dist/components/features/automations/recommended-automations-section.d.ts +2 -2
- package/dist/components/features/automations/recommended-automations-section.js +198 -0
- package/dist/components/features/automations/recommended-automations-section.js.map +1 -0
- package/dist/components/features/automations/responder-deployment-modal.cjs +2 -0
- package/dist/components/features/automations/responder-deployment-modal.cjs.map +1 -0
- package/dist/components/features/automations/responder-deployment-modal.d.ts +2 -1
- package/dist/components/features/automations/responder-deployment-modal.js +75 -0
- package/dist/components/features/automations/responder-deployment-modal.js.map +1 -0
- package/dist/components/features/automations/status-badge.cjs +2 -0
- package/dist/components/features/automations/status-badge.cjs.map +1 -0
- package/dist/components/features/automations/status-badge.js +12 -0
- package/dist/components/features/automations/status-badge.js.map +1 -0
- package/dist/components/features/automations/to-latest-run-state.cjs +2 -0
- package/dist/components/features/automations/to-latest-run-state.cjs.map +1 -0
- package/dist/components/features/automations/to-latest-run-state.d.ts +6 -0
- package/dist/components/features/automations/to-latest-run-state.js +21 -0
- package/dist/components/features/automations/to-latest-run-state.js.map +1 -0
- package/dist/components/features/backends/backend-form-modal.cjs +1 -1
- package/dist/components/features/backends/backend-form-modal.js +10 -10
- package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
- package/dist/components/features/backends/manage-backends-modal.js +5 -5
- package/dist/components/features/chat/chat-interface.cjs +2 -2
- package/dist/components/features/chat/chat-interface.cjs.map +1 -1
- package/dist/components/features/chat/chat-interface.js +151 -148
- package/dist/components/features/chat/chat-interface.js.map +1 -1
- package/dist/components/features/chat/error-message-banner.cjs +1 -1
- package/dist/components/features/chat/error-message-banner.cjs.map +1 -1
- package/dist/components/features/chat/error-message-banner.d.ts +3 -1
- package/dist/components/features/chat/error-message-banner.js +64 -58
- package/dist/components/features/chat/error-message-banner.js.map +1 -1
- package/dist/components/features/command-menu/command-menu-items.d.ts +10 -4
- package/dist/components/features/conversation/conversation-git-actions-menu.cjs +2 -0
- package/dist/components/features/conversation/conversation-git-actions-menu.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-git-actions-menu.d.ts +15 -0
- package/dist/components/features/conversation/conversation-git-actions-menu.js +123 -0
- package/dist/components/features/conversation/conversation-git-actions-menu.js.map +1 -0
- package/dist/components/features/conversation/conversation-git-actions-toggle.cjs +2 -0
- package/dist/components/features/conversation/conversation-git-actions-toggle.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-git-actions-toggle.d.ts +10 -0
- package/dist/components/features/conversation/conversation-git-actions-toggle.js +60 -0
- package/dist/components/features/conversation/conversation-git-actions-toggle.js.map +1 -0
- package/dist/components/features/conversation/conversation-main/chat-interface-wrapper.cjs +1 -1
- package/dist/components/features/conversation/conversation-main/chat-interface-wrapper.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-main/chat-interface-wrapper.js +46 -10
- package/dist/components/features/conversation/conversation-main/chat-interface-wrapper.js.map +1 -1
- package/dist/components/features/conversation/conversation-main/conversation-main.cjs +1 -1
- package/dist/components/features/conversation/conversation-main/conversation-main.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-main/conversation-main.js +49 -43
- package/dist/components/features/conversation/conversation-main/conversation-main.js.map +1 -1
- package/dist/components/features/conversation/conversation-name-with-status.cjs +1 -1
- package/dist/components/features/conversation/conversation-name-with-status.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-name-with-status.js +49 -40
- package/dist/components/features/conversation/conversation-name-with-status.js.map +1 -1
- package/dist/components/features/conversation/conversation-name.cjs +1 -1
- package/dist/components/features/conversation/conversation-name.js +4 -4
- package/dist/components/features/conversation/conversation-overview-automations-panel.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-automations-panel.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-automations-panel.d.ts +6 -0
- package/dist/components/features/conversation/conversation-overview-automations-panel.js +48 -0
- package/dist/components/features/conversation/conversation-overview-automations-panel.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-context-menu.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-context-menu.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-context-menu.d.ts +10 -0
- package/dist/components/features/conversation/conversation-overview-context-menu.js +221 -0
- package/dist/components/features/conversation/conversation-overview-context-menu.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-diffs-row.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-diffs-row.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-diffs-row.d.ts +2 -0
- package/dist/components/features/conversation/conversation-overview-diffs-row.js +88 -0
- package/dist/components/features/conversation/conversation-overview-diffs-row.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-drawer-content.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-drawer-content.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-drawer-content.d.ts +6 -0
- package/dist/components/features/conversation/conversation-overview-drawer-content.js +138 -0
- package/dist/components/features/conversation/conversation-overview-drawer-content.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-drawer-context.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-drawer-context.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-drawer-context.d.ts +17 -0
- package/dist/components/features/conversation/conversation-overview-drawer-context.js +43 -0
- package/dist/components/features/conversation/conversation-overview-drawer-context.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-drawer.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-drawer.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-drawer.constants.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-drawer.constants.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-drawer.constants.d.ts +6 -0
- package/dist/components/features/conversation/conversation-overview-drawer.constants.js +6 -0
- package/dist/components/features/conversation/conversation-overview-drawer.constants.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-drawer.d.ts +7 -0
- package/dist/components/features/conversation/conversation-overview-drawer.js +45 -0
- package/dist/components/features/conversation/conversation-overview-drawer.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-drawer.types.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-drawer.types.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-drawer.types.d.ts +12 -0
- package/dist/components/features/conversation/conversation-overview-drawer.types.js +13 -0
- package/dist/components/features/conversation/conversation-overview-drawer.types.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-git-items-panel.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-git-items-panel.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-git-items-panel.d.ts +7 -0
- package/dist/components/features/conversation/conversation-overview-git-items-panel.js +81 -0
- package/dist/components/features/conversation/conversation-overview-git-items-panel.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-git-section.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-git-section.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-git-section.d.ts +6 -0
- package/dist/components/features/conversation/conversation-overview-git-section.js +143 -0
- package/dist/components/features/conversation/conversation-overview-git-section.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-mcp-panel.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-mcp-panel.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-mcp-panel.d.ts +6 -0
- package/dist/components/features/conversation/conversation-overview-mcp-panel.js +108 -0
- package/dist/components/features/conversation/conversation-overview-mcp-panel.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-panel.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-panel.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-panel.constants.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-panel.constants.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-panel.constants.d.ts +24 -0
- package/dist/components/features/conversation/conversation-overview-panel.constants.js +12 -0
- package/dist/components/features/conversation/conversation-overview-panel.constants.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-panel.d.ts +2 -0
- package/dist/components/features/conversation/conversation-overview-panel.js +102 -0
- package/dist/components/features/conversation/conversation-overview-panel.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-project-scope-toggle.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-project-scope-toggle.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-project-scope-toggle.d.ts +8 -0
- package/dist/components/features/conversation/conversation-overview-project-scope-toggle.js +29 -0
- package/dist/components/features/conversation/conversation-overview-project-scope-toggle.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-secrets-panel.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-secrets-panel.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-secrets-panel.d.ts +6 -0
- package/dist/components/features/conversation/conversation-overview-secrets-panel.js +89 -0
- package/dist/components/features/conversation/conversation-overview-secrets-panel.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-sections.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-sections.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-sections.d.ts +43 -0
- package/dist/components/features/conversation/conversation-overview-sections.js +27 -0
- package/dist/components/features/conversation/conversation-overview-sections.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-skills-panel.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-skills-panel.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-skills-panel.d.ts +6 -0
- package/dist/components/features/conversation/conversation-overview-skills-panel.js +138 -0
- package/dist/components/features/conversation/conversation-overview-skills-panel.js.map +1 -0
- package/dist/components/features/conversation/conversation-overview-toggle.cjs +2 -0
- package/dist/components/features/conversation/conversation-overview-toggle.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-overview-toggle.d.ts +11 -0
- package/dist/components/features/conversation/conversation-overview-toggle.js +99 -0
- package/dist/components/features/conversation/conversation-overview-toggle.js.map +1 -0
- package/dist/components/features/conversation/conversation-secondary-drawer.classes.cjs +2 -0
- package/dist/components/features/conversation/conversation-secondary-drawer.classes.cjs.map +1 -0
- package/dist/components/features/conversation/conversation-secondary-drawer.classes.d.ts +4 -0
- package/dist/components/features/conversation/conversation-secondary-drawer.classes.js +7 -0
- package/dist/components/features/conversation/conversation-secondary-drawer.classes.js.map +1 -0
- package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js +10 -9
- package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.js.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +68 -62
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +98 -88
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
- package/dist/components/features/conversation/right-panel-toggle.cjs +1 -1
- package/dist/components/features/conversation/right-panel-toggle.cjs.map +1 -1
- package/dist/components/features/conversation/right-panel-toggle.d.ts +3 -2
- package/dist/components/features/conversation/right-panel-toggle.js +34 -33
- package/dist/components/features/conversation/right-panel-toggle.js.map +1 -1
- package/dist/components/features/conversation-panel/compact-conversation-row.cjs +1 -1
- package/dist/components/features/conversation-panel/compact-conversation-row.js +6 -6
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +2 -1
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +14 -7
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.js +263 -236
- package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
- package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs +1 -1
- package/dist/components/features/conversation-panel/local-new-conversation-menu.cjs.map +1 -1
- package/dist/components/features/conversation-panel/local-new-conversation-menu.js +4 -4
- package/dist/components/features/conversation-panel/local-new-conversation-menu.js.map +1 -1
- package/dist/components/features/diff-viewer/accordion-panel.cjs +2 -0
- package/dist/components/features/diff-viewer/accordion-panel.cjs.map +1 -0
- package/dist/components/features/diff-viewer/accordion-panel.d.ts +13 -0
- package/dist/components/features/diff-viewer/accordion-panel.js +41 -0
- package/dist/components/features/diff-viewer/accordion-panel.js.map +1 -0
- package/dist/components/features/diff-viewer/commit-list.cjs +1 -1
- package/dist/components/features/diff-viewer/commit-list.cjs.map +1 -1
- package/dist/components/features/diff-viewer/commit-list.d.ts +5 -1
- package/dist/components/features/diff-viewer/commit-list.js +30 -16
- package/dist/components/features/diff-viewer/commit-list.js.map +1 -1
- package/dist/components/features/diff-viewer/commit-row.cjs +1 -1
- package/dist/components/features/diff-viewer/commit-row.cjs.map +1 -1
- package/dist/components/features/diff-viewer/commit-row.d.ts +1 -2
- package/dist/components/features/diff-viewer/commit-row.js +38 -34
- package/dist/components/features/diff-viewer/commit-row.js.map +1 -1
- package/dist/components/features/diff-viewer/diff-change-list.cjs +2 -0
- package/dist/components/features/diff-viewer/diff-change-list.cjs.map +1 -0
- package/dist/components/features/diff-viewer/diff-change-list.d.ts +18 -0
- package/dist/components/features/diff-viewer/diff-change-list.js +22 -0
- package/dist/components/features/diff-viewer/diff-change-list.js.map +1 -0
- package/dist/components/features/diff-viewer/editor-container.cjs +1 -1
- package/dist/components/features/diff-viewer/editor-container.cjs.map +1 -1
- package/dist/components/features/diff-viewer/editor-container.d.ts +2 -1
- package/dist/components/features/diff-viewer/editor-container.js +8 -7
- package/dist/components/features/diff-viewer/editor-container.js.map +1 -1
- package/dist/components/features/diff-viewer/file-diff-viewer.cjs +1 -1
- package/dist/components/features/diff-viewer/file-diff-viewer.cjs.map +1 -1
- package/dist/components/features/diff-viewer/file-diff-viewer.d.ts +10 -1
- package/dist/components/features/diff-viewer/file-diff-viewer.js +138 -112
- package/dist/components/features/diff-viewer/file-diff-viewer.js.map +1 -1
- package/dist/components/features/diff-viewer/uncommitted-changes-row.cjs +2 -0
- package/dist/components/features/diff-viewer/uncommitted-changes-row.cjs.map +1 -0
- package/dist/components/features/diff-viewer/uncommitted-changes-row.d.ts +12 -0
- package/dist/components/features/diff-viewer/uncommitted-changes-row.js +51 -0
- package/dist/components/features/diff-viewer/uncommitted-changes-row.js.map +1 -0
- package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
- package/dist/components/features/files-tab/file-content-viewer.cjs.map +1 -1
- package/dist/components/features/files-tab/file-content-viewer.js +0 -1
- package/dist/components/features/files-tab/file-content-viewer.js.map +1 -1
- package/dist/components/features/files-tab/file-quick-row.cjs +1 -1
- package/dist/components/features/files-tab/file-quick-row.cjs.map +1 -1
- package/dist/components/features/files-tab/file-quick-row.d.ts +9 -7
- package/dist/components/features/files-tab/file-quick-row.js +63 -34
- package/dist/components/features/files-tab/file-quick-row.js.map +1 -1
- package/dist/components/features/files-tab/files-tab-tree.constants.cjs +2 -0
- package/dist/components/features/files-tab/files-tab-tree.constants.cjs.map +1 -0
- package/dist/components/features/files-tab/files-tab-tree.constants.d.ts +7 -0
- package/dist/components/features/files-tab/files-tab-tree.constants.js +6 -0
- package/dist/components/features/files-tab/files-tab-tree.constants.js.map +1 -0
- package/dist/components/features/files-tab/segmented-toggle.cjs +1 -1
- package/dist/components/features/files-tab/segmented-toggle.cjs.map +1 -1
- package/dist/components/features/files-tab/segmented-toggle.d.ts +5 -3
- package/dist/components/features/files-tab/segmented-toggle.js +10 -13
- package/dist/components/features/files-tab/segmented-toggle.js.map +1 -1
- package/dist/components/features/files-tab/tree-node.cjs +1 -1
- package/dist/components/features/files-tab/tree-node.cjs.map +1 -1
- package/dist/components/features/files-tab/tree-node.js +34 -32
- package/dist/components/features/files-tab/tree-node.js.map +1 -1
- package/dist/components/features/files-tab/workspace-path.cjs +2 -0
- package/dist/components/features/files-tab/workspace-path.cjs.map +1 -0
- package/dist/components/features/files-tab/workspace-path.d.ts +6 -0
- package/dist/components/features/files-tab/workspace-path.js +41 -0
- package/dist/components/features/files-tab/workspace-path.js.map +1 -0
- package/dist/components/features/home/featured-automations/automation-health-indicator.cjs +2 -0
- package/dist/components/features/home/featured-automations/automation-health-indicator.cjs.map +1 -0
- package/dist/components/features/home/featured-automations/automation-health-indicator.js +22 -0
- package/dist/components/features/home/featured-automations/automation-health-indicator.js.map +1 -0
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs +2 -0
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs.map +1 -0
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js +45 -0
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js.map +1 -0
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs +2 -0
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs.map +1 -0
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js +108 -0
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js.map +1 -0
- package/dist/components/features/home/featured-automations/automation-run-health.cjs +2 -0
- package/dist/components/features/home/featured-automations/automation-run-health.cjs.map +1 -0
- package/dist/components/features/home/featured-automations/automation-run-health.js +75 -0
- package/dist/components/features/home/featured-automations/automation-run-health.js.map +1 -0
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs +2 -0
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs.map +1 -0
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js +74 -0
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js.map +1 -0
- package/dist/components/features/home/featured-automations/pinned-automation-card.d.ts +3 -3
- package/dist/components/features/home/git-repo-dropdown/use-url-search.cjs +1 -1
- package/dist/components/features/home/git-repo-dropdown/use-url-search.cjs.map +1 -1
- package/dist/components/features/home/git-repo-dropdown/use-url-search.js +1 -1
- package/dist/components/features/home/git-repo-dropdown/use-url-search.js.map +1 -1
- package/dist/components/features/home/workspace-dropdown/folder-browser-modal.cjs +1 -1
- package/dist/components/features/home/workspace-dropdown/folder-browser-modal.js +6 -6
- package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.cjs +1 -1
- package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.js +6 -6
- package/dist/components/features/manifest/manifest-form-field.d.ts +4 -3
- package/dist/components/features/manifest/manifest-icons.cjs +2 -0
- package/dist/components/features/manifest/manifest-icons.cjs.map +1 -0
- package/dist/components/features/manifest/manifest-icons.d.ts +1 -0
- package/dist/components/features/manifest/manifest-icons.js +21 -0
- package/dist/components/features/manifest/manifest-icons.js.map +1 -0
- package/dist/components/features/manifest/manifest-repository-list.d.ts +25 -0
- package/dist/components/features/markdown/markdown-table-scroll.cjs +1 -1
- package/dist/components/features/markdown/markdown-table-scroll.cjs.map +1 -1
- package/dist/components/features/markdown/markdown-table-scroll.d.ts +2 -6
- package/dist/components/features/markdown/markdown-table-scroll.js +15 -21
- package/dist/components/features/markdown/markdown-table-scroll.js.map +1 -1
- package/dist/components/features/mcp-logo-badge.cjs +1 -1
- package/dist/components/features/mcp-logo-badge.cjs.map +1 -1
- package/dist/components/features/mcp-logo-badge.d.ts +1 -1
- package/dist/components/features/mcp-logo-badge.js +1 -0
- package/dist/components/features/mcp-logo-badge.js.map +1 -1
- package/dist/components/features/mcp-page/custom-server-editor.cjs +1 -1
- package/dist/components/features/mcp-page/custom-server-editor.js +16 -16
- package/dist/components/features/mcp-page/index.cjs +1 -1
- package/dist/components/features/mcp-page/index.js +2 -2
- package/dist/components/features/mcp-page/install-server-modal.cjs +1 -1
- package/dist/components/features/mcp-page/install-server-modal.cjs.map +1 -1
- package/dist/components/features/mcp-page/install-server-modal.js +25 -25
- package/dist/components/features/mcp-page/install-server-modal.js.map +1 -1
- package/dist/components/features/mcp-page/installed-server-card.cjs +1 -1
- package/dist/components/features/mcp-page/installed-server-card.js +5 -5
- package/dist/components/features/mcp-page/marketplace-card.cjs +1 -1
- package/dist/components/features/mcp-page/marketplace-card.js +4 -4
- package/dist/components/features/mcp-page/marketplace-section.cjs +1 -1
- package/dist/components/features/mcp-page/marketplace-section.js +3 -3
- package/dist/components/features/mcp-page/mcp-logo-stack-badge.cjs +2 -0
- package/dist/components/features/mcp-page/mcp-logo-stack-badge.cjs.map +1 -0
- package/dist/components/features/mcp-page/mcp-logo-stack-badge.js +60 -0
- package/dist/components/features/mcp-page/mcp-logo-stack-badge.js.map +1 -0
- package/dist/components/features/mcp-page/mcp-server-health.cjs +1 -1
- package/dist/components/features/mcp-page/mcp-server-health.js +18 -18
- package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +10 -7
- package/dist/components/features/onboarding/use-onboarding-completion.cjs +2 -0
- package/dist/components/features/onboarding/use-onboarding-completion.cjs.map +1 -0
- package/dist/components/features/onboarding/use-onboarding-completion.js +32 -0
- package/dist/components/features/onboarding/use-onboarding-completion.js.map +1 -0
- package/dist/components/features/settings/app-settings/getting-started-checklist-switch.cjs +2 -0
- package/dist/components/features/settings/app-settings/getting-started-checklist-switch.cjs.map +1 -0
- package/dist/components/features/settings/app-settings/getting-started-checklist-switch.d.ts +1 -0
- package/dist/components/features/settings/app-settings/getting-started-checklist-switch.js +22 -0
- package/dist/components/features/settings/app-settings/getting-started-checklist-switch.js.map +1 -0
- package/dist/components/features/settings/brand-button.cjs +1 -1
- package/dist/components/features/settings/brand-button.cjs.map +1 -1
- package/dist/components/features/settings/brand-button.d.ts +2 -0
- package/dist/components/features/settings/brand-button.js +4 -2
- package/dist/components/features/settings/brand-button.js.map +1 -1
- package/dist/components/features/settings/llm-profiles/delete-provider-connection-modal.cjs +1 -0
- package/dist/components/features/settings/llm-profiles/delete-provider-connection-modal.d.ts +7 -0
- package/dist/components/features/settings/llm-profiles/delete-provider-connection-modal.js +7 -0
- package/dist/components/features/settings/llm-profiles/llm-profiles-manager.cjs +1 -1
- package/dist/components/features/settings/llm-profiles/llm-profiles-manager.js +3 -0
- package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
- package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +1 -0
- package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +20 -1
- package/dist/components/features/settings/llm-profiles/provider-connection-modal.cjs +1 -0
- package/dist/components/features/settings/llm-profiles/provider-connection-modal.d.ts +19 -0
- package/dist/components/features/settings/llm-profiles/provider-connection-modal.js +10 -0
- package/dist/components/features/settings/llm-profiles/provider-connection-row.cjs +1 -0
- package/dist/components/features/settings/llm-profiles/provider-connection-row.d.ts +10 -0
- package/dist/components/features/settings/llm-profiles/provider-connection-row.js +6 -0
- package/dist/components/features/settings/llm-profiles/provider-connections-manager.cjs +1 -0
- package/dist/components/features/settings/llm-profiles/provider-connections-manager.d.ts +15 -0
- package/dist/components/features/settings/llm-profiles/provider-connections-manager.js +8 -0
- package/dist/components/features/settings/sdk-settings/schema-field.cjs +1 -1
- package/dist/components/features/settings/sdk-settings/schema-field.js +6 -6
- package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs +1 -1
- package/dist/components/features/settings/sdk-settings/sdk-section-page.js +7 -7
- package/dist/components/features/settings/sdk-settings/sdk-section-page.js.map +1 -1
- package/dist/components/features/settings/secrets-settings/secret-form.cjs +1 -1
- package/dist/components/features/settings/secrets-settings/secret-form.js +7 -7
- package/dist/components/features/settings/settings-input.cjs +1 -1
- package/dist/components/features/settings/settings-input.cjs.map +1 -1
- package/dist/components/features/settings/settings-input.d.ts +6 -0
- package/dist/components/features/settings/settings-input.js +14 -13
- package/dist/components/features/settings/settings-input.js.map +1 -1
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-icon.cjs +2 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-icon.cjs.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-icon.d.ts +7 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-icon.js +102 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-icon.js.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-preview.cjs +2 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-preview.cjs.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-preview.d.ts +8 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-preview.js +66 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-item-preview.js.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-llm-complete.cjs +2 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-llm-complete.cjs.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-llm-complete.d.ts +3 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-llm-complete.js +15 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-llm-complete.js.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-storage.cjs +2 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-storage.cjs.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-storage.d.ts +10 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-storage.js +39 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist-storage.js.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist.cjs +2 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist.cjs.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist.constants.cjs +2 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist.constants.cjs.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist.constants.d.ts +26 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist.constants.js +78 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist.constants.js.map +1 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist.d.ts +5 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist.js +127 -0
- package/dist/components/features/sidebar/sidebar-onboarding-checklist.js.map +1 -0
- package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
- package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
- package/dist/components/features/sidebar/sidebar-rail-body.js +115 -111
- package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist-dismissed.cjs +2 -0
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist-dismissed.cjs.map +1 -0
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist-dismissed.d.ts +1 -0
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist-dismissed.js +10 -0
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist-dismissed.js.map +1 -0
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.cjs +2 -0
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.cjs.map +1 -0
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.d.ts +15 -0
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.js +75 -0
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.js.map +1 -0
- package/dist/components/features/skills/add-skill-modal.cjs +2 -0
- package/dist/components/features/skills/add-skill-modal.cjs.map +1 -0
- package/dist/components/features/skills/add-skill-modal.js +164 -0
- package/dist/components/features/skills/add-skill-modal.js.map +1 -0
- package/dist/components/features/skills/build-skill-pills.cjs +2 -0
- package/dist/components/features/skills/build-skill-pills.cjs.map +1 -0
- package/dist/components/features/skills/build-skill-pills.js +88 -0
- package/dist/components/features/skills/build-skill-pills.js.map +1 -0
- package/dist/components/features/skills/get-skill-card-description.cjs +2 -0
- package/dist/components/features/skills/get-skill-card-description.cjs.map +1 -0
- package/dist/components/features/skills/get-skill-card-description.js +34 -0
- package/dist/components/features/skills/get-skill-card-description.js.map +1 -0
- package/dist/components/features/skills/get-skill-chat-launch-message.cjs +2 -0
- package/dist/components/features/skills/get-skill-chat-launch-message.cjs.map +1 -0
- package/dist/components/features/skills/get-skill-chat-launch-message.js +9 -0
- package/dist/components/features/skills/get-skill-chat-launch-message.js.map +1 -0
- package/dist/components/features/skills/is-copyable-skill-source.cjs +2 -0
- package/dist/components/features/skills/is-copyable-skill-source.cjs.map +1 -0
- package/dist/components/features/skills/is-copyable-skill-source.js +9 -0
- package/dist/components/features/skills/is-copyable-skill-source.js.map +1 -0
- package/dist/components/features/skills/skill-card-pill-row.cjs +2 -0
- package/dist/components/features/skills/skill-card-pill-row.cjs.map +1 -0
- package/dist/components/features/skills/skill-card-pill-row.d.ts +1 -1
- package/dist/components/features/skills/skill-card-pill-row.js +137 -0
- package/dist/components/features/skills/skill-card-pill-row.js.map +1 -0
- package/dist/components/features/skills/skill-card.cjs +2 -0
- package/dist/components/features/skills/skill-card.cjs.map +1 -0
- package/dist/components/features/skills/skill-card.js +93 -0
- package/dist/components/features/skills/skill-card.js.map +1 -0
- package/dist/components/features/skills/skill-detail-modal.cjs +3 -0
- package/dist/components/features/skills/skill-detail-modal.cjs.map +1 -0
- package/dist/components/features/skills/skill-detail-modal.js +150 -0
- package/dist/components/features/skills/skill-detail-modal.js.map +1 -0
- package/dist/components/features/skills/skill-facet-rail.cjs +2 -0
- package/dist/components/features/skills/skill-facet-rail.cjs.map +1 -0
- package/dist/components/features/skills/skill-facet-rail.js +42 -0
- package/dist/components/features/skills/skill-facet-rail.js.map +1 -0
- package/dist/components/features/skills/skill-facet-row.cjs +2 -0
- package/dist/components/features/skills/skill-facet-row.cjs.map +1 -0
- package/dist/components/features/skills/skill-facet-row.js +44 -0
- package/dist/components/features/skills/skill-facet-row.js.map +1 -0
- package/dist/components/features/skills/skill-filter.cjs +2 -0
- package/dist/components/features/skills/skill-filter.cjs.map +1 -0
- package/dist/components/features/skills/skill-filter.js +166 -0
- package/dist/components/features/skills/skill-filter.js.map +1 -0
- package/dist/components/features/skills/skill-filters-modal.cjs +2 -0
- package/dist/components/features/skills/skill-filters-modal.cjs.map +1 -0
- package/dist/components/features/skills/skill-filters-modal.js +53 -0
- package/dist/components/features/skills/skill-filters-modal.js.map +1 -0
- package/dist/components/features/skills/skill-icon-badge.cjs +2 -0
- package/dist/components/features/skills/skill-icon-badge.cjs.map +1 -0
- package/dist/components/features/skills/skill-icon-badge.js +17 -0
- package/dist/components/features/skills/skill-icon-badge.js.map +1 -0
- package/dist/components/features/skills/skill-type-badge.cjs +2 -0
- package/dist/components/features/skills/skill-type-badge.cjs.map +1 -0
- package/dist/components/features/skills/skill-type-badge.js +21 -0
- package/dist/components/features/skills/skill-type-badge.js.map +1 -0
- package/dist/components/features/skills/skills-toolbar.cjs +2 -0
- package/dist/components/features/skills/skills-toolbar.cjs.map +1 -0
- package/dist/components/features/skills/skills-toolbar.js +63 -0
- package/dist/components/features/skills/skills-toolbar.js.map +1 -0
- package/dist/components/shared/buttons/circle-plus-check-toggle.cjs +1 -1
- package/dist/components/shared/buttons/circle-plus-check-toggle.cjs.map +1 -1
- package/dist/components/shared/buttons/circle-plus-check-toggle.js +19 -6
- package/dist/components/shared/buttons/circle-plus-check-toggle.js.map +1 -1
- package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs +1 -1
- package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs.map +1 -1
- package/dist/components/shared/buttons/conversation-confirmation-buttons.js +1 -1
- package/dist/components/shared/buttons/conversation-confirmation-buttons.js.map +1 -1
- package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
- package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
- package/dist/components/shared/filters/enum-filter-dropdown.d.ts +4 -1
- package/dist/components/shared/filters/enum-filter-dropdown.js +14 -14
- package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
- package/dist/components/shared/modals/settings/settings-form.cjs +1 -1
- package/dist/components/shared/modals/settings/settings-form.js +4 -4
- package/dist/components/ui/resize-handle.cjs +1 -1
- package/dist/components/ui/resize-handle.cjs.map +1 -1
- package/dist/components/ui/resize-handle.d.ts +2 -1
- package/dist/components/ui/resize-handle.js +6 -5
- package/dist/components/ui/resize-handle.js.map +1 -1
- package/dist/config/defaults.cjs +1 -1
- package/dist/config/defaults.cjs.map +1 -1
- package/dist/config/defaults.js +2 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/constants/skills-docs.cjs +2 -0
- package/dist/constants/skills-docs.cjs.map +1 -0
- package/dist/constants/skills-docs.js +6 -0
- package/dist/constants/skills-docs.js.map +1 -0
- package/dist/contexts/conversation-websocket-context.cjs +3 -3
- package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
- package/dist/contexts/conversation-websocket-context.js +184 -159
- package/dist/contexts/conversation-websocket-context.js.map +1 -1
- package/dist/fixtures/home-automations-demo.cjs +2 -0
- package/dist/fixtures/home-automations-demo.cjs.map +1 -0
- package/dist/fixtures/home-automations-demo.d.ts +1 -3
- package/dist/fixtures/home-automations-demo.js +384 -0
- package/dist/fixtures/home-automations-demo.js.map +1 -0
- package/dist/hooks/chat/use-slash-command.cjs +1 -1
- package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
- package/dist/hooks/chat/use-slash-command.d.ts +1 -2
- package/dist/hooks/chat/use-slash-command.js +1 -0
- package/dist/hooks/chat/use-slash-command.js.map +1 -1
- package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
- package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
- package/dist/hooks/mutation/use-create-conversation.js +27 -30
- package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
- package/dist/hooks/mutation/use-create-provider-connection.cjs +1 -0
- package/dist/hooks/mutation/use-create-provider-connection.d.ts +2 -0
- package/dist/hooks/mutation/use-create-provider-connection.js +1 -0
- package/dist/hooks/mutation/use-delete-mcp-server.cjs +1 -1
- package/dist/hooks/mutation/use-delete-mcp-server.js +3 -3
- package/dist/hooks/mutation/use-delete-provider-connection.cjs +1 -0
- package/dist/hooks/mutation/use-delete-provider-connection.d.ts +1 -0
- package/dist/hooks/mutation/use-delete-provider-connection.js +1 -0
- package/dist/hooks/mutation/use-switch-acp-model.cjs +1 -1
- package/dist/hooks/mutation/use-switch-acp-model.cjs.map +1 -1
- package/dist/hooks/mutation/use-switch-acp-model.d.ts +5 -3
- package/dist/hooks/mutation/use-switch-acp-model.js +9 -13
- package/dist/hooks/mutation/use-switch-acp-model.js.map +1 -1
- package/dist/hooks/mutation/use-update-mcp-server.cjs +1 -1
- package/dist/hooks/mutation/use-update-mcp-server.js +6 -6
- package/dist/hooks/mutation/use-update-provider-connection.cjs +1 -0
- package/dist/hooks/mutation/use-update-provider-connection.d.ts +7 -0
- package/dist/hooks/mutation/use-update-provider-connection.js +1 -0
- package/dist/hooks/query/query-keys.cjs +1 -1
- package/dist/hooks/query/query-keys.cjs.map +1 -1
- package/dist/hooks/query/query-keys.d.ts +3 -0
- package/dist/hooks/query/query-keys.js +4 -4
- package/dist/hooks/query/query-keys.js.map +1 -1
- package/dist/hooks/query/use-automation-detail.cjs +1 -0
- package/dist/hooks/query/use-automation-detail.js +2 -0
- package/dist/hooks/query/use-automation-health.cjs +2 -0
- package/dist/hooks/query/use-automation-health.cjs.map +1 -0
- package/dist/hooks/query/use-automation-health.js +22 -0
- package/dist/hooks/query/use-automation-health.js.map +1 -0
- package/dist/hooks/query/use-automations.cjs +2 -0
- package/dist/hooks/query/use-automations.cjs.map +1 -0
- package/dist/hooks/query/use-automations.js +28 -0
- package/dist/hooks/query/use-automations.js.map +1 -0
- package/dist/hooks/query/use-backends-health.cjs +1 -1
- package/dist/hooks/query/use-backends-health.cjs.map +1 -1
- package/dist/hooks/query/use-backends-health.js +1 -1
- package/dist/hooks/query/use-backends-health.js.map +1 -1
- package/dist/hooks/query/use-conversation-history.cjs +1 -1
- package/dist/hooks/query/use-conversation-history.cjs.map +1 -1
- package/dist/hooks/query/use-conversation-history.js +3 -1
- package/dist/hooks/query/use-conversation-history.js.map +1 -1
- package/dist/hooks/query/use-conversation-metrics.cjs +1 -1
- package/dist/hooks/query/use-conversation-metrics.js +3 -3
- package/dist/hooks/query/use-git-sync.d.ts +19 -0
- package/dist/hooks/query/use-latest-automation-runs.cjs +1 -0
- package/dist/hooks/query/use-latest-automation-runs.d.ts +2 -0
- package/dist/hooks/query/use-latest-automation-runs.js +3 -0
- package/dist/hooks/query/use-llm-profiles.d.ts +1 -1
- package/dist/hooks/query/use-paginated-conversations.cjs +1 -1
- package/dist/hooks/query/use-paginated-conversations.cjs.map +1 -1
- package/dist/hooks/query/use-paginated-conversations.js +1 -1
- package/dist/hooks/query/use-paginated-conversations.js.map +1 -1
- package/dist/hooks/query/use-provider-connections.cjs +2 -0
- package/dist/hooks/query/use-provider-connections.cjs.map +1 -0
- package/dist/hooks/query/use-provider-connections.d.ts +8 -0
- package/dist/hooks/query/use-provider-connections.js +19 -0
- package/dist/hooks/query/use-provider-connections.js.map +1 -0
- package/dist/hooks/query/use-repository-git-items.cjs +2 -0
- package/dist/hooks/query/use-repository-git-items.cjs.map +1 -0
- package/dist/hooks/query/use-repository-git-items.d.ts +3 -0
- package/dist/hooks/query/use-repository-git-items.js +33 -0
- package/dist/hooks/query/use-repository-git-items.js.map +1 -0
- package/dist/hooks/query/use-task-polling.cjs +1 -1
- package/dist/hooks/query/use-task-polling.cjs.map +1 -1
- package/dist/hooks/query/use-task-polling.js +12 -10
- package/dist/hooks/query/use-task-polling.js.map +1 -1
- package/dist/hooks/query/use-workspace-files.cjs +1 -1
- package/dist/hooks/query/use-workspace-files.cjs.map +1 -1
- package/dist/hooks/query/use-workspace-files.d.ts +14 -4
- package/dist/hooks/query/use-workspace-files.js +46 -33
- package/dist/hooks/query/use-workspace-files.js.map +1 -1
- package/dist/hooks/use-bash-command-runner.cjs +1 -1
- package/dist/hooks/use-bash-command-runner.cjs.map +1 -1
- package/dist/hooks/use-bash-command-runner.js +45 -42
- package/dist/hooks/use-bash-command-runner.js.map +1 -1
- package/dist/hooks/use-conversation-overview-column-space.cjs +2 -0
- package/dist/hooks/use-conversation-overview-column-space.cjs.map +1 -0
- package/dist/hooks/use-conversation-overview-column-space.d.ts +2 -0
- package/dist/hooks/use-conversation-overview-column-space.js +25 -0
- package/dist/hooks/use-conversation-overview-column-space.js.map +1 -0
- package/dist/hooks/use-conversation-overview-git-diff-stats.cjs +2 -0
- package/dist/hooks/use-conversation-overview-git-diff-stats.cjs.map +1 -0
- package/dist/hooks/use-conversation-overview-git-diff-stats.d.ts +7 -0
- package/dist/hooks/use-conversation-overview-git-diff-stats.js +37 -0
- package/dist/hooks/use-conversation-overview-git-diff-stats.js.map +1 -0
- package/dist/hooks/use-conversation-overview-panel-peek.cjs +2 -0
- package/dist/hooks/use-conversation-overview-panel-peek.cjs.map +1 -0
- package/dist/hooks/use-conversation-overview-panel-peek.d.ts +9 -0
- package/dist/hooks/use-conversation-overview-panel-peek.js +32 -0
- package/dist/hooks/use-conversation-overview-panel-peek.js.map +1 -0
- package/dist/hooks/use-conversation-overview-stats.cjs +2 -0
- package/dist/hooks/use-conversation-overview-stats.cjs.map +1 -0
- package/dist/hooks/use-conversation-overview-stats.d.ts +4 -0
- package/dist/hooks/use-conversation-overview-stats.js +15 -0
- package/dist/hooks/use-conversation-overview-stats.js.map +1 -0
- package/dist/hooks/use-conversation-primary-repository.cjs +2 -0
- package/dist/hooks/use-conversation-primary-repository.cjs.map +1 -0
- package/dist/hooks/use-conversation-primary-repository.d.ts +11 -0
- package/dist/hooks/use-conversation-primary-repository.js +17 -0
- package/dist/hooks/use-conversation-primary-repository.js.map +1 -0
- package/dist/hooks/use-drag-scroll.cjs +2 -0
- package/dist/hooks/use-drag-scroll.cjs.map +1 -0
- package/dist/hooks/use-drag-scroll.d.ts +12 -0
- package/dist/hooks/use-drag-scroll.js +41 -0
- package/dist/hooks/use-drag-scroll.js.map +1 -0
- package/dist/hooks/use-has-permission.cjs +2 -0
- package/dist/hooks/use-has-permission.cjs.map +1 -0
- package/dist/hooks/use-has-permission.js +8 -0
- package/dist/hooks/use-has-permission.js.map +1 -0
- package/dist/hooks/use-home-automation-actions.cjs +2 -0
- package/dist/hooks/use-home-automation-actions.cjs.map +1 -0
- package/dist/hooks/use-home-automation-actions.js +15 -0
- package/dist/hooks/use-home-automation-actions.js.map +1 -0
- package/dist/hooks/use-launch-skill-in-chat.cjs +2 -0
- package/dist/hooks/use-launch-skill-in-chat.cjs.map +1 -0
- package/dist/hooks/use-launch-skill-in-chat.js +16 -0
- package/dist/hooks/use-launch-skill-in-chat.js.map +1 -0
- package/dist/hooks/use-mcp-server-health.cjs +1 -1
- package/dist/hooks/use-mcp-server-health.js +3 -3
- package/dist/hooks/use-resizable-drawer-width.cjs +2 -0
- package/dist/hooks/use-resizable-drawer-width.cjs.map +1 -0
- package/dist/hooks/use-resizable-drawer-width.d.ts +22 -0
- package/dist/hooks/use-resizable-drawer-width.js +46 -0
- package/dist/hooks/use-resizable-drawer-width.js.map +1 -0
- package/dist/hooks/use-responder-url-secret.cjs +2 -0
- package/dist/hooks/use-responder-url-secret.cjs.map +1 -0
- package/dist/hooks/use-responder-url-secret.d.ts +5 -0
- package/dist/hooks/use-responder-url-secret.js +51 -0
- package/dist/hooks/use-responder-url-secret.js.map +1 -0
- package/dist/hooks/use-select-conversation-tab.cjs +1 -1
- package/dist/hooks/use-select-conversation-tab.cjs.map +1 -1
- package/dist/hooks/use-select-conversation-tab.d.ts +2 -0
- package/dist/hooks/use-select-conversation-tab.js +15 -7
- package/dist/hooks/use-select-conversation-tab.js.map +1 -1
- package/dist/hooks/use-tracking.cjs +1 -1
- package/dist/hooks/use-tracking.cjs.map +1 -1
- package/dist/hooks/use-tracking.d.ts +23 -0
- package/dist/hooks/use-tracking.js +16 -0
- package/dist/hooks/use-tracking.js.map +1 -1
- package/dist/hooks/use-websocket.cjs +1 -1
- package/dist/hooks/use-websocket.cjs.map +1 -1
- package/dist/hooks/use-websocket.d.ts +1 -2
- package/dist/hooks/use-websocket.js +58 -51
- package/dist/hooks/use-websocket.js.map +1 -1
- package/dist/i18n/declaration.cjs +1 -1
- package/dist/i18n/declaration.cjs.map +1 -1
- package/dist/i18n/declaration.d.ts +182 -43
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/translation.cjs +3 -3
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +3092 -729
- package/dist/i18n/translation.js.map +1 -1
- package/dist/icons/check-circle.cjs +2 -0
- package/dist/icons/check-circle.cjs.map +1 -0
- package/dist/icons/check-circle.js +20 -0
- package/dist/icons/check-circle.js.map +1 -0
- package/dist/icons/chevron-down.cjs +2 -0
- package/dist/icons/chevron-down.cjs.map +1 -0
- package/dist/icons/chevron-down.js +20 -0
- package/dist/icons/chevron-down.js.map +1 -0
- package/dist/icons/clock.cjs +2 -0
- package/dist/icons/clock.cjs.map +1 -0
- package/dist/icons/clock.js +20 -0
- package/dist/icons/clock.js.map +1 -0
- package/dist/icons/exclamation-circle.cjs +2 -0
- package/dist/icons/exclamation-circle.cjs.map +1 -0
- package/dist/icons/exclamation-circle.js +20 -0
- package/dist/icons/exclamation-circle.js.map +1 -0
- package/dist/icons/kebab-vertical.cjs +2 -0
- package/dist/icons/kebab-vertical.cjs.map +1 -0
- package/dist/icons/kebab-vertical.js +14 -0
- package/dist/icons/kebab-vertical.js.map +1 -0
- package/dist/icons/key.cjs +2 -0
- package/dist/icons/key.cjs.map +1 -0
- package/dist/icons/key.js +21 -0
- package/dist/icons/key.js.map +1 -0
- package/dist/icons/message-square-share.cjs +2 -0
- package/dist/icons/message-square-share.cjs.map +1 -0
- package/dist/icons/message-square-share.js +22 -0
- package/dist/icons/message-square-share.js.map +1 -0
- package/dist/icons/play.cjs +2 -0
- package/dist/icons/play.cjs.map +1 -0
- package/dist/icons/play.js +19 -0
- package/dist/icons/play.js.map +1 -0
- package/dist/icons/power.cjs +2 -0
- package/dist/icons/power.cjs.map +1 -0
- package/dist/icons/power.js +20 -0
- package/dist/icons/power.js.map +1 -0
- package/dist/icons/sparkle.cjs +2 -0
- package/dist/icons/sparkle.cjs.map +1 -0
- package/dist/icons/sparkle.js +20 -0
- package/dist/icons/sparkle.js.map +1 -0
- package/dist/icons/trash.cjs +2 -0
- package/dist/icons/trash.cjs.map +1 -0
- package/dist/icons/trash.js +20 -0
- package/dist/icons/trash.js.map +1 -0
- package/dist/icons/x-circle.cjs +2 -0
- package/dist/icons/x-circle.cjs.map +1 -0
- package/dist/icons/x-circle.js +20 -0
- package/dist/icons/x-circle.js.map +1 -0
- package/dist/locales/ar/openhands.json +183 -44
- package/dist/locales/ca/openhands.json +183 -44
- package/dist/locales/de/openhands.json +183 -44
- package/dist/locales/en/openhands.json +183 -44
- package/dist/locales/es/openhands.json +183 -44
- package/dist/locales/fr/openhands.json +183 -44
- package/dist/locales/it/openhands.json +183 -44
- package/dist/locales/ja/openhands.json +183 -44
- package/dist/locales/ko-KR/openhands.json +183 -44
- package/dist/locales/no/openhands.json +183 -44
- package/dist/locales/pt/openhands.json +183 -44
- package/dist/locales/tr/openhands.json +183 -44
- package/dist/locales/uk/openhands.json +183 -44
- package/dist/locales/zh-CN/openhands.json +183 -44
- package/dist/locales/zh-TW/openhands.json +183 -44
- package/dist/manifests/automation-insights.cjs +2 -0
- package/dist/manifests/automation-insights.cjs.map +1 -0
- package/dist/manifests/automation-insights.d.ts +2 -0
- package/dist/manifests/automation-insights.js +9 -0
- package/dist/manifests/automation-insights.js.map +1 -0
- package/dist/manifests/automation-interface.cjs +1 -1
- package/dist/manifests/automation-interface.cjs.map +1 -1
- package/dist/manifests/automation-interface.d.ts +47 -31
- package/dist/manifests/automation-interface.js +48 -54
- package/dist/manifests/automation-interface.js.map +1 -1
- package/dist/manifests/automation-setup.cjs +1 -1
- package/dist/manifests/automation-setup.cjs.map +1 -1
- package/dist/manifests/automation-setup.d.ts +37 -3
- package/dist/manifests/automation-setup.js +16 -2
- package/dist/manifests/automation-setup.js.map +1 -1
- package/dist/manifests/interface-validation.cjs +1 -1
- package/dist/manifests/interface-validation.cjs.map +1 -1
- package/dist/manifests/interface-validation.js +56 -52
- package/dist/manifests/interface-validation.js.map +1 -1
- package/dist/manifests/manifest-actions.d.ts +5 -0
- package/dist/manifests/manifest-bundle.d.ts +30 -0
- package/dist/manifests/manifest-local-validation.d.ts +10 -1
- package/dist/manifests/manifest-sources.cjs +1 -1
- package/dist/manifests/manifest-sources.cjs.map +1 -1
- package/dist/manifests/manifest-sources.js +3 -3
- package/dist/manifests/manifest-sources.js.map +1 -1
- package/dist/manifests/manifest-template.d.ts +14 -0
- package/dist/manifests/manifest-validation.cjs +1 -1
- package/dist/manifests/manifest-validation.cjs.map +1 -1
- package/dist/manifests/manifest-validation.js +78 -45
- package/dist/manifests/manifest-validation.js.map +1 -1
- package/dist/manifests/types.cjs +1 -1
- package/dist/manifests/types.cjs.map +1 -1
- package/dist/manifests/types.d.ts +64 -3
- package/dist/manifests/types.js +7 -6
- package/dist/manifests/types.js.map +1 -1
- package/dist/node_modules/@heroui/popover/dist/chunk-NW7HJLND.cjs +1 -1
- package/dist/node_modules/@heroui/popover/dist/chunk-NW7HJLND.js +10 -10
- package/dist/node_modules/@heroui/ripple/dist/chunk-UIQI3AYJ.cjs +1 -1
- package/dist/node_modules/@heroui/ripple/dist/chunk-UIQI3AYJ.js +8 -8
- package/dist/node_modules/@heroui/tooltip/dist/chunk-AUA5GDXN.cjs +1 -1
- package/dist/node_modules/@heroui/tooltip/dist/chunk-AUA5GDXN.js +9 -9
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs +4843 -0
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.js +11 -0
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs +13 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js +87 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs +12 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js +98 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +9 -7
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js +32 -13
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs +2 -2
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js +29 -34
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.cjs +3 -3
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.js +2 -2
- package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.cjs +14 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.js +72 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +16 -10
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/index.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/index.js +18 -13
- package/dist/node_modules/@openhands/extensions/automations/index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/interface.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/interface.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/interface.js +6 -2
- package/dist/node_modules/@openhands/extensions/automations/interface.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.js +36 -3
- package/dist/node_modules/@openhands/extensions/integrations/catalog/posthog.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sonarqube.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sonarqube.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sonarqube.js +75 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/sonarqube.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js +68 -66
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.cjs +1002 -47
- package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.js +59 -17
- package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/activity.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/activity.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/activity.js +9 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/activity.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/book-open.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/book-open.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/book-open.js +12 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/book-open.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.js +27 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/download.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/download.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/download.js +19 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/download.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/file-text.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/file-text.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/file-text.js +27 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/file-text.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/git-commit-horizontal.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/git-commit-horizontal.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/git-commit-horizontal.js +27 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/git-commit-horizontal.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/laptop.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/laptop.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/laptop.js +12 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/laptop.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/layout-dashboard.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/layout-dashboard.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/layout-dashboard.js +39 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/layout-dashboard.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/library.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/library.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/library.js +23 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/library.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/package.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/package.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/package.js +23 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/package.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/palette.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/palette.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/palette.js +39 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/palette.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/pen-line.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/pen-line.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/pen-line.js +12 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/pen-line.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/shield-check.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/shield-check.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/shield-check.js +12 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/shield-check.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/sparkles.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/sparkles.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/sparkles.js +25 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/sparkles.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/timer.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/timer.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/timer.js +27 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/timer.js.map +1 -0
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +3 -3
- package/dist/package.js.map +1 -1
- package/dist/routes/app-settings.cjs +1 -1
- package/dist/routes/app-settings.cjs.map +1 -1
- package/dist/routes/app-settings.js +87 -85
- package/dist/routes/app-settings.js.map +1 -1
- package/dist/routes/commits-tab.cjs +1 -1
- package/dist/routes/commits-tab.cjs.map +1 -1
- package/dist/routes/commits-tab.js +27 -21
- package/dist/routes/commits-tab.js.map +1 -1
- package/dist/routes/conversation.cjs +1 -1
- package/dist/routes/conversation.cjs.map +1 -1
- package/dist/routes/conversation.js +56 -55
- package/dist/routes/conversation.js.map +1 -1
- package/dist/routes/files-tab.cjs +1 -1
- package/dist/routes/files-tab.cjs.map +1 -1
- package/dist/routes/files-tab.d.ts +4 -0
- package/dist/routes/files-tab.js +121 -151
- package/dist/routes/files-tab.js.map +1 -1
- package/dist/routes/llm-settings.cjs +1 -1
- package/dist/routes/llm-settings.cjs.map +1 -1
- package/dist/routes/llm-settings.d.ts +9 -1
- package/dist/routes/llm-settings.js +137 -107
- package/dist/routes/llm-settings.js.map +1 -1
- package/dist/routes/mcp.cjs +1 -1
- package/dist/routes/mcp.cjs.map +1 -1
- package/dist/routes/mcp.js +20 -20
- package/dist/routes/secrets-settings.cjs +1 -1
- package/dist/routes/secrets-settings.js +15 -15
- package/dist/services/settings.cjs +1 -1
- package/dist/services/settings.cjs.map +1 -1
- package/dist/services/settings.js +2 -2
- package/dist/services/settings.js.map +1 -1
- package/dist/services/telemetry.cjs +1 -1
- package/dist/services/telemetry.cjs.map +1 -1
- package/dist/services/telemetry.js +47 -51
- package/dist/services/telemetry.js.map +1 -1
- package/dist/stores/conversation-store.cjs +1 -1
- package/dist/stores/conversation-store.cjs.map +1 -1
- package/dist/stores/conversation-store.d.ts +8 -1
- package/dist/stores/conversation-store.js +9 -0
- package/dist/stores/conversation-store.js.map +1 -1
- package/dist/stores/error-message-store.cjs +1 -1
- package/dist/stores/error-message-store.cjs.map +1 -1
- package/dist/stores/error-message-store.d.ts +3 -1
- package/dist/stores/error-message-store.js +5 -3
- package/dist/stores/error-message-store.js.map +1 -1
- package/dist/stores/files-tab-store.cjs +1 -1
- package/dist/stores/files-tab-store.cjs.map +1 -1
- package/dist/stores/files-tab-store.d.ts +13 -0
- package/dist/stores/files-tab-store.js +49 -5
- package/dist/stores/files-tab-store.js.map +1 -1
- package/dist/stores/use-event-store.cjs +1 -1
- package/dist/stores/use-event-store.cjs.map +1 -1
- package/dist/stores/use-event-store.js +11 -11
- package/dist/stores/use-event-store.js.map +1 -1
- package/dist/types/agent-server/core/events/message-event.d.ts +2 -2
- package/dist/types/automation.cjs +2 -0
- package/dist/types/automation.cjs.map +1 -0
- package/dist/types/automation.js +8 -0
- package/dist/types/automation.js.map +1 -0
- package/dist/types/git-sync.d.ts +51 -0
- package/dist/utils/automation-catalog.cjs +1 -1
- package/dist/utils/automation-catalog.cjs.map +1 -1
- package/dist/utils/automation-catalog.d.ts +12 -0
- package/dist/utils/automation-catalog.js +20 -1
- package/dist/utils/automation-catalog.js.map +1 -1
- package/dist/utils/automation-schedule.cjs +2 -0
- package/dist/utils/automation-schedule.cjs.map +1 -0
- package/dist/utils/automation-schedule.js +8 -0
- package/dist/utils/automation-schedule.js.map +1 -0
- package/dist/utils/automation-stack-section.cjs +2 -0
- package/dist/utils/automation-stack-section.cjs.map +1 -0
- package/dist/utils/automation-stack-section.d.ts +2 -0
- package/dist/utils/automation-stack-section.js +6 -0
- package/dist/utils/automation-stack-section.js.map +1 -0
- package/dist/utils/constants.cjs +1 -1
- package/dist/utils/constants.cjs.map +1 -1
- package/dist/utils/constants.js +4 -0
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/conversation-local-storage.cjs +1 -1
- package/dist/utils/conversation-local-storage.cjs.map +1 -1
- package/dist/utils/conversation-local-storage.d.ts +17 -4
- package/dist/utils/conversation-local-storage.js +111 -63
- package/dist/utils/conversation-local-storage.js.map +1 -1
- package/dist/utils/conversation-metrics.cjs +1 -1
- package/dist/utils/conversation-metrics.cjs.map +1 -1
- package/dist/utils/conversation-metrics.d.ts +3 -2
- package/dist/utils/conversation-metrics.js +16 -14
- package/dist/utils/conversation-metrics.js.map +1 -1
- package/dist/utils/conversation-overview-project-scope.cjs +2 -0
- package/dist/utils/conversation-overview-project-scope.cjs.map +1 -0
- package/dist/utils/conversation-overview-project-scope.d.ts +16 -0
- package/dist/utils/conversation-overview-project-scope.js +22 -0
- package/dist/utils/conversation-overview-project-scope.js.map +1 -0
- package/dist/utils/error-handler.cjs +1 -1
- package/dist/utils/error-handler.cjs.map +1 -1
- package/dist/utils/error-handler.d.ts +3 -2
- package/dist/utils/error-handler.js +18 -5
- package/dist/utils/error-handler.js.map +1 -1
- package/dist/utils/extension-module-card-classes.cjs +1 -1
- package/dist/utils/extension-module-card-classes.cjs.map +1 -1
- package/dist/utils/extension-module-card-classes.d.ts +1 -1
- package/dist/utils/extension-module-card-classes.js +2 -2
- package/dist/utils/extension-module-card-classes.js.map +1 -1
- package/dist/utils/format-model-name.cjs +1 -1
- package/dist/utils/format-model-name.cjs.map +1 -1
- package/dist/utils/format-model-name.d.ts +1 -0
- package/dist/utils/format-model-name.js +1 -0
- package/dist/utils/format-model-name.js.map +1 -1
- package/dist/utils/format-relative-time.cjs +2 -0
- package/dist/utils/format-relative-time.cjs.map +1 -0
- package/dist/utils/format-relative-time.js +17 -0
- package/dist/utils/format-relative-time.js.map +1 -0
- package/dist/utils/git-diff-stats.cjs +5 -0
- package/dist/utils/git-diff-stats.cjs.map +1 -0
- package/dist/utils/git-diff-stats.d.ts +9 -0
- package/dist/utils/git-diff-stats.js +53 -0
- package/dist/utils/git-diff-stats.js.map +1 -0
- package/dist/utils/handle-event-for-ui.cjs +1 -1
- package/dist/utils/handle-event-for-ui.cjs.map +1 -1
- package/dist/utils/handle-event-for-ui.js +13 -11
- package/dist/utils/handle-event-for-ui.js.map +1 -1
- package/dist/utils/mcp-credential-validation.cjs +1 -1
- package/dist/utils/mcp-credential-validation.js +3 -3
- package/dist/utils/mcp-marketplace-utils.cjs +1 -1
- package/dist/utils/mcp-marketplace-utils.cjs.map +1 -1
- package/dist/utils/mcp-marketplace-utils.js +22 -9
- package/dist/utils/mcp-marketplace-utils.js.map +1 -1
- package/dist/utils/parse-git-remote-url.cjs +1 -1
- package/dist/utils/parse-git-remote-url.cjs.map +1 -1
- package/dist/utils/parse-git-remote-url.js +6 -7
- package/dist/utils/parse-git-remote-url.js.map +1 -1
- package/dist/utils/recommended-automation-rail.cjs +2 -0
- package/dist/utils/recommended-automation-rail.cjs.map +1 -0
- package/dist/utils/recommended-automation-rail.d.ts +22 -0
- package/dist/utils/recommended-automation-rail.js +44 -0
- package/dist/utils/recommended-automation-rail.js.map +1 -0
- package/dist/utils/responder-deployment.cjs +2 -0
- package/dist/utils/responder-deployment.cjs.map +1 -0
- package/dist/utils/responder-deployment.js +42 -0
- package/dist/utils/responder-deployment.js.map +1 -0
- package/dist/utils/scroll-fade-state.cjs +2 -0
- package/dist/utils/scroll-fade-state.cjs.map +1 -0
- package/dist/utils/scroll-fade-state.d.ts +6 -0
- package/dist/utils/scroll-fade-state.js +13 -0
- package/dist/utils/scroll-fade-state.js.map +1 -0
- package/dist/utils/skill-category.cjs +2 -0
- package/dist/utils/skill-category.cjs.map +1 -0
- package/dist/utils/skill-category.js +51 -0
- package/dist/utils/skill-category.js.map +1 -0
- package/dist/utils/skill-scope.cjs +1 -1
- package/dist/utils/skill-scope.cjs.map +1 -1
- package/dist/utils/skill-scope.js +1 -1
- package/dist/utils/skill-scope.js.map +1 -1
- package/dist/utils/streaming-delta-batcher.cjs +2 -0
- package/dist/utils/streaming-delta-batcher.cjs.map +1 -0
- package/dist/utils/streaming-delta-batcher.d.ts +21 -0
- package/dist/utils/streaming-delta-batcher.js +31 -0
- package/dist/utils/streaming-delta-batcher.js.map +1 -0
- package/dist/utils/tar-gzip.d.ts +26 -0
- package/dist/utils/transcript-export/load-complete-events.cjs +1 -1
- package/dist/utils/transcript-export/load-complete-events.cjs.map +1 -1
- package/dist/utils/transcript-export/load-complete-events.js +24 -16
- package/dist/utils/transcript-export/load-complete-events.js.map +1 -1
- package/dist/utils/utils.cjs +1 -1
- package/dist/utils/utils.cjs.map +1 -1
- package/dist/utils/utils.d.ts +1 -41
- package/dist/utils/utils.js +27 -6
- package/dist/utils/utils.js.map +1 -1
- package/dist/utils/websocket-handshake.cjs +2 -0
- package/dist/utils/websocket-handshake.cjs.map +1 -0
- package/dist/utils/websocket-handshake.d.ts +11 -0
- package/dist/utils/websocket-handshake.js +12 -0
- package/dist/utils/websocket-handshake.js.map +1 -0
- package/package.json +3 -3
- package/scripts/check-translation-completeness.cjs +7 -0
- package/scripts/dev-static.mjs +49 -43
- package/scripts/dev-with-automation.mjs +111 -14
- package/scripts/seed-automation-ux-data.mjs +810 -0
- package/build/assets/acp-providers-D1PORKc0.js +0 -1
- package/build/assets/active-backend-context-IqOjobNK.js +0 -2
- package/build/assets/agent-context-settings-DMrObcIS.js +0 -1
- package/build/assets/agent-profiles-settings-DororXN5.js +0 -1
- package/build/assets/agent-server-conversation-service.api-DWBe0rbX.js +0 -86
- package/build/assets/agent-settings-BJVk92PU.js +0 -2
- package/build/assets/agent-settings-COfJsQ1d.js +0 -1
- package/build/assets/alert-banner-CzZsm7ms.js +0 -1
- package/build/assets/api-key-entry-screen-D8Fade_-.js +0 -1
- package/build/assets/app-settings-CpyGB3AT.js +0 -1
- package/build/assets/automation-detail-B-jQ39Mm.js +0 -3
- package/build/assets/automation-export-B1dywoqk.js +0 -2
- package/build/assets/automation-setup-route-C-bWUZBi.js +0 -1
- package/build/assets/automation-templates-DgpCGOJV.js +0 -1
- package/build/assets/automations-list-DnMxlxsL.js +0 -1
- package/build/assets/back-nav-button-HHEneWMw.js +0 -1
- package/build/assets/backend-form-modal-DiVrD4Cm.js +0 -1
- package/build/assets/backend-synced-settings-badge-7MIjpr8M.js +0 -1
- package/build/assets/badge-CpYmcVZV.js +0 -1
- package/build/assets/base-modal-Fnh6Uln9.js +0 -1
- package/build/assets/bot-BQZx8e2i.js +0 -1
- package/build/assets/brand-button-swT1RyO0.js +0 -1
- package/build/assets/browser-B9AbV6kG.js +0 -7
- package/build/assets/browser-tab-zAY12m_i.js +0 -1
- package/build/assets/chat-send-button-DsJtivmL.js +0 -1
- package/build/assets/check-WAFXrrs_.js +0 -1
- package/build/assets/chevron-down-CifNWzme.js +0 -1
- package/build/assets/circle-check-CtnimJa8.js +0 -1
- package/build/assets/circle-plus-check-toggle-Cuzx55bo.js +0 -1
- package/build/assets/cloud-funnel-analytics-86CwNdSh.js +0 -1
- package/build/assets/combobox-caret-D0fRotFi.js +0 -1
- package/build/assets/command-menu-BXy03FBl.js +0 -1
- package/build/assets/condenser-settings-BmZa0ui_.js +0 -1
- package/build/assets/confirmation-modal-BgoN6lbN.js +0 -1
- package/build/assets/context-menu-list-item-Bq02tc-P.js +0 -1
- package/build/assets/conversation-BPo8SvLN.js +0 -1
- package/build/assets/conversation-CPCVsCUY.js +0 -90
- package/build/assets/conversation-panel-BPo8SvLN.js +0 -1
- package/build/assets/conversation-state-store-C5YpjMNy.js +0 -1
- package/build/assets/conversation-store-Blc5xysY.js +0 -6
- package/build/assets/conversation-tab-empty-state-CMqo_0Bd.js +0 -1
- package/build/assets/copy-to-clipboard-button-Cg1pF0xn.js +0 -1
- package/build/assets/device-verify-BfQLgNyq.js +0 -1
- package/build/assets/dropdown-classes-BIqQr5mx.js +0 -1
- package/build/assets/entry.client-CxFjRYqH.js +0 -2
- package/build/assets/enum-filter-dropdown-C_yV4_bo.js +0 -1
- package/build/assets/environment-switch-overlay-Bi4qbh2g.js +0 -1
- package/build/assets/extension-module-card-classes-Bo43vY5V.js +0 -1
- package/build/assets/extensions-hub-BqUINAhp.js +0 -1
- package/build/assets/extensions-navigation-lraj88Wk.js +0 -1
- package/build/assets/external-link-CgtpA_a1.js +0 -1
- package/build/assets/file-text-DEK4LSVw.js +0 -1
- package/build/assets/files-tab-DV0L-lFE.js +0 -1
- package/build/assets/form-control-classes-7yFSQJq_.js +0 -1
- package/build/assets/format-model-name-BN_rx1Y3.js +0 -1
- package/build/assets/format-relative-time-DSErAuVr.js +0 -1
- package/build/assets/git-provider-icon-BvlLAche.js +0 -1
- package/build/assets/git-repo-dropdown-ByMzpNko.js +0 -1
- package/build/assets/git-repo-dropdown-C6R7hgM8.js +0 -1
- package/build/assets/highlighted-source-view-C_sfncLZ.js +0 -1
- package/build/assets/home-BOrlwLqG.js +0 -1
- package/build/assets/home-BvMNC6E-.js +0 -1
- package/build/assets/home-store-CxqsY9Fi.js +0 -1
- package/build/assets/index-home-BvMNC6E-.js +0 -1
- package/build/assets/info-BRVcJAUg.js +0 -1
- package/build/assets/install-server-modal-Bl4G1zF4.js +0 -1
- package/build/assets/kebab-menu-item-content-BGoGFEAg.js +0 -1
- package/build/assets/launch-CkqiSCqi.js +0 -1
- package/build/assets/list-todo-DNWlzfaM.js +0 -1
- package/build/assets/llm-not-configured-banner-DLw_tu-G.js +0 -27
- package/build/assets/llm-settings-B-pkVCrt.js +0 -1
- package/build/assets/llm-settings-DSC0-IQ7.js +0 -1
- package/build/assets/llm-subscription-service-BAdOl5Xx.js +0 -1
- package/build/assets/loader-circle-B47W9XqT.js +0 -1
- package/build/assets/loading-spinner-xhnrGP4Y.js +0 -1
- package/build/assets/manage-backends-modal-DhGk5mJt.js +0 -1
- package/build/assets/manifest-653b89aa.js +0 -1
- package/build/assets/manifest-subpage-layout-CKWvL2ig.js +0 -1
- package/build/assets/map-provider-Mx8mZuE-.js +0 -1
- package/build/assets/markdown-renderer-DUmk7pFc.js +0 -8
- package/build/assets/mcp-DCkvl6K0.js +0 -9
- package/build/assets/mcp-marketplace-utils-DEbMXlQr.js +0 -1
- package/build/assets/messages-DSXvyc21.js +0 -40
- package/build/assets/modal-body-gIe21fDv.js +0 -1
- package/build/assets/modal-classes-D66dlgZ7.js +0 -1
- package/build/assets/modal-close-button-B6iOGYpI.js +0 -1
- package/build/assets/mouse-pointer-click-BYX1Pw5W.js +0 -1
- package/build/assets/npm-DLckoeJc.js +0 -1
- package/build/assets/onboarding-D7WDG66N.js +0 -1
- package/build/assets/onboarding-modal-C_xVrFNv.js +0 -1
- package/build/assets/organization-service.api-D-s9z18a.js +0 -1
- package/build/assets/pencil-BGOCPRyu.js +0 -1
- package/build/assets/planner-tab-AKaXIIfg.js +0 -1
- package/build/assets/plugins-management-service-wtmY4QQw.js +0 -1
- package/build/assets/plus-zNEL8rcX.js +0 -1
- package/build/assets/profiles-service.api-DCMYxHMi.js +0 -1
- package/build/assets/providers-BjrtjX4L.js +0 -1
- package/build/assets/proxy-9Z_WZggZ.js +0 -1
- package/build/assets/puzzle-BWLmN8z4.js +0 -1
- package/build/assets/recommended-automations-launcher-CFlzhu1o.js +0 -1
- package/build/assets/refresh-cw-CXtFWpwv.js +0 -1
- package/build/assets/root-CanxKlNV.css +0 -1
- package/build/assets/root-DkfG_UWR.js +0 -2
- package/build/assets/root-layout-D75LHYhh.js +0 -2
- package/build/assets/schema-field-OnM5Uob_.js +0 -1
- package/build/assets/sdk-section-page-m5WQm2sy.js +0 -1
- package/build/assets/search-CycosyjN.js +0 -1
- package/build/assets/secrets-service-B26R61C1.js +0 -1
- package/build/assets/secrets-settings-CbLYCKOX.js +0 -1
- package/build/assets/segmented-toggle-DCspm2U5.js +0 -1
- package/build/assets/settings-BJQI_iBM.js +0 -1
- package/build/assets/settings-CWFxymAf.js +0 -1
- package/build/assets/settings-dropdown-input-BI8V_Nov.js +0 -1
- package/build/assets/settings-index-BiTqJoH7.js +0 -1
- package/build/assets/settings-input-Cz62hWVW.js +0 -1
- package/build/assets/settings-list-classes-z_3FW5H3.js +0 -1
- package/build/assets/settings-modal-BIrIVn97.js +0 -1
- package/build/assets/settings-service.api--rJmnuLa.js +0 -1
- package/build/assets/settings-switch-BRsSI8Vs.js +0 -1
- package/build/assets/settings-utils-Ba7vel6T.js +0 -1
- package/build/assets/shared-conversation-CQK_PqHx.js +0 -1
- package/build/assets/shield-check-T3JsDJiM.js +0 -1
- package/build/assets/sidebar-layout-Bhi3hVcu.js +0 -1
- package/build/assets/sidebar-mobile-menu-toggle-YWJNRN4p.js +0 -1
- package/build/assets/sidebar-nav-link-BSUlY5Ml.js +0 -1
- package/build/assets/sidebar-store-Cl1cUv_F.js +0 -1
- package/build/assets/skill-card-pill-row-BXz8L8Rn.js +0 -1
- package/build/assets/skill-icon-badge-QgfKv31M.js +0 -1
- package/build/assets/skill-scope-Dc3JPW-8.js +0 -1
- package/build/assets/skills-plugins-CpTV27n3.js +0 -1
- package/build/assets/skills-settings-CSW__IW4.js +0 -2
- package/build/assets/sparkles-TJ0mdECe.js +0 -1
- package/build/assets/styled-tooltip-BUMSbgrF.js +0 -1
- package/build/assets/task-list-tab-mAHMOkUz.js +0 -1
- package/build/assets/terminal-BzxBaHx2.js +0 -3
- package/build/assets/toggle-switch-O5v1FgxW.js +0 -1
- package/build/assets/trash-2-C0xNVp9c.js +0 -1
- package/build/assets/typography-NOKSk9_R.js +0 -1
- package/build/assets/usage-tab-tEmVN0KD.js +0 -1
- package/build/assets/use-acp-credential-form-BPNi0Zbm.js +0 -1
- package/build/assets/use-activate-agent-profile-D9YRQPTF.js +0 -1
- package/build/assets/use-agent-profiles-Cb2zUW3l.js +0 -1
- package/build/assets/use-can-manage-org-profiles-Dxzq2AEd.js +0 -1
- package/build/assets/use-cloud-current-user-id-Co2eJk2A.js +0 -1
- package/build/assets/use-config-DKAMiI5R.js +0 -1
- package/build/assets/use-create-conversation-CoHTiCbI.js +0 -1
- package/build/assets/use-create-secret-2zBlCDsF.js +0 -1
- package/build/assets/use-is-authed-C52-ivnB.js +0 -1
- package/build/assets/use-is-creating-conversation-DdaAE6jV.js +0 -1
- package/build/assets/use-launch-skill-in-chat-COnDpxCQ.js +0 -1
- package/build/assets/use-llm-profiles-C_BHue65.js +0 -1
- package/build/assets/use-manifest-capabilities-DPrQsaPP.js +0 -1
- package/build/assets/use-onboarding-completion-CCE8OQgV.js +0 -1
- package/build/assets/use-plugins-marketplace-CEiak69h.js +0 -1
- package/build/assets/use-save-agent-profile-DK9idD6a.js +0 -1
- package/build/assets/use-save-settings-DNmnbG6f.js +0 -1
- package/build/assets/use-settings-nav-items-BlFL7YhM.js +0 -16
- package/build/assets/use-settings-wCwPaSIv.js +0 -1
- package/build/assets/use-tracking-CVwPmhlX.js +0 -3
- package/build/assets/use-user-conversation-DVtfg0B_.js +0 -1
- package/build/assets/useInfiniteQuery-p1xq35r2.js +0 -1
- package/build/assets/useMutation-BFDQmgk9.js +0 -1
- package/build/assets/useQueries-DF1NAAeC.js +0 -1
- package/build/assets/useQuery-DRv--6bK.js +0 -1
- package/build/assets/utils-zxEjKE70.js +0 -1
- package/build/assets/vendor~browser-B-fae1JU.js +0 -47
- package/build/assets/vendor~entry.client-CgNUwtQL.js +0 -1
- package/build/assets/vendor~entry.client-zSIea5EO.js +0 -9
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-B8i84bh4.js +0 -186
- package/build/assets/vendor~files-tab-D9wR9yM2.js +0 -11
- package/build/assets/vendor~index-home~home~conversation-panel~conversation-Ipoe6hvY.js +0 -13
- package/build/assets/vendor~root-layout-C-IgVx6e.js +0 -1
- package/build/assets/vendor~root-layout~conversation-panel~conversation-Dhd_I4H4.js +0 -1
- package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-Cc0f9kPP.js +0 -1
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-d7svw-BB.js +0 -1
- package/build/assets/vendor~root-layout~index-home~home~mcp~automations-list~automation-templates~automation-set~bxsimjx0-D7IDevqN.js +0 -1
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-D5DWZVc7.js +0 -1
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-4WsUP-tz.js +0 -48
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~9pstowjp-BOVIFA_g.js +0 -73
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~ht43enc2-C0JXQb_q.js +0 -7465
- package/build/assets/verification-settings-B8UMQ7MG.js +0 -1
- package/build/assets/wrench-DIka3hCq.js +0 -1
- package/build/assets/x-BWKA2Ver.js +0 -1
- package/build/assets/zap-DHddTPc0.js +0 -1
- package/dist/api/cloud/suggestions-service.api.d.ts +0 -8
- package/dist/api/suggestions-service/suggestions-service.api.d.ts +0 -11
- package/dist/components/conversation-events/chat/event-message-components/observation-pair-event-message.d.ts +0 -7
- package/dist/components/conversation-events/index.d.ts +0 -1
- package/dist/components/features/automations/metadata-chip.d.ts +0 -6
- package/dist/components/features/chat/task-tracking/status-badge.d.ts +0 -5
- package/dist/components/features/chat/task-tracking/status-icon.d.ts +0 -5
- package/dist/components/features/chat/task-tracking/task-list-section.d.ts +0 -10
- package/dist/components/features/controls/tools.d.ts +0 -2
- package/dist/components/features/conversation-panel/new-conversation-button.d.ts +0 -23
- package/dist/components/features/diff-viewer/empty-changes-message.cjs +0 -2
- package/dist/components/features/diff-viewer/empty-changes-message.cjs.map +0 -1
- package/dist/components/features/diff-viewer/empty-changes-message.js +0 -17
- package/dist/components/features/diff-viewer/empty-changes-message.js.map +0 -1
- package/dist/components/features/home/home-header/guide-message.d.ts +0 -1
- package/dist/components/features/home/home-header/home-header.d.ts +0 -1
- package/dist/components/features/home/new-conversation/create-conversation-button.d.ts +0 -1
- package/dist/components/features/home/new-conversation/new-conversation.d.ts +0 -1
- package/dist/components/features/home/new-conversation.d.ts +0 -1
- package/dist/components/features/home/tasks/task-card.d.ts +0 -6
- package/dist/components/features/home/tasks/task-group.d.ts +0 -7
- package/dist/components/features/home/tasks/task-issue-number.d.ts +0 -6
- package/dist/components/features/home/tasks/task-item-title.d.ts +0 -1
- package/dist/components/features/home/tasks/task-suggestions-skeleton.d.ts +0 -1
- package/dist/components/features/home/tasks/task-suggestions.d.ts +0 -6
- package/dist/components/features/settings/agent-server-onboarding.d.ts +0 -10
- package/dist/components/features/settings/mcp-settings/mcp-server-list-item.d.ts +0 -6
- package/dist/components/features/settings/mcp-settings/mcp-server-list.d.ts +0 -8
- package/dist/components/features/tips/random-tip.cjs +0 -2
- package/dist/components/features/tips/random-tip.cjs.map +0 -1
- package/dist/components/features/tips/random-tip.js +0 -41
- package/dist/components/features/tips/random-tip.js.map +0 -1
- package/dist/hooks/query/use-has-git-commits.cjs +0 -2
- package/dist/hooks/query/use-has-git-commits.cjs.map +0 -1
- package/dist/hooks/query/use-has-git-commits.d.ts +0 -25
- package/dist/hooks/query/use-has-git-commits.js +0 -31
- package/dist/hooks/query/use-has-git-commits.js.map +0 -1
- package/dist/hooks/query/use-suggested-tasks.d.ts +0 -1
- package/dist/hooks/use-has-attached-source.cjs +0 -2
- package/dist/hooks/use-has-attached-source.cjs.map +0 -1
- package/dist/hooks/use-has-attached-source.d.ts +0 -18
- package/dist/hooks/use-has-attached-source.js +0 -14
- package/dist/hooks/use-has-attached-source.js.map +0 -1
- package/dist/hooks/use-should-show-user-features.d.ts +0 -1
- package/dist/icons/chveron-up.cjs +0 -2
- package/dist/icons/chveron-up.cjs.map +0 -1
- package/dist/icons/chveron-up.js +0 -21
- package/dist/icons/chveron-up.js.map +0 -1
- package/dist/routes/changes-tab.cjs +0 -2
- package/dist/routes/changes-tab.cjs.map +0 -1
- package/dist/routes/changes-tab.d.ts +0 -3
- package/dist/routes/changes-tab.js +0 -64
- package/dist/routes/changes-tab.js.map +0 -1
- package/dist/ui/card-title.d.ts +0 -16
- package/dist/ui/card.d.ts +0 -14
- package/dist/utils/file-priority.cjs +0 -2
- package/dist/utils/file-priority.cjs.map +0 -1
- package/dist/utils/file-priority.d.ts +0 -27
- package/dist/utils/file-priority.js +0 -61
- package/dist/utils/file-priority.js.map +0 -1
- package/dist/utils/group-suggested-tasks.d.ts +0 -7
- package/dist/utils/table-row-classes.d.ts +0 -9
- package/dist/utils/tips.cjs +0 -2
- package/dist/utils/tips.cjs.map +0 -1
- package/dist/utils/tips.js +0 -45
- package/dist/utils/tips.js.map +0 -1
- /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~dh9v73sa-rfV8mQ9m.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew3u153i-rfV8mQ9m.js} +0 -0
- /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~lq5hicxx-cHFhpUBq.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ox0jfsa0-cHFhpUBq.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.cjs","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.cjs","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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"}
|
|
@@ -3,43 +3,43 @@ 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", m = "phc_BgzfxKdgsYMLFTmJqt424ZoyVHvKFfrwttLimzdYTKFK", h = "https://z.openhands.dev", g = "https://us.posthog.com", _ = null, v = null, y, b = {}, x = !1, S, C = 0, w = -1, T = Object.freeze({
|
|
7
7
|
client_source: n,
|
|
8
8
|
client_version: r,
|
|
9
9
|
package_name: t.name,
|
|
10
10
|
package_version: t.version
|
|
11
|
-
}),
|
|
12
|
-
function D(e) {
|
|
13
|
-
T = i(e);
|
|
14
|
-
}
|
|
11
|
+
}), E = i({}), D = a();
|
|
15
12
|
function O(e) {
|
|
16
|
-
E =
|
|
13
|
+
E = i(e);
|
|
17
14
|
}
|
|
18
15
|
function k(e) {
|
|
16
|
+
D = a(e);
|
|
17
|
+
}
|
|
18
|
+
function ee(e) {
|
|
19
19
|
return e ? {
|
|
20
20
|
...e,
|
|
21
21
|
properties: {
|
|
22
|
-
...T,
|
|
23
22
|
...E,
|
|
23
|
+
...D,
|
|
24
24
|
...e.properties,
|
|
25
|
-
...
|
|
25
|
+
...T
|
|
26
26
|
}
|
|
27
27
|
} : null;
|
|
28
28
|
}
|
|
29
29
|
function A(e) {
|
|
30
|
-
|
|
30
|
+
x || V() !== "granted" ? e.opt_out_capturing() : e.opt_in_capturing();
|
|
31
31
|
}
|
|
32
32
|
function j(e, t = !1) {
|
|
33
|
-
e.reset(t),
|
|
33
|
+
e.reset(t), w = -1, A(e);
|
|
34
34
|
}
|
|
35
35
|
function M(e) {
|
|
36
|
-
if (
|
|
37
|
-
let t =
|
|
38
|
-
if (n != null && n !== t && j(e),
|
|
39
|
-
|
|
36
|
+
if (S === void 0 || !Z()) return;
|
|
37
|
+
let t = S?.distinctId, n = e.get_property("$user_id");
|
|
38
|
+
if (n != null && n !== t && j(e), S === null) {
|
|
39
|
+
w = C;
|
|
40
40
|
return;
|
|
41
41
|
}
|
|
42
|
-
(e.get_property("$user_id") !==
|
|
42
|
+
(e.get_property("$user_id") !== S.distinctId || w !== C) && (e.identify(S.distinctId, S.properties), w = C);
|
|
43
43
|
}
|
|
44
44
|
function N(e, t) {
|
|
45
45
|
let n = Object.keys(e);
|
|
@@ -47,25 +47,25 @@ function N(e, t) {
|
|
|
47
47
|
}
|
|
48
48
|
function P(e) {
|
|
49
49
|
if (e === !1) {
|
|
50
|
-
if (
|
|
51
|
-
|
|
50
|
+
if (x) return;
|
|
51
|
+
x = !0, _?.opt_out_capturing(), W();
|
|
52
52
|
return;
|
|
53
53
|
}
|
|
54
|
-
let t =
|
|
55
|
-
if (
|
|
54
|
+
let t = x;
|
|
55
|
+
if (x = !1, !_ && !v) {
|
|
56
56
|
let t = Object.fromEntries(Object.entries(e).filter(([, e]) => e !== void 0));
|
|
57
|
-
|
|
58
|
-
...
|
|
57
|
+
b = {
|
|
58
|
+
...b,
|
|
59
59
|
...t
|
|
60
60
|
};
|
|
61
61
|
}
|
|
62
|
-
t && (
|
|
62
|
+
t && (_ && (A(_), M(_)), W());
|
|
63
63
|
}
|
|
64
64
|
function F() {
|
|
65
|
-
return
|
|
66
|
-
apiKey:
|
|
67
|
-
apiHost:
|
|
68
|
-
uiHost:
|
|
65
|
+
return x ? null : {
|
|
66
|
+
apiKey: b.apiKey || m,
|
|
67
|
+
apiHost: b.apiHost || h,
|
|
68
|
+
uiHost: b.uiHost || g
|
|
69
69
|
};
|
|
70
70
|
}
|
|
71
71
|
function I() {
|
|
@@ -73,7 +73,7 @@ function I() {
|
|
|
73
73
|
}
|
|
74
74
|
async function L() {
|
|
75
75
|
if (!I()) return null;
|
|
76
|
-
if (
|
|
76
|
+
if (_) return _;
|
|
77
77
|
try {
|
|
78
78
|
let { default: e } = await import("../node_modules/posthog-js/dist/module.js");
|
|
79
79
|
return e;
|
|
@@ -82,15 +82,15 @@ async function L() {
|
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
84
|
function R() {
|
|
85
|
-
return !!(
|
|
85
|
+
return !!(x || typeof process < "u" && process.env?.DO_NOT_TRACK === "1" || typeof navigator < "u" && (navigator.doNotTrack === "1" || typeof window < "u" && window.doNotTrack === "1"));
|
|
86
86
|
}
|
|
87
87
|
function z(e) {
|
|
88
|
-
|
|
88
|
+
_ || (y = e);
|
|
89
89
|
}
|
|
90
90
|
async function B(e = !1) {
|
|
91
|
-
if (g) return g;
|
|
92
91
|
if (_) return _;
|
|
93
|
-
|
|
92
|
+
if (v) return v;
|
|
93
|
+
v = (async () => {
|
|
94
94
|
let t = F();
|
|
95
95
|
if (!t) return null;
|
|
96
96
|
let n = await L();
|
|
@@ -106,15 +106,15 @@ async function B(e = !1) {
|
|
|
106
106
|
capture_pageview: p,
|
|
107
107
|
autocapture: !0,
|
|
108
108
|
disable_session_recording: !0,
|
|
109
|
-
bootstrap:
|
|
110
|
-
before_send:
|
|
109
|
+
bootstrap: y,
|
|
110
|
+
before_send: ee
|
|
111
111
|
}, f);
|
|
112
|
-
return r ? (
|
|
112
|
+
return r ? (_ = r, y = void 0, x ? _.opt_out_capturing() : V() === "granted" ? (_.opt_in_capturing(), M(_)) : e || _.opt_out_capturing(), _) : null;
|
|
113
113
|
})();
|
|
114
114
|
try {
|
|
115
|
-
return await
|
|
115
|
+
return await v;
|
|
116
116
|
} finally {
|
|
117
|
-
|
|
117
|
+
_ || (v = null);
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
120
|
function V() {
|
|
@@ -172,8 +172,8 @@ function J(e) {
|
|
|
172
172
|
async function Y(e, { syncToCloud: t = !0 } = {}) {
|
|
173
173
|
if (I()) try {
|
|
174
174
|
let t = V() === e;
|
|
175
|
-
if (localStorage.setItem(o, e),
|
|
176
|
-
let n =
|
|
175
|
+
if (localStorage.setItem(o, e), x || t) return;
|
|
176
|
+
let n = _ ?? await B();
|
|
177
177
|
if (!n) return;
|
|
178
178
|
e === "granted" ? (n.opt_in_capturing(), M(n)) : (K(n.get_distinct_id?.() ?? null), n.get_property?.("$user_id") == null ? n.opt_out_capturing() : j(n));
|
|
179
179
|
} catch {} finally {
|
|
@@ -185,8 +185,8 @@ async function X(e, t = {}) {
|
|
|
185
185
|
distinctId: e,
|
|
186
186
|
properties: t
|
|
187
187
|
};
|
|
188
|
-
if (
|
|
189
|
-
let r =
|
|
188
|
+
if (S === n || S != null && n !== null && S.distinctId === n.distinctId && N(S.properties, t) || (S = n, C += 1, w = -1, !Z())) return;
|
|
189
|
+
let r = _ ?? await B();
|
|
190
190
|
r && Z() && M(r);
|
|
191
191
|
}
|
|
192
192
|
function Z() {
|
|
@@ -248,31 +248,27 @@ async function se() {
|
|
|
248
248
|
let e = H();
|
|
249
249
|
if (e) return e;
|
|
250
250
|
}
|
|
251
|
-
return
|
|
251
|
+
return x || R() ? null : (await B())?.get_distinct_id?.() ?? null;
|
|
252
252
|
}
|
|
253
253
|
async function ce(e, t = {}) {
|
|
254
254
|
let n = await $();
|
|
255
255
|
n && n.capture(e, t);
|
|
256
256
|
}
|
|
257
|
-
async function le(
|
|
258
|
-
let n = await $();
|
|
259
|
-
n && n.captureException(e, t);
|
|
260
|
-
}
|
|
261
|
-
async function ue() {
|
|
257
|
+
async function le() {
|
|
262
258
|
if (I()) {
|
|
263
259
|
try {
|
|
264
|
-
K(
|
|
260
|
+
K(_?.get_distinct_id?.() ?? null), localStorage.removeItem(o), localStorage.removeItem(u);
|
|
265
261
|
} catch {}
|
|
266
262
|
J();
|
|
267
263
|
try {
|
|
268
264
|
sessionStorage.removeItem(d);
|
|
269
265
|
} catch {}
|
|
270
|
-
|
|
266
|
+
E = i({}), D = a(), S = null, C += 1, w = -1;
|
|
271
267
|
try {
|
|
272
|
-
|
|
268
|
+
_ && j(_, !0);
|
|
273
269
|
} catch {
|
|
274
270
|
try {
|
|
275
|
-
|
|
271
|
+
_?.opt_out_capturing();
|
|
276
272
|
} catch {}
|
|
277
273
|
} finally {
|
|
278
274
|
W();
|
|
@@ -280,6 +276,6 @@ async function ue() {
|
|
|
280
276
|
}
|
|
281
277
|
}
|
|
282
278
|
//#endregion
|
|
283
|
-
export { q as clearPendingLocalTelemetryRevocation,
|
|
279
|
+
export { q as clearPendingLocalTelemetryRevocation, le as clearTelemetryData, z as configurePostHogBootstrap, P as configureTelemetry, V as getTelemetryConsent, oe as getTelemetryDistinctId, se as getTelemetryDistinctIdForConsentSync, B as initializePostHogClient, Z as isTelemetryEnabled, O as setTelemetryBackendContext, k as setTelemetryCloudContext, Y as setTelemetryConsent, X as setTelemetryIdentity, U as subscribeTelemetryConsent, ce as trackEvent, ne as trackInstall, ae as trackSessionStart };
|
|
284
280
|
|
|
285
281
|
//# 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 */\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,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"),n=require("../utils/conversation-local-storage.cjs");var r=()=>{if(typeof window>`u`)return null;let e=window.location.pathname.match(/\/conversations\/([^/]+)/);return e?e[1]:null},i=()=>{if(typeof window>`u`)return`code`;let e=r();return e?n.getConversationState(e).conversationMode:`code`},a=e.create()(t.devtools(e=>({isRightPanelShown:!1,selectedTab:`files`,images:[],files:[],imagesMarkedUploadAsFile:[],pastedImageNames:[],loadingFiles:[],loadingImages:[],messageToSend:null,messageRestoreIfEmpty:null,shouldShownAgentLoading:!1,submittedMessage:null,shouldHideSuggestions:!1,hasRightPanelToggled:!1,planContent:null,conversationMode:i(),subConversationTaskId:null,setIsRightPanelShown:t=>e({isRightPanelShown:t},!1,`setIsRightPanelShown`),setSelectedTab:t=>e({selectedTab:t},!1,`setSelectedTab`),setShouldShownAgentLoading:t=>e({shouldShownAgentLoading:t},!1,`setShouldShownAgentLoading`),setShouldHideSuggestions:t=>e({shouldHideSuggestions:t},!1,`setShouldHideSuggestions`),addImages:t=>e(e=>({images:[...e.images,...t]}),!1,`addImages`),addFiles:t=>e(e=>({files:[...e.files,...t]}),!1,`addFiles`),toggleImageUploadAsFile:t=>e(e=>{let n=new Set(e.imagesMarkedUploadAsFile);return n.has(t)?n.delete(t):n.add(t),{imagesMarkedUploadAsFile:[...n]}},!1,`toggleImageUploadAsFile`),markImagesAsPasted:t=>e(e=>({pastedImageNames:[...new Set([...e.pastedImageNames,...t])]}),!1,`markImagesAsPasted`),removeImage:t=>e(e=>{let n=e.images[t],r=[...e.images];return r.splice(t,1),{images:r,imagesMarkedUploadAsFile:n?e.imagesMarkedUploadAsFile.filter(e=>e!==n.name):e.imagesMarkedUploadAsFile,pastedImageNames:n?e.pastedImageNames.filter(e=>e!==n.name):e.pastedImageNames}},!1,`removeImage`),removeFile:t=>e(e=>{let n=[...e.files];return n.splice(t,1),{files:n}},!1,`removeFile`),clearImages:()=>e({images:[]},!1,`clearImages`),clearFiles:()=>e({files:[]},!1,`clearFiles`),clearAllFiles:()=>e({images:[],files:[],imagesMarkedUploadAsFile:[],pastedImageNames:[],loadingFiles:[],loadingImages:[]},!1,`clearAllFiles`),addFileLoading:t=>e(e=>e.loadingFiles.includes(t)?e:{loadingFiles:[...e.loadingFiles,t]},!1,`addFileLoading`),removeFileLoading:t=>e(e=>({loadingFiles:e.loadingFiles.filter(e=>e!==t)}),!1,`removeFileLoading`),addImageLoading:t=>e(e=>e.loadingImages.includes(t)?e:{loadingImages:[...e.loadingImages,t]},!1,`addImageLoading`),removeImageLoading:t=>e(e=>({loadingImages:e.loadingImages.filter(e=>e!==t)}),!1,`removeImageLoading`),clearAllLoading:()=>e({loadingFiles:[],loadingImages:[]},!1,`clearAllLoading`),setMessageToSend:t=>e({messageToSend:{text:t,timestamp:Date.now()}},!1,`setMessageToSend`),clearMessageToSend:()=>e({messageToSend:null},!1,`clearMessageToSend`),restoreMessageToInputIfEmpty:t=>e({messageRestoreIfEmpty:{text:t,timestamp:Date.now()}},!1,`restoreMessageToInputIfEmpty`),clearMessageRestoreIfEmpty:()=>e({messageRestoreIfEmpty:null},!1,`clearMessageRestoreIfEmpty`),setSubmittedMessage:t=>e({submittedMessage:t},!1,`setSubmittedMessage`),resetConversationState:()=>e({shouldHideSuggestions:!1,conversationMode:i(),subConversationTaskId:null,planContent:null},!1,`resetConversationState`),setHasRightPanelToggled:t=>e({hasRightPanelToggled:t},!1,`setHasRightPanelToggled`),setConversationMode:t=>{let i=r();i&&n.setConversationState(i,{conversationMode:t}),e({conversationMode:t},!1,`setConversationMode`)},setSubConversationTaskId:t=>e({subConversationTaskId:t},!1,`setSubConversationTaskId`),setPlanContent:t=>e({planContent:t},!1,`setPlanContent`)}),{name:`conversation-store`}));exports.useConversationStore=a;
|
|
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("../utils/conversation-local-storage.cjs");var r=()=>{if(typeof window>`u`)return null;let e=window.location.pathname.match(/\/conversations\/([^/]+)/);return e?e[1]:null},i=()=>{if(typeof window>`u`)return`code`;let e=r();return e?n.getConversationState(e).conversationMode:`code`},a=e.create()(t.devtools(e=>({isRightPanelShown:!1,isOverviewPanelShown:!1,isOverviewPanelPeeked:!1,selectedTab:`files`,commitsAutoExpandSection:null,images:[],files:[],imagesMarkedUploadAsFile:[],pastedImageNames:[],loadingFiles:[],loadingImages:[],messageToSend:null,messageRestoreIfEmpty:null,shouldShownAgentLoading:!1,submittedMessage:null,shouldHideSuggestions:!1,hasRightPanelToggled:!1,planContent:null,conversationMode:i(),subConversationTaskId:null,setIsRightPanelShown:t=>e({isRightPanelShown:t},!1,`setIsRightPanelShown`),setIsOverviewPanelShown:t=>e({isOverviewPanelShown:t,isOverviewPanelPeeked:!1},!1,`setIsOverviewPanelShown`),setIsOverviewPanelPeeked:t=>e({isOverviewPanelPeeked:t},!1,`setIsOverviewPanelPeeked`),setSelectedTab:t=>e({selectedTab:t},!1,`setSelectedTab`),setCommitsAutoExpandSection:t=>e({commitsAutoExpandSection:t},!1,`setCommitsAutoExpandSection`),setShouldShownAgentLoading:t=>e({shouldShownAgentLoading:t},!1,`setShouldShownAgentLoading`),setShouldHideSuggestions:t=>e({shouldHideSuggestions:t},!1,`setShouldHideSuggestions`),addImages:t=>e(e=>({images:[...e.images,...t]}),!1,`addImages`),addFiles:t=>e(e=>({files:[...e.files,...t]}),!1,`addFiles`),toggleImageUploadAsFile:t=>e(e=>{let n=new Set(e.imagesMarkedUploadAsFile);return n.has(t)?n.delete(t):n.add(t),{imagesMarkedUploadAsFile:[...n]}},!1,`toggleImageUploadAsFile`),markImagesAsPasted:t=>e(e=>({pastedImageNames:[...new Set([...e.pastedImageNames,...t])]}),!1,`markImagesAsPasted`),removeImage:t=>e(e=>{let n=e.images[t],r=[...e.images];return r.splice(t,1),{images:r,imagesMarkedUploadAsFile:n?e.imagesMarkedUploadAsFile.filter(e=>e!==n.name):e.imagesMarkedUploadAsFile,pastedImageNames:n?e.pastedImageNames.filter(e=>e!==n.name):e.pastedImageNames}},!1,`removeImage`),removeFile:t=>e(e=>{let n=[...e.files];return n.splice(t,1),{files:n}},!1,`removeFile`),clearImages:()=>e({images:[]},!1,`clearImages`),clearFiles:()=>e({files:[]},!1,`clearFiles`),clearAllFiles:()=>e({images:[],files:[],imagesMarkedUploadAsFile:[],pastedImageNames:[],loadingFiles:[],loadingImages:[]},!1,`clearAllFiles`),addFileLoading:t=>e(e=>e.loadingFiles.includes(t)?e:{loadingFiles:[...e.loadingFiles,t]},!1,`addFileLoading`),removeFileLoading:t=>e(e=>({loadingFiles:e.loadingFiles.filter(e=>e!==t)}),!1,`removeFileLoading`),addImageLoading:t=>e(e=>e.loadingImages.includes(t)?e:{loadingImages:[...e.loadingImages,t]},!1,`addImageLoading`),removeImageLoading:t=>e(e=>({loadingImages:e.loadingImages.filter(e=>e!==t)}),!1,`removeImageLoading`),clearAllLoading:()=>e({loadingFiles:[],loadingImages:[]},!1,`clearAllLoading`),setMessageToSend:t=>e({messageToSend:{text:t,timestamp:Date.now()}},!1,`setMessageToSend`),clearMessageToSend:()=>e({messageToSend:null},!1,`clearMessageToSend`),restoreMessageToInputIfEmpty:t=>e({messageRestoreIfEmpty:{text:t,timestamp:Date.now()}},!1,`restoreMessageToInputIfEmpty`),clearMessageRestoreIfEmpty:()=>e({messageRestoreIfEmpty:null},!1,`clearMessageRestoreIfEmpty`),setSubmittedMessage:t=>e({submittedMessage:t},!1,`setSubmittedMessage`),resetConversationState:()=>e({shouldHideSuggestions:!1,conversationMode:i(),subConversationTaskId:null,planContent:null},!1,`resetConversationState`),setHasRightPanelToggled:t=>e({hasRightPanelToggled:t},!1,`setHasRightPanelToggled`),setConversationMode:t=>{let i=r();i&&n.setConversationState(i,{conversationMode:t}),e({conversationMode:t},!1,`setConversationMode`)},setSubConversationTaskId:t=>e({subConversationTaskId:t},!1,`setSubConversationTaskId`),setPlanContent:t=>e({planContent:t},!1,`setPlanContent`)}),{name:`conversation-store`}));exports.useConversationStore=a;
|
|
2
2
|
//# sourceMappingURL=conversation-store.cjs.map
|