@amplitude/wizard 1.0.0-beta.1 → 1.0.0-beta.5
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/README.md +171 -74
- package/dist/bin.js +376 -150
- package/dist/src/lib/agent-interface.js +64 -9
- package/dist/src/lib/agent-runner.js +1 -10
- package/dist/src/lib/api.d.ts +22 -4
- package/dist/src/lib/api.js +114 -12
- package/dist/src/lib/commandments.js +14 -1
- package/dist/src/lib/constants.d.ts +5 -4
- package/dist/src/lib/constants.js +11 -9
- package/dist/src/lib/credential-resolution.d.ts +45 -0
- package/dist/src/lib/credential-resolution.js +311 -0
- package/dist/src/lib/exit-codes.d.ts +10 -0
- package/dist/src/lib/exit-codes.js +12 -0
- package/dist/src/lib/feature-flags.d.ts +37 -0
- package/dist/src/lib/feature-flags.js +119 -0
- package/dist/src/lib/health-checks/statuspage.d.ts +1 -0
- package/dist/src/lib/health-checks/statuspage.js +5 -1
- package/dist/src/lib/mode-config.d.ts +14 -0
- package/dist/src/lib/mode-config.js +14 -0
- package/dist/src/lib/session-checkpoint.d.ts +27 -0
- package/dist/src/lib/session-checkpoint.js +134 -0
- package/dist/src/lib/wizard-session.d.ts +54 -1
- package/dist/src/lib/wizard-session.js +71 -14
- package/dist/src/lib/wizard-tools.js +19 -4
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +3 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js +6 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +3 -1
- package/dist/src/ui/agent-ui.d.ts +91 -0
- package/dist/src/ui/agent-ui.js +277 -0
- package/dist/src/ui/logging-ui.js +1 -1
- package/dist/src/ui/tui/App.d.ts +12 -0
- package/dist/src/ui/tui/App.js +29 -18
- package/dist/src/ui/tui/components/AmplitudeLogo.js +16 -17
- package/dist/src/ui/tui/components/AmplitudeTextLogo.d.ts +0 -2
- package/dist/src/ui/tui/components/AmplitudeTextLogo.js +53 -18
- package/dist/src/ui/tui/components/BrailleSpinner.d.ts +8 -0
- package/dist/src/ui/tui/components/BrailleSpinner.js +15 -0
- package/dist/src/ui/tui/components/ConsoleView.d.ts +8 -11
- package/dist/src/ui/tui/components/ConsoleView.js +52 -38
- package/dist/src/ui/tui/components/HeaderBar.d.ts +12 -0
- package/dist/src/ui/tui/components/HeaderBar.js +17 -0
- package/dist/src/ui/tui/components/JourneyStepper.d.ts +16 -0
- package/dist/src/ui/tui/components/JourneyStepper.js +83 -0
- package/dist/src/ui/tui/components/KeyHintBar.d.ts +19 -0
- package/dist/src/ui/tui/components/KeyHintBar.js +20 -0
- package/dist/src/ui/tui/console-commands.d.ts +1 -4
- package/dist/src/ui/tui/console-commands.js +48 -13
- package/dist/src/ui/tui/flows.d.ts +1 -1
- package/dist/src/ui/tui/flows.js +1 -1
- package/dist/src/ui/tui/hooks/useAsyncEffect.d.ts +15 -0
- package/dist/src/ui/tui/hooks/useAsyncEffect.js +35 -0
- package/dist/src/ui/tui/hooks/useWizardStore.d.ts +9 -0
- package/dist/src/ui/tui/hooks/useWizardStore.js +11 -0
- package/dist/src/ui/tui/ink-ui.js +1 -1
- package/dist/src/ui/tui/primitives/DissolveTransition.js +4 -5
- package/dist/src/ui/tui/primitives/EventPlanViewer.d.ts +3 -1
- package/dist/src/ui/tui/primitives/EventPlanViewer.js +8 -3
- package/dist/src/ui/tui/primitives/ProgressList.js +1 -1
- package/dist/src/ui/tui/primitives/SlashCommandInput.js +19 -4
- package/dist/src/ui/tui/primitives/SplitView.d.ts +2 -1
- package/dist/src/ui/tui/primitives/SplitView.js +10 -2
- package/dist/src/ui/tui/primitives/TabContainer.js +10 -2
- package/dist/src/ui/tui/primitives/index.d.ts +0 -1
- package/dist/src/ui/tui/primitives/index.js +0 -1
- package/dist/src/ui/tui/router.js +1 -1
- package/dist/src/ui/tui/screen-registry.d.ts +0 -7
- package/dist/src/ui/tui/screen-registry.js +13 -4
- package/dist/src/ui/tui/screens/ActivationOptionsScreen.d.ts +2 -2
- package/dist/src/ui/tui/screens/ActivationOptionsScreen.js +8 -8
- package/dist/src/ui/tui/screens/AuthScreen.d.ts +2 -1
- package/dist/src/ui/tui/screens/AuthScreen.js +144 -32
- package/dist/src/ui/tui/screens/ChecklistScreen.d.ts +2 -12
- package/dist/src/ui/tui/screens/ChecklistScreen.js +22 -33
- package/dist/src/ui/tui/screens/DataIngestionCheckScreen.d.ts +3 -12
- package/dist/src/ui/tui/screens/DataIngestionCheckScreen.js +114 -33
- package/dist/src/ui/tui/screens/DataSetupScreen.d.ts +3 -3
- package/dist/src/ui/tui/screens/DataSetupScreen.js +17 -10
- package/dist/src/ui/tui/screens/IntroScreen.d.ts +5 -3
- package/dist/src/ui/tui/screens/IntroScreen.js +132 -41
- package/dist/src/ui/tui/screens/LoginScreen.d.ts +1 -1
- package/dist/src/ui/tui/screens/LoginScreen.js +4 -4
- package/dist/src/ui/tui/screens/LogoutScreen.d.ts +4 -2
- package/dist/src/ui/tui/screens/LogoutScreen.js +17 -5
- package/dist/src/ui/tui/screens/McpScreen.d.ts +4 -4
- package/dist/src/ui/tui/screens/McpScreen.js +25 -17
- package/dist/src/ui/tui/screens/OutageScreen.d.ts +1 -1
- package/dist/src/ui/tui/screens/OutageScreen.js +5 -5
- package/dist/src/ui/tui/screens/OutroScreen.d.ts +5 -0
- package/dist/src/ui/tui/screens/OutroScreen.js +21 -15
- package/dist/src/ui/tui/screens/RegionSelectScreen.js +15 -13
- package/dist/src/ui/tui/screens/RunScreen.d.ts +7 -5
- package/dist/src/ui/tui/screens/RunScreen.js +102 -157
- package/dist/src/ui/tui/screens/SettingsOverrideScreen.d.ts +1 -1
- package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +6 -5
- package/dist/src/ui/tui/screens/SetupScreen.d.ts +1 -1
- package/dist/src/ui/tui/screens/SetupScreen.js +7 -7
- package/dist/src/ui/tui/screens/SlackScreen.d.ts +2 -7
- package/dist/src/ui/tui/screens/SlackScreen.js +60 -45
- package/dist/src/ui/tui/session-constants.d.ts +41 -0
- package/dist/src/ui/tui/session-constants.js +38 -0
- package/dist/src/ui/tui/start-tui.d.ts +3 -1
- package/dist/src/ui/tui/start-tui.js +14 -10
- package/dist/src/ui/tui/store.d.ts +5 -1
- package/dist/src/ui/tui/store.js +45 -6
- package/dist/src/ui/tui/styles.d.ts +75 -19
- package/dist/src/ui/tui/styles.js +101 -19
- package/dist/src/ui/tui/utils/classify-error.d.ts +14 -0
- package/dist/src/ui/tui/utils/classify-error.js +90 -0
- package/dist/src/ui/tui/utils/diagnostics.d.ts +21 -0
- package/dist/src/ui/tui/utils/diagnostics.js +72 -0
- package/dist/src/ui/tui/utils/with-retry.d.ts +12 -0
- package/dist/src/ui/tui/utils/with-retry.js +32 -0
- package/dist/src/ui/tui/utils/with-timeout.d.ts +10 -0
- package/dist/src/ui/tui/utils/with-timeout.js +24 -0
- package/dist/src/utils/ampli-settings.d.ts +1 -1
- package/dist/src/utils/ampli-settings.js +15 -5
- package/dist/src/utils/analytics.d.ts +18 -0
- package/dist/src/utils/analytics.js +35 -3
- package/dist/src/utils/api-key-store.js +5 -5
- package/dist/src/utils/atomic-write.d.ts +15 -0
- package/dist/src/utils/atomic-write.js +34 -0
- package/dist/src/utils/setup-utils.js +2 -2
- package/dist/src/utils/token-refresh.d.ts +22 -0
- package/dist/src/utils/token-refresh.js +79 -0
- package/dist/src/utils/wizard-abort.js +6 -1
- package/package.json +16 -17
- package/skills/instrumentation/add-analytics-instrumentation/SKILL.md +142 -0
- package/skills/instrumentation/diff-intake/SKILL.md +128 -0
- package/skills/instrumentation/discover-analytics-patterns/SKILL.md +185 -0
- package/skills/instrumentation/discover-event-surfaces/SKILL.md +322 -0
- package/skills/instrumentation/discover-event-surfaces/references/best-practices.md +563 -0
- package/skills/instrumentation/instrument-events/SKILL.md +169 -0
- package/skills/instrumentation/instrument-events/references/best-practices.md +563 -0
- package/skills/integration/integration-android/SKILL.md +49 -0
- package/skills/integration/integration-android/references/EXAMPLE.md +1977 -0
- package/skills/integration/integration-android/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-android/references/analytics.md +1778 -0
- package/skills/integration/integration-android/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-android/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-android/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-android/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-angular/SKILL.md +49 -0
- package/skills/integration/integration-angular/references/EXAMPLE.md +899 -0
- package/skills/integration/integration-angular/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-angular/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-angular/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-angular/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-angular/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-angular/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-astro-hybrid/SKILL.md +56 -0
- package/skills/integration/integration-astro-hybrid/references/EXAMPLE.md +1095 -0
- package/skills/integration/integration-astro-hybrid/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-astro-hybrid/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-astro-ssr/SKILL.md +52 -0
- package/skills/integration/integration-astro-ssr/references/EXAMPLE.md +1106 -0
- package/skills/integration/integration-astro-ssr/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-astro-ssr/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-astro-static/SKILL.md +49 -0
- package/skills/integration/integration-astro-static/references/EXAMPLE.md +910 -0
- package/skills/integration/integration-astro-static/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-astro-static/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-astro-static/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-astro-static/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-astro-static/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-astro-static/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-astro-view-transitions/SKILL.md +51 -0
- package/skills/integration/integration-astro-view-transitions/references/EXAMPLE.md +979 -0
- package/skills/integration/integration-astro-view-transitions/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-astro-view-transitions/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-django/SKILL.md +57 -0
- package/skills/integration/integration-django/references/EXAMPLE.md +1005 -0
- package/skills/integration/integration-django/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-django/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-django/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-django/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-django/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-django/references/python.md +1424 -0
- package/skills/integration/integration-expo/SKILL.md +53 -0
- package/skills/integration/integration-expo/references/EXAMPLE.md +1291 -0
- package/skills/integration/integration-expo/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-expo/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-expo/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-expo/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-expo/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-expo/references/react-native-sdk.md +2819 -0
- package/skills/integration/integration-fastapi/SKILL.md +57 -0
- package/skills/integration/integration-fastapi/references/EXAMPLE.md +1389 -0
- package/skills/integration/integration-fastapi/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-fastapi/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-fastapi/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-fastapi/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-fastapi/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-fastapi/references/python.md +1424 -0
- package/skills/integration/integration-flask/SKILL.md +56 -0
- package/skills/integration/integration-flask/references/EXAMPLE.md +1130 -0
- package/skills/integration/integration-flask/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-flask/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-flask/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-flask/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-flask/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-flask/references/python.md +1424 -0
- package/skills/integration/integration-javascript_node/SKILL.md +54 -0
- package/skills/integration/integration-javascript_node/references/EXAMPLE.md +365 -0
- package/skills/integration/integration-javascript_node/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-javascript_node/references/analytics.md +1778 -0
- package/skills/integration/integration-javascript_node/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-javascript_node/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-javascript_node/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-javascript_node/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-javascript_web/SKILL.md +58 -0
- package/skills/integration/integration-javascript_web/references/EXAMPLE.md +451 -0
- package/skills/integration/integration-javascript_web/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-javascript_web/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-javascript_web/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-javascript_web/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-javascript_web/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-javascript_web/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-laravel/SKILL.md +52 -0
- package/skills/integration/integration-laravel/references/EXAMPLE.md +2039 -0
- package/skills/integration/integration-laravel/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-laravel/references/analytics.md +1778 -0
- package/skills/integration/integration-laravel/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-laravel/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-laravel/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-laravel/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-nextjs-app-router/SKILL.md +54 -0
- package/skills/integration/integration-nextjs-app-router/references/EXAMPLE.md +673 -0
- package/skills/integration/integration-nextjs-app-router/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-nextjs-app-router/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-nextjs-pages-router/SKILL.md +54 -0
- package/skills/integration/integration-nextjs-pages-router/references/EXAMPLE.md +735 -0
- package/skills/integration/integration-nextjs-pages-router/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-nextjs-pages-router/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-nuxt-3.6/SKILL.md +46 -0
- package/skills/integration/integration-nuxt-3.6/references/EXAMPLE.md +8422 -0
- package/skills/integration/integration-nuxt-3.6/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-nuxt-3.6/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-nuxt-4/SKILL.md +46 -0
- package/skills/integration/integration-nuxt-4/references/EXAMPLE.md +8670 -0
- package/skills/integration/integration-nuxt-4/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-nuxt-4/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-python/SKILL.md +53 -0
- package/skills/integration/integration-python/references/EXAMPLE.md +445 -0
- package/skills/integration/integration-python/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-python/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-python/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-python/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-python/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-python/references/python.md +1424 -0
- package/skills/integration/integration-react-native/SKILL.md +49 -0
- package/skills/integration/integration-react-native/references/EXAMPLE.md +2253 -0
- package/skills/integration/integration-react-native/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-native/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-native/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-native/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-native/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-native/references/react-native-sdk.md +2819 -0
- package/skills/integration/integration-react-react-router-6/SKILL.md +53 -0
- package/skills/integration/integration-react-react-router-6/references/EXAMPLE.md +570 -0
- package/skills/integration/integration-react-react-router-6/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-react-router-6/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-react-router-7-data/SKILL.md +53 -0
- package/skills/integration/integration-react-react-router-7-data/references/EXAMPLE.md +830 -0
- package/skills/integration/integration-react-react-router-7-data/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-react-router-7-data/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-react-router-7-declarative/SKILL.md +53 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/EXAMPLE.md +609 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-react-router-7-framework/SKILL.md +53 -0
- package/skills/integration/integration-react-react-router-7-framework/references/EXAMPLE.md +1081 -0
- package/skills/integration/integration-react-react-router-7-framework/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-react-router-7-framework/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-tanstack-router-code-based/SKILL.md +57 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/EXAMPLE.md +659 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-tanstack-router-file-based/SKILL.md +57 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/EXAMPLE.md +777 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-vite/SKILL.md +53 -0
- package/skills/integration/integration-react-vite/references/EXAMPLE.md +542 -0
- package/skills/integration/integration-react-vite/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-vite/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-vite/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-vite/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-vite/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-vite/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-ruby/SKILL.md +50 -0
- package/skills/integration/integration-ruby/references/EXAMPLE.md +420 -0
- package/skills/integration/integration-ruby/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-ruby/references/analytics.md +1778 -0
- package/skills/integration/integration-ruby/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-ruby/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-ruby/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-ruby/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-ruby-on-rails/SKILL.md +55 -0
- package/skills/integration/integration-ruby-on-rails/references/EXAMPLE.md +1013 -0
- package/skills/integration/integration-ruby-on-rails/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-ruby-on-rails/references/analytics.md +1778 -0
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-sveltekit/SKILL.md +47 -0
- package/skills/integration/integration-sveltekit/references/EXAMPLE.md +14121 -0
- package/skills/integration/integration-sveltekit/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-sveltekit/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-sveltekit/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-sveltekit/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-sveltekit/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-sveltekit/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-swift/SKILL.md +49 -0
- package/skills/integration/integration-swift/references/EXAMPLE.md +660 -0
- package/skills/integration/integration-swift/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-swift/references/analytics.md +1778 -0
- package/skills/integration/integration-swift/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-swift/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-swift/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-swift/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-tanstack-start/SKILL.md +58 -0
- package/skills/integration/integration-tanstack-start/references/EXAMPLE.md +998 -0
- package/skills/integration/integration-tanstack-start/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-tanstack-start/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-vue-3/SKILL.md +46 -0
- package/skills/integration/integration-vue-3/references/EXAMPLE.md +846 -0
- package/skills/integration/integration-vue-3/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-vue-3/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-vue-3/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-vue-3/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-vue-3/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-vue-3/references/browser-sdk-2.md +4680 -0
- package/skills/taxonomy/amplitude-quickstart-taxonomy-agent/SKILL.md +228 -0
- package/dist/package.json +0 -145
- package/dist/src/ui/tui/components/TitleBar.d.ts +0 -6
- package/dist/src/ui/tui/components/TitleBar.js +0 -16
- package/dist/src/ui/tui/primitives/KagiSmallWebViewer.d.ts +0 -7
- package/dist/src/ui/tui/primitives/KagiSmallWebViewer.js +0 -101
- package/dist/src/utils/anthropic-status.d.ts +0 -17
- package/dist/src/utils/anthropic-status.js +0 -51
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Credential resolution — shared between TUI, agent, and CI modes.
|
|
4
|
+
*
|
|
5
|
+
* Reads stored OAuth tokens, refreshes them if needed, fetches the user's
|
|
6
|
+
* org/workspace/environment list, and populates session credentials when
|
|
7
|
+
* possible. When multiple environments exist, populates `pendingOrgs` so
|
|
8
|
+
* the caller (TUI AuthScreen or AgentUI NDJSON prompt) can handle selection.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.resolveCredentials = resolveCredentials;
|
|
12
|
+
exports.resolveEnvironmentSelection = resolveEnvironmentSelection;
|
|
13
|
+
/**
|
|
14
|
+
* Resolve credentials from stored OAuth tokens and environment data.
|
|
15
|
+
*
|
|
16
|
+
* Mutates `session` in place:
|
|
17
|
+
* - Sets `session.credentials` when a single environment or local key is found
|
|
18
|
+
* - Sets `session.pendingOrgs` + `pendingAuthIdToken` + `pendingAuthAccessToken`
|
|
19
|
+
* when multiple environments exist (caller must handle selection)
|
|
20
|
+
* - Sets `session.apiKeyNotice` when auto-fetch fails
|
|
21
|
+
*
|
|
22
|
+
* Skips entirely when `session.apiKey` is already set (--api-key flag) or
|
|
23
|
+
* `session.credentials` is already populated.
|
|
24
|
+
*/
|
|
25
|
+
async function resolveCredentials(session, options) {
|
|
26
|
+
// Already have credentials (e.g. from --api-key flag)
|
|
27
|
+
if (session.credentials || session.apiKey)
|
|
28
|
+
return;
|
|
29
|
+
const installDir = session.installDir;
|
|
30
|
+
const [{ getStoredUser, getStoredToken }, { readAmpliConfig }, { getAPIKey }, { getHostFromRegion }, { logToFile }, { persistApiKey, readApiKeyWithSource },] = await Promise.all([
|
|
31
|
+
import('../utils/ampli-settings.js'),
|
|
32
|
+
import('./ampli-config.js'),
|
|
33
|
+
import('../utils/get-api-key.js'),
|
|
34
|
+
import('../utils/urls.js'),
|
|
35
|
+
import('../utils/debug.js'),
|
|
36
|
+
import('../utils/api-key-store.js'),
|
|
37
|
+
]);
|
|
38
|
+
// Resolve zone from stored user and project config
|
|
39
|
+
const storedUser = getStoredUser();
|
|
40
|
+
const realUser = storedUser && storedUser.id !== 'pending' ? storedUser : null;
|
|
41
|
+
if (realUser?.email) {
|
|
42
|
+
session.userEmail = realUser.email;
|
|
43
|
+
}
|
|
44
|
+
const projectConfig = readAmpliConfig(installDir);
|
|
45
|
+
const projectZone = projectConfig.ok ? projectConfig.config.Zone : undefined;
|
|
46
|
+
// Checkpoint region wins (user explicitly changed via /region),
|
|
47
|
+
// then project config, then global user zone.
|
|
48
|
+
const zone = (session._restoredFromCheckpoint ? session.region : null) ??
|
|
49
|
+
projectZone ??
|
|
50
|
+
realUser?.zone ??
|
|
51
|
+
null;
|
|
52
|
+
if (zone) {
|
|
53
|
+
session.region = zone;
|
|
54
|
+
}
|
|
55
|
+
// Try to resolve credentials from a stored OAuth token
|
|
56
|
+
if (zone) {
|
|
57
|
+
const storedToken = realUser
|
|
58
|
+
? getStoredToken(realUser.id, realUser.zone)
|
|
59
|
+
: getStoredToken(undefined, zone);
|
|
60
|
+
if (storedToken) {
|
|
61
|
+
// Silent token refresh
|
|
62
|
+
const { tryRefreshToken } = await import('../utils/token-refresh.js');
|
|
63
|
+
const expiresAtMs = new Date(storedToken.expiresAt).getTime();
|
|
64
|
+
const refreshResult = await tryRefreshToken({
|
|
65
|
+
accessToken: storedToken.accessToken,
|
|
66
|
+
refreshToken: storedToken.refreshToken,
|
|
67
|
+
expiresAt: expiresAtMs,
|
|
68
|
+
}, zone);
|
|
69
|
+
if (refreshResult) {
|
|
70
|
+
const { storeToken } = await import('../utils/ampli-settings.js');
|
|
71
|
+
if (realUser) {
|
|
72
|
+
storeToken(realUser, {
|
|
73
|
+
...storedToken,
|
|
74
|
+
accessToken: refreshResult.accessToken,
|
|
75
|
+
expiresAt: new Date(refreshResult.expiresAt).toISOString(),
|
|
76
|
+
// Persist rotated refresh token if the server issued one
|
|
77
|
+
...(refreshResult.refreshToken
|
|
78
|
+
? { refreshToken: refreshResult.refreshToken }
|
|
79
|
+
: {}),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
storedToken.accessToken = refreshResult.accessToken;
|
|
83
|
+
if (refreshResult.refreshToken) {
|
|
84
|
+
storedToken.refreshToken = refreshResult.refreshToken;
|
|
85
|
+
}
|
|
86
|
+
logToFile('[credential-resolution] silently refreshed expired access token');
|
|
87
|
+
}
|
|
88
|
+
// Check local storage first — if a key is already persisted
|
|
89
|
+
// for this install dir, use it without fetching user data.
|
|
90
|
+
const localKey = readApiKeyWithSource(installDir);
|
|
91
|
+
if (localKey) {
|
|
92
|
+
logToFile('[credential-resolution] using locally stored API key');
|
|
93
|
+
session.credentials = {
|
|
94
|
+
accessToken: storedToken.accessToken,
|
|
95
|
+
idToken: storedToken.idToken,
|
|
96
|
+
projectApiKey: localKey.key,
|
|
97
|
+
host: getHostFromRegion(zone),
|
|
98
|
+
projectId: 0,
|
|
99
|
+
};
|
|
100
|
+
session.activationLevel = 'none';
|
|
101
|
+
session.projectHasData = false;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
// Fetch user data to check how many environments are available.
|
|
105
|
+
const { fetchAmplitudeUser } = await import('./api.js');
|
|
106
|
+
try {
|
|
107
|
+
const userInfo = await fetchAmplitudeUser(storedToken.idToken, zone);
|
|
108
|
+
const workspaceId = session.selectedWorkspaceId ?? undefined;
|
|
109
|
+
// Find the relevant workspace and its environments
|
|
110
|
+
let envsWithKey = [];
|
|
111
|
+
for (const org of userInfo.orgs) {
|
|
112
|
+
const ws = workspaceId
|
|
113
|
+
? org.workspaces.find((w) => w.id === workspaceId)
|
|
114
|
+
: org.workspaces[0];
|
|
115
|
+
if (ws?.environments) {
|
|
116
|
+
envsWithKey = ws.environments
|
|
117
|
+
.filter((env) => env.app?.apiKey)
|
|
118
|
+
.sort((a, b) => a.rank - b.rank);
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// If --env flag was provided, try to match across all orgs/workspaces
|
|
123
|
+
if (options?.env) {
|
|
124
|
+
const envMatch = options.env.toLowerCase();
|
|
125
|
+
const orgFilter = options.org?.toLowerCase();
|
|
126
|
+
for (const org of userInfo.orgs) {
|
|
127
|
+
if (orgFilter && !org.name.toLowerCase().includes(orgFilter)) {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
for (const ws of org.workspaces) {
|
|
131
|
+
const matchedEnv = (ws.environments ?? []).find((e) => e.app?.apiKey && e.name.toLowerCase() === envMatch);
|
|
132
|
+
if (matchedEnv?.app?.apiKey) {
|
|
133
|
+
const apiKey = matchedEnv.app.apiKey;
|
|
134
|
+
session.selectedOrgId = org.id;
|
|
135
|
+
session.selectedOrgName = org.name;
|
|
136
|
+
session.selectedWorkspaceId = ws.id;
|
|
137
|
+
session.selectedWorkspaceName = ws.name;
|
|
138
|
+
session.selectedProjectName = matchedEnv.name;
|
|
139
|
+
if (!session.userEmail && userInfo.email) {
|
|
140
|
+
session.userEmail = userInfo.email;
|
|
141
|
+
}
|
|
142
|
+
logToFile(`[credential-resolution] --env matched: ${org.name} / ${ws.name} / ${matchedEnv.name}`);
|
|
143
|
+
persistApiKey(apiKey, installDir);
|
|
144
|
+
session.credentials = {
|
|
145
|
+
accessToken: storedToken.accessToken,
|
|
146
|
+
idToken: storedToken.idToken,
|
|
147
|
+
projectApiKey: apiKey,
|
|
148
|
+
host: getHostFromRegion(zone),
|
|
149
|
+
projectId: 0,
|
|
150
|
+
};
|
|
151
|
+
session.activationLevel = 'none';
|
|
152
|
+
session.projectHasData = false;
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (session.credentials)
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
if (!session.credentials) {
|
|
160
|
+
logToFile(`[credential-resolution] --env "${options.env}" did not match any environment`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else if (envsWithKey.length === 1) {
|
|
164
|
+
// Single environment — auto-select
|
|
165
|
+
const apiKey = envsWithKey[0].app.apiKey;
|
|
166
|
+
session.selectedProjectName = envsWithKey[0].name;
|
|
167
|
+
// Populate org/workspace names
|
|
168
|
+
for (const org of userInfo.orgs) {
|
|
169
|
+
const ws = workspaceId
|
|
170
|
+
? org.workspaces.find((w) => w.id === workspaceId)
|
|
171
|
+
: org.workspaces[0];
|
|
172
|
+
if (ws?.environments?.some((e) => e.app?.apiKey === apiKey)) {
|
|
173
|
+
session.selectedOrgId = org.id;
|
|
174
|
+
session.selectedOrgName = org.name;
|
|
175
|
+
session.selectedWorkspaceId = ws.id;
|
|
176
|
+
session.selectedWorkspaceName = ws.name;
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (!session.userEmail && userInfo.email) {
|
|
181
|
+
session.userEmail = userInfo.email;
|
|
182
|
+
}
|
|
183
|
+
logToFile('[credential-resolution] single environment — auto-selecting API key');
|
|
184
|
+
persistApiKey(apiKey, installDir);
|
|
185
|
+
session.credentials = {
|
|
186
|
+
accessToken: storedToken.accessToken,
|
|
187
|
+
idToken: storedToken.idToken,
|
|
188
|
+
projectApiKey: apiKey,
|
|
189
|
+
host: getHostFromRegion(zone),
|
|
190
|
+
projectId: 0,
|
|
191
|
+
};
|
|
192
|
+
session.activationLevel = 'none';
|
|
193
|
+
session.projectHasData = false;
|
|
194
|
+
}
|
|
195
|
+
else if (envsWithKey.length > 1) {
|
|
196
|
+
// Multiple environments — defer to caller for selection
|
|
197
|
+
logToFile(`[credential-resolution] ${envsWithKey.length} environments found — deferring to project picker`);
|
|
198
|
+
session.pendingOrgs = userInfo.orgs;
|
|
199
|
+
session.pendingAuthIdToken = storedToken.idToken;
|
|
200
|
+
session.pendingAuthAccessToken = storedToken.accessToken;
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
logToFile('[credential-resolution] no environments with API keys — showing apiKeyNotice');
|
|
204
|
+
session.apiKeyNotice =
|
|
205
|
+
"Your API key couldn't be fetched automatically. " +
|
|
206
|
+
'Only organization admins can access project API keys — ' +
|
|
207
|
+
'if you need one, ask an admin to share it with you.';
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
logToFile(`[credential-resolution] fetchAmplitudeUser failed: ${err instanceof Error ? err.message : 'unknown'}`);
|
|
212
|
+
// Fall back to getAPIKey for backward compatibility
|
|
213
|
+
const projectApiKey = await getAPIKey({
|
|
214
|
+
installDir,
|
|
215
|
+
idToken: storedToken.idToken,
|
|
216
|
+
zone: zone,
|
|
217
|
+
workspaceId: session.selectedWorkspaceId ?? undefined,
|
|
218
|
+
});
|
|
219
|
+
if (projectApiKey) {
|
|
220
|
+
persistApiKey(projectApiKey, installDir);
|
|
221
|
+
session.credentials = {
|
|
222
|
+
accessToken: storedToken.accessToken,
|
|
223
|
+
idToken: storedToken.idToken,
|
|
224
|
+
projectApiKey,
|
|
225
|
+
host: getHostFromRegion(zone),
|
|
226
|
+
projectId: 0,
|
|
227
|
+
};
|
|
228
|
+
session.activationLevel = 'none';
|
|
229
|
+
session.projectHasData = false;
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
session.apiKeyNotice =
|
|
233
|
+
"Your API key couldn't be fetched automatically. " +
|
|
234
|
+
'Only organization admins can access project API keys — ' +
|
|
235
|
+
'if you need one, ask an admin to share it with you.';
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Pre-populate org/workspace from ampli.json so activation checks
|
|
242
|
+
// have the IDs they need even when the SUSI flow was skipped.
|
|
243
|
+
if (!session.selectedOrgId &&
|
|
244
|
+
projectConfig.ok &&
|
|
245
|
+
projectConfig.config.OrgId) {
|
|
246
|
+
session.selectedOrgId = String(projectConfig.config.OrgId);
|
|
247
|
+
}
|
|
248
|
+
if (!session.selectedWorkspaceId &&
|
|
249
|
+
projectConfig.ok &&
|
|
250
|
+
projectConfig.config.WorkspaceId) {
|
|
251
|
+
session.selectedWorkspaceId = projectConfig.config.WorkspaceId;
|
|
252
|
+
}
|
|
253
|
+
// Safety check: in TUI mode, clear credentials if no org/workspace ID
|
|
254
|
+
// so AuthScreen can force selection. In agent/CI mode, a local API key
|
|
255
|
+
// is sufficient — skip this check.
|
|
256
|
+
if (options?.requireOrgId !== false &&
|
|
257
|
+
session.credentials !== null &&
|
|
258
|
+
!session.selectedOrgId &&
|
|
259
|
+
!session.pendingOrgs) {
|
|
260
|
+
logToFile('[credential-resolution] credentials set but no org/workspace — clearing to force AuthScreen');
|
|
261
|
+
session.credentials = null;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Resolve environment selection from pendingOrgs.
|
|
266
|
+
*
|
|
267
|
+
* Given a selected org ID, workspace ID, and environment name,
|
|
268
|
+
* populates session.credentials from the matching environment.
|
|
269
|
+
* Returns true if credentials were populated.
|
|
270
|
+
*/
|
|
271
|
+
async function resolveEnvironmentSelection(session, selection) {
|
|
272
|
+
if (!session.pendingOrgs)
|
|
273
|
+
return false;
|
|
274
|
+
const { getHostFromRegion } = await import('../utils/urls.js');
|
|
275
|
+
const { persistApiKey } = await import('../utils/api-key-store.js');
|
|
276
|
+
const { logToFile } = await import('../utils/debug.js');
|
|
277
|
+
const org = session.pendingOrgs.find((o) => o.id === selection.orgId);
|
|
278
|
+
if (!org) {
|
|
279
|
+
logToFile(`[credential-resolution] org not found: ${selection.orgId}`);
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
const ws = org.workspaces.find((w) => w.id === selection.workspaceId);
|
|
283
|
+
if (!ws) {
|
|
284
|
+
logToFile(`[credential-resolution] workspace not found: ${selection.workspaceId}`);
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
const env = ws.environments?.find((e) => e.name.toLowerCase() === selection.env.toLowerCase());
|
|
288
|
+
if (!env?.app?.apiKey) {
|
|
289
|
+
logToFile(`[credential-resolution] environment not found or has no API key: ${selection.env}`);
|
|
290
|
+
return false;
|
|
291
|
+
}
|
|
292
|
+
const zone = (session.region ?? 'us');
|
|
293
|
+
const apiKey = env.app.apiKey;
|
|
294
|
+
session.selectedOrgId = org.id;
|
|
295
|
+
session.selectedOrgName = org.name;
|
|
296
|
+
session.selectedWorkspaceId = ws.id;
|
|
297
|
+
session.selectedWorkspaceName = ws.name;
|
|
298
|
+
session.selectedProjectName = env.name;
|
|
299
|
+
persistApiKey(apiKey, session.installDir);
|
|
300
|
+
session.credentials = {
|
|
301
|
+
accessToken: session.pendingAuthAccessToken ?? '',
|
|
302
|
+
idToken: session.pendingAuthIdToken ?? undefined,
|
|
303
|
+
projectApiKey: apiKey,
|
|
304
|
+
host: getHostFromRegion(zone),
|
|
305
|
+
projectId: 0,
|
|
306
|
+
};
|
|
307
|
+
session.activationLevel = 'none';
|
|
308
|
+
session.projectHasData = false;
|
|
309
|
+
logToFile(`[credential-resolution] resolved environment: ${org.name} / ${ws.name} / ${env.name}`);
|
|
310
|
+
return true;
|
|
311
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const ExitCode: {
|
|
2
|
+
readonly SUCCESS: 0;
|
|
3
|
+
readonly GENERAL_ERROR: 1;
|
|
4
|
+
readonly INVALID_ARGS: 2;
|
|
5
|
+
readonly AUTH_REQUIRED: 3;
|
|
6
|
+
readonly NETWORK_ERROR: 4;
|
|
7
|
+
readonly AGENT_FAILED: 10;
|
|
8
|
+
readonly USER_CANCELLED: 130;
|
|
9
|
+
};
|
|
10
|
+
export type ExitCode = (typeof ExitCode)[keyof typeof ExitCode];
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ExitCode = void 0;
|
|
4
|
+
exports.ExitCode = {
|
|
5
|
+
SUCCESS: 0,
|
|
6
|
+
GENERAL_ERROR: 1,
|
|
7
|
+
INVALID_ARGS: 2,
|
|
8
|
+
AUTH_REQUIRED: 3,
|
|
9
|
+
NETWORK_ERROR: 4,
|
|
10
|
+
AGENT_FAILED: 10,
|
|
11
|
+
USER_CANCELLED: 130,
|
|
12
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature flags powered by Amplitude Experiment (server-side local evaluation).
|
|
3
|
+
*
|
|
4
|
+
* Flags are fetched once at startup via `initFeatureFlags()` and evaluated
|
|
5
|
+
* synchronously thereafter — no per-check network calls.
|
|
6
|
+
*/
|
|
7
|
+
/** Gate for the LLM analytics additional-feature flow. */
|
|
8
|
+
export declare const FLAG_LLM_ANALYTICS = "wizard-llm-analytics";
|
|
9
|
+
/** Gate for agent-level analytics / telemetry instrumented by the wizard. */
|
|
10
|
+
export declare const FLAG_AGENT_ANALYTICS = "wizard-agent-analytics";
|
|
11
|
+
/**
|
|
12
|
+
* Initialize the Experiment local-evaluation client and pre-fetch flag configs.
|
|
13
|
+
* Safe to call multiple times — subsequent calls are no-ops.
|
|
14
|
+
*
|
|
15
|
+
* @param userId Optional user ID for targeted flag evaluation.
|
|
16
|
+
* @param deviceId Optional device ID for targeted flag evaluation.
|
|
17
|
+
*/
|
|
18
|
+
export declare function initFeatureFlags(userId?: string, deviceId?: string): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Evaluate a single feature flag. Returns the string variant value,
|
|
21
|
+
* or `undefined` if the flag is not set / client not initialized.
|
|
22
|
+
*/
|
|
23
|
+
export declare function getFlag(flagKey: string): string | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Check whether a flag is enabled (variant is `'on'` or `'true'`).
|
|
26
|
+
* Returns `false` when the flag is absent or the client is not initialized.
|
|
27
|
+
*/
|
|
28
|
+
export declare function isFlagEnabled(flagKey: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Return a snapshot of all evaluated flags (key -> string value).
|
|
31
|
+
*/
|
|
32
|
+
export declare function getAllFlags(): Record<string, string>;
|
|
33
|
+
/**
|
|
34
|
+
* Re-evaluate flags for a specific user (e.g. after login).
|
|
35
|
+
* Updates the cached flags in place.
|
|
36
|
+
*/
|
|
37
|
+
export declare function refreshFlags(userId?: string, deviceId?: string): Promise<void>;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Feature flags powered by Amplitude Experiment (server-side local evaluation).
|
|
4
|
+
*
|
|
5
|
+
* Flags are fetched once at startup via `initFeatureFlags()` and evaluated
|
|
6
|
+
* synchronously thereafter — no per-check network calls.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.FLAG_AGENT_ANALYTICS = exports.FLAG_LLM_ANALYTICS = void 0;
|
|
10
|
+
exports.initFeatureFlags = initFeatureFlags;
|
|
11
|
+
exports.getFlag = getFlag;
|
|
12
|
+
exports.isFlagEnabled = isFlagEnabled;
|
|
13
|
+
exports.getAllFlags = getAllFlags;
|
|
14
|
+
exports.refreshFlags = refreshFlags;
|
|
15
|
+
const experiment_node_server_1 = require("@amplitude/experiment-node-server");
|
|
16
|
+
const debug_1 = require("../utils/debug");
|
|
17
|
+
// ── Flag keys ────────────────────────────────────────────────────────
|
|
18
|
+
/** Gate for the LLM analytics additional-feature flow. */
|
|
19
|
+
exports.FLAG_LLM_ANALYTICS = 'wizard-llm-analytics';
|
|
20
|
+
/** Gate for agent-level analytics / telemetry instrumented by the wizard. */
|
|
21
|
+
exports.FLAG_AGENT_ANALYTICS = 'wizard-agent-analytics';
|
|
22
|
+
// ── Deployment key ───────────────────────────────────────────────────
|
|
23
|
+
/**
|
|
24
|
+
* Server deployment key for local evaluation.
|
|
25
|
+
* Override with `AMPLITUDE_EXPERIMENT_DEPLOYMENT_KEY` env var.
|
|
26
|
+
*/
|
|
27
|
+
const DEFAULT_DEPLOYMENT_KEY = 'server-YOTsk4MS1RWzLyIf1DmvNDUsdOGqkRdM';
|
|
28
|
+
function resolveDeploymentKey() {
|
|
29
|
+
const fromEnv = process.env.AMPLITUDE_EXPERIMENT_DEPLOYMENT_KEY;
|
|
30
|
+
return (fromEnv ?? DEFAULT_DEPLOYMENT_KEY).trim();
|
|
31
|
+
}
|
|
32
|
+
// ── Singleton client ─────────────────────────────────────────────────
|
|
33
|
+
let client = null;
|
|
34
|
+
let cachedFlags = {};
|
|
35
|
+
/**
|
|
36
|
+
* Initialize the Experiment local-evaluation client and pre-fetch flag configs.
|
|
37
|
+
* Safe to call multiple times — subsequent calls are no-ops.
|
|
38
|
+
*
|
|
39
|
+
* @param userId Optional user ID for targeted flag evaluation.
|
|
40
|
+
* @param deviceId Optional device ID for targeted flag evaluation.
|
|
41
|
+
*/
|
|
42
|
+
async function initFeatureFlags(userId, deviceId) {
|
|
43
|
+
if (client)
|
|
44
|
+
return; // already initialized
|
|
45
|
+
const deploymentKey = resolveDeploymentKey();
|
|
46
|
+
if (!deploymentKey) {
|
|
47
|
+
(0, debug_1.debug)('feature-flags: no deployment key — all flags default to off');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
client = experiment_node_server_1.Experiment.initializeLocal(deploymentKey);
|
|
52
|
+
await client.start();
|
|
53
|
+
const user = {};
|
|
54
|
+
if (userId)
|
|
55
|
+
user.user_id = userId;
|
|
56
|
+
if (deviceId)
|
|
57
|
+
user.device_id = deviceId;
|
|
58
|
+
const variants = client.evaluateV2(user);
|
|
59
|
+
for (const [key, variant] of Object.entries(variants)) {
|
|
60
|
+
if (variant.value !== undefined && variant.value !== null) {
|
|
61
|
+
cachedFlags[key] = String(variant.value);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
(0, debug_1.debug)('feature-flags: initialized with flags', cachedFlags);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
(0, debug_1.debug)('feature-flags: initialization failed, defaulting all flags off', err);
|
|
68
|
+
client = null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Evaluate a single feature flag. Returns the string variant value,
|
|
73
|
+
* or `undefined` if the flag is not set / client not initialized.
|
|
74
|
+
*/
|
|
75
|
+
function getFlag(flagKey) {
|
|
76
|
+
return cachedFlags[flagKey];
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Check whether a flag is enabled (variant is `'on'` or `'true'`).
|
|
80
|
+
* Returns `false` when the flag is absent or the client is not initialized.
|
|
81
|
+
*/
|
|
82
|
+
function isFlagEnabled(flagKey) {
|
|
83
|
+
const value = cachedFlags[flagKey];
|
|
84
|
+
return value === 'on' || value === 'true';
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Return a snapshot of all evaluated flags (key -> string value).
|
|
88
|
+
*/
|
|
89
|
+
function getAllFlags() {
|
|
90
|
+
return { ...cachedFlags };
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Re-evaluate flags for a specific user (e.g. after login).
|
|
94
|
+
* Updates the cached flags in place.
|
|
95
|
+
*/
|
|
96
|
+
async function refreshFlags(userId, deviceId) {
|
|
97
|
+
if (!client)
|
|
98
|
+
return;
|
|
99
|
+
try {
|
|
100
|
+
// Re-fetch flag configs in case they changed
|
|
101
|
+
await client.start();
|
|
102
|
+
const user = {};
|
|
103
|
+
if (userId)
|
|
104
|
+
user.user_id = userId;
|
|
105
|
+
if (deviceId)
|
|
106
|
+
user.device_id = deviceId;
|
|
107
|
+
const variants = client.evaluateV2(user);
|
|
108
|
+
cachedFlags = {};
|
|
109
|
+
for (const [key, variant] of Object.entries(variants)) {
|
|
110
|
+
if (variant.value !== undefined && variant.value !== null) {
|
|
111
|
+
cachedFlags[key] = String(variant.value);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
(0, debug_1.debug)('feature-flags: refreshed flags', cachedFlags);
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
(0, debug_1.debug)('feature-flags: refresh failed', err);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type BaseHealthResult, type ComponentHealthResult } from './types';
|
|
2
|
+
/** Model provider health — no-op, wizard uses Vertex AI via proxy. */
|
|
2
3
|
export declare const checkAnthropicHealth: () => Promise<BaseHealthResult>;
|
|
3
4
|
export declare const checkAmplitudeOverallHealth: () => Promise<BaseHealthResult>;
|
|
4
5
|
export declare const checkAmplitudeComponentHealth: () => Promise<ComponentHealthResult>;
|
|
@@ -86,7 +86,11 @@ async function fetchStatuspageSummary(url, timeoutMs = 5000) {
|
|
|
86
86
|
// ---------------------------------------------------------------------------
|
|
87
87
|
// Individual statuspage-backed checks
|
|
88
88
|
// ---------------------------------------------------------------------------
|
|
89
|
-
|
|
89
|
+
/** Model provider health — no-op, wizard uses Vertex AI via proxy. */
|
|
90
|
+
const checkAnthropicHealth = () => Promise.resolve({
|
|
91
|
+
status: types_1.ServiceHealthStatus.Healthy,
|
|
92
|
+
pageUrl: '',
|
|
93
|
+
});
|
|
90
94
|
exports.checkAnthropicHealth = checkAnthropicHealth;
|
|
91
95
|
const checkAmplitudeOverallHealth = () => fetchStatuspageIndicator('https://www.amplitudestatus.com/api/v2/status.json');
|
|
92
96
|
exports.checkAmplitudeOverallHealth = checkAmplitudeOverallHealth;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type ExecutionMode = 'interactive' | 'ci' | 'agent';
|
|
2
|
+
export interface ModeConfig {
|
|
3
|
+
mode: ExecutionMode;
|
|
4
|
+
autoApprove: boolean;
|
|
5
|
+
jsonOutput: boolean;
|
|
6
|
+
quiet: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function resolveMode(opts: {
|
|
9
|
+
ci?: boolean;
|
|
10
|
+
yes?: boolean;
|
|
11
|
+
agent?: boolean;
|
|
12
|
+
json?: boolean;
|
|
13
|
+
isTTY: boolean;
|
|
14
|
+
}): ModeConfig;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveMode = resolveMode;
|
|
4
|
+
function resolveMode(opts) {
|
|
5
|
+
const isAgent = Boolean(opts.agent);
|
|
6
|
+
const autoApprove = Boolean(opts.yes) || Boolean(opts.ci) || isAgent;
|
|
7
|
+
const isInteractive = !autoApprove && opts.isTTY;
|
|
8
|
+
return {
|
|
9
|
+
mode: isAgent ? 'agent' : isInteractive ? 'interactive' : 'ci',
|
|
10
|
+
autoApprove,
|
|
11
|
+
jsonOutput: opts.json ?? isAgent,
|
|
12
|
+
quiet: !opts.isTTY,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session checkpointing — persist enough wizard state to resume after a crash.
|
|
3
|
+
*
|
|
4
|
+
* Saves a sanitized snapshot (no credentials/tokens) to a temp file.
|
|
5
|
+
* On restart the wizard can load it to skip already-completed setup steps
|
|
6
|
+
* (intro, region, auth selections) while still re-running the agent.
|
|
7
|
+
*/
|
|
8
|
+
import type { WizardSession } from './wizard-session';
|
|
9
|
+
/**
|
|
10
|
+
* Write a sanitized session snapshot to disk.
|
|
11
|
+
* Strips credentials and any fields that should be re-evaluated on resume.
|
|
12
|
+
*/
|
|
13
|
+
export declare function saveCheckpoint(session: WizardSession): void;
|
|
14
|
+
/**
|
|
15
|
+
* Load a checkpoint if one exists, is fresh, and matches the given install dir.
|
|
16
|
+
*
|
|
17
|
+
* Returns a partial session (only the checkpointed fields) or null when:
|
|
18
|
+
* - no checkpoint file exists
|
|
19
|
+
* - the checkpoint is older than 24 hours
|
|
20
|
+
* - the checkpoint belongs to a different project directory
|
|
21
|
+
* - the file is malformed or fails validation
|
|
22
|
+
*/
|
|
23
|
+
export declare function loadCheckpoint(installDir: string): Partial<WizardSession> | null;
|
|
24
|
+
/**
|
|
25
|
+
* Delete the checkpoint file. Call on successful wizard completion.
|
|
26
|
+
*/
|
|
27
|
+
export declare function clearCheckpoint(installDir: string): void;
|