@amplitude/wizard 1.0.0-beta.2 → 1.0.0-beta.6

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 (392) hide show
  1. package/LICENSE +25 -1
  2. package/README.md +171 -74
  3. package/dist/bin.js +338 -222
  4. package/dist/src/lib/agent-interface.js +64 -9
  5. package/dist/src/lib/agent-runner.js +1 -10
  6. package/dist/src/lib/api.d.ts +22 -4
  7. package/dist/src/lib/api.js +114 -12
  8. package/dist/src/lib/commandments.js +14 -1
  9. package/dist/src/lib/constants.d.ts +6 -5
  10. package/dist/src/lib/constants.js +13 -13
  11. package/dist/src/lib/credential-resolution.d.ts +45 -0
  12. package/dist/src/lib/credential-resolution.js +311 -0
  13. package/dist/src/lib/exit-codes.d.ts +10 -0
  14. package/dist/src/lib/exit-codes.js +12 -0
  15. package/dist/src/lib/health-checks/statuspage.d.ts +1 -0
  16. package/dist/src/lib/health-checks/statuspage.js +5 -1
  17. package/dist/src/lib/mode-config.d.ts +14 -0
  18. package/dist/src/lib/mode-config.js +14 -0
  19. package/dist/src/lib/session-checkpoint.d.ts +27 -0
  20. package/dist/src/lib/session-checkpoint.js +134 -0
  21. package/dist/src/lib/wizard-session.d.ts +44 -1
  22. package/dist/src/lib/wizard-session.js +70 -14
  23. package/dist/src/lib/wizard-tools.js +19 -4
  24. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +3 -0
  25. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js +6 -0
  26. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +3 -1
  27. package/dist/src/ui/agent-ui.d.ts +91 -0
  28. package/dist/src/ui/agent-ui.js +277 -0
  29. package/dist/src/ui/logging-ui.js +1 -1
  30. package/dist/src/ui/tui/App.d.ts +12 -0
  31. package/dist/src/ui/tui/App.js +29 -18
  32. package/dist/src/ui/tui/components/AmplitudeLogo.js +16 -17
  33. package/dist/src/ui/tui/components/AmplitudeTextLogo.d.ts +0 -2
  34. package/dist/src/ui/tui/components/AmplitudeTextLogo.js +53 -18
  35. package/dist/src/ui/tui/components/BrailleSpinner.d.ts +8 -0
  36. package/dist/src/ui/tui/components/BrailleSpinner.js +15 -0
  37. package/dist/src/ui/tui/components/ConsoleView.d.ts +8 -11
  38. package/dist/src/ui/tui/components/ConsoleView.js +51 -34
  39. package/dist/src/ui/tui/components/HeaderBar.d.ts +12 -0
  40. package/dist/src/ui/tui/components/HeaderBar.js +17 -0
  41. package/dist/src/ui/tui/components/JourneyStepper.d.ts +16 -0
  42. package/dist/src/ui/tui/components/JourneyStepper.js +83 -0
  43. package/dist/src/ui/tui/components/KeyHintBar.d.ts +19 -0
  44. package/dist/src/ui/tui/components/KeyHintBar.js +20 -0
  45. package/dist/src/ui/tui/console-commands.d.ts +1 -2
  46. package/dist/src/ui/tui/console-commands.js +48 -7
  47. package/dist/src/ui/tui/flows.d.ts +1 -1
  48. package/dist/src/ui/tui/flows.js +1 -1
  49. package/dist/src/ui/tui/hooks/useAsyncEffect.d.ts +15 -0
  50. package/dist/src/ui/tui/hooks/useAsyncEffect.js +35 -0
  51. package/dist/src/ui/tui/hooks/useWizardStore.d.ts +9 -0
  52. package/dist/src/ui/tui/hooks/useWizardStore.js +11 -0
  53. package/dist/src/ui/tui/ink-ui.js +1 -1
  54. package/dist/src/ui/tui/primitives/DissolveTransition.js +4 -5
  55. package/dist/src/ui/tui/primitives/EventPlanViewer.d.ts +3 -1
  56. package/dist/src/ui/tui/primitives/EventPlanViewer.js +8 -3
  57. package/dist/src/ui/tui/primitives/ProgressList.js +1 -1
  58. package/dist/src/ui/tui/primitives/SlashCommandInput.js +19 -4
  59. package/dist/src/ui/tui/primitives/SplitView.d.ts +2 -1
  60. package/dist/src/ui/tui/primitives/SplitView.js +10 -2
  61. package/dist/src/ui/tui/primitives/TabContainer.js +10 -2
  62. package/dist/src/ui/tui/primitives/index.d.ts +0 -1
  63. package/dist/src/ui/tui/primitives/index.js +0 -1
  64. package/dist/src/ui/tui/router.js +1 -1
  65. package/dist/src/ui/tui/screen-registry.d.ts +0 -7
  66. package/dist/src/ui/tui/screen-registry.js +13 -4
  67. package/dist/src/ui/tui/screens/ActivationOptionsScreen.d.ts +2 -2
  68. package/dist/src/ui/tui/screens/ActivationOptionsScreen.js +8 -8
  69. package/dist/src/ui/tui/screens/AuthScreen.js +57 -27
  70. package/dist/src/ui/tui/screens/ChecklistScreen.d.ts +2 -12
  71. package/dist/src/ui/tui/screens/ChecklistScreen.js +22 -33
  72. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.d.ts +3 -12
  73. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.js +109 -39
  74. package/dist/src/ui/tui/screens/DataSetupScreen.d.ts +3 -3
  75. package/dist/src/ui/tui/screens/DataSetupScreen.js +17 -10
  76. package/dist/src/ui/tui/screens/IntroScreen.d.ts +5 -3
  77. package/dist/src/ui/tui/screens/IntroScreen.js +132 -41
  78. package/dist/src/ui/tui/screens/LoginScreen.d.ts +1 -1
  79. package/dist/src/ui/tui/screens/LoginScreen.js +4 -4
  80. package/dist/src/ui/tui/screens/LogoutScreen.d.ts +4 -2
  81. package/dist/src/ui/tui/screens/LogoutScreen.js +17 -5
  82. package/dist/src/ui/tui/screens/McpScreen.d.ts +4 -4
  83. package/dist/src/ui/tui/screens/McpScreen.js +25 -17
  84. package/dist/src/ui/tui/screens/OutageScreen.d.ts +1 -1
  85. package/dist/src/ui/tui/screens/OutageScreen.js +5 -5
  86. package/dist/src/ui/tui/screens/OutroScreen.d.ts +5 -0
  87. package/dist/src/ui/tui/screens/OutroScreen.js +21 -14
  88. package/dist/src/ui/tui/screens/RegionSelectScreen.js +15 -13
  89. package/dist/src/ui/tui/screens/RunScreen.d.ts +7 -5
  90. package/dist/src/ui/tui/screens/RunScreen.js +102 -157
  91. package/dist/src/ui/tui/screens/SettingsOverrideScreen.d.ts +1 -1
  92. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +6 -5
  93. package/dist/src/ui/tui/screens/SetupScreen.d.ts +1 -1
  94. package/dist/src/ui/tui/screens/SetupScreen.js +7 -7
  95. package/dist/src/ui/tui/screens/SlackScreen.d.ts +2 -2
  96. package/dist/src/ui/tui/screens/SlackScreen.js +60 -35
  97. package/dist/src/ui/tui/session-constants.d.ts +41 -0
  98. package/dist/src/ui/tui/session-constants.js +38 -0
  99. package/dist/src/ui/tui/start-tui.d.ts +3 -1
  100. package/dist/src/ui/tui/start-tui.js +14 -10
  101. package/dist/src/ui/tui/store.d.ts +2 -1
  102. package/dist/src/ui/tui/store.js +33 -7
  103. package/dist/src/ui/tui/styles.d.ts +75 -19
  104. package/dist/src/ui/tui/styles.js +101 -19
  105. package/dist/src/ui/tui/utils/classify-error.d.ts +14 -0
  106. package/dist/src/ui/tui/utils/classify-error.js +90 -0
  107. package/dist/src/ui/tui/utils/diagnostics.d.ts +21 -0
  108. package/dist/src/ui/tui/utils/diagnostics.js +72 -0
  109. package/dist/src/ui/tui/utils/with-retry.d.ts +12 -0
  110. package/dist/src/ui/tui/utils/with-retry.js +32 -0
  111. package/dist/src/ui/tui/utils/with-timeout.d.ts +10 -0
  112. package/dist/src/ui/tui/utils/with-timeout.js +24 -0
  113. package/dist/src/utils/ampli-settings.d.ts +1 -1
  114. package/dist/src/utils/ampli-settings.js +15 -5
  115. package/dist/src/utils/api-key-store.js +5 -5
  116. package/dist/src/utils/atomic-write.d.ts +15 -0
  117. package/dist/src/utils/atomic-write.js +34 -0
  118. package/dist/src/utils/setup-utils.js +2 -2
  119. package/dist/src/utils/token-refresh.d.ts +22 -0
  120. package/dist/src/utils/token-refresh.js +79 -0
  121. package/dist/src/utils/wizard-abort.js +6 -1
  122. package/package.json +6 -6
  123. package/skills/instrumentation/add-analytics-instrumentation/SKILL.md +142 -0
  124. package/skills/instrumentation/diff-intake/SKILL.md +128 -0
  125. package/skills/instrumentation/discover-analytics-patterns/SKILL.md +185 -0
  126. package/skills/instrumentation/discover-event-surfaces/SKILL.md +322 -0
  127. package/skills/instrumentation/discover-event-surfaces/references/best-practices.md +563 -0
  128. package/skills/instrumentation/instrument-events/SKILL.md +169 -0
  129. package/skills/instrumentation/instrument-events/references/best-practices.md +563 -0
  130. package/skills/integration/integration-android/SKILL.md +49 -0
  131. package/skills/integration/integration-android/references/EXAMPLE.md +1977 -0
  132. package/skills/integration/integration-android/references/amplitude-quickstart.md +1845 -0
  133. package/skills/integration/integration-android/references/analytics.md +1778 -0
  134. package/skills/integration/integration-android/references/basic-integration-1.0-begin.md +43 -0
  135. package/skills/integration/integration-android/references/basic-integration-1.1-edit.md +35 -0
  136. package/skills/integration/integration-android/references/basic-integration-1.2-revise.md +23 -0
  137. package/skills/integration/integration-android/references/basic-integration-1.3-conclude.md +57 -0
  138. package/skills/integration/integration-angular/SKILL.md +49 -0
  139. package/skills/integration/integration-angular/references/EXAMPLE.md +899 -0
  140. package/skills/integration/integration-angular/references/amplitude-quickstart.md +1845 -0
  141. package/skills/integration/integration-angular/references/basic-integration-1.0-begin.md +43 -0
  142. package/skills/integration/integration-angular/references/basic-integration-1.1-edit.md +35 -0
  143. package/skills/integration/integration-angular/references/basic-integration-1.2-revise.md +23 -0
  144. package/skills/integration/integration-angular/references/basic-integration-1.3-conclude.md +57 -0
  145. package/skills/integration/integration-angular/references/browser-sdk-2.md +4680 -0
  146. package/skills/integration/integration-astro-hybrid/SKILL.md +56 -0
  147. package/skills/integration/integration-astro-hybrid/references/EXAMPLE.md +1095 -0
  148. package/skills/integration/integration-astro-hybrid/references/amplitude-quickstart.md +1845 -0
  149. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.0-begin.md +43 -0
  150. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.1-edit.md +35 -0
  151. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.2-revise.md +23 -0
  152. package/skills/integration/integration-astro-hybrid/references/basic-integration-1.3-conclude.md +57 -0
  153. package/skills/integration/integration-astro-hybrid/references/browser-sdk-2.md +4680 -0
  154. package/skills/integration/integration-astro-ssr/SKILL.md +52 -0
  155. package/skills/integration/integration-astro-ssr/references/EXAMPLE.md +1106 -0
  156. package/skills/integration/integration-astro-ssr/references/amplitude-quickstart.md +1845 -0
  157. package/skills/integration/integration-astro-ssr/references/basic-integration-1.0-begin.md +43 -0
  158. package/skills/integration/integration-astro-ssr/references/basic-integration-1.1-edit.md +35 -0
  159. package/skills/integration/integration-astro-ssr/references/basic-integration-1.2-revise.md +23 -0
  160. package/skills/integration/integration-astro-ssr/references/basic-integration-1.3-conclude.md +57 -0
  161. package/skills/integration/integration-astro-ssr/references/browser-sdk-2.md +4680 -0
  162. package/skills/integration/integration-astro-static/SKILL.md +49 -0
  163. package/skills/integration/integration-astro-static/references/EXAMPLE.md +910 -0
  164. package/skills/integration/integration-astro-static/references/amplitude-quickstart.md +1845 -0
  165. package/skills/integration/integration-astro-static/references/basic-integration-1.0-begin.md +43 -0
  166. package/skills/integration/integration-astro-static/references/basic-integration-1.1-edit.md +35 -0
  167. package/skills/integration/integration-astro-static/references/basic-integration-1.2-revise.md +23 -0
  168. package/skills/integration/integration-astro-static/references/basic-integration-1.3-conclude.md +57 -0
  169. package/skills/integration/integration-astro-static/references/browser-sdk-2.md +4680 -0
  170. package/skills/integration/integration-astro-view-transitions/SKILL.md +51 -0
  171. package/skills/integration/integration-astro-view-transitions/references/EXAMPLE.md +979 -0
  172. package/skills/integration/integration-astro-view-transitions/references/amplitude-quickstart.md +1845 -0
  173. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.0-begin.md +43 -0
  174. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.1-edit.md +35 -0
  175. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.2-revise.md +23 -0
  176. package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.3-conclude.md +57 -0
  177. package/skills/integration/integration-astro-view-transitions/references/browser-sdk-2.md +4680 -0
  178. package/skills/integration/integration-django/SKILL.md +57 -0
  179. package/skills/integration/integration-django/references/EXAMPLE.md +1005 -0
  180. package/skills/integration/integration-django/references/amplitude-quickstart.md +1845 -0
  181. package/skills/integration/integration-django/references/basic-integration-1.0-begin.md +43 -0
  182. package/skills/integration/integration-django/references/basic-integration-1.1-edit.md +35 -0
  183. package/skills/integration/integration-django/references/basic-integration-1.2-revise.md +23 -0
  184. package/skills/integration/integration-django/references/basic-integration-1.3-conclude.md +57 -0
  185. package/skills/integration/integration-django/references/python.md +1424 -0
  186. package/skills/integration/integration-expo/SKILL.md +53 -0
  187. package/skills/integration/integration-expo/references/EXAMPLE.md +1291 -0
  188. package/skills/integration/integration-expo/references/amplitude-quickstart.md +1845 -0
  189. package/skills/integration/integration-expo/references/basic-integration-1.0-begin.md +43 -0
  190. package/skills/integration/integration-expo/references/basic-integration-1.1-edit.md +35 -0
  191. package/skills/integration/integration-expo/references/basic-integration-1.2-revise.md +23 -0
  192. package/skills/integration/integration-expo/references/basic-integration-1.3-conclude.md +57 -0
  193. package/skills/integration/integration-expo/references/react-native-sdk.md +2819 -0
  194. package/skills/integration/integration-fastapi/SKILL.md +57 -0
  195. package/skills/integration/integration-fastapi/references/EXAMPLE.md +1389 -0
  196. package/skills/integration/integration-fastapi/references/amplitude-quickstart.md +1845 -0
  197. package/skills/integration/integration-fastapi/references/basic-integration-1.0-begin.md +43 -0
  198. package/skills/integration/integration-fastapi/references/basic-integration-1.1-edit.md +35 -0
  199. package/skills/integration/integration-fastapi/references/basic-integration-1.2-revise.md +23 -0
  200. package/skills/integration/integration-fastapi/references/basic-integration-1.3-conclude.md +57 -0
  201. package/skills/integration/integration-fastapi/references/python.md +1424 -0
  202. package/skills/integration/integration-flask/SKILL.md +56 -0
  203. package/skills/integration/integration-flask/references/EXAMPLE.md +1130 -0
  204. package/skills/integration/integration-flask/references/amplitude-quickstart.md +1845 -0
  205. package/skills/integration/integration-flask/references/basic-integration-1.0-begin.md +43 -0
  206. package/skills/integration/integration-flask/references/basic-integration-1.1-edit.md +35 -0
  207. package/skills/integration/integration-flask/references/basic-integration-1.2-revise.md +23 -0
  208. package/skills/integration/integration-flask/references/basic-integration-1.3-conclude.md +57 -0
  209. package/skills/integration/integration-flask/references/python.md +1424 -0
  210. package/skills/integration/integration-javascript_node/SKILL.md +54 -0
  211. package/skills/integration/integration-javascript_node/references/EXAMPLE.md +365 -0
  212. package/skills/integration/integration-javascript_node/references/amplitude-quickstart.md +1845 -0
  213. package/skills/integration/integration-javascript_node/references/analytics.md +1778 -0
  214. package/skills/integration/integration-javascript_node/references/basic-integration-1.0-begin.md +43 -0
  215. package/skills/integration/integration-javascript_node/references/basic-integration-1.1-edit.md +35 -0
  216. package/skills/integration/integration-javascript_node/references/basic-integration-1.2-revise.md +23 -0
  217. package/skills/integration/integration-javascript_node/references/basic-integration-1.3-conclude.md +57 -0
  218. package/skills/integration/integration-javascript_web/SKILL.md +58 -0
  219. package/skills/integration/integration-javascript_web/references/EXAMPLE.md +451 -0
  220. package/skills/integration/integration-javascript_web/references/amplitude-quickstart.md +1845 -0
  221. package/skills/integration/integration-javascript_web/references/basic-integration-1.0-begin.md +43 -0
  222. package/skills/integration/integration-javascript_web/references/basic-integration-1.1-edit.md +35 -0
  223. package/skills/integration/integration-javascript_web/references/basic-integration-1.2-revise.md +23 -0
  224. package/skills/integration/integration-javascript_web/references/basic-integration-1.3-conclude.md +57 -0
  225. package/skills/integration/integration-javascript_web/references/browser-sdk-2.md +4680 -0
  226. package/skills/integration/integration-laravel/SKILL.md +52 -0
  227. package/skills/integration/integration-laravel/references/EXAMPLE.md +2039 -0
  228. package/skills/integration/integration-laravel/references/amplitude-quickstart.md +1845 -0
  229. package/skills/integration/integration-laravel/references/analytics.md +1778 -0
  230. package/skills/integration/integration-laravel/references/basic-integration-1.0-begin.md +43 -0
  231. package/skills/integration/integration-laravel/references/basic-integration-1.1-edit.md +35 -0
  232. package/skills/integration/integration-laravel/references/basic-integration-1.2-revise.md +23 -0
  233. package/skills/integration/integration-laravel/references/basic-integration-1.3-conclude.md +57 -0
  234. package/skills/integration/integration-nextjs-app-router/SKILL.md +54 -0
  235. package/skills/integration/integration-nextjs-app-router/references/EXAMPLE.md +673 -0
  236. package/skills/integration/integration-nextjs-app-router/references/amplitude-quickstart.md +1845 -0
  237. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.0-begin.md +43 -0
  238. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.1-edit.md +35 -0
  239. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.2-revise.md +23 -0
  240. package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.3-conclude.md +57 -0
  241. package/skills/integration/integration-nextjs-app-router/references/browser-sdk-2.md +4680 -0
  242. package/skills/integration/integration-nextjs-pages-router/SKILL.md +54 -0
  243. package/skills/integration/integration-nextjs-pages-router/references/EXAMPLE.md +735 -0
  244. package/skills/integration/integration-nextjs-pages-router/references/amplitude-quickstart.md +1845 -0
  245. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.0-begin.md +43 -0
  246. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.1-edit.md +35 -0
  247. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.2-revise.md +23 -0
  248. package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.3-conclude.md +57 -0
  249. package/skills/integration/integration-nextjs-pages-router/references/browser-sdk-2.md +4680 -0
  250. package/skills/integration/integration-nuxt-3.6/SKILL.md +46 -0
  251. package/skills/integration/integration-nuxt-3.6/references/EXAMPLE.md +8422 -0
  252. package/skills/integration/integration-nuxt-3.6/references/amplitude-quickstart.md +1845 -0
  253. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.0-begin.md +43 -0
  254. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.1-edit.md +35 -0
  255. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.2-revise.md +23 -0
  256. package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.3-conclude.md +57 -0
  257. package/skills/integration/integration-nuxt-3.6/references/browser-sdk-2.md +4680 -0
  258. package/skills/integration/integration-nuxt-4/SKILL.md +46 -0
  259. package/skills/integration/integration-nuxt-4/references/EXAMPLE.md +8670 -0
  260. package/skills/integration/integration-nuxt-4/references/amplitude-quickstart.md +1845 -0
  261. package/skills/integration/integration-nuxt-4/references/basic-integration-1.0-begin.md +43 -0
  262. package/skills/integration/integration-nuxt-4/references/basic-integration-1.1-edit.md +35 -0
  263. package/skills/integration/integration-nuxt-4/references/basic-integration-1.2-revise.md +23 -0
  264. package/skills/integration/integration-nuxt-4/references/basic-integration-1.3-conclude.md +57 -0
  265. package/skills/integration/integration-nuxt-4/references/browser-sdk-2.md +4680 -0
  266. package/skills/integration/integration-python/SKILL.md +53 -0
  267. package/skills/integration/integration-python/references/EXAMPLE.md +445 -0
  268. package/skills/integration/integration-python/references/amplitude-quickstart.md +1845 -0
  269. package/skills/integration/integration-python/references/basic-integration-1.0-begin.md +43 -0
  270. package/skills/integration/integration-python/references/basic-integration-1.1-edit.md +35 -0
  271. package/skills/integration/integration-python/references/basic-integration-1.2-revise.md +23 -0
  272. package/skills/integration/integration-python/references/basic-integration-1.3-conclude.md +57 -0
  273. package/skills/integration/integration-python/references/python.md +1424 -0
  274. package/skills/integration/integration-react-native/SKILL.md +49 -0
  275. package/skills/integration/integration-react-native/references/EXAMPLE.md +2253 -0
  276. package/skills/integration/integration-react-native/references/amplitude-quickstart.md +1845 -0
  277. package/skills/integration/integration-react-native/references/basic-integration-1.0-begin.md +43 -0
  278. package/skills/integration/integration-react-native/references/basic-integration-1.1-edit.md +35 -0
  279. package/skills/integration/integration-react-native/references/basic-integration-1.2-revise.md +23 -0
  280. package/skills/integration/integration-react-native/references/basic-integration-1.3-conclude.md +57 -0
  281. package/skills/integration/integration-react-native/references/react-native-sdk.md +2819 -0
  282. package/skills/integration/integration-react-react-router-6/SKILL.md +53 -0
  283. package/skills/integration/integration-react-react-router-6/references/EXAMPLE.md +570 -0
  284. package/skills/integration/integration-react-react-router-6/references/amplitude-quickstart.md +1845 -0
  285. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.0-begin.md +43 -0
  286. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.1-edit.md +35 -0
  287. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.2-revise.md +23 -0
  288. package/skills/integration/integration-react-react-router-6/references/basic-integration-1.3-conclude.md +57 -0
  289. package/skills/integration/integration-react-react-router-6/references/browser-sdk-2.md +4680 -0
  290. package/skills/integration/integration-react-react-router-7-data/SKILL.md +53 -0
  291. package/skills/integration/integration-react-react-router-7-data/references/EXAMPLE.md +830 -0
  292. package/skills/integration/integration-react-react-router-7-data/references/amplitude-quickstart.md +1845 -0
  293. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.0-begin.md +43 -0
  294. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.1-edit.md +35 -0
  295. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.2-revise.md +23 -0
  296. package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.3-conclude.md +57 -0
  297. package/skills/integration/integration-react-react-router-7-data/references/browser-sdk-2.md +4680 -0
  298. package/skills/integration/integration-react-react-router-7-declarative/SKILL.md +53 -0
  299. package/skills/integration/integration-react-react-router-7-declarative/references/EXAMPLE.md +609 -0
  300. package/skills/integration/integration-react-react-router-7-declarative/references/amplitude-quickstart.md +1845 -0
  301. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.0-begin.md +43 -0
  302. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.1-edit.md +35 -0
  303. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.2-revise.md +23 -0
  304. package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.3-conclude.md +57 -0
  305. package/skills/integration/integration-react-react-router-7-declarative/references/browser-sdk-2.md +4680 -0
  306. package/skills/integration/integration-react-react-router-7-framework/SKILL.md +53 -0
  307. package/skills/integration/integration-react-react-router-7-framework/references/EXAMPLE.md +1081 -0
  308. package/skills/integration/integration-react-react-router-7-framework/references/amplitude-quickstart.md +1845 -0
  309. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.0-begin.md +43 -0
  310. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.1-edit.md +35 -0
  311. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.2-revise.md +23 -0
  312. package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.3-conclude.md +57 -0
  313. package/skills/integration/integration-react-react-router-7-framework/references/browser-sdk-2.md +4680 -0
  314. package/skills/integration/integration-react-tanstack-router-code-based/SKILL.md +57 -0
  315. package/skills/integration/integration-react-tanstack-router-code-based/references/EXAMPLE.md +659 -0
  316. package/skills/integration/integration-react-tanstack-router-code-based/references/amplitude-quickstart.md +1845 -0
  317. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.0-begin.md +43 -0
  318. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.1-edit.md +35 -0
  319. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.2-revise.md +23 -0
  320. package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.3-conclude.md +57 -0
  321. package/skills/integration/integration-react-tanstack-router-code-based/references/browser-sdk-2.md +4680 -0
  322. package/skills/integration/integration-react-tanstack-router-file-based/SKILL.md +57 -0
  323. package/skills/integration/integration-react-tanstack-router-file-based/references/EXAMPLE.md +777 -0
  324. package/skills/integration/integration-react-tanstack-router-file-based/references/amplitude-quickstart.md +1845 -0
  325. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.0-begin.md +43 -0
  326. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.1-edit.md +35 -0
  327. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.2-revise.md +23 -0
  328. package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.3-conclude.md +57 -0
  329. package/skills/integration/integration-react-tanstack-router-file-based/references/browser-sdk-2.md +4680 -0
  330. package/skills/integration/integration-react-vite/SKILL.md +53 -0
  331. package/skills/integration/integration-react-vite/references/EXAMPLE.md +542 -0
  332. package/skills/integration/integration-react-vite/references/amplitude-quickstart.md +1845 -0
  333. package/skills/integration/integration-react-vite/references/basic-integration-1.0-begin.md +43 -0
  334. package/skills/integration/integration-react-vite/references/basic-integration-1.1-edit.md +35 -0
  335. package/skills/integration/integration-react-vite/references/basic-integration-1.2-revise.md +23 -0
  336. package/skills/integration/integration-react-vite/references/basic-integration-1.3-conclude.md +57 -0
  337. package/skills/integration/integration-react-vite/references/browser-sdk-2.md +4680 -0
  338. package/skills/integration/integration-ruby/SKILL.md +50 -0
  339. package/skills/integration/integration-ruby/references/EXAMPLE.md +420 -0
  340. package/skills/integration/integration-ruby/references/amplitude-quickstart.md +1845 -0
  341. package/skills/integration/integration-ruby/references/analytics.md +1778 -0
  342. package/skills/integration/integration-ruby/references/basic-integration-1.0-begin.md +43 -0
  343. package/skills/integration/integration-ruby/references/basic-integration-1.1-edit.md +35 -0
  344. package/skills/integration/integration-ruby/references/basic-integration-1.2-revise.md +23 -0
  345. package/skills/integration/integration-ruby/references/basic-integration-1.3-conclude.md +57 -0
  346. package/skills/integration/integration-ruby-on-rails/SKILL.md +55 -0
  347. package/skills/integration/integration-ruby-on-rails/references/EXAMPLE.md +1013 -0
  348. package/skills/integration/integration-ruby-on-rails/references/amplitude-quickstart.md +1845 -0
  349. package/skills/integration/integration-ruby-on-rails/references/analytics.md +1778 -0
  350. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.0-begin.md +43 -0
  351. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.1-edit.md +35 -0
  352. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.2-revise.md +23 -0
  353. package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.3-conclude.md +57 -0
  354. package/skills/integration/integration-sveltekit/SKILL.md +47 -0
  355. package/skills/integration/integration-sveltekit/references/EXAMPLE.md +14121 -0
  356. package/skills/integration/integration-sveltekit/references/amplitude-quickstart.md +1845 -0
  357. package/skills/integration/integration-sveltekit/references/basic-integration-1.0-begin.md +43 -0
  358. package/skills/integration/integration-sveltekit/references/basic-integration-1.1-edit.md +35 -0
  359. package/skills/integration/integration-sveltekit/references/basic-integration-1.2-revise.md +23 -0
  360. package/skills/integration/integration-sveltekit/references/basic-integration-1.3-conclude.md +57 -0
  361. package/skills/integration/integration-sveltekit/references/browser-sdk-2.md +4680 -0
  362. package/skills/integration/integration-swift/SKILL.md +49 -0
  363. package/skills/integration/integration-swift/references/EXAMPLE.md +660 -0
  364. package/skills/integration/integration-swift/references/amplitude-quickstart.md +1845 -0
  365. package/skills/integration/integration-swift/references/analytics.md +1778 -0
  366. package/skills/integration/integration-swift/references/basic-integration-1.0-begin.md +43 -0
  367. package/skills/integration/integration-swift/references/basic-integration-1.1-edit.md +35 -0
  368. package/skills/integration/integration-swift/references/basic-integration-1.2-revise.md +23 -0
  369. package/skills/integration/integration-swift/references/basic-integration-1.3-conclude.md +57 -0
  370. package/skills/integration/integration-tanstack-start/SKILL.md +58 -0
  371. package/skills/integration/integration-tanstack-start/references/EXAMPLE.md +998 -0
  372. package/skills/integration/integration-tanstack-start/references/amplitude-quickstart.md +1845 -0
  373. package/skills/integration/integration-tanstack-start/references/basic-integration-1.0-begin.md +43 -0
  374. package/skills/integration/integration-tanstack-start/references/basic-integration-1.1-edit.md +35 -0
  375. package/skills/integration/integration-tanstack-start/references/basic-integration-1.2-revise.md +23 -0
  376. package/skills/integration/integration-tanstack-start/references/basic-integration-1.3-conclude.md +57 -0
  377. package/skills/integration/integration-tanstack-start/references/browser-sdk-2.md +4680 -0
  378. package/skills/integration/integration-vue-3/SKILL.md +46 -0
  379. package/skills/integration/integration-vue-3/references/EXAMPLE.md +846 -0
  380. package/skills/integration/integration-vue-3/references/amplitude-quickstart.md +1845 -0
  381. package/skills/integration/integration-vue-3/references/basic-integration-1.0-begin.md +43 -0
  382. package/skills/integration/integration-vue-3/references/basic-integration-1.1-edit.md +35 -0
  383. package/skills/integration/integration-vue-3/references/basic-integration-1.2-revise.md +23 -0
  384. package/skills/integration/integration-vue-3/references/basic-integration-1.3-conclude.md +57 -0
  385. package/skills/integration/integration-vue-3/references/browser-sdk-2.md +4680 -0
  386. package/skills/taxonomy/amplitude-quickstart-taxonomy-agent/SKILL.md +228 -0
  387. package/dist/src/ui/tui/components/TitleBar.d.ts +0 -8
  388. package/dist/src/ui/tui/components/TitleBar.js +0 -27
  389. package/dist/src/ui/tui/primitives/KagiSmallWebViewer.d.ts +0 -7
  390. package/dist/src/ui/tui/primitives/KagiSmallWebViewer.js +0 -101
  391. package/dist/src/utils/anthropic-status.d.ts +0 -17
  392. package/dist/src/utils/anthropic-status.js +0 -51
