@openhands/agent-canvas 1.4.0 → 1.5.1

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 (710) hide show
  1. package/README.md +11 -12
  2. package/README.windows.md +4 -2
  3. package/build/assets/{Trans-Ch-OVWEA.js → Trans-DqF_OEZB.js} +1 -1
  4. package/build/assets/{acp-providers-Sy2LKyMa.js → acp-providers-DerAmTyY.js} +1 -1
  5. package/build/assets/active-backend-context-B8rMv0X9.js +1 -0
  6. package/build/assets/{add-backend-modal-Bgy8anoR.js → add-backend-modal-CxC7BNEc.js} +1 -1
  7. package/build/assets/{agent-profiles-settings-3mmXljZX.js → agent-profiles-settings-BJb8YXR1.js} +1 -1
  8. package/build/assets/agent-server-compatibility-BWN-EIQn.js +1 -0
  9. package/build/assets/agent-server-conversation-service.api-DSPIkMwJ.js +41 -0
  10. package/build/assets/{agent-settings-B-W10B4E.js → agent-settings-CgCnqaAA.js} +2 -2
  11. package/build/assets/agent-settings-DDkSavD7.js +1 -0
  12. package/build/assets/{alert-banner-Bpf2NQJq.js → alert-banner-Dh51WURQ.js} +1 -1
  13. package/build/assets/api-key-entry-screen-iZc7n8AI.js +1 -0
  14. package/build/assets/app-settings-B5zyipxJ.js +1 -0
  15. package/build/assets/automation-detail-CZsu2CoM.js +2 -0
  16. package/build/assets/automation-export-BwRX6H32.js +2 -0
  17. package/build/assets/automations-list-lHAVzMoA.js +1 -0
  18. package/build/assets/{back-nav-button-CUS2mi-U.js → back-nav-button-DVknCcSP.js} +1 -1
  19. package/build/assets/backend-form-modal-RGcu909r.js +1 -0
  20. package/build/assets/{backend-synced-settings-badge-D9hZx05w.js → backend-synced-settings-badge-BSfN0AZA.js} +1 -1
  21. package/build/assets/{base-modal-BuF2f0YL.js → base-modal-CIF_785P.js} +1 -1
  22. package/build/assets/{bot-D7eUAuSB.js → bot-C-EA6685.js} +1 -1
  23. package/build/assets/{brand-button-vMVuyDXu.js → brand-button-B1izLAdR.js} +1 -1
  24. package/build/assets/{browser-BifzWIBd.js → browser-DKaeq_sT.js} +3 -3
  25. package/build/assets/{browser-tab-CkkqJnqw.js → browser-tab-qb_ftCxW.js} +1 -1
  26. package/build/assets/canvas-ui-COgjltGz.js +1 -0
  27. package/build/assets/{chat-send-button-B_jc5z5C.js → chat-send-button-BZHG2hAW.js} +1 -1
  28. package/build/assets/check-TbOEtHKj.js +1 -0
  29. package/build/assets/{chevron-down-CI8A6tet.js → chevron-down-D7IvFMBM.js} +1 -1
  30. package/build/assets/{circle-plus-check-toggle-C5YxjxvI.js → circle-plus-check-toggle-DoFIjVE0.js} +1 -1
  31. package/build/assets/client-source-BZK8vRs2.js +1 -0
  32. package/build/assets/cloud-funnel-analytics-Zcv57hfT.js +1 -0
  33. package/build/assets/{color-themes-DPBzNtVg.js → color-themes-CHizm1xF.js} +1 -1
  34. package/build/assets/{combobox-caret-DoObzqf4.js → combobox-caret-CxZpqoSR.js} +1 -1
  35. package/build/assets/{command-menu-D-JV3Wqm.js → command-menu-oTvKDU3Y.js} +1 -1
  36. package/build/assets/condenser-settings-BGlWn93P.js +1 -0
  37. package/build/assets/{confirmation-modal-BGLu6XJN.js → confirmation-modal-DGBWM2Ls.js} +1 -1
  38. package/build/assets/{context-menu-list-item-BD5_EaKN.js → context-menu-list-item-6psNyl7X.js} +1 -1
  39. package/build/assets/conversation-BoCYx8n2.js +89 -0
  40. package/build/assets/conversation-DgHqMjnY.js +1 -0
  41. package/build/assets/conversation-panel-78Rxh_-I.js +1 -0
  42. package/build/assets/conversation-service.api-_f9GlIEi.js +1 -0
  43. package/build/assets/{conversation-tab-empty-state-B2dDYEwf.js → conversation-tab-empty-state-CNUmIms2.js} +1 -1
  44. package/build/assets/{copy-3JCw_XFB.js → copy-D1YGjP-C.js} +1 -1
  45. package/build/assets/{copy-to-clipboard-button-CaR52OnA.js → copy-to-clipboard-button-CFzH_NOX.js} +1 -1
  46. package/build/assets/declaration-BGsHjPEW.js +1 -0
  47. package/build/assets/{device-verify-Dj6I4Iqe.js → device-verify-WBSjJBLH.js} +1 -1
  48. package/build/assets/{dropdown-classes-DJSXeLqc.js → dropdown-classes-D3wMJlXT.js} +1 -1
  49. package/build/assets/{ellipsis-button-C5Z-tPFp.js → ellipsis-button-CbNnHlIq.js} +1 -1
  50. package/build/assets/{entry.client-2_3ePAm0.js → entry.client-DNlPGxsu.js} +2 -2
  51. package/build/assets/{enum-filter-dropdown-DXbVwiNZ.js → enum-filter-dropdown-JLYv1t8L.js} +1 -1
  52. package/build/assets/{environment-switch-overlay-DZQfRGTx.js → environment-switch-overlay-B1PFO8P8.js} +1 -1
  53. package/build/assets/{extensions-hub-CLjmOGqS.js → extensions-hub-CCbLA7IM.js} +1 -1
  54. package/build/assets/{extensions-navigation-B5MeUiMq.js → extensions-navigation-CPNjMNvR.js} +1 -1
  55. package/build/assets/{external-link-D2zJjE9G.js → external-link-lhdITPqq.js} +1 -1
  56. package/build/assets/files-tab-y4K7EXBO.js +1 -0
  57. package/build/assets/{form-control-classes-ChpNBe9n.js → form-control-classes-CbdN5aO3.js} +1 -1
  58. package/build/assets/format-time-delta-DhDbkD7V.js +1 -0
  59. package/build/assets/git-provider-icon-ITvsH4Ko.js +1 -0
  60. package/build/assets/home-BwbeOWwU.js +1 -0
  61. package/build/assets/home-DKPGQ5P3.js +1 -0
  62. package/build/assets/index-home-Bko2Itv5.js +1 -0
  63. package/build/assets/install-server-modal-Qk1gwyI8.js +1 -0
  64. package/build/assets/{launch-V_3Rp7WS.js → launch-CAGavYl-.js} +1 -1
  65. package/build/assets/lesson-plan-DMCPdtrf.js +4 -0
  66. package/build/assets/{list-todo-BfH6yYUK.js → list-todo-CAtvkzcy.js} +1 -1
  67. package/build/assets/llm-not-configured-banner-C1ktyb3C.js +27 -0
  68. package/build/assets/llm-settings-BBsZFi9l.js +1 -0
  69. package/build/assets/llm-settings-DFkJQr_w.js +1 -0
  70. package/build/assets/llm-subscription-service-Casyzgn1.js +1 -0
  71. package/build/assets/loader-circle-CsAsfLIs.js +1 -0
  72. package/build/assets/{loading-spinner-BLdswi6q.js → loading-spinner-BcdnT0mN.js} +1 -1
  73. package/build/assets/manage-backends-modal-CKQ46rvw.js +1 -0
  74. package/build/assets/manifest-03478bbf.js +1 -0
  75. package/build/assets/{map-provider-BM2SJarp.js → map-provider-BbIb12oh.js} +1 -1
  76. package/build/assets/{markdown-renderer-DMT7Zkpd.js → markdown-renderer-B4V2OMFP.js} +1 -1
  77. package/build/assets/{mcp-BQufNPZ6.js → mcp-BapoJsDc.js} +2 -2
  78. package/build/assets/{messages-BnJCqnFf.js → messages-CUBFMY5o.js} +26 -26
  79. package/build/assets/{modal-body-DouOE5KH.js → modal-body-Cc2zp0xb.js} +1 -1
  80. package/build/assets/{modal-classes-Cf-4tbHz.js → modal-classes-3qT9Ap7Q.js} +1 -1
  81. package/build/assets/{modal-close-button-B6CfxxJj.js → modal-close-button-BcIBUdSq.js} +1 -1
  82. package/build/assets/model-selector-DJrMrFAr.js +1 -0
  83. package/build/assets/onboarding-6NMkdNxV.js +1 -0
  84. package/build/assets/onboarding-modal-Q4AnpIdg.js +1 -0
  85. package/build/assets/organization-service.api-vrRNwOma.js +1 -0
  86. package/build/assets/path-utils-PNfCKQDV.js +1 -0
  87. package/build/assets/{pencil-Dj2XjKmI.js → pencil-CWhApFIT.js} +1 -1
  88. package/build/assets/{plan-components-CcCBmCzW.js → plan-components-BdZXPyZU.js} +1 -1
  89. package/build/assets/{planner-tab-Dhyqcqmb.js → planner-tab-ByOw1he8.js} +1 -1
  90. package/build/assets/plugins-management-service-B75jyC56.js +1 -0
  91. package/build/assets/profiles-service.api-BQTklD5D.js +1 -0
  92. package/build/assets/providers-DfTB2gPd.js +1 -0
  93. package/build/assets/proxy-B3tCGf0X.js +1 -0
  94. package/build/assets/{recommended-automations-launcher-CTcGTl4d.js → recommended-automations-launcher-Bj7PuHY1.js} +1 -1
  95. package/build/assets/{refresh-cw-DM82EIyx.js → refresh-cw-B9B7-vsy.js} +1 -1
  96. package/build/assets/root-CDnuTToz.js +2 -0
  97. package/build/assets/root-CYWeTrWE.css +1 -0
  98. package/build/assets/root-layout-DfYVlcRG.js +2 -0
  99. package/build/assets/{runtime-waiting-state-BsXLElvN.js → runtime-waiting-state-CnyVhX4T.js} +1 -1
  100. package/build/assets/schema-field-CUwk4wrQ.js +1 -0
  101. package/build/assets/sdk-section-page-DLLNrYjI.js +1 -0
  102. package/build/assets/{sdk-settings-schema-Cv7M9eSe.js → sdk-settings-schema-CLR01YIK.js} +1 -1
  103. package/build/assets/search-dIQ09UY2.js +1 -0
  104. package/build/assets/secrets-service-CvyPWJhg.js +1 -0
  105. package/build/assets/{secrets-settings-Cx6yJlyb.js → secrets-settings-CHy72A5C.js} +1 -1
  106. package/build/assets/{segmented-toggle-DyQqPhoD.js → segmented-toggle-kzwZkLaj.js} +1 -1
  107. package/build/assets/settings-B9S8UVQr.js +1 -0
  108. package/build/assets/{settings-dropdown-input-BjunGXJb.js → settings-dropdown-input-Dhx9ErGd.js} +1 -1
  109. package/build/assets/{settings-index-D6sxWSRk.js → settings-index-BKDl2CQ-.js} +1 -1
  110. package/build/assets/{settings-input-bD6npsDm.js → settings-input-BsgQWS5R.js} +1 -1
  111. package/build/assets/{settings-list-classes-Dp_OgzN0.js → settings-list-classes-DSJJX99U.js} +1 -1
  112. package/build/assets/settings-modal-DeK11CyT.js +1 -0
  113. package/build/assets/settings-service.api-DXk5TdeJ.js +1 -0
  114. package/build/assets/{settings-switch-5cuxl8Dc.js → settings-switch-Bes8dIlV.js} +1 -1
  115. package/build/assets/{settings-utils-BMdG65By.js → settings-utils-DzCVfiR3.js} +1 -1
  116. package/build/assets/shared-conversation-9atDzTR4.js +1 -0
  117. package/build/assets/{sidebar-layout-DuzJMMw-.js → sidebar-layout-Bm7pa3Vk.js} +1 -1
  118. package/build/assets/{sidebar-mobile-menu-toggle-VvvX32iF.js → sidebar-mobile-menu-toggle-giMMZctn.js} +1 -1
  119. package/build/assets/{sidebar-nav-link-5AlTT5-j.js → sidebar-nav-link-CHqyFXwV.js} +1 -1
  120. package/build/assets/{sidebar-store-CZuE8AH5.js → sidebar-store-uiUXBU1N.js} +1 -1
  121. package/build/assets/{skill-card-pill-row-eTIkE4nz.js → skill-card-pill-row-BPYKQ3IN.js} +1 -1
  122. package/build/assets/skills-plugins-Tropusio.js +1 -0
  123. package/build/assets/{skills-settings-BUv04tSc.js → skills-settings-BvzBBCWk.js} +2 -2
  124. package/build/assets/{square-chevron-right-Czw3FFWc.js → square-chevron-right-DE-JN-2Z.js} +1 -1
  125. package/build/assets/{styled-tooltip-CgX2oRaK.js → styled-tooltip-B14i_Uac.js} +1 -1
  126. package/build/assets/{suspense-BO1Tl_Vf.js → suspense-DmZ3MSSh.js} +1 -1
  127. package/build/assets/{task-list-tab-0k9PhuqO.js → task-list-tab-DyfgG4MC.js} +1 -1
  128. package/build/assets/telemetry-C5JMEfqB.js +2 -0
  129. package/build/assets/{terminal-B61WrJdS.js → terminal-DRXt2Lr4.js} +1 -1
  130. package/build/assets/{toggle-switch-2j5wwR85.js → toggle-switch-DX_k418f.js} +1 -1
  131. package/build/assets/{trash-2-Be_7y3Mn.js → trash-2-BU6BlW4i.js} +1 -1
  132. package/build/assets/{typography-D8mHDeNG.js → typography-CzfoD9DY.js} +1 -1
  133. package/build/assets/use-acp-credential-form-Bm8qXdlc.js +1 -0
  134. package/build/assets/{use-activate-agent-profile-20v1xU0H.js → use-activate-agent-profile-DlykqEfN.js} +1 -1
  135. package/build/assets/{use-active-agent-profile-BkJN7Xsy.js → use-active-agent-profile-hI-x-UBa.js} +1 -1
  136. package/build/assets/{use-active-conversation-DOZVSVtU.js → use-active-conversation-2qeez40F.js} +1 -1
  137. package/build/assets/use-agent-profiles-0pr5bLS7.js +1 -0
  138. package/build/assets/{use-agent-state-DHZO1obC.js → use-agent-state-C6peDXUm.js} +1 -1
  139. package/build/assets/use-backends-health-CLHPitJM.js +1 -0
  140. package/build/assets/{use-can-manage-org-profiles-C-OhWVBS.js → use-can-manage-org-profiles-Ck_bsNbH.js} +1 -1
  141. package/build/assets/use-cloud-current-user-id-DUCSxNjY.js +1 -0
  142. package/build/assets/use-config-B5r8erYt.js +1 -0
  143. package/build/assets/use-create-conversation-r1JHfKO5.js +1 -0
  144. package/build/assets/{use-create-secret-D0HCOZFu.js → use-create-secret-Cf2N11d2.js} +1 -1
  145. package/build/assets/{use-event-store-DjgU4wfO.js → use-event-store-Bbaz51GR.js} +1 -1
  146. package/build/assets/{use-handle-plan-click-DyRASKMC.js → use-handle-plan-click-CsAW3FlH.js} +1 -1
  147. package/build/assets/use-is-authed-BezEyfeh.js +1 -0
  148. package/build/assets/use-llm-profiles-Dr5__SlZ.js +1 -0
  149. package/build/assets/use-plugins-marketplace-BplU65ae.js +1 -0
  150. package/build/assets/use-runtime-is-ready-vCFOcLFa.js +1 -0
  151. package/build/assets/use-save-agent-profile-RqUGqTv6.js +1 -0
  152. package/build/assets/use-save-settings-Chvzeu2s.js +1 -0
  153. package/build/assets/use-settings-CyxSlyTQ.js +1 -0
  154. package/build/assets/use-settings-nav-items-zEkSO_Bf.js +16 -0
  155. package/build/assets/use-skills-xrVoKYrF.js +1 -0
  156. package/build/assets/{use-task-list-AVBLbbcR.js → use-task-list-CfisapBW.js} +1 -1
  157. package/build/assets/use-tracking-D2Qg5Lpd.js +1 -0
  158. package/build/assets/{use-user-conversation-zpx7I18x.js → use-user-conversation-CnE4zhOA.js} +1 -1
  159. package/build/assets/{useMutation-DrCAVg5w.js → useMutation-u8UgRgDK.js} +1 -1
  160. package/build/assets/{useMutationState-D8QN0ZCy.js → useMutationState-OnAsCLA_.js} +1 -1
  161. package/build/assets/{useQueries-DClgUTc7.js → useQueries-BpIlT8Mt.js} +1 -1
  162. package/build/assets/{useQuery-CRBP8vIS.js → useQuery-D5pEZbY0.js} +1 -1
  163. package/build/assets/{useTranslation-CDRCKC9-.js → useTranslation-Cbf5AGg_.js} +1 -1
  164. package/build/assets/{utils-D3U3rlqr.js → utils-DB9LsAzA.js} +1 -1
  165. package/build/assets/{vendor~browser-tab-Di0kh5Zw.js → vendor~browser-tab-CsMb-pta.js} +1 -1
  166. package/build/assets/{vendor~browser-Cvg7jXCP.js → vendor~browser-wXQ-WZEC.js} +1 -1
  167. package/build/assets/{vendor~entry.client-9tWQ_Ugw.js → vendor~entry.client-DDuH4--y.js} +1 -1
  168. package/build/assets/{vendor~entry.client-D6BtSOtn.js → vendor~entry.client-DQGrNspu.js} +1 -1
  169. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~dhilvkxv-eGLBu60s.js +2 -0
  170. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~iztiaf2o-rqo6vRFz.js +185 -0
  171. package/build/assets/{vendor~files-tab-B02k3xvx.js → vendor~files-tab-B-5fBohe.js} +1 -1
  172. package/build/assets/{vendor~home~conversation-panel~conversation-CYMF9JYB.js → vendor~index-home~home~conversation-panel~conversation-ChmYLVgz.js} +1 -1
  173. package/build/assets/vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BD7v71DM.js +2 -0
  174. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BD0GaRGa.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BT05Osu4.js} +1 -1
  175. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-D7EUmQ8Y.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DgzWSMRc.js} +1 -1
  176. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-d8aETPbZ.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DqZatR3B.js} +1 -1
  177. package/build/assets/{vendor~launch-CHXA9cJu.js → vendor~launch-_Km3J77E.js} +1 -1
  178. package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~ivvrgjsa-BlIZPCXX.js → vendor~module-D5a_AClf.js} +1 -1
  179. package/build/assets/{vendor~root-layout~conversation-panel~conversation-CpiTHpHl.js → vendor~root-layout~conversation-panel~conversation-8tIsyrPj.js} +1 -1
  180. package/build/assets/{vendor~root-layout~conversation-panel~conversation~shared-conversation-_TdZcNMD.js → vendor~root-layout~conversation-panel~conversation~shared-conversation-BrguKXCn.js} +1 -1
  181. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation-Cn2jwSga.js → vendor~root-layout~index-home~home~conversation-panel~conversation-BTvhGHHG.js} +1 -1
  182. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~shared-conversation~alert-banner~pl~rqjteh0a-CZM4hwUT.js → vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation~aler~gfu7qdtz-BOKQkbc6.js} +1 -1
  183. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~settings~settings-index~agen~enjl5xdm-B0EIDu4M.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~ftka0fnu-cFNmfAE6.js} +2 -2
  184. package/build/assets/{verification-settings-D576N2xa.js → verification-settings-CfkrXoSa.js} +1 -1
  185. package/build/assets/x-ZE4iplpF.js +1 -0
  186. package/build/index.html +4 -4
  187. package/build/locales/ar/openhands.json +9 -0
  188. package/build/locales/ca/openhands.json +9 -0
  189. package/build/locales/de/openhands.json +9 -0
  190. package/build/locales/en/openhands.json +9 -0
  191. package/build/locales/es/openhands.json +9 -0
  192. package/build/locales/fr/openhands.json +9 -0
  193. package/build/locales/it/openhands.json +9 -0
  194. package/build/locales/ja/openhands.json +9 -0
  195. package/build/locales/ko-KR/openhands.json +9 -0
  196. package/build/locales/no/openhands.json +9 -0
  197. package/build/locales/pt/openhands.json +9 -0
  198. package/build/locales/tr/openhands.json +9 -0
  199. package/build/locales/uk/openhands.json +9 -0
  200. package/build/locales/zh-CN/openhands.json +9 -0
  201. package/build/locales/zh-TW/openhands.json +9 -0
  202. package/config/defaults.json +5 -4
  203. package/dist/api/agent-server-adapter.cjs +3 -3
  204. package/dist/api/agent-server-adapter.cjs.map +1 -1
  205. package/dist/api/agent-server-adapter.d.ts +9 -1
  206. package/dist/api/agent-server-adapter.js +105 -102
  207. package/dist/api/agent-server-adapter.js.map +1 -1
  208. package/dist/api/agent-server-config.cjs +1 -1
  209. package/dist/api/agent-server-config.cjs.map +1 -1
  210. package/dist/api/agent-server-config.d.ts +3 -0
  211. package/dist/api/agent-server-config.js +45 -23
  212. package/dist/api/agent-server-config.js.map +1 -1
  213. package/dist/api/backend-registry/auth.cjs +1 -1
  214. package/dist/api/backend-registry/auth.cjs.map +1 -1
  215. package/dist/api/backend-registry/auth.js +1 -1
  216. package/dist/api/backend-registry/auth.js.map +1 -1
  217. package/dist/api/backend-registry/default-backend.cjs +1 -1
  218. package/dist/api/backend-registry/default-backend.cjs.map +1 -1
  219. package/dist/api/backend-registry/default-backend.d.ts +3 -0
  220. package/dist/api/backend-registry/default-backend.js +22 -10
  221. package/dist/api/backend-registry/default-backend.js.map +1 -1
  222. package/dist/api/backend-registry/storage.cjs +1 -1
  223. package/dist/api/backend-registry/storage.cjs.map +1 -1
  224. package/dist/api/backend-registry/storage.js +38 -33
  225. package/dist/api/backend-registry/storage.js.map +1 -1
  226. package/dist/api/backend-registry/types.d.ts +2 -0
  227. package/dist/api/canvas-ui-client-tool.cjs +38 -0
  228. package/dist/api/canvas-ui-client-tool.cjs.map +1 -0
  229. package/dist/api/canvas-ui-client-tool.d.ts +14 -0
  230. package/dist/api/canvas-ui-client-tool.js +47 -0
  231. package/dist/api/canvas-ui-client-tool.js.map +1 -0
  232. package/dist/api/client-source.cjs +2 -0
  233. package/dist/api/client-source.cjs.map +1 -0
  234. package/dist/api/client-source.d.ts +9 -0
  235. package/dist/api/client-source.js +10 -0
  236. package/dist/api/client-source.js.map +1 -0
  237. package/dist/api/cloud/client.cjs +2 -0
  238. package/dist/api/cloud/client.cjs.map +1 -0
  239. package/dist/api/cloud/client.d.ts +4 -0
  240. package/dist/api/cloud/client.js +38 -0
  241. package/dist/api/cloud/client.js.map +1 -0
  242. package/dist/api/cloud/conversation-service.api.cjs +1 -1
  243. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  244. package/dist/api/cloud/conversation-service.api.js +35 -33
  245. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  246. package/dist/api/cloud/organization-service.api.cjs +1 -1
  247. package/dist/api/cloud/organization-service.api.cjs.map +1 -1
  248. package/dist/api/cloud/organization-service.api.js +11 -10
  249. package/dist/api/cloud/organization-service.api.js.map +1 -1
  250. package/dist/api/cloud/proxy.cjs +1 -1
  251. package/dist/api/cloud/proxy.cjs.map +1 -1
  252. package/dist/api/cloud/proxy.d.ts +2 -40
  253. package/dist/api/cloud/proxy.js +14 -39
  254. package/dist/api/cloud/proxy.js.map +1 -1
  255. package/dist/api/conversation-metadata-store.cjs +1 -1
  256. package/dist/api/conversation-metadata-store.cjs.map +1 -1
  257. package/dist/api/conversation-metadata-store.d.ts +2 -9
  258. package/dist/api/conversation-metadata-store.js +13 -9
  259. package/dist/api/conversation-metadata-store.js.map +1 -1
  260. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  261. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  262. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +2 -1
  263. package/dist/api/conversation-service/agent-server-conversation-service.api.js +98 -88
  264. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  265. package/dist/api/conversation-service/agent-server-conversation-service.types.d.ts +5 -0
  266. package/dist/api/device-flow-client.cjs +1 -1
  267. package/dist/api/device-flow-client.cjs.map +1 -1
  268. package/dist/api/device-flow-client.d.ts +4 -58
  269. package/dist/api/device-flow-client.js +8 -98
  270. package/dist/api/device-flow-client.js.map +1 -1
  271. package/dist/api/git-service/agent-server-git-service.api.cjs +1 -1
  272. package/dist/api/git-service/agent-server-git-service.api.cjs.map +1 -1
  273. package/dist/api/git-service/agent-server-git-service.api.d.ts +10 -2
  274. package/dist/api/git-service/agent-server-git-service.api.js +107 -40
  275. package/dist/api/git-service/agent-server-git-service.api.js.map +1 -1
  276. package/dist/api/open-hands.types.d.ts +11 -0
  277. package/dist/api/option-service/option-service.api.cjs +1 -1
  278. package/dist/api/option-service/option-service.api.cjs.map +1 -1
  279. package/dist/api/option-service/option-service.api.js +0 -1
  280. package/dist/api/option-service/option-service.api.js.map +1 -1
  281. package/dist/api/option-service/option.types.d.ts +0 -1
  282. package/dist/api/secrets-service.cjs +1 -1
  283. package/dist/api/secrets-service.cjs.map +1 -1
  284. package/dist/api/secrets-service.js +15 -14
  285. package/dist/api/secrets-service.js.map +1 -1
  286. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  287. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  288. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +73 -64
  289. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  290. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.cjs +2 -2
  291. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.cjs.map +1 -1
  292. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.js +2 -0
  293. package/dist/components/conversation-events/chat/event-content-helpers/get-observation-content.js.map +1 -1
  294. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  295. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  296. package/dist/components/features/backends/backend-form-modal.d.ts +4 -2
  297. package/dist/components/features/backends/backend-form-modal.js +108 -101
  298. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  299. package/dist/components/features/backends/backend-row.cjs +1 -1
  300. package/dist/components/features/backends/backend-row.cjs.map +1 -1
  301. package/dist/components/features/backends/backend-row.js +2 -1
  302. package/dist/components/features/backends/backend-row.js.map +1 -1
  303. package/dist/components/features/backends/backend-selector.cjs +1 -1
  304. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  305. package/dist/components/features/backends/backend-selector.js +51 -51
  306. package/dist/components/features/backends/backend-selector.js.map +1 -1
  307. package/dist/components/features/backends/device-flow-auth.cjs +1 -1
  308. package/dist/components/features/backends/device-flow-auth.cjs.map +1 -1
  309. package/dist/components/features/backends/device-flow-auth.d.ts +4 -1
  310. package/dist/components/features/backends/device-flow-auth.js +38 -38
  311. package/dist/components/features/backends/device-flow-auth.js.map +1 -1
  312. package/dist/components/features/chat/chat-interface.cjs +2 -2
  313. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  314. package/dist/components/features/chat/chat-interface.js +173 -165
  315. package/dist/components/features/chat/chat-interface.js.map +1 -1
  316. package/dist/components/features/chat/components/chat-input-actions.cjs +1 -1
  317. package/dist/components/features/chat/components/chat-input-actions.cjs.map +1 -1
  318. package/dist/components/features/chat/components/chat-input-actions.d.ts +2 -1
  319. package/dist/components/features/chat/components/chat-input-actions.js +44 -43
  320. package/dist/components/features/chat/components/chat-input-actions.js.map +1 -1
  321. package/dist/components/features/chat/components/chat-input-container.cjs +1 -1
  322. package/dist/components/features/chat/components/chat-input-container.cjs.map +1 -1
  323. package/dist/components/features/chat/components/chat-input-container.d.ts +2 -1
  324. package/dist/components/features/chat/components/chat-input-container.js +20 -19
  325. package/dist/components/features/chat/components/chat-input-container.js.map +1 -1
  326. package/dist/components/features/chat/components/chat-input-profile-picker.cjs +1 -1
  327. package/dist/components/features/chat/components/chat-input-profile-picker.cjs.map +1 -1
  328. package/dist/components/features/chat/components/chat-input-profile-picker.js +44 -32
  329. package/dist/components/features/chat/components/chat-input-profile-picker.js.map +1 -1
  330. package/dist/components/features/chat/components/resolve-picker-kind.cjs +1 -1
  331. package/dist/components/features/chat/components/resolve-picker-kind.cjs.map +1 -1
  332. package/dist/components/features/chat/components/resolve-picker-kind.d.ts +10 -22
  333. package/dist/components/features/chat/components/resolve-picker-kind.js +6 -3
  334. package/dist/components/features/chat/components/resolve-picker-kind.js.map +1 -1
  335. package/dist/components/features/chat/custom-chat-input.cjs +1 -1
  336. package/dist/components/features/chat/custom-chat-input.cjs.map +1 -1
  337. package/dist/components/features/chat/custom-chat-input.d.ts +2 -1
  338. package/dist/components/features/chat/custom-chat-input.js +52 -51
  339. package/dist/components/features/chat/custom-chat-input.js.map +1 -1
  340. package/dist/components/features/chat/interactive-chat-box.cjs +1 -1
  341. package/dist/components/features/chat/interactive-chat-box.cjs.map +1 -1
  342. package/dist/components/features/chat/interactive-chat-box.d.ts +2 -1
  343. package/dist/components/features/chat/interactive-chat-box.js +9 -8
  344. package/dist/components/features/chat/interactive-chat-box.js.map +1 -1
  345. package/dist/components/features/diff-viewer/commit-list.cjs +2 -0
  346. package/dist/components/features/diff-viewer/commit-list.cjs.map +1 -0
  347. package/dist/components/features/diff-viewer/commit-list.d.ts +13 -0
  348. package/dist/components/features/diff-viewer/commit-list.js +27 -0
  349. package/dist/components/features/diff-viewer/commit-list.js.map +1 -0
  350. package/dist/components/features/diff-viewer/commit-row.cjs +2 -0
  351. package/dist/components/features/diff-viewer/commit-row.cjs.map +1 -0
  352. package/dist/components/features/diff-viewer/commit-row.d.ts +14 -0
  353. package/dist/components/features/diff-viewer/commit-row.js +59 -0
  354. package/dist/components/features/diff-viewer/commit-row.js.map +1 -0
  355. package/dist/components/features/diff-viewer/file-diff-viewer.cjs +1 -1
  356. package/dist/components/features/diff-viewer/file-diff-viewer.cjs.map +1 -1
  357. package/dist/components/features/diff-viewer/file-diff-viewer.d.ts +7 -1
  358. package/dist/components/features/diff-viewer/file-diff-viewer.js +40 -39
  359. package/dist/components/features/diff-viewer/file-diff-viewer.js.map +1 -1
  360. package/dist/components/features/plugins/plugin-detail-modal.d.ts +2 -1
  361. package/dist/components/providers/agent-server-ui-providers.cjs +1 -1
  362. package/dist/components/providers/agent-server-ui-providers.cjs.map +1 -1
  363. package/dist/components/providers/agent-server-ui-providers.d.ts +4 -2
  364. package/dist/components/providers/agent-server-ui-providers.js +9 -2
  365. package/dist/components/providers/agent-server-ui-providers.js.map +1 -1
  366. package/dist/components/providers/index.cjs +1 -1
  367. package/dist/components/providers/index.d.ts +1 -2
  368. package/dist/components/providers/index.js +0 -1
  369. package/dist/components/providers/telemetry-provider.cjs +2 -0
  370. package/dist/components/providers/telemetry-provider.cjs.map +1 -0
  371. package/dist/components/providers/telemetry-provider.d.ts +6 -0
  372. package/dist/components/providers/telemetry-provider.js +64 -0
  373. package/dist/components/providers/telemetry-provider.js.map +1 -0
  374. package/dist/components/shared/modals/settings/settings-modal.cjs +1 -1
  375. package/dist/components/shared/modals/settings/settings-modal.cjs.map +1 -1
  376. package/dist/components/shared/modals/settings/settings-modal.js +23 -22
  377. package/dist/components/shared/modals/settings/settings-modal.js.map +1 -1
  378. package/dist/config/defaults.cjs +1 -1
  379. package/dist/config/defaults.cjs.map +1 -1
  380. package/dist/config/defaults.js +5 -4
  381. package/dist/config/defaults.js.map +1 -1
  382. package/dist/constants/acp-providers.cjs.map +1 -1
  383. package/dist/constants/acp-providers.d.ts +1 -1
  384. package/dist/constants/acp-providers.js.map +1 -1
  385. package/dist/constants/canvas-ui.cjs +2 -0
  386. package/dist/constants/canvas-ui.cjs.map +1 -0
  387. package/dist/constants/canvas-ui.d.ts +8 -0
  388. package/dist/constants/canvas-ui.js +6 -0
  389. package/dist/constants/canvas-ui.js.map +1 -0
  390. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  391. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  392. package/dist/contexts/conversation-websocket-context.js +197 -204
  393. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  394. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  395. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  396. package/dist/hooks/mutation/use-create-conversation.d.ts +2 -1
  397. package/dist/hooks/mutation/use-create-conversation.js +52 -52
  398. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  399. package/dist/hooks/mutation/use-save-settings.cjs +1 -1
  400. package/dist/hooks/mutation/use-save-settings.cjs.map +1 -1
  401. package/dist/hooks/mutation/use-save-settings.d.ts +3 -1
  402. package/dist/hooks/mutation/use-save-settings.js +6 -5
  403. package/dist/hooks/mutation/use-save-settings.js.map +1 -1
  404. package/dist/hooks/query/query-keys.cjs +1 -1
  405. package/dist/hooks/query/query-keys.cjs.map +1 -1
  406. package/dist/hooks/query/query-keys.d.ts +2 -0
  407. package/dist/hooks/query/query-keys.js +4 -1
  408. package/dist/hooks/query/query-keys.js.map +1 -1
  409. package/dist/hooks/query/use-backends-health.cjs +1 -1
  410. package/dist/hooks/query/use-backends-health.cjs.map +1 -1
  411. package/dist/hooks/query/use-backends-health.js +50 -48
  412. package/dist/hooks/query/use-backends-health.js.map +1 -1
  413. package/dist/hooks/query/use-cloud-organizations.cjs +1 -1
  414. package/dist/hooks/query/use-cloud-organizations.cjs.map +1 -1
  415. package/dist/hooks/query/use-cloud-organizations.d.ts +1 -0
  416. package/dist/hooks/query/use-cloud-organizations.js +5 -2
  417. package/dist/hooks/query/use-cloud-organizations.js.map +1 -1
  418. package/dist/hooks/query/use-commit-changes.cjs +2 -0
  419. package/dist/hooks/query/use-commit-changes.cjs.map +1 -0
  420. package/dist/hooks/query/use-commit-changes.d.ts +5 -0
  421. package/dist/hooks/query/use-commit-changes.js +34 -0
  422. package/dist/hooks/query/use-commit-changes.js.map +1 -0
  423. package/dist/hooks/query/use-task-polling.cjs +1 -1
  424. package/dist/hooks/query/use-task-polling.cjs.map +1 -1
  425. package/dist/hooks/query/use-task-polling.d.ts +3 -2
  426. package/dist/hooks/query/use-task-polling.js +53 -40
  427. package/dist/hooks/query/use-task-polling.js.map +1 -1
  428. package/dist/hooks/query/use-unified-git-commits.cjs +2 -0
  429. package/dist/hooks/query/use-unified-git-commits.cjs.map +1 -0
  430. package/dist/hooks/query/use-unified-git-commits.d.ts +10 -0
  431. package/dist/hooks/query/use-unified-git-commits.js +41 -0
  432. package/dist/hooks/query/use-unified-git-commits.js.map +1 -0
  433. package/dist/hooks/query/use-unified-git-diff.cjs +1 -1
  434. package/dist/hooks/query/use-unified-git-diff.cjs.map +1 -1
  435. package/dist/hooks/query/use-unified-git-diff.d.ts +5 -0
  436. package/dist/hooks/query/use-unified-git-diff.js +11 -4
  437. package/dist/hooks/query/use-unified-git-diff.js.map +1 -1
  438. package/dist/hooks/use-acp-model-context.cjs +1 -1
  439. package/dist/hooks/use-acp-model-context.cjs.map +1 -1
  440. package/dist/hooks/use-acp-model-context.d.ts +4 -1
  441. package/dist/hooks/use-acp-model-context.js +9 -8
  442. package/dist/hooks/use-acp-model-context.js.map +1 -1
  443. package/dist/hooks/use-auto-refresh-files-on-edit.cjs +1 -1
  444. package/dist/hooks/use-auto-refresh-files-on-edit.cjs.map +1 -1
  445. package/dist/hooks/use-auto-refresh-files-on-edit.js +1 -1
  446. package/dist/hooks/use-auto-refresh-files-on-edit.js.map +1 -1
  447. package/dist/hooks/use-chat-input-model-state.cjs.map +1 -1
  448. package/dist/hooks/use-chat-input-model-state.d.ts +2 -1
  449. package/dist/hooks/use-chat-input-model-state.js.map +1 -1
  450. package/dist/hooks/use-chat-input-profile-state.cjs +1 -1
  451. package/dist/hooks/use-chat-input-profile-state.cjs.map +1 -1
  452. package/dist/hooks/use-chat-input-profile-state.d.ts +1 -10
  453. package/dist/hooks/use-chat-input-profile-state.js +42 -15
  454. package/dist/hooks/use-chat-input-profile-state.js.map +1 -1
  455. package/dist/hooks/use-device-flow.cjs +1 -1
  456. package/dist/hooks/use-device-flow.cjs.map +1 -1
  457. package/dist/hooks/use-device-flow.d.ts +4 -1
  458. package/dist/hooks/use-device-flow.js +42 -40
  459. package/dist/hooks/use-device-flow.js.map +1 -1
  460. package/dist/hooks/use-telemetry.cjs +1 -1
  461. package/dist/hooks/use-telemetry.cjs.map +1 -1
  462. package/dist/hooks/use-telemetry.d.ts +3 -3
  463. package/dist/hooks/use-telemetry.js +16 -22
  464. package/dist/hooks/use-telemetry.js.map +1 -1
  465. package/dist/hooks/use-tracking.cjs +1 -1
  466. package/dist/hooks/use-tracking.cjs.map +1 -1
  467. package/dist/hooks/use-tracking.d.ts +5 -5
  468. package/dist/hooks/use-tracking.js +37 -37
  469. package/dist/hooks/use-tracking.js.map +1 -1
  470. package/dist/i18n/declaration.cjs +1 -1
  471. package/dist/i18n/declaration.cjs.map +1 -1
  472. package/dist/i18n/declaration.d.ts +9 -0
  473. package/dist/i18n/declaration.js +1 -1
  474. package/dist/i18n/declaration.js.map +1 -1
  475. package/dist/i18n/index.cjs +1 -1
  476. package/dist/i18n/index.cjs.map +1 -1
  477. package/dist/i18n/index.js +19 -18
  478. package/dist/i18n/index.js.map +1 -1
  479. package/dist/i18n/translation.cjs +2 -2
  480. package/dist/i18n/translation.cjs.map +1 -1
  481. package/dist/i18n/translation.js +153 -0
  482. package/dist/i18n/translation.js.map +1 -1
  483. package/dist/index.cjs +1 -1
  484. package/dist/index.js +32 -32
  485. package/dist/lib/index.cjs +1 -1
  486. package/dist/lib/index.d.ts +2 -2
  487. package/dist/lib/index.js +1 -1
  488. package/dist/locales/ar/openhands.json +9 -0
  489. package/dist/locales/ca/openhands.json +9 -0
  490. package/dist/locales/de/openhands.json +9 -0
  491. package/dist/locales/en/openhands.json +9 -0
  492. package/dist/locales/es/openhands.json +9 -0
  493. package/dist/locales/fr/openhands.json +9 -0
  494. package/dist/locales/it/openhands.json +9 -0
  495. package/dist/locales/ja/openhands.json +9 -0
  496. package/dist/locales/ko-KR/openhands.json +9 -0
  497. package/dist/locales/no/openhands.json +9 -0
  498. package/dist/locales/pt/openhands.json +9 -0
  499. package/dist/locales/tr/openhands.json +9 -0
  500. package/dist/locales/uk/openhands.json +9 -0
  501. package/dist/locales/zh-CN/openhands.json +9 -0
  502. package/dist/locales/zh-TW/openhands.json +9 -0
  503. package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.cjs +2 -0
  504. package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.cjs.map +1 -0
  505. package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.js +351 -0
  506. package/dist/node_modules/@openhands/typescript-client/dist/client/cloud-client.js.map +1 -0
  507. package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.cjs +2 -0
  508. package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.cjs.map +1 -0
  509. package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.js +106 -0
  510. package/dist/node_modules/@openhands/typescript-client/dist/client/device-flow-client.js.map +1 -0
  511. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs +2 -0
  512. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs.map +1 -0
  513. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js +69 -0
  514. package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js.map +1 -0
  515. package/dist/node_modules/@openhands/typescript-client/dist/clients.cjs +1 -1
  516. package/dist/node_modules/@openhands/typescript-client/dist/clients.js +3 -0
  517. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs +1 -1
  518. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs.map +1 -1
  519. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js +18 -2
  520. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js.map +1 -1
  521. package/dist/node_modules/@openhands/typescript-client/dist/models/acp.cjs.map +1 -1
  522. package/dist/node_modules/@openhands/typescript-client/dist/models/acp.js.map +1 -1
  523. package/dist/node_modules/axios/index.cjs +1 -1
  524. package/dist/node_modules/axios/index.js +1 -1
  525. package/dist/package.cjs +1 -1
  526. package/dist/package.cjs.map +1 -1
  527. package/dist/package.js +3 -3
  528. package/dist/package.js.map +1 -1
  529. package/dist/routes/app-settings.cjs +1 -1
  530. package/dist/routes/app-settings.cjs.map +1 -1
  531. package/dist/routes/app-settings.js +59 -60
  532. package/dist/routes/app-settings.js.map +1 -1
  533. package/dist/routes/commits-tab.cjs +2 -0
  534. package/dist/routes/commits-tab.cjs.map +1 -0
  535. package/dist/routes/commits-tab.d.ts +8 -0
  536. package/dist/routes/commits-tab.js +45 -0
  537. package/dist/routes/commits-tab.js.map +1 -0
  538. package/dist/routes/files-tab.cjs +1 -1
  539. package/dist/routes/files-tab.cjs.map +1 -1
  540. package/dist/routes/files-tab.js +148 -127
  541. package/dist/routes/files-tab.js.map +1 -1
  542. package/dist/routes/llm-settings.cjs +1 -1
  543. package/dist/routes/llm-settings.cjs.map +1 -1
  544. package/dist/routes/llm-settings.js +4 -1
  545. package/dist/routes/llm-settings.js.map +1 -1
  546. package/dist/services/cloud-funnel-analytics.cjs +2 -0
  547. package/dist/services/cloud-funnel-analytics.cjs.map +1 -0
  548. package/dist/services/cloud-funnel-analytics.d.ts +4 -0
  549. package/dist/services/cloud-funnel-analytics.js +39 -0
  550. package/dist/services/cloud-funnel-analytics.js.map +1 -0
  551. package/dist/services/telemetry.cjs +1 -1
  552. package/dist/services/telemetry.cjs.map +1 -1
  553. package/dist/services/telemetry.d.ts +46 -9
  554. package/dist/services/telemetry.js +182 -71
  555. package/dist/services/telemetry.js.map +1 -1
  556. package/dist/themes/color-themes.cjs.map +1 -1
  557. package/dist/themes/color-themes.d.ts +3 -6
  558. package/dist/themes/color-themes.js.map +1 -1
  559. package/dist/types/agent-server/core/base/action.d.ts +5 -4
  560. package/dist/types/agent-server/core/base/base.d.ts +3 -2
  561. package/dist/types/agent-server/core/base/observation.d.ts +1 -1
  562. package/dist/types/agent-server/type-guards.cjs +1 -1
  563. package/dist/types/agent-server/type-guards.cjs.map +1 -1
  564. package/dist/types/agent-server/type-guards.d.ts +3 -5
  565. package/dist/types/agent-server/type-guards.js +2 -1
  566. package/dist/types/agent-server/type-guards.js.map +1 -1
  567. package/dist/types/automation.d.ts +5 -0
  568. package/dist/utils/api-error-message.d.ts +11 -0
  569. package/dist/utils/automation-timeout.d.ts +19 -0
  570. package/dist/utils/base-path.cjs +2 -0
  571. package/dist/utils/base-path.cjs.map +1 -0
  572. package/dist/utils/base-path.d.ts +2 -0
  573. package/dist/utils/base-path.js +23 -0
  574. package/dist/utils/base-path.js.map +1 -0
  575. package/dist/utils/error-handler.cjs +1 -1
  576. package/dist/utils/error-handler.cjs.map +1 -1
  577. package/dist/utils/error-handler.d.ts +1 -4
  578. package/dist/utils/error-handler.js +6 -7
  579. package/dist/utils/error-handler.js.map +1 -1
  580. package/dist/utils/map-provider.cjs +1 -1
  581. package/dist/utils/map-provider.cjs.map +1 -1
  582. package/dist/utils/map-provider.d.ts +1 -0
  583. package/dist/utils/map-provider.js +2 -1
  584. package/dist/utils/map-provider.js.map +1 -1
  585. package/package.json +3 -3
  586. package/scripts/check-sdk-version-sync.mjs +6 -6
  587. package/scripts/dev-safe.mjs +7 -8
  588. package/scripts/dev-static.mjs +3 -0
  589. package/scripts/dev-with-automation.mjs +3 -0
  590. package/scripts/docker-build.mjs +4 -0
  591. package/scripts/static-server.mjs +93 -7
  592. package/tools/canvas_ui_tool.py +14 -8
  593. package/build/assets/active-backend-context-hxq31W25.js +0 -1
  594. package/build/assets/agent-server-client-options-DVLRd9sw.js +0 -1
  595. package/build/assets/agent-server-conversation-service.api-CuSdr4Qb.js +0 -5
  596. package/build/assets/agent-settings-D_yOy8XB.js +0 -1
  597. package/build/assets/api-key-entry-screen-Dl0qVYi4.js +0 -1
  598. package/build/assets/app-settings-yVizGXox.js +0 -1
  599. package/build/assets/automation-detail-dvJfLs5u.js +0 -2
  600. package/build/assets/automation-export-BPcgLqPD.js +0 -2
  601. package/build/assets/automations-list-CUXogTe0.js +0 -1
  602. package/build/assets/backend-form-modal-CQJGmItq.js +0 -1
  603. package/build/assets/check-Bvi71siz.js +0 -1
  604. package/build/assets/condenser-settings-Ca8fYZ_Z.js +0 -1
  605. package/build/assets/conversation-9NBSRoR9.js +0 -1
  606. package/build/assets/conversation-BXg6Oti2.js +0 -89
  607. package/build/assets/conversation-panel-CZri9Rup.js +0 -1
  608. package/build/assets/conversation-service.api-DPBQvTKD.js +0 -1
  609. package/build/assets/declaration-gq8V5eTU.js +0 -1
  610. package/build/assets/files-tab-UVoray88.js +0 -1
  611. package/build/assets/git-provider-icon-o6hdnJUB.js +0 -1
  612. package/build/assets/handle-capture-consent-CPMXU29K.js +0 -1
  613. package/build/assets/home-D1IHvGTN.js +0 -1
  614. package/build/assets/index-redirect-CUUJiNki.js +0 -1
  615. package/build/assets/install-server-modal-BbuQaA2w.js +0 -1
  616. package/build/assets/lesson-plan-jC0HBoe6.js +0 -4
  617. package/build/assets/llm-not-configured-banner-DoARbcdL.js +0 -27
  618. package/build/assets/llm-settings-4JMLV8mq.js +0 -1
  619. package/build/assets/llm-settings-D91gMw3U.js +0 -1
  620. package/build/assets/llm-subscription-service-CKyaV24y.js +0 -1
  621. package/build/assets/loader-circle-BEykUKYG.js +0 -1
  622. package/build/assets/manage-backends-modal-DkWAMSle.js +0 -1
  623. package/build/assets/manifest-aa5c29f6.js +0 -1
  624. package/build/assets/model-selector-BfqpMkSJ.js +0 -1
  625. package/build/assets/mouse-pointer-click-PdEQPL6v.js +0 -1
  626. package/build/assets/onboarding-Bu-HN1ze.js +0 -1
  627. package/build/assets/onboarding-modal-CZgjs5Bx.js +0 -1
  628. package/build/assets/option-service.api-BrZ5q87N.js +0 -1
  629. package/build/assets/organization-service.api-Bk4pCGU1.js +0 -1
  630. package/build/assets/path-utils-CSmuZoix.js +0 -1
  631. package/build/assets/plugins-management-service-BRBLxvUl.js +0 -1
  632. package/build/assets/profiles-service.api-BMXQ9pZC.js +0 -1
  633. package/build/assets/providers-BpO967xS.js +0 -1
  634. package/build/assets/proxy-BgJLtxu7.js +0 -1
  635. package/build/assets/root-BM5WgQ4_.js +0 -2
  636. package/build/assets/root-V8fkplMy.css +0 -1
  637. package/build/assets/root-layout-BdoyoobY.js +0 -2
  638. package/build/assets/schema-field-BSHrUMme.js +0 -1
  639. package/build/assets/sdk-section-page-t82gsOqa.js +0 -1
  640. package/build/assets/search-4DHskuhE.js +0 -1
  641. package/build/assets/secrets-service-B2GqPV0N.js +0 -1
  642. package/build/assets/settings-DmPLkgq0.js +0 -1
  643. package/build/assets/settings-modal-CwrZKrTq.js +0 -1
  644. package/build/assets/settings-service.api-Ce-ub11I.js +0 -1
  645. package/build/assets/shared-conversation-BDREQPnE.js +0 -1
  646. package/build/assets/skills-plugins-2Y44YHbO.js +0 -1
  647. package/build/assets/use-acp-credential-form-MzZM6D7D.js +0 -1
  648. package/build/assets/use-agent-profiles-DwZxnwO5.js +0 -1
  649. package/build/assets/use-backends-health-CRHzuvxO.js +0 -1
  650. package/build/assets/use-cloud-current-user-id-utFreJ0i.js +0 -1
  651. package/build/assets/use-config-mJrtZHP1.js +0 -1
  652. package/build/assets/use-create-conversation-DdqsP78F.js +0 -1
  653. package/build/assets/use-is-authed-B6M0mcGL.js +0 -1
  654. package/build/assets/use-llm-profiles-RC-PkpBl.js +0 -1
  655. package/build/assets/use-plugins-marketplace-FHlbeQ4c.js +0 -1
  656. package/build/assets/use-runtime-is-ready-RKj2WmEh.js +0 -1
  657. package/build/assets/use-save-agent-profile-tvDP15mh.js +0 -1
  658. package/build/assets/use-save-settings-BGlSfuYn.js +0 -1
  659. package/build/assets/use-settings-CH5LzXD8.js +0 -1
  660. package/build/assets/use-settings-nav-items-Dwktv8wo.js +0 -16
  661. package/build/assets/use-skills-CSzSL6HG.js +0 -1
  662. package/build/assets/use-tracking-BIXzagSI.js +0 -1
  663. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~lf310vj7-CSVPGId3.js +0 -10
  664. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~nfpll1wp-BCpa95De.js +0 -177
  665. package/build/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jewnulst-C57fm7C-.js +0 -1
  666. package/build/assets/vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CqXiHwjU.js +0 -2
  667. package/build/assets/x-Cb0WAtak.js +0 -1
  668. package/dist/components/providers/posthog-wrapper.cjs +0 -2
  669. package/dist/components/providers/posthog-wrapper.cjs.map +0 -1
  670. package/dist/components/providers/posthog-wrapper.d.ts +0 -4
  671. package/dist/components/providers/posthog-wrapper.js +0 -49
  672. package/dist/components/providers/posthog-wrapper.js.map +0 -1
  673. package/dist/node_modules/posthog-js/react/dist/esm/index.cjs +0 -2
  674. package/dist/node_modules/posthog-js/react/dist/esm/index.cjs.map +0 -1
  675. package/dist/node_modules/posthog-js/react/dist/esm/index.js +0 -113
  676. package/dist/node_modules/posthog-js/react/dist/esm/index.js.map +0 -1
  677. package/dist/utils/handle-capture-consent.cjs +0 -2
  678. package/dist/utils/handle-capture-consent.cjs.map +0 -1
  679. package/dist/utils/handle-capture-consent.d.ts +0 -7
  680. package/dist/utils/handle-capture-consent.js +0 -8
  681. package/dist/utils/handle-capture-consent.js.map +0 -1
  682. /package/build/assets/{__vite-browser-external-4xJsU2-u.js → __vite-browser-external-BQUj0sYu.js} +0 -0
  683. /package/build/assets/{agent-server-ui-style-scope-COnDHTm5.js → agent-server-ui-style-scope-qhnhZHBV.js} +0 -0
  684. /package/build/assets/{automation-BU8zu-FP.js → automation-LZB0MjdV.js} +0 -0
  685. /package/build/assets/{close-p3Op5lxI.js → close-DLFb5kfv.js} +0 -0
  686. /package/build/assets/{common-Dh7OqABE.js → common-CxbUL3nR.js} +0 -0
  687. /package/build/assets/{createLucideIcon-CVAsW2Yo.js → createLucideIcon-D4Tak8A1.js} +0 -0
  688. /package/build/assets/{folder-mMWFvaw0.js → folder-Bk311brm.js} +0 -0
  689. /package/build/assets/{get-language-from-path-CPNnuVhI.js → get-language-from-path-DBqBsCWH.js} +0 -0
  690. /package/build/assets/{git-status-mapper-BI8FyUVp.js → git-status-mapper-DnL9OC8_.js} +0 -0
  691. /package/build/assets/{iconBase-DaTRRUjy.js → iconBase-Dz51Zn5x.js} +0 -0
  692. /package/build/assets/{link-external-DfKQroKX.js → link-external-CaBmUEs_.js} +0 -0
  693. /package/build/assets/{search-BsjCEFNf.js → search-BgOCR7_c.js} +0 -0
  694. /package/build/assets/{settings-like-page-layout-classes-DENKlZpD.js → settings-like-page-layout-classes-Cdl6jOe5.js} +0 -0
  695. /package/build/assets/{skills-9cDZONKh.js → skills-EqzxYBvT.js} +0 -0
  696. /package/build/assets/{terminal-BuLtIrb9.js → terminal-Cgf___rK.js} +0 -0
  697. /package/build/assets/{u-check-circle-half-LiwZkuFe.js → u-check-circle-half-MsShT8Ec.js} +0 -0
  698. /package/build/assets/{u-edit-DJ90xc8Z.js → u-edit-DL5LgKon.js} +0 -0
  699. /package/build/assets/{use-breakpoint-B-O0lQ84.js → use-breakpoint-BP3lqLMx.js} +0 -0
  700. /package/build/assets/{use-click-outside-element-Bf4Omzot.js → use-click-outside-element-D9BYdANT.js} +0 -0
  701. /package/build/assets/{use-launch-skill-in-chat-BnoDgvAy.js → use-launch-skill-in-chat-DJWEfVc5.js} +0 -0
  702. /package/build/assets/{vendor~browser-Dqd33JyP.js → vendor~browser-By2MVv_N.js} +0 -0
  703. /package/build/assets/{vendor~conversation-panel~conversation~alert-banner-DHDkknt5.js → vendor~conversation-panel~conversation~alert-banner-CxfzCmkN.js} +0 -0
  704. /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~epa72zsm-B4rXs7Zd.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~e0djk9ee-Cw6LUe8p.js} +0 -0
  705. /package/build/assets/{vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~byh8a1g4-XNPdpuO8.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~jkpzbynd-CkpBIhVe.js} +0 -0
  706. /package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-9UMeuPV6.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-COhHANvV.js} +0 -0
  707. /package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DTzw2x50.js → vendor~index-home~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-FghQ3Z1a.js} +0 -0
  708. /package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~automations-~ki5qnp0d-rV6d1Iv_.js → vendor~root-layout~index-home~home~conversation-panel~conversation~launch~skills-settings~a~j2jlu22h-mC0v44WR.js} +0 -0
  709. /package/build/assets/{vendor~root-layout~home~mcp~automations-list~onboarding-modal-CXyYYvYh.js → vendor~root-layout~index-home~home~mcp~automations-list~onboarding-modal-C4-GDgiF.js} +0 -0
  710. /package/build/assets/{vendor~terminal-aeP3PnKf.js → vendor~terminal-CnKZILnC.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"use-device-flow.js","names":[],"sources":["../../src/hooks/use-device-flow.ts"],"sourcesContent":["import React from \"react\";\nimport {\n startDeviceFlow,\n pollForToken,\n DeviceFlowError,\n type DeviceAuthorizationResponse,\n} from \"#/api/device-flow-client\";\n\nexport type DeviceFlowStatus =\n | \"idle\"\n | \"starting\"\n | \"awaiting_authorization\"\n | \"success\"\n | \"error\";\n\nexport interface DeviceFlowState {\n status: DeviceFlowStatus;\n /** The verification URL to show/open for the user */\n verificationUrl: string | null;\n /** User code to display as fallback */\n userCode: string | null;\n /** The resulting API key on success */\n apiKey: string | null;\n /** Error message if status is \"error\" */\n error: string | null;\n /** Error code for programmatic handling */\n errorCode: string | null;\n}\n\nexport interface UseDeviceFlowReturn extends DeviceFlowState {\n /** Start the device flow authentication */\n start: (host: string) => void;\n /** Cancel an in-progress flow */\n cancel: () => void;\n /** Reset state back to idle */\n reset: () => void;\n}\n\nconst initialState: DeviceFlowState = {\n status: \"idle\",\n verificationUrl: null,\n userCode: null,\n apiKey: null,\n error: null,\n errorCode: null,\n};\n\n/**\n * React hook for managing OAuth 2.0 Device Flow authentication.\n *\n * Usage:\n * ```tsx\n * const { status, verificationUrl, apiKey, error, start, cancel, reset } = useDeviceFlow();\n *\n * // Start auth\n * start(\"https://app.all-hands.dev\");\n *\n * // Open browser when awaiting\n * if (status === \"awaiting_authorization\" && verificationUrl) {\n * window.open(verificationUrl, \"_blank\");\n * }\n *\n * // Use API key on success\n * if (status === \"success\" && apiKey) {\n * setApiKeyField(apiKey);\n * }\n * ```\n */\nexport function useDeviceFlow(): UseDeviceFlowReturn {\n const [state, setState] = React.useState<DeviceFlowState>(initialState);\n const abortControllerRef = React.useRef<AbortController | null>(null);\n\n const start = React.useCallback((host: string) => {\n // Cancel any existing flow\n abortControllerRef.current?.abort();\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n setState({\n ...initialState,\n status: \"starting\",\n });\n\n (async () => {\n let authResponse: DeviceAuthorizationResponse;\n\n try {\n authResponse = await startDeviceFlow(host);\n } catch (error) {\n if (abortController.signal.aborted) return;\n\n const message =\n error instanceof Error\n ? error.message\n : \"Failed to start device flow\";\n const code = error instanceof DeviceFlowError ? error.code : undefined;\n\n setState({\n ...initialState,\n status: \"error\",\n error: message,\n errorCode: code ?? null,\n });\n return;\n }\n\n if (abortController.signal.aborted) return;\n\n setState({\n ...initialState,\n status: \"awaiting_authorization\",\n verificationUrl: authResponse.verification_uri_complete,\n userCode: authResponse.user_code,\n });\n\n try {\n const tokenResponse = await pollForToken(\n host,\n authResponse.device_code,\n {\n interval: authResponse.interval,\n signal: abortController.signal,\n },\n );\n\n if (abortController.signal.aborted) return;\n\n setState({\n ...initialState,\n status: \"success\",\n apiKey: tokenResponse.access_token,\n });\n } catch (error) {\n // Early return if component unmounted or user cancelled\n if (abortController.signal.aborted) return;\n\n // Defensive: handle cancellation errors that may slip through\n // (currently pollForToken only throws \"cancelled\" when signal.aborted,\n // which is caught above, but this guards against future changes)\n const isCancel =\n error instanceof DeviceFlowError && error.code === \"cancelled\";\n if (isCancel) {\n setState(initialState);\n return;\n }\n\n const message =\n error instanceof Error ? error.message : \"Authorization failed\";\n const code = error instanceof DeviceFlowError ? error.code : undefined;\n\n setState({\n ...initialState,\n status: \"error\",\n error: message,\n errorCode: code ?? null,\n });\n }\n })();\n }, []);\n\n const cancel = React.useCallback(() => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = null;\n setState(initialState);\n }, []);\n\n const reset = React.useCallback(() => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = null;\n setState(initialState);\n }, []);\n\n // Cleanup on unmount\n React.useEffect(() => {\n return () => {\n abortControllerRef.current?.abort();\n };\n }, []);\n\n return {\n ...state,\n start,\n cancel,\n reset,\n };\n}\n"],"mappings":";;;AAsCA,IAAM,IAAgC;CACpC,QAAQ;CACR,iBAAiB;CACjB,UAAU;CACV,QAAQ;CACR,OAAO;CACP,WAAW;CACZ;AAuBD,SAAgB,IAAqC;CACnD,IAAM,CAAC,GAAO,KAAY,EAAM,SAA0B,EAAa,EACjE,IAAqB,EAAM,OAA+B,KAAK,EAE/D,IAAQ,EAAM,aAAa,MAAiB;AAEhD,IAAmB,SAAS,OAAO;EACnC,IAAM,IAAkB,IAAI,iBAAiB;AAQ7C,EAPA,EAAmB,UAAU,GAE7B,EAAS;GACP,GAAG;GACH,QAAQ;GACT,CAAC,GAED,YAAY;GACX,IAAI;AAEJ,OAAI;AACF,QAAe,MAAM,EAAgB,EAAK;YACnC,GAAO;AACd,QAAI,EAAgB,OAAO,QAAS;IAEpC,IAAM,IACJ,aAAiB,QACb,EAAM,UACN,+BACA,IAAO,aAAiB,IAAkB,EAAM,OAAO,KAAA;AAE7D,MAAS;KACP,GAAG;KACH,QAAQ;KACR,OAAO;KACP,WAAW,KAAQ;KACpB,CAAC;AACF;;AAGE,UAAgB,OAAO,SAE3B;MAAS;KACP,GAAG;KACH,QAAQ;KACR,iBAAiB,EAAa;KAC9B,UAAU,EAAa;KACxB,CAAC;AAEF,QAAI;KACF,IAAM,IAAgB,MAAM,EAC1B,GACA,EAAa,aACb;MACE,UAAU,EAAa;MACvB,QAAQ,EAAgB;MACzB,CACF;AAED,SAAI,EAAgB,OAAO,QAAS;AAEpC,OAAS;MACP,GAAG;MACH,QAAQ;MACR,QAAQ,EAAc;MACvB,CAAC;aACK,GAAO;AAEd,SAAI,EAAgB,OAAO,QAAS;AAOpC,SADE,aAAiB,KAAmB,EAAM,SAAS,aACvC;AACZ,QAAS,EAAa;AACtB;;KAGF,IAAM,IACJ,aAAiB,QAAQ,EAAM,UAAU,wBACrC,IAAO,aAAiB,IAAkB,EAAM,OAAO,KAAA;AAE7D,OAAS;MACP,GAAG;MACH,QAAQ;MACR,OAAO;MACP,WAAW,KAAQ;MACpB,CAAC;;;MAEF;IACH,EAAE,CAAC,EAEA,IAAS,EAAM,kBAAkB;AAGrC,EAFA,EAAmB,SAAS,OAAO,EACnC,EAAmB,UAAU,MAC7B,EAAS,EAAa;IACrB,EAAE,CAAC,EAEA,IAAQ,EAAM,kBAAkB;AAGpC,EAFA,EAAmB,SAAS,OAAO,EACnC,EAAmB,UAAU,MAC7B,EAAS,EAAa;IACrB,EAAE,CAAC;AASN,QANA,EAAM,sBACS;AACX,IAAmB,SAAS,OAAO;IAEpC,EAAE,CAAC,EAEC;EACL,GAAG;EACH;EACA;EACA;EACD"}
