@amplitude/wizard 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/dist/bin.js +47 -11
  2. package/dist/src/frameworks/javascript-node/javascript-node-wizard-agent.js +11 -1
  3. package/dist/src/frameworks/react-router/react-router-wizard-agent.js +65 -8
  4. package/dist/src/frameworks/vue/vue-wizard-agent.js +6 -1
  5. package/dist/src/lib/agent-interface.js +46 -0
  6. package/dist/src/lib/agent-runner.js +112 -51
  7. package/dist/src/lib/api.d.ts +35 -0
  8. package/dist/src/lib/api.js +118 -0
  9. package/dist/src/lib/commandments.js +1 -0
  10. package/dist/src/lib/constants.d.ts +1 -1
  11. package/dist/src/lib/constants.js +1 -1
  12. package/dist/src/lib/credential-resolution.js +7 -0
  13. package/dist/src/lib/framework-config.d.ts +9 -0
  14. package/dist/src/lib/mcp-with-fallback.d.ts +43 -0
  15. package/dist/src/lib/mcp-with-fallback.js +220 -0
  16. package/dist/src/lib/version-check.d.ts +17 -0
  17. package/dist/src/lib/version-check.js +72 -0
  18. package/dist/src/lib/wizard-session.d.ts +22 -7
  19. package/dist/src/lib/wizard-session.js +5 -3
  20. package/dist/src/run.d.ts +18 -1
  21. package/dist/src/run.js +104 -15
  22. package/dist/src/ui/agent-ui.d.ts +2 -0
  23. package/dist/src/ui/agent-ui.js +10 -0
  24. package/dist/src/ui/logging-ui.d.ts +2 -0
  25. package/dist/src/ui/logging-ui.js +6 -0
  26. package/dist/src/ui/tui/components/ConsoleView.js +14 -1
  27. package/dist/src/ui/tui/components/JourneyStepper.js +1 -3
  28. package/dist/src/ui/tui/flows.d.ts +0 -1
  29. package/dist/src/ui/tui/flows.js +1 -9
  30. package/dist/src/ui/tui/ink-ui.d.ts +2 -0
  31. package/dist/src/ui/tui/ink-ui.js +6 -0
  32. package/dist/src/ui/tui/screen-registry.js +0 -2
  33. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.d.ts +5 -3
  34. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.js +124 -4
  35. package/dist/src/ui/tui/screens/OutroScreen.js +12 -3
  36. package/dist/src/ui/tui/store.d.ts +22 -3
  37. package/dist/src/ui/tui/store.js +52 -18
  38. package/dist/src/ui/tui/utils/diagnostics.js +1 -3
  39. package/dist/src/ui/wizard-ui.d.ts +8 -0
  40. package/dist/src/utils/analytics.d.ts +15 -0
  41. package/dist/src/utils/analytics.js +37 -0
  42. package/dist/src/utils/setup-utils.js +6 -1
  43. package/package.json +2 -2
  44. package/skills/integration/integration-android/SKILL.md +7 -10
  45. package/skills/integration/integration-android/references/amplitude-quickstart.md +1 -1
  46. package/skills/integration/integration-android/references/android.md +1468 -0
  47. package/skills/integration/integration-android/references/basic-integration-1.0-begin.md +3 -1
  48. package/skills/integration/integration-android/references/basic-integration-1.1-edit.md +183 -0
  49. package/skills/integration/integration-android/references/basic-integration-1.3-conclude.md +81 -11
  50. package/skills/integration/integration-angular/SKILL.md +6 -8
  51. package/skills/integration/integration-angular/references/amplitude-quickstart.md +1 -1
  52. package/skills/integration/integration-angular/references/basic-integration-1.0-begin.md +3 -1
  53. package/skills/integration/integration-angular/references/basic-integration-1.1-edit.md +183 -0
  54. package/skills/integration/integration-angular/references/basic-integration-1.3-conclude.md +81 -11
  55. package/skills/integration/integration-angular/references/browser-sdk-2.md +67 -20
  56. package/skills/integration/{integration-swift/references/analytics.md → integration-angular/references/browser-unified-sdk.md} +591 -157
  57. package/skills/integration/integration-astro-hybrid/SKILL.md +6 -13
  58. package/skills/integration/integration-astro-hybrid/references/amplitude-quickstart.md +1 -1
  59. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.0-begin.md +3 -1
  60. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.1-edit.md +183 -0
  61. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.3-conclude.md +81 -11
  62. package/skills/integration/integration-astro-hybrid/references/browser-sdk-2.md +67 -20
  63. package/skills/integration/{integration-android/references/analytics.md → integration-astro-hybrid/references/browser-unified-sdk.md} +591 -157
  64. package/skills/integration/integration-astro-ssr/SKILL.md +6 -11
  65. package/skills/integration/integration-astro-ssr/references/amplitude-quickstart.md +1 -1
  66. package/skills/integration/integration-astro-ssr/references/basic-integration-1.0-begin.md +3 -1
  67. package/skills/integration/integration-astro-ssr/references/basic-integration-1.1-edit.md +183 -0
  68. package/skills/integration/integration-astro-ssr/references/basic-integration-1.3-conclude.md +81 -11
  69. package/skills/integration/integration-astro-ssr/references/browser-sdk-2.md +67 -20
  70. package/skills/integration/{integration-javascript_node/references/analytics.md → integration-astro-ssr/references/browser-unified-sdk.md} +591 -157
  71. package/skills/integration/integration-astro-static/SKILL.md +6 -8
  72. package/skills/integration/integration-astro-static/references/amplitude-quickstart.md +1 -1
  73. package/skills/integration/integration-astro-static/references/basic-integration-1.0-begin.md +3 -1
  74. package/skills/integration/integration-astro-static/references/basic-integration-1.1-edit.md +183 -0
  75. package/skills/integration/integration-astro-static/references/basic-integration-1.3-conclude.md +81 -11
  76. package/skills/integration/integration-astro-static/references/browser-sdk-2.md +67 -20
  77. package/skills/integration/integration-astro-static/references/browser-unified-sdk.md +2212 -0
  78. package/skills/integration/integration-astro-view-transitions/SKILL.md +6 -10
  79. package/skills/integration/integration-astro-view-transitions/references/amplitude-quickstart.md +1 -1
  80. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.0-begin.md +3 -1
  81. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.1-edit.md +183 -0
  82. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.3-conclude.md +81 -11
  83. package/skills/integration/integration-astro-view-transitions/references/browser-sdk-2.md +67 -20
  84. package/skills/integration/integration-astro-view-transitions/references/browser-unified-sdk.md +2212 -0
  85. package/skills/integration/integration-django/SKILL.md +5 -16
  86. package/skills/integration/integration-django/references/amplitude-quickstart.md +1 -1
  87. package/skills/integration/integration-django/references/basic-integration-1.0-begin.md +3 -1
  88. package/skills/integration/integration-django/references/basic-integration-1.1-edit.md +183 -0
  89. package/skills/integration/integration-django/references/basic-integration-1.3-conclude.md +81 -11
  90. package/skills/integration/integration-django/references/python.md +1 -1
  91. package/skills/integration/integration-expo/SKILL.md +8 -13
  92. package/skills/integration/integration-expo/references/amplitude-quickstart.md +1 -1
  93. package/skills/integration/integration-expo/references/basic-integration-1.0-begin.md +3 -1
  94. package/skills/integration/integration-expo/references/basic-integration-1.1-edit.md +183 -0
  95. package/skills/integration/integration-expo/references/basic-integration-1.3-conclude.md +81 -11
  96. package/skills/integration/integration-expo/references/react-native-sdk.md +11 -10
  97. package/skills/integration/integration-fastapi/SKILL.md +5 -16
  98. package/skills/integration/integration-fastapi/references/amplitude-quickstart.md +1 -1
  99. package/skills/integration/integration-fastapi/references/basic-integration-1.0-begin.md +3 -1
  100. package/skills/integration/integration-fastapi/references/basic-integration-1.1-edit.md +183 -0
  101. package/skills/integration/integration-fastapi/references/basic-integration-1.3-conclude.md +81 -11
  102. package/skills/integration/integration-fastapi/references/python.md +1 -1
  103. package/skills/integration/integration-flask/SKILL.md +5 -15
  104. package/skills/integration/integration-flask/references/amplitude-quickstart.md +1 -1
  105. package/skills/integration/integration-flask/references/basic-integration-1.0-begin.md +3 -1
  106. package/skills/integration/integration-flask/references/basic-integration-1.1-edit.md +183 -0
  107. package/skills/integration/integration-flask/references/basic-integration-1.3-conclude.md +81 -11
  108. package/skills/integration/integration-flask/references/python.md +1 -1
  109. package/skills/integration/integration-javascript_node/SKILL.md +6 -12
  110. package/skills/integration/integration-javascript_node/references/amplitude-quickstart.md +1 -1
  111. package/skills/integration/integration-javascript_node/references/basic-integration-1.0-begin.md +3 -1
  112. package/skills/integration/integration-javascript_node/references/basic-integration-1.1-edit.md +183 -0
  113. package/skills/integration/integration-javascript_node/references/basic-integration-1.3-conclude.md +81 -11
  114. package/skills/integration/integration-javascript_node/references/node.md +1457 -0
  115. package/skills/integration/integration-javascript_web/SKILL.md +7 -16
  116. package/skills/integration/integration-javascript_web/references/amplitude-quickstart.md +1 -1
  117. package/skills/integration/integration-javascript_web/references/basic-integration-1.0-begin.md +3 -1
  118. package/skills/integration/integration-javascript_web/references/basic-integration-1.1-edit.md +183 -0
  119. package/skills/integration/integration-javascript_web/references/basic-integration-1.3-conclude.md +81 -11
  120. package/skills/integration/integration-javascript_web/references/browser-sdk-2.md +67 -20
  121. package/skills/integration/integration-javascript_web/references/browser-unified-sdk.md +2212 -0
  122. package/skills/integration/integration-laravel/SKILL.md +5 -11
  123. package/skills/integration/integration-laravel/references/amplitude-quickstart.md +1 -1
  124. package/skills/integration/integration-laravel/references/analytics.md +1 -1
  125. package/skills/integration/integration-laravel/references/basic-integration-1.0-begin.md +3 -1
  126. package/skills/integration/integration-laravel/references/basic-integration-1.1-edit.md +183 -0
  127. package/skills/integration/integration-laravel/references/basic-integration-1.3-conclude.md +81 -11
  128. package/skills/integration/integration-nextjs-app-router/SKILL.md +6 -13
  129. package/skills/integration/integration-nextjs-app-router/references/amplitude-quickstart.md +1 -1
  130. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.0-begin.md +3 -1
  131. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.1-edit.md +183 -0
  132. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.3-conclude.md +81 -11
  133. package/skills/integration/integration-nextjs-app-router/references/browser-sdk-2.md +67 -20
  134. package/skills/integration/integration-nextjs-app-router/references/browser-unified-sdk.md +2212 -0
  135. package/skills/integration/integration-nextjs-pages-router/SKILL.md +6 -13
  136. package/skills/integration/integration-nextjs-pages-router/references/amplitude-quickstart.md +1 -1
  137. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.0-begin.md +3 -1
  138. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.1-edit.md +183 -0
  139. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.3-conclude.md +81 -11
  140. package/skills/integration/integration-nextjs-pages-router/references/browser-sdk-2.md +67 -20
  141. package/skills/integration/integration-nextjs-pages-router/references/browser-unified-sdk.md +2212 -0
  142. package/skills/integration/integration-nuxt-3.6/SKILL.md +6 -5
  143. package/skills/integration/integration-nuxt-3.6/references/EXAMPLE.md +1 -1
  144. package/skills/integration/integration-nuxt-3.6/references/amplitude-quickstart.md +1 -1
  145. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.0-begin.md +3 -1
  146. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.1-edit.md +183 -0
  147. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.3-conclude.md +81 -11
  148. package/skills/integration/integration-nuxt-3.6/references/browser-sdk-2.md +67 -20
  149. package/skills/integration/integration-nuxt-3.6/references/browser-unified-sdk.md +2212 -0
  150. package/skills/integration/integration-nuxt-4/SKILL.md +6 -5
  151. package/skills/integration/integration-nuxt-4/references/amplitude-quickstart.md +1 -1
  152. package/skills/integration/integration-nuxt-4/references/basic-integration-1.0-begin.md +3 -1
  153. package/skills/integration/integration-nuxt-4/references/basic-integration-1.1-edit.md +183 -0
  154. package/skills/integration/integration-nuxt-4/references/basic-integration-1.3-conclude.md +81 -11
  155. package/skills/integration/integration-nuxt-4/references/browser-sdk-2.md +67 -20
  156. package/skills/integration/integration-nuxt-4/references/browser-unified-sdk.md +2212 -0
  157. package/skills/integration/integration-python/SKILL.md +8 -13
  158. package/skills/integration/integration-python/references/amplitude-quickstart.md +1 -1
  159. package/skills/integration/integration-python/references/basic-integration-1.0-begin.md +3 -1
  160. package/skills/integration/integration-python/references/basic-integration-1.1-edit.md +183 -0
  161. package/skills/integration/integration-python/references/basic-integration-1.3-conclude.md +81 -11
  162. package/skills/integration/integration-python/references/python.md +1 -1
  163. package/skills/integration/integration-react-native/SKILL.md +8 -9
  164. package/skills/integration/integration-react-native/references/amplitude-quickstart.md +1 -1
  165. package/skills/integration/integration-react-native/references/basic-integration-1.0-begin.md +3 -1
  166. package/skills/integration/integration-react-native/references/basic-integration-1.1-edit.md +183 -0
  167. package/skills/integration/integration-react-native/references/basic-integration-1.3-conclude.md +81 -11
  168. package/skills/integration/integration-react-native/references/react-native-sdk.md +11 -10
  169. package/skills/integration/integration-react-react-router-6/SKILL.md +6 -12
  170. package/skills/integration/integration-react-react-router-6/references/amplitude-quickstart.md +1 -1
  171. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.0-begin.md +3 -1
  172. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.1-edit.md +183 -0
  173. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.3-conclude.md +81 -11
  174. package/skills/integration/integration-react-react-router-6/references/browser-sdk-2.md +67 -20
  175. package/skills/integration/integration-react-react-router-6/references/browser-unified-sdk.md +2212 -0
  176. package/skills/integration/integration-react-react-router-7-data/SKILL.md +6 -12
  177. package/skills/integration/integration-react-react-router-7-data/references/amplitude-quickstart.md +1 -1
  178. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.0-begin.md +3 -1
  179. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.1-edit.md +183 -0
  180. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.3-conclude.md +81 -11
  181. package/skills/integration/integration-react-react-router-7-data/references/browser-sdk-2.md +67 -20
  182. package/skills/integration/integration-react-react-router-7-data/references/browser-unified-sdk.md +2212 -0
  183. package/skills/integration/integration-react-react-router-7-declarative/SKILL.md +6 -12
  184. package/skills/integration/integration-react-react-router-7-declarative/references/amplitude-quickstart.md +1 -1
  185. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.0-begin.md +3 -1
  186. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.1-edit.md +183 -0
  187. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.3-conclude.md +81 -11
  188. package/skills/integration/integration-react-react-router-7-declarative/references/browser-sdk-2.md +67 -20
  189. package/skills/integration/integration-react-react-router-7-declarative/references/browser-unified-sdk.md +2212 -0
  190. package/skills/integration/integration-react-react-router-7-framework/SKILL.md +6 -12
  191. package/skills/integration/integration-react-react-router-7-framework/references/amplitude-quickstart.md +1 -1
  192. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.0-begin.md +3 -1
  193. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.1-edit.md +183 -0
  194. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.3-conclude.md +81 -11
  195. package/skills/integration/integration-react-react-router-7-framework/references/browser-sdk-2.md +67 -20
  196. package/skills/integration/integration-react-react-router-7-framework/references/browser-unified-sdk.md +2212 -0
  197. package/skills/integration/integration-react-tanstack-router-code-based/SKILL.md +6 -14
  198. package/skills/integration/integration-react-tanstack-router-code-based/references/amplitude-quickstart.md +1 -1
  199. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.0-begin.md +3 -1
  200. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.1-edit.md +183 -0
  201. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.3-conclude.md +81 -11
  202. package/skills/integration/integration-react-tanstack-router-code-based/references/browser-sdk-2.md +67 -20
  203. package/skills/integration/integration-react-tanstack-router-code-based/references/browser-unified-sdk.md +2212 -0
  204. package/skills/integration/integration-react-tanstack-router-file-based/SKILL.md +6 -14
  205. package/skills/integration/integration-react-tanstack-router-file-based/references/amplitude-quickstart.md +1 -1
  206. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.0-begin.md +3 -1
  207. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.1-edit.md +183 -0
  208. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.3-conclude.md +81 -11
  209. package/skills/integration/integration-react-tanstack-router-file-based/references/browser-sdk-2.md +67 -20
  210. package/skills/integration/integration-react-tanstack-router-file-based/references/browser-unified-sdk.md +2212 -0
  211. package/skills/integration/integration-react-vite/SKILL.md +6 -12
  212. package/skills/integration/integration-react-vite/references/amplitude-quickstart.md +1 -1
  213. package/skills/integration/integration-react-vite/references/basic-integration-1.0-begin.md +3 -1
  214. package/skills/integration/integration-react-vite/references/basic-integration-1.1-edit.md +183 -0
  215. package/skills/integration/integration-react-vite/references/basic-integration-1.3-conclude.md +81 -11
  216. package/skills/integration/integration-react-vite/references/browser-sdk-2.md +67 -20
  217. package/skills/integration/integration-react-vite/references/browser-unified-sdk.md +2212 -0
  218. package/skills/integration/integration-ruby/SKILL.md +6 -10
  219. package/skills/integration/integration-ruby/references/amplitude-quickstart.md +1 -1
  220. package/skills/integration/integration-ruby/references/analytics.md +1 -1
  221. package/skills/integration/integration-ruby/references/basic-integration-1.0-begin.md +3 -1
  222. package/skills/integration/integration-ruby/references/basic-integration-1.1-edit.md +183 -0
  223. package/skills/integration/integration-ruby/references/basic-integration-1.3-conclude.md +81 -11
  224. package/skills/integration/integration-ruby-on-rails/SKILL.md +5 -14
  225. package/skills/integration/integration-ruby-on-rails/references/amplitude-quickstart.md +1 -1
  226. package/skills/integration/integration-ruby-on-rails/references/analytics.md +1 -1
  227. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.0-begin.md +3 -1
  228. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.1-edit.md +183 -0
  229. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.3-conclude.md +81 -11
  230. package/skills/integration/integration-sveltekit/SKILL.md +6 -6
  231. package/skills/integration/integration-sveltekit/references/amplitude-quickstart.md +1 -1
  232. package/skills/integration/integration-sveltekit/references/basic-integration-1.0-begin.md +3 -1
  233. package/skills/integration/integration-sveltekit/references/basic-integration-1.1-edit.md +183 -0
  234. package/skills/integration/integration-sveltekit/references/basic-integration-1.3-conclude.md +81 -11
  235. package/skills/integration/integration-sveltekit/references/browser-sdk-2.md +67 -20
  236. package/skills/integration/integration-sveltekit/references/browser-unified-sdk.md +2212 -0
  237. package/skills/integration/integration-swift/SKILL.md +9 -10
  238. package/skills/integration/integration-swift/references/amplitude-quickstart.md +1 -1
  239. package/skills/integration/integration-swift/references/basic-integration-1.0-begin.md +3 -1
  240. package/skills/integration/integration-swift/references/basic-integration-1.1-edit.md +183 -0
  241. package/skills/integration/integration-swift/references/basic-integration-1.3-conclude.md +81 -11
  242. package/skills/integration/integration-swift/references/ios.md +1480 -0
  243. package/skills/integration/integration-tanstack-start/SKILL.md +6 -17
  244. package/skills/integration/integration-tanstack-start/references/amplitude-quickstart.md +1 -1
  245. package/skills/integration/integration-tanstack-start/references/basic-integration-1.0-begin.md +3 -1
  246. package/skills/integration/integration-tanstack-start/references/basic-integration-1.1-edit.md +183 -0
  247. package/skills/integration/integration-tanstack-start/references/basic-integration-1.3-conclude.md +81 -11
  248. package/skills/integration/integration-tanstack-start/references/browser-sdk-2.md +67 -20
  249. package/skills/integration/integration-tanstack-start/references/browser-unified-sdk.md +2212 -0
  250. package/skills/integration/integration-vue-3/SKILL.md +6 -5
  251. package/skills/integration/integration-vue-3/references/amplitude-quickstart.md +1 -1
  252. package/skills/integration/integration-vue-3/references/basic-integration-1.0-begin.md +3 -1
  253. package/skills/integration/integration-vue-3/references/basic-integration-1.1-edit.md +183 -0
  254. package/skills/integration/integration-vue-3/references/basic-integration-1.3-conclude.md +81 -11
  255. package/skills/integration/integration-vue-3/references/browser-sdk-2.md +67 -20
  256. package/skills/integration/integration-vue-3/references/browser-unified-sdk.md +2212 -0
  257. package/skills/taxonomy/amplitude-chart-dashboard-plan/SKILL.md +183 -0
  258. package/dist/src/ui/tui/screens/ChecklistScreen.d.ts +0 -12
  259. package/dist/src/ui/tui/screens/ChecklistScreen.js +0 -111
