@openhands/agent-canvas 1.13.0 → 1.14.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-D1PORKc0.js → acp-providers-CYy8qA2z.js} +1 -1
- package/build/assets/active-backend-context-BZDG15C0.js +2 -0
- package/build/assets/{agent-context-settings-DMrObcIS.js → agent-context-settings-DGWBBbcp.js} +1 -1
- package/build/assets/{agent-profiles-settings-DororXN5.js → agent-profiles-settings-DrkGdf4_.js} +1 -1
- package/build/assets/{agent-server-conversation-service.api-DWBe0rbX.js → agent-server-conversation-service.api-DK56YPTs.js} +7 -7
- package/build/assets/{agent-settings-BJVk92PU.js → agent-settings-DfcSgkLD.js} +2 -2
- package/build/assets/agent-settings-Lrc5-twS.js +1 -0
- package/build/assets/{alert-banner-CzZsm7ms.js → alert-banner-BgDHhL7b.js} +1 -1
- package/build/assets/api-error-message-BEIE_yD1.js +1 -0
- package/build/assets/{api-key-entry-screen-D8Fade_-.js → api-key-entry-screen-DaZnOlVo.js} +1 -1
- package/build/assets/{app-settings-CpyGB3AT.js → app-settings-BG5NAUbC.js} +1 -1
- package/build/assets/automation-detail-D4Hs831Z.js +3 -0
- package/build/assets/automation-export-n0X6FB0C.js +2 -0
- package/build/assets/automation-git-sync-CDrm8WV7.js +1 -0
- package/build/assets/automation-setup-route-CZCl4ONs.js +1 -0
- package/build/assets/{automation-templates-DgpCGOJV.js → automation-templates-DFF96AdL.js} +1 -1
- package/build/assets/automations-list-Bl-oGOrV.js +1 -0
- package/build/assets/{back-nav-button-HHEneWMw.js → back-nav-button-H_ThtDA0.js} +1 -1
- package/build/assets/{backend-form-modal-DiVrD4Cm.js → backend-form-modal-CbCemvHt.js} +1 -1
- package/build/assets/backend-not-configured-DP8KLNq_.js +1 -0
- package/build/assets/{backend-synced-settings-badge-7MIjpr8M.js → backend-synced-settings-badge-BBASWqsb.js} +1 -1
- package/build/assets/{badge-CpYmcVZV.js → badge-B-51h-SW.js} +1 -1
- package/build/assets/{base-modal-Fnh6Uln9.js → base-modal-BbjycA8X.js} +1 -1
- package/build/assets/{bot-BQZx8e2i.js → bot-CGPCg03p.js} +1 -1
- package/build/assets/{brand-button-swT1RyO0.js → brand-button-Blxv5nww.js} +1 -1
- package/build/assets/browser-CuW0nWvh.js +7 -0
- package/build/assets/{browser-tab-zAY12m_i.js → browser-tab-D5G0ORwt.js} +1 -1
- package/build/assets/{chat-send-button-DsJtivmL.js → chat-send-button-BD2tii1r.js} +1 -1
- package/build/assets/check-DSuS-lyr.js +1 -0
- package/build/assets/chevron-down-CgGcmtE2.js +1 -0
- package/build/assets/circle-check-CG5-NPw7.js +1 -0
- package/build/assets/{circle-plus-check-toggle-Cuzx55bo.js → circle-plus-check-toggle-ASbpB8vN.js} +1 -1
- package/build/assets/{cloud-funnel-analytics-86CwNdSh.js → cloud-funnel-analytics-GlCUG0gk.js} +1 -1
- package/build/assets/cog-CZiR80uT.js +1 -0
- package/build/assets/{combobox-caret-D0fRotFi.js → combobox-caret-DvpEsh2O.js} +1 -1
- package/build/assets/{command-menu-BXy03FBl.js → command-menu-DwUQzjYP.js} +1 -1
- package/build/assets/{condenser-settings-BmZa0ui_.js → condenser-settings-BptcoiLA.js} +1 -1
- package/build/assets/{confirmation-modal-BgoN6lbN.js → confirmation-modal-CiEwxZAA.js} +1 -1
- package/build/assets/{context-menu-list-item-Bq02tc-P.js → context-menu-list-item-CdcamfM1.js} +1 -1
- package/build/assets/conversation-DREHj4nT.js +1 -0
- package/build/assets/conversation-DotRfiDz.js +90 -0
- package/build/assets/conversation-panel-DREHj4nT.js +1 -0
- package/build/assets/conversation-state-store-DMLtlHbE.js +1 -0
- package/build/assets/{conversation-tab-empty-state-CMqo_0Bd.js → conversation-tab-empty-state-D-puECpY.js} +1 -1
- package/build/assets/{copy-to-clipboard-button-Cg1pF0xn.js → copy-to-clipboard-button-BGxcUbgy.js} +1 -1
- package/build/assets/{device-verify-BfQLgNyq.js → device-verify-CZJfWaJf.js} +1 -1
- package/build/assets/{dropdown-classes-BIqQr5mx.js → dropdown-classes-tLhpwtxS.js} +1 -1
- package/build/assets/{entry.client-CxFjRYqH.js → entry.client-D8GnI6GZ.js} +2 -2
- package/build/assets/{enum-filter-dropdown-C_yV4_bo.js → enum-filter-dropdown-Fk8k60nk.js} +1 -1
- package/build/assets/{environment-switch-overlay-Bi4qbh2g.js → environment-switch-overlay-DeztVYuL.js} +1 -1
- package/build/assets/{extensions-hub-BqUINAhp.js → extensions-hub-Cd6GCYzq.js} +1 -1
- package/build/assets/{extensions-navigation-lraj88Wk.js → extensions-navigation-C4sgZg-y.js} +1 -1
- package/build/assets/{external-link-CgtpA_a1.js → external-link-C0UpBgsE.js} +1 -1
- package/build/assets/{file-text-DEK4LSVw.js → file-text-C6WYtNdV.js} +1 -1
- package/build/assets/files-tab-BW_qzyAm.js +1 -0
- package/build/assets/{form-control-classes-7yFSQJq_.js → form-control-classes-CGXBLcn1.js} +1 -1
- package/build/assets/format-model-name-BNPKVsIq.js +1 -0
- package/build/assets/format-relative-time-ZhQD4rsl.js +1 -0
- package/build/assets/git-provider-icon-CaQ1yLPi.js +1 -0
- package/build/assets/{git-repo-dropdown-ByMzpNko.js → git-repo-dropdown-CgXR6M_E.js} +1 -1
- package/build/assets/git-repo-dropdown-D2Uei3CO.js +1 -0
- package/build/assets/{highlighted-source-view-C_sfncLZ.js → highlighted-source-view-C_YOp8Fo.js} +1 -1
- package/build/assets/home-DNzzJcMP.js +1 -0
- package/build/assets/home-aCos-5vc.js +1 -0
- package/build/assets/{home-store-CxqsY9Fi.js → home-store-DgzViC3f.js} +1 -1
- package/build/assets/index-home-DNzzJcMP.js +1 -0
- package/build/assets/info-CLoC1LRo.js +1 -0
- package/build/assets/install-server-modal-D7zIqNKz.js +1 -0
- package/build/assets/kebab-menu-item-content-DERMdnDv.js +1 -0
- package/build/assets/{launch-CkqiSCqi.js → launch-5PjKeLak.js} +1 -1
- package/build/assets/{list-todo-DNWlzfaM.js → list-todo-BF049YaY.js} +1 -1
- package/build/assets/llm-not-configured-banner-BK9z5eS0.js +27 -0
- package/build/assets/llm-settings-BLAMK2tR.js +1 -0
- package/build/assets/llm-settings-BWsbarGM.js +1 -0
- package/build/assets/{llm-subscription-service-BAdOl5Xx.js → llm-subscription-service-SfnEV9Uc.js} +1 -1
- package/build/assets/loader-circle-D7IagAyF.js +1 -0
- package/build/assets/{loading-spinner-xhnrGP4Y.js → loading-spinner-DBgXgra0.js} +1 -1
- package/build/assets/{manage-backends-modal-DhGk5mJt.js → manage-backends-modal-BTqNPhzc.js} +1 -1
- package/build/assets/manifest-abebca3c.js +1 -0
- package/build/assets/manifest-subpage-layout-Rn-glaxV.js +1 -0
- package/build/assets/{map-provider-Mx8mZuE-.js → map-provider-BK4HnqYz.js} +1 -1
- package/build/assets/markdown-renderer-Cp6DlHQN.js +8 -0
- package/build/assets/{mcp-DCkvl6K0.js → mcp-BC-Ixn4T.js} +2 -2
- package/build/assets/{mcp-marketplace-utils-DEbMXlQr.js → mcp-marketplace-utils-BJWJgbB6.js} +1 -1
- package/build/assets/{messages-DSXvyc21.js → messages-CzFKrzPG.js} +5 -5
- package/build/assets/{modal-body-gIe21fDv.js → modal-body-BdKfD3Hl.js} +1 -1
- package/build/assets/{modal-classes-D66dlgZ7.js → modal-classes-D5_b5vMi.js} +1 -1
- package/build/assets/{modal-close-button-B6iOGYpI.js → modal-close-button-objukxk_.js} +1 -1
- package/build/assets/{mouse-pointer-click-BYX1Pw5W.js → mouse-pointer-click-C_gXyLyD.js} +1 -1
- package/build/assets/{npm-DLckoeJc.js → npm-CHVHV1MC.js} +1 -1
- package/build/assets/{onboarding-D7WDG66N.js → onboarding-Diw0V51A.js} +1 -1
- package/build/assets/onboarding-modal-Da4yHzsA.js +1 -0
- package/build/assets/{organization-service.api-D-s9z18a.js → organization-service.api-BztSy69u.js} +1 -1
- package/build/assets/parse-git-remote-url-BkXN9jzl.js +1 -0
- package/build/assets/{pencil-BGOCPRyu.js → pencil-49avMHlD.js} +1 -1
- package/build/assets/{planner-tab-AKaXIIfg.js → planner-tab-CJiSpNax.js} +1 -1
- package/build/assets/{plugins-management-service-wtmY4QQw.js → plugins-management-service-lHdNKWNU.js} +1 -1
- package/build/assets/plus-C0BagBpV.js +1 -0
- package/build/assets/profiles-service.api-BLr7FXec.js +1 -0
- package/build/assets/providers-CWXnb7S3.js +1 -0
- package/build/assets/{proxy-9Z_WZggZ.js → proxy-DYDXxtje.js} +1 -1
- package/build/assets/{puzzle-BWLmN8z4.js → puzzle-Bt2B1rzf.js} +1 -1
- package/build/assets/recommended-automations-launcher-CcFMfJRR.js +1 -0
- package/build/assets/{refresh-cw-CXtFWpwv.js → refresh-cw-nmcesifB.js} +1 -1
- package/build/assets/root-CT4t7apy.css +1 -0
- package/build/assets/root-DnRgLKpU.js +2 -0
- package/build/assets/root-layout-2L9tr-BN.js +2 -0
- package/build/assets/{schema-field-OnM5Uob_.js → schema-field-C59lVZTA.js} +1 -1
- package/build/assets/{sdk-section-page-m5WQm2sy.js → sdk-section-page-BbBEQQjq.js} +1 -1
- package/build/assets/search-CYSDBczG.js +1 -0
- package/build/assets/secrets-service-BtsgYSlj.js +1 -0
- package/build/assets/secrets-settings-DJ0OKa4_.js +1 -0
- package/build/assets/{segmented-toggle-DCspm2U5.js → segmented-toggle-DiVfTZuN.js} +1 -1
- package/build/assets/{settings-BJQI_iBM.js → settings-CDqL_Uqh.js} +1 -1
- package/build/assets/{settings-CWFxymAf.js → settings-DcNPxz0v.js} +1 -1
- package/build/assets/{settings-dropdown-input-BI8V_Nov.js → settings-dropdown-input-Ba1UN5Du.js} +1 -1
- package/build/assets/{settings-index-BiTqJoH7.js → settings-index-Cz2cKt2K.js} +1 -1
- package/build/assets/{settings-input-Cz62hWVW.js → settings-input-CWUEHHvS.js} +1 -1
- package/build/assets/{settings-list-classes-z_3FW5H3.js → settings-list-classes-DdcLXDGn.js} +1 -1
- package/build/assets/{settings-modal-BIrIVn97.js → settings-modal-nEEK1Kh1.js} +1 -1
- package/build/assets/{settings-service.api--rJmnuLa.js → settings-service.api-3yAUFcaP.js} +1 -1
- package/build/assets/{settings-switch-BRsSI8Vs.js → settings-switch-Dk9hChx1.js} +1 -1
- package/build/assets/{settings-utils-Ba7vel6T.js → settings-utils-CxjtCSB3.js} +1 -1
- package/build/assets/{shared-conversation-CQK_PqHx.js → shared-conversation-DbAcrx3s.js} +1 -1
- package/build/assets/{shield-check-T3JsDJiM.js → shield-check-CiOTXxV2.js} +1 -1
- package/build/assets/{sidebar-layout-Bhi3hVcu.js → sidebar-layout-lrfPooIB.js} +1 -1
- package/build/assets/{sidebar-mobile-menu-toggle-YWJNRN4p.js → sidebar-mobile-menu-toggle-KERXfNu1.js} +1 -1
- package/build/assets/{sidebar-nav-link-BSUlY5Ml.js → sidebar-nav-link-B8lFD6Cb.js} +1 -1
- package/build/assets/{sidebar-store-Cl1cUv_F.js → sidebar-store-u6pUpxJ7.js} +1 -1
- package/build/assets/{skill-card-pill-row-BXz8L8Rn.js → skill-card-pill-row-dGIUzr_b.js} +1 -1
- package/build/assets/{skill-icon-badge-QgfKv31M.js → skill-icon-badge-kkOWZ89w.js} +1 -1
- package/build/assets/{skill-scope-Dc3JPW-8.js → skill-scope-DWN1PBPH.js} +1 -1
- package/build/assets/{skills-plugins-CpTV27n3.js → skills-plugins-DFjH2Nq6.js} +1 -1
- package/build/assets/{skills-settings-CSW__IW4.js → skills-settings-DIHpl3ol.js} +2 -2
- package/build/assets/{sparkles-TJ0mdECe.js → sparkles-ntyMLnbj.js} +1 -1
- package/build/assets/{styled-tooltip-BUMSbgrF.js → styled-tooltip-B6JXcsmL.js} +1 -1
- package/build/assets/{task-list-tab-mAHMOkUz.js → task-list-tab-aEJzEcHD.js} +1 -1
- package/build/assets/{terminal-BzxBaHx2.js → terminal-Dch7Ty5K.js} +1 -1
- package/build/assets/{toggle-switch-O5v1FgxW.js → toggle-switch-B2MLKsgt.js} +1 -1
- package/build/assets/{trash-2-C0xNVp9c.js → trash-2-yZnDM4Ji.js} +1 -1
- package/build/assets/{typography-NOKSk9_R.js → typography-DB5HoCk0.js} +1 -1
- package/build/assets/usage-tab-DrEtBmBT.js +1 -0
- package/build/assets/use-acp-credential-form-c8KXAa8A.js +1 -0
- package/build/assets/{use-activate-agent-profile-D9YRQPTF.js → use-activate-agent-profile-B0p34N3q.js} +1 -1
- package/build/assets/use-agent-profiles-CPIc6wLH.js +1 -0
- package/build/assets/{use-can-manage-org-profiles-Dxzq2AEd.js → use-can-manage-org-profiles-Dz_8Eqkv.js} +1 -1
- package/build/assets/{use-cloud-current-user-id-Co2eJk2A.js → use-cloud-current-user-id-DvUVqCle.js} +1 -1
- package/build/assets/use-config-C3PO4TBw.js +1 -0
- package/build/assets/{use-create-conversation-CoHTiCbI.js → use-create-conversation-DVrA_uLD.js} +1 -1
- package/build/assets/use-create-secret-DbBIpaCR.js +1 -0
- package/build/assets/use-get-secrets-6PBitf54.js +1 -0
- package/build/assets/use-has-permission-CQ31Cl8j.js +1 -0
- package/build/assets/use-is-authed-2UrDIziV.js +1 -0
- package/build/assets/use-is-creating-conversation-BvYpmb3v.js +1 -0
- package/build/assets/use-llm-profiles-diZS4FiN.js +1 -0
- package/build/assets/use-manifest-capabilities-HIWCtIUm.js +1 -0
- package/build/assets/{use-onboarding-completion-CCE8OQgV.js → use-onboarding-completion-Bs8PcXik.js} +1 -1
- package/build/assets/{use-plugins-marketplace-CEiak69h.js → use-plugins-marketplace-BCuNLFsr.js} +1 -1
- package/build/assets/use-save-agent-profile-BaMNSpBV.js +1 -0
- package/build/assets/{use-save-settings-DNmnbG6f.js → use-save-settings-BahvC2Gw.js} +1 -1
- package/build/assets/{use-settings-wCwPaSIv.js → use-settings-C6ZxpBDX.js} +1 -1
- package/build/assets/{use-settings-nav-items-BlFL7YhM.js → use-settings-nav-items-Bqn69Ggw.js} +2 -2
- package/build/assets/use-tracking-Bhu7gk2y.js +3 -0
- package/build/assets/{use-user-conversation-DVtfg0B_.js → use-user-conversation-BkNXpXrd.js} +1 -1
- package/build/assets/{useInfiniteQuery-p1xq35r2.js → useInfiniteQuery-c_OmS3lK.js} +1 -1
- package/build/assets/{useMutation-BFDQmgk9.js → useMutation-6ZsQCqAn.js} +1 -1
- package/build/assets/{useQueries-DF1NAAeC.js → useQueries-xDrGlTO_.js} +1 -1
- package/build/assets/{useQuery-DRv--6bK.js → useQuery-Bs5NFz2s.js} +1 -1
- package/build/assets/{utils-zxEjKE70.js → utils-DUD5ScdA.js} +1 -1
- package/build/assets/{vendor~entry.client-CgNUwtQL.js → vendor~entry.client-BFE7Llz9.js} +1 -1
- package/build/assets/{vendor~entry.client-zSIea5EO.js → vendor~entry.client-BaKt_PIp.js} +1 -1
- package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-B8i84bh4.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kepq2zme-D87mAf6K.js} +1 -1
- package/build/assets/{vendor~files-tab-D9wR9yM2.js → vendor~files-tab-B6POTS66.js} +1 -1
- package/build/assets/{vendor~index-home~home~conversation-panel~conversation-Ipoe6hvY.js → vendor~index-home~home~conversation-panel~conversation-53Q_U6uP.js} +1 -1
- package/build/assets/{vendor~root-layout-C-IgVx6e.js → vendor~root-layout-DeQACFVA.js} +1 -1
- package/build/assets/{vendor~root-layout~conversation-panel~conversation-Dhd_I4H4.js → vendor~root-layout~conversation-panel~conversation-bv7ooVgH.js} +1 -1
- package/build/assets/{vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-Cc0f9kPP.js → vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-e8pX05xf.js} +1 -1
- package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-d7svw-BB.js → vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-BvS6PCK2.js} +1 -1
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-4WsUP-tz.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-DOPLJMH9.js} +1 -1
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-D5DWZVc7.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iw7io29p-Dz8NQve5.js} +1 -1
- package/build/assets/{verification-settings-B8UMQ7MG.js → verification-settings-COueVXmM.js} +1 -1
- package/build/assets/{wrench-DIka3hCq.js → wrench-C95ujnYo.js} +1 -1
- package/build/assets/x-86ZCfxKY.js +1 -0
- package/build/assets/{zap-DHddTPc0.js → zap-DRa-r-Tf.js} +1 -1
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +60 -2
- package/build/locales/ca/openhands.json +60 -2
- package/build/locales/de/openhands.json +60 -2
- package/build/locales/en/openhands.json +60 -2
- package/build/locales/es/openhands.json +60 -2
- package/build/locales/fr/openhands.json +60 -2
- package/build/locales/it/openhands.json +60 -2
- package/build/locales/ja/openhands.json +60 -2
- package/build/locales/ko-KR/openhands.json +60 -2
- package/build/locales/no/openhands.json +60 -2
- package/build/locales/pt/openhands.json +60 -2
- package/build/locales/tr/openhands.json +60 -2
- package/build/locales/uk/openhands.json +60 -2
- package/build/locales/zh-CN/openhands.json +60 -2
- package/build/locales/zh-TW/openhands.json +60 -2
- package/config/defaults.json +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 +10 -0
- package/dist/api/automation-service/automation-service.api.js +42 -0
- package/dist/api/automation-service/automation-service.api.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/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 +15 -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/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-message-components/index.d.ts +0 -1
- 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/responder-deployment-modal.d.ts +2 -1
- 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 +177 -176
- 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/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.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.js +19 -19
- package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +10 -7
- 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/config/defaults.cjs +1 -1
- package/dist/config/defaults.cjs.map +1 -1
- package/dist/config/defaults.js +1 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/contexts/conversation-websocket-context.cjs +2 -2
- package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
- package/dist/contexts/conversation-websocket-context.js +12 -12
- package/dist/contexts/conversation-websocket-context.js.map +1 -1
- package/dist/hooks/query/use-commit-changes.cjs +1 -1
- package/dist/hooks/query/use-commit-changes.js +4 -4
- package/dist/hooks/query/use-git-sync.d.ts +19 -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-unified-get-git-changes.cjs +1 -1
- package/dist/hooks/query/use-unified-get-git-changes.js +4 -4
- package/dist/hooks/query/use-unified-git-commits.cjs +1 -1
- package/dist/hooks/query/use-unified-git-commits.js +4 -4
- package/dist/hooks/query/use-unified-git-diff.cjs +1 -1
- package/dist/hooks/query/use-unified-git-diff.js +4 -4
- package/dist/hooks/query/use-workspace-files.cjs +1 -1
- package/dist/hooks/query/use-workspace-files.cjs.map +1 -1
- package/dist/hooks/query/use-workspace-files.d.ts +14 -4
- package/dist/hooks/query/use-workspace-files.js +45 -32
- package/dist/hooks/query/use-workspace-files.js.map +1 -1
- package/dist/hooks/use-responder-url-secret.d.ts +5 -0
- package/dist/hooks/use-tracking.cjs +1 -1
- package/dist/hooks/use-tracking.cjs.map +1 -1
- package/dist/hooks/use-tracking.d.ts +6 -0
- package/dist/hooks/use-tracking.js +6 -0
- package/dist/hooks/use-tracking.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 +59 -1
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/translation.cjs +1 -1
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +1001 -15
- package/dist/i18n/translation.js.map +1 -1
- package/dist/locales/ar/openhands.json +60 -2
- package/dist/locales/ca/openhands.json +60 -2
- package/dist/locales/de/openhands.json +60 -2
- package/dist/locales/en/openhands.json +60 -2
- package/dist/locales/es/openhands.json +60 -2
- package/dist/locales/fr/openhands.json +60 -2
- package/dist/locales/it/openhands.json +60 -2
- package/dist/locales/ja/openhands.json +60 -2
- package/dist/locales/ko-KR/openhands.json +60 -2
- package/dist/locales/no/openhands.json +60 -2
- package/dist/locales/pt/openhands.json +60 -2
- package/dist/locales/tr/openhands.json +60 -2
- package/dist/locales/uk/openhands.json +60 -2
- package/dist/locales/zh-CN/openhands.json +60 -2
- package/dist/locales/zh-TW/openhands.json +60 -2
- 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/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/dist/routes/files-tab.cjs +1 -1
- package/dist/routes/files-tab.js +11 -11
- package/dist/routes/files-tab.js.map +1 -1
- 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/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/types/git-sync.d.ts +51 -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/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/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/package.json +1 -1
- package/scripts/check-translation-completeness.cjs +3 -0
- package/scripts/dev-with-automation.mjs +98 -9
- package/build/assets/active-backend-context-IqOjobNK.js +0 -2
- package/build/assets/agent-settings-COfJsQ1d.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/automations-list-DnMxlxsL.js +0 -1
- package/build/assets/browser-B9AbV6kG.js +0 -7
- 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/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/files-tab-DV0L-lFE.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-C6R7hgM8.js +0 -1
- package/build/assets/home-BOrlwLqG.js +0 -1
- package/build/assets/home-BvMNC6E-.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/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/loader-circle-B47W9XqT.js +0 -1
- package/build/assets/manifest-653b89aa.js +0 -1
- package/build/assets/manifest-subpage-layout-CKWvL2ig.js +0 -1
- package/build/assets/markdown-renderer-DUmk7pFc.js +0 -8
- package/build/assets/onboarding-modal-C_xVrFNv.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/recommended-automations-launcher-CFlzhu1o.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/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/usage-tab-tEmVN0KD.js +0 -1
- package/build/assets/use-acp-credential-form-BPNi0Zbm.js +0 -1
- package/build/assets/use-agent-profiles-Cb2zUW3l.js +0 -1
- package/build/assets/use-config-DKAMiI5R.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-llm-profiles-C_BHue65.js +0 -1
- package/build/assets/use-manifest-capabilities-DPrQsaPP.js +0 -1
- package/build/assets/use-save-agent-profile-DK9idD6a.js +0 -1
- package/build/assets/use-tracking-CVwPmhlX.js +0 -3
- package/build/assets/x-BWKA2Ver.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/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/hooks/query/use-suggested-tasks.d.ts +0 -1
- package/dist/hooks/use-should-show-user-features.d.ts +0 -1
- package/dist/ui/card-title.d.ts +0 -16
- package/dist/ui/card.d.ts +0 -14
- package/dist/utils/group-suggested-tasks.d.ts +0 -7
- /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~dcc51rps-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
- /package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~9pstowjp-BOVIFA_g.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-BOVIFA_g.js} +0 -0
- /package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~ht43enc2-C0JXQb_q.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-C0JXQb_q.js} +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { useConversationId as e } from "../use-conversation-id.js";
|
|
2
2
|
import { useQuery as t } from "../../node_modules/@tanstack/react-query/build/modern/useQuery.js";
|
|
3
3
|
import { useActiveConversation as n } from "./use-active-conversation.js";
|
|
4
|
-
import r from "../../
|
|
5
|
-
import
|
|
4
|
+
import { getGitPath as r } from "../../utils/get-git-path.js";
|
|
5
|
+
import i from "../../api/git-service/agent-server-git-service.api.js";
|
|
6
6
|
import a from "react";
|
|
7
7
|
//#region src/hooks/query/use-unified-git-diff.ts
|
|
8
8
|
var o = (o) => {
|
|
9
|
-
let { conversationId: s } = e(), { data: c } = n(), l = c?.conversation_url, u = c?.session_api_key, d = c?.selected_repository, f = c?.workspace?.working_dir?.trim(), p = a.useMemo(() => `${
|
|
9
|
+
let { conversationId: s } = e(), { data: c } = n(), l = c?.conversation_url, u = c?.session_api_key, d = c?.selected_repository, f = c?.workspace?.working_dir?.trim(), p = a.useMemo(() => `${r(d, f)}/${o.filePath}`, [
|
|
10
10
|
d,
|
|
11
11
|
o.filePath,
|
|
12
12
|
f
|
|
@@ -28,7 +28,7 @@ var o = (o) => {
|
|
|
28
28
|
],
|
|
29
29
|
queryFn: async () => {
|
|
30
30
|
if (!s) throw Error("No conversation ID");
|
|
31
|
-
return
|
|
31
|
+
return i.getGitChangeDiff(s, l, u, p, o.commit);
|
|
32
32
|
},
|
|
33
33
|
enabled: o.enabled && (!m || !!o.commit),
|
|
34
34
|
staleTime: o.commit ? Infinity : 1e3 * 60 * 5,
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../node_modules/@tanstack/react-query/build/modern/useQuery.cjs"),
|
|
1
|
+
require("../../_virtual/_rolldown/runtime.cjs");const e=require("../use-conversation-id.cjs"),t=require("../../api/backend-registry/active-store.cjs"),n=require("../../node_modules/@tanstack/react-query/build/modern/useQuery.cjs"),r=require("../../api/cloud/conversation-service.api.cjs"),i=require("./use-active-conversation.cjs"),a=require("../use-runtime-is-ready.cjs"),o=require("../../api/runtime-service/agent-server-runtime-service.cjs"),s=require("../../utils/get-git-path.cjs");let c=require("react");var l=2e3,u=[`.git`,`node_modules`,`.venv`,`venv`,`__pycache__`,`dist`,`build`,`.next`,`.cache`,`.pytest_cache`,`.mypy_cache`,`.turbo`,`.parcel-cache`,`target`];function d(){return`find . \\( ${u.map(e=>`-name '${e}' -prune`).join(` -o `)} \\) -o -type f -print 2>/dev/null | sort | head -n ${l}`}function f(e){return e.startsWith(`./`)?e.slice(2):e}function p(e){let{data:t}=i.useActiveConversation(),r=a.useRuntimeIsReady(),s=t?.id,c=t?.conversation_url,u=t?.session_api_key,p=t?.workspace?.working_dir?.trim(),m=n.useQuery({queryKey:[`workspace-files`,s,c,u,p],queryFn:async()=>{let e=await o.default.executeCommand(c,u,d(),p,30);if(e.exit_code!==0)throw Error(e.stderr?.trim()||`Failed to list workspace files`);let t=e.stdout.split(/\r?\n/).map(e=>e.trim()).filter(Boolean).map(f);return Array.from(new Set(t)).slice(0,l)},enabled:e&&r&&!!s&&!!p,retry:!1,staleTime:1e3*30,gcTime:1e3*60*5,meta:{disableToast:!0}});return{data:m.data,isLoading:m.isLoading}}function m(t){let{conversationId:o}=e.useOptionalConversationId(),{data:c}=i.useActiveConversation(),u=a.useRuntimeIsReady(),d=c?.selected_repository,p=c?.workspace?.working_dir?.trim(),m=s.getGitPath(d,p),h=m.startsWith(`/`)?m:`/${m}`,g=n.useQuery({queryKey:[`workspace-files-cloud`,o,h],queryFn:async()=>{let e=(await r.listCloudConversationFiles(o,h)).map(f).filter(Boolean);return Array.from(new Set(e)).slice(0,l)},enabled:t&&u&&!!o,retry:!1,staleTime:1e3*30,gcTime:1e3*60*5,meta:{disableToast:!0}});return{data:g.data,isLoading:g.isLoading}}function h(){let e=(0,c.useSyncExternalStore)(t.subscribeActiveBackend,t.getSnapshot,t.getSnapshot).active.backend.kind===`cloud`,n=p(!e),r=m(e);return e?r:n}exports.useWorkspaceFiles=h;
|
|
2
2
|
//# sourceMappingURL=use-workspace-files.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-workspace-files.cjs","names":[],"sources":["../../../src/hooks/query/use-workspace-files.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"use-workspace-files.cjs","names":[],"sources":["../../../src/hooks/query/use-workspace-files.ts"],"sourcesContent":["import { useSyncExternalStore } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport AgentServerRuntimeService from \"#/api/runtime-service/agent-server-runtime-service\";\nimport { listCloudConversationFiles } from \"#/api/cloud/conversation-service.api\";\nimport {\n getSnapshot,\n subscribeActiveBackend,\n} from \"#/api/backend-registry/active-store\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useOptionalConversationId } from \"#/hooks/use-conversation-id\";\nimport { useRuntimeIsReady } from \"#/hooks/use-runtime-is-ready\";\nimport { getGitPath } from \"#/utils/get-git-path\";\n\n// Cap the number of files we render so a giant repo doesn't freeze the UI.\nconst MAX_FILES = 2000;\n\nexport interface WorkspaceFilesResult {\n data: string[] | undefined;\n isLoading: boolean;\n}\n\n// Directory names that we never want to descend into when listing files.\nconst EXCLUDED_DIRS = [\n \".git\",\n \"node_modules\",\n \".venv\",\n \"venv\",\n \"__pycache__\",\n \"dist\",\n \"build\",\n \".next\",\n \".cache\",\n \".pytest_cache\",\n \".mypy_cache\",\n \".turbo\",\n \".parcel-cache\",\n \"target\",\n];\n\n// Build a `find` invocation that lists files relative to the workspace root.\nfunction buildListCommand(): string {\n const pruneExpr = EXCLUDED_DIRS.map((dir) => `-name '${dir}' -prune`).join(\n \" -o \",\n );\n return `find . \\\\( ${pruneExpr} \\\\) -o -type f -print 2>/dev/null | sort | head -n ${MAX_FILES}`;\n}\n\nfunction normalizePath(path: string): string {\n // Strip a leading \"./\" so paths render cleanly in the UI.\n return path.startsWith(\"./\") ? path.slice(2) : path;\n}\n\n/**\n * Local-backend listing: enumerate every regular file beneath the active\n * conversation's working directory via `find` over the agent-server's\n * `/api/bash/execute_bash_command`, excluding common heavy/build directories.\n * Returns paths relative to the working dir (e.g. `src/index.html`).\n *\n * Local only: the browser can't drive `/api/bash/execute_bash_command` on a\n * cloud runtime (no CORS, and the `/api/cloud-proxy` hop was removed). Cloud\n * backends hit a first-class cloud API listing endpoint instead — see\n * `useCloudWorkspaceFiles`.\n */\nfunction useLocalWorkspaceFiles(enabled: boolean): WorkspaceFilesResult {\n const { data: conversation } = useActiveConversation();\n const runtimeIsReady = useRuntimeIsReady();\n\n const conversationId = conversation?.id;\n const conversationUrl = conversation?.conversation_url;\n const sessionApiKey = conversation?.session_api_key;\n const workingDir = conversation?.workspace?.working_dir?.trim();\n\n const query = useQuery<string[]>({\n queryKey: [\n \"workspace-files\",\n conversationId,\n conversationUrl,\n sessionApiKey,\n workingDir,\n ],\n queryFn: async () => {\n const result = await AgentServerRuntimeService.executeCommand(\n conversationUrl,\n sessionApiKey,\n buildListCommand(),\n workingDir,\n 30,\n );\n\n if (result.exit_code !== 0) {\n throw new Error(\n result.stderr?.trim() || \"Failed to list workspace files\",\n );\n }\n\n const lines = result.stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map(normalizePath);\n\n // Defensive: keep results unique and bounded.\n return Array.from(new Set(lines)).slice(0, MAX_FILES);\n },\n enabled: enabled && runtimeIsReady && !!conversationId && !!workingDir,\n retry: false,\n staleTime: 1000 * 30,\n gcTime: 1000 * 60 * 5,\n meta: { disableToast: true },\n });\n\n return { data: query.data, isLoading: query.isLoading };\n}\n\n/**\n * Cloud-backend listing: enumerate the full workspace tree via the cloud API's\n * first-class `GET /api/v1/app-conversations/{id}/files` endpoint, which\n * resolves the conversation's runtime and runs the same bounded `find`\n * server-side (see enterprise `list_conversation_files`). This is the same\n * server-side runtime-hop transport the git-changes/diff and single-file read\n * already use, so it works without CORS or the removed `/api/cloud-proxy` hop.\n *\n * Unlike the previous git-changes-based approach, this returns unchanged\n * tracked files too, so a conversation attached to a large existing repo shows\n * the whole tree — matching the local-backend experience. Paths come back\n * relative to the working dir (e.g. `src/index.html`).\n */\nfunction useCloudWorkspaceFiles(enabled: boolean): WorkspaceFilesResult {\n // Source the id from the route (like the diff/commits cloud hooks), NOT from\n // `useActiveConversation().data.id`: the cloud API listing call only needs\n // the id, and gating on the batch-get query's data would keep the query\n // disabled — and never fire — whenever that data is null or still loading.\n const { conversationId } = useOptionalConversationId();\n const { data: conversation } = useActiveConversation();\n const runtimeIsReady = useRuntimeIsReady();\n\n const selectedRepository = conversation?.selected_repository;\n const workingDir = conversation?.workspace?.working_dir?.trim();\n\n // Anchor against an absolute workspace path the same way the diff view and\n // single-file read do (`getGitPath` defaults to a relative convention; the\n // cloud runtime needs an absolute path).\n const gitPath = getGitPath(selectedRepository, workingDir);\n const absolutePath = gitPath.startsWith(\"/\") ? gitPath : `/${gitPath}`;\n\n const query = useQuery<string[]>({\n queryKey: [\"workspace-files-cloud\", conversationId, absolutePath],\n queryFn: async () => {\n const files = await listCloudConversationFiles(\n conversationId!,\n absolutePath,\n );\n const normalized = files.map(normalizePath).filter(Boolean);\n return Array.from(new Set(normalized)).slice(0, MAX_FILES);\n },\n enabled: enabled && runtimeIsReady && !!conversationId,\n retry: false,\n staleTime: 1000 * 30,\n gcTime: 1000 * 60 * 5,\n meta: { disableToast: true },\n });\n\n return { data: query.data, isLoading: query.isLoading };\n}\n\n/**\n * Lists the files shown in the Files tab for the active conversation.\n *\n * Both backends enumerate the full workspace tree. Local backends run bash\n * `find` directly against the agent-server; cloud backends call the cloud\n * API's first-class file-listing endpoint, which runs the same `find`\n * server-side on the conversation's runtime (see `useCloudWorkspaceFiles`).\n *\n * Cloud detection reads the backend-registry store (via `useSyncExternalStore`)\n * rather than the `ActiveBackendProvider` context. The transport layer that\n * actually issues the requests — `executeCommand`, `getGitChanges`, the cloud\n * file-read — all branch on the *store* (`getActiveBackend()`), so the Files\n * tab must use the same source. Reading the context here can disagree with the\n * store (its `useActiveBackend` fallback synthesizes a *local* backend when the\n * provider isn't in scope), which would run the local bash path against a cloud\n * backend: `executeCommand` then POSTs to the removed `/api/cloud-proxy` (405)\n * and the cloud `/files` call never fires.\n */\nexport function useWorkspaceFiles(): WorkspaceFilesResult {\n const snapshot = useSyncExternalStore(\n subscribeActiveBackend,\n getSnapshot,\n getSnapshot,\n );\n const isCloud = snapshot.active.backend.kind === \"cloud\";\n\n const local = useLocalWorkspaceFiles(!isCloud);\n const cloud = useCloudWorkspaceFiles(isCloud);\n\n return isCloud ? cloud : local;\n}\n"],"mappings":"8fAeA,IAAM,EAAY,IAQZ,EAAgB,CACpB,OACA,eACA,QACA,OACA,cACA,OACA,QACA,QACA,SACA,gBACA,cACA,SACA,gBACA,QACF,EAGA,SAAS,GAA2B,CAIlC,MAAO,cAHW,EAAc,IAAK,GAAQ,UAAU,EAAI,SAAS,EAAE,KACpE,MAEmB,EAAU,sDAAsD,GACvF,CAEA,SAAS,EAAc,EAAsB,CAE3C,OAAO,EAAK,WAAW,IAAI,EAAI,EAAK,MAAM,CAAC,EAAI,CACjD,CAaA,SAAS,EAAuB,EAAwC,CACtE,GAAM,CAAE,KAAM,GAAiB,EAAA,sBAAsB,EAC/C,EAAiB,EAAA,kBAAkB,EAEnC,EAAiB,GAAc,GAC/B,EAAkB,GAAc,iBAChC,EAAgB,GAAc,gBAC9B,EAAa,GAAc,WAAW,aAAa,KAAK,EAExD,EAAQ,EAAA,SAAmB,CAC/B,SAAU,CACR,kBACA,EACA,EACA,EACA,CACF,EACA,QAAS,SAAY,CACnB,IAAM,EAAS,MAAM,EAAA,QAA0B,eAC7C,EACA,EACA,EAAiB,EACjB,EACA,EACF,EAEA,GAAI,EAAO,YAAc,EACvB,MAAU,MACR,EAAO,QAAQ,KAAK,GAAK,gCAC3B,EAGF,IAAM,EAAQ,EAAO,OAClB,MAAM,OAAO,EACb,IAAK,GAAS,EAAK,KAAK,CAAC,EACzB,OAAO,OAAO,EACd,IAAI,CAAa,EAGpB,OAAO,MAAM,KAAK,IAAI,IAAI,CAAK,CAAC,EAAE,MAAM,EAAG,CAAS,CACtD,EACA,QAAS,GAAW,GAAkB,CAAC,CAAC,GAAkB,CAAC,CAAC,EAC5D,MAAO,GACP,UAAW,IAAO,GAClB,OAAQ,IAAO,GAAK,EACpB,KAAM,CAAE,aAAc,EAAK,CAC7B,CAAC,EAED,MAAO,CAAE,KAAM,EAAM,KAAM,UAAW,EAAM,SAAU,CACxD,CAeA,SAAS,EAAuB,EAAwC,CAKtE,GAAM,CAAE,kBAAmB,EAAA,0BAA0B,EAC/C,CAAE,KAAM,GAAiB,EAAA,sBAAsB,EAC/C,EAAiB,EAAA,kBAAkB,EAEnC,EAAqB,GAAc,oBACnC,EAAa,GAAc,WAAW,aAAa,KAAK,EAKxD,EAAU,EAAA,WAAW,EAAoB,CAAU,EACnD,EAAe,EAAQ,WAAW,GAAG,EAAI,EAAU,IAAI,IAEvD,EAAQ,EAAA,SAAmB,CAC/B,SAAU,CAAC,wBAAyB,EAAgB,CAAY,EAChE,QAAS,SAAY,CAKnB,IAAM,GAAa,MAJC,EAAA,2BAClB,EACA,CACF,GACyB,IAAI,CAAa,EAAE,OAAO,OAAO,EAC1D,OAAO,MAAM,KAAK,IAAI,IAAI,CAAU,CAAC,EAAE,MAAM,EAAG,CAAS,CAC3D,EACA,QAAS,GAAW,GAAkB,CAAC,CAAC,EACxC,MAAO,GACP,UAAW,IAAO,GAClB,OAAQ,IAAO,GAAK,EACpB,KAAM,CAAE,aAAc,EAAK,CAC7B,CAAC,EAED,MAAO,CAAE,KAAM,EAAM,KAAM,UAAW,EAAM,SAAU,CACxD,CAoBA,SAAgB,GAA0C,CAMxD,IAAM,GAAA,EAAA,EAAA,sBAJJ,EAAA,uBACA,EAAA,YACA,EAAA,WAEc,EAAS,OAAO,QAAQ,OAAS,QAE3C,EAAQ,EAAuB,CAAC,CAAO,EACvC,EAAQ,EAAuB,CAAO,EAE5C,OAAO,EAAU,EAAQ,CAC3B"}
|
|
@@ -5,9 +5,19 @@ export interface WorkspaceFilesResult {
|
|
|
5
5
|
/**
|
|
6
6
|
* Lists the files shown in the Files tab for the active conversation.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* Both backends enumerate the full workspace tree. Local backends run bash
|
|
9
|
+
* `find` directly against the agent-server; cloud backends call the cloud
|
|
10
|
+
* API's first-class file-listing endpoint, which runs the same `find`
|
|
11
|
+
* server-side on the conversation's runtime (see `useCloudWorkspaceFiles`).
|
|
12
|
+
*
|
|
13
|
+
* Cloud detection reads the backend-registry store (via `useSyncExternalStore`)
|
|
14
|
+
* rather than the `ActiveBackendProvider` context. The transport layer that
|
|
15
|
+
* actually issues the requests — `executeCommand`, `getGitChanges`, the cloud
|
|
16
|
+
* file-read — all branch on the *store* (`getActiveBackend()`), so the Files
|
|
17
|
+
* tab must use the same source. Reading the context here can disagree with the
|
|
18
|
+
* store (its `useActiveBackend` fallback synthesizes a *local* backend when the
|
|
19
|
+
* provider isn't in scope), which would run the local bash path against a cloud
|
|
20
|
+
* backend: `executeCommand` then POSTs to the removed `/api/cloud-proxy` (405)
|
|
21
|
+
* and the cloud `/files` call never fires.
|
|
12
22
|
*/
|
|
13
23
|
export declare function useWorkspaceFiles(): WorkspaceFilesResult;
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
1
|
+
import { useOptionalConversationId as e } from "../use-conversation-id.js";
|
|
2
|
+
import { getSnapshot as t, subscribeActiveBackend as n } from "../../api/backend-registry/active-store.js";
|
|
3
|
+
import { useQuery as r } from "../../node_modules/@tanstack/react-query/build/modern/useQuery.js";
|
|
4
|
+
import { listCloudConversationFiles as i } from "../../api/cloud/conversation-service.api.js";
|
|
5
|
+
import { useActiveConversation as a } from "./use-active-conversation.js";
|
|
6
|
+
import { useRuntimeIsReady as o } from "../use-runtime-is-ready.js";
|
|
7
|
+
import s from "../../api/runtime-service/agent-server-runtime-service.js";
|
|
8
|
+
import { getGitPath as c } from "../../utils/get-git-path.js";
|
|
9
|
+
import { useSyncExternalStore as l } from "react";
|
|
8
10
|
//#region src/hooks/query/use-workspace-files.ts
|
|
9
|
-
var
|
|
11
|
+
var u = 2e3, d = [
|
|
10
12
|
".git",
|
|
11
13
|
"node_modules",
|
|
12
14
|
".venv",
|
|
@@ -22,28 +24,28 @@ var s = 2e3, c = [
|
|
|
22
24
|
".parcel-cache",
|
|
23
25
|
"target"
|
|
24
26
|
];
|
|
25
|
-
function
|
|
26
|
-
return `find . \\( ${
|
|
27
|
+
function f() {
|
|
28
|
+
return `find . \\( ${d.map((e) => `-name '${e}' -prune`).join(" -o ")} \\) -o -type f -print 2>/dev/null | sort | head -n ${u}`;
|
|
27
29
|
}
|
|
28
|
-
function
|
|
30
|
+
function p(e) {
|
|
29
31
|
return e.startsWith("./") ? e.slice(2) : e;
|
|
30
32
|
}
|
|
31
|
-
function
|
|
32
|
-
let { data:
|
|
33
|
+
function m(e) {
|
|
34
|
+
let { data: t } = a(), n = o(), i = t?.id, c = t?.conversation_url, l = t?.session_api_key, d = t?.workspace?.working_dir?.trim(), m = r({
|
|
33
35
|
queryKey: [
|
|
34
36
|
"workspace-files",
|
|
37
|
+
i,
|
|
35
38
|
c,
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
p
|
|
39
|
+
l,
|
|
40
|
+
d
|
|
39
41
|
],
|
|
40
42
|
queryFn: async () => {
|
|
41
|
-
let e = await
|
|
43
|
+
let e = await s.executeCommand(c, l, f(), d, 30);
|
|
42
44
|
if (e.exit_code !== 0) throw Error(e.stderr?.trim() || "Failed to list workspace files");
|
|
43
|
-
let t = e.stdout.split(/\r?\n/).map((e) => e.trim()).filter(Boolean).map(
|
|
44
|
-
return Array.from(new Set(t)).slice(0,
|
|
45
|
+
let t = e.stdout.split(/\r?\n/).map((e) => e.trim()).filter(Boolean).map(p);
|
|
46
|
+
return Array.from(new Set(t)).slice(0, u);
|
|
45
47
|
},
|
|
46
|
-
enabled:
|
|
48
|
+
enabled: e && n && !!i && !!d,
|
|
47
49
|
retry: !1,
|
|
48
50
|
staleTime: 1e3 * 30,
|
|
49
51
|
gcTime: 1e3 * 60 * 5,
|
|
@@ -54,22 +56,33 @@ function d(t) {
|
|
|
54
56
|
isLoading: m.isLoading
|
|
55
57
|
};
|
|
56
58
|
}
|
|
57
|
-
function
|
|
58
|
-
let
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
59
|
+
function h(t) {
|
|
60
|
+
let { conversationId: n } = e(), { data: s } = a(), l = o(), d = s?.selected_repository, f = s?.workspace?.working_dir?.trim(), m = c(d, f), h = m.startsWith("/") ? m : `/${m}`, g = r({
|
|
61
|
+
queryKey: [
|
|
62
|
+
"workspace-files-cloud",
|
|
63
|
+
n,
|
|
64
|
+
h
|
|
65
|
+
],
|
|
66
|
+
queryFn: async () => {
|
|
67
|
+
let e = (await i(n, h)).map(p).filter(Boolean);
|
|
68
|
+
return Array.from(new Set(e)).slice(0, u);
|
|
69
|
+
},
|
|
70
|
+
enabled: t && l && !!n,
|
|
71
|
+
retry: !1,
|
|
72
|
+
staleTime: 1e3 * 30,
|
|
73
|
+
gcTime: 1e3 * 60 * 5,
|
|
74
|
+
meta: { disableToast: !0 }
|
|
75
|
+
});
|
|
63
76
|
return {
|
|
64
|
-
data:
|
|
65
|
-
isLoading:
|
|
77
|
+
data: g.data,
|
|
78
|
+
isLoading: g.isLoading
|
|
66
79
|
};
|
|
67
80
|
}
|
|
68
|
-
function
|
|
69
|
-
let
|
|
70
|
-
return
|
|
81
|
+
function g() {
|
|
82
|
+
let e = l(n, t, t).active.backend.kind === "cloud", r = m(!e), i = h(e);
|
|
83
|
+
return e ? i : r;
|
|
71
84
|
}
|
|
72
85
|
//#endregion
|
|
73
|
-
export {
|
|
86
|
+
export { g as useWorkspaceFiles };
|
|
74
87
|
|
|
75
88
|
//# sourceMappingURL=use-workspace-files.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-workspace-files.js","names":[],"sources":["../../../src/hooks/query/use-workspace-files.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"use-workspace-files.js","names":[],"sources":["../../../src/hooks/query/use-workspace-files.ts"],"sourcesContent":["import { useSyncExternalStore } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport AgentServerRuntimeService from \"#/api/runtime-service/agent-server-runtime-service\";\nimport { listCloudConversationFiles } from \"#/api/cloud/conversation-service.api\";\nimport {\n getSnapshot,\n subscribeActiveBackend,\n} from \"#/api/backend-registry/active-store\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useOptionalConversationId } from \"#/hooks/use-conversation-id\";\nimport { useRuntimeIsReady } from \"#/hooks/use-runtime-is-ready\";\nimport { getGitPath } from \"#/utils/get-git-path\";\n\n// Cap the number of files we render so a giant repo doesn't freeze the UI.\nconst MAX_FILES = 2000;\n\nexport interface WorkspaceFilesResult {\n data: string[] | undefined;\n isLoading: boolean;\n}\n\n// Directory names that we never want to descend into when listing files.\nconst EXCLUDED_DIRS = [\n \".git\",\n \"node_modules\",\n \".venv\",\n \"venv\",\n \"__pycache__\",\n \"dist\",\n \"build\",\n \".next\",\n \".cache\",\n \".pytest_cache\",\n \".mypy_cache\",\n \".turbo\",\n \".parcel-cache\",\n \"target\",\n];\n\n// Build a `find` invocation that lists files relative to the workspace root.\nfunction buildListCommand(): string {\n const pruneExpr = EXCLUDED_DIRS.map((dir) => `-name '${dir}' -prune`).join(\n \" -o \",\n );\n return `find . \\\\( ${pruneExpr} \\\\) -o -type f -print 2>/dev/null | sort | head -n ${MAX_FILES}`;\n}\n\nfunction normalizePath(path: string): string {\n // Strip a leading \"./\" so paths render cleanly in the UI.\n return path.startsWith(\"./\") ? path.slice(2) : path;\n}\n\n/**\n * Local-backend listing: enumerate every regular file beneath the active\n * conversation's working directory via `find` over the agent-server's\n * `/api/bash/execute_bash_command`, excluding common heavy/build directories.\n * Returns paths relative to the working dir (e.g. `src/index.html`).\n *\n * Local only: the browser can't drive `/api/bash/execute_bash_command` on a\n * cloud runtime (no CORS, and the `/api/cloud-proxy` hop was removed). Cloud\n * backends hit a first-class cloud API listing endpoint instead — see\n * `useCloudWorkspaceFiles`.\n */\nfunction useLocalWorkspaceFiles(enabled: boolean): WorkspaceFilesResult {\n const { data: conversation } = useActiveConversation();\n const runtimeIsReady = useRuntimeIsReady();\n\n const conversationId = conversation?.id;\n const conversationUrl = conversation?.conversation_url;\n const sessionApiKey = conversation?.session_api_key;\n const workingDir = conversation?.workspace?.working_dir?.trim();\n\n const query = useQuery<string[]>({\n queryKey: [\n \"workspace-files\",\n conversationId,\n conversationUrl,\n sessionApiKey,\n workingDir,\n ],\n queryFn: async () => {\n const result = await AgentServerRuntimeService.executeCommand(\n conversationUrl,\n sessionApiKey,\n buildListCommand(),\n workingDir,\n 30,\n );\n\n if (result.exit_code !== 0) {\n throw new Error(\n result.stderr?.trim() || \"Failed to list workspace files\",\n );\n }\n\n const lines = result.stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map(normalizePath);\n\n // Defensive: keep results unique and bounded.\n return Array.from(new Set(lines)).slice(0, MAX_FILES);\n },\n enabled: enabled && runtimeIsReady && !!conversationId && !!workingDir,\n retry: false,\n staleTime: 1000 * 30,\n gcTime: 1000 * 60 * 5,\n meta: { disableToast: true },\n });\n\n return { data: query.data, isLoading: query.isLoading };\n}\n\n/**\n * Cloud-backend listing: enumerate the full workspace tree via the cloud API's\n * first-class `GET /api/v1/app-conversations/{id}/files` endpoint, which\n * resolves the conversation's runtime and runs the same bounded `find`\n * server-side (see enterprise `list_conversation_files`). This is the same\n * server-side runtime-hop transport the git-changes/diff and single-file read\n * already use, so it works without CORS or the removed `/api/cloud-proxy` hop.\n *\n * Unlike the previous git-changes-based approach, this returns unchanged\n * tracked files too, so a conversation attached to a large existing repo shows\n * the whole tree — matching the local-backend experience. Paths come back\n * relative to the working dir (e.g. `src/index.html`).\n */\nfunction useCloudWorkspaceFiles(enabled: boolean): WorkspaceFilesResult {\n // Source the id from the route (like the diff/commits cloud hooks), NOT from\n // `useActiveConversation().data.id`: the cloud API listing call only needs\n // the id, and gating on the batch-get query's data would keep the query\n // disabled — and never fire — whenever that data is null or still loading.\n const { conversationId } = useOptionalConversationId();\n const { data: conversation } = useActiveConversation();\n const runtimeIsReady = useRuntimeIsReady();\n\n const selectedRepository = conversation?.selected_repository;\n const workingDir = conversation?.workspace?.working_dir?.trim();\n\n // Anchor against an absolute workspace path the same way the diff view and\n // single-file read do (`getGitPath` defaults to a relative convention; the\n // cloud runtime needs an absolute path).\n const gitPath = getGitPath(selectedRepository, workingDir);\n const absolutePath = gitPath.startsWith(\"/\") ? gitPath : `/${gitPath}`;\n\n const query = useQuery<string[]>({\n queryKey: [\"workspace-files-cloud\", conversationId, absolutePath],\n queryFn: async () => {\n const files = await listCloudConversationFiles(\n conversationId!,\n absolutePath,\n );\n const normalized = files.map(normalizePath).filter(Boolean);\n return Array.from(new Set(normalized)).slice(0, MAX_FILES);\n },\n enabled: enabled && runtimeIsReady && !!conversationId,\n retry: false,\n staleTime: 1000 * 30,\n gcTime: 1000 * 60 * 5,\n meta: { disableToast: true },\n });\n\n return { data: query.data, isLoading: query.isLoading };\n}\n\n/**\n * Lists the files shown in the Files tab for the active conversation.\n *\n * Both backends enumerate the full workspace tree. Local backends run bash\n * `find` directly against the agent-server; cloud backends call the cloud\n * API's first-class file-listing endpoint, which runs the same `find`\n * server-side on the conversation's runtime (see `useCloudWorkspaceFiles`).\n *\n * Cloud detection reads the backend-registry store (via `useSyncExternalStore`)\n * rather than the `ActiveBackendProvider` context. The transport layer that\n * actually issues the requests — `executeCommand`, `getGitChanges`, the cloud\n * file-read — all branch on the *store* (`getActiveBackend()`), so the Files\n * tab must use the same source. Reading the context here can disagree with the\n * store (its `useActiveBackend` fallback synthesizes a *local* backend when the\n * provider isn't in scope), which would run the local bash path against a cloud\n * backend: `executeCommand` then POSTs to the removed `/api/cloud-proxy` (405)\n * and the cloud `/files` call never fires.\n */\nexport function useWorkspaceFiles(): WorkspaceFilesResult {\n const snapshot = useSyncExternalStore(\n subscribeActiveBackend,\n getSnapshot,\n getSnapshot,\n );\n const isCloud = snapshot.active.backend.kind === \"cloud\";\n\n const local = useLocalWorkspaceFiles(!isCloud);\n const cloud = useCloudWorkspaceFiles(isCloud);\n\n return isCloud ? cloud : local;\n}\n"],"mappings":";;;;;;;;;;AAeA,IAAM,IAAY,KAQZ,IAAgB;CACpB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAGA,SAAS,IAA2B;CAIlC,OAAO,cAHW,EAAc,KAAK,MAAQ,UAAU,EAAI,SAAS,EAAE,KACpE,MAEmB,EAAU,sDAAsD;AACvF;AAEA,SAAS,EAAc,GAAsB;CAE3C,OAAO,EAAK,WAAW,IAAI,IAAI,EAAK,MAAM,CAAC,IAAI;AACjD;AAaA,SAAS,EAAuB,GAAwC;CACtE,IAAM,EAAE,MAAM,MAAiB,EAAsB,GAC/C,IAAiB,EAAkB,GAEnC,IAAiB,GAAc,IAC/B,IAAkB,GAAc,kBAChC,IAAgB,GAAc,iBAC9B,IAAa,GAAc,WAAW,aAAa,KAAK,GAExD,IAAQ,EAAmB;EAC/B,UAAU;GACR;GACA;GACA;GACA;GACA;EACF;EACA,SAAS,YAAY;GACnB,IAAM,IAAS,MAAM,EAA0B,eAC7C,GACA,GACA,EAAiB,GACjB,GACA,EACF;GAEA,IAAI,EAAO,cAAc,GACvB,MAAU,MACR,EAAO,QAAQ,KAAK,KAAK,gCAC3B;GAGF,IAAM,IAAQ,EAAO,OAClB,MAAM,OAAO,EACb,KAAK,MAAS,EAAK,KAAK,CAAC,EACzB,OAAO,OAAO,EACd,IAAI,CAAa;GAGpB,OAAO,MAAM,KAAK,IAAI,IAAI,CAAK,CAAC,EAAE,MAAM,GAAG,CAAS;EACtD;EACA,SAAS,KAAW,KAAkB,CAAC,CAAC,KAAkB,CAAC,CAAC;EAC5D,OAAO;EACP,WAAW,MAAO;EAClB,QAAQ,MAAO,KAAK;EACpB,MAAM,EAAE,cAAc,GAAK;CAC7B,CAAC;CAED,OAAO;EAAE,MAAM,EAAM;EAAM,WAAW,EAAM;CAAU;AACxD;AAeA,SAAS,EAAuB,GAAwC;CAKtE,IAAM,EAAE,sBAAmB,EAA0B,GAC/C,EAAE,MAAM,MAAiB,EAAsB,GAC/C,IAAiB,EAAkB,GAEnC,IAAqB,GAAc,qBACnC,IAAa,GAAc,WAAW,aAAa,KAAK,GAKxD,IAAU,EAAW,GAAoB,CAAU,GACnD,IAAe,EAAQ,WAAW,GAAG,IAAI,IAAU,IAAI,KAEvD,IAAQ,EAAmB;EAC/B,UAAU;GAAC;GAAyB;GAAgB;EAAY;EAChE,SAAS,YAAY;GAKnB,IAAM,KAAa,MAJC,EAClB,GACA,CACF,GACyB,IAAI,CAAa,EAAE,OAAO,OAAO;GAC1D,OAAO,MAAM,KAAK,IAAI,IAAI,CAAU,CAAC,EAAE,MAAM,GAAG,CAAS;EAC3D;EACA,SAAS,KAAW,KAAkB,CAAC,CAAC;EACxC,OAAO;EACP,WAAW,MAAO;EAClB,QAAQ,MAAO,KAAK;EACpB,MAAM,EAAE,cAAc,GAAK;CAC7B,CAAC;CAED,OAAO;EAAE,MAAM,EAAM;EAAM,WAAW,EAAM;CAAU;AACxD;AAoBA,SAAgB,IAA0C;CAMxD,IAAM,IALW,EACf,GACA,GACA,CAEc,EAAS,OAAO,QAAQ,SAAS,SAE3C,IAAQ,EAAuB,CAAC,CAAO,GACvC,IAAQ,EAAuB,CAAO;CAE5C,OAAO,IAAU,IAAQ;AAC3B"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../api/agent-server-compatibility.cjs"),n=require("../services/telemetry-context.cjs"),r=require("../services/telemetry.cjs"),i=require("../contexts/active-backend-context.cjs"),a=require("./query/use-automation-sdk-version.cjs");let o=require("react");o=e.__toESM(o,1);var s=()=>{let{backend:e}=i.useActiveBackend(),s=a.useAutomationSdkVersion(),c=o.default.useCallback(()=>({backendKind:e.kind,agentServerVersion:e.kind===`local`?t.getCachedAgentServerVersion(e.host):null,automationSdkVersion:s??null}),[s,e.host,e.kind]);o.default.useEffect(()=>{r.setTelemetryBackendContext(c())},[c]);let l={current_url:window.location.href},u=(e,t={})=>{r.setTelemetryBackendContext(c()),r.trackEvent(e,{...l,...t})};return{trackLoginButtonClick:({provider:e})=>{u(`login_button_clicked`,{provider:e})},trackConversationCreated:({conversationId:e,taskId:t,hasRepository:n,gitProvider:r,hasWorkspace:i,workspaceMode:a,hasInitialQuery:o,agentType:s,hasParentConversation:c,entryPoint:l})=>{u(`conversation_start_requested`,{conversation_id:e,task_id:t,is_start_task:e.startsWith(`task-`),has_repository:n,git_provider:r,has_workspace:i,workspace_mode:a,has_initial_query:o,agent_type:s,has_parent_conversation:c,entry_point:l})},trackPushButtonClick:()=>{u(`push_button_clicked`)},trackPullButtonClick:()=>{u(`pull_button_clicked`)},trackCreatePrButtonClick:()=>{u(`create_pr_button_clicked`)},trackUserSignupCompleted:()=>{u(`user_signup_completed`,{signup_timestamp:new Date().toISOString()})},trackPrebuiltAutomationEnabled:({automationId:e,automationName:t,automationCategory:n})=>{u(`prebuilt_automation_enabled`,{automation_id:e,automation_name:t,automation_category:n})},trackAutomationSetupOpened:({automationId:e})=>{u(`automation_setup_opened`,{automation_id:e})},trackAutomationSetupValidated:({automationId:e})=>{u(`automation_setup_validated`,{automation_id:e})},trackAutomationSetupCreated:({automationId:e,setupMode:t})=>{u(`automation_setup_created`,{automation_id:e,setup_mode:t})},trackAutomationSetupFailed:({automationId:e,setupMode:t})=>{u(`automation_setup_failed`,{automation_id:e,setup_mode:t})},trackInitialQuerySubmitted:({entryPoint:e,queryCharacterLength:t,replayJsonSize:n})=>{u(`initial_query_submitted`,{entry_point:e,query_character_length:t,replay_json_size:n})},trackUserMessageSent:({sessionMessageCount:e,currentMessageLength:t})=>{u(`user_message_sent`,{session_message_count:e,current_message_length:t})},trackDownloadVsCodeButtonClicked:()=>{u(`download_via_vscode_button_clicked`)},trackSettingsSaved:({llmModel:e,llmApiKeySet:t,searchApiKeySet:n,remoteRuntimeResourceFactor:r})=>{u(`settings_saved`,{LLM_MODEL:e,LLM_API_KEY_SET:t,SEARCH_API_KEY_SET:n,REMOTE_RUNTIME_RESOURCE_FACTOR:r})},trackMcpConfigUpdated:({sseServersCount:e,stdioServersCount:t})=>{u(`mcp_config_updated`,{has_mcp_config:!0,sse_servers_count:e,stdio_servers_count:t})},trackDownloadTrajectoryButtonClicked:()=>{u(`download_trajectory_button_clicked`)},trackConversationExported:e=>{u(`conversation_exported`,{format:e})},trackAutomationCreatedButton:({backendKind:e})=>{u(`automation_created_button`,{backend_kind:e})},trackAutomationExecuted:({backendKind:e})=>{u(`automation_executed`,{backend_kind:e})},trackAutomationDeleted:({backendKind:e})=>{u(`automation_deleted`,{backend_kind:e})},trackAutomationDisableButton:({backendKind:e})=>{u(`automation_disable_button`,{backend_kind:e})},trackAutomationEdited:({backendKind:e})=>{u(`automation_edited`,{backend_kind:e})},trackAutomationExported:({backendKind:e})=>{u(`automation_exported`,{backend_kind:e})},trackAutomationActivityLogExported:({backendKind:e,format:t})=>{u(`automation_activity_log_exported`,{backend_kind:e,format:t})},trackAutomationImported:({backendKind:e})=>{u(`automation_imported`,{backend_kind:e})},trackBackendAdded:({backendKind:e,connectionMethod:t,hasApiKey:r,source:i,agentServerVersion:a,backendVersion:o})=>{u(`backend_added`,{...n.getBackendTelemetryProperties({backendKind:e,agentServerVersion:a,backendVersion:o,connectionMethod:t}),has_api_key:r,source:i})},trackOnboardingStarted:()=>{u(`onboarding_started`)},trackOnboardingStepViewed:({step:e,stepIndex:t,totalSteps:n,agent:r})=>{u(`onboarding_step_viewed`,{step:e,step_index:t,total_steps:n,agent:r})},trackOnboardingCompleted:({agent:e})=>{u(`onboarding_completed`,{agent:e})},trackOnboardingSkipped:({step:e,stepIndex:t,totalSteps:n,agent:r})=>{u(`onboarding_skipped`,{step:e,step_index:t,total_steps:n,agent:r})}}};exports.useTracking=s;
|
|
1
|
+
const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../api/agent-server-compatibility.cjs"),n=require("../services/telemetry-context.cjs"),r=require("../services/telemetry.cjs"),i=require("../contexts/active-backend-context.cjs"),a=require("./query/use-automation-sdk-version.cjs");let o=require("react");o=e.__toESM(o,1);var s=()=>{let{backend:e}=i.useActiveBackend(),s=a.useAutomationSdkVersion(),c=o.default.useCallback(()=>({backendKind:e.kind,agentServerVersion:e.kind===`local`?t.getCachedAgentServerVersion(e.host):null,automationSdkVersion:s??null}),[s,e.host,e.kind]);o.default.useEffect(()=>{r.setTelemetryBackendContext(c())},[c]);let l={current_url:window.location.href},u=(e,t={})=>{r.setTelemetryBackendContext(c()),r.trackEvent(e,{...l,...t})};return{trackLoginButtonClick:({provider:e})=>{u(`login_button_clicked`,{provider:e})},trackConversationCreated:({conversationId:e,taskId:t,hasRepository:n,gitProvider:r,hasWorkspace:i,workspaceMode:a,hasInitialQuery:o,agentType:s,hasParentConversation:c,entryPoint:l})=>{u(`conversation_start_requested`,{conversation_id:e,task_id:t,is_start_task:e.startsWith(`task-`),has_repository:n,git_provider:r,has_workspace:i,workspace_mode:a,has_initial_query:o,agent_type:s,has_parent_conversation:c,entry_point:l})},trackPushButtonClick:()=>{u(`push_button_clicked`)},trackPullButtonClick:()=>{u(`pull_button_clicked`)},trackCreatePrButtonClick:()=>{u(`create_pr_button_clicked`)},trackUserSignupCompleted:()=>{u(`user_signup_completed`,{signup_timestamp:new Date().toISOString()})},trackPrebuiltAutomationEnabled:({automationId:e,automationName:t,automationCategory:n})=>{u(`prebuilt_automation_enabled`,{automation_id:e,automation_name:t,automation_category:n})},trackAutomationSetupOpened:({automationId:e})=>{u(`automation_setup_opened`,{automation_id:e})},trackAutomationSetupValidated:({automationId:e})=>{u(`automation_setup_validated`,{automation_id:e})},trackAutomationSetupCreated:({automationId:e,setupMode:t})=>{u(`automation_setup_created`,{automation_id:e,setup_mode:t})},trackAutomationSetupFailed:({automationId:e,setupMode:t})=>{u(`automation_setup_failed`,{automation_id:e,setup_mode:t})},trackInitialQuerySubmitted:({entryPoint:e,queryCharacterLength:t,replayJsonSize:n})=>{u(`initial_query_submitted`,{entry_point:e,query_character_length:t,replay_json_size:n})},trackUserMessageSent:({sessionMessageCount:e,currentMessageLength:t})=>{u(`user_message_sent`,{session_message_count:e,current_message_length:t})},trackDownloadVsCodeButtonClicked:()=>{u(`download_via_vscode_button_clicked`)},trackSettingsSaved:({llmModel:e,llmApiKeySet:t,searchApiKeySet:n,remoteRuntimeResourceFactor:r})=>{u(`settings_saved`,{LLM_MODEL:e,LLM_API_KEY_SET:t,SEARCH_API_KEY_SET:n,REMOTE_RUNTIME_RESOURCE_FACTOR:r})},trackMcpConfigUpdated:({sseServersCount:e,stdioServersCount:t})=>{u(`mcp_config_updated`,{has_mcp_config:!0,sse_servers_count:e,stdio_servers_count:t})},trackDownloadTrajectoryButtonClicked:()=>{u(`download_trajectory_button_clicked`)},trackConversationExported:e=>{u(`conversation_exported`,{format:e})},trackAutomationCreatedButton:({backendKind:e})=>{u(`automation_created_button`,{backend_kind:e})},trackAutomationExecuted:({backendKind:e})=>{u(`automation_executed`,{backend_kind:e})},trackAutomationDeleted:({backendKind:e})=>{u(`automation_deleted`,{backend_kind:e})},trackAutomationDisableButton:({backendKind:e})=>{u(`automation_disable_button`,{backend_kind:e})},trackAutomationEdited:({backendKind:e})=>{u(`automation_edited`,{backend_kind:e})},trackAutomationExported:({backendKind:e})=>{u(`automation_exported`,{backend_kind:e})},trackAutomationActivityLogExported:({backendKind:e,format:t})=>{u(`automation_activity_log_exported`,{backend_kind:e,format:t})},trackAutomationImported:({backendKind:e})=>{u(`automation_imported`,{backend_kind:e})},trackGitSyncConfigUpdated:({backendKind:e})=>{u(`git_sync_config_updated`,{backend_kind:e})},trackGitSyncTriggered:({backendKind:e})=>{u(`git_sync_triggered`,{backend_kind:e})},trackBackendAdded:({backendKind:e,connectionMethod:t,hasApiKey:r,source:i,agentServerVersion:a,backendVersion:o})=>{u(`backend_added`,{...n.getBackendTelemetryProperties({backendKind:e,agentServerVersion:a,backendVersion:o,connectionMethod:t}),has_api_key:r,source:i})},trackOnboardingStarted:()=>{u(`onboarding_started`)},trackOnboardingStepViewed:({step:e,stepIndex:t,totalSteps:n,agent:r})=>{u(`onboarding_step_viewed`,{step:e,step_index:t,total_steps:n,agent:r})},trackOnboardingCompleted:({agent:e})=>{u(`onboarding_completed`,{agent:e})},trackOnboardingSkipped:({step:e,stepIndex:t,totalSteps:n,agent:r})=>{u(`onboarding_skipped`,{step:e,step_index:t,total_steps:n,agent:r})}}};exports.useTracking=s;
|
|
2
2
|
//# sourceMappingURL=use-tracking.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tracking.cjs","names":[],"sources":["../../src/hooks/use-tracking.ts"],"sourcesContent":["import React from \"react\";\nimport { Provider } from \"#/types/settings\";\nimport type { BackendKind } from \"#/api/backend-registry/types\";\nimport type { WorkspaceMode } from \"#/api/conversation-metadata-store\";\nimport type { CloudConnectionSource } from \"#/services/cloud-funnel-analytics\";\nimport { getCachedAgentServerVersion } from \"#/api/agent-server-compatibility\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useAutomationSdkVersion } from \"#/hooks/query/use-automation-sdk-version\";\nimport {\n type BackendConnectionMethod,\n getBackendTelemetryProperties,\n} from \"#/services/telemetry-context\";\nimport { setTelemetryBackendContext, trackEvent } from \"#/services/telemetry\";\n\n/**\n * Hook that provides tracking functions with automatic data collection\n * from available hooks (settings, etc.)\n *\n * All events require explicit user consent. The shared PostHog client enforces\n * the canonical consent configured by telemetry.ts; this hook must not gate on\n * backend settings because they can be stale while a backend changes.\n */\nexport const useTracking = () => {\n const { backend } = useActiveBackend();\n const automationSdkVersion = useAutomationSdkVersion();\n\n const getBackendTelemetryContext = React.useCallback(\n () => ({\n backendKind: backend.kind,\n agentServerVersion:\n backend.kind === \"local\"\n ? getCachedAgentServerVersion(backend.host)\n : null,\n automationSdkVersion: automationSdkVersion ?? null,\n }),\n [automationSdkVersion, backend.host, backend.kind],\n );\n\n React.useEffect(() => {\n setTelemetryBackendContext(getBackendTelemetryContext());\n }, [getBackendTelemetryContext]);\n\n // Common properties included in all tracking events\n const commonProperties = {\n current_url: window.location.href,\n };\n\n /**\n * PostHog enforces the canonical consent state configured by telemetry.ts.\n * Backend settings are not a capture gate because they can be stale while a\n * backend is being added or switched.\n */\n const track = (event: string, properties: Record<string, unknown> = {}) => {\n setTelemetryBackendContext(getBackendTelemetryContext());\n void trackEvent(event, { ...commonProperties, ...properties });\n };\n\n const trackLoginButtonClick = ({ provider }: { provider: Provider }) => {\n track(\"login_button_clicked\", { provider });\n };\n\n const trackConversationCreated = ({\n conversationId,\n taskId,\n hasRepository,\n gitProvider,\n hasWorkspace,\n workspaceMode,\n hasInitialQuery,\n agentType,\n hasParentConversation,\n entryPoint,\n }: {\n conversationId: string;\n taskId?: string;\n hasRepository: boolean;\n gitProvider?: Provider;\n hasWorkspace: boolean;\n workspaceMode?: WorkspaceMode;\n hasInitialQuery: boolean;\n agentType?: \"default\" | \"plan\";\n hasParentConversation: boolean;\n entryPoint?: string;\n }) => {\n track(\"conversation_start_requested\", {\n conversation_id: conversationId,\n task_id: taskId,\n is_start_task: conversationId.startsWith(\"task-\"),\n has_repository: hasRepository,\n git_provider: gitProvider,\n has_workspace: hasWorkspace,\n workspace_mode: workspaceMode,\n has_initial_query: hasInitialQuery,\n agent_type: agentType,\n has_parent_conversation: hasParentConversation,\n entry_point: entryPoint,\n });\n };\n\n const trackPushButtonClick = () => {\n track(\"push_button_clicked\");\n };\n\n const trackPullButtonClick = () => {\n track(\"pull_button_clicked\");\n };\n\n const trackCreatePrButtonClick = () => {\n track(\"create_pr_button_clicked\");\n };\n\n const trackUserSignupCompleted = () => {\n track(\"user_signup_completed\", {\n signup_timestamp: new Date().toISOString(),\n });\n };\n\n const trackPrebuiltAutomationEnabled = ({\n automationId,\n automationName,\n automationCategory,\n }: {\n automationId?: string;\n automationName: string;\n automationCategory?: string;\n }) => {\n track(\"prebuilt_automation_enabled\", {\n automation_id: automationId,\n automation_name: automationName,\n automation_category: automationCategory,\n });\n };\n\n /**\n * The setup funnel: opened → validated → created, or failed.\n *\n * A manifest declares no analytics of its own, so the stages are the same for\n * every entry and only the id it carries varies.\n */\n const trackAutomationSetupOpened = ({\n automationId,\n }: {\n automationId: string;\n }) => {\n track(\"automation_setup_opened\", { automation_id: automationId });\n };\n\n const trackAutomationSetupValidated = ({\n automationId,\n }: {\n automationId: string;\n }) => {\n track(\"automation_setup_validated\", { automation_id: automationId });\n };\n\n const trackAutomationSetupCreated = ({\n automationId,\n setupMode,\n }: {\n automationId: string;\n setupMode: string;\n }) => {\n track(\"automation_setup_created\", {\n automation_id: automationId,\n setup_mode: setupMode,\n });\n };\n\n const trackAutomationSetupFailed = ({\n automationId,\n setupMode,\n }: {\n automationId: string;\n setupMode: string;\n }) => {\n track(\"automation_setup_failed\", {\n automation_id: automationId,\n setup_mode: setupMode,\n });\n };\n\n const trackInitialQuerySubmitted = ({\n entryPoint,\n queryCharacterLength,\n replayJsonSize,\n }: {\n entryPoint: string;\n queryCharacterLength: number;\n replayJsonSize?: number;\n }) => {\n track(\"initial_query_submitted\", {\n entry_point: entryPoint,\n query_character_length: queryCharacterLength,\n replay_json_size: replayJsonSize,\n });\n };\n\n const trackUserMessageSent = ({\n sessionMessageCount,\n currentMessageLength,\n }: {\n sessionMessageCount: number;\n currentMessageLength: number;\n }) => {\n track(\"user_message_sent\", {\n session_message_count: sessionMessageCount,\n current_message_length: currentMessageLength,\n });\n };\n\n const trackDownloadVsCodeButtonClicked = () => {\n track(\"download_via_vscode_button_clicked\");\n };\n\n const trackSettingsSaved = ({\n llmModel,\n llmApiKeySet,\n searchApiKeySet,\n remoteRuntimeResourceFactor,\n }: {\n llmModel: unknown;\n llmApiKeySet: \"SET\" | \"UNSET\";\n searchApiKeySet: \"SET\" | \"UNSET\";\n remoteRuntimeResourceFactor?: unknown;\n }) => {\n track(\"settings_saved\", {\n LLM_MODEL: llmModel,\n LLM_API_KEY_SET: llmApiKeySet,\n SEARCH_API_KEY_SET: searchApiKeySet,\n REMOTE_RUNTIME_RESOURCE_FACTOR: remoteRuntimeResourceFactor,\n });\n };\n\n const trackMcpConfigUpdated = ({\n sseServersCount,\n stdioServersCount,\n }: {\n sseServersCount: number;\n stdioServersCount: number;\n }) => {\n track(\"mcp_config_updated\", {\n has_mcp_config: true,\n sse_servers_count: sseServersCount,\n stdio_servers_count: stdioServersCount,\n });\n };\n\n const trackDownloadTrajectoryButtonClicked = () => {\n track(\"download_trajectory_button_clicked\");\n };\n\n const trackConversationExported = (format: \"markdown\" | \"html\") => {\n track(\"conversation_exported\", { format });\n };\n\n const trackAutomationCreatedButton = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_created_button\", { backend_kind: backendKind });\n };\n\n const trackAutomationExecuted = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_executed\", { backend_kind: backendKind });\n };\n\n const trackAutomationDeleted = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_deleted\", { backend_kind: backendKind });\n };\n\n const trackAutomationDisableButton = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_disable_button\", { backend_kind: backendKind });\n };\n\n const trackAutomationEdited = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_edited\", { backend_kind: backendKind });\n };\n\n const trackAutomationExported = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_exported\", { backend_kind: backendKind });\n };\n\n const trackAutomationActivityLogExported = ({\n backendKind,\n format,\n }: {\n backendKind: BackendKind;\n format: \"json\" | \"csv\";\n }) => {\n track(\"automation_activity_log_exported\", {\n backend_kind: backendKind,\n format,\n });\n };\n\n const trackAutomationImported = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_imported\", { backend_kind: backendKind });\n };\n\n const trackBackendAdded = ({\n backendKind,\n connectionMethod,\n hasApiKey,\n source,\n agentServerVersion,\n backendVersion,\n }: {\n backendKind: BackendKind;\n connectionMethod: BackendConnectionMethod;\n hasApiKey: boolean;\n source?: CloudConnectionSource;\n agentServerVersion?: string | null;\n backendVersion?: string | null;\n }) => {\n track(\"backend_added\", {\n ...getBackendTelemetryProperties({\n backendKind,\n agentServerVersion,\n backendVersion,\n connectionMethod,\n }),\n has_api_key: hasApiKey,\n source,\n });\n };\n\n const trackOnboardingStarted = () => {\n track(\"onboarding_started\");\n };\n\n const trackOnboardingStepViewed = ({\n step,\n stepIndex,\n totalSteps,\n agent,\n }: {\n step: string;\n stepIndex: number;\n totalSteps: number;\n agent: string;\n }) => {\n track(\"onboarding_step_viewed\", {\n step,\n step_index: stepIndex,\n total_steps: totalSteps,\n agent,\n });\n };\n\n const trackOnboardingCompleted = ({ agent }: { agent: string }) => {\n track(\"onboarding_completed\", { agent });\n };\n\n const trackOnboardingSkipped = ({\n step,\n stepIndex,\n totalSteps,\n agent,\n }: {\n step: string;\n stepIndex: number;\n totalSteps: number;\n agent: string;\n }) => {\n track(\"onboarding_skipped\", {\n step,\n step_index: stepIndex,\n total_steps: totalSteps,\n agent,\n });\n };\n\n return {\n trackLoginButtonClick,\n trackConversationCreated,\n trackPushButtonClick,\n trackPullButtonClick,\n trackCreatePrButtonClick,\n trackUserSignupCompleted,\n trackPrebuiltAutomationEnabled,\n trackAutomationSetupOpened,\n trackAutomationSetupValidated,\n trackAutomationSetupCreated,\n trackAutomationSetupFailed,\n trackInitialQuerySubmitted,\n trackUserMessageSent,\n trackDownloadVsCodeButtonClicked,\n trackSettingsSaved,\n trackMcpConfigUpdated,\n trackDownloadTrajectoryButtonClicked,\n trackConversationExported,\n trackAutomationCreatedButton,\n trackAutomationExecuted,\n trackAutomationDeleted,\n trackAutomationDisableButton,\n trackAutomationEdited,\n trackAutomationExported,\n trackAutomationActivityLogExported,\n trackAutomationImported,\n trackBackendAdded,\n trackOnboardingStarted,\n trackOnboardingStepViewed,\n trackOnboardingCompleted,\n trackOnboardingSkipped,\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-tracking.cjs","names":[],"sources":["../../src/hooks/use-tracking.ts"],"sourcesContent":["import React from \"react\";\nimport { Provider } from \"#/types/settings\";\nimport type { BackendKind } from \"#/api/backend-registry/types\";\nimport type { WorkspaceMode } from \"#/api/conversation-metadata-store\";\nimport type { CloudConnectionSource } from \"#/services/cloud-funnel-analytics\";\nimport { getCachedAgentServerVersion } from \"#/api/agent-server-compatibility\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useAutomationSdkVersion } from \"#/hooks/query/use-automation-sdk-version\";\nimport {\n type BackendConnectionMethod,\n getBackendTelemetryProperties,\n} from \"#/services/telemetry-context\";\nimport { setTelemetryBackendContext, trackEvent } from \"#/services/telemetry\";\n\n/**\n * Hook that provides tracking functions with automatic data collection\n * from available hooks (settings, etc.)\n *\n * All events require explicit user consent. The shared PostHog client enforces\n * the canonical consent configured by telemetry.ts; this hook must not gate on\n * backend settings because they can be stale while a backend changes.\n */\nexport const useTracking = () => {\n const { backend } = useActiveBackend();\n const automationSdkVersion = useAutomationSdkVersion();\n\n const getBackendTelemetryContext = React.useCallback(\n () => ({\n backendKind: backend.kind,\n agentServerVersion:\n backend.kind === \"local\"\n ? getCachedAgentServerVersion(backend.host)\n : null,\n automationSdkVersion: automationSdkVersion ?? null,\n }),\n [automationSdkVersion, backend.host, backend.kind],\n );\n\n React.useEffect(() => {\n setTelemetryBackendContext(getBackendTelemetryContext());\n }, [getBackendTelemetryContext]);\n\n // Common properties included in all tracking events\n const commonProperties = {\n current_url: window.location.href,\n };\n\n /**\n * PostHog enforces the canonical consent state configured by telemetry.ts.\n * Backend settings are not a capture gate because they can be stale while a\n * backend is being added or switched.\n */\n const track = (event: string, properties: Record<string, unknown> = {}) => {\n setTelemetryBackendContext(getBackendTelemetryContext());\n void trackEvent(event, { ...commonProperties, ...properties });\n };\n\n const trackLoginButtonClick = ({ provider }: { provider: Provider }) => {\n track(\"login_button_clicked\", { provider });\n };\n\n const trackConversationCreated = ({\n conversationId,\n taskId,\n hasRepository,\n gitProvider,\n hasWorkspace,\n workspaceMode,\n hasInitialQuery,\n agentType,\n hasParentConversation,\n entryPoint,\n }: {\n conversationId: string;\n taskId?: string;\n hasRepository: boolean;\n gitProvider?: Provider;\n hasWorkspace: boolean;\n workspaceMode?: WorkspaceMode;\n hasInitialQuery: boolean;\n agentType?: \"default\" | \"plan\";\n hasParentConversation: boolean;\n entryPoint?: string;\n }) => {\n track(\"conversation_start_requested\", {\n conversation_id: conversationId,\n task_id: taskId,\n is_start_task: conversationId.startsWith(\"task-\"),\n has_repository: hasRepository,\n git_provider: gitProvider,\n has_workspace: hasWorkspace,\n workspace_mode: workspaceMode,\n has_initial_query: hasInitialQuery,\n agent_type: agentType,\n has_parent_conversation: hasParentConversation,\n entry_point: entryPoint,\n });\n };\n\n const trackPushButtonClick = () => {\n track(\"push_button_clicked\");\n };\n\n const trackPullButtonClick = () => {\n track(\"pull_button_clicked\");\n };\n\n const trackCreatePrButtonClick = () => {\n track(\"create_pr_button_clicked\");\n };\n\n const trackUserSignupCompleted = () => {\n track(\"user_signup_completed\", {\n signup_timestamp: new Date().toISOString(),\n });\n };\n\n const trackPrebuiltAutomationEnabled = ({\n automationId,\n automationName,\n automationCategory,\n }: {\n automationId?: string;\n automationName: string;\n automationCategory?: string;\n }) => {\n track(\"prebuilt_automation_enabled\", {\n automation_id: automationId,\n automation_name: automationName,\n automation_category: automationCategory,\n });\n };\n\n /**\n * The setup funnel: opened → validated → created, or failed.\n *\n * A manifest declares no analytics of its own, so the stages are the same for\n * every entry and only the id it carries varies.\n */\n const trackAutomationSetupOpened = ({\n automationId,\n }: {\n automationId: string;\n }) => {\n track(\"automation_setup_opened\", { automation_id: automationId });\n };\n\n const trackAutomationSetupValidated = ({\n automationId,\n }: {\n automationId: string;\n }) => {\n track(\"automation_setup_validated\", { automation_id: automationId });\n };\n\n const trackAutomationSetupCreated = ({\n automationId,\n setupMode,\n }: {\n automationId: string;\n setupMode: string;\n }) => {\n track(\"automation_setup_created\", {\n automation_id: automationId,\n setup_mode: setupMode,\n });\n };\n\n const trackAutomationSetupFailed = ({\n automationId,\n setupMode,\n }: {\n automationId: string;\n setupMode: string;\n }) => {\n track(\"automation_setup_failed\", {\n automation_id: automationId,\n setup_mode: setupMode,\n });\n };\n\n const trackInitialQuerySubmitted = ({\n entryPoint,\n queryCharacterLength,\n replayJsonSize,\n }: {\n entryPoint: string;\n queryCharacterLength: number;\n replayJsonSize?: number;\n }) => {\n track(\"initial_query_submitted\", {\n entry_point: entryPoint,\n query_character_length: queryCharacterLength,\n replay_json_size: replayJsonSize,\n });\n };\n\n const trackUserMessageSent = ({\n sessionMessageCount,\n currentMessageLength,\n }: {\n sessionMessageCount: number;\n currentMessageLength: number;\n }) => {\n track(\"user_message_sent\", {\n session_message_count: sessionMessageCount,\n current_message_length: currentMessageLength,\n });\n };\n\n const trackDownloadVsCodeButtonClicked = () => {\n track(\"download_via_vscode_button_clicked\");\n };\n\n const trackSettingsSaved = ({\n llmModel,\n llmApiKeySet,\n searchApiKeySet,\n remoteRuntimeResourceFactor,\n }: {\n llmModel: unknown;\n llmApiKeySet: \"SET\" | \"UNSET\";\n searchApiKeySet: \"SET\" | \"UNSET\";\n remoteRuntimeResourceFactor?: unknown;\n }) => {\n track(\"settings_saved\", {\n LLM_MODEL: llmModel,\n LLM_API_KEY_SET: llmApiKeySet,\n SEARCH_API_KEY_SET: searchApiKeySet,\n REMOTE_RUNTIME_RESOURCE_FACTOR: remoteRuntimeResourceFactor,\n });\n };\n\n const trackMcpConfigUpdated = ({\n sseServersCount,\n stdioServersCount,\n }: {\n sseServersCount: number;\n stdioServersCount: number;\n }) => {\n track(\"mcp_config_updated\", {\n has_mcp_config: true,\n sse_servers_count: sseServersCount,\n stdio_servers_count: stdioServersCount,\n });\n };\n\n const trackDownloadTrajectoryButtonClicked = () => {\n track(\"download_trajectory_button_clicked\");\n };\n\n const trackConversationExported = (format: \"markdown\" | \"html\") => {\n track(\"conversation_exported\", { format });\n };\n\n const trackAutomationCreatedButton = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_created_button\", { backend_kind: backendKind });\n };\n\n const trackAutomationExecuted = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_executed\", { backend_kind: backendKind });\n };\n\n const trackAutomationDeleted = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_deleted\", { backend_kind: backendKind });\n };\n\n const trackAutomationDisableButton = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_disable_button\", { backend_kind: backendKind });\n };\n\n const trackAutomationEdited = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_edited\", { backend_kind: backendKind });\n };\n\n const trackAutomationExported = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_exported\", { backend_kind: backendKind });\n };\n\n const trackAutomationActivityLogExported = ({\n backendKind,\n format,\n }: {\n backendKind: BackendKind;\n format: \"json\" | \"csv\";\n }) => {\n track(\"automation_activity_log_exported\", {\n backend_kind: backendKind,\n format,\n });\n };\n\n const trackAutomationImported = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_imported\", { backend_kind: backendKind });\n };\n\n const trackGitSyncConfigUpdated = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"git_sync_config_updated\", { backend_kind: backendKind });\n };\n\n const trackGitSyncTriggered = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"git_sync_triggered\", { backend_kind: backendKind });\n };\n\n const trackBackendAdded = ({\n backendKind,\n connectionMethod,\n hasApiKey,\n source,\n agentServerVersion,\n backendVersion,\n }: {\n backendKind: BackendKind;\n connectionMethod: BackendConnectionMethod;\n hasApiKey: boolean;\n source?: CloudConnectionSource;\n agentServerVersion?: string | null;\n backendVersion?: string | null;\n }) => {\n track(\"backend_added\", {\n ...getBackendTelemetryProperties({\n backendKind,\n agentServerVersion,\n backendVersion,\n connectionMethod,\n }),\n has_api_key: hasApiKey,\n source,\n });\n };\n\n const trackOnboardingStarted = () => {\n track(\"onboarding_started\");\n };\n\n const trackOnboardingStepViewed = ({\n step,\n stepIndex,\n totalSteps,\n agent,\n }: {\n step: string;\n stepIndex: number;\n totalSteps: number;\n agent: string;\n }) => {\n track(\"onboarding_step_viewed\", {\n step,\n step_index: stepIndex,\n total_steps: totalSteps,\n agent,\n });\n };\n\n const trackOnboardingCompleted = ({ agent }: { agent: string }) => {\n track(\"onboarding_completed\", { agent });\n };\n\n const trackOnboardingSkipped = ({\n step,\n stepIndex,\n totalSteps,\n agent,\n }: {\n step: string;\n stepIndex: number;\n totalSteps: number;\n agent: string;\n }) => {\n track(\"onboarding_skipped\", {\n step,\n step_index: stepIndex,\n total_steps: totalSteps,\n agent,\n });\n };\n\n return {\n trackLoginButtonClick,\n trackConversationCreated,\n trackPushButtonClick,\n trackPullButtonClick,\n trackCreatePrButtonClick,\n trackUserSignupCompleted,\n trackPrebuiltAutomationEnabled,\n trackAutomationSetupOpened,\n trackAutomationSetupValidated,\n trackAutomationSetupCreated,\n trackAutomationSetupFailed,\n trackInitialQuerySubmitted,\n trackUserMessageSent,\n trackDownloadVsCodeButtonClicked,\n trackSettingsSaved,\n trackMcpConfigUpdated,\n trackDownloadTrajectoryButtonClicked,\n trackConversationExported,\n trackAutomationCreatedButton,\n trackAutomationExecuted,\n trackAutomationDeleted,\n trackAutomationDisableButton,\n trackAutomationEdited,\n trackAutomationExported,\n trackAutomationActivityLogExported,\n trackAutomationImported,\n trackGitSyncConfigUpdated,\n trackGitSyncTriggered,\n trackBackendAdded,\n trackOnboardingStarted,\n trackOnboardingStepViewed,\n trackOnboardingCompleted,\n trackOnboardingSkipped,\n };\n};\n"],"mappings":"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"}
|
|
@@ -97,6 +97,12 @@ export declare const useTracking: () => {
|
|
|
97
97
|
trackAutomationImported: ({ backendKind, }: {
|
|
98
98
|
backendKind: BackendKind;
|
|
99
99
|
}) => void;
|
|
100
|
+
trackGitSyncConfigUpdated: ({ backendKind, }: {
|
|
101
|
+
backendKind: BackendKind;
|
|
102
|
+
}) => void;
|
|
103
|
+
trackGitSyncTriggered: ({ backendKind, }: {
|
|
104
|
+
backendKind: BackendKind;
|
|
105
|
+
}) => void;
|
|
100
106
|
trackBackendAdded: ({ backendKind, connectionMethod, hasApiKey, source, agentServerVersion, backendVersion, }: {
|
|
101
107
|
backendKind: BackendKind;
|
|
102
108
|
connectionMethod: BackendConnectionMethod;
|
|
@@ -144,6 +144,12 @@ var s = () => {
|
|
|
144
144
|
trackAutomationImported: ({ backendKind: e }) => {
|
|
145
145
|
d("automation_imported", { backend_kind: e });
|
|
146
146
|
},
|
|
147
|
+
trackGitSyncConfigUpdated: ({ backendKind: e }) => {
|
|
148
|
+
d("git_sync_config_updated", { backend_kind: e });
|
|
149
|
+
},
|
|
150
|
+
trackGitSyncTriggered: ({ backendKind: e }) => {
|
|
151
|
+
d("git_sync_triggered", { backend_kind: e });
|
|
152
|
+
},
|
|
147
153
|
trackBackendAdded: ({ backendKind: e, connectionMethod: n, hasApiKey: r, source: i, agentServerVersion: a, backendVersion: o }) => {
|
|
148
154
|
d("backend_added", {
|
|
149
155
|
...t({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-tracking.js","names":[],"sources":["../../src/hooks/use-tracking.ts"],"sourcesContent":["import React from \"react\";\nimport { Provider } from \"#/types/settings\";\nimport type { BackendKind } from \"#/api/backend-registry/types\";\nimport type { WorkspaceMode } from \"#/api/conversation-metadata-store\";\nimport type { CloudConnectionSource } from \"#/services/cloud-funnel-analytics\";\nimport { getCachedAgentServerVersion } from \"#/api/agent-server-compatibility\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useAutomationSdkVersion } from \"#/hooks/query/use-automation-sdk-version\";\nimport {\n type BackendConnectionMethod,\n getBackendTelemetryProperties,\n} from \"#/services/telemetry-context\";\nimport { setTelemetryBackendContext, trackEvent } from \"#/services/telemetry\";\n\n/**\n * Hook that provides tracking functions with automatic data collection\n * from available hooks (settings, etc.)\n *\n * All events require explicit user consent. The shared PostHog client enforces\n * the canonical consent configured by telemetry.ts; this hook must not gate on\n * backend settings because they can be stale while a backend changes.\n */\nexport const useTracking = () => {\n const { backend } = useActiveBackend();\n const automationSdkVersion = useAutomationSdkVersion();\n\n const getBackendTelemetryContext = React.useCallback(\n () => ({\n backendKind: backend.kind,\n agentServerVersion:\n backend.kind === \"local\"\n ? getCachedAgentServerVersion(backend.host)\n : null,\n automationSdkVersion: automationSdkVersion ?? null,\n }),\n [automationSdkVersion, backend.host, backend.kind],\n );\n\n React.useEffect(() => {\n setTelemetryBackendContext(getBackendTelemetryContext());\n }, [getBackendTelemetryContext]);\n\n // Common properties included in all tracking events\n const commonProperties = {\n current_url: window.location.href,\n };\n\n /**\n * PostHog enforces the canonical consent state configured by telemetry.ts.\n * Backend settings are not a capture gate because they can be stale while a\n * backend is being added or switched.\n */\n const track = (event: string, properties: Record<string, unknown> = {}) => {\n setTelemetryBackendContext(getBackendTelemetryContext());\n void trackEvent(event, { ...commonProperties, ...properties });\n };\n\n const trackLoginButtonClick = ({ provider }: { provider: Provider }) => {\n track(\"login_button_clicked\", { provider });\n };\n\n const trackConversationCreated = ({\n conversationId,\n taskId,\n hasRepository,\n gitProvider,\n hasWorkspace,\n workspaceMode,\n hasInitialQuery,\n agentType,\n hasParentConversation,\n entryPoint,\n }: {\n conversationId: string;\n taskId?: string;\n hasRepository: boolean;\n gitProvider?: Provider;\n hasWorkspace: boolean;\n workspaceMode?: WorkspaceMode;\n hasInitialQuery: boolean;\n agentType?: \"default\" | \"plan\";\n hasParentConversation: boolean;\n entryPoint?: string;\n }) => {\n track(\"conversation_start_requested\", {\n conversation_id: conversationId,\n task_id: taskId,\n is_start_task: conversationId.startsWith(\"task-\"),\n has_repository: hasRepository,\n git_provider: gitProvider,\n has_workspace: hasWorkspace,\n workspace_mode: workspaceMode,\n has_initial_query: hasInitialQuery,\n agent_type: agentType,\n has_parent_conversation: hasParentConversation,\n entry_point: entryPoint,\n });\n };\n\n const trackPushButtonClick = () => {\n track(\"push_button_clicked\");\n };\n\n const trackPullButtonClick = () => {\n track(\"pull_button_clicked\");\n };\n\n const trackCreatePrButtonClick = () => {\n track(\"create_pr_button_clicked\");\n };\n\n const trackUserSignupCompleted = () => {\n track(\"user_signup_completed\", {\n signup_timestamp: new Date().toISOString(),\n });\n };\n\n const trackPrebuiltAutomationEnabled = ({\n automationId,\n automationName,\n automationCategory,\n }: {\n automationId?: string;\n automationName: string;\n automationCategory?: string;\n }) => {\n track(\"prebuilt_automation_enabled\", {\n automation_id: automationId,\n automation_name: automationName,\n automation_category: automationCategory,\n });\n };\n\n /**\n * The setup funnel: opened → validated → created, or failed.\n *\n * A manifest declares no analytics of its own, so the stages are the same for\n * every entry and only the id it carries varies.\n */\n const trackAutomationSetupOpened = ({\n automationId,\n }: {\n automationId: string;\n }) => {\n track(\"automation_setup_opened\", { automation_id: automationId });\n };\n\n const trackAutomationSetupValidated = ({\n automationId,\n }: {\n automationId: string;\n }) => {\n track(\"automation_setup_validated\", { automation_id: automationId });\n };\n\n const trackAutomationSetupCreated = ({\n automationId,\n setupMode,\n }: {\n automationId: string;\n setupMode: string;\n }) => {\n track(\"automation_setup_created\", {\n automation_id: automationId,\n setup_mode: setupMode,\n });\n };\n\n const trackAutomationSetupFailed = ({\n automationId,\n setupMode,\n }: {\n automationId: string;\n setupMode: string;\n }) => {\n track(\"automation_setup_failed\", {\n automation_id: automationId,\n setup_mode: setupMode,\n });\n };\n\n const trackInitialQuerySubmitted = ({\n entryPoint,\n queryCharacterLength,\n replayJsonSize,\n }: {\n entryPoint: string;\n queryCharacterLength: number;\n replayJsonSize?: number;\n }) => {\n track(\"initial_query_submitted\", {\n entry_point: entryPoint,\n query_character_length: queryCharacterLength,\n replay_json_size: replayJsonSize,\n });\n };\n\n const trackUserMessageSent = ({\n sessionMessageCount,\n currentMessageLength,\n }: {\n sessionMessageCount: number;\n currentMessageLength: number;\n }) => {\n track(\"user_message_sent\", {\n session_message_count: sessionMessageCount,\n current_message_length: currentMessageLength,\n });\n };\n\n const trackDownloadVsCodeButtonClicked = () => {\n track(\"download_via_vscode_button_clicked\");\n };\n\n const trackSettingsSaved = ({\n llmModel,\n llmApiKeySet,\n searchApiKeySet,\n remoteRuntimeResourceFactor,\n }: {\n llmModel: unknown;\n llmApiKeySet: \"SET\" | \"UNSET\";\n searchApiKeySet: \"SET\" | \"UNSET\";\n remoteRuntimeResourceFactor?: unknown;\n }) => {\n track(\"settings_saved\", {\n LLM_MODEL: llmModel,\n LLM_API_KEY_SET: llmApiKeySet,\n SEARCH_API_KEY_SET: searchApiKeySet,\n REMOTE_RUNTIME_RESOURCE_FACTOR: remoteRuntimeResourceFactor,\n });\n };\n\n const trackMcpConfigUpdated = ({\n sseServersCount,\n stdioServersCount,\n }: {\n sseServersCount: number;\n stdioServersCount: number;\n }) => {\n track(\"mcp_config_updated\", {\n has_mcp_config: true,\n sse_servers_count: sseServersCount,\n stdio_servers_count: stdioServersCount,\n });\n };\n\n const trackDownloadTrajectoryButtonClicked = () => {\n track(\"download_trajectory_button_clicked\");\n };\n\n const trackConversationExported = (format: \"markdown\" | \"html\") => {\n track(\"conversation_exported\", { format });\n };\n\n const trackAutomationCreatedButton = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_created_button\", { backend_kind: backendKind });\n };\n\n const trackAutomationExecuted = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_executed\", { backend_kind: backendKind });\n };\n\n const trackAutomationDeleted = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_deleted\", { backend_kind: backendKind });\n };\n\n const trackAutomationDisableButton = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_disable_button\", { backend_kind: backendKind });\n };\n\n const trackAutomationEdited = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_edited\", { backend_kind: backendKind });\n };\n\n const trackAutomationExported = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_exported\", { backend_kind: backendKind });\n };\n\n const trackAutomationActivityLogExported = ({\n backendKind,\n format,\n }: {\n backendKind: BackendKind;\n format: \"json\" | \"csv\";\n }) => {\n track(\"automation_activity_log_exported\", {\n backend_kind: backendKind,\n format,\n });\n };\n\n const trackAutomationImported = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_imported\", { backend_kind: backendKind });\n };\n\n const trackBackendAdded = ({\n backendKind,\n connectionMethod,\n hasApiKey,\n source,\n agentServerVersion,\n backendVersion,\n }: {\n backendKind: BackendKind;\n connectionMethod: BackendConnectionMethod;\n hasApiKey: boolean;\n source?: CloudConnectionSource;\n agentServerVersion?: string | null;\n backendVersion?: string | null;\n }) => {\n track(\"backend_added\", {\n ...getBackendTelemetryProperties({\n backendKind,\n agentServerVersion,\n backendVersion,\n connectionMethod,\n }),\n has_api_key: hasApiKey,\n source,\n });\n };\n\n const trackOnboardingStarted = () => {\n track(\"onboarding_started\");\n };\n\n const trackOnboardingStepViewed = ({\n step,\n stepIndex,\n totalSteps,\n agent,\n }: {\n step: string;\n stepIndex: number;\n totalSteps: number;\n agent: string;\n }) => {\n track(\"onboarding_step_viewed\", {\n step,\n step_index: stepIndex,\n total_steps: totalSteps,\n agent,\n });\n };\n\n const trackOnboardingCompleted = ({ agent }: { agent: string }) => {\n track(\"onboarding_completed\", { agent });\n };\n\n const trackOnboardingSkipped = ({\n step,\n stepIndex,\n totalSteps,\n agent,\n }: {\n step: string;\n stepIndex: number;\n totalSteps: number;\n agent: string;\n }) => {\n track(\"onboarding_skipped\", {\n step,\n step_index: stepIndex,\n total_steps: totalSteps,\n agent,\n });\n };\n\n return {\n trackLoginButtonClick,\n trackConversationCreated,\n trackPushButtonClick,\n trackPullButtonClick,\n trackCreatePrButtonClick,\n trackUserSignupCompleted,\n trackPrebuiltAutomationEnabled,\n trackAutomationSetupOpened,\n trackAutomationSetupValidated,\n trackAutomationSetupCreated,\n trackAutomationSetupFailed,\n trackInitialQuerySubmitted,\n trackUserMessageSent,\n trackDownloadVsCodeButtonClicked,\n trackSettingsSaved,\n trackMcpConfigUpdated,\n trackDownloadTrajectoryButtonClicked,\n trackConversationExported,\n trackAutomationCreatedButton,\n trackAutomationExecuted,\n trackAutomationDeleted,\n trackAutomationDisableButton,\n trackAutomationEdited,\n trackAutomationExported,\n trackAutomationActivityLogExported,\n trackAutomationImported,\n trackBackendAdded,\n trackOnboardingStarted,\n trackOnboardingStepViewed,\n trackOnboardingCompleted,\n trackOnboardingSkipped,\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-tracking.js","names":[],"sources":["../../src/hooks/use-tracking.ts"],"sourcesContent":["import React from \"react\";\nimport { Provider } from \"#/types/settings\";\nimport type { BackendKind } from \"#/api/backend-registry/types\";\nimport type { WorkspaceMode } from \"#/api/conversation-metadata-store\";\nimport type { CloudConnectionSource } from \"#/services/cloud-funnel-analytics\";\nimport { getCachedAgentServerVersion } from \"#/api/agent-server-compatibility\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useAutomationSdkVersion } from \"#/hooks/query/use-automation-sdk-version\";\nimport {\n type BackendConnectionMethod,\n getBackendTelemetryProperties,\n} from \"#/services/telemetry-context\";\nimport { setTelemetryBackendContext, trackEvent } from \"#/services/telemetry\";\n\n/**\n * Hook that provides tracking functions with automatic data collection\n * from available hooks (settings, etc.)\n *\n * All events require explicit user consent. The shared PostHog client enforces\n * the canonical consent configured by telemetry.ts; this hook must not gate on\n * backend settings because they can be stale while a backend changes.\n */\nexport const useTracking = () => {\n const { backend } = useActiveBackend();\n const automationSdkVersion = useAutomationSdkVersion();\n\n const getBackendTelemetryContext = React.useCallback(\n () => ({\n backendKind: backend.kind,\n agentServerVersion:\n backend.kind === \"local\"\n ? getCachedAgentServerVersion(backend.host)\n : null,\n automationSdkVersion: automationSdkVersion ?? null,\n }),\n [automationSdkVersion, backend.host, backend.kind],\n );\n\n React.useEffect(() => {\n setTelemetryBackendContext(getBackendTelemetryContext());\n }, [getBackendTelemetryContext]);\n\n // Common properties included in all tracking events\n const commonProperties = {\n current_url: window.location.href,\n };\n\n /**\n * PostHog enforces the canonical consent state configured by telemetry.ts.\n * Backend settings are not a capture gate because they can be stale while a\n * backend is being added or switched.\n */\n const track = (event: string, properties: Record<string, unknown> = {}) => {\n setTelemetryBackendContext(getBackendTelemetryContext());\n void trackEvent(event, { ...commonProperties, ...properties });\n };\n\n const trackLoginButtonClick = ({ provider }: { provider: Provider }) => {\n track(\"login_button_clicked\", { provider });\n };\n\n const trackConversationCreated = ({\n conversationId,\n taskId,\n hasRepository,\n gitProvider,\n hasWorkspace,\n workspaceMode,\n hasInitialQuery,\n agentType,\n hasParentConversation,\n entryPoint,\n }: {\n conversationId: string;\n taskId?: string;\n hasRepository: boolean;\n gitProvider?: Provider;\n hasWorkspace: boolean;\n workspaceMode?: WorkspaceMode;\n hasInitialQuery: boolean;\n agentType?: \"default\" | \"plan\";\n hasParentConversation: boolean;\n entryPoint?: string;\n }) => {\n track(\"conversation_start_requested\", {\n conversation_id: conversationId,\n task_id: taskId,\n is_start_task: conversationId.startsWith(\"task-\"),\n has_repository: hasRepository,\n git_provider: gitProvider,\n has_workspace: hasWorkspace,\n workspace_mode: workspaceMode,\n has_initial_query: hasInitialQuery,\n agent_type: agentType,\n has_parent_conversation: hasParentConversation,\n entry_point: entryPoint,\n });\n };\n\n const trackPushButtonClick = () => {\n track(\"push_button_clicked\");\n };\n\n const trackPullButtonClick = () => {\n track(\"pull_button_clicked\");\n };\n\n const trackCreatePrButtonClick = () => {\n track(\"create_pr_button_clicked\");\n };\n\n const trackUserSignupCompleted = () => {\n track(\"user_signup_completed\", {\n signup_timestamp: new Date().toISOString(),\n });\n };\n\n const trackPrebuiltAutomationEnabled = ({\n automationId,\n automationName,\n automationCategory,\n }: {\n automationId?: string;\n automationName: string;\n automationCategory?: string;\n }) => {\n track(\"prebuilt_automation_enabled\", {\n automation_id: automationId,\n automation_name: automationName,\n automation_category: automationCategory,\n });\n };\n\n /**\n * The setup funnel: opened → validated → created, or failed.\n *\n * A manifest declares no analytics of its own, so the stages are the same for\n * every entry and only the id it carries varies.\n */\n const trackAutomationSetupOpened = ({\n automationId,\n }: {\n automationId: string;\n }) => {\n track(\"automation_setup_opened\", { automation_id: automationId });\n };\n\n const trackAutomationSetupValidated = ({\n automationId,\n }: {\n automationId: string;\n }) => {\n track(\"automation_setup_validated\", { automation_id: automationId });\n };\n\n const trackAutomationSetupCreated = ({\n automationId,\n setupMode,\n }: {\n automationId: string;\n setupMode: string;\n }) => {\n track(\"automation_setup_created\", {\n automation_id: automationId,\n setup_mode: setupMode,\n });\n };\n\n const trackAutomationSetupFailed = ({\n automationId,\n setupMode,\n }: {\n automationId: string;\n setupMode: string;\n }) => {\n track(\"automation_setup_failed\", {\n automation_id: automationId,\n setup_mode: setupMode,\n });\n };\n\n const trackInitialQuerySubmitted = ({\n entryPoint,\n queryCharacterLength,\n replayJsonSize,\n }: {\n entryPoint: string;\n queryCharacterLength: number;\n replayJsonSize?: number;\n }) => {\n track(\"initial_query_submitted\", {\n entry_point: entryPoint,\n query_character_length: queryCharacterLength,\n replay_json_size: replayJsonSize,\n });\n };\n\n const trackUserMessageSent = ({\n sessionMessageCount,\n currentMessageLength,\n }: {\n sessionMessageCount: number;\n currentMessageLength: number;\n }) => {\n track(\"user_message_sent\", {\n session_message_count: sessionMessageCount,\n current_message_length: currentMessageLength,\n });\n };\n\n const trackDownloadVsCodeButtonClicked = () => {\n track(\"download_via_vscode_button_clicked\");\n };\n\n const trackSettingsSaved = ({\n llmModel,\n llmApiKeySet,\n searchApiKeySet,\n remoteRuntimeResourceFactor,\n }: {\n llmModel: unknown;\n llmApiKeySet: \"SET\" | \"UNSET\";\n searchApiKeySet: \"SET\" | \"UNSET\";\n remoteRuntimeResourceFactor?: unknown;\n }) => {\n track(\"settings_saved\", {\n LLM_MODEL: llmModel,\n LLM_API_KEY_SET: llmApiKeySet,\n SEARCH_API_KEY_SET: searchApiKeySet,\n REMOTE_RUNTIME_RESOURCE_FACTOR: remoteRuntimeResourceFactor,\n });\n };\n\n const trackMcpConfigUpdated = ({\n sseServersCount,\n stdioServersCount,\n }: {\n sseServersCount: number;\n stdioServersCount: number;\n }) => {\n track(\"mcp_config_updated\", {\n has_mcp_config: true,\n sse_servers_count: sseServersCount,\n stdio_servers_count: stdioServersCount,\n });\n };\n\n const trackDownloadTrajectoryButtonClicked = () => {\n track(\"download_trajectory_button_clicked\");\n };\n\n const trackConversationExported = (format: \"markdown\" | \"html\") => {\n track(\"conversation_exported\", { format });\n };\n\n const trackAutomationCreatedButton = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_created_button\", { backend_kind: backendKind });\n };\n\n const trackAutomationExecuted = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_executed\", { backend_kind: backendKind });\n };\n\n const trackAutomationDeleted = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_deleted\", { backend_kind: backendKind });\n };\n\n const trackAutomationDisableButton = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_disable_button\", { backend_kind: backendKind });\n };\n\n const trackAutomationEdited = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_edited\", { backend_kind: backendKind });\n };\n\n const trackAutomationExported = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_exported\", { backend_kind: backendKind });\n };\n\n const trackAutomationActivityLogExported = ({\n backendKind,\n format,\n }: {\n backendKind: BackendKind;\n format: \"json\" | \"csv\";\n }) => {\n track(\"automation_activity_log_exported\", {\n backend_kind: backendKind,\n format,\n });\n };\n\n const trackAutomationImported = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_imported\", { backend_kind: backendKind });\n };\n\n const trackGitSyncConfigUpdated = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"git_sync_config_updated\", { backend_kind: backendKind });\n };\n\n const trackGitSyncTriggered = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"git_sync_triggered\", { backend_kind: backendKind });\n };\n\n const trackBackendAdded = ({\n backendKind,\n connectionMethod,\n hasApiKey,\n source,\n agentServerVersion,\n backendVersion,\n }: {\n backendKind: BackendKind;\n connectionMethod: BackendConnectionMethod;\n hasApiKey: boolean;\n source?: CloudConnectionSource;\n agentServerVersion?: string | null;\n backendVersion?: string | null;\n }) => {\n track(\"backend_added\", {\n ...getBackendTelemetryProperties({\n backendKind,\n agentServerVersion,\n backendVersion,\n connectionMethod,\n }),\n has_api_key: hasApiKey,\n source,\n });\n };\n\n const trackOnboardingStarted = () => {\n track(\"onboarding_started\");\n };\n\n const trackOnboardingStepViewed = ({\n step,\n stepIndex,\n totalSteps,\n agent,\n }: {\n step: string;\n stepIndex: number;\n totalSteps: number;\n agent: string;\n }) => {\n track(\"onboarding_step_viewed\", {\n step,\n step_index: stepIndex,\n total_steps: totalSteps,\n agent,\n });\n };\n\n const trackOnboardingCompleted = ({ agent }: { agent: string }) => {\n track(\"onboarding_completed\", { agent });\n };\n\n const trackOnboardingSkipped = ({\n step,\n stepIndex,\n totalSteps,\n agent,\n }: {\n step: string;\n stepIndex: number;\n totalSteps: number;\n agent: string;\n }) => {\n track(\"onboarding_skipped\", {\n step,\n step_index: stepIndex,\n total_steps: totalSteps,\n agent,\n });\n };\n\n return {\n trackLoginButtonClick,\n trackConversationCreated,\n trackPushButtonClick,\n trackPullButtonClick,\n trackCreatePrButtonClick,\n trackUserSignupCompleted,\n trackPrebuiltAutomationEnabled,\n trackAutomationSetupOpened,\n trackAutomationSetupValidated,\n trackAutomationSetupCreated,\n trackAutomationSetupFailed,\n trackInitialQuerySubmitted,\n trackUserMessageSent,\n trackDownloadVsCodeButtonClicked,\n trackSettingsSaved,\n trackMcpConfigUpdated,\n trackDownloadTrajectoryButtonClicked,\n trackConversationExported,\n trackAutomationCreatedButton,\n trackAutomationExecuted,\n trackAutomationDeleted,\n trackAutomationDisableButton,\n trackAutomationEdited,\n trackAutomationExported,\n trackAutomationActivityLogExported,\n trackAutomationImported,\n trackGitSyncConfigUpdated,\n trackGitSyncTriggered,\n trackBackendAdded,\n trackOnboardingStarted,\n trackOnboardingStepViewed,\n trackOnboardingCompleted,\n trackOnboardingSkipped,\n };\n};\n"],"mappings":"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"}
|