1
+ {"version":3,"file":"use-device-flow.js","names":[],"sources":["../../src/hooks/use-device-flow.ts"],"sourcesContent":["import React from \"react\";\nimport {\n startDeviceFlow,\n pollForToken,\n DeviceFlowError,\n type DeviceAuthorizationResponse,\n} from \"#/api/device-flow-client\";\nimport {\n trackCloudDeviceAuthorizationStarted,\n trackCloudDeviceAuthorizationSucceeded,\n type CloudConnectionSource,\n} from \"#/services/cloud-funnel-analytics\";\n\nexport type DeviceFlowStatus =\n | \"idle\"\n | \"starting\"\n | \"awaiting_authorization\"\n | \"success\"\n | \"error\";\n\nexport interface DeviceFlowState {\n status: DeviceFlowStatus;\n /** The verification URL to show/open for the user */\n verificationUrl: string | null;\n /** User code to display as fallback */\n userCode: string | null;\n /** The resulting API key on success */\n apiKey: string | null;\n /** Error message if status is \"error\" */\n error: string | null;\n /** Error code for programmatic handling */\n errorCode: string | null;\n}\n\nexport interface UseDeviceFlowReturn extends DeviceFlowState {\n /** Start the device flow authentication */\n start: StartDeviceFlow;\n /** Cancel an in-progress flow */\n cancel: () => void;\n /** Reset state back to idle */\n reset: () => void;\n}\n\ntype StartDeviceFlow = (\n host: string,\n analyticsSource?: CloudConnectionSource,\n) => void;\n\nconst initialState: DeviceFlowState = {\n status: \"idle\",\n verificationUrl: null,\n userCode: null,\n apiKey: null,\n error: null,\n errorCode: null,\n};\n\n/**\n * React hook for managing OAuth 2.0 Device Flow authentication.\n *\n * Usage:\n * ```tsx\n * const { status, verificationUrl, apiKey, error, start, cancel, reset } = useDeviceFlow();\n *\n * // Start auth\n * start(\"https://app.all-hands.dev\");\n *\n * // Open browser when awaiting\n * if (status === \"awaiting_authorization\" && verificationUrl) {\n * window.open(verificationUrl, \"_blank\");\n * }\n *\n * // Use API key on success\n * if (status === \"success\" && apiKey) {\n * setApiKeyField(apiKey);\n * }\n * ```\n */\nexport function useDeviceFlow(): UseDeviceFlowReturn {\n const [state, setState] = React.useState<DeviceFlowState>(initialState);\n const abortControllerRef = React.useRef<AbortController | null>(null);\n\n const start: StartDeviceFlow = React.useCallback((host, analyticsSource) => {\n // Cancel any existing flow\n abortControllerRef.current?.abort();\n const abortController = new AbortController();\n abortControllerRef.current = abortController;\n\n setState({\n ...initialState,\n status: \"starting\",\n });\n\n (async () => {\n let authResponse: DeviceAuthorizationResponse;\n\n try {\n authResponse = await startDeviceFlow(host);\n } catch (error) {\n if (abortController.signal.aborted) return;\n\n const message =\n error instanceof Error\n ? error.message\n : \"Failed to start device flow\";\n const code = error instanceof DeviceFlowError ? error.code : undefined;\n\n setState({\n ...initialState,\n status: \"error\",\n error: message,\n errorCode: code ?? null,\n });\n return;\n }\n\n if (abortController.signal.aborted) return;\n\n trackCloudDeviceAuthorizationStarted(host, analyticsSource);\n\n setState({\n ...initialState,\n status: \"awaiting_authorization\",\n verificationUrl: authResponse.verification_uri_complete,\n userCode: authResponse.user_code,\n });\n\n try {\n const tokenResponse = await pollForToken(\n host,\n authResponse.device_code,\n {\n interval: authResponse.interval,\n signal: abortController.signal,\n },\n );\n\n if (abortController.signal.aborted) return;\n\n trackCloudDeviceAuthorizationSucceeded(host, analyticsSource);\n\n setState({\n ...initialState,\n status: \"success\",\n apiKey: tokenResponse.access_token,\n });\n } catch (error) {\n // Early return if component unmounted or user cancelled\n if (abortController.signal.aborted) return;\n\n // Defensive: handle cancellation errors that may slip through\n // (currently pollForToken only throws \"cancelled\" when signal.aborted,\n // which is caught above, but this guards against future changes)\n const isCancel =\n error instanceof DeviceFlowError && error.code === \"cancelled\";\n if (isCancel) {\n setState(initialState);\n return;\n }\n\n const message =\n error instanceof Error ? error.message : \"Authorization failed\";\n const code = error instanceof DeviceFlowError ? error.code : undefined;\n\n setState({\n ...initialState,\n status: \"error\",\n error: message,\n errorCode: code ?? null,\n });\n }\n })();\n }, []);\n\n const cancel = React.useCallback(() => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = null;\n setState(initialState);\n }, []);\n\n const reset = React.useCallback(() => {\n abortControllerRef.current?.abort();\n abortControllerRef.current = null;\n setState(initialState);\n }, []);\n\n // Cleanup on unmount\n React.useEffect(() => {\n return () => {\n abortControllerRef.current?.abort();\n };\n }, []);\n\n return {\n ...state,\n start,\n cancel,\n reset,\n };\n}\n"],"mappings":";;;;;AAgDA,IAAM,IAAgC;CACpC,QAAQ;CACR,iBAAiB;CACjB,UAAU;CACV,QAAQ;CACR,OAAO;CACP,WAAW;CACZ;AAuBD,SAAgB,IAAqC;CACnD,IAAM,CAAC,GAAO,KAAY,EAAM,SAA0B,EAAa,EACjE,IAAqB,EAAM,OAA+B,KAAK,EAE/D,IAAyB,EAAM,aAAa,GAAM,MAAoB;AAE1E,IAAmB,SAAS,OAAO;EACnC,IAAM,IAAkB,IAAI,iBAAiB;AAQ7C,EAPA,EAAmB,UAAU,GAE7B,EAAS;GACP,GAAG;GACH,QAAQ;GACT,CAAC,GAED,YAAY;GACX,IAAI;AAEJ,OAAI;AACF,QAAe,MAAM,EAAgB,EAAK;YACnC,GAAO;AACd,QAAI,EAAgB,OAAO,QAAS;IAEpC,IAAM,IACJ,aAAiB,QACb,EAAM,UACN,+BACA,IAAO,aAAiB,IAAkB,EAAM,OAAO,KAAA;AAE7D,MAAS;KACP,GAAG;KACH,QAAQ;KACR,OAAO;KACP,WAAW,KAAQ;KACpB,CAAC;AACF;;AAGE,UAAgB,OAAO,SAI3B;IAFA,EAAqC,GAAM,EAAgB,EAE3D,EAAS;KACP,GAAG;KACH,QAAQ;KACR,iBAAiB,EAAa;KAC9B,UAAU,EAAa;KACxB,CAAC;AAEF,QAAI;KACF,IAAM,IAAgB,MAAM,EAC1B,GACA,EAAa,aACb;MACE,UAAU,EAAa;MACvB,QAAQ,EAAgB;MACzB,CACF;AAED,SAAI,EAAgB,OAAO,QAAS;AAIpC,KAFA,EAAuC,GAAM,EAAgB,EAE7D,EAAS;MACP,GAAG;MACH,QAAQ;MACR,QAAQ,EAAc;MACvB,CAAC;aACK,GAAO;AAEd,SAAI,EAAgB,OAAO,QAAS;AAOpC,SADE,aAAiB,KAAmB,EAAM,SAAS,aACvC;AACZ,QAAS,EAAa;AACtB;;KAGF,IAAM,IACJ,aAAiB,QAAQ,EAAM,UAAU,wBACrC,IAAO,aAAiB,IAAkB,EAAM,OAAO,KAAA;AAE7D,OAAS;MACP,GAAG;MACH,QAAQ;MACR,OAAO;MACP,WAAW,KAAQ;MACpB,CAAC;;;MAEF;IACH,EAAE,CAAC,EAEA,IAAS,EAAM,kBAAkB;AAGrC,EAFA,EAAmB,SAAS,OAAO,EACnC,EAAmB,UAAU,MAC7B,EAAS,EAAa;IACrB,EAAE,CAAC,EAEA,IAAQ,EAAM,kBAAkB;AAGpC,EAFA,EAAmB,SAAS,OAAO,EACnC,EAAmB,UAAU,MAC7B,EAAS,EAAa;IACrB,EAAE,CAAC;AASN,QANA,EAAM,sBACS;AACX,IAAmB,SAAS,OAAO;IAEpC,EAAE,CAAC,EAEC;EACL,GAAG;EACH;EACA;EACA;EACD"}
@@ -1,2 +1,2 @@
1
- require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../services/telemetry.cjs`);let t=require(`react`);function n(){let[n,r]=(0,t.useState)(()=>e.getTelemetryConsent()),i=(0,t.useRef)(!1);(0,t.useEffect)(()=>{i.current||(i.current=!0,e.trackInstall())},[]),(0,t.useEffect)(()=>{n===`granted`&&e.trackSessionStart()},[n]);let a=(0,t.useCallback)(async()=>{await e.setTelemetryConsent(`granted`),r(`granted`)},[]),o=(0,t.useCallback)(async()=>{await e.setTelemetryConsent(`denied`),r(`denied`)},[]),s=(0,t.useCallback)((t,r)=>{n===`granted`&&e.trackEvent(t,r)},[n]),c=(0,t.useCallback)(()=>{e.clearTelemetryData(),r(`pending`)},[]);return{consent:n,isEnabled:n===`granted`,showConsentPrompt:n===`pending`,grantConsent:a,denyConsent:o,track:s,clearData:c}}exports.useTelemetry=n;
1
+ require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../services/telemetry.cjs`);let t=require(`react`);function n(){let n=(0,t.useSyncExternalStore)(e.subscribeTelemetryConsent,e.getTelemetryConsent,()=>`pending`),r=(0,t.useRef)(!1);(0,t.useEffect)(()=>{r.current||(r.current=!0,e.trackInstall())},[]),(0,t.useEffect)(()=>{n===`granted`&&e.trackSessionStart()},[n]);let i=(0,t.useCallback)(()=>e.setTelemetryConsent(`granted`),[]),a=(0,t.useCallback)(()=>e.setTelemetryConsent(`denied`),[]),o=(0,t.useCallback)((t,n)=>{e.trackEvent(t,n)},[]),s=(0,t.useCallback)(()=>e.clearTelemetryData(),[]);return{consent:n,isEnabled:n===`granted`,showConsentPrompt:n===`pending`,grantConsent:i,denyConsent:a,track:o,clearData:s}}exports.useTelemetry=n;
2
2
  //# sourceMappingURL=use-telemetry.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-telemetry.cjs","names":[],"sources":["../../src/hooks/use-telemetry.ts"],"sourcesContent":["import { useEffect, useState, useCallback, useRef } from \"react\";\nimport {\n getTelemetryConsent,\n setTelemetryConsent,\n trackInstall,\n trackSessionStart,\n trackEvent,\n clearTelemetryData,\n type TelemetryConsent,\n} from \"#/services/telemetry\";\n\nexport interface UseTelemetryReturn {\n /** Current consent status */\n consent: TelemetryConsent;\n /** Whether telemetry is enabled (consent granted) */\n isEnabled: boolean;\n /** Whether consent prompt should be shown */\n showConsentPrompt: boolean;\n /** Grant consent and enable telemetry */\n grantConsent: () => void;\n /** Deny consent and disable telemetry */\n denyConsent: () => void;\n /** Track a custom event (only if consent granted) */\n track: (eventName: string, properties?: Record<string, unknown>) => void;\n /** Clear all telemetry data */\n clearData: () => void;\n}\n\n/**\n * Hook for managing telemetry consent and tracking.\n *\n * TRACKING BEHAVIOR:\n * - Install event: Sent immediately on first mount, regardless of consent status.\n * This is anonymous and allows us to track library adoption.\n * - Session/custom events: Only sent after user grants consent.\n *\n * This hook handles:\n * - Sending install event immediately on first use\n * - Showing consent prompt for ongoing tracking\n * - Tracking session start when consent is granted\n * - Providing a simple API for tracking custom events\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { consent, showConsentPrompt, grantConsent, denyConsent, track } = useTelemetry();\n *\n * useEffect(() => {\n * track('component_mounted', { component: 'MyComponent' });\n * }, [track]);\n *\n * if (showConsentPrompt) {\n * return <ConsentBanner onAccept={grantConsent} onDecline={denyConsent} />;\n * }\n *\n * return <div>...</div>;\n * }\n * ```\n */\nexport function useTelemetry(): UseTelemetryReturn {\n const [consent, setConsentState] = useState<TelemetryConsent>(() =>\n getTelemetryConsent(),\n );\n\n // Track install immediately on first mount (regardless of consent)\n // This only fires once per installation due to localStorage deduplication\n //\n // PRIVACY NOTE: This sends an anonymous install event before the user grants consent.\n // Data collected: browser platform, user agent, referrer, origin URL, embedded status.\n // A random PostHog distinct_id is generated (not tied to user identity).\n // Users can prevent this by setting VITE_DO_NOT_TRACK=1 or browser's DNT setting.\n // This approach uses \"legitimate interest\" under GDPR Article 6(1)(f) for basic\n // aggregate analytics. No cross-site tracking, no advertising, no user profiles.\n const hasTrackedInstall = useRef(false);\n useEffect(() => {\n if (!hasTrackedInstall.current) {\n hasTrackedInstall.current = true;\n trackInstall();\n }\n }, []);\n\n // Track session start when consent is granted\n useEffect(() => {\n if (consent === \"granted\") {\n trackSessionStart();\n }\n }, [consent]);\n\n const grantConsent = useCallback(async () => {\n // Must await to ensure PostHog is initialized and opt_in_capturing() is called\n // before the useEffect triggers tracking calls\n await setTelemetryConsent(\"granted\");\n setConsentState(\"granted\");\n }, []);\n\n const denyConsent = useCallback(async () => {\n await setTelemetryConsent(\"denied\");\n setConsentState(\"denied\");\n }, []);\n\n const track = useCallback(\n (eventName: string, properties?: Record<string, unknown>) => {\n if (consent === \"granted\") {\n trackEvent(eventName, properties);\n }\n },\n [consent],\n );\n\n const clearData = useCallback(() => {\n clearTelemetryData();\n setConsentState(\"pending\");\n }, []);\n\n return {\n consent,\n isEnabled: consent === \"granted\",\n showConsentPrompt: consent === \"pending\",\n grantConsent,\n denyConsent,\n track,\n clearData,\n };\n}\n"],"mappings":"iHA2DA,SAAgB,GAAmC,CACjD,GAAM,CAAC,EAAS,IAAA,EAAA,EAAA,cACd,EAAA,qBAAqB,CACtB,CAWK,GAAA,EAAA,EAAA,QAA2B,GAAM,EACvC,EAAA,EAAA,eAAgB,CACT,EAAkB,UACrB,EAAkB,QAAU,GAC5B,EAAA,cAAc,GAEf,EAAE,CAAC,EAGN,EAAA,EAAA,eAAgB,CACV,IAAY,WACd,EAAA,mBAAmB,EAEpB,CAAC,EAAQ,CAAC,CAEb,IAAM,GAAA,EAAA,EAAA,aAA2B,SAAY,CAG3C,MAAM,EAAA,oBAAoB,UAAU,CACpC,EAAgB,UAAU,EACzB,EAAE,CAAC,CAEA,GAAA,EAAA,EAAA,aAA0B,SAAY,CAC1C,MAAM,EAAA,oBAAoB,SAAS,CACnC,EAAgB,SAAS,EACxB,EAAE,CAAC,CAEA,GAAA,EAAA,EAAA,cACH,EAAmB,IAAyC,CACvD,IAAY,WACd,EAAA,WAAW,EAAW,EAAW,EAGrC,CAAC,EAAQ,CACV,CAEK,GAAA,EAAA,EAAA,iBAA8B,CAClC,EAAA,oBAAoB,CACpB,EAAgB,UAAU,EACzB,EAAE,CAAC,CAEN,MAAO,CACL,UACA,UAAW,IAAY,UACvB,kBAAmB,IAAY,UAC/B,eACA,cACA,QACA,YACD"}
