@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.
Files changed (437) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-D1PORKc0.js → acp-providers-CYy8qA2z.js} +1 -1
  4. package/build/assets/active-backend-context-BZDG15C0.js +2 -0
  5. package/build/assets/{agent-context-settings-DMrObcIS.js → agent-context-settings-DGWBBbcp.js} +1 -1
  6. package/build/assets/{agent-profiles-settings-DororXN5.js → agent-profiles-settings-DrkGdf4_.js} +1 -1
  7. package/build/assets/{agent-server-conversation-service.api-DWBe0rbX.js → agent-server-conversation-service.api-DK56YPTs.js} +7 -7
  8. package/build/assets/{agent-settings-BJVk92PU.js → agent-settings-DfcSgkLD.js} +2 -2
  9. package/build/assets/agent-settings-Lrc5-twS.js +1 -0
  10. package/build/assets/{alert-banner-CzZsm7ms.js → alert-banner-BgDHhL7b.js} +1 -1
  11. package/build/assets/api-error-message-BEIE_yD1.js +1 -0
  12. package/build/assets/{api-key-entry-screen-D8Fade_-.js → api-key-entry-screen-DaZnOlVo.js} +1 -1
  13. package/build/assets/{app-settings-CpyGB3AT.js → app-settings-BG5NAUbC.js} +1 -1
  14. package/build/assets/automation-detail-D4Hs831Z.js +3 -0
  15. package/build/assets/automation-export-n0X6FB0C.js +2 -0
  16. package/build/assets/automation-git-sync-CDrm8WV7.js +1 -0
  17. package/build/assets/automation-setup-route-CZCl4ONs.js +1 -0
  18. package/build/assets/{automation-templates-DgpCGOJV.js → automation-templates-DFF96AdL.js} +1 -1
  19. package/build/assets/automations-list-Bl-oGOrV.js +1 -0
  20. package/build/assets/{back-nav-button-HHEneWMw.js → back-nav-button-H_ThtDA0.js} +1 -1
  21. package/build/assets/{backend-form-modal-DiVrD4Cm.js → backend-form-modal-CbCemvHt.js} +1 -1
  22. package/build/assets/backend-not-configured-DP8KLNq_.js +1 -0
  23. package/build/assets/{backend-synced-settings-badge-7MIjpr8M.js → backend-synced-settings-badge-BBASWqsb.js} +1 -1
  24. package/build/assets/{badge-CpYmcVZV.js → badge-B-51h-SW.js} +1 -1
  25. package/build/assets/{base-modal-Fnh6Uln9.js → base-modal-BbjycA8X.js} +1 -1
  26. package/build/assets/{bot-BQZx8e2i.js → bot-CGPCg03p.js} +1 -1
  27. package/build/assets/{brand-button-swT1RyO0.js → brand-button-Blxv5nww.js} +1 -1
  28. package/build/assets/browser-CuW0nWvh.js +7 -0
  29. package/build/assets/{browser-tab-zAY12m_i.js → browser-tab-D5G0ORwt.js} +1 -1
  30. package/build/assets/{chat-send-button-DsJtivmL.js → chat-send-button-BD2tii1r.js} +1 -1
  31. package/build/assets/check-DSuS-lyr.js +1 -0
  32. package/build/assets/chevron-down-CgGcmtE2.js +1 -0
  33. package/build/assets/circle-check-CG5-NPw7.js +1 -0
  34. package/build/assets/{circle-plus-check-toggle-Cuzx55bo.js → circle-plus-check-toggle-ASbpB8vN.js} +1 -1
  35. package/build/assets/{cloud-funnel-analytics-86CwNdSh.js → cloud-funnel-analytics-GlCUG0gk.js} +1 -1
  36. package/build/assets/cog-CZiR80uT.js +1 -0
  37. package/build/assets/{combobox-caret-D0fRotFi.js → combobox-caret-DvpEsh2O.js} +1 -1
  38. package/build/assets/{command-menu-BXy03FBl.js → command-menu-DwUQzjYP.js} +1 -1
  39. package/build/assets/{condenser-settings-BmZa0ui_.js → condenser-settings-BptcoiLA.js} +1 -1
  40. package/build/assets/{confirmation-modal-BgoN6lbN.js → confirmation-modal-CiEwxZAA.js} +1 -1
  41. package/build/assets/{context-menu-list-item-Bq02tc-P.js → context-menu-list-item-CdcamfM1.js} +1 -1
  42. package/build/assets/conversation-DREHj4nT.js +1 -0
  43. package/build/assets/conversation-DotRfiDz.js +90 -0
  44. package/build/assets/conversation-panel-DREHj4nT.js +1 -0
  45. package/build/assets/conversation-state-store-DMLtlHbE.js +1 -0
  46. package/build/assets/{conversation-tab-empty-state-CMqo_0Bd.js → conversation-tab-empty-state-D-puECpY.js} +1 -1
  47. package/build/assets/{copy-to-clipboard-button-Cg1pF0xn.js → copy-to-clipboard-button-BGxcUbgy.js} +1 -1
  48. package/build/assets/{device-verify-BfQLgNyq.js → device-verify-CZJfWaJf.js} +1 -1
  49. package/build/assets/{dropdown-classes-BIqQr5mx.js → dropdown-classes-tLhpwtxS.js} +1 -1
  50. package/build/assets/{entry.client-CxFjRYqH.js → entry.client-D8GnI6GZ.js} +2 -2
  51. package/build/assets/{enum-filter-dropdown-C_yV4_bo.js → enum-filter-dropdown-Fk8k60nk.js} +1 -1
  52. package/build/assets/{environment-switch-overlay-Bi4qbh2g.js → environment-switch-overlay-DeztVYuL.js} +1 -1
  53. package/build/assets/{extensions-hub-BqUINAhp.js → extensions-hub-Cd6GCYzq.js} +1 -1
  54. package/build/assets/{extensions-navigation-lraj88Wk.js → extensions-navigation-C4sgZg-y.js} +1 -1
  55. package/build/assets/{external-link-CgtpA_a1.js → external-link-C0UpBgsE.js} +1 -1
  56. package/build/assets/{file-text-DEK4LSVw.js → file-text-C6WYtNdV.js} +1 -1
  57. package/build/assets/files-tab-BW_qzyAm.js +1 -0
  58. package/build/assets/{form-control-classes-7yFSQJq_.js → form-control-classes-CGXBLcn1.js} +1 -1
  59. package/build/assets/format-model-name-BNPKVsIq.js +1 -0
  60. package/build/assets/format-relative-time-ZhQD4rsl.js +1 -0
  61. package/build/assets/git-provider-icon-CaQ1yLPi.js +1 -0
  62. package/build/assets/{git-repo-dropdown-ByMzpNko.js → git-repo-dropdown-CgXR6M_E.js} +1 -1
  63. package/build/assets/git-repo-dropdown-D2Uei3CO.js +1 -0
  64. package/build/assets/{highlighted-source-view-C_sfncLZ.js → highlighted-source-view-C_YOp8Fo.js} +1 -1
  65. package/build/assets/home-DNzzJcMP.js +1 -0
  66. package/build/assets/home-aCos-5vc.js +1 -0
  67. package/build/assets/{home-store-CxqsY9Fi.js → home-store-DgzViC3f.js} +1 -1
  68. package/build/assets/index-home-DNzzJcMP.js +1 -0
  69. package/build/assets/info-CLoC1LRo.js +1 -0
  70. package/build/assets/install-server-modal-D7zIqNKz.js +1 -0
  71. package/build/assets/kebab-menu-item-content-DERMdnDv.js +1 -0
  72. package/build/assets/{launch-CkqiSCqi.js → launch-5PjKeLak.js} +1 -1
  73. package/build/assets/{list-todo-DNWlzfaM.js → list-todo-BF049YaY.js} +1 -1
  74. package/build/assets/llm-not-configured-banner-BK9z5eS0.js +27 -0
  75. package/build/assets/llm-settings-BLAMK2tR.js +1 -0
  76. package/build/assets/llm-settings-BWsbarGM.js +1 -0
  77. package/build/assets/{llm-subscription-service-BAdOl5Xx.js → llm-subscription-service-SfnEV9Uc.js} +1 -1
  78. package/build/assets/loader-circle-D7IagAyF.js +1 -0
  79. package/build/assets/{loading-spinner-xhnrGP4Y.js → loading-spinner-DBgXgra0.js} +1 -1
  80. package/build/assets/{manage-backends-modal-DhGk5mJt.js → manage-backends-modal-BTqNPhzc.js} +1 -1
  81. package/build/assets/manifest-abebca3c.js +1 -0
  82. package/build/assets/manifest-subpage-layout-Rn-glaxV.js +1 -0
  83. package/build/assets/{map-provider-Mx8mZuE-.js → map-provider-BK4HnqYz.js} +1 -1
  84. package/build/assets/markdown-renderer-Cp6DlHQN.js +8 -0
  85. package/build/assets/{mcp-DCkvl6K0.js → mcp-BC-Ixn4T.js} +2 -2
  86. package/build/assets/{mcp-marketplace-utils-DEbMXlQr.js → mcp-marketplace-utils-BJWJgbB6.js} +1 -1
  87. package/build/assets/{messages-DSXvyc21.js → messages-CzFKrzPG.js} +5 -5
  88. package/build/assets/{modal-body-gIe21fDv.js → modal-body-BdKfD3Hl.js} +1 -1
  89. package/build/assets/{modal-classes-D66dlgZ7.js → modal-classes-D5_b5vMi.js} +1 -1
  90. package/build/assets/{modal-close-button-B6iOGYpI.js → modal-close-button-objukxk_.js} +1 -1
  91. package/build/assets/{mouse-pointer-click-BYX1Pw5W.js → mouse-pointer-click-C_gXyLyD.js} +1 -1
  92. package/build/assets/{npm-DLckoeJc.js → npm-CHVHV1MC.js} +1 -1
  93. package/build/assets/{onboarding-D7WDG66N.js → onboarding-Diw0V51A.js} +1 -1
  94. package/build/assets/onboarding-modal-Da4yHzsA.js +1 -0
  95. package/build/assets/{organization-service.api-D-s9z18a.js → organization-service.api-BztSy69u.js} +1 -1
  96. package/build/assets/parse-git-remote-url-BkXN9jzl.js +1 -0
  97. package/build/assets/{pencil-BGOCPRyu.js → pencil-49avMHlD.js} +1 -1
  98. package/build/assets/{planner-tab-AKaXIIfg.js → planner-tab-CJiSpNax.js} +1 -1
  99. package/build/assets/{plugins-management-service-wtmY4QQw.js → plugins-management-service-lHdNKWNU.js} +1 -1
  100. package/build/assets/plus-C0BagBpV.js +1 -0
  101. package/build/assets/profiles-service.api-BLr7FXec.js +1 -0
  102. package/build/assets/providers-CWXnb7S3.js +1 -0
  103. package/build/assets/{proxy-9Z_WZggZ.js → proxy-DYDXxtje.js} +1 -1
  104. package/build/assets/{puzzle-BWLmN8z4.js → puzzle-Bt2B1rzf.js} +1 -1
  105. package/build/assets/recommended-automations-launcher-CcFMfJRR.js +1 -0
  106. package/build/assets/{refresh-cw-CXtFWpwv.js → refresh-cw-nmcesifB.js} +1 -1
  107. package/build/assets/root-CT4t7apy.css +1 -0
  108. package/build/assets/root-DnRgLKpU.js +2 -0
  109. package/build/assets/root-layout-2L9tr-BN.js +2 -0
  110. package/build/assets/{schema-field-OnM5Uob_.js → schema-field-C59lVZTA.js} +1 -1
  111. package/build/assets/{sdk-section-page-m5WQm2sy.js → sdk-section-page-BbBEQQjq.js} +1 -1
  112. package/build/assets/search-CYSDBczG.js +1 -0
  113. package/build/assets/secrets-service-BtsgYSlj.js +1 -0
  114. package/build/assets/secrets-settings-DJ0OKa4_.js +1 -0
  115. package/build/assets/{segmented-toggle-DCspm2U5.js → segmented-toggle-DiVfTZuN.js} +1 -1
  116. package/build/assets/{settings-BJQI_iBM.js → settings-CDqL_Uqh.js} +1 -1
  117. package/build/assets/{settings-CWFxymAf.js → settings-DcNPxz0v.js} +1 -1
  118. package/build/assets/{settings-dropdown-input-BI8V_Nov.js → settings-dropdown-input-Ba1UN5Du.js} +1 -1
  119. package/build/assets/{settings-index-BiTqJoH7.js → settings-index-Cz2cKt2K.js} +1 -1
  120. package/build/assets/{settings-input-Cz62hWVW.js → settings-input-CWUEHHvS.js} +1 -1
  121. package/build/assets/{settings-list-classes-z_3FW5H3.js → settings-list-classes-DdcLXDGn.js} +1 -1
  122. package/build/assets/{settings-modal-BIrIVn97.js → settings-modal-nEEK1Kh1.js} +1 -1
  123. package/build/assets/{settings-service.api--rJmnuLa.js → settings-service.api-3yAUFcaP.js} +1 -1
  124. package/build/assets/{settings-switch-BRsSI8Vs.js → settings-switch-Dk9hChx1.js} +1 -1
  125. package/build/assets/{settings-utils-Ba7vel6T.js → settings-utils-CxjtCSB3.js} +1 -1
  126. package/build/assets/{shared-conversation-CQK_PqHx.js → shared-conversation-DbAcrx3s.js} +1 -1
  127. package/build/assets/{shield-check-T3JsDJiM.js → shield-check-CiOTXxV2.js} +1 -1
  128. package/build/assets/{sidebar-layout-Bhi3hVcu.js → sidebar-layout-lrfPooIB.js} +1 -1
  129. package/build/assets/{sidebar-mobile-menu-toggle-YWJNRN4p.js → sidebar-mobile-menu-toggle-KERXfNu1.js} +1 -1
  130. package/build/assets/{sidebar-nav-link-BSUlY5Ml.js → sidebar-nav-link-B8lFD6Cb.js} +1 -1
  131. package/build/assets/{sidebar-store-Cl1cUv_F.js → sidebar-store-u6pUpxJ7.js} +1 -1
  132. package/build/assets/{skill-card-pill-row-BXz8L8Rn.js → skill-card-pill-row-dGIUzr_b.js} +1 -1
  133. package/build/assets/{skill-icon-badge-QgfKv31M.js → skill-icon-badge-kkOWZ89w.js} +1 -1
  134. package/build/assets/{skill-scope-Dc3JPW-8.js → skill-scope-DWN1PBPH.js} +1 -1
  135. package/build/assets/{skills-plugins-CpTV27n3.js → skills-plugins-DFjH2Nq6.js} +1 -1
  136. package/build/assets/{skills-settings-CSW__IW4.js → skills-settings-DIHpl3ol.js} +2 -2
  137. package/build/assets/{sparkles-TJ0mdECe.js → sparkles-ntyMLnbj.js} +1 -1
  138. package/build/assets/{styled-tooltip-BUMSbgrF.js → styled-tooltip-B6JXcsmL.js} +1 -1
  139. package/build/assets/{task-list-tab-mAHMOkUz.js → task-list-tab-aEJzEcHD.js} +1 -1
  140. package/build/assets/{terminal-BzxBaHx2.js → terminal-Dch7Ty5K.js} +1 -1
  141. package/build/assets/{toggle-switch-O5v1FgxW.js → toggle-switch-B2MLKsgt.js} +1 -1
  142. package/build/assets/{trash-2-C0xNVp9c.js → trash-2-yZnDM4Ji.js} +1 -1
  143. package/build/assets/{typography-NOKSk9_R.js → typography-DB5HoCk0.js} +1 -1
  144. package/build/assets/usage-tab-DrEtBmBT.js +1 -0
  145. package/build/assets/use-acp-credential-form-c8KXAa8A.js +1 -0
  146. package/build/assets/{use-activate-agent-profile-D9YRQPTF.js → use-activate-agent-profile-B0p34N3q.js} +1 -1
  147. package/build/assets/use-agent-profiles-CPIc6wLH.js +1 -0
  148. package/build/assets/{use-can-manage-org-profiles-Dxzq2AEd.js → use-can-manage-org-profiles-Dz_8Eqkv.js} +1 -1
  149. package/build/assets/{use-cloud-current-user-id-Co2eJk2A.js → use-cloud-current-user-id-DvUVqCle.js} +1 -1
  150. package/build/assets/use-config-C3PO4TBw.js +1 -0
  151. package/build/assets/{use-create-conversation-CoHTiCbI.js → use-create-conversation-DVrA_uLD.js} +1 -1
  152. package/build/assets/use-create-secret-DbBIpaCR.js +1 -0
  153. package/build/assets/use-get-secrets-6PBitf54.js +1 -0
  154. package/build/assets/use-has-permission-CQ31Cl8j.js +1 -0
  155. package/build/assets/use-is-authed-2UrDIziV.js +1 -0
  156. package/build/assets/use-is-creating-conversation-BvYpmb3v.js +1 -0
  157. package/build/assets/use-llm-profiles-diZS4FiN.js +1 -0
  158. package/build/assets/use-manifest-capabilities-HIWCtIUm.js +1 -0
  159. package/build/assets/{use-onboarding-completion-CCE8OQgV.js → use-onboarding-completion-Bs8PcXik.js} +1 -1
  160. package/build/assets/{use-plugins-marketplace-CEiak69h.js → use-plugins-marketplace-BCuNLFsr.js} +1 -1
  161. package/build/assets/use-save-agent-profile-BaMNSpBV.js +1 -0
  162. package/build/assets/{use-save-settings-DNmnbG6f.js → use-save-settings-BahvC2Gw.js} +1 -1
  163. package/build/assets/{use-settings-wCwPaSIv.js → use-settings-C6ZxpBDX.js} +1 -1
  164. package/build/assets/{use-settings-nav-items-BlFL7YhM.js → use-settings-nav-items-Bqn69Ggw.js} +2 -2
  165. package/build/assets/use-tracking-Bhu7gk2y.js +3 -0
  166. package/build/assets/{use-user-conversation-DVtfg0B_.js → use-user-conversation-BkNXpXrd.js} +1 -1
  167. package/build/assets/{useInfiniteQuery-p1xq35r2.js → useInfiniteQuery-c_OmS3lK.js} +1 -1
  168. package/build/assets/{useMutation-BFDQmgk9.js → useMutation-6ZsQCqAn.js} +1 -1
  169. package/build/assets/{useQueries-DF1NAAeC.js → useQueries-xDrGlTO_.js} +1 -1
  170. package/build/assets/{useQuery-DRv--6bK.js → useQuery-Bs5NFz2s.js} +1 -1
  171. package/build/assets/{utils-zxEjKE70.js → utils-DUD5ScdA.js} +1 -1
  172. package/build/assets/{vendor~entry.client-CgNUwtQL.js → vendor~entry.client-BFE7Llz9.js} +1 -1
  173. package/build/assets/{vendor~entry.client-zSIea5EO.js → vendor~entry.client-BaKt_PIp.js} +1 -1
  174. 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
  175. package/build/assets/{vendor~files-tab-D9wR9yM2.js → vendor~files-tab-B6POTS66.js} +1 -1
  176. package/build/assets/{vendor~index-home~home~conversation-panel~conversation-Ipoe6hvY.js → vendor~index-home~home~conversation-panel~conversation-53Q_U6uP.js} +1 -1
  177. package/build/assets/{vendor~root-layout-C-IgVx6e.js → vendor~root-layout-DeQACFVA.js} +1 -1
  178. package/build/assets/{vendor~root-layout~conversation-panel~conversation-Dhd_I4H4.js → vendor~root-layout~conversation-panel~conversation-bv7ooVgH.js} +1 -1
  179. 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
  180. 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
  181. 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
  182. 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
  183. package/build/assets/{verification-settings-B8UMQ7MG.js → verification-settings-COueVXmM.js} +1 -1
  184. package/build/assets/{wrench-DIka3hCq.js → wrench-C95ujnYo.js} +1 -1
  185. package/build/assets/x-86ZCfxKY.js +1 -0
  186. package/build/assets/{zap-DHddTPc0.js → zap-DRa-r-Tf.js} +1 -1
  187. package/build/index.html +4 -4
  188. package/build/locales/ar/openhands.json +60 -2
  189. package/build/locales/ca/openhands.json +60 -2
  190. package/build/locales/de/openhands.json +60 -2
  191. package/build/locales/en/openhands.json +60 -2
  192. package/build/locales/es/openhands.json +60 -2
  193. package/build/locales/fr/openhands.json +60 -2
  194. package/build/locales/it/openhands.json +60 -2
  195. package/build/locales/ja/openhands.json +60 -2
  196. package/build/locales/ko-KR/openhands.json +60 -2
  197. package/build/locales/no/openhands.json +60 -2
  198. package/build/locales/pt/openhands.json +60 -2
  199. package/build/locales/tr/openhands.json +60 -2
  200. package/build/locales/uk/openhands.json +60 -2
  201. package/build/locales/zh-CN/openhands.json +60 -2
  202. package/build/locales/zh-TW/openhands.json +60 -2
  203. package/config/defaults.json +1 -1
  204. package/dist/api/automation-service/automation-service.api.cjs +1 -1
  205. package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
  206. package/dist/api/automation-service/automation-service.api.d.ts +10 -0
  207. package/dist/api/automation-service/automation-service.api.js +42 -0
  208. package/dist/api/automation-service/automation-service.api.js.map +1 -1
  209. package/dist/api/cloud/conversation-service.api.cjs +1 -1
  210. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  211. package/dist/api/cloud/conversation-service.api.d.ts +9 -0
  212. package/dist/api/cloud/conversation-service.api.js +11 -1
  213. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  214. package/dist/api/profiles-service/profiles-service.api.cjs +1 -1
  215. package/dist/api/profiles-service/profiles-service.api.cjs.map +1 -1
  216. package/dist/api/profiles-service/profiles-service.api.d.ts +15 -2
  217. package/dist/api/profiles-service/profiles-service.api.js +25 -2
  218. package/dist/api/profiles-service/profiles-service.api.js.map +1 -1
  219. package/dist/api/secrets-service.cjs +1 -1
  220. package/dist/api/secrets-service.cjs.map +1 -1
  221. package/dist/api/secrets-service.d.ts +5 -0
  222. package/dist/api/secrets-service.js +12 -6
  223. package/dist/api/secrets-service.js.map +1 -1
  224. package/dist/components/conversation-events/chat/event-message-components/index.d.ts +0 -1
  225. package/dist/components/features/automations/git-sync/git-sync-activity-row.d.ts +15 -0
  226. package/dist/components/features/automations/git-sync/git-sync-config-form.d.ts +13 -0
  227. package/dist/components/features/automations/git-sync/git-sync-error-banner.d.ts +6 -0
  228. package/dist/components/features/automations/git-sync/git-sync-not-local-state.d.ts +1 -0
  229. package/dist/components/features/automations/git-sync/git-sync-overview-section.d.ts +12 -0
  230. package/dist/components/features/automations/git-sync/git-sync-skeleton.d.ts +1 -0
  231. package/dist/components/features/automations/git-sync/git-sync-status-pill.d.ts +7 -0
  232. package/dist/components/features/automations/git-sync/git-sync-unsupported-state.d.ts +7 -0
  233. package/dist/components/features/automations/responder-deployment-modal.d.ts +2 -1
  234. package/dist/components/features/chat/chat-interface.cjs +2 -2
  235. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  236. package/dist/components/features/chat/chat-interface.js +177 -176
  237. package/dist/components/features/chat/chat-interface.js.map +1 -1
  238. package/dist/components/features/chat/error-message-banner.cjs +1 -1
  239. package/dist/components/features/chat/error-message-banner.cjs.map +1 -1
  240. package/dist/components/features/chat/error-message-banner.d.ts +3 -1
  241. package/dist/components/features/chat/error-message-banner.js +64 -58
  242. package/dist/components/features/chat/error-message-banner.js.map +1 -1
  243. package/dist/components/features/conversation-panel/compact-conversation-row.cjs +1 -1
  244. package/dist/components/features/conversation-panel/compact-conversation-row.js +6 -6
  245. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  246. package/dist/components/features/conversation-panel/conversation-panel.js +19 -19
  247. package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +10 -7
  248. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs +1 -1
  249. package/dist/components/shared/buttons/conversation-confirmation-buttons.cjs.map +1 -1
  250. package/dist/components/shared/buttons/conversation-confirmation-buttons.js +1 -1
  251. package/dist/components/shared/buttons/conversation-confirmation-buttons.js.map +1 -1
  252. package/dist/config/defaults.cjs +1 -1
  253. package/dist/config/defaults.cjs.map +1 -1
  254. package/dist/config/defaults.js +1 -1
  255. package/dist/config/defaults.js.map +1 -1
  256. package/dist/contexts/conversation-websocket-context.cjs +2 -2
  257. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  258. package/dist/contexts/conversation-websocket-context.js +12 -12
  259. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  260. package/dist/hooks/query/use-commit-changes.cjs +1 -1
  261. package/dist/hooks/query/use-commit-changes.js +4 -4
  262. package/dist/hooks/query/use-git-sync.d.ts +19 -0
  263. package/dist/hooks/query/use-task-polling.cjs +1 -1
  264. package/dist/hooks/query/use-task-polling.cjs.map +1 -1
  265. package/dist/hooks/query/use-task-polling.js +12 -10
  266. package/dist/hooks/query/use-task-polling.js.map +1 -1
  267. package/dist/hooks/query/use-unified-get-git-changes.cjs +1 -1
  268. package/dist/hooks/query/use-unified-get-git-changes.js +4 -4
  269. package/dist/hooks/query/use-unified-git-commits.cjs +1 -1
  270. package/dist/hooks/query/use-unified-git-commits.js +4 -4
  271. package/dist/hooks/query/use-unified-git-diff.cjs +1 -1
  272. package/dist/hooks/query/use-unified-git-diff.js +4 -4
  273. package/dist/hooks/query/use-workspace-files.cjs +1 -1
  274. package/dist/hooks/query/use-workspace-files.cjs.map +1 -1
  275. package/dist/hooks/query/use-workspace-files.d.ts +14 -4
  276. package/dist/hooks/query/use-workspace-files.js +45 -32
  277. package/dist/hooks/query/use-workspace-files.js.map +1 -1
  278. package/dist/hooks/use-responder-url-secret.d.ts +5 -0
  279. package/dist/hooks/use-tracking.cjs +1 -1
  280. package/dist/hooks/use-tracking.cjs.map +1 -1
  281. package/dist/hooks/use-tracking.d.ts +6 -0
  282. package/dist/hooks/use-tracking.js +6 -0
  283. package/dist/hooks/use-tracking.js.map +1 -1
  284. package/dist/i18n/declaration.cjs +1 -1
  285. package/dist/i18n/declaration.cjs.map +1 -1
  286. package/dist/i18n/declaration.d.ts +59 -1
  287. package/dist/i18n/declaration.js +1 -1
  288. package/dist/i18n/declaration.js.map +1 -1
  289. package/dist/i18n/translation.cjs +1 -1
  290. package/dist/i18n/translation.cjs.map +1 -1
  291. package/dist/i18n/translation.js +1001 -15
  292. package/dist/i18n/translation.js.map +1 -1
  293. package/dist/locales/ar/openhands.json +60 -2
  294. package/dist/locales/ca/openhands.json +60 -2
  295. package/dist/locales/de/openhands.json +60 -2
  296. package/dist/locales/en/openhands.json +60 -2
  297. package/dist/locales/es/openhands.json +60 -2
  298. package/dist/locales/fr/openhands.json +60 -2
  299. package/dist/locales/it/openhands.json +60 -2
  300. package/dist/locales/ja/openhands.json +60 -2
  301. package/dist/locales/ko-KR/openhands.json +60 -2
  302. package/dist/locales/no/openhands.json +60 -2
  303. package/dist/locales/pt/openhands.json +60 -2
  304. package/dist/locales/tr/openhands.json +60 -2
  305. package/dist/locales/uk/openhands.json +60 -2
  306. package/dist/locales/zh-CN/openhands.json +60 -2
  307. package/dist/locales/zh-TW/openhands.json +60 -2
  308. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.cjs +2 -0
  309. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.cjs.map +1 -0
  310. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.js +27 -0
  311. package/dist/node_modules/lucide-react/dist/esm/icons/circle-alert.js.map +1 -0
  312. package/dist/package.cjs +1 -1
  313. package/dist/package.cjs.map +1 -1
  314. package/dist/package.js +1 -1
  315. package/dist/package.js.map +1 -1
  316. package/dist/routes/files-tab.cjs +1 -1
  317. package/dist/routes/files-tab.js +11 -11
  318. package/dist/routes/files-tab.js.map +1 -1
  319. package/dist/services/settings.cjs +1 -1
  320. package/dist/services/settings.cjs.map +1 -1
  321. package/dist/services/settings.js +2 -2
  322. package/dist/services/settings.js.map +1 -1
  323. package/dist/services/telemetry.cjs +1 -1
  324. package/dist/services/telemetry.cjs.map +1 -1
  325. package/dist/services/telemetry.js +47 -51
  326. package/dist/services/telemetry.js.map +1 -1
  327. package/dist/stores/error-message-store.cjs +1 -1
  328. package/dist/stores/error-message-store.cjs.map +1 -1
  329. package/dist/stores/error-message-store.d.ts +3 -1
  330. package/dist/stores/error-message-store.js +5 -3
  331. package/dist/stores/error-message-store.js.map +1 -1
  332. package/dist/types/git-sync.d.ts +51 -0
  333. package/dist/utils/error-handler.cjs +1 -1
  334. package/dist/utils/error-handler.cjs.map +1 -1
  335. package/dist/utils/error-handler.d.ts +3 -2
  336. package/dist/utils/error-handler.js +18 -5
  337. package/dist/utils/error-handler.js.map +1 -1
  338. package/dist/utils/format-model-name.cjs +1 -1
  339. package/dist/utils/format-model-name.cjs.map +1 -1
  340. package/dist/utils/format-model-name.d.ts +1 -0
  341. package/dist/utils/format-model-name.js +1 -0
  342. package/dist/utils/format-model-name.js.map +1 -1
  343. package/dist/utils/transcript-export/load-complete-events.cjs +1 -1
  344. package/dist/utils/transcript-export/load-complete-events.cjs.map +1 -1
  345. package/dist/utils/transcript-export/load-complete-events.js +24 -16
  346. package/dist/utils/transcript-export/load-complete-events.js.map +1 -1
  347. package/package.json +1 -1
  348. package/scripts/check-translation-completeness.cjs +3 -0
  349. package/scripts/dev-with-automation.mjs +98 -9
  350. package/build/assets/active-backend-context-IqOjobNK.js +0 -2
  351. package/build/assets/agent-settings-COfJsQ1d.js +0 -1
  352. package/build/assets/automation-detail-B-jQ39Mm.js +0 -3
  353. package/build/assets/automation-export-B1dywoqk.js +0 -2
  354. package/build/assets/automation-setup-route-C-bWUZBi.js +0 -1
  355. package/build/assets/automations-list-DnMxlxsL.js +0 -1
  356. package/build/assets/browser-B9AbV6kG.js +0 -7
  357. package/build/assets/check-WAFXrrs_.js +0 -1
  358. package/build/assets/chevron-down-CifNWzme.js +0 -1
  359. package/build/assets/circle-check-CtnimJa8.js +0 -1
  360. package/build/assets/conversation-BPo8SvLN.js +0 -1
  361. package/build/assets/conversation-CPCVsCUY.js +0 -90
  362. package/build/assets/conversation-panel-BPo8SvLN.js +0 -1
  363. package/build/assets/conversation-state-store-C5YpjMNy.js +0 -1
  364. package/build/assets/files-tab-DV0L-lFE.js +0 -1
  365. package/build/assets/format-model-name-BN_rx1Y3.js +0 -1
  366. package/build/assets/format-relative-time-DSErAuVr.js +0 -1
  367. package/build/assets/git-provider-icon-BvlLAche.js +0 -1
  368. package/build/assets/git-repo-dropdown-C6R7hgM8.js +0 -1
  369. package/build/assets/home-BOrlwLqG.js +0 -1
  370. package/build/assets/home-BvMNC6E-.js +0 -1
  371. package/build/assets/index-home-BvMNC6E-.js +0 -1
  372. package/build/assets/info-BRVcJAUg.js +0 -1
  373. package/build/assets/install-server-modal-Bl4G1zF4.js +0 -1
  374. package/build/assets/kebab-menu-item-content-BGoGFEAg.js +0 -1
  375. package/build/assets/llm-not-configured-banner-DLw_tu-G.js +0 -27
  376. package/build/assets/llm-settings-B-pkVCrt.js +0 -1
  377. package/build/assets/llm-settings-DSC0-IQ7.js +0 -1
  378. package/build/assets/loader-circle-B47W9XqT.js +0 -1
  379. package/build/assets/manifest-653b89aa.js +0 -1
  380. package/build/assets/manifest-subpage-layout-CKWvL2ig.js +0 -1
  381. package/build/assets/markdown-renderer-DUmk7pFc.js +0 -8
  382. package/build/assets/onboarding-modal-C_xVrFNv.js +0 -1
  383. package/build/assets/plus-zNEL8rcX.js +0 -1
  384. package/build/assets/profiles-service.api-DCMYxHMi.js +0 -1
  385. package/build/assets/providers-BjrtjX4L.js +0 -1
  386. package/build/assets/recommended-automations-launcher-CFlzhu1o.js +0 -1
  387. package/build/assets/root-CanxKlNV.css +0 -1
  388. package/build/assets/root-DkfG_UWR.js +0 -2
  389. package/build/assets/root-layout-D75LHYhh.js +0 -2
  390. package/build/assets/search-CycosyjN.js +0 -1
  391. package/build/assets/secrets-service-B26R61C1.js +0 -1
  392. package/build/assets/secrets-settings-CbLYCKOX.js +0 -1
  393. package/build/assets/usage-tab-tEmVN0KD.js +0 -1
  394. package/build/assets/use-acp-credential-form-BPNi0Zbm.js +0 -1
  395. package/build/assets/use-agent-profiles-Cb2zUW3l.js +0 -1
  396. package/build/assets/use-config-DKAMiI5R.js +0 -1
  397. package/build/assets/use-create-secret-2zBlCDsF.js +0 -1
  398. package/build/assets/use-is-authed-C52-ivnB.js +0 -1
  399. package/build/assets/use-is-creating-conversation-DdaAE6jV.js +0 -1
  400. package/build/assets/use-llm-profiles-C_BHue65.js +0 -1
  401. package/build/assets/use-manifest-capabilities-DPrQsaPP.js +0 -1
  402. package/build/assets/use-save-agent-profile-DK9idD6a.js +0 -1
  403. package/build/assets/use-tracking-CVwPmhlX.js +0 -3
  404. package/build/assets/x-BWKA2Ver.js +0 -1
  405. package/dist/api/cloud/suggestions-service.api.d.ts +0 -8
  406. package/dist/api/suggestions-service/suggestions-service.api.d.ts +0 -11
  407. package/dist/components/conversation-events/chat/event-message-components/observation-pair-event-message.d.ts +0 -7
  408. package/dist/components/conversation-events/index.d.ts +0 -1
  409. package/dist/components/features/automations/metadata-chip.d.ts +0 -6
  410. package/dist/components/features/chat/task-tracking/status-badge.d.ts +0 -5
  411. package/dist/components/features/chat/task-tracking/status-icon.d.ts +0 -5
  412. package/dist/components/features/chat/task-tracking/task-list-section.d.ts +0 -10
  413. package/dist/components/features/controls/tools.d.ts +0 -2
  414. package/dist/components/features/conversation-panel/new-conversation-button.d.ts +0 -23
  415. package/dist/components/features/home/home-header/guide-message.d.ts +0 -1
  416. package/dist/components/features/home/home-header/home-header.d.ts +0 -1
  417. package/dist/components/features/home/new-conversation/create-conversation-button.d.ts +0 -1
  418. package/dist/components/features/home/new-conversation/new-conversation.d.ts +0 -1
  419. package/dist/components/features/home/new-conversation.d.ts +0 -1
  420. package/dist/components/features/home/tasks/task-card.d.ts +0 -6
  421. package/dist/components/features/home/tasks/task-group.d.ts +0 -7
  422. package/dist/components/features/home/tasks/task-issue-number.d.ts +0 -6
  423. package/dist/components/features/home/tasks/task-item-title.d.ts +0 -1
  424. package/dist/components/features/home/tasks/task-suggestions-skeleton.d.ts +0 -1
  425. package/dist/components/features/home/tasks/task-suggestions.d.ts +0 -6
  426. package/dist/components/features/settings/agent-server-onboarding.d.ts +0 -10
  427. package/dist/components/features/settings/mcp-settings/mcp-server-list-item.d.ts +0 -6
  428. package/dist/components/features/settings/mcp-settings/mcp-server-list.d.ts +0 -8
  429. package/dist/hooks/query/use-suggested-tasks.d.ts +0 -1
  430. package/dist/hooks/use-should-show-user-features.d.ts +0 -1
  431. package/dist/ui/card-title.d.ts +0 -16
  432. package/dist/ui/card.d.ts +0 -14
  433. package/dist/utils/group-suggested-tasks.d.ts +0 -7
  434. /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
  435. /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
  436. /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
  437. /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 "../../api/git-service/agent-server-git-service.api.js";