@@ -1,18 +1,8 @@
1
1
  /**
2
- * ChecklistScreen — Post-setup checklist for first chart and first dashboard.
2
+ * ChecklistScreen — Post-setup checklist for first chart and dashboard.
3
3
  *
4
4
  * Shown after DataIngestionCheckScreen confirms events are flowing.
5
- *
6
- * Items:
7
- * [ ] Taxonomy agent — @todo (in progress in parallel work)
8
- * [ ] First chart — opens Amplitude in browser; marks complete on return
9
- * [ ] First dashboard — unlocked after chart; opens Amplitude in browser
10
- *
11
- * The user can "Continue" at any time to skip remaining items and advance
12
- * to Slack setup.
13
- *
14
- * Chart/dashboard creation via direct GraphQL API call is planned as a
15
- * follow-up; for now the action opens the Amplitude web UI.
5
+ * Celebration header: "Your events are flowing!" in success green.
16
6
  */
17
7
  import type { WizardStore } from '../store.js';
18
8
  interface ChecklistScreenProps {
@@ -1,47 +1,36 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
2
  /**
3
- * ChecklistScreen — Post-setup checklist for first chart and first dashboard.
3
+ * ChecklistScreen — Post-setup checklist for first chart and dashboard.
4
4
  *
5
5
  * Shown after DataIngestionCheckScreen confirms events are flowing.
6
- *
7
- * Items:
8
- * [ ] Taxonomy agent — @todo (in progress in parallel work)
9
- * [ ] First chart — opens Amplitude in browser; marks complete on return
10
- * [ ] First dashboard — unlocked after chart; opens Amplitude in browser
11
- *
12
- * The user can "Continue" at any time to skip remaining items and advance
13
- * to Slack setup.
14
- *
15
- * Chart/dashboard creation via direct GraphQL API call is planned as a
16
- * follow-up; for now the action opens the Amplitude web UI.
6
+ * Celebration header: "Your events are flowing!" in success green.
17
7
  */
18
8
  import { Box, Text } from 'ink';
19
- import { useEffect, useState, useSyncExternalStore } from 'react';
20
- import { PickerMenu } from '../primitives/index.js';
9
+ import { useEffect, useState } from 'react';
10
+ import { useWizardStore } from '../hooks/useWizardStore.js';
21
11
  import { Colors, Icons } from '../styles.js';
12
+ import { PickerMenu } from '../primitives/index.js';
22
13
  import { OUTBOUND_URLS } from '../../../lib/constants.js';
23
14
  import opn from 'opn';
24
15
  import { analytics } from '../../../utils/analytics.js';
25
16
  import { fetchOwnedDashboards } from '../../../lib/api.js';
26
17
  export const ChecklistScreen = ({ store }) => {
27
- useSyncExternalStore((cb) => store.subscribe(cb), () => store.getSnapshot());
18
+ useWizardStore(store);
28
19
  const { session } = store;
29
20
  const { checklistChartComplete, checklistDashboardComplete, region, selectedOrgId, } = session;
30
21
  const [opening, setOpening] = useState(null);
31
22
  const zone = (region ?? 'us');
32
- // On mount, detect any charts/dashboards the user already owns in their org
33
- // so a returning user sees the correct state without re-doing completed steps.
34
- // Detection is org-scoped (Thunder has no project-level listing API); for a
35
- // new-project user this is equivalent.
23
+ // On mount, detect charts/dashboards the user already owns so returning
24
+ // users see the correct state without re-doing completed steps.
36
25
  useEffect(() => {
37
26
  const { credentials, selectedOrgId, checklistChartComplete, checklistDashboardComplete, } = store.session;
38
27
  if (!credentials || !selectedOrgId)
39
28
  return;
40
29
  if (checklistChartComplete && checklistDashboardComplete)
41
30
  return;
42
- const idToken = credentials.idToken ?? credentials.accessToken;
31
+ const accessToken = credentials.accessToken;
43
32
  const sessionZone = (store.session.region ?? 'us');
44
- fetchOwnedDashboards(idToken, sessionZone, selectedOrgId)
33
+ fetchOwnedDashboards(accessToken, sessionZone, selectedOrgId)
45
34
  .then(({ hasCharts, hasDashboards }) => {
46
35
  if (hasCharts)
47
36
  store.setChecklistChartComplete();
@@ -87,36 +76,36 @@ export const ChecklistScreen = ({ store }) => {
87
76
  {
88
77
  value: 'chart',
89
78
  label: checklistChartComplete
90
- ? `${Icons.check} First chart — done`
91
- : `${Icons.squareOpen} Create your first chart`,
79
+ ? `${Icons.checkmark} Build a chart — done`
80
+ : `${Icons.bulletOpen} Build your first chart`,
92
81
  hint: checklistChartComplete ? undefined : 'opens in browser',
93
82
  disabled: checklistChartComplete,
94
83
  },
95
84
  {
96
85
  value: 'dashboard',
97
86
  label: checklistDashboardComplete
98
- ? `${Icons.check} First dashboard — done`
99
- : checklistChartComplete
100
- ? `${Icons.squareOpen} Create your first dashboard`
101
- : `${Icons.squareOpen} Create your first dashboard`,
87
+ ? `${Icons.checkmark} Create a dashboard — done`
88
+ : `${Icons.bulletOpen} Create your first dashboard`,
102
89
  hint: checklistDashboardComplete
103
90
  ? undefined
104
91
  : checklistChartComplete
105
92
  ? 'opens in browser'
106
- : 'create a chart first',
93
+ : 'build a chart first',
107
94
  disabled: checklistDashboardComplete || !checklistChartComplete,
108
95
  },
109
96
  {
110
97
  value: 'taxonomy',
111
- label: `${Icons.squareOpen} Set up taxonomy`,
98
+ label: `${Icons.bulletOpen} Set up taxonomy`,
112
99
  hint: 'coming soon',
113
100
  disabled: true,
114
101
  },
115
102
  {
116
103
  value: 'continue',
117
- label: allDone ? 'Done — continue' : 'Skip remaining and continue',
118
- hint: allDone ? undefined : 'you can always do these in Amplitude later',
104
+ label: allDone
105
+ ? `${Icons.arrowRight} Done continue`
106
+ : `${Icons.arrowRight} Skip and continue`,
107
+ hint: allDone ? undefined : 'you can always do these later',
119
108
  },
120
109
  ];
121
- return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: 2, paddingY: 1, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, color: Colors.accent, children: "Set up your analytics" }) }), _jsxs(Box, { flexDirection: "column", gap: 1, marginBottom: 2, children: [_jsx(Text, { children: "Your events are flowing. Now let's build some views of your data." }), opening && (_jsx(Text, { color: Colors.muted, children: "Opening Amplitude in your browser..." }))] }), _jsx(PickerMenu, { options: options, onSelect: (v) => handleSelect(v) })] }));
110
+ return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: 2, paddingY: 1, children: [_jsxs(Box, { marginBottom: 1, flexDirection: "column", children: [_jsxs(Text, { bold: true, color: Colors.success, children: [Icons.checkmark, " Your events are flowing!"] }), _jsx(Text, { color: Colors.body, children: "Here's what to explore next:" })] }), opening && (_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { color: Colors.muted, children: ["Opening Amplitude in your browser", Icons.ellipsis] }) })), _jsx(PickerMenu, { options: options, onSelect: (v) => handleSelect(v) })] }));
122
111
  };