1
+ {"version":3,"file":"use-telemetry.cjs","names":[],"sources":["../../src/hooks/use-telemetry.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useSyncExternalStore } from \"react\";\nimport {\n getTelemetryConsent,\n setTelemetryConsent,\n trackInstall,\n trackSessionStart,\n trackEvent,\n clearTelemetryData,\n subscribeTelemetryConsent,\n type TelemetryConsent,\n} from \"#/services/telemetry\";\n\nexport interface UseTelemetryReturn {\n /** Current consent status */\n consent: TelemetryConsent;\n /** Whether telemetry is enabled (consent granted) */\n isEnabled: boolean;\n /** Whether consent prompt should be shown */\n showConsentPrompt: boolean;\n /** Grant consent and enable telemetry */\n grantConsent: () => Promise<void>;\n /** Deny consent and disable telemetry */\n denyConsent: () => Promise<void>;\n /** Track a custom event (only if consent granted) */\n track: (eventName: string, properties?: Record<string, unknown>) => void;\n /** Clear all telemetry data */\n clearData: () => Promise<void>;\n}\n\n/**\n * Hook for managing telemetry consent and tracking.\n *\n * TRACKING BEHAVIOR:\n * - Install event: Sent immediately on first mount, regardless of consent status.\n * This is anonymous and allows us to track library adoption.\n * - Session/custom events: Only sent after user grants consent.\n *\n * This hook handles:\n * - Sending install event immediately on first use\n * - Showing consent prompt for ongoing tracking\n * - Tracking session start when consent is granted\n * - Providing a simple API for tracking custom events\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { consent, showConsentPrompt, grantConsent, denyConsent, track } = useTelemetry();\n *\n * useEffect(() => {\n * track('component_mounted', { component: 'MyComponent' });\n * }, [track]);\n *\n * if (showConsentPrompt) {\n * return <ConsentBanner onAccept={grantConsent} onDecline={denyConsent} />;\n * }\n *\n * return <div>...</div>;\n * }\n * ```\n */\nexport function useTelemetry(): UseTelemetryReturn {\n const consent = useSyncExternalStore<TelemetryConsent>(\n subscribeTelemetryConsent,\n getTelemetryConsent,\n () => \"pending\",\n );\n\n // Track install immediately on first mount (regardless of consent)\n // This only fires once per installation due to localStorage deduplication\n //\n // PRIVACY NOTE: This sends an anonymous install event before the user grants consent.\n // Data collected: browser platform, user agent, referrer, origin URL, embedded status.\n // A random PostHog distinct_id is generated (not tied to user identity).\n // Users can prevent this by setting VITE_DO_NOT_TRACK=1 or browser's DNT setting.\n // This approach uses \"legitimate interest\" under GDPR Article 6(1)(f) for basic\n // aggregate analytics. No cross-site tracking, no advertising, no user profiles.\n const hasTrackedInstall = useRef(false);\n useEffect(() => {\n if (!hasTrackedInstall.current) {\n hasTrackedInstall.current = true;\n void trackInstall();\n }\n }, []);\n\n // Track session start when consent is granted\n useEffect(() => {\n if (consent === \"granted\") {\n void trackSessionStart();\n }\n }, [consent]);\n\n const grantConsent = useCallback(() => setTelemetryConsent(\"granted\"), []);\n\n const denyConsent = useCallback(() => setTelemetryConsent(\"denied\"), []);\n\n const track = useCallback(\n (eventName: string, properties?: Record<string, unknown>) => {\n void trackEvent(eventName, properties);\n },\n [],\n );\n\n const clearData = useCallback(() => clearTelemetryData(), []);\n\n return {\n consent,\n isEnabled: consent === \"granted\",\n showConsentPrompt: consent === \"pending\",\n grantConsent,\n denyConsent,\n track,\n clearData,\n };\n}\n"],"mappings":"iHA4DA,SAAgB,GAAmC,CACjD,IAAM,GAAA,EAAA,EAAA,sBACJ,EAAA,0BACA,EAAA,wBACM,UACP,CAWK,GAAA,EAAA,EAAA,QAA2B,GAAM,EACvC,EAAA,EAAA,eAAgB,CACT,EAAkB,UACrB,EAAkB,QAAU,GACvB,EAAA,cAAc,GAEpB,EAAE,CAAC,EAGN,EAAA,EAAA,eAAgB,CACV,IAAY,WACT,EAAA,mBAAmB,EAEzB,CAAC,EAAQ,CAAC,CAEb,IAAM,GAAA,EAAA,EAAA,iBAAiC,EAAA,oBAAoB,UAAU,CAAE,EAAE,CAAC,CAEpE,GAAA,EAAA,EAAA,iBAAgC,EAAA,oBAAoB,SAAS,CAAE,EAAE,CAAC,CAElE,GAAA,EAAA,EAAA,cACH,EAAmB,IAAyC,CACtD,EAAA,WAAW,EAAW,EAAW,EAExC,EAAE,CACH,CAEK,GAAA,EAAA,EAAA,iBAA8B,EAAA,oBAAoB,CAAE,EAAE,CAAC,CAE7D,MAAO,CACL,UACA,UAAW,IAAY,UACvB,kBAAmB,IAAY,UAC/B,eACA,cACA,QACA,YACD"}
@@ -7,13 +7,13 @@ export interface UseTelemetryReturn {
7
7
  /** Whether consent prompt should be shown */
8
8
  showConsentPrompt: boolean;
9
9
  /** Grant consent and enable telemetry */
10
- grantConsent: () => void;
10
+ grantConsent: () => Promise<void>;
11
11
  /** Deny consent and disable telemetry */
12
- denyConsent: () => void;
12
+ denyConsent: () => Promise<void>;
13
13
  /** Track a custom event (only if consent granted) */
14
14
  track: (eventName: string, properties?: Record<string, unknown>) => void;
15
15
  /** Clear all telemetry data */
16
- clearData: () => void;
16
+ clearData: () => Promise<void>;
17
17
  }