5
- import { getGitPath as i } from "../../utils/get-git-path.js";
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(() => `${i(d, f)}/${o.filePath}`, [
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 r.getGitChangeDiff(s, l, u, p, o.commit);
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"),t=require("../../contexts/active-backend-context.cjs"),n=require("./use-active-conversation.cjs"),r=require("../use-runtime-is-ready.cjs"),i=require("../../api/runtime-service/agent-server-runtime-service.cjs"),a=require("./use-unified-get-git-changes.cjs");let o=require("react");var s=2e3,c=[`.git`,`node_modules`,`.venv`,`venv`,`__pycache__`,`dist`,`build`,`.next`,`.cache`,`.pytest_cache`,`.mypy_cache`,`.turbo`,`.parcel-cache`,`target`];function l(){return`find . \\( ${c.map(e=>`-name '${e}' -prune`).join(` -o `)} \\) -o -type f -print 2>/dev/null | sort | head -n ${s}`}function u(e){return e.startsWith(`./`)?e.slice(2):e}function d(t){let{data:a}=n.useActiveConversation(),o=r.useRuntimeIsReady(),c=a?.id,d=a?.conversation_url,f=a?.session_api_key,p=a?.workspace?.working_dir?.trim(),m=e.useQuery({queryKey:[`workspace-files`,c,d,f,p],queryFn:async()=>{let e=await i.default.executeCommand(d,f,l(),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(u);return Array.from(new Set(t)).slice(0,s)},enabled:t&&o&&!!c&&!!p,retry:!1,staleTime:1e3*30,gcTime:1e3*60*5,meta:{disableToast:!0}});return{data:m.data,isLoading:m.isLoading}}function f(e){let t=a.useUnifiedGetGitChanges(),n=(0,o.useMemo)(()=>{if(!e)return;let n=t.data.filter(e=>e.status!==`D`).map(e=>e.path);return Array.from(new Set(n)).slice(0,s)},[e,t.data]);return{data:e?n:void 0,isLoading:e?t.isLoading:!1}}function p(){let{backend:e}=t.useActiveBackend(),n=e.kind===`cloud`,r=d(!n),i=f(n);return n?i:r}exports.useWorkspaceFiles=p;
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 { useMemo } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport AgentServerRuntimeService from \"#/api/runtime-service/agent-server-runtime-service\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useRuntimeIsReady } from \"#/hooks/use-runtime-is-ready\";\nimport { useUnifiedGetGitChanges } from \"#/hooks/query/use-unified-get-git-changes\";\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 cloud API exposes no bash-exec / file-listing endpoint,\n * and the old cross-origin `/api/cloud-proxy` hop these calls relied on was\n * removed from the agent-server. See `useWorkspaceFiles` for the cloud path.\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: derive the file list from the conversation's git\n * changes the same data source the diff view uses (and the only\n * runtime-workspace transport the cloud API proxies, alongside git diff and\n * single-file read). `git status` reports created/modified/untracked files,\n * which covers the common Agent Canvas case (a fresh or agent-authored\n * workspace). It intentionally does NOT enumerate unchanged tracked files —\n * the cloud API has no full-workspace listing endpoint so a conversation\n * attached to a large existing repo shows changed files rather than the whole\n * tree. Deleted files are dropped since they can't be opened.\n */\nfunction useCloudWorkspaceFiles(enabled: boolean): WorkspaceFilesResult {\n const gitChanges = useUnifiedGetGitChanges();\n\n const data = useMemo(() => {\n if (!enabled) return undefined;\n const paths = gitChanges.data\n .filter((change) => change.status !== \"D\")\n .map((change) => change.path);\n return Array.from(new Set(paths)).slice(0, MAX_FILES);\n }, [enabled, gitChanges.data]);\n\n return {\n data: enabled ? data : undefined,\n isLoading: enabled ? gitChanges.isLoading : false,\n };\n}\n\n/**\n * Lists the files shown in the Files tab for the active conversation.\n *\n * Local backends enumerate the full workspace tree via bash `find`. Cloud\n * backends derive the list from git changes (see `useCloudWorkspaceFiles`\n * for the rationale and its limitation), because the cloud API exposes no\n * bash-exec or file-listing endpoint.\n */\nexport function useWorkspaceFiles(): WorkspaceFilesResult {\n const { backend } = useActiveBackend();\n const isCloud = backend.kind === \"cloud\";\n\n const local = useLocalWorkspaceFiles(!isCloud);\n const cloud = useCloudWorkspaceFiles(isCloud);\n\n return isCloud ? cloud : local;\n}\n"],"mappings":"+ZAUA,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,CAYA,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,CAaA,SAAS,EAAuB,EAAwC,CACtE,IAAM,EAAa,EAAA,wBAAwB,EAErC,GAAA,EAAA,EAAA,aAAqB,CACzB,GAAI,CAAC,EAAS,OACd,IAAM,EAAQ,EAAW,KACtB,OAAQ,GAAW,EAAO,SAAW,GAAG,EACxC,IAAK,GAAW,EAAO,IAAI,EAC9B,OAAO,MAAM,KAAK,IAAI,IAAI,CAAK,CAAC,EAAE,MAAM,EAAG,CAAS,CACtD,EAAG,CAAC,EAAS,EAAW,IAAI,CAAC,EAE7B,MAAO,CACL,KAAM,EAAU,EAAO,IAAA,GACvB,UAAW,EAAU,EAAW,UAAY,EAC9C,CACF,CAUA,SAAgB,GAA0C,CACxD,GAAM,CAAE,WAAY,EAAA,iBAAiB,EAC/B,EAAU,EAAQ,OAAS,QAE3B,EAAQ,EAAuB,CAAC,CAAO,EACvC,EAAQ,EAAuB,CAAO,EAE5C,OAAO,EAAU,EAAQ,CAC3B"}
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
- * Local backends enumerate the full workspace tree via bash `find`. Cloud
9
- * backends derive the list from git changes (see `useCloudWorkspaceFiles`
10
- * for the rationale and its limitation), because the cloud API exposes no
11
- * bash-exec or file-listing endpoint.
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 { useQuery as e } from "../../node_modules/@tanstack/react-query/build/modern/useQuery.js";
2
- import { useActiveBackend as t } from "../../contexts/active-backend-context.js";
3
- import { useActiveConversation as n } from "./use-active-conversation.js";
4
- import { useRuntimeIsReady as r } from "../use-runtime-is-ready.js";
5
- import i from "../../api/runtime-service/agent-server-runtime-service.js";
6
- import { useUnifiedGetGitChanges as a } from "./use-unified-get-git-changes.js";
7
- import { useMemo as o } from "react";
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 s = 2e3, c = [
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 l() {
26
- return `find . \\( ${c.map((e) => `-name '${e}' -prune`).join(" -o ")} \\) -o -type f -print 2>/dev/null | sort | head -n ${s}`;
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 u(e) {
30
+ function p(e) {
29
31
  return e.startsWith("./") ? e.slice(2) : e;
30
32
  }
31
- function d(t) {
32
- let { data: a } = n(), o = r(), c = a?.id, d = a?.conversation_url, f = a?.session_api_key, p = a?.workspace?.working_dir?.trim(), m = e({
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
- d,
37
- f,
38
- p
39
+ l,
40
+ d
39
41
  ],
40
42
  queryFn: async () => {
41
- let e = await i.executeCommand(d, f, l(), p, 30);
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(u);
44
- return Array.from(new Set(t)).slice(0, s);
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: t && o && !!c && !!p,
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 f(e) {
58
- let t = a(), n = o(() => {
59
- if (!e) return;
60
- let n = t.data.filter((e) => e.status !== "D").map((e) => e.path);
61
- return Array.from(new Set(n)).slice(0, s);
62
- }, [e, t.data]);
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: e ? n : void 0,
65
- isLoading: e ? t.isLoading : !1
77
+ data: g.data,
78
+ isLoading: g.isLoading
66
79
  };
67
80
  }
68
- function p() {
69
- let { backend: e } = t(), n = e.kind === "cloud", r = d(!n), i = f(n);
70
- return n ? i : r;
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 { p as useWorkspaceFiles };
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 { useMemo } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\n\nimport AgentServerRuntimeService from \"#/api/runtime-service/agent-server-runtime-service\";\nimport { useActiveBackend } from \"#/contexts/active-backend-context\";\nimport { useActiveConversation } from \"#/hooks/query/use-active-conversation\";\nimport { useRuntimeIsReady } from \"#/hooks/use-runtime-is-ready\";\nimport { useUnifiedGetGitChanges } from \"#/hooks/query/use-unified-get-git-changes\";\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 cloud API exposes no bash-exec / file-listing endpoint,\n * and the old cross-origin `/api/cloud-proxy` hop these calls relied on was\n * removed from the agent-server. See `useWorkspaceFiles` for the cloud path.\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: derive the file list from the conversation's git\n * changes the same data source the diff view uses (and the only\n * runtime-workspace transport the cloud API proxies, alongside git diff and\n * single-file read). `git status` reports created/modified/untracked files,\n * which covers the common Agent Canvas case (a fresh or agent-authored\n * workspace). It intentionally does NOT enumerate unchanged tracked files —\n * the cloud API has no full-workspace listing endpoint so a conversation\n * attached to a large existing repo shows changed files rather than the whole\n * tree. Deleted files are dropped since they can't be opened.\n */\nfunction useCloudWorkspaceFiles(enabled: boolean): WorkspaceFilesResult {\n const gitChanges = useUnifiedGetGitChanges();\n\n const data = useMemo(() => {\n if (!enabled) return undefined;\n const paths = gitChanges.data\n .filter((change) => change.status !== \"D\")\n .map((change) => change.path);\n return Array.from(new Set(paths)).slice(0, MAX_FILES);\n }, [enabled, gitChanges.data]);\n\n return {\n data: enabled ? data : undefined,\n isLoading: enabled ? gitChanges.isLoading : false,\n };\n}\n\n/**\n * Lists the files shown in the Files tab for the active conversation.\n *\n * Local backends enumerate the full workspace tree via bash `find`. Cloud\n * backends derive the list from git changes (see `useCloudWorkspaceFiles`\n * for the rationale and its limitation), because the cloud API exposes no\n * bash-exec or file-listing endpoint.\n */\nexport function useWorkspaceFiles(): WorkspaceFilesResult {\n const { backend } = useActiveBackend();\n const isCloud = backend.kind === \"cloud\";\n\n const local = useLocalWorkspaceFiles(!isCloud);\n const cloud = useCloudWorkspaceFiles(isCloud);\n\n return isCloud ? cloud : local;\n}\n"],"mappings":";;;;;;;;AAUA,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;AAYA,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;AAaA,SAAS,EAAuB,GAAwC;CACtE,IAAM,IAAa,EAAwB,GAErC,IAAO,QAAc;EACzB,IAAI,CAAC,GAAS;EACd,IAAM,IAAQ,EAAW,KACtB,QAAQ,MAAW,EAAO,WAAW,GAAG,EACxC,KAAK,MAAW,EAAO,IAAI;EAC9B,OAAO,MAAM,KAAK,IAAI,IAAI,CAAK,CAAC,EAAE,MAAM,GAAG,CAAS;CACtD,GAAG,CAAC,GAAS,EAAW,IAAI,CAAC;CAE7B,OAAO;EACL,MAAM,IAAU,IAAO,KAAA;EACvB,WAAW,IAAU,EAAW,YAAY;CAC9C;AACF;AAUA,SAAgB,IAA0C;CACxD,IAAM,EAAE,eAAY,EAAiB,GAC/B,IAAU,EAAQ,SAAS,SAE3B,IAAQ,EAAuB,CAAC,CAAO,GACvC,IAAQ,EAAuB,CAAO;CAE5C,OAAO,IAAU,IAAQ;AAC3B"}
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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Provides an operation that ensures the active backend has an OPENHANDS_URL
3
+ * secret without overwriting an existing value.
4
+ */
5
+ export declare function useResponderUrlSecret(): () => Promise<boolean>;
@@ -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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"}