@@ -1,20 +1,11 @@
1
1
  /**
2
- * DataIngestionCheckScreen — "Waiting for your events..." polling screen.
2
+ * DataIngestionCheckScreen — "Start your app and trigger some actions" polling screen.
3
3
  *
4
4
  * Shown after MCP setup. Polls the activation API every 30 seconds until the
5
5
  * project starts receiving events, then auto-advances to the Checklist.
6
6
  *
7
- * For users who were already fully activated (activationLevel === 'full') when
8
- * the wizard started, this screen confirms immediately on mount without polling.
9
- *
10
- * The user can exit and come back later — next time through, DataSetupScreen
11
- * will re-check activation and this screen will confirm immediately if events
12
- * have arrived.
13
- *
14
- * When the activation API is unavailable (e.g. external users hitting Thunder
15
- * endpoints that require browser session auth), the screen falls back to showing
16
- * cataloged event types from the data API so the user can verify events arrived,
17
- * then manually confirms with Enter.
7
+ * Active guidance as prominent instruction with framework-aware hint.
8
+ * BrailleSpinner while waiting. Success celebration when events arrive.
18
9
  */
19
10
  import type { WizardStore } from '../store.js';
20
11
  interface DataIngestionCheckScreenProps {
@@ -1,75 +1,119 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
2
  /**
3
- * DataIngestionCheckScreen — "Waiting for your events..." polling screen.
3
+ * DataIngestionCheckScreen — "Start your app and trigger some actions" polling screen.
4
4
  *
5
5
  * Shown after MCP setup. Polls the activation API every 30 seconds until the
6
6
  * project starts receiving events, then auto-advances to the Checklist.
7
7
  *
8
- * For users who were already fully activated (activationLevel === 'full') when
9
- * the wizard started, this screen confirms immediately on mount without polling.
10
- *
11
- * The user can exit and come back later — next time through, DataSetupScreen
12
- * will re-check activation and this screen will confirm immediately if events
13
- * have arrived.
14
- *
15
- * When the activation API is unavailable (e.g. external users hitting Thunder
16
- * endpoints that require browser session auth), the screen falls back to showing
17
- * cataloged event types from the data API so the user can verify events arrived,
18
- * then manually confirms with Enter.
8
+ * Active guidance as prominent instruction with framework-aware hint.
9
+ * BrailleSpinner while waiting. Success celebration when events arrive.
19
10
  */
20
11
  import { Box, Text } from 'ink';
21
- import { useEffect, useRef, useState, useSyncExternalStore } from 'react';
12
+ import { useEffect, useRef, useState } from 'react';
13
+ import { useWizardStore } from '../hooks/useWizardStore.js';
22
14
  import { Colors, Icons } from '../styles.js';
15
+ import { BrailleSpinner } from '../components/BrailleSpinner.js';
16
+ import { useScreenInput } from '../hooks/useScreenInput.js';
23
17
  import { fetchProjectActivationStatus, fetchWorkspaceEventTypes, } from '../../../lib/api.js';
18
+ import { Integration } from '../../../lib/constants.js';
19
+ import { OutroKind } from '../session-constants.js';
24
20
  import { logToFile } from '../../../utils/debug.js';
25
- import { OutroKind } from '../../../lib/wizard-session.js';
26
- import { useScreenInput } from '../hooks/useScreenInput.js';
27
21
  const POLL_INTERVAL_MS = 30_000;
28
22
  const MAX_EVENTS_SHOWN = 8;
23
+ const CELEBRATION_DELAY_MS = 3_000;
24
+ /** Framework-specific hints for what the user should do to generate events. */
25
+ const FRAMEWORK_HINTS = {
26
+ [Integration.nextjs]: 'Visit localhost:3000 and click around',
27
+ [Integration.vue]: 'Visit localhost:5173 and interact with your app',
28
+ [Integration.reactRouter]: 'Visit localhost:3000 and navigate between pages',
29
+ [Integration.django]: 'Visit localhost:8000 and browse a few pages',
30
+ [Integration.flask]: 'Visit localhost:5000 and trigger some requests',
31
+ [Integration.fastapi]: 'Visit localhost:8000/docs and try some endpoints',
32
+ [Integration.reactNative]: 'Open your app on a device or emulator and tap around',
33
+ [Integration.swift]: 'Build and run your app, then interact with it',
34
+ [Integration.android]: 'Build and run your app, then interact with it',
35
+ [Integration.flutter]: 'Run your app and navigate through a few screens',
36
+ };
29
37
  export const DataIngestionCheckScreen = ({ store, }) => {
30
- useSyncExternalStore((cb) => store.subscribe(cb), () => store.getSnapshot());
38
+ useWizardStore(store);
31
39
  const { session } = store;
32
- const { credentials, region, activationLevel } = session;
40
+ const { activationLevel } = session;
33
41
  const pollingRef = useRef(null);
42
+ const celebrationTimerRef = useRef(null);
34
43
  const [apiUnavailable, setApiUnavailable] = useState(false);
35
44
  const [eventTypes, setEventTypes] = useState(null);
45
+ const [celebrating, setCelebrating] = useState(false);
46
+ const [celebrationReady, setCelebrationReady] = useState(false);
47
+ const [arrivedEvents, setArrivedEvents] = useState([]);
48
+ const [lastChecked, setLastChecked] = useState(null);
49
+ const [secondsSince, setSecondsSince] = useState(0);
50
+ const [pollingStartTime] = useState(() => Date.now());
51
+ const [elapsedSeconds, setElapsedSeconds] = useState(0);
52
+ /** Confirm ingestion with a celebration, then wait for user to press Enter. */
53
+ function confirmWithCelebration(events) {
54
+ if (pollingRef.current !== null)
55
+ clearInterval(pollingRef.current);
56
+ setCelebrating(true);
57
+ if (events && events.length > 0)
58
+ setArrivedEvents(events);
59
+ celebrationTimerRef.current = setTimeout(() => {
60
+ setCelebrationReady(true);
61
+ }, CELEBRATION_DELAY_MS);
62
+ }
36
63
  async function checkIngestion() {
37
- if (!credentials) {
64
+ // Read from store.session at call time to avoid stale closures
65
+ const currentSession = store.session;
66
+ const currentCredentials = currentSession.credentials;
67
+ const currentRegion = currentSession.region;
68
+ if (!currentCredentials) {
38
69
  setApiUnavailable(true);
39
70
  return;
40
71
  }
41
- // credentials.projectId is 0 for OAuth users; fall back to workspace UUID
42
- const appId = credentials.projectId || session.selectedWorkspaceId;
72
+ const appId = currentCredentials.projectId || currentSession.selectedWorkspaceId;
43
73
  if (!appId) {
44
74
  setApiUnavailable(true);
45
75
  return;
46
76
  }
47
- const zone = (region ?? 'us');
48
- const idToken = credentials.idToken ?? credentials.accessToken;
77
+ const zone = (currentRegion ?? 'us');
78
+ const dataApiToken = currentCredentials.idToken ?? currentCredentials.accessToken;
79
+ if (!currentSession.selectedOrgId) {
80
+ setApiUnavailable(true);
81
+ return;
82
+ }
49
83
  try {
50
- const status = await fetchProjectActivationStatus(idToken, zone, appId, session.selectedOrgId);
84
+ const status = await fetchProjectActivationStatus({
85
+ accessToken: currentCredentials.accessToken,
86
+ zone,
87
+ appId,
88
+ orgId: currentSession.selectedOrgId,
89
+ });
90
+ setLastChecked(Date.now());
51
91
  logToFile(`[DataIngestionCheck] poll result: hasAnyEvents=${status.hasAnyEvents} hasDetSource=${status.hasDetSource}`);
52
92
  if (status.hasAnyEvents) {
53
- store.setDataIngestionConfirmed();
93
+ confirmWithCelebration();
54
94
  return;
55
95
  }
56
- // The activation API only checks autocapture events (page_viewed,
57
- // session_start, session_end). Custom track() calls won't appear there.
58
- // Fall back to the event catalog which includes all event types.
59
- if (session.selectedOrgId && session.selectedWorkspaceId) {
60
- const catalogEvents = await fetchWorkspaceEventTypes(idToken, zone, session.selectedOrgId, session.selectedWorkspaceId);
96
+ // Activation API only checks autocapture events. Fall back to the
97
+ // event catalog which includes all event types.
98
+ if (currentSession.selectedOrgId && currentSession.selectedWorkspaceId) {
99
+ const catalogEvents = await fetchWorkspaceEventTypes(dataApiToken, zone, currentSession.selectedOrgId, currentSession.selectedWorkspaceId);
61
100
  logToFile(`[DataIngestionCheck] catalog fallback: ${catalogEvents.length} event types found`);
62
101
  if (catalogEvents.length > 0) {
63
- store.setDataIngestionConfirmed();
102
+ confirmWithCelebration(catalogEvents);
64
103
  }
65
104
  }
66
105
  }
67
106
  catch (err) {
68
107
  logToFile(`[DataIngestionCheck] poll error: ${err instanceof Error ? err.message : String(err)}`);
108
+ // Clear the polling interval so it stops firing against the failing API
109
+ if (pollingRef.current !== null) {
110
+ clearInterval(pollingRef.current);
111
+ pollingRef.current = null;
112
+ }
69
113
  setApiUnavailable(true);
70
- // Fetch cataloged event types from the data API as a proxy for "events arrived"
71
- if (session.selectedOrgId && session.selectedWorkspaceId) {
72
- fetchWorkspaceEventTypes(idToken, zone, session.selectedOrgId, session.selectedWorkspaceId)
114
+ // Fetch cataloged event types as a proxy for "events arrived"
115
+ if (currentSession.selectedOrgId && currentSession.selectedWorkspaceId) {
116
+ fetchWorkspaceEventTypes(dataApiToken, zone, currentSession.selectedOrgId, currentSession.selectedWorkspaceId)
73
117
  .then((names) => {
74
118
  setEventTypes(names);
75
119
  })
@@ -88,7 +132,6 @@ export const DataIngestionCheckScreen = ({ store, }) => {
88
132
  store.setDataIngestionConfirmed();
89
133
  return;
90
134
  }
91
- // Run once immediately, then set up the interval
92
135
  void checkIngestion();
93
136
  pollingRef.current = setInterval(() => {
94
137
  void checkIngestion();
@@ -97,15 +140,35 @@ export const DataIngestionCheckScreen = ({ store, }) => {
97
140
  if (pollingRef.current !== null) {
98
141
  clearInterval(pollingRef.current);
99
142
  }
143
+ if (celebrationTimerRef.current !== null) {
144
+ clearTimeout(celebrationTimerRef.current);
145
+ }
100
146
  };
101
147
  }, []);
148
+ // Update seconds-since counter and elapsed timer — every 5s to reduce re-renders
149
+ useEffect(() => {
150
+ const id = setInterval(() => {
151
+ if (lastChecked) {
152
+ setSecondsSince(Math.floor((Date.now() - lastChecked) / 1000));
153
+ }
154
+ setElapsedSeconds(Math.floor((Date.now() - pollingStartTime) / 1000));
155
+ }, 5000);
156
+ return () => clearInterval(id);
157
+ }, [lastChecked, pollingStartTime]);
102
158
  useScreenInput((_char, key) => {
159
+ // During celebration, wait for Enter to advance
160
+ if (celebrating) {
161
+ if (celebrationReady && key.return) {
162
+ store.setDataIngestionConfirmed();
163
+ }
164
+ return;
165
+ }
103
166
  if (key.escape || _char === 'q') {
104
167
  if (pollingRef.current !== null)
105
168
  clearInterval(pollingRef.current);
106
169
  store.setOutroData({
107
170
  kind: OutroKind.Cancel,
108
- message: 'Come back once your app is running and sending events. Your SDK is installed — you just need to trigger some actions.',
171
+ message: 'Come back once your app is running and sending events. Your SDK is installed — just trigger some actions.',
109
172
  });
110
173
  return;
111
174
  }
@@ -116,9 +179,16 @@ export const DataIngestionCheckScreen = ({ store, }) => {
116
179
  store.setDataIngestionConfirmed();
117
180
  }
118
181
  });
182
+ // Derive framework-specific hint
183
+ const frameworkHint = session.integration
184
+ ? FRAMEWORK_HINTS[session.integration]
185
+ : undefined;
119
186
  const shown = eventTypes?.slice(0, MAX_EVENTS_SHOWN) ?? [];
120
187
  const overflow = (eventTypes?.length ?? 0) - MAX_EVENTS_SHOWN;
121
- return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: 2, paddingY: 1, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, color: Colors.accent, children: "Waiting for your events" }) }), _jsxs(Box, { flexDirection: "column", gap: 1, marginBottom: 2, children: [_jsx(Text, { children: "Your SDK is installed. Once you run your app and trigger some actions, events will start flowing into Amplitude." }), !apiUnavailable && (_jsx(Text, { color: Colors.muted, children: "Checking every 30 seconds \u2014 this screen will advance automatically." }))] }), apiUnavailable && eventTypes === null && (_jsxs(Box, { gap: 2, alignItems: "center", children: [_jsx(Text, { color: Colors.accent, children: Icons.diamond }), _jsx(Text, { color: Colors.muted, children: "Checking your event catalog..." })] })), apiUnavailable && eventTypes !== null && eventTypes.length > 0 && (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { color: Colors.muted, dimColor: true, children: "Events cataloged in your workspace:" }), _jsxs(Box, { flexDirection: "column", marginTop: 1, marginLeft: 2, children: [shown.map((name) => (_jsxs(Box, { gap: 2, children: [_jsx(Text, { color: Colors.accent, children: Icons.diamond }), _jsx(Text, { children: name })] }, name))), overflow > 0 && (_jsxs(Text, { color: Colors.muted, dimColor: true, children: ["... and ", overflow, " more"] }))] })] })), apiUnavailable && eventTypes !== null && eventTypes.length === 0 && (_jsxs(Box, { gap: 2, alignItems: "center", marginBottom: 1, children: [_jsx(Text, { color: Colors.accent, children: Icons.diamond }), _jsx(Text, { color: Colors.muted, children: "Waiting for your events..." })] })), !apiUnavailable && (_jsxs(Box, { gap: 2, alignItems: "center", children: [_jsx(Text, { color: Colors.accent, children: Icons.diamond }), _jsx(Text, { color: Colors.muted, children: "Waiting for your events..." })] })), _jsxs(Box, { marginTop: 2, flexDirection: "column", gap: 1, children: [apiUnavailable && (_jsxs(Text, { color: Colors.muted, dimColor: true, children: ["Press", ' ', _jsx(Text, { bold: true, color: Colors.muted, children: "Enter" }), ' ', eventTypes && eventTypes.length > 0
122
- ? 'to continue'
123
- : 'once you see events in your Amplitude dashboard'] })), _jsxs(Text, { color: Colors.muted, dimColor: true, children: ["Press", ' ', _jsx(Text, { bold: true, color: Colors.muted, children: "q" }), ' ', "or", ' ', _jsx(Text, { bold: true, color: Colors.muted, children: "Esc" }), ' ', "to exit and resume later"] })] })] }));
188
+ // ── Celebration state ──────────────────────────────────────────────────
189
+ if (celebrating) {
190
+ return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: 2, paddingY: 1, children: [_jsxs(Text, { bold: true, color: Colors.success, children: [Icons.checkmark, " Events detected!"] }), arrivedEvents.length > 0 && (_jsxs(Box, { flexDirection: "column", marginTop: 1, marginLeft: 2, children: [arrivedEvents.slice(0, MAX_EVENTS_SHOWN).map((name) => (_jsxs(Text, { color: Colors.success, children: [Icons.diamond, " ", name] }, name))), arrivedEvents.length > MAX_EVENTS_SHOWN && (_jsxs(Text, { color: Colors.muted, children: [Icons.ellipsis, " and ", arrivedEvents.length - MAX_EVENTS_SHOWN, ' ', "more"] }))] })), _jsx(Box, { marginTop: 1, children: celebrationReady ? (_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: Colors.muted, children: "[" }), _jsx(Text, { color: Colors.body, bold: true, children: "Enter" }), _jsx(Text, { color: Colors.muted, children: "] Continue" })] })) : (_jsxs(Text, { color: Colors.body, children: ["Verifying", Icons.ellipsis] })) })] }));
191
+ }
192
+ // ── Waiting state ──────────────────────────────────────────────────────
193
+ return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: 2, paddingY: 1, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, color: Colors.heading, children: "Start your app and trigger some user actions" }) }), frameworkHint && (_jsx(Box, { marginBottom: 1, children: _jsxs(Text, { color: Colors.accent, children: [Icons.arrowRight, " ", frameworkHint] }) })), _jsx(Text, { color: Colors.body, children: "Your SDK is installed. Once you interact with your app, events will start flowing into Amplitude." }), !apiUnavailable && (_jsxs(Box, { marginTop: 1, gap: 1, alignItems: "center", children: [_jsx(BrailleSpinner, { color: Colors.accent }), _jsxs(Text, { color: Colors.secondary, children: ["Listening for events", Icons.ellipsis, lastChecked && (_jsxs(Text, { color: Colors.muted, children: [" (checked ", secondsSince, "s ago)"] }))] })] })), !apiUnavailable && !celebrating && elapsedSeconds >= 60 && (_jsxs(Box, { flexDirection: "column", marginTop: 1, marginLeft: 2, children: [_jsxs(Text, { color: Colors.secondary, children: [Icons.arrowRight, " Make sure your dev server is running"] }), elapsedSeconds >= 90 && (_jsxs(Text, { color: Colors.secondary, children: [Icons.arrowRight, " Try visiting your app and clicking around"] })), elapsedSeconds >= 120 && (_jsxs(Text, { color: Colors.secondary, children: [Icons.arrowRight, " Check your terminal for errors \u2014 the SDK may not have initialized"] }))] })), apiUnavailable && eventTypes === null && (_jsxs(Box, { marginTop: 1, gap: 1, alignItems: "center", children: [_jsx(BrailleSpinner, { color: Colors.accent }), _jsxs(Text, { color: Colors.secondary, children: ["Checking your event catalog", Icons.ellipsis] })] })), apiUnavailable && eventTypes !== null && eventTypes.length > 0 && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: Colors.secondary, children: "Events cataloged in your workspace:" }), _jsxs(Box, { flexDirection: "column", marginTop: 1, marginLeft: 2, children: [shown.map((name) => (_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: Colors.success, children: Icons.diamond }), _jsx(Text, { color: Colors.body, children: name })] }, name))), overflow > 0 && (_jsxs(Text, { color: Colors.muted, children: [Icons.ellipsis, " and ", overflow, " more"] }))] })] })), apiUnavailable && eventTypes !== null && eventTypes.length === 0 && (_jsxs(Box, { marginTop: 1, gap: 1, alignItems: "center", children: [_jsx(BrailleSpinner, { color: Colors.accent }), _jsxs(Text, { color: Colors.secondary, children: ["Waiting for events", Icons.ellipsis] })] })), _jsxs(Box, { marginTop: 2, gap: 2, children: [apiUnavailable && (_jsxs(Box, { children: [_jsx(Text, { color: Colors.muted, children: "[" }), _jsx(Text, { color: Colors.body, bold: true, children: "Enter" }), _jsxs(Text, { color: Colors.muted, children: ["] ", eventTypes && eventTypes.length > 0 ? 'Continue' : 'Confirm'] })] })), _jsxs(Box, { children: [_jsx(Text, { color: Colors.muted, children: "[" }), _jsx(Text, { color: Colors.body, bold: true, children: "q" }), _jsx(Text, { color: Colors.muted, children: "] Exit and resume later" })] })] })] }));
124
194
  };