18
18
  /**
19
19
  * Hook for managing telemetry consent and tracking.
@@ -1,26 +1,20 @@
1
- import { clearTelemetryData as e, getTelemetryConsent as t, setTelemetryConsent as n, trackEvent as r, trackInstall as i, trackSessionStart as a } from "../services/telemetry.js";
2
- import { useCallback as o, useEffect as s, useRef as c, useState as l } from "react";
1
+ import { clearTelemetryData as e, getTelemetryConsent as t, setTelemetryConsent as n, subscribeTelemetryConsent as r, trackEvent as i, trackInstall as a, trackSessionStart as o } from "../services/telemetry.js";
2
+ import { useCallback as s, useEffect as c, useRef as l, useSyncExternalStore as u } from "react";
3
3
  //#region src/hooks/use-telemetry.ts
4
- function u() {
5
- let [u, d] = l(() => t()), f = c(!1);
6
- s(() => {
7
- f.current || (f.current = !0, i());
8
- }, []), s(() => {
9
- u === "granted" && a();
10
- }, [u]);
11
- let p = o(async () => {
12
- await n("granted"), d("granted");
13
- }, []), m = o(async () => {
14
- await n("denied"), d("denied");
15
- }, []), h = o((e, t) => {
16
- u === "granted" && r(e, t);
17
- }, [u]), g = o(() => {
18
- e(), d("pending");
19
- }, []);
4
+ function d() {
5
+ let d = u(r, t, () => "pending"), f = l(!1);
6
+ c(() => {
7
+ f.current || (f.current = !0, a());
8
+ }, []), c(() => {
9
+ d === "granted" && o();
10
+ }, [d]);
11
+ let p = s(() => n("granted"), []), m = s(() => n("denied"), []), h = s((e, t) => {
12
+ i(e, t);
13
+ }, []), g = s(() => e(), []);
20
14
  return {
21
- consent: u,
22
- isEnabled: u === "granted",
23
- showConsentPrompt: u === "pending",
15
+ consent: d,
16
+ isEnabled: d === "granted",
17
+ showConsentPrompt: d === "pending",
24
18
  grantConsent: p,
25
19
  denyConsent: m,
26
20
  track: h,
@@ -28,6 +22,6 @@ function u() {
28
22
  };
29
23
  }
30
24
  //#endregion
31
- export { u as useTelemetry };
25
+ export { d as useTelemetry };
32
26
 
33
27
  //# sourceMappingURL=use-telemetry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-telemetry.js","names":[],"sources":["../../src/hooks/use-telemetry.ts"],"sourcesContent":["import { useEffect, useState, useCallback, useRef } from \"react\";\nimport {\n getTelemetryConsent,\n setTelemetryConsent,\n trackInstall,\n trackSessionStart,\n trackEvent,\n clearTelemetryData,\n type TelemetryConsent,\n} from \"#/services/telemetry\";\n\nexport interface UseTelemetryReturn {\n /** Current consent status */\n consent: TelemetryConsent;\n /** Whether telemetry is enabled (consent granted) */\n isEnabled: boolean;\n /** Whether consent prompt should be shown */\n showConsentPrompt: boolean;\n /** Grant consent and enable telemetry */\n grantConsent: () => void;\n /** Deny consent and disable telemetry */\n denyConsent: () => void;\n /** Track a custom event (only if consent granted) */\n track: (eventName: string, properties?: Record<string, unknown>) => void;\n /** Clear all telemetry data */\n clearData: () => void;\n}\n\n/**\n * Hook for managing telemetry consent and tracking.\n *\n * TRACKING BEHAVIOR:\n * - Install event: Sent immediately on first mount, regardless of consent status.\n * This is anonymous and allows us to track library adoption.\n * - Session/custom events: Only sent after user grants consent.\n *\n * This hook handles:\n * - Sending install event immediately on first use\n * - Showing consent prompt for ongoing tracking\n * - Tracking session start when consent is granted\n * - Providing a simple API for tracking custom events\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { consent, showConsentPrompt, grantConsent, denyConsent, track } = useTelemetry();\n *\n * useEffect(() => {\n * track('component_mounted', { component: 'MyComponent' });\n * }, [track]);\n *\n * if (showConsentPrompt) {\n * return <ConsentBanner onAccept={grantConsent} onDecline={denyConsent} />;\n * }\n *\n * return <div>...</div>;\n * }\n * ```\n */\nexport function useTelemetry(): UseTelemetryReturn {\n const [consent, setConsentState] = useState<TelemetryConsent>(() =>\n getTelemetryConsent(),\n );\n\n // Track install immediately on first mount (regardless of consent)\n // This only fires once per installation due to localStorage deduplication\n //\n // PRIVACY NOTE: This sends an anonymous install event before the user grants consent.\n // Data collected: browser platform, user agent, referrer, origin URL, embedded status.\n // A random PostHog distinct_id is generated (not tied to user identity).\n // Users can prevent this by setting VITE_DO_NOT_TRACK=1 or browser's DNT setting.\n // This approach uses \"legitimate interest\" under GDPR Article 6(1)(f) for basic\n // aggregate analytics. No cross-site tracking, no advertising, no user profiles.\n const hasTrackedInstall = useRef(false);\n useEffect(() => {\n if (!hasTrackedInstall.current) {\n hasTrackedInstall.current = true;\n trackInstall();\n }\n }, []);\n\n // Track session start when consent is granted\n useEffect(() => {\n if (consent === \"granted\") {\n trackSessionStart();\n }\n }, [consent]);\n\n const grantConsent = useCallback(async () => {\n // Must await to ensure PostHog is initialized and opt_in_capturing() is called\n // before the useEffect triggers tracking calls\n await setTelemetryConsent(\"granted\");\n setConsentState(\"granted\");\n }, []);\n\n const denyConsent = useCallback(async () => {\n await setTelemetryConsent(\"denied\");\n setConsentState(\"denied\");\n }, []);\n\n const track = useCallback(\n (eventName: string, properties?: Record<string, unknown>) => {\n if (consent === \"granted\") {\n trackEvent(eventName, properties);\n }\n },\n [consent],\n );\n\n const clearData = useCallback(() => {\n clearTelemetryData();\n setConsentState(\"pending\");\n }, []);\n\n return {\n consent,\n isEnabled: consent === \"granted\",\n showConsentPrompt: consent === \"pending\",\n grantConsent,\n denyConsent,\n track,\n clearData,\n };\n}\n"],"mappings":";;;AA2DA,SAAgB,IAAmC;CACjD,IAAM,CAAC,GAAS,KAAmB,QACjC,GAAqB,CACtB,EAWK,IAAoB,EAAO,GAAM;AASvC,CARA,QAAgB;AACd,EAAK,EAAkB,YACrB,EAAkB,UAAU,IAC5B,GAAc;IAEf,EAAE,CAAC,EAGN,QAAgB;AACd,EAAI,MAAY,aACd,GAAmB;IAEpB,CAAC,EAAQ,CAAC;CAEb,IAAM,IAAe,EAAY,YAAY;AAI3C,EADA,MAAM,EAAoB,UAAU,EACpC,EAAgB,UAAU;IACzB,EAAE,CAAC,EAEA,IAAc,EAAY,YAAY;AAE1C,EADA,MAAM,EAAoB,SAAS,EACnC,EAAgB,SAAS;IACxB,EAAE,CAAC,EAEA,IAAQ,GACX,GAAmB,MAAyC;AAC3D,EAAI,MAAY,aACd,EAAW,GAAW,EAAW;IAGrC,CAAC,EAAQ,CACV,EAEK,IAAY,QAAkB;AAElC,EADA,GAAoB,EACpB,EAAgB,UAAU;IACzB,EAAE,CAAC;AAEN,QAAO;EACL;EACA,WAAW,MAAY;EACvB,mBAAmB,MAAY;EAC/B;EACA;EACA;EACA;EACD"}
1
+ {"version":3,"file":"use-telemetry.js","names":[],"sources":["../../src/hooks/use-telemetry.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useSyncExternalStore } from \"react\";\nimport {\n getTelemetryConsent,\n setTelemetryConsent,\n trackInstall,\n trackSessionStart,\n trackEvent,\n clearTelemetryData,\n subscribeTelemetryConsent,\n type TelemetryConsent,\n} from \"#/services/telemetry\";\n\nexport interface UseTelemetryReturn {\n /** Current consent status */\n consent: TelemetryConsent;\n /** Whether telemetry is enabled (consent granted) */\n isEnabled: boolean;\n /** Whether consent prompt should be shown */\n showConsentPrompt: boolean;\n /** Grant consent and enable telemetry */\n grantConsent: () => Promise<void>;\n /** Deny consent and disable telemetry */\n denyConsent: () => Promise<void>;\n /** Track a custom event (only if consent granted) */\n track: (eventName: string, properties?: Record<string, unknown>) => void;\n /** Clear all telemetry data */\n clearData: () => Promise<void>;\n}\n\n/**\n * Hook for managing telemetry consent and tracking.\n *\n * TRACKING BEHAVIOR:\n * - Install event: Sent immediately on first mount, regardless of consent status.\n * This is anonymous and allows us to track library adoption.\n * - Session/custom events: Only sent after user grants consent.\n *\n * This hook handles:\n * - Sending install event immediately on first use\n * - Showing consent prompt for ongoing tracking\n * - Tracking session start when consent is granted\n * - Providing a simple API for tracking custom events\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { consent, showConsentPrompt, grantConsent, denyConsent, track } = useTelemetry();\n *\n * useEffect(() => {\n * track('component_mounted', { component: 'MyComponent' });\n * }, [track]);\n *\n * if (showConsentPrompt) {\n * return <ConsentBanner onAccept={grantConsent} onDecline={denyConsent} />;\n * }\n *\n * return <div>...</div>;\n * }\n * ```\n */\nexport function useTelemetry(): UseTelemetryReturn {\n const consent = useSyncExternalStore<TelemetryConsent>(\n subscribeTelemetryConsent,\n getTelemetryConsent,\n () => \"pending\",\n );\n\n // Track install immediately on first mount (regardless of consent)\n // This only fires once per installation due to localStorage deduplication\n //\n // PRIVACY NOTE: This sends an anonymous install event before the user grants consent.\n // Data collected: browser platform, user agent, referrer, origin URL, embedded status.\n // A random PostHog distinct_id is generated (not tied to user identity).\n // Users can prevent this by setting VITE_DO_NOT_TRACK=1 or browser's DNT setting.\n // This approach uses \"legitimate interest\" under GDPR Article 6(1)(f) for basic\n // aggregate analytics. No cross-site tracking, no advertising, no user profiles.\n const hasTrackedInstall = useRef(false);\n useEffect(() => {\n if (!hasTrackedInstall.current) {\n hasTrackedInstall.current = true;\n void trackInstall();\n }\n }, []);\n\n // Track session start when consent is granted\n useEffect(() => {\n if (consent === \"granted\") {\n void trackSessionStart();\n }\n }, [consent]);\n\n const grantConsent = useCallback(() => setTelemetryConsent(\"granted\"), []);\n\n const denyConsent = useCallback(() => setTelemetryConsent(\"denied\"), []);\n\n const track = useCallback(\n (eventName: string, properties?: Record<string, unknown>) => {\n void trackEvent(eventName, properties);\n },\n [],\n );\n\n const clearData = useCallback(() => clearTelemetryData(), []);\n\n return {\n consent,\n isEnabled: consent === \"granted\",\n showConsentPrompt: consent === \"pending\",\n grantConsent,\n denyConsent,\n track,\n clearData,\n };\n}\n"],"mappings":";;;AA4DA,SAAgB,IAAmC;CACjD,IAAM,IAAU,EACd,GACA,SACM,UACP,EAWK,IAAoB,EAAO,GAAM;AASvC,CARA,QAAgB;AACd,EAAK,EAAkB,YACrB,EAAkB,UAAU,IACvB,GAAc;IAEpB,EAAE,CAAC,EAGN,QAAgB;AACd,EAAI,MAAY,aACT,GAAmB;IAEzB,CAAC,EAAQ,CAAC;CAEb,IAAM,IAAe,QAAkB,EAAoB,UAAU,EAAE,EAAE,CAAC,EAEpE,IAAc,QAAkB,EAAoB,SAAS,EAAE,EAAE,CAAC,EAElE,IAAQ,GACX,GAAmB,MAAyC;AACtD,IAAW,GAAW,EAAW;IAExC,EAAE,CACH,EAEK,IAAY,QAAkB,GAAoB,EAAE,EAAE,CAAC;AAE7D,QAAO;EACL;EACA,WAAW,MAAY;EACvB,mBAAmB,MAAY;EAC/B;EACA;EACA;EACA;EACD"}
@@ -1,2 +1,2 @@
1
- require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../node_modules/posthog-js/react/dist/esm/index.cjs`),t=require(`./query/use-settings.cjs`);var n=()=>{let n=e.usePostHog(),{data:r}=t.useSettings(),i={current_url:window.location.href,user_email:r?.email||r?.git_user_email||null},a=(e,t={})=>{!n||r?.user_consents_to_analytics!==!0||n.capture(e,{...t,...i})};return{trackLoginButtonClick:({provider:e})=>{a(`login_button_clicked`,{provider:e})},trackConversationCreated:({conversationId:e,taskId:t,hasRepository:n,gitProvider:r,hasWorkspace:i,workspaceMode:o,hasInitialQuery:s,agentType:c,hasParentConversation:l,entryPoint:u})=>{a(`conversation_created`,{conversation_id:e,task_id:t,is_start_task:e.startsWith(`task-`),has_repository:n,git_provider:r,has_workspace:i,workspace_mode:o,has_initial_query:s,agent_type:c,has_parent_conversation:l,entry_point:u})},trackPushButtonClick:()=>{a(`push_button_clicked`)},trackPullButtonClick:()=>{a(`pull_button_clicked`)},trackCreatePrButtonClick:()=>{a(`create_pr_button_clicked`)},trackUserSignupCompleted:()=>{a(`user_signup_completed`,{signup_timestamp:new Date().toISOString()})},trackPrebuiltAutomationEnabled:({automationId:e,automationName:t,automationCategory:n})=>{a(`prebuilt_automation_enabled`,{automation_id:e,automation_name:t,automation_category:n})},trackInitialQuerySubmitted:({entryPoint:e,queryCharacterLength:t,replayJsonSize:n})=>{a(`initial_query_submitted`,{entry_point:e,query_character_length:t,replay_json_size:n})},trackUserMessageSent:({sessionMessageCount:e,currentMessageLength:t})=>{a(`user_message_sent`,{session_message_count:e,current_message_length:t})},trackDownloadVsCodeButtonClicked:()=>{a(`download_via_vscode_button_clicked`)},trackSettingsSaved:({llmModel:e,llmApiKeySet:t,searchApiKeySet:n,remoteRuntimeResourceFactor:r})=>{a(`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})=>{a(`mcp_config_updated`,{has_mcp_config:!0,sse_servers_count:e,stdio_servers_count:t})},trackDownloadTrajectoryButtonClicked:()=>{a(`download_trajectory_button_clicked`)},trackConversationExported:e=>{a(`conversation_exported`,{format:e})},trackAutomationCreated:({backendKind:e})=>{a(`automation_created`,{backend_kind:e})},trackAutomationExecuted:({backendKind:e})=>{a(`automation_executed`,{backend_kind:e})},trackAutomationDeleted:({backendKind:e})=>{a(`automation_deleted`,{backend_kind:e})},trackAutomationDeactivated:({backendKind:e})=>{a(`automation_deactivated`,{backend_kind:e})},trackAutomationEdited:({backendKind:e})=>{a(`automation_edited`,{backend_kind:e})},trackAutomationExported:({backendKind:e})=>{a(`automation_exported`,{backend_kind:e})},trackAutomationImported:({backendKind:e})=>{a(`automation_imported`,{backend_kind:e})},trackBackendAdded:({backendKind:e,connectionMethod:t,isOpenhandsCloud:n,isCustomHost:r,hasApiKey:i,source:o})=>{a(`backend_added`,{backend_kind:e,connection_method:t,is_openhands_cloud:n,is_custom_host:r,has_api_key:i,source:o})},trackOnboardingStarted:()=>{a(`onboarding_started`)},trackOnboardingStepViewed:({step:e,stepIndex:t,totalSteps:n,agent:r})=>{a(`onboarding_step_viewed`,{step:e,step_index:t,total_steps:n,agent:r})},trackOnboardingCompleted:({agent:e})=>{a(`onboarding_completed`,{agent:e})},trackOnboardingSkipped:({step:e,stepIndex:t,totalSteps:n,agent:r})=>{a(`onboarding_skipped`,{step:e,step_index:t,total_steps:n,agent:r})}}};exports.useTracking=n;
1
+ require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../services/telemetry.cjs`),t=require(`./query/use-settings.cjs`);var n=()=>{let{data:n}=t.useSettings(),r={current_url:window.location.href,user_email:n?.email||n?.git_user_email||null},i=(t,n={})=>{e.trackEvent(t,{...n,...r})};return{trackLoginButtonClick:({provider:e})=>{i(`login_button_clicked`,{provider:e})},trackConversationCreated:({conversationId:e,taskId:t,hasRepository:n,gitProvider:r,hasWorkspace:a,workspaceMode:o,hasInitialQuery:s,agentType:c,hasParentConversation:l,entryPoint:u})=>{i(`conversation_created`,{conversation_id:e,task_id:t,is_start_task:e.startsWith(`task-`),has_repository:n,git_provider:r,has_workspace:a,workspace_mode:o,has_initial_query:s,agent_type:c,has_parent_conversation:l,entry_point:u})},trackPushButtonClick:()=>{i(`push_button_clicked`)},trackPullButtonClick:()=>{i(`pull_button_clicked`)},trackCreatePrButtonClick:()=>{i(`create_pr_button_clicked`)},trackUserSignupCompleted:()=>{i(`user_signup_completed`,{signup_timestamp:new Date().toISOString()})},trackPrebuiltAutomationEnabled:({automationId:e,automationName:t,automationCategory:n})=>{i(`prebuilt_automation_enabled`,{automation_id:e,automation_name:t,automation_category:n})},trackInitialQuerySubmitted:({entryPoint:e,queryCharacterLength:t,replayJsonSize:n})=>{i(`initial_query_submitted`,{entry_point:e,query_character_length:t,replay_json_size:n})},trackUserMessageSent:({sessionMessageCount:e,currentMessageLength:t})=>{i(`user_message_sent`,{session_message_count:e,current_message_length:t})},trackDownloadVsCodeButtonClicked:()=>{i(`download_via_vscode_button_clicked`)},trackSettingsSaved:({llmModel:e,llmApiKeySet:t,searchApiKeySet:n,remoteRuntimeResourceFactor:r})=>{i(`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})=>{i(`mcp_config_updated`,{has_mcp_config:!0,sse_servers_count:e,stdio_servers_count:t})},trackDownloadTrajectoryButtonClicked:()=>{i(`download_trajectory_button_clicked`)},trackConversationExported:e=>{i(`conversation_exported`,{format:e})},trackAutomationCreated:({backendKind:e})=>{i(`automation_created`,{backend_kind:e})},trackAutomationExecuted:({backendKind:e})=>{i(`automation_executed`,{backend_kind:e})},trackAutomationDeleted:({backendKind:e})=>{i(`automation_deleted`,{backend_kind:e})},trackAutomationDeactivated:({backendKind:e})=>{i(`automation_deactivated`,{backend_kind:e})},trackAutomationEdited:({backendKind:e})=>{i(`automation_edited`,{backend_kind:e})},trackAutomationExported:({backendKind:e})=>{i(`automation_exported`,{backend_kind:e})},trackAutomationImported:({backendKind:e})=>{i(`automation_imported`,{backend_kind:e})},trackBackendAdded:({backendKind:e,connectionMethod:t,isOpenhandsCloud:n,isCustomHost:r,hasApiKey:a,source:o})=>{i(`backend_added`,{backend_kind:e,connection_method:t,is_openhands_cloud:n,is_custom_host:r,has_api_key:a,source:o})},trackOnboardingStarted:()=>{i(`onboarding_started`)},trackOnboardingStepViewed:({step:e,stepIndex:t,totalSteps:n,agent:r})=>{i(`onboarding_step_viewed`,{step:e,step_index:t,total_steps:n,agent:r})},trackOnboardingCompleted:({agent:e})=>{i(`onboarding_completed`,{agent:e})},trackOnboardingSkipped:({step:e,stepIndex:t,totalSteps:n,agent:r})=>{i(`onboarding_skipped`,{step:e,step_index:t,total_steps:n,agent:r})}}};exports.useTracking=n;
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 { usePostHog } from \"posthog-js/react\";\nimport { useSettings } from \"./query/use-settings\";\nimport { Provider } from \"#/types/settings\";\nimport type { BackendKind } from \"#/api/backend-registry/types\";\nimport type { WorkspaceMode } from \"#/api/conversation-metadata-store\";\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 (user_consents_to_analytics === true).\n * Events are silently dropped when:\n * - posthog is not initialized (VITE_POSTHOG_CLIENT_KEY not set)\n * - user_consents_to_analytics is false or null (consent not yet collected)\n */\nexport const useTracking = () => {\n const posthog = usePostHog();\n const { data: settings } = useSettings();\n\n // Common properties included in all tracking events\n const commonProperties = {\n current_url: window.location.href,\n user_email: settings?.email || settings?.git_user_email || null,\n };\n\n /**\n * Capture an event only when PostHog is available and the user has\n * explicitly consented. null and false are both treated as \"not consented\".\n */\n const track = (event: string, properties: Record<string, unknown> = {}) => {\n if (!posthog || settings?.user_consents_to_analytics !== true) return;\n posthog.capture(event, { ...properties, ...commonProperties });\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_created\", {\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 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 trackAutomationCreated = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_created\", { 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 trackAutomationDeactivated = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_deactivated\", { 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 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 isOpenhandsCloud,\n isCustomHost,\n hasApiKey,\n source,\n }: {\n backendKind: BackendKind;\n connectionMethod: \"manual\" | \"cloud_login\";\n isOpenhandsCloud: boolean;\n isCustomHost: boolean;\n hasApiKey: boolean;\n source?: \"add_backend_modal\" | \"manage_backends_modal\";\n }) => {\n track(\"backend_added\", {\n backend_kind: backendKind,\n connection_method: connectionMethod,\n is_openhands_cloud: isOpenhandsCloud,\n is_custom_host: isCustomHost,\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 trackInitialQuerySubmitted,\n trackUserMessageSent,\n trackDownloadVsCodeButtonClicked,\n trackSettingsSaved,\n trackMcpConfigUpdated,\n trackDownloadTrajectoryButtonClicked,\n trackConversationExported,\n trackAutomationCreated,\n trackAutomationExecuted,\n trackAutomationDeleted,\n trackAutomationDeactivated,\n trackAutomationEdited,\n trackAutomationExported,\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 { useSettings } from \"./query/use-settings\";\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 { 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 { data: settings } = useSettings();\n\n // Common properties included in all tracking events\n const commonProperties = {\n current_url: window.location.href,\n user_email: settings?.email || settings?.git_user_email || null,\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 void trackEvent(event, { ...properties, ...commonProperties });\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_created\", {\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 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 trackAutomationCreated = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_created\", { 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 trackAutomationDeactivated = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_deactivated\", { 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 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 isOpenhandsCloud,\n isCustomHost,\n hasApiKey,\n source,\n }: {\n backendKind: BackendKind;\n connectionMethod: \"manual\" | \"cloud_login\";\n isOpenhandsCloud: boolean;\n isCustomHost: boolean;\n hasApiKey: boolean;\n source?: CloudConnectionSource;\n }) => {\n track(\"backend_added\", {\n backend_kind: backendKind,\n connection_method: connectionMethod,\n is_openhands_cloud: isOpenhandsCloud,\n is_custom_host: isCustomHost,\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 trackInitialQuerySubmitted,\n trackUserMessageSent,\n trackDownloadVsCodeButtonClicked,\n trackSettingsSaved,\n trackMcpConfigUpdated,\n trackDownloadTrajectoryButtonClicked,\n trackConversationExported,\n trackAutomationCreated,\n trackAutomationExecuted,\n trackAutomationDeleted,\n trackAutomationDeactivated,\n trackAutomationEdited,\n trackAutomationExported,\n trackAutomationImported,\n trackBackendAdded,\n trackOnboardingStarted,\n trackOnboardingStepViewed,\n trackOnboardingCompleted,\n trackOnboardingSkipped,\n };\n};\n"],"mappings":"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"}
@@ -1,14 +1,14 @@
1
1
  import { Provider } from "#/types/settings";