@@ -33,6 +33,7 @@ exports.CliArgsSchema = zod_1.z.object({
33
33
  debug: zod_1.z.boolean().default(false),
34
34
  verbose: zod_1.z.boolean().default(false),
35
35
  ci: zod_1.z.boolean().default(false),
36
+ agent: zod_1.z.boolean().default(false),
36
37
  forceInstall: zod_1.z.boolean().default(false),
37
38
  signup: zod_1.z.boolean().default(false),
38
39
  localMcp: zod_1.z.boolean().default(false),
@@ -127,6 +128,7 @@ function buildSession(args) {
127
128
  forceInstall: validated.forceInstall ?? false,
128
129
  installDir: validated.installDir ?? process.cwd(),
129
130
  ci: validated.ci ?? false,
131
+ agent: false,
130
132
  signup: validated.signup ?? false,
131
133
  localMcp: validated.localMcp ?? false,
132
134
  apiKey: validated.apiKey,
@@ -141,6 +143,7 @@ function buildSession(args) {
141
143
  typescript: false,
142
144
  detectedFrameworkLabel: null,
143
145
  detectionComplete: false,
146
+ detectionResults: null,
144
147
  projectHasData: null,
145
148
  activationLevel: null,
146
149
  activationOptionsComplete: false,
@@ -164,6 +167,7 @@ function buildSession(args) {
164
167
  selectedWorkspaceId: null,
165
168
  selectedWorkspaceName: null,
166
169
  selectedProjectName: null,
170
+ selectedProjectId: null,
167
171
  loginUrl: null,
168
172
  credentials: null,
169
173
  apiKeyNotice: null,
@@ -176,9 +180,7 @@ function buildSession(args) {
176
180
  amplitudePreDetected: false,
177
181
  amplitudePreDetectedChoicePending: false,
178
182
  dataIngestionConfirmed: false,
179
- checklistChartComplete: false,
180
- checklistDashboardComplete: false,
181
- checklistComplete: false,
183
+ checklistDashboardUrl: null,
182
184
  userEmail: null,
183
185
  _restoredFromCheckpoint: false,
184
186
  };
package/dist/src/run.d.ts CHANGED
@@ -15,5 +15,22 @@ type Args = {
15
15
  benchmark?: boolean;
16
16
  };
17
17
  export declare function runWizard(argv: Args, session?: WizardSession): Promise<void>;
18
- export declare function detectIntegration(installDir: string): Promise<Integration | undefined>;
18
+ /**
19
+ * Result of a single framework's detection attempt.
20
+ */
21
+ export interface DetectionResult {
22
+ integration: Integration;
23
+ detected: boolean;
24
+ durationMs: number;
25
+ timedOut: boolean;
26
+ error?: string;
27
+ /** Installed version (if detected and getInstalledVersion is defined). */
28
+ version?: string;
29
+ }
30
+ /**
31
+ * Run all framework detectors in parallel and return the full results array.
32
+ * The winner is the first detected framework in Integration enum order
33
+ * (preserving the existing priority behavior).
34
+ */
35
+ export declare function detectAllFrameworks(installDir: string, timeoutMs?: number): Promise<DetectionResult[]>;
19
36
  export {};
package/dist/src/run.js CHANGED
@@ -4,12 +4,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.runWizard = runWizard;
7
- exports.detectIntegration = detectIntegration;
7
+ exports.detectAllFrameworks = detectAllFrameworks;
8
8
  const wizard_session_1 = require("./lib/wizard-session");
9
9
  const constants_1 = require("./lib/constants");
10
10
  const environment_1 = require("./utils/environment");
11
11
  const ui_1 = require("./ui");
12
12
  const path_1 = __importDefault(require("path"));
13
+ const promises_1 = __importDefault(require("node:fs/promises"));
13
14
  const registry_1 = require("./lib/registry");
14
15
  const analytics_1 = require("./utils/analytics");
15
16
  const agent_runner_1 = require("./lib/agent-runner");
@@ -17,6 +18,7 @@ const events_1 = require("events");
17
18
  const chalk_1 = __importDefault(require("chalk"));
18
19
  const debug_1 = require("./utils/debug");
19
20
  const wizard_abort_1 = require("./utils/wizard-abort");
21
+ const version_check_1 = require("./lib/version-check");
20
22
  events_1.EventEmitter.defaultMaxListeners = 50;
21
23
  async function runWizard(argv, session) {
22
24
  const finalArgs = {
@@ -115,29 +117,116 @@ async function runWizard(argv, session) {
115
117
  }
116
118
  }
117
119
  }
118
- async function detectIntegration(installDir) {
119
- for (const integration of Object.values(constants_1.Integration)) {
120
+ /**
121
+ * Run all framework detectors in parallel and return the full results array.
122
+ * The winner is the first detected framework in Integration enum order
123
+ * (preserving the existing priority behavior).
124
+ */
125
+ async function detectAllFrameworks(installDir, timeoutMs = constants_1.DETECTION_TIMEOUT_MS) {
126
+ // Pre-validate installDir — fail fast instead of running 18 detectors
127
+ try {
128
+ await promises_1.default.access(installDir, promises_1.default.constants.R_OK);
129
+ }
130
+ catch {
131
+ (0, debug_1.logToFile)(`[detection] installDir is not readable: ${installDir}`);
132
+ return Object.values(constants_1.Integration).map((integration) => ({
133
+ integration,
134
+ detected: false,
135
+ durationMs: 0,
136
+ timedOut: false,
137
+ error: 'installDir not readable',
138
+ }));
139
+ }
140
+ const integrations = Object.values(constants_1.Integration);
141
+ const promises = integrations.map(async (integration) => {
120
142
  const config = registry_1.FRAMEWORK_REGISTRY[integration];
143
+ const start = performance.now();
144
+ // Both detect() and version check run inside a single Promise.race
145
+ // so a slow getInstalledVersion can't hang the entire detection.
146
+ const work = async () => {
147
+ const detected = await config.detection.detect({ installDir });
148
+ const result = {
149
+ integration,
150
+ detected: Boolean(detected),
151
+ durationMs: Math.round(performance.now() - start),
152
+ timedOut: false,
153
+ };
154
+ // Capture version for diagnostics (agent-runner handles version warnings)
155
+ if (result.detected &&
156
+ (config.detection.getInstalledVersion ||
157
+ config.detection.getVersionCheckInfo)) {
158
+ try {
159
+ const versionCheckInfo = await (0, version_check_1.getVersionCheckInfo)(config.detection, {
160
+ installDir,
161
+ debug: false,
162
+ forceInstall: false,
163
+ default: false,
164
+ signup: false,
165
+ localMcp: false,
166
+ ci: false,
167
+ menu: false,
168
+ benchmark: false,
169
+ });
170
+ if (versionCheckInfo.version) {
171
+ result.version = versionCheckInfo.version;
172
+ }
173
+ }
174
+ catch (err) {
175
+ (0, debug_1.logToFile)(`[detection] ${integration} version check failed: ${err instanceof Error ? err.message : err}`);
176
+ }
177
+ }
178
+ result.durationMs = Math.round(performance.now() - start);
179
+ return result;
180
+ };
121
181
  try {
122
- const detected = await Promise.race([
123
- config.detection.detect({ installDir }),
124
- new Promise((resolve) => setTimeout(() => resolve(false), constants_1.DETECTION_TIMEOUT_MS)),
182
+ const result = await Promise.race([
183
+ work(),
184
+ new Promise((resolve) => setTimeout(() => resolve('timeout'), timeoutMs)),
125
185
  ]);
126
- if (detected) {
127
- return integration;
186
+ if (result === 'timeout') {
187
+ const durationMs = Math.round(performance.now() - start);
188
+ (0, debug_1.logToFile)(`[detection] ${integration} timed out after ${durationMs}ms`);
189
+ return {
190
+ integration,
191
+ detected: false,
192
+ durationMs,
193
+ timedOut: true,
194
+ };
128
195
  }
196
+ return result;
129
197
  }
130
- catch {
131
- // Skip frameworks whose detection throws
198
+ catch (err) {
199
+ const durationMs = Math.round(performance.now() - start);
200
+ const errorMsg = err instanceof Error ? err.message : String(err);
201
+ (0, debug_1.logToFile)(`[detection] ${integration} failed after ${durationMs}ms: ${errorMsg}`);
202
+ return {
203
+ integration,
204
+ detected: false,
205
+ durationMs,
206
+ timedOut: false,
207
+ error: errorMsg,
208
+ };
132
209
  }
133
- }
210
+ });
211
+ return Promise.all(promises);
134
212
  }
135
213
  async function detectAndResolveIntegration(session) {
136
214
  if (!session.menu) {
137
- const detectedIntegration = await detectIntegration(session.installDir);
138
- if (detectedIntegration) {
139
- (0, ui_1.getUI)().setDetectedFramework(registry_1.FRAMEWORK_REGISTRY[detectedIntegration].metadata.name);
140
- return detectedIntegration;
215
+ const results = await detectAllFrameworks(session.installDir);
216
+ session.detectionResults = results;
217
+ const detected = results.filter((r) => r.detected);
218
+ const winner = detected[0];
219
+ // Analytics: capture detection metrics
220
+ analytics_1.analytics.wizardCapture('Framework Detection Complete', {
221
+ winner: winner?.integration ?? 'none',
222
+ matchCount: detected.length,
223
+ durationMs: Math.max(...results.map((r) => r.durationMs)),
224
+ errorCount: results.filter((r) => r.error).length,
225
+ timedOutCount: results.filter((r) => r.timedOut).length,
226
+ });
227
+ if (winner) {
228
+ (0, ui_1.getUI)().setDetectedFramework(registry_1.FRAMEWORK_REGISTRY[winner.integration].metadata.name);
229
+ return winner.integration;
141
230
  }
142
231
  // Framework not detected — fall back to generic Amplitude quickstart.
143
232
  (0, ui_1.getUI)().log.warn("Couldn't detect your framework. Falling back to the Amplitude quickstart guide.");
@@ -54,6 +54,8 @@ export declare class AgentUI implements WizardUI {
54
54
  name: string;
55
55
  description: string;
56
56
  }>): void;
57
+ setEventIngestionDetected(eventNames: string[]): void;
58
+ setDashboardUrl(url: string): void;
57
59
  /**
58
60
  * Prompt the agent caller to select an environment from pendingOrgs.
59
61
  *
@@ -180,6 +180,16 @@ class AgentUI {
180
180
  data: { event: 'event_plan_set', events },
181
181
  });
182
182
  }
183
+ setEventIngestionDetected(eventNames) {
184
+ emit('result', `events_detected: ${eventNames.length} event types`, {
185
+ data: { event: 'events_detected', eventNames },
186
+ });
187
+ }
188
+ setDashboardUrl(url) {
189
+ emit('result', `dashboard_created: ${url}`, {
190
+ data: { event: 'dashboard_created', dashboardUrl: url },
191
+ });
192
+ }
183
193
  /**
184
194
  * Prompt the agent caller to select an environment from pendingOrgs.
185
195
  *
@@ -53,4 +53,6 @@ export declare class LoggingUI implements WizardUI {
53
53
  name: string;
54
54
  description: string;
55
55
  }>): void;
56
+ setEventIngestionDetected(_eventNames: string[]): void;
57
+ setDashboardUrl(_url: string): void;
56
58
  }
@@ -153,5 +153,11 @@ class LoggingUI {
153
153
  setEventPlan(_events) {
154
154
  // No-op in CI mode
155
155
  }
156
+ setEventIngestionDetected(_eventNames) {
157
+ // No-op in CI/logging mode
158
+ }
159
+ setDashboardUrl(_url) {
160
+ // No-op in CI/logging mode
161
+ }
156
162
  }
157
163
  exports.LoggingUI = LoggingUI;
@@ -39,8 +39,21 @@ function executeCommand(raw, store) {
39
39
  void import('../../../lib/api.js').then(({ fetchAmplitudeUser }) => {
40
40
  fetchAmplitudeUser(store.session.credentials.idToken, store.session.region)
41
41
  .then((userInfo) => {
42
- if (userInfo.email)
42
+ if (userInfo.email) {
43
43
  store.session.userEmail = userInfo.email;
44
+ analytics.setDistinctId(userInfo.email);
45
+ analytics.identifyUser({
46
+ email: userInfo.email,
47
+ org_id: store.session.selectedOrgId ?? undefined,
48
+ org_name: store.session.selectedOrgName ?? undefined,
49
+ workspace_id: store.session.selectedWorkspaceId ?? undefined,
50
+ workspace_name: store.session.selectedWorkspaceName ?? undefined,
51
+ project_id: store.session.selectedProjectId,
52
+ project_name: store.session.selectedProjectName,
53
+ region: store.session.region,
54
+ integration: store.session.integration,
55
+ });
56
+ }
44
57
  const orgId = store.session.selectedOrgId;
45
58
  if (orgId) {
46
59
  const org = userInfo.orgs.find((o) => o.id === orgId);
@@ -18,7 +18,6 @@ const WIZARD_STEPS = [
18
18
  { screen: Screen.Auth, label: 'Auth' },
19
19
  { screen: Screen.Run, label: 'Setup' },
20
20
  { screen: Screen.DataIngestionCheck, label: 'Verify' },
21
- { screen: Screen.Checklist, label: 'Explore' },
22
21
  { screen: Screen.Outro, label: 'Done' },
23
22
  ];
24
23
  /** Screens that belong to each step (for grouping substeps). */
@@ -27,8 +26,7 @@ const STEP_SCREENS = {
27
26
  Auth: [Screen.RegionSelect, Screen.Auth, Screen.DataSetup],
28
27
  Setup: [Screen.ActivationOptions, Screen.Setup, Screen.Run, Screen.Mcp],
29
28
  Verify: [Screen.DataIngestionCheck],
30
- Explore: [Screen.Checklist, Screen.Slack],
31
- Done: [Screen.Outro],
29
+ Done: [Screen.Outro, Screen.Slack],
32
30
  };
33
31
  function getStepState(stepLabel, currentScreen, completedScreens) {
34
32
  const screens = STEP_SCREENS[stepLabel] ?? [];
@@ -21,7 +21,6 @@ export declare enum Screen {
21
21
  Run = "run",
22
22
  Mcp = "mcp",
23
23
  DataIngestionCheck = "data-ingestion-check",
24
- Checklist = "checklist",
25
24
  Slack = "slack",
26
25
  Outro = "outro",
27
26
  McpAdd = "mcp-add",
@@ -23,7 +23,6 @@ export var Screen;
23
23
  Screen["Run"] = "run";
24
24
  Screen["Mcp"] = "mcp";
25
25
  Screen["DataIngestionCheck"] = "data-ingestion-check";
26
- Screen["Checklist"] = "checklist";
27
26
  Screen["Slack"] = "slack";
28
27
  Screen["Outro"] = "outro";
29
28
  Screen["McpAdd"] = "mcp-add";
@@ -109,14 +108,7 @@ export const FLOWS = {
109
108
  show: (s) => s.runPhase !== RunPhase.Error && s.activationLevel !== 'full',
110
109
  isComplete: (s) => s.dataIngestionConfirmed,
111
110
  },
112
- // 6. Post-setup checklist first chart + first dashboard.
113
- // Skipped on error.
114
- {
115
- screen: Screen.Checklist,
116
- show: (s) => s.runPhase !== RunPhase.Error,
117
- isComplete: (s) => s.checklistComplete,
118
- },
119
- // 7. Slack integration setup (skipped on error)
111
+ // 6. Slack integration setup (skipped on error)
120
112
  {
121
113
  screen: Screen.Slack,
122
114
  show: (s) => s.runPhase !== RunPhase.Error,
@@ -59,4 +59,6 @@ export declare class InkUI implements WizardUI {
59
59
  name: string;
60
60
  description: string;
61
61
  }>): void;
62
+ setEventIngestionDetected(_eventNames: string[]): void;
63
+ setDashboardUrl(url: string): void;
62
64
  }
@@ -139,4 +139,10 @@ export class InkUI {
139
139
  setEventPlan(events) {
140
140
  this.store.setEventPlan(events);
141
141
  }
142
+ setEventIngestionDetected(_eventNames) {
143
+ // In TUI mode, DataIngestionCheckScreen handles this via polling — no-op here.
144
+ }
145
+ setDashboardUrl(url) {
146
+ this.store.setChecklistDashboardUrl(url);
147
+ }
142
148
  }
@@ -11,7 +11,6 @@ import { ActivationOptionsScreen } from './screens/ActivationOptionsScreen.js';
11
11
  import { RunScreen } from './screens/RunScreen.js';
12
12
  import { McpScreen } from './screens/McpScreen.js';
13
13
  import { DataIngestionCheckScreen } from './screens/DataIngestionCheckScreen.js';
14
- import { ChecklistScreen } from './screens/ChecklistScreen.js';
15
14
  import { SlackScreen } from './screens/SlackScreen.js';
16
15
  import { LogoutScreen } from './screens/LogoutScreen.js';
17
16
  import { LoginScreen } from './screens/LoginScreen.js';
@@ -53,7 +52,6 @@ export function createScreens(store, services) {
53
52
  [Screen.Run]: _jsx(RunScreen, { store: store }),
54
53
  [Screen.Mcp]: _jsx(McpScreen, { store: store, installer: services.mcpInstaller }),
55
54
  [Screen.DataIngestionCheck]: _jsx(DataIngestionCheckScreen, { store: store }),
56
- [Screen.Checklist]: _jsx(ChecklistScreen, { store: store }),
57
55
  [Screen.Outro]: _jsx(OutroScreen, { store: store }),
58
56
  // Standalone MCP flows
59
57
  [Screen.McpAdd]: (_jsx(McpScreen, { store: store, installer: services.mcpInstaller, standalone: true })),
@@ -1,11 +1,13 @@
1
1
  /**
2
2
  * DataIngestionCheckScreen — "Start your app and trigger some actions" polling screen.
3
3
  *
4
- * Shown after MCP setup. Polls the activation API every 30 seconds until the
5
- * project starts receiving events, then auto-advances to the Checklist.
4
+ * Shown after MCP setup. Polls for events every 30 seconds:
5
+ * 1. MCP query_dataset (Bearer auth, works for all users, detects any track() call)
6
+ * 2. Thunder activation API (autocapture events only, session-cookie auth)
7
+ * 3. Data-API event catalog (taxonomy events as a proxy)
6
8
  *
7
9
  * Active guidance as prominent instruction with framework-aware hint.
8
- * BrailleSpinner while waiting. Success celebration when events arrive.
10
+ * BrailleSpinner while waiting. Success celebration (with event names) when events arrive.
9
11
  */
10
12
  import type { WizardStore } from '../store.js';
11
13
  interface DataIngestionCheckScreenProps {
@@ -2,11 +2,13 @@ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
2
  /**
3
3
  * DataIngestionCheckScreen — "Start your app and trigger some actions" polling screen.
4
4
  *
5
- * Shown after MCP setup. Polls the activation API every 30 seconds until the
6
- * project starts receiving events, then auto-advances to the Checklist.
5
+ * Shown after MCP setup. Polls for events every 30 seconds:
6
+ * 1. MCP query_dataset (Bearer auth, works for all users, detects any track() call)
7
+ * 2. Thunder activation API (autocapture events only, session-cookie auth)
8
+ * 3. Data-API event catalog (taxonomy events as a proxy)
7
9
  *
8
10
  * Active guidance as prominent instruction with framework-aware hint.
9
- * BrailleSpinner while waiting. Success celebration when events arrive.
11
+ * BrailleSpinner while waiting. Success celebration (with event names) when events arrive.
10
12
  */
11
13
  import { Box, Text } from 'ink';
12
14
  import { useEffect, useRef, useState } from 'react';
@@ -14,7 +16,7 @@ import { useWizardStore } from '../hooks/useWizardStore.js';
14
16
  import { Colors, Icons } from '../styles.js';
15
17
  import { BrailleSpinner } from '../components/BrailleSpinner.js';
16
18
  import { useScreenInput } from '../hooks/useScreenInput.js';
17
- import { fetchProjectActivationStatus, fetchWorkspaceEventTypes, } from '../../../lib/api.js';
19
+ import { extractProjectId, fetchAmplitudeUser, fetchHasAnyEventsMcp, fetchProjectActivationStatus, fetchWorkspaceEventTypes, } from '../../../lib/api.js';
18
20
  import { Integration } from '../../../lib/constants.js';
19
21
  import { OutroKind } from '../session-constants.js';
20
22
  import { logToFile } from '../../../utils/debug.js';
@@ -40,6 +42,8 @@ export const DataIngestionCheckScreen = ({ store, }) => {
40
42
  const { activationLevel } = session;
41
43
  const pollingRef = useRef(null);
42
44
  const celebrationTimerRef = useRef(null);
45
+ // Cache a lazily-resolved project ID across poll cycles.
46
+ const resolvedProjectIdRef = useRef(null);
43
47
  const [apiUnavailable, setApiUnavailable] = useState(false);
44
48
  const [eventTypes, setEventTypes] = useState(null);
45
49
  const [celebrating, setCelebrating] = useState(false);
@@ -60,6 +64,38 @@ export const DataIngestionCheckScreen = ({ store, }) => {
60
64
  setCelebrationReady(true);
61
65
  }, CELEBRATION_DELAY_MS);
62
66
  }
67
+ /**
68
+ * Silently refresh the OAuth token.
69
+ * Pass force=true to refresh even if the token appears locally valid
70
+ * (e.g. after an auth error — the token may have been server-side revoked).
71
+ */
72
+ async function refreshToken(force = false) {
73
+ try {
74
+ const { getStoredToken, getStoredUser, storeToken } = await import('../../../utils/ampli-settings.js');
75
+ const { refreshAccessToken } = await import('../../../utils/oauth.js');
76
+ const user = getStoredUser();
77
+ const stored = getStoredToken(user?.id, user?.zone);
78
+ if (!stored || !user)
79
+ return false;
80
+ if (!force && new Date() <= new Date(stored.expiresAt))
81
+ return false;
82
+ logToFile(`[DataIngestionCheck] refreshing token (force=${force})`);
83
+ const refreshed = await refreshAccessToken(stored.refreshToken, user.zone);
84
+ storeToken(user, {
85
+ accessToken: refreshed.accessToken,
86
+ idToken: refreshed.idToken,
87
+ refreshToken: refreshed.refreshToken,
88
+ expiresAt: refreshed.expiresAt,
89
+ });
90
+ store.updateTokens(refreshed.accessToken, refreshed.idToken);
91
+ logToFile('[DataIngestionCheck] token refreshed successfully');
92
+ return true;
93
+ }
94
+ catch (err) {
95
+ logToFile(`[DataIngestionCheck] token refresh failed: ${err instanceof Error ? err.message : String(err)}`);
96
+ return false;
97
+ }
98
+ }
63
99
  async function checkIngestion() {
64
100
  // Read from store.session at call time to avoid stale closures
65
101
  const currentSession = store.session;
@@ -76,6 +112,90 @@ export const DataIngestionCheckScreen = ({ store, }) => {
76
112
  }
77
113
  const zone = (currentRegion ?? 'us');
78
114
  const dataApiToken = currentCredentials.idToken ?? currentCredentials.accessToken;
115
+ // Silently refresh if the token has expired before making any API calls.
116
+ await refreshToken();
117
+ // Re-read credentials from the store in case refresh updated them.
118
+ let freshCredentials = store.session.credentials ?? currentCredentials;
119
+ // Step 1: Query via MCP (Bearer auth, works for all users).
120
+ // Uses _all event type so any custom track() calls are detected.
121
+ // Requires the numeric analytics project ID from workspace.environments[].app.id.
122
+ //
123
+ // selectedProjectId may be null if the startup fire-and-forget fetchAmplitudeUser
124
+ // failed (e.g. due to an expired token). Resolve lazily using the now-fresh token.
125
+ let effectiveProjectId = currentSession.selectedProjectId ?? resolvedProjectIdRef.current;
126
+ if (!effectiveProjectId) {
127
+ const tryResolve = async () => {
128
+ const userInfo = await fetchAmplitudeUser(freshCredentials.idToken ?? freshCredentials.accessToken, zone);
129
+ // Fall back to the first org if the stored ID doesn't match (stale checkpoint).
130
+ const org = currentSession.selectedOrgId
131
+ ? userInfo.orgs.find((o) => o.id === currentSession.selectedOrgId) ??
132
+ userInfo.orgs[0]
133
+ : userInfo.orgs[0];
134
+ // Fall back to the first workspace if the stored ID doesn't match.
135
+ const ws = org && currentSession.selectedWorkspaceId
136
+ ? org.workspaces.find((w) => w.id === currentSession.selectedWorkspaceId) ?? org.workspaces[0]
137
+ : org?.workspaces[0];
138
+ const restoredFields = {};
139
+ if (org && !currentSession.selectedOrgId) {
140
+ restoredFields.orgId = org.id;
141
+ restoredFields.orgName = org.name;
142
+ logToFile(`[DataIngestionCheck] lazily set orgId=${org.id}`);
143
+ }
144
+ if (ws && !currentSession.selectedWorkspaceId) {
145
+ restoredFields.workspaceId = ws.id;
146
+ restoredFields.workspaceName = ws.name;
147
+ logToFile(`[DataIngestionCheck] lazily set workspaceId=${ws.id}`);
148
+ }
149
+ effectiveProjectId = ws ? extractProjectId(ws) : null;
150
+ if (effectiveProjectId) {
151
+ resolvedProjectIdRef.current = effectiveProjectId;
152
+ restoredFields.projectId = effectiveProjectId;
153
+ logToFile(`[DataIngestionCheck] lazily resolved projectId=${effectiveProjectId}`);
154
+ }
155
+ else {
156
+ logToFile('[DataIngestionCheck] lazy resolution: no environments with app.id');
157
+ }
158
+ if (Object.keys(restoredFields).length > 0) {
159
+ store.restoreSessionIds(restoredFields);
160
+ }
161
+ };
162
+ try {
163
+ await tryResolve();
164
+ }
165
+ catch (resolveErr) {
166
+ const msg = resolveErr instanceof Error ? resolveErr.message : String(resolveErr);
167
+ logToFile(`[DataIngestionCheck] lazy resolution failed: ${msg}`);
168
+ if (msg.toLowerCase().includes('auth') ||
169
+ msg.toLowerCase().includes('401') ||
170
+ msg.toLowerCase().includes('403')) {
171
+ const refreshed = await refreshToken(true);
172
+ if (refreshed) {
173
+ freshCredentials = store.session.credentials ?? freshCredentials;
174
+ try {
175
+ await tryResolve();
176
+ }
177
+ catch (retryErr) {
178
+ logToFile(`[DataIngestionCheck] lazy resolution retry failed: ${retryErr instanceof Error
179
+ ? retryErr.message
180
+ : String(retryErr)}`);
181
+ }
182
+ }
183
+ }
184
+ }
185
+ }
186
+ if (effectiveProjectId) {
187
+ const result = await fetchHasAnyEventsMcp(freshCredentials.accessToken, effectiveProjectId);
188
+ logToFile(`[DataIngestionCheck] MCP check: hasEvents=${result.hasEvents} projectId=${effectiveProjectId} events=${result.activeEventNames.length}`);
189
+ if (result.hasEvents) {
190
+ setApiUnavailable(false);
191
+ confirmWithCelebration(result.activeEventNames);
192
+ return;
193
+ }
194
+ }
195
+ else {
196
+ logToFile('[DataIngestionCheck] MCP check skipped: no projectId resolved');
197
+ }
198
+ // Step 2: Try activation status via Thunder (org-scoped, autocapture events only).
79
199
  if (!currentSession.selectedOrgId) {
80
200
  setApiUnavailable(true);
81
201
  return;
@@ -48,9 +48,17 @@ export const OutroScreen = ({ store }) => {
48
48
  // ── Main outro views ─────────────────────────────────────────────────
49
49
  return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: 2, paddingY: 1, children: [outroData.kind === OutroKind.Success && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: Colors.success, bold: true, children: [Icons.checkmark, " Amplitude is live!"] }), store.eventPlan.length > 0 && (_jsxs(Text, { color: Colors.body, children: [store.eventPlan.length, " event", store.eventPlan.length !== 1 ? 's' : '', " instrumented", store.session.selectedProjectName
50
50
  ? ` in ${store.session.selectedProjectName}`
51
- : '', "."] })), outroData.changes && outroData.changes.length > 0 && (_jsx(Box, { flexDirection: "column", marginTop: 1, children: outroData.changes.map((change, i) => (_jsxs(Text, { color: Colors.body, children: [Icons.bullet, " ", change] }, i))) })), store.eventPlan.length > 0 && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: Colors.secondary, bold: true, children: "Events" }), store.eventPlan.map((event) => (_jsxs(Text, { color: Colors.body, children: [Icons.diamond, " ", _jsx(Text, { bold: true, children: event.name }), _jsxs(Text, { color: Colors.muted, children: [" ", event.description] })] }, event.name)))] })), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: Colors.muted, children: ["Review changes in", ' ', _jsx(Text, { bold: true, color: Colors.secondary, children: "./amplitude-setup-report.md" })] }) })] })), outroData.kind === OutroKind.Error && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: Colors.error, bold: true, children: [Icons.cross, " Setup failed"] }), outroData.message && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: Colors.body, children: outroData.message }) })), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { color: Colors.secondary, children: [Icons.arrowRight, " Check your API key and network connection"] }), _jsxs(Text, { color: Colors.secondary, children: [Icons.arrowRight, " Run the wizard again with", ' ', _jsx(Text, { bold: true, children: "--debug" }), " for more detail"] }), outroData.docsUrl && (_jsxs(Text, { color: Colors.secondary, children: [Icons.arrowRight, " Docs:", ' ', _jsx(Text, { color: Colors.accent, children: outroData.docsUrl })] }))] })] })), outroData.kind === OutroKind.Cancel && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: Colors.warning, bold: true, children: [Icons.dash, " Setup cancelled"] }), outroData.message && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: Colors.body, children: outroData.message }) })), outroData.docsUrl && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: Colors.secondary, children: ["Manual setup:", ' ', _jsx(Text, { color: Colors.accent, children: outroData.docsUrl })] }) }))] })), _jsx(Box, { marginTop: 1, children: isSuccess ? (_jsx(PickerMenu, { options: [
51
+ : '', "."] })), outroData.changes && outroData.changes.length > 0 && (_jsx(Box, { flexDirection: "column", marginTop: 1, children: outroData.changes.map((change, i) => (_jsxs(Text, { color: Colors.body, children: [Icons.bullet, " ", change] }, i))) })), store.eventPlan.length > 0 && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: Colors.secondary, bold: true, children: "Events" }), store.eventPlan.map((event) => (_jsxs(Text, { color: Colors.body, children: [Icons.diamond, " ", _jsx(Text, { bold: true, children: event.name }), _jsxs(Text, { color: Colors.muted, children: [" ", event.description] })] }, event.name)))] })), store.session.checklistDashboardUrl && (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { color: Colors.success, bold: true, children: [Icons.checkmark, " Dashboard ready:"] }), _jsx(Text, { color: Colors.muted, children: store.session.checklistDashboardUrl })] })), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: Colors.muted, children: ["Review changes in", ' ', _jsx(Text, { bold: true, color: Colors.secondary, children: "./amplitude-setup-report.md" })] }) })] })), outroData.kind === OutroKind.Error && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: Colors.error, bold: true, children: [Icons.cross, " Setup failed"] }), outroData.message && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: Colors.body, children: outroData.message }) })), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { color: Colors.secondary, children: [Icons.arrowRight, " Check your API key and network connection"] }), _jsxs(Text, { color: Colors.secondary, children: [Icons.arrowRight, " Run the wizard again with", ' ', _jsx(Text, { bold: true, children: "--debug" }), " for more detail"] }), outroData.docsUrl && (_jsxs(Text, { color: Colors.secondary, children: [Icons.arrowRight, " Docs:", ' ', _jsx(Text, { color: Colors.accent, children: outroData.docsUrl })] }))] })] })), outroData.kind === OutroKind.Cancel && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: Colors.warning, bold: true, children: [Icons.dash, " Setup cancelled"] }), outroData.message && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: Colors.body, children: outroData.message }) })), outroData.docsUrl && (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: Colors.secondary, children: ["Manual setup:", ' ', _jsx(Text, { color: Colors.accent, children: outroData.docsUrl })] }) }))] })), _jsx(Box, { marginTop: 1, children: isSuccess ? (_jsx(PickerMenu, { options: [
52
52
  { label: 'View setup report', value: 'report' },
53
- { label: 'Open Amplitude dashboard', value: 'dashboard' },
53
+ {
54
+ label: store.session.checklistDashboardUrl
55
+ ? 'Open your analytics dashboard'
56
+ : 'Open Amplitude',
57
+ value: 'dashboard',
58
+ hint: store.session.checklistDashboardUrl
59
+ ? undefined
60
+ : 'amplitude.com',
61
+ },
54
62
  { label: 'Exit', value: 'exit' },
55
63
  ], onSelect: (value) => {
56
64
  const choice = Array.isArray(value) ? value[0] : value;
@@ -63,7 +71,8 @@ export const OutroScreen = ({ store }) => {
63
71
  }
64
72
  else if (choice === 'dashboard') {
65
73
  const zone = (store.session.region ?? 'us');
66
- const url = OUTBOUND_URLS.overview[zone];
74
+ const url = store.session.checklistDashboardUrl ??
75
+ OUTBOUND_URLS.overview[zone];
67
76
  opn(url, { wait: false }).catch(() => {
68
77
  /* fire-and-forget */
69
78
  });
@@ -138,6 +138,20 @@ export declare class WizardStore {
138
138
  hideLoginOverlay(): void;
139
139
  /** Update just the access token in credentials without triggering auth analytics. */
140
140
  updateAccessToken(accessToken: string): void;
141
+ /** Update both access and id tokens (e.g. after a silent OAuth refresh). */
142
+ updateTokens(accessToken: string, idToken: string): void;
143
+ /**
144
+ * Restore org/workspace/project session IDs that weren't populated at startup
145
+ * (e.g. because the fire-and-forget fetchAmplitudeUser failed due to expired token).
146
+ * Only updates fields that are provided.
147
+ */
148
+ restoreSessionIds(fields: {
149
+ orgId?: string;
150
+ orgName?: string;
151
+ workspaceId?: string;
152
+ workspaceName?: string;
153
+ projectId?: string | null;
154
+ }): void;
141
155
  /** Request the TabContainer to switch to a tab by id. Clears after consumption. */
142
156
  setRequestedTab(id: string): void;
143
157
  clearRequestedTab(): void;
@@ -147,9 +161,7 @@ export declare class WizardStore {
147
161
  setActivationLevel(level: 'none' | 'partial' | 'full'): void;
148
162
  setSnippetConfigured(value: boolean): void;
149
163
  setDataIngestionConfirmed(): void;
150
- setChecklistChartComplete(): void;
151
- setChecklistDashboardComplete(): void;
152
- setChecklistComplete(): void;
164
+ setChecklistDashboardUrl(url: string): void;
153
165
  setActivationOptionsComplete(): void;
154
166
  /**
155
167
  * Called from bin.ts when OAuth completes (browser redirect done).
@@ -172,6 +184,13 @@ export declare class WizardStore {
172
184
  }, workspace: {
173
185
  id: string;
174
186
  name: string;
187
+ environments?: Array<{
188
+ rank: number;
189
+ app: {
190
+ id: string;
191
+ apiKey?: string | null;
192
+ } | null;
193
+ }> | null;
175
194
  }, installDir: string): void;
176
195
  setServiceStatus(status: {
177
196
  description: string;