@@ -2,9 +2,9 @@
2
2
  * DataSetupScreen — Checks whether the connected Amplitude project has event data.
3
3
  *
4
4
  * Calls the Amplitude Data API to determine the project's activation level:
5
- * 'full' — 50+ events / well-established data → Options menu
6
- * 'partial' — snippet installed but few events → ActivationOptions screen
7
- * 'none' — no events, no snippet → Framework Detection
5
+ * 'full' — 50+ events / well-established data
6
+ * 'partial' — snippet installed but few events
7
+ * 'none' — no events, no snippet
8
8
  *
9
9
  * The router's isComplete predicate (projectHasData !== null) advances past
10
10
  * this screen automatically once the value is set.
@@ -1,23 +1,25 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /**
3
3
  * DataSetupScreen — Checks whether the connected Amplitude project has event data.
4
4
  *
5
5
  * Calls the Amplitude Data API to determine the project's activation level:
6
- * 'full' — 50+ events / well-established data → Options menu
7
- * 'partial' — snippet installed but few events → ActivationOptions screen
8
- * 'none' — no events, no snippet → Framework Detection
6
+ * 'full' — 50+ events / well-established data
7
+ * 'partial' — snippet installed but few events
8
+ * 'none' — no events, no snippet
9
9
  *
10
10
  * The router's isComplete predicate (projectHasData !== null) advances past
11
11
  * this screen automatically once the value is set.
12
12
  */