2
2
  import type { BackendKind } from "#/api/backend-registry/types";
3
3
  import type { WorkspaceMode } from "#/api/conversation-metadata-store";
4
+ import type { CloudConnectionSource } from "#/services/cloud-funnel-analytics";
4
5
  /**
5
6
  * Hook that provides tracking functions with automatic data collection
6
7
  * from available hooks (settings, etc.)
7
8
  *
8
- * All events require explicit user consent (user_consents_to_analytics === true).
9
- * Events are silently dropped when:
10
- * - posthog is not initialized (VITE_POSTHOG_CLIENT_KEY not set)
11
- * - user_consents_to_analytics is false or null (consent not yet collected)
9
+ * All events require explicit user consent. The shared PostHog client enforces
10
+ * the canonical consent configured by telemetry.ts; this hook must not gate on
11
+ * backend settings because they can be stale while a backend changes.
12
12
  */
13
13
  export declare const useTracking: () => {
14
14
  trackLoginButtonClick: ({ provider }: {
@@ -84,7 +84,7 @@ export declare const useTracking: () => {
84
84
  isOpenhandsCloud: boolean;
85
85
  isCustomHost: boolean;
86
86
  hasApiKey: boolean;
87
- source?: "add_backend_modal" | "manage_backends_modal";
87
+ source?: CloudConnectionSource;
88
88
  }) => void;
89
89
  trackOnboardingStarted: () => void;
90
90
  trackOnboardingStepViewed: ({ step, stepIndex, totalSteps, agent, }: {
@@ -1,28 +1,28 @@
1
- import { usePostHog as e } from "../node_modules/posthog-js/react/dist/esm/index.js";
1
+ import { trackEvent as e } from "../services/telemetry.js";
2
2
  import { useSettings as t } from "./query/use-settings.js";
3
3
  //#region src/hooks/use-tracking.ts
4
4
  var n = () => {
5
- let n = e(), { data: r } = t(), i = {
5
+ let { data: n } = t(), r = {
6
6
  current_url: window.location.href,
7
- user_email: r?.email || r?.git_user_email || null
8
- }, a = (e, t = {}) => {
9
- !n || r?.user_consents_to_analytics !== !0 || n.capture(e, {
10
- ...t,
11
- ...i
7
+ user_email: n?.email || n?.git_user_email || null
8
+ }, i = (t, n = {}) => {
9
+ e(t, {
10
+ ...n,
11
+ ...r
12
12
  });
13
13
  };
14
14
  return {
15
15
  trackLoginButtonClick: ({ provider: e }) => {
16
- a("login_button_clicked", { provider: e });
16
+ i("login_button_clicked", { provider: e });
17
17
  },
18
- trackConversationCreated: ({ conversationId: e, taskId: t, hasRepository: n, gitProvider: r, hasWorkspace: i, workspaceMode: o, hasInitialQuery: s, agentType: c, hasParentConversation: l, entryPoint: u }) => {
19
- a("conversation_created", {
18
+ trackConversationCreated: ({ conversationId: e, taskId: t, hasRepository: n, gitProvider: r, hasWorkspace: a, workspaceMode: o, hasInitialQuery: s, agentType: c, hasParentConversation: l, entryPoint: u }) => {
19
+ i("conversation_created", {
20
20
  conversation_id: e,
21
21
  task_id: t,
22
22
  is_start_task: e.startsWith("task-"),
23
23
  has_repository: n,
24
24
  git_provider: r,
25
- has_workspace: i,
25
+ has_workspace: a,
26
26
  workspace_mode: o,
27
27
  has_initial_query: s,
28
28
  agent_type: c,
@@ -31,42 +31,42 @@ var n = () => {
31
31
  });
32
32
  },
33
33
  trackPushButtonClick: () => {
34
- a("push_button_clicked");
34
+ i("push_button_clicked");
35
35
  },
36
36
  trackPullButtonClick: () => {
37
- a("pull_button_clicked");
37
+ i("pull_button_clicked");
38
38
  },
39
39
  trackCreatePrButtonClick: () => {
40
- a("create_pr_button_clicked");
40
+ i("create_pr_button_clicked");
41
41
  },
42
42
  trackUserSignupCompleted: () => {
43
- a("user_signup_completed", { signup_timestamp: (/* @__PURE__ */ new Date()).toISOString() });
43
+ i("user_signup_completed", { signup_timestamp: (/* @__PURE__ */ new Date()).toISOString() });
44
44
  },
45
45
  trackPrebuiltAutomationEnabled: ({ automationId: e, automationName: t, automationCategory: n }) => {
46
- a("prebuilt_automation_enabled", {
46
+ i("prebuilt_automation_enabled", {
47
47
  automation_id: e,
48
48
  automation_name: t,
49
49
  automation_category: n
50
50
  });
51
51
  },
52
52
  trackInitialQuerySubmitted: ({ entryPoint: e, queryCharacterLength: t, replayJsonSize: n }) => {
53
- a("initial_query_submitted", {
53
+ i("initial_query_submitted", {
54
54
  entry_point: e,
55
55
  query_character_length: t,
56
56
  replay_json_size: n
57
57
  });
58
58
  },
59
59
  trackUserMessageSent: ({ sessionMessageCount: e, currentMessageLength: t }) => {
60
- a("user_message_sent", {
60
+ i("user_message_sent", {
61
61
  session_message_count: e,
62
62
  current_message_length: t
63
63
  });
64
64
  },
65
65
  trackDownloadVsCodeButtonClicked: () => {
66
- a("download_via_vscode_button_clicked");
66
+ i("download_via_vscode_button_clicked");
67
67
  },
68
68
  trackSettingsSaved: ({ llmModel: e, llmApiKeySet: t, searchApiKeySet: n, remoteRuntimeResourceFactor: r }) => {
69
- a("settings_saved", {
69
+ i("settings_saved", {
70
70
  LLM_MODEL: e,
71
71
  LLM_API_KEY_SET: t,
72
72
  SEARCH_API_KEY_SET: n,
@@ -74,54 +74,54 @@ var n = () => {
74
74
  });
75
75
  },
76
76
  trackMcpConfigUpdated: ({ sseServersCount: e, stdioServersCount: t }) => {
77
- a("mcp_config_updated", {
77
+ i("mcp_config_updated", {
78
78
  has_mcp_config: !0,
79
79
  sse_servers_count: e,
80
80
  stdio_servers_count: t
81
81
  });
82
82
  },
83
83
  trackDownloadTrajectoryButtonClicked: () => {
84
- a("download_trajectory_button_clicked");
84
+ i("download_trajectory_button_clicked");
85
85
  },
86
86
  trackConversationExported: (e) => {
87
- a("conversation_exported", { format: e });
87
+ i("conversation_exported", { format: e });
88
88
  },
89
89
  trackAutomationCreated: ({ backendKind: e }) => {
90
- a("automation_created", { backend_kind: e });
90
+ i("automation_created", { backend_kind: e });
91
91
  },
92
92
  trackAutomationExecuted: ({ backendKind: e }) => {
93
- a("automation_executed", { backend_kind: e });
93
+ i("automation_executed", { backend_kind: e });
94
94
  },
95
95
  trackAutomationDeleted: ({ backendKind: e }) => {
96
- a("automation_deleted", { backend_kind: e });
96
+ i("automation_deleted", { backend_kind: e });
97
97
  },
98
98
  trackAutomationDeactivated: ({ backendKind: e }) => {
99
- a("automation_deactivated", { backend_kind: e });
99
+ i("automation_deactivated", { backend_kind: e });
100
100
  },
101
101
  trackAutomationEdited: ({ backendKind: e }) => {
102
- a("automation_edited", { backend_kind: e });
102
+ i("automation_edited", { backend_kind: e });
103
103
  },
104
104
  trackAutomationExported: ({ backendKind: e }) => {
105
- a("automation_exported", { backend_kind: e });
105
+ i("automation_exported", { backend_kind: e });
106
106
  },
107
107
  trackAutomationImported: ({ backendKind: e }) => {
108
- a("automation_imported", { backend_kind: e });
108
+ i("automation_imported", { backend_kind: e });
109
109
  },
110
- trackBackendAdded: ({ backendKind: e, connectionMethod: t, isOpenhandsCloud: n, isCustomHost: r, hasApiKey: i, source: o }) => {
111
- a("backend_added", {
110
+ trackBackendAdded: ({ backendKind: e, connectionMethod: t, isOpenhandsCloud: n, isCustomHost: r, hasApiKey: a, source: o }) => {
111
+ i("backend_added", {
112
112
  backend_kind: e,
113
113
  connection_method: t,
114
114
  is_openhands_cloud: n,
115
115
  is_custom_host: r,
116
- has_api_key: i,
116
+ has_api_key: a,
117
117
  source: o
118
118
  });
119
119
  },
120
120
  trackOnboardingStarted: () => {
121
- a("onboarding_started");
121
+ i("onboarding_started");
122
122
  },
123
123
  trackOnboardingStepViewed: ({ step: e, stepIndex: t, totalSteps: n, agent: r }) => {
124
- a("onboarding_step_viewed", {
124
+ i("onboarding_step_viewed", {
125
125
  step: e,
126
126
  step_index: t,
127
127
  total_steps: n,
@@ -129,10 +129,10 @@ var n = () => {
129
129
  });
130
130
  },
131
131
  trackOnboardingCompleted: ({ agent: e }) => {
132
- a("onboarding_completed", { agent: e });
132
+ i("onboarding_completed", { agent: e });
133
133
  },
134
134
  trackOnboardingSkipped: ({ step: e, stepIndex: t, totalSteps: n, agent: r }) => {
135
- a("onboarding_skipped", {
135
+ i("onboarding_skipped", {
136
136
  step: e,
137
137
  step_index: t,
138
138
  total_steps: n,
@@ -1 +1 @@
1
- {"version":3,"file":"use-tracking.js","names":[],"sources":["../../src/hooks/use-tracking.ts"],"sourcesContent":["import { usePostHog } from \"posthog-js/react\";\nimport { useSettings } from \"./query/use-settings\";\nimport { Provider } from \"#/types/settings\";\nimport type { BackendKind } from \"#/api/backend-registry/types\";\nimport type { WorkspaceMode } from \"#/api/conversation-metadata-store\";\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 (user_consents_to_analytics === true).\n * Events are silently dropped when:\n * - posthog is not initialized (VITE_POSTHOG_CLIENT_KEY not set)\n * - user_consents_to_analytics is false or null (consent not yet collected)\n */\nexport const useTracking = () => {\n const posthog = usePostHog();\n const { data: settings } = useSettings();\n\n // Common properties included in all tracking events\n const commonProperties = {\n current_url: window.location.href,\n user_email: settings?.email || settings?.git_user_email || null,\n };\n\n /**\n * Capture an event only when PostHog is available and the user has\n * explicitly consented. null and false are both treated as \"not consented\".\n */\n const track = (event: string, properties: Record<string, unknown> = {}) => {\n if (!posthog || settings?.user_consents_to_analytics !== true) return;\n posthog.capture(event, { ...properties, ...commonProperties });\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_created\", {\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 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 trackAutomationCreated = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_created\", { 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 trackAutomationDeactivated = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_deactivated\", { 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 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 isOpenhandsCloud,\n isCustomHost,\n hasApiKey,\n source,\n }: {\n backendKind: BackendKind;\n connectionMethod: \"manual\" | \"cloud_login\";\n isOpenhandsCloud: boolean;\n isCustomHost: boolean;\n hasApiKey: boolean;\n source?: \"add_backend_modal\" | \"manage_backends_modal\";\n }) => {\n track(\"backend_added\", {\n backend_kind: backendKind,\n connection_method: connectionMethod,\n is_openhands_cloud: isOpenhandsCloud,\n is_custom_host: isCustomHost,\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 trackInitialQuerySubmitted,\n trackUserMessageSent,\n trackDownloadVsCodeButtonClicked,\n trackSettingsSaved,\n trackMcpConfigUpdated,\n trackDownloadTrajectoryButtonClicked,\n trackConversationExported,\n trackAutomationCreated,\n trackAutomationExecuted,\n trackAutomationDeleted,\n trackAutomationDeactivated,\n trackAutomationEdited,\n trackAutomationExported,\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 { useSettings } from \"./query/use-settings\";\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 { 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 { data: settings } = useSettings();\n\n // Common properties included in all tracking events\n const commonProperties = {\n current_url: window.location.href,\n user_email: settings?.email || settings?.git_user_email || null,\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 void trackEvent(event, { ...properties, ...commonProperties });\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_created\", {\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 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 trackAutomationCreated = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_created\", { 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 trackAutomationDeactivated = ({\n backendKind,\n }: {\n backendKind: BackendKind;\n }) => {\n track(\"automation_deactivated\", { 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 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 isOpenhandsCloud,\n isCustomHost,\n hasApiKey,\n source,\n }: {\n backendKind: BackendKind;\n connectionMethod: \"manual\" | \"cloud_login\";\n isOpenhandsCloud: boolean;\n isCustomHost: boolean;\n hasApiKey: boolean;\n source?: CloudConnectionSource;\n }) => {\n track(\"backend_added\", {\n backend_kind: backendKind,\n connection_method: connectionMethod,\n is_openhands_cloud: isOpenhandsCloud,\n is_custom_host: isCustomHost,\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 trackInitialQuerySubmitted,\n trackUserMessageSent,\n trackDownloadVsCodeButtonClicked,\n trackSettingsSaved,\n trackMcpConfigUpdated,\n trackDownloadTrajectoryButtonClicked,\n trackConversationExported,\n trackAutomationCreated,\n trackAutomationExecuted,\n trackAutomationDeleted,\n trackAutomationDeactivated,\n trackAutomationEdited,\n trackAutomationExported,\n trackAutomationImported,\n trackBackendAdded,\n trackOnboardingStarted,\n trackOnboardingStepViewed,\n trackOnboardingCompleted,\n trackOnboardingSkipped,\n };\n};\n"],"mappings":"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"}