@amplitude/wizard 1.0.0-beta.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 +47 -0
- package/README.md +119 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +763 -0
- package/dist/package.json +144 -0
- package/dist/src/frameworks/android/android-wizard-agent.d.ts +6 -0
- package/dist/src/frameworks/android/android-wizard-agent.js +72 -0
- package/dist/src/frameworks/android/utils.d.ts +11 -0
- package/dist/src/frameworks/android/utils.js +32 -0
- package/dist/src/frameworks/django/django-wizard-agent.d.ts +8 -0
- package/dist/src/frameworks/django/django-wizard-agent.js +171 -0
- package/dist/src/frameworks/django/utils.d.ts +31 -0
- package/dist/src/frameworks/django/utils.js +305 -0
- package/dist/src/frameworks/fastapi/fastapi-wizard-agent.d.ts +11 -0
- package/dist/src/frameworks/fastapi/fastapi-wizard-agent.js +189 -0
- package/dist/src/frameworks/fastapi/utils.d.ts +26 -0
- package/dist/src/frameworks/fastapi/utils.js +257 -0
- package/dist/src/frameworks/flask/flask-wizard-agent.d.ts +8 -0
- package/dist/src/frameworks/flask/flask-wizard-agent.js +177 -0
- package/dist/src/frameworks/flask/utils.d.ts +28 -0
- package/dist/src/frameworks/flask/utils.js +343 -0
- package/dist/src/frameworks/flutter/flutter-wizard-agent.d.ts +4 -0
- package/dist/src/frameworks/flutter/flutter-wizard-agent.js +57 -0
- package/dist/src/frameworks/flutter/utils.d.ts +7 -0
- package/dist/src/frameworks/flutter/utils.js +64 -0
- package/dist/src/frameworks/generic/generic-wizard-agent.d.ts +2 -0
- package/dist/src/frameworks/generic/generic-wizard-agent.js +176 -0
- package/dist/src/frameworks/go/go-wizard-agent.d.ts +4 -0
- package/dist/src/frameworks/go/go-wizard-agent.js +57 -0
- package/dist/src/frameworks/go/utils.d.ts +5 -0
- package/dist/src/frameworks/go/utils.js +44 -0
- package/dist/src/frameworks/java/java-wizard-agent.d.ts +7 -0
- package/dist/src/frameworks/java/java-wizard-agent.js +73 -0
- package/dist/src/frameworks/java/utils.d.ts +15 -0
- package/dist/src/frameworks/java/utils.js +64 -0
- package/dist/src/frameworks/javascript-node/javascript-node-wizard-agent.d.ts +4 -0
- package/dist/src/frameworks/javascript-node/javascript-node-wizard-agent.js +57 -0
- package/dist/src/frameworks/javascript-web/javascript-web-wizard-agent.d.ts +3 -0
- package/dist/src/frameworks/javascript-web/javascript-web-wizard-agent.js +151 -0
- package/dist/src/frameworks/javascript-web/utils.d.ts +28 -0
- package/dist/src/frameworks/javascript-web/utils.js +153 -0
- package/dist/src/frameworks/nextjs/nextjs-wizard-agent.d.ts +7 -0
- package/dist/src/frameworks/nextjs/nextjs-wizard-agent.js +98 -0
- package/dist/src/frameworks/nextjs/utils.d.ts +12 -0
- package/dist/src/frameworks/nextjs/utils.js +51 -0
- package/dist/src/frameworks/python/python-wizard-agent.d.ts +7 -0
- package/dist/src/frameworks/python/python-wizard-agent.js +193 -0
- package/dist/src/frameworks/python/utils.d.ts +28 -0
- package/dist/src/frameworks/python/utils.js +146 -0
- package/dist/src/frameworks/react-native/react-native-wizard-agent.d.ts +6 -0
- package/dist/src/frameworks/react-native/react-native-wizard-agent.js +84 -0
- package/dist/src/frameworks/react-native/utils.d.ts +21 -0
- package/dist/src/frameworks/react-native/utils.js +82 -0
- package/dist/src/frameworks/react-router/react-router-wizard-agent.d.ts +7 -0
- package/dist/src/frameworks/react-router/react-router-wizard-agent.js +98 -0
- package/dist/src/frameworks/react-router/utils.d.ts +13 -0
- package/dist/src/frameworks/react-router/utils.js +160 -0
- package/dist/src/frameworks/swift/swift-wizard-agent.d.ts +7 -0
- package/dist/src/frameworks/swift/swift-wizard-agent.js +72 -0
- package/dist/src/frameworks/swift/utils.d.ts +12 -0
- package/dist/src/frameworks/swift/utils.js +82 -0
- package/dist/src/frameworks/unity/unity-wizard-agent.d.ts +6 -0
- package/dist/src/frameworks/unity/unity-wizard-agent.js +79 -0
- package/dist/src/frameworks/unity/utils.d.ts +12 -0
- package/dist/src/frameworks/unity/utils.js +66 -0
- package/dist/src/frameworks/unreal/unreal-wizard-agent.d.ts +6 -0
- package/dist/src/frameworks/unreal/unreal-wizard-agent.js +77 -0
- package/dist/src/frameworks/unreal/utils.d.ts +10 -0
- package/dist/src/frameworks/unreal/utils.js +29 -0
- package/dist/src/frameworks/vue/vue-wizard-agent.d.ts +4 -0
- package/dist/src/frameworks/vue/vue-wizard-agent.js +64 -0
- package/dist/src/lib/agent-hooks.d.ts +26 -0
- package/dist/src/lib/agent-hooks.js +118 -0
- package/dist/src/lib/agent-interface.d.ts +175 -0
- package/dist/src/lib/agent-interface.js +1217 -0
- package/dist/src/lib/agent-runner.d.ts +9 -0
- package/dist/src/lib/agent-runner.js +415 -0
- package/dist/src/lib/ampli-config.d.ts +105 -0
- package/dist/src/lib/ampli-config.js +178 -0
- package/dist/src/lib/api.d.ts +107 -0
- package/dist/src/lib/api.js +442 -0
- package/dist/src/lib/commandments.d.ts +1 -0
- package/dist/src/lib/commandments.js +24 -0
- package/dist/src/lib/console-query.d.ts +27 -0
- package/dist/src/lib/console-query.js +121 -0
- package/dist/src/lib/constants.d.ts +124 -0
- package/dist/src/lib/constants.js +170 -0
- package/dist/src/lib/detect-amplitude.d.ts +31 -0
- package/dist/src/lib/detect-amplitude.js +407 -0
- package/dist/src/lib/framework-config.d.ts +188 -0
- package/dist/src/lib/framework-config.js +21 -0
- package/dist/src/lib/health-checks/endpoints.d.ts +3 -0
- package/dist/src/lib/health-checks/endpoints.js +45 -0
- package/dist/src/lib/health-checks/index.d.ts +4 -0
- package/dist/src/lib/health-checks/index.js +22 -0
- package/dist/src/lib/health-checks/readiness.d.ts +24 -0
- package/dist/src/lib/health-checks/readiness.js +118 -0
- package/dist/src/lib/health-checks/statuspage.d.ts +9 -0
- package/dist/src/lib/health-checks/statuspage.js +104 -0
- package/dist/src/lib/health-checks/types.d.ts +31 -0
- package/dist/src/lib/health-checks/types.js +9 -0
- package/dist/src/lib/helper-functions.d.ts +1 -0
- package/dist/src/lib/helper-functions.js +5 -0
- package/dist/src/lib/middleware/benchmark.d.ts +54 -0
- package/dist/src/lib/middleware/benchmark.js +48 -0
- package/dist/src/lib/middleware/benchmarks/cache-tracker.d.ts +44 -0
- package/dist/src/lib/middleware/benchmarks/cache-tracker.js +80 -0
- package/dist/src/lib/middleware/benchmarks/compaction-tracker.d.ts +29 -0
- package/dist/src/lib/middleware/benchmarks/compaction-tracker.js +59 -0
- package/dist/src/lib/middleware/benchmarks/context-size-tracker.d.ts +26 -0
- package/dist/src/lib/middleware/benchmarks/context-size-tracker.js +55 -0
- package/dist/src/lib/middleware/benchmarks/cost-tracker.d.ts +16 -0
- package/dist/src/lib/middleware/benchmarks/cost-tracker.js +75 -0
- package/dist/src/lib/middleware/benchmarks/duration-tracker.d.ts +20 -0
- package/dist/src/lib/middleware/benchmarks/duration-tracker.js +39 -0
- package/dist/src/lib/middleware/benchmarks/index.d.ts +9 -0
- package/dist/src/lib/middleware/benchmarks/index.js +67 -0
- package/dist/src/lib/middleware/benchmarks/json-writer.d.ts +15 -0
- package/dist/src/lib/middleware/benchmarks/json-writer.js +144 -0
- package/dist/src/lib/middleware/benchmarks/summary.d.ts +9 -0
- package/dist/src/lib/middleware/benchmarks/summary.js +105 -0
- package/dist/src/lib/middleware/benchmarks/token-tracker.d.ts +40 -0
- package/dist/src/lib/middleware/benchmarks/token-tracker.js +76 -0
- package/dist/src/lib/middleware/benchmarks/turn-counter.d.ts +34 -0
- package/dist/src/lib/middleware/benchmarks/turn-counter.js +58 -0
- package/dist/src/lib/middleware/config.d.ts +24 -0
- package/dist/src/lib/middleware/config.js +96 -0
- package/dist/src/lib/middleware/index.d.ts +11 -0
- package/dist/src/lib/middleware/index.js +17 -0
- package/dist/src/lib/middleware/phase-detector.d.ts +8 -0
- package/dist/src/lib/middleware/phase-detector.js +63 -0
- package/dist/src/lib/middleware/pipeline.d.ts +29 -0
- package/dist/src/lib/middleware/pipeline.js +81 -0
- package/dist/src/lib/middleware/schemas.d.ts +27 -0
- package/dist/src/lib/middleware/schemas.js +84 -0
- package/dist/src/lib/middleware/types.d.ts +94 -0
- package/dist/src/lib/middleware/types.js +8 -0
- package/dist/src/lib/package-manager-detection.d.ts +42 -0
- package/dist/src/lib/package-manager-detection.js +292 -0
- package/dist/src/lib/registry.d.ts +3 -0
- package/dist/src/lib/registry.js +42 -0
- package/dist/src/lib/safe-tools.d.ts +2 -0
- package/dist/src/lib/safe-tools.js +214 -0
- package/dist/src/lib/wizard-session.d.ts +220 -0
- package/dist/src/lib/wizard-session.js +127 -0
- package/dist/src/lib/wizard-tools.d.ts +82 -0
- package/dist/src/lib/wizard-tools.js +499 -0
- package/dist/src/run.d.ts +19 -0
- package/dist/src/run.js +151 -0
- package/dist/src/steps/add-mcp-server-to-clients/MCPClient.d.ts +30 -0
- package/dist/src/steps/add-mcp-server-to-clients/MCPClient.js +141 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.d.ts +29 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.js +180 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +20 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js +63 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/codex.d.ts +28 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/codex.js +77 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.d.ts +24 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +60 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.d.ts +27 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.js +101 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/zed.d.ts +26 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/zed.js +102 -0
- package/dist/src/steps/add-mcp-server-to-clients/defaults.d.ts +44 -0
- package/dist/src/steps/add-mcp-server-to-clients/defaults.js +123 -0
- package/dist/src/steps/add-mcp-server-to-clients/index.d.ts +19 -0
- package/dist/src/steps/add-mcp-server-to-clients/index.js +110 -0
- package/dist/src/steps/add-or-update-environment-variables.d.ts +10 -0
- package/dist/src/steps/add-or-update-environment-variables.js +188 -0
- package/dist/src/steps/index.d.ts +4 -0
- package/dist/src/steps/index.js +20 -0
- package/dist/src/steps/run-prettier.d.ts +5 -0
- package/dist/src/steps/run-prettier.js +90 -0
- package/dist/src/steps/upload-environment-variables/EnvironmentProvider.d.ts +11 -0
- package/dist/src/steps/upload-environment-variables/EnvironmentProvider.js +11 -0
- package/dist/src/steps/upload-environment-variables/index.d.ts +6 -0
- package/dist/src/steps/upload-environment-variables/index.js +37 -0
- package/dist/src/steps/upload-environment-variables/providers/vercel.d.ts +15 -0
- package/dist/src/steps/upload-environment-variables/providers/vercel.js +145 -0
- package/dist/src/telemetry.d.ts +2 -0
- package/dist/src/telemetry.js +12 -0
- package/dist/src/ui/index.d.ts +8 -0
- package/dist/src/ui/index.js +16 -0
- package/dist/src/ui/logging-ui.d.ts +56 -0
- package/dist/src/ui/logging-ui.js +157 -0
- package/dist/src/ui/tui/App.d.ts +6 -0
- package/dist/src/ui/tui/App.js +34 -0
- package/dist/src/ui/tui/components/AmplitudeLogo.d.ts +5 -0
- package/dist/src/ui/tui/components/AmplitudeLogo.js +81 -0
- package/dist/src/ui/tui/components/AmplitudeTextLogo.d.ts +3 -0
- package/dist/src/ui/tui/components/AmplitudeTextLogo.js +31 -0
- package/dist/src/ui/tui/components/ConsoleView.d.ts +23 -0
- package/dist/src/ui/tui/components/ConsoleView.js +220 -0
- package/dist/src/ui/tui/components/TitleBar.d.ts +6 -0
- package/dist/src/ui/tui/components/TitleBar.js +16 -0
- package/dist/src/ui/tui/console-commands.d.ts +16 -0
- package/dist/src/ui/tui/console-commands.js +31 -0
- package/dist/src/ui/tui/context/CommandModeContext.d.ts +2 -0
- package/dist/src/ui/tui/context/CommandModeContext.js +3 -0
- package/dist/src/ui/tui/flows.d.ts +48 -0
- package/dist/src/ui/tui/flows.js +154 -0
- package/dist/src/ui/tui/hooks/useScreenInput.d.ts +13 -0
- package/dist/src/ui/tui/hooks/useScreenInput.js +18 -0
- package/dist/src/ui/tui/hooks/useStdoutDimensions.d.ts +9 -0
- package/dist/src/ui/tui/hooks/useStdoutDimensions.js +29 -0
- package/dist/src/ui/tui/ink-ui.d.ts +62 -0
- package/dist/src/ui/tui/ink-ui.js +142 -0
- package/dist/src/ui/tui/primitives/CardLayout.d.ts +12 -0
- package/dist/src/ui/tui/primitives/CardLayout.js +9 -0
- package/dist/src/ui/tui/primitives/ConfirmationInput.d.ts +13 -0
- package/dist/src/ui/tui/primitives/ConfirmationInput.js +35 -0
- package/dist/src/ui/tui/primitives/DissolveTransition.d.ts +21 -0
- package/dist/src/ui/tui/primitives/DissolveTransition.js +143 -0
- package/dist/src/ui/tui/primitives/EventPlanViewer.d.ts +9 -0
- package/dist/src/ui/tui/primitives/EventPlanViewer.js +9 -0
- package/dist/src/ui/tui/primitives/KagiSmallWebViewer.d.ts +7 -0
- package/dist/src/ui/tui/primitives/KagiSmallWebViewer.js +101 -0
- package/dist/src/ui/tui/primitives/LoadingBox.d.ts +8 -0
- package/dist/src/ui/tui/primitives/LoadingBox.js +9 -0
- package/dist/src/ui/tui/primitives/LogViewer.d.ts +11 -0
- package/dist/src/ui/tui/primitives/LogViewer.js +55 -0
- package/dist/src/ui/tui/primitives/PickerMenu.d.ts +20 -0
- package/dist/src/ui/tui/primitives/PickerMenu.js +212 -0
- package/dist/src/ui/tui/primitives/ProgressList.d.ts +15 -0
- package/dist/src/ui/tui/primitives/ProgressList.js +29 -0
- package/dist/src/ui/tui/primitives/PromptLabel.d.ts +11 -0
- package/dist/src/ui/tui/primitives/PromptLabel.js +12 -0
- package/dist/src/ui/tui/primitives/ReportViewer.d.ts +12 -0
- package/dist/src/ui/tui/primitives/ReportViewer.js +99 -0
- package/dist/src/ui/tui/primitives/ScreenErrorBoundary.d.ts +26 -0
- package/dist/src/ui/tui/primitives/ScreenErrorBoundary.js +29 -0
- package/dist/src/ui/tui/primitives/SlashCommandInput.d.ts +21 -0
- package/dist/src/ui/tui/primitives/SlashCommandInput.js +85 -0
- package/dist/src/ui/tui/primitives/SnakeGame.d.ts +1 -0
- package/dist/src/ui/tui/primitives/SnakeGame.js +1 -0
- package/dist/src/ui/tui/primitives/SplitView.d.ts +11 -0
- package/dist/src/ui/tui/primitives/SplitView.js +8 -0
- package/dist/src/ui/tui/primitives/TabContainer.d.ts +18 -0
- package/dist/src/ui/tui/primitives/TabContainer.js +30 -0
- package/dist/src/ui/tui/primitives/index.d.ts +23 -0
- package/dist/src/ui/tui/primitives/index.js +19 -0
- package/dist/src/ui/tui/router.d.ts +61 -0
- package/dist/src/ui/tui/router.js +104 -0
- package/dist/src/ui/tui/screen-registry.d.ts +19 -0
- package/dist/src/ui/tui/screen-registry.js +56 -0
- package/dist/src/ui/tui/screens/ActivationOptionsScreen.d.ts +12 -0
- package/dist/src/ui/tui/screens/ActivationOptionsScreen.js +57 -0
- package/dist/src/ui/tui/screens/AuthScreen.d.ts +18 -0
- package/dist/src/ui/tui/screens/AuthScreen.js +107 -0
- package/dist/src/ui/tui/screens/ChecklistScreen.d.ts +22 -0
- package/dist/src/ui/tui/screens/ChecklistScreen.js +122 -0
- package/dist/src/ui/tui/screens/DataIngestionCheckScreen.d.ts +24 -0
- package/dist/src/ui/tui/screens/DataIngestionCheckScreen.js +113 -0
- package/dist/src/ui/tui/screens/DataSetupScreen.d.ts +17 -0
- package/dist/src/ui/tui/screens/DataSetupScreen.js +73 -0
- package/dist/src/ui/tui/screens/IntroScreen.d.ts +16 -0
- package/dist/src/ui/tui/screens/IntroScreen.js +86 -0
- package/dist/src/ui/tui/screens/LoginScreen.d.ts +15 -0
- package/dist/src/ui/tui/screens/LoginScreen.js +65 -0
- package/dist/src/ui/tui/screens/LogoutScreen.d.ts +12 -0
- package/dist/src/ui/tui/screens/LogoutScreen.js +28 -0
- package/dist/src/ui/tui/screens/McpScreen.d.ts +26 -0
- package/dist/src/ui/tui/screens/McpScreen.js +148 -0
- package/dist/src/ui/tui/screens/OutageScreen.d.ts +10 -0
- package/dist/src/ui/tui/screens/OutageScreen.js +17 -0
- package/dist/src/ui/tui/screens/OutroScreen.d.ts +11 -0
- package/dist/src/ui/tui/screens/OutroScreen.js +69 -0
- package/dist/src/ui/tui/screens/RegionSelectScreen.d.ts +17 -0
- package/dist/src/ui/tui/screens/RegionSelectScreen.js +40 -0
- package/dist/src/ui/tui/screens/RunScreen.d.ts +16 -0
- package/dist/src/ui/tui/screens/RunScreen.js +212 -0
- package/dist/src/ui/tui/screens/SettingsOverrideScreen.d.ts +10 -0
- package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +23 -0
- package/dist/src/ui/tui/screens/SetupScreen.d.ts +13 -0
- package/dist/src/ui/tui/screens/SetupScreen.js +73 -0
- package/dist/src/ui/tui/screens/SlackScreen.d.ts +25 -0
- package/dist/src/ui/tui/screens/SlackScreen.js +97 -0
- package/dist/src/ui/tui/services/mcp-installer.d.ts +25 -0
- package/dist/src/ui/tui/services/mcp-installer.js +82 -0
- package/dist/src/ui/tui/start-tui.d.ts +10 -0
- package/dist/src/ui/tui/start-tui.js +50 -0
- package/dist/src/ui/tui/store.d.ts +231 -0
- package/dist/src/ui/tui/store.js +568 -0
- package/dist/src/ui/tui/styles.d.ts +31 -0
- package/dist/src/ui/tui/styles.js +33 -0
- package/dist/src/ui/wizard-ui.d.ts +110 -0
- package/dist/src/ui/wizard-ui.js +18 -0
- package/dist/src/utils/ampli-settings.d.ts +37 -0
- package/dist/src/utils/ampli-settings.js +182 -0
- package/dist/src/utils/analytics.d.ts +35 -0
- package/dist/src/utils/analytics.js +133 -0
- package/dist/src/utils/anthropic-status.d.ts +17 -0
- package/dist/src/utils/anthropic-status.js +51 -0
- package/dist/src/utils/api-key-store.d.ts +35 -0
- package/dist/src/utils/api-key-store.js +176 -0
- package/dist/src/utils/bash.d.ts +2 -0
- package/dist/src/utils/bash.js +53 -0
- package/dist/src/utils/custom-headers.d.ts +9 -0
- package/dist/src/utils/custom-headers.js +23 -0
- package/dist/src/utils/debug.d.ts +23 -0
- package/dist/src/utils/debug.js +86 -0
- package/dist/src/utils/environment.d.ts +4 -0
- package/dist/src/utils/environment.js +76 -0
- package/dist/src/utils/file-utils.d.ts +2 -0
- package/dist/src/utils/file-utils.js +16 -0
- package/dist/src/utils/get-api-key.d.ts +17 -0
- package/dist/src/utils/get-api-key.js +50 -0
- package/dist/src/utils/logging.d.ts +9 -0
- package/dist/src/utils/logging.js +48 -0
- package/dist/src/utils/oauth.d.ts +53 -0
- package/dist/src/utils/oauth.js +354 -0
- package/dist/src/utils/package-json.d.ts +25 -0
- package/dist/src/utils/package-json.js +26 -0
- package/dist/src/utils/package-manager.d.ts +21 -0
- package/dist/src/utils/package-manager.js +208 -0
- package/dist/src/utils/semver.d.ts +21 -0
- package/dist/src/utils/semver.js +61 -0
- package/dist/src/utils/setup-utils.d.ts +82 -0
- package/dist/src/utils/setup-utils.js +467 -0
- package/dist/src/utils/shell-completions.d.ts +10 -0
- package/dist/src/utils/shell-completions.js +199 -0
- package/dist/src/utils/string.d.ts +1 -0
- package/dist/src/utils/string.js +8 -0
- package/dist/src/utils/types.d.ts +72 -0
- package/dist/src/utils/types.js +2 -0
- package/dist/src/utils/urls.d.ts +14 -0
- package/dist/src/utils/urls.js +69 -0
- package/dist/src/utils/vendor/is-unicorn-supported.d.ts +1 -0
- package/dist/src/utils/vendor/is-unicorn-supported.js +23 -0
- package/dist/src/utils/wizard-abort.d.ts +13 -0
- package/dist/src/utils/wizard-abort.js +56 -0
- package/man/amplitude-wizard.1 +170 -0
- package/package.json +144 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LoggingUI — Logging-only implementation for CI mode.
|
|
4
|
+
* No prompts, no TUI, no interactivity. Just console output.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.LoggingUI = void 0;
|
|
8
|
+
const wizard_ui_1 = require("./wizard-ui");
|
|
9
|
+
class LoggingUI {
|
|
10
|
+
intro(message) {
|
|
11
|
+
console.log(`┌ ${message}`);
|
|
12
|
+
}
|
|
13
|
+
outro(message) {
|
|
14
|
+
console.log(`└ ${message}`);
|
|
15
|
+
}
|
|
16
|
+
cancel(message, options) {
|
|
17
|
+
console.log(`■ ${message}`);
|
|
18
|
+
if (options?.docsUrl) {
|
|
19
|
+
console.log(`│ Manual setup guide: ${options.docsUrl}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
log = {
|
|
23
|
+
info(message) {
|
|
24
|
+
console.log(`│ ${message}`);
|
|
25
|
+
},
|
|
26
|
+
warn(message) {
|
|
27
|
+
console.log(`▲ ${message}`);
|
|
28
|
+
},
|
|
29
|
+
error(message) {
|
|
30
|
+
console.log(`✖ ${message}`);
|
|
31
|
+
},
|
|
32
|
+
success(message) {
|
|
33
|
+
console.log(`✔ ${message}`);
|
|
34
|
+
},
|
|
35
|
+
step(message) {
|
|
36
|
+
console.log(`◇ ${message}`);
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
note(message) {
|
|
40
|
+
console.log(`│ ${message}`);
|
|
41
|
+
}
|
|
42
|
+
spinner() {
|
|
43
|
+
let activeMessage;
|
|
44
|
+
return {
|
|
45
|
+
start(message) {
|
|
46
|
+
if (message) {
|
|
47
|
+
activeMessage = message;
|
|
48
|
+
// Write without newline so stop() can overwrite in-place
|
|
49
|
+
process.stdout.write(`◌ ${message}`);
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
stop(message) {
|
|
53
|
+
if (activeMessage !== undefined) {
|
|
54
|
+
// Overwrite the current spinner line: carriage-return → solid dot → newline
|
|
55
|
+
process.stdout.write(`\r● ${message ?? activeMessage}\n`);
|
|
56
|
+
activeMessage = undefined;
|
|
57
|
+
}
|
|
58
|
+
else if (message) {
|
|
59
|
+
console.log(`● ${message}`);
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
message(msg) {
|
|
63
|
+
if (!msg)
|
|
64
|
+
return;
|
|
65
|
+
if (activeMessage !== undefined) {
|
|
66
|
+
// Overwrite the current spinner line with the new task
|
|
67
|
+
process.stdout.write(`\r◌ ${msg}`);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
process.stdout.write(`◌ ${msg}`);
|
|
71
|
+
}
|
|
72
|
+
activeMessage = msg;
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
pushStatus(message) {
|
|
77
|
+
console.log(`◇ ${message}`);
|
|
78
|
+
}
|
|
79
|
+
heartbeat(statuses) {
|
|
80
|
+
if (statuses.length === 0)
|
|
81
|
+
return;
|
|
82
|
+
// End the current in-progress spinner line before printing
|
|
83
|
+
process.stdout.write('\n');
|
|
84
|
+
for (const s of statuses) {
|
|
85
|
+
console.log(`│ ${s}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
setDetectedFramework(label) {
|
|
89
|
+
console.log(`✔ Framework: ${label}`);
|
|
90
|
+
}
|
|
91
|
+
onEnterScreen(_screen, _fn) {
|
|
92
|
+
// No screen transitions in CI
|
|
93
|
+
}
|
|
94
|
+
setLoginUrl(url) {
|
|
95
|
+
if (url) {
|
|
96
|
+
console.log(`│ If the browser didn't open automatically, use this link:`);
|
|
97
|
+
console.log(`│ ${url}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
showServiceStatus(data) {
|
|
101
|
+
console.log(`▲ Claude/Anthropic services are experiencing issues.`);
|
|
102
|
+
console.log(`│ Status: ${data.description}`);
|
|
103
|
+
console.log(`│ Status page: ${data.statusPageUrl}`);
|
|
104
|
+
console.log(`│ The wizard may not work reliably while services are affected.`);
|
|
105
|
+
}
|
|
106
|
+
showSettingsOverride(keys, _backupAndFix) {
|
|
107
|
+
console.log(`▲ Security warning: .claude/settings.json overrides detected`);
|
|
108
|
+
for (const key of keys) {
|
|
109
|
+
console.log(`│ • ${key}`);
|
|
110
|
+
}
|
|
111
|
+
console.log(`│ These overrides prevent the Wizard from accessing the Amplitude LLM Gateway.`);
|
|
112
|
+
return Promise.resolve();
|
|
113
|
+
}
|
|
114
|
+
startRun() {
|
|
115
|
+
// No-op in CI mode
|
|
116
|
+
}
|
|
117
|
+
setRunError(_error) {
|
|
118
|
+
// No retry in CI — let the caller fall through to wizardAbort
|
|
119
|
+
return Promise.resolve(false);
|
|
120
|
+
}
|
|
121
|
+
setCredentials(_credentials) {
|
|
122
|
+
// No-op in CI mode — credentials are handled directly
|
|
123
|
+
}
|
|
124
|
+
setRegion(_region) {
|
|
125
|
+
// No-op in CI mode
|
|
126
|
+
}
|
|
127
|
+
setProjectHasData(_value) {
|
|
128
|
+
// No-op in CI mode
|
|
129
|
+
}
|
|
130
|
+
promptConfirm(message) {
|
|
131
|
+
console.log(`? ${message} (auto-skipped in CI)`);
|
|
132
|
+
return Promise.resolve(false);
|
|
133
|
+
}
|
|
134
|
+
promptChoice(message, options) {
|
|
135
|
+
console.log(`? ${message} (auto-skipped in CI)`);
|
|
136
|
+
console.log(`│ Options: ${options.join(', ')}`);
|
|
137
|
+
return Promise.resolve('');
|
|
138
|
+
}
|
|
139
|
+
promptEventPlan(events) {
|
|
140
|
+
console.log(`? Instrumentation plan (auto-approved in CI):`);
|
|
141
|
+
for (const e of events) {
|
|
142
|
+
console.log(`│ - ${e.name}: ${e.description}`);
|
|
143
|
+
}
|
|
144
|
+
return Promise.resolve({ decision: 'approved' });
|
|
145
|
+
}
|
|
146
|
+
syncTodos(todos) {
|
|
147
|
+
const completed = todos.filter((t) => t.status === wizard_ui_1.TaskStatus.Completed).length;
|
|
148
|
+
const inProgress = todos.find((t) => t.status === wizard_ui_1.TaskStatus.InProgress);
|
|
149
|
+
if (inProgress) {
|
|
150
|
+
console.log(`◌ [${completed}/${todos.length}] ${inProgress.activeForm || inProgress.content}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
setEventPlan(_events) {
|
|
154
|
+
// No-op in CI mode
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
exports.LoggingUI = LoggingUI;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo, useSyncExternalStore } from 'react';
|
|
3
|
+
import { Box } from 'ink';
|
|
4
|
+
import { createScreens, createServices } from './screen-registry.js';
|
|
5
|
+
import { CommandModeContext } from './context/CommandModeContext.js';
|
|
6
|
+
import { ConsoleView } from './components/ConsoleView.js';
|
|
7
|
+
import { TitleBar } from './components/TitleBar.js';
|
|
8
|
+
import { useStdoutDimensions } from './hooks/useStdoutDimensions.js';
|
|
9
|
+
import { DissolveTransition } from './primitives/DissolveTransition.js';
|
|
10
|
+
import { ScreenErrorBoundary } from './primitives/ScreenErrorBoundary.js';
|
|
11
|
+
const MIN_WIDTH = 80;
|
|
12
|
+
const MAX_WIDTH = 120;
|
|
13
|
+
/** Height reserved for separator + response line + input + up to 5 picker items. */
|
|
14
|
+
const CONSOLE_INPUT_HEIGHT = 8;
|
|
15
|
+
function getContentWidth(terminalColumns) {
|
|
16
|
+
if (terminalColumns < MIN_WIDTH)
|
|
17
|
+
return terminalColumns;
|
|
18
|
+
return Math.min(MAX_WIDTH, terminalColumns);
|
|
19
|
+
}
|
|
20
|
+
export const App = ({ store }) => {
|
|
21
|
+
const [columns, rows] = useStdoutDimensions();
|
|
22
|
+
const services = useMemo(() => createServices(store.session.localMcp), []);
|
|
23
|
+
const screens = useMemo(() => createScreens(store, services), [store, services]);
|
|
24
|
+
useSyncExternalStore((cb) => store.subscribe(cb), () => store.getSnapshot());
|
|
25
|
+
const width = getContentWidth(columns);
|
|
26
|
+
const innerWidth = width - 2;
|
|
27
|
+
// border(2) + titlebar(1) + gap(1) + console input area
|
|
28
|
+
const contentHeight = Math.max(5, rows - 4 - CONSOLE_INPUT_HEIGHT);
|
|
29
|
+
// innerWidth minus paddingX(1) on each side
|
|
30
|
+
const contentAreaWidth = Math.max(10, innerWidth - 2);
|
|
31
|
+
const direction = store.lastNavDirection === 'pop' ? 'right' : 'left';
|
|
32
|
+
const activeScreen = screens[store.currentScreen] ?? null;
|
|
33
|
+
return (_jsx(CommandModeContext.Provider, { value: store.commandMode, children: _jsx(Box, { flexDirection: "column", height: rows, width: columns, alignItems: "center", justifyContent: "flex-start", children: _jsxs(ConsoleView, { store: store, width: width, height: rows, children: [_jsx(TitleBar, { version: store.version, width: innerWidth }), _jsx(Box, { height: 1 }), _jsx(Box, { flexDirection: "column", flexGrow: 1, paddingX: 1, overflow: "hidden", children: _jsx(DissolveTransition, { transitionKey: store.currentScreen, width: contentAreaWidth, height: contentHeight, direction: direction, children: _jsx(ScreenErrorBoundary, { store: store, retryToken: store.screenErrorRetry, children: activeScreen }) }) })] }) }) }));
|
|
34
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const AmplitudeLogo: ({ color }: {
|
|
2
|
+
color?: string;
|
|
3
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
/** AmplitudeLogo with a colour wave (vertical) and a horizontal dissolve wave. */
|
|
5
|
+
export declare const AnimatedAmplitudeLogo: () => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import { useState, useEffect } from 'react';
|
|
4
|
+
const LINES = [
|
|
5
|
+
' _.ΦΦ8$8ΦΦ.. ',
|
|
6
|
+
' .ΦΘΦƒⁿ"ΦΦΦΘ#ΦΦ. ',
|
|
7
|
+
' /#8ΦΦ/ x #Φ8ΦæΦΦ\\ ',
|
|
8
|
+
'+ΦΦΦ+/ @A@ +ΦΦ8ΦΦ#Φ:',
|
|
9
|
+
'+Φ( ___ )Φ|',
|
|
10
|
+
'\\ΦΦΦΓ áΦΦΦì ΦΦ/Φ#Θ;',
|
|
11
|
+
' ΦæΦææ#ΦΘΦΦ+ +/ +ΦΦ ',
|
|
12
|
+
' `Φ8ΦΦ8ΦΦ#Φ\\_.ΦΦΦ ',
|
|
13
|
+
" `-ΦΦΦµµΦΦΦ''' ",
|
|
14
|
+
];
|
|
15
|
+
const TEXT = LINES.join('\n');
|
|
16
|
+
/** Amplitude blue gradient — bright core fading to dim. */
|
|
17
|
+
const WAVE_COLORS = [
|
|
18
|
+
'#6b9af7', // light blue
|
|
19
|
+
'#4478f2', // mid blue
|
|
20
|
+
'#1e61f0', // Amplitude blue (brand)
|
|
21
|
+
'#1a55d4', // deeper blue
|
|
22
|
+
'#1549b8', // deep blue
|
|
23
|
+
'#1a55d4', // deeper blue
|
|
24
|
+
'#1e61f0', // Amplitude blue
|
|
25
|
+
'#4478f2', // mid blue
|
|
26
|
+
'#6b9af7', // light blue
|
|
27
|
+
];
|
|
28
|
+
/**
|
|
29
|
+
* Characters substituted at each distance from the wave centre.
|
|
30
|
+
* dist 0 → invisible, dist 1-3 → progressively larger dots, dist 4+ → original.
|
|
31
|
+
*/
|
|
32
|
+
const DECAY = [' ', '˙', '·', '∘'];
|
|
33
|
+
const LOGO_WIDTH = LINES[0].length;
|
|
34
|
+
/** Radius of the dissolve zone in columns. */
|
|
35
|
+
const WAVE_RADIUS = 7;
|
|
36
|
+
/** Column shift per row — controls the diagonal angle. */
|
|
37
|
+
const ROW_SHIFT = 2;
|
|
38
|
+
/**
|
|
39
|
+
* Replace each non-space character with its wave-decay substitute.
|
|
40
|
+
* rowWaveX is the wave centre for this specific row (already shifted for angle).
|
|
41
|
+
*/
|
|
42
|
+
function applyHorizWave(line, rowWaveX) {
|
|
43
|
+
if (rowWaveX < -WAVE_RADIUS || rowWaveX > LOGO_WIDTH + WAVE_RADIUS)
|
|
44
|
+
return line;
|
|
45
|
+
return [...line]
|
|
46
|
+
.map((char, col) => {
|
|
47
|
+
if (char === ' ')
|
|
48
|
+
return ' ';
|
|
49
|
+
const dist = Math.abs(col - rowWaveX);
|
|
50
|
+
return dist < DECAY.length ? DECAY[dist] : char;
|
|
51
|
+
})
|
|
52
|
+
.join('');
|
|
53
|
+
}
|
|
54
|
+
export const AmplitudeLogo = ({ color = 'white' }) => (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: color, children: TEXT }) }));
|
|
55
|
+
/** AmplitudeLogo with a colour wave (vertical) and a horizontal dissolve wave. */
|
|
56
|
+
export const AnimatedAmplitudeLogo = () => {
|
|
57
|
+
// Vertical colour wave — advances every 110 ms
|
|
58
|
+
const [colorFrame, setColorFrame] = useState(0);
|
|
59
|
+
// Horizontal dissolve wave — tick advances every 50 ms
|
|
60
|
+
const [waveTick, setWaveTick] = useState(0);
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
const id = setInterval(() => setColorFrame((f) => (f + 1) % WAVE_COLORS.length), 110);
|
|
63
|
+
return () => clearInterval(id);
|
|
64
|
+
}, []);
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
const id = setInterval(() => setWaveTick((t) => t + 1), 50);
|
|
67
|
+
return () => clearInterval(id);
|
|
68
|
+
}, []);
|
|
69
|
+
// One dissolve wave every 4 s (80 ticks). The wave travels for the first
|
|
70
|
+
// 36 ticks (~1.8 s), sweeping from left edge to right edge; the remaining
|
|
71
|
+
// 44 ticks the logo rests at full resolution.
|
|
72
|
+
const TICKS_PER_CYCLE = 80;
|
|
73
|
+
const ACTIVE_TICKS = 54; // extra ticks to cover diagonal travel + right overshoot
|
|
74
|
+
const frameInCycle = waveTick % TICKS_PER_CYCLE;
|
|
75
|
+
const waveX = frameInCycle < ACTIVE_TICKS
|
|
76
|
+
? Math.round((frameInCycle / (ACTIVE_TICKS - 1)) *
|
|
77
|
+
(LOGO_WIDTH + WAVE_RADIUS * 2 + 10) -
|
|
78
|
+
WAVE_RADIUS)
|
|
79
|
+
: -999; // off-screen → no substitution
|
|
80
|
+
return (_jsx(Box, { flexDirection: "column", marginBottom: 1, children: LINES.map((line, i) => (_jsx(Text, { color: WAVE_COLORS[(colorFrame + i) % WAVE_COLORS.length], children: applyHorizWave(line, waveX - i * ROW_SHIFT) }, i))) }));
|
|
81
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
const LOGO_LINES = [
|
|
4
|
+
' █████╗ ███╗ ███╗██████╗ ██╗ ██╗████████╗██╗ ██╗██████╗ ███████╗',
|
|
5
|
+
'██╔══██╗████╗ ████║██╔══██╗██║ ██║╚══██╔══╝██║ ██║██╔══██╗██╔════╝',
|
|
6
|
+
'███████║██╔████╔██║██████╔╝██║ ██║ ██║ ██║ ██║██║ ██║█████╗ ',
|
|
7
|
+
'██╔══██║██║╚██╔╝██║██╔═══╝ ██║ ██║ ██║ ██║ ██║██║ ██║██╔══╝ ',
|
|
8
|
+
'██║ ██║██║ ╚═╝ ██║██║ ███████╗██║ ██║ ╚██████╔╝██████╔╝███████╗',
|
|
9
|
+
'╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚══════╝',
|
|
10
|
+
];
|
|
11
|
+
export const AMP_BLUE = '#1E61F0';
|
|
12
|
+
export const AMP_CYAN = '#00D4AA';
|
|
13
|
+
function lerpColor(a, b, t) {
|
|
14
|
+
const ar = parseInt(a.slice(1, 3), 16), ag = parseInt(a.slice(3, 5), 16), ab = parseInt(a.slice(5, 7), 16);
|
|
15
|
+
const br = parseInt(b.slice(1, 3), 16), bg = parseInt(b.slice(3, 5), 16), bb = parseInt(b.slice(5, 7), 16);
|
|
16
|
+
const r = Math.round(ar + (br - ar) * t)
|
|
17
|
+
.toString(16)
|
|
18
|
+
.padStart(2, '0');
|
|
19
|
+
const g = Math.round(ag + (bg - ag) * t)
|
|
20
|
+
.toString(16)
|
|
21
|
+
.padStart(2, '0');
|
|
22
|
+
const bv = Math.round(ab + (bb - ab) * t)
|
|
23
|
+
.toString(16)
|
|
24
|
+
.padStart(2, '0');
|
|
25
|
+
return `#${r}${g}${bv}`;
|
|
26
|
+
}
|
|
27
|
+
export const AmplitudeTextLogo = () => (_jsx(Box, { flexDirection: "column", marginBottom: 1, children: LOGO_LINES.map((line, i) => {
|
|
28
|
+
const chars = line.split('');
|
|
29
|
+
const last = chars.length - 1;
|
|
30
|
+
return (_jsx(Box, { flexDirection: "row", alignItems: "flex-start", children: chars.map((char, j) => (_jsx(Text, { color: lerpColor(AMP_BLUE, AMP_CYAN, last > 0 ? j / last : 0), children: char }, j))) }, i));
|
|
31
|
+
}) }));
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConsoleView — Full-screen bordered box.
|
|
3
|
+
*
|
|
4
|
+
* Renders arbitrary children in the content area, with a persistent
|
|
5
|
+
* slash-command / Claude-query input at the bottom.
|
|
6
|
+
*
|
|
7
|
+
* The input is dormant by default. Activation:
|
|
8
|
+
* - "/" → activate in slash-command mode
|
|
9
|
+
* - Tab → activate for free-text Claude query
|
|
10
|
+
* Deactivation: Enter (submit) or Escape. Backspacing to empty also deactivates.
|
|
11
|
+
*
|
|
12
|
+
* While active, commandMode=true on the store disables all useScreenInput handlers.
|
|
13
|
+
*/
|
|
14
|
+
import type { ReactNode } from 'react';
|
|
15
|
+
import type { WizardStore } from '../store.js';
|
|
16
|
+
interface ConsoleViewProps {
|
|
17
|
+
store: WizardStore;
|
|
18
|
+
width: number;
|
|
19
|
+
height: number;
|
|
20
|
+
children?: ReactNode;
|
|
21
|
+
}
|
|
22
|
+
export declare const ConsoleView: ({ store, width, height, children, }: ConsoleViewProps) => import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* ConsoleView — Full-screen bordered box.
|
|
4
|
+
*
|
|
5
|
+
* Renders arbitrary children in the content area, with a persistent
|
|
6
|
+
* slash-command / Claude-query input at the bottom.
|
|
7
|
+
*
|
|
8
|
+
* The input is dormant by default. Activation:
|
|
9
|
+
* - "/" → activate in slash-command mode
|
|
10
|
+
* - Tab → activate for free-text Claude query
|
|
11
|
+
* Deactivation: Enter (submit) or Escape. Backspacing to empty also deactivates.
|
|
12
|
+
*
|
|
13
|
+
* While active, commandMode=true on the store disables all useScreenInput handlers.
|
|
14
|
+
*/
|
|
15
|
+
import { Box, Text, useInput } from 'ink';
|
|
16
|
+
import { useState, useEffect, useSyncExternalStore } from 'react';
|
|
17
|
+
import { Spinner } from '@inkjs/ui';
|
|
18
|
+
import { OutroKind } from '../../../lib/wizard-session.js';
|
|
19
|
+
import { SlashCommandInput } from '../primitives/SlashCommandInput.js';
|
|
20
|
+
import { PickerMenu } from '../primitives/PickerMenu.js';
|
|
21
|
+
import { Colors, Icons } from '../styles.js';
|
|
22
|
+
import { Overlay } from '../router.js';
|
|
23
|
+
import { queryConsole, resolveConsoleCredentials, buildSessionContext, } from '../../../lib/console-query.js';
|
|
24
|
+
import { COMMANDS, getWhoamiText, getHelpText, TEST_PROMPT, } from '../console-commands.js';
|
|
25
|
+
import { analytics } from '../../../utils/analytics.js';
|
|
26
|
+
function executeCommand(raw, store) {
|
|
27
|
+
const [cmd] = raw.trim().split(/\s+/);
|
|
28
|
+
switch (cmd) {
|
|
29
|
+
case '/region':
|
|
30
|
+
store.setRegionForced();
|
|
31
|
+
break;
|
|
32
|
+
case '/login':
|
|
33
|
+
store.showLoginOverlay();
|
|
34
|
+
break;
|
|
35
|
+
case '/logout':
|
|
36
|
+
store.showLogoutOverlay();
|
|
37
|
+
break;
|
|
38
|
+
case '/whoami':
|
|
39
|
+
store.setCommandFeedback(getWhoamiText(store.session));
|
|
40
|
+
break;
|
|
41
|
+
case '/slack':
|
|
42
|
+
store.showSlackOverlay();
|
|
43
|
+
break;
|
|
44
|
+
case '/test':
|
|
45
|
+
return TEST_PROMPT;
|
|
46
|
+
case '/mcp':
|
|
47
|
+
store.showMcpOverlay();
|
|
48
|
+
break;
|
|
49
|
+
case '/snake':
|
|
50
|
+
store.showSnakeOverlay();
|
|
51
|
+
break;
|
|
52
|
+
case '/exit':
|
|
53
|
+
store.setOutroData({ kind: OutroKind.Cancel, message: 'Exited.' });
|
|
54
|
+
break;
|
|
55
|
+
case '/help':
|
|
56
|
+
store.setCommandFeedback(getHelpText());
|
|
57
|
+
break;
|
|
58
|
+
default:
|
|
59
|
+
if (cmd)
|
|
60
|
+
store.setCommandFeedback(`Unknown command: ${cmd}. Type /help.`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export const ConsoleView = ({ store, width, height, children, }) => {
|
|
64
|
+
const [inputActive, setInputActive] = useState(false);
|
|
65
|
+
const [initialValue, setInitialValue] = useState('');
|
|
66
|
+
const [inputKey, setInputKey] = useState(0);
|
|
67
|
+
const [response, setResponse] = useState(null);
|
|
68
|
+
const [loading, setLoading] = useState(false);
|
|
69
|
+
const [history, setHistory] = useState([]);
|
|
70
|
+
// Event plan prompt local state
|
|
71
|
+
const [planInputMode, setPlanInputMode] = useState('options');
|
|
72
|
+
const [planFeedbackText, setPlanFeedbackText] = useState('');
|
|
73
|
+
const [planCursorVisible, setPlanCursorVisible] = useState(true);
|
|
74
|
+
useSyncExternalStore((cb) => store.subscribe(cb), () => store.getSnapshot());
|
|
75
|
+
const activate = (seed = '') => {
|
|
76
|
+
setInitialValue(seed);
|
|
77
|
+
setInputKey((k) => k + 1); // remount so initialValue takes effect
|
|
78
|
+
setInputActive(true);
|
|
79
|
+
store.setCommandMode(true);
|
|
80
|
+
};
|
|
81
|
+
const deactivate = () => {
|
|
82
|
+
setInputActive(false);
|
|
83
|
+
store.setCommandMode(false);
|
|
84
|
+
};
|
|
85
|
+
const feedback = store.commandFeedback;
|
|
86
|
+
const screenError = store.screenError;
|
|
87
|
+
const showResponse = loading || !!response;
|
|
88
|
+
const showFeedback = !showResponse && !!feedback;
|
|
89
|
+
const innerWidth = width - 2;
|
|
90
|
+
const separator = '─'.repeat(Math.max(0, innerWidth));
|
|
91
|
+
const responseIsLong = !!response && response.split('\n').length > 3;
|
|
92
|
+
const pendingPrompt = store.pendingPrompt;
|
|
93
|
+
// Watch for activation keys while the input is dormant
|
|
94
|
+
useInput((char, key) => {
|
|
95
|
+
// Escape or Q dismisses overlays: pending prompt (skip) or long response
|
|
96
|
+
if (key.escape || char === 'q' || char === 'Q') {
|
|
97
|
+
if (pendingPrompt && pendingPrompt.kind !== 'event-plan') {
|
|
98
|
+
store.resolvePrompt(pendingPrompt.kind === 'confirm' ? false : '');
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (responseIsLong) {
|
|
102
|
+
setResponse(null);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (screenError && (char === 'r' || char === 'R')) {
|
|
107
|
+
store.clearScreenError();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (char === '/') {
|
|
111
|
+
activate('/');
|
|
112
|
+
}
|
|
113
|
+
else if (key.tab) {
|
|
114
|
+
activate('');
|
|
115
|
+
}
|
|
116
|
+
}, { isActive: !inputActive });
|
|
117
|
+
const handleSubmit = (value) => {
|
|
118
|
+
const isSlashCommand = value.startsWith('/');
|
|
119
|
+
analytics.wizardCapture('agent message sent', {
|
|
120
|
+
message_length: value.length,
|
|
121
|
+
is_slash_command: isSlashCommand,
|
|
122
|
+
});
|
|
123
|
+
if (isSlashCommand) {
|
|
124
|
+
setResponse(null);
|
|
125
|
+
const query = executeCommand(value, store);
|
|
126
|
+
if (query) {
|
|
127
|
+
handleSubmit(query);
|
|
128
|
+
}
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
setResponse(null);
|
|
132
|
+
setLoading(true);
|
|
133
|
+
const creds = resolveConsoleCredentials(store.session);
|
|
134
|
+
const context = buildSessionContext(store.session);
|
|
135
|
+
queryConsole(value, context, creds, history)
|
|
136
|
+
.then((text) => {
|
|
137
|
+
setResponse(text);
|
|
138
|
+
setHistory((h) => [
|
|
139
|
+
...h,
|
|
140
|
+
{ role: 'user', content: value },
|
|
141
|
+
{ role: 'assistant', content: text },
|
|
142
|
+
]);
|
|
143
|
+
})
|
|
144
|
+
.catch((err) => {
|
|
145
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
146
|
+
setResponse(`Error: ${msg}`);
|
|
147
|
+
})
|
|
148
|
+
.finally(() => setLoading(false));
|
|
149
|
+
};
|
|
150
|
+
// Blinking cursor for event-plan feedback input
|
|
151
|
+
useEffect(() => {
|
|
152
|
+
if (planInputMode !== 'feedback')
|
|
153
|
+
return;
|
|
154
|
+
const id = setInterval(() => setPlanCursorVisible((v) => !v), 530);
|
|
155
|
+
return () => clearInterval(id);
|
|
156
|
+
}, [planInputMode]);
|
|
157
|
+
// Reset plan input state when the prompt clears (agent got the answer)
|
|
158
|
+
useEffect(() => {
|
|
159
|
+
if (!pendingPrompt) {
|
|
160
|
+
setPlanInputMode('options');
|
|
161
|
+
setPlanFeedbackText('');
|
|
162
|
+
}
|
|
163
|
+
}, [pendingPrompt]);
|
|
164
|
+
// Keyboard handling for event-plan prompt
|
|
165
|
+
useInput((char, key) => {
|
|
166
|
+
if (!pendingPrompt || pendingPrompt.kind !== 'event-plan')
|
|
167
|
+
return;
|
|
168
|
+
if (planInputMode === 'feedback') {
|
|
169
|
+
if (key.return) {
|
|
170
|
+
const text = planFeedbackText.trim();
|
|
171
|
+
if (text) {
|
|
172
|
+
store.resolveEventPlan({ decision: 'revised', feedback: text });
|
|
173
|
+
setPlanFeedbackText('');
|
|
174
|
+
setPlanInputMode('options');
|
|
175
|
+
}
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
if (key.escape) {
|
|
179
|
+
setPlanInputMode('options');
|
|
180
|
+
setPlanFeedbackText('');
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
if (key.backspace || key.delete) {
|
|
184
|
+
setPlanFeedbackText((v) => v.slice(0, -1));
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (!key.ctrl && !key.meta && !key.tab && char) {
|
|
188
|
+
setPlanFeedbackText((v) => v + char);
|
|
189
|
+
}
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
// options mode
|
|
193
|
+
const lc = char.toLowerCase();
|
|
194
|
+
if (lc === 'y' || key.return) {
|
|
195
|
+
store.resolveEventPlan({ decision: 'approved' });
|
|
196
|
+
}
|
|
197
|
+
else if (lc === 's') {
|
|
198
|
+
store.resolveEventPlan({ decision: 'skipped' });
|
|
199
|
+
}
|
|
200
|
+
else if (lc === 'f') {
|
|
201
|
+
setPlanInputMode('feedback');
|
|
202
|
+
}
|
|
203
|
+
}, {
|
|
204
|
+
isActive: !inputActive && !!pendingPrompt && pendingPrompt.kind === 'event-plan',
|
|
205
|
+
});
|
|
206
|
+
// Show the latest status message when an overlay is active — RunScreen's
|
|
207
|
+
// own TabContainer handles this for the non-overlay case.
|
|
208
|
+
const overlayValues = Object.values(Overlay);
|
|
209
|
+
const isOverlay = overlayValues.includes(store.currentScreen);
|
|
210
|
+
const lastStatus = isOverlay && store.statusMessages.length > 0
|
|
211
|
+
? store.statusMessages[store.statusMessages.length - 1]
|
|
212
|
+
: null;
|
|
213
|
+
return (_jsxs(Box, { width: width, height: height, flexDirection: "column", borderStyle: "round", borderColor: Colors.muted, children: [_jsx(Box, { flexDirection: "column", flexGrow: 1, overflow: "hidden", children: pendingPrompt ? (_jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: 1, paddingY: 1, children: [pendingPrompt.kind === 'confirm' ? (_jsx(PickerMenu, { message: pendingPrompt.message, options: [
|
|
214
|
+
{ label: 'Yes', value: 'yes' },
|
|
215
|
+
{ label: 'No', value: 'no' },
|
|
216
|
+
], onSelect: (v) => store.resolvePrompt(v === 'yes') })) : pendingPrompt.kind === 'choice' ? (_jsx(PickerMenu, { message: pendingPrompt.message, options: pendingPrompt.options.map((o) => ({
|
|
217
|
+
label: o,
|
|
218
|
+
value: o,
|
|
219
|
+
})), onSelect: (v) => store.resolvePrompt(v) })) : (_jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsx(Text, { color: Colors.primary, bold: true, children: "Instrumentation Plan" }), pendingPrompt.events.map((e) => (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: Colors.accent, bold: true, children: e.name }), _jsx(Text, { color: Colors.muted, children: e.description })] }, e.name))), planInputMode === 'feedback' ? (_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: Colors.muted, children: "Feedback: " }), _jsxs(Text, { children: [planFeedbackText, planCursorVisible ? '▎' : ' '] }), _jsx(Text, { color: Colors.muted, children: "[Enter] send [Esc] cancel" })] })) : (_jsx(Text, { color: Colors.muted, children: "[Y] approve [S] skip [F] give feedback" }))] })), pendingPrompt.kind !== 'event-plan' && (_jsx(Text, { color: Colors.muted, children: " [Q / Esc] skip" }))] })) : responseIsLong ? (_jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: 1, paddingY: 1, children: [_jsx(Box, { justifyContent: "flex-end", children: _jsx(Text, { color: Colors.muted, children: "[Q / Esc] close" }) }), _jsx(Text, { color: Colors.primary, children: response })] })) : (children) }), lastStatus && (_jsxs(Box, { paddingX: 1, overflow: "hidden", children: [_jsxs(Text, { color: Colors.muted, children: [Icons.diamondOpen, " "] }), _jsx(Text, { color: Colors.muted, wrap: "truncate-end", children: lastStatus })] })), screenError && (_jsxs(Box, { paddingX: 1, gap: 1, children: [_jsx(Text, { color: Colors.error, bold: true, children: "\u26A0" }), _jsx(Box, { flexGrow: 1, overflow: "hidden", children: _jsx(Text, { color: Colors.error, wrap: "truncate-end", children: screenError.message }) }), _jsx(Text, { color: Colors.muted, children: "[R] retry" })] })), _jsx(Text, { color: Colors.muted, children: separator }), showFeedback && (_jsxs(Box, { paddingX: 1, children: [_jsx(Text, { color: Colors.accent, bold: true, children: ' ' }), _jsx(Text, { color: Colors.muted, children: feedback })] })), showResponse && !responseIsLong && (_jsx(Box, { paddingX: 1, paddingY: 1, gap: 1, flexDirection: "column", children: loading ? (_jsx(Spinner, {})) : (_jsx(Text, { color: Colors.primary, children: response })) })), loading && responseIsLong && (_jsx(Box, { paddingX: 1, children: _jsx(Spinner, {}) })), _jsx(Box, { paddingX: 1, children: _jsx(SlashCommandInput, { commands: COMMANDS, isActive: inputActive, initialValue: initialValue, onSubmit: handleSubmit, onDeactivate: deactivate }, inputKey) })] }));
|
|
220
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import { Colors } from '../styles.js';
|
|
4
|
+
const FEEDBACK = 'Feedback: wizard@amplitude.com ';
|
|
5
|
+
const FEEDBACK_SHORT = ' wizard@amplitude.com ';
|
|
6
|
+
export const TitleBar = ({ version, width }) => {
|
|
7
|
+
const fullTitle = ` Amplitude Wizard v${version}`;
|
|
8
|
+
const needShort = width < fullTitle.length + FEEDBACK.length;
|
|
9
|
+
const feedback = needShort ? FEEDBACK_SHORT : FEEDBACK;
|
|
10
|
+
const title = needShort && fullTitle.length + feedback.length > width
|
|
11
|
+
? ` Wizard v${version}`
|
|
12
|
+
: fullTitle;
|
|
13
|
+
const gap = Math.max(0, width - title.length - feedback.length);
|
|
14
|
+
const padding = ' '.repeat(gap);
|
|
15
|
+
return (_jsx(Box, { width: width, overflow: "hidden", children: _jsxs(Text, { backgroundColor: Colors.accent, color: "white", bold: true, children: [title, padding, feedback] }) }));
|
|
16
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* console-commands.ts — Slash command definitions and pure helpers.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from ConsoleView so they can be imported in tests without
|
|
5
|
+
* pulling in React / Ink / store dependencies.
|
|
6
|
+
*/
|
|
7
|
+
import type { WizardSession } from '../../lib/wizard-session.js';
|
|
8
|
+
export declare const COMMANDS: {
|
|
9
|
+
cmd: string;
|
|
10
|
+
desc: string;
|
|
11
|
+
}[];
|
|
12
|
+
export declare const TEST_PROMPT: string;
|
|
13
|
+
/** Returns the feedback text for the /whoami command. */
|
|
14
|
+
export declare function getWhoamiText(session: Pick<WizardSession, 'selectedOrgName' | 'selectedWorkspaceName' | 'region'>): string;
|
|
15
|
+
/** Returns the feedback text for the /help command. */
|
|
16
|
+
export declare function getHelpText(): string;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* console-commands.ts — Slash command definitions and pure helpers.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from ConsoleView so they can be imported in tests without
|
|
5
|
+
* pulling in React / Ink / store dependencies.
|
|
6
|
+
*/
|
|
7
|
+
export const COMMANDS = [
|
|
8
|
+
{ cmd: '/region', desc: 'Switch data-center region (US or EU)' },
|
|
9
|
+
{ cmd: '/login', desc: 'Re-authenticate' },
|
|
10
|
+
{ cmd: '/logout', desc: 'Clear stored credentials' },
|
|
11
|
+
{ cmd: '/whoami', desc: 'Show current user, org, and project' },
|
|
12
|
+
{ cmd: '/mcp', desc: 'Install or remove the Amplitude MCP server' },
|
|
13
|
+
{ cmd: '/slack', desc: 'Set up Amplitude Slack integration' },
|
|
14
|
+
{ cmd: '/test', desc: 'Run a prompt-skill demo (confirm + choose)' },
|
|
15
|
+
{ cmd: '/snake', desc: 'Play Snake' },
|
|
16
|
+
{ cmd: '/exit', desc: 'Exit the wizard' },
|
|
17
|
+
{ cmd: '/help', desc: 'List available slash commands' },
|
|
18
|
+
];
|
|
19
|
+
export const TEST_PROMPT = 'Demo the wizard prompt tools. ' +
|
|
20
|
+
'First, use the wizard-tools:confirm tool to ask if I want to continue. ' +
|
|
21
|
+
'Then use the wizard-tools:choose tool to let me pick my favorite color from: Red, Blue, Green, Purple. ' +
|
|
22
|
+
'Finally, summarize what I chose in one sentence.';
|
|
23
|
+
/** Returns the feedback text for the /whoami command. */
|
|
24
|
+
export function getWhoamiText(session) {
|
|
25
|
+
return `org: ${session.selectedOrgName ?? '(none)'} workspace: ${session.selectedWorkspaceName ?? '(none)'} region: ${session.region ?? '(none)'}`;
|
|
26
|
+
}
|
|
27
|
+
/** Returns the feedback text for the /help command. */
|
|
28
|
+
export function getHelpText() {
|
|
29
|
+
const maxCmd = Math.max(...COMMANDS.map((c) => c.cmd.length));
|
|
30
|
+
return COMMANDS.map((c) => `${c.cmd.padEnd(maxCmd)} ${c.desc}`).join('\n');
|
|
31
|
+
}
|