13
- import { Box } from 'ink';
14
- import { useEffect, useSyncExternalStore } from 'react';
15
- import { LoadingBox } from '../primitives/index.js';
13
+ import { Box, Text } from 'ink';
14
+ import { useEffect } from 'react';
15
+ import { useWizardStore } from '../hooks/useWizardStore.js';
16
+ import { Colors, Icons } from '../styles.js';
17
+ import { BrailleSpinner } from '../components/BrailleSpinner.js';
16
18
  import { fetchProjectActivationStatus } from '../../../lib/api.js';
17
19
  import { detectAmplitudeInProject } from '../../../lib/detect-amplitude.js';
18
20
  import { logToFile } from '../../../utils/debug.js';
19
21
  export const DataSetupScreen = ({ store }) => {
20
- useSyncExternalStore((cb) => store.subscribe(cb), () => store.getSnapshot());
22
+ useWizardStore(store);
21
23
  useEffect(() => {
22
24
  if (store.session.projectHasData !== null)
23
25
  return;
@@ -35,7 +37,12 @@ export const DataSetupScreen = ({ store }) => {
35
37
  // Run local static check in parallel with the API call.
36
38
  const localDetection = detectAmplitudeInProject(store.session.installDir);
37
39
  logToFile(`[DataSetup] local detection: confidence=${localDetection.confidence} reason=${localDetection.reason ?? 'none'}`);
38
- void fetchProjectActivationStatus(credentials.idToken ?? credentials.accessToken, zone, appId, selectedOrgId)
40
+ void fetchProjectActivationStatus({
41
+ accessToken: credentials.accessToken,
42
+ zone,
43
+ appId,
44
+ orgId: selectedOrgId,
45
+ })
39
46
  .then((status) => {
40
47
  logToFile(`[DataSetup] activation status: ${JSON.stringify(status)}`);
41
48
  store.setSnippetConfigured(status.hasDetSource);
@@ -69,5 +76,5 @@ export const DataSetupScreen = ({ store }) => {
69
76
  store.setActivationLevel(localDetection.confidence !== 'none' ? 'partial' : 'none');
70
77
  });
71
78
  }, []);
72
- return (_jsx(Box, { flexDirection: "column", flexGrow: 1, children: _jsx(LoadingBox, { message: "Checking project setup\u2026" }) }));
79
+ return (_jsx(Box, { flexDirection: "column", flexGrow: 1, children: _jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, color: Colors.heading, children: "Checking project setup" }), _jsxs(Box, { marginTop: 1, gap: 1, children: [_jsx(BrailleSpinner, { color: Colors.accent }), _jsxs(Text, { color: Colors.body, children: ["Analyzing your Amplitude project", Icons.ellipsis] })] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: Colors.muted, children: "Looking for existing SDK installation and event data" }) })] }) }));
73
80
  };
@@ -1,12 +1,14 @@
1
1
  /**
2
- * IntroScreen — Welcome, framework detection, and continue/cancel prompt.
2
+ * IntroScreen (v2) Clean, minimal welcome with framework detection.
3
3
  *
4
- * Three states:
4
+ * Four states:
5
+ * 0. Checkpoint restored: resume / start fresh / cancel picker
5
6
  * 1. Detecting: spinner while bin.ts runs detection
6
7
  * 2. Detection failed: auto-selects Generic, then continue/cancel
7
8
  * 3. Detection succeeded: show result, then continue/cancel
8
9
  *
9
- * Calls store.completeSetup() which unblocks bin.ts to start runWizard.
10
+ * Shows the AmplitudeTextLogo when terminal is wide/tall enough (>=75x20).
11
+ * Calls store.concludeIntro() to advance past this screen.
10
12
  */
11
13
  import type { WizardStore } from '../store.js';
12
14
  interface IntroScreenProps {