@amplitude/wizard 1.0.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.
- package/LICENSE +25 -1
- package/dist/bin.js +47 -11
- package/dist/src/frameworks/javascript-node/javascript-node-wizard-agent.js +11 -1
- package/dist/src/frameworks/react-router/react-router-wizard-agent.js +65 -8
- package/dist/src/frameworks/vue/vue-wizard-agent.js +6 -1
- package/dist/src/lib/agent-interface.js +46 -0
- package/dist/src/lib/agent-runner.js +112 -51
- package/dist/src/lib/api.d.ts +35 -0
- package/dist/src/lib/api.js +118 -0
- package/dist/src/lib/commandments.js +1 -0
- package/dist/src/lib/constants.d.ts +1 -1
- package/dist/src/lib/constants.js +3 -3
- package/dist/src/lib/credential-resolution.js +7 -0
- package/dist/src/lib/framework-config.d.ts +9 -0
- package/dist/src/lib/mcp-with-fallback.d.ts +43 -0
- package/dist/src/lib/mcp-with-fallback.js +220 -0
- package/dist/src/lib/version-check.d.ts +17 -0
- package/dist/src/lib/version-check.js +72 -0
- package/dist/src/lib/wizard-session.d.ts +22 -7
- package/dist/src/lib/wizard-session.js +5 -3
- package/dist/src/run.d.ts +18 -1
- package/dist/src/run.js +104 -15
- package/dist/src/ui/agent-ui.d.ts +2 -0
- package/dist/src/ui/agent-ui.js +10 -0
- package/dist/src/ui/logging-ui.d.ts +2 -0
- package/dist/src/ui/logging-ui.js +6 -0
- package/dist/src/ui/tui/components/ConsoleView.js +14 -1
- package/dist/src/ui/tui/components/JourneyStepper.js +1 -3
- package/dist/src/ui/tui/flows.d.ts +0 -1
- package/dist/src/ui/tui/flows.js +1 -9
- package/dist/src/ui/tui/ink-ui.d.ts +2 -0
- package/dist/src/ui/tui/ink-ui.js +6 -0
- package/dist/src/ui/tui/screen-registry.js +0 -2
- package/dist/src/ui/tui/screens/DataIngestionCheckScreen.d.ts +5 -3
- package/dist/src/ui/tui/screens/DataIngestionCheckScreen.js +124 -4
- package/dist/src/ui/tui/screens/OutroScreen.js +12 -3
- package/dist/src/ui/tui/store.d.ts +22 -3
- package/dist/src/ui/tui/store.js +52 -18
- package/dist/src/ui/tui/utils/diagnostics.js +1 -3
- package/dist/src/ui/wizard-ui.d.ts +8 -0
- package/dist/src/utils/analytics.d.ts +15 -0
- package/dist/src/utils/analytics.js +37 -0
- package/dist/src/utils/setup-utils.js +6 -1
- package/package.json +2 -2
- package/skills/integration/integration-android/SKILL.md +7 -10
- package/skills/integration/integration-android/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-android/references/android.md +1468 -0
- package/skills/integration/integration-android/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-android/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-android/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-angular/SKILL.md +6 -8
- package/skills/integration/integration-angular/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-angular/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-angular/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-angular/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-angular/references/browser-sdk-2.md +67 -20
- package/skills/integration/{integration-swift/references/analytics.md → integration-angular/references/browser-unified-sdk.md} +591 -157
- package/skills/integration/integration-astro-hybrid/SKILL.md +6 -13
- package/skills/integration/integration-astro-hybrid/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-astro-hybrid/references/browser-sdk-2.md +67 -20
- package/skills/integration/{integration-android/references/analytics.md → integration-astro-hybrid/references/browser-unified-sdk.md} +591 -157
- package/skills/integration/integration-astro-ssr/SKILL.md +6 -11
- package/skills/integration/integration-astro-ssr/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-astro-ssr/references/browser-sdk-2.md +67 -20
- package/skills/integration/{integration-javascript_node/references/analytics.md → integration-astro-ssr/references/browser-unified-sdk.md} +591 -157
- package/skills/integration/integration-astro-static/SKILL.md +6 -8
- package/skills/integration/integration-astro-static/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-astro-static/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-astro-static/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-astro-static/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-astro-static/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-astro-static/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-astro-view-transitions/SKILL.md +6 -10
- package/skills/integration/integration-astro-view-transitions/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-astro-view-transitions/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-astro-view-transitions/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-django/SKILL.md +5 -16
- package/skills/integration/integration-django/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-django/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-django/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-django/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-django/references/python.md +1 -1
- package/skills/integration/integration-expo/SKILL.md +8 -13
- package/skills/integration/integration-expo/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-expo/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-expo/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-expo/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-expo/references/react-native-sdk.md +11 -10
- package/skills/integration/integration-fastapi/SKILL.md +5 -16
- package/skills/integration/integration-fastapi/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-fastapi/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-fastapi/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-fastapi/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-fastapi/references/python.md +1 -1
- package/skills/integration/integration-flask/SKILL.md +5 -15
- package/skills/integration/integration-flask/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-flask/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-flask/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-flask/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-flask/references/python.md +1 -1
- package/skills/integration/integration-javascript_node/SKILL.md +6 -12
- package/skills/integration/integration-javascript_node/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-javascript_node/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-javascript_node/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-javascript_node/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-javascript_node/references/node.md +1457 -0
- package/skills/integration/integration-javascript_web/SKILL.md +7 -16
- package/skills/integration/integration-javascript_web/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-javascript_web/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-javascript_web/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-javascript_web/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-javascript_web/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-javascript_web/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-laravel/SKILL.md +5 -11
- package/skills/integration/integration-laravel/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-laravel/references/analytics.md +1 -1
- package/skills/integration/integration-laravel/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-laravel/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-laravel/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-nextjs-app-router/SKILL.md +6 -13
- package/skills/integration/integration-nextjs-app-router/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-nextjs-app-router/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-nextjs-app-router/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-nextjs-pages-router/SKILL.md +6 -13
- package/skills/integration/integration-nextjs-pages-router/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-nextjs-pages-router/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-nextjs-pages-router/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-nuxt-3.6/SKILL.md +6 -5
- package/skills/integration/integration-nuxt-3.6/references/EXAMPLE.md +1 -1
- package/skills/integration/integration-nuxt-3.6/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-nuxt-3.6/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-nuxt-3.6/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-nuxt-4/SKILL.md +6 -5
- package/skills/integration/integration-nuxt-4/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-nuxt-4/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-nuxt-4/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-python/SKILL.md +8 -13
- package/skills/integration/integration-python/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-python/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-python/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-python/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-python/references/python.md +1 -1
- package/skills/integration/integration-react-native/SKILL.md +8 -9
- package/skills/integration/integration-react-native/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-react-native/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-react-native/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-react-native/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-react-native/references/react-native-sdk.md +11 -10
- package/skills/integration/integration-react-react-router-6/SKILL.md +6 -12
- package/skills/integration/integration-react-react-router-6/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-react-react-router-6/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-react-react-router-6/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-react-react-router-7-data/SKILL.md +6 -12
- package/skills/integration/integration-react-react-router-7-data/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-react-react-router-7-data/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-react-react-router-7-data/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-react-react-router-7-declarative/SKILL.md +6 -12
- package/skills/integration/integration-react-react-router-7-declarative/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-react-react-router-7-declarative/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-react-react-router-7-declarative/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-react-react-router-7-framework/SKILL.md +6 -12
- package/skills/integration/integration-react-react-router-7-framework/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-react-react-router-7-framework/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-react-react-router-7-framework/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-react-tanstack-router-code-based/SKILL.md +6 -14
- package/skills/integration/integration-react-tanstack-router-code-based/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-react-tanstack-router-code-based/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-react-tanstack-router-code-based/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-react-tanstack-router-file-based/SKILL.md +6 -14
- package/skills/integration/integration-react-tanstack-router-file-based/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-react-tanstack-router-file-based/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-react-tanstack-router-file-based/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-react-vite/SKILL.md +6 -12
- package/skills/integration/integration-react-vite/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-react-vite/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-react-vite/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-react-vite/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-react-vite/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-react-vite/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-ruby/SKILL.md +6 -10
- package/skills/integration/integration-ruby/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-ruby/references/analytics.md +1 -1
- package/skills/integration/integration-ruby/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-ruby/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-ruby/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-ruby-on-rails/SKILL.md +5 -14
- package/skills/integration/integration-ruby-on-rails/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-ruby-on-rails/references/analytics.md +1 -1
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-sveltekit/SKILL.md +6 -6
- package/skills/integration/integration-sveltekit/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-sveltekit/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-sveltekit/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-sveltekit/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-sveltekit/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-sveltekit/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-swift/SKILL.md +9 -10
- package/skills/integration/integration-swift/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-swift/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-swift/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-swift/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-swift/references/ios.md +1480 -0
- package/skills/integration/integration-tanstack-start/SKILL.md +6 -17
- package/skills/integration/integration-tanstack-start/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-tanstack-start/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-tanstack-start/references/browser-unified-sdk.md +2212 -0
- package/skills/integration/integration-vue-3/SKILL.md +6 -5
- package/skills/integration/integration-vue-3/references/amplitude-quickstart.md +1 -1
- package/skills/integration/integration-vue-3/references/basic-integration-1.0-begin.md +3 -1
- package/skills/integration/integration-vue-3/references/basic-integration-1.1-edit.md +183 -0
- package/skills/integration/integration-vue-3/references/basic-integration-1.3-conclude.md +81 -11
- package/skills/integration/integration-vue-3/references/browser-sdk-2.md +67 -20
- package/skills/integration/integration-vue-3/references/browser-unified-sdk.md +2212 -0
- package/skills/taxonomy/amplitude-chart-dashboard-plan/SKILL.md +183 -0
- package/dist/src/ui/tui/screens/ChecklistScreen.d.ts +0 -12
- 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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
119
|
-
|
|
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
|
|
123
|
-
|
|
124
|
-
new Promise((resolve) => setTimeout(() => resolve(
|
|
182
|
+
const result = await Promise.race([
|
|
183
|
+
work(),
|
|
184
|
+
new Promise((resolve) => setTimeout(() => resolve('timeout'), timeoutMs)),
|
|
125
185
|
]);
|
|
126
|
-
if (
|
|
127
|
-
|
|
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
|
-
|
|
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
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
*
|
package/dist/src/ui/agent-ui.js
CHANGED
|
@@ -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
|
*
|
|
@@ -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
|
-
|
|
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] ?? [];
|
package/dist/src/ui/tui/flows.js
CHANGED
|
@@ -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.
|
|
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,
|
|
@@ -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
|
|
5
|
-
*
|
|
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
|
|
6
|
-
*
|
|
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
|
-
{
|
|
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 =
|
|
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
|
-
|
|
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;
|