@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.
Files changed (333) hide show
  1. package/LICENSE +47 -0
  2. package/README.md +119 -0
  3. package/dist/bin.d.ts +2 -0
  4. package/dist/bin.js +763 -0
  5. package/dist/package.json +144 -0
  6. package/dist/src/frameworks/android/android-wizard-agent.d.ts +6 -0
  7. package/dist/src/frameworks/android/android-wizard-agent.js +72 -0
  8. package/dist/src/frameworks/android/utils.d.ts +11 -0
  9. package/dist/src/frameworks/android/utils.js +32 -0
  10. package/dist/src/frameworks/django/django-wizard-agent.d.ts +8 -0
  11. package/dist/src/frameworks/django/django-wizard-agent.js +171 -0
  12. package/dist/src/frameworks/django/utils.d.ts +31 -0
  13. package/dist/src/frameworks/django/utils.js +305 -0
  14. package/dist/src/frameworks/fastapi/fastapi-wizard-agent.d.ts +11 -0
  15. package/dist/src/frameworks/fastapi/fastapi-wizard-agent.js +189 -0
  16. package/dist/src/frameworks/fastapi/utils.d.ts +26 -0
  17. package/dist/src/frameworks/fastapi/utils.js +257 -0
  18. package/dist/src/frameworks/flask/flask-wizard-agent.d.ts +8 -0
  19. package/dist/src/frameworks/flask/flask-wizard-agent.js +177 -0
  20. package/dist/src/frameworks/flask/utils.d.ts +28 -0
  21. package/dist/src/frameworks/flask/utils.js +343 -0
  22. package/dist/src/frameworks/flutter/flutter-wizard-agent.d.ts +4 -0
  23. package/dist/src/frameworks/flutter/flutter-wizard-agent.js +57 -0
  24. package/dist/src/frameworks/flutter/utils.d.ts +7 -0
  25. package/dist/src/frameworks/flutter/utils.js +64 -0
  26. package/dist/src/frameworks/generic/generic-wizard-agent.d.ts +2 -0
  27. package/dist/src/frameworks/generic/generic-wizard-agent.js +176 -0
  28. package/dist/src/frameworks/go/go-wizard-agent.d.ts +4 -0
  29. package/dist/src/frameworks/go/go-wizard-agent.js +57 -0
  30. package/dist/src/frameworks/go/utils.d.ts +5 -0
  31. package/dist/src/frameworks/go/utils.js +44 -0
  32. package/dist/src/frameworks/java/java-wizard-agent.d.ts +7 -0
  33. package/dist/src/frameworks/java/java-wizard-agent.js +73 -0
  34. package/dist/src/frameworks/java/utils.d.ts +15 -0
  35. package/dist/src/frameworks/java/utils.js +64 -0
  36. package/dist/src/frameworks/javascript-node/javascript-node-wizard-agent.d.ts +4 -0
  37. package/dist/src/frameworks/javascript-node/javascript-node-wizard-agent.js +57 -0
  38. package/dist/src/frameworks/javascript-web/javascript-web-wizard-agent.d.ts +3 -0
  39. package/dist/src/frameworks/javascript-web/javascript-web-wizard-agent.js +151 -0
  40. package/dist/src/frameworks/javascript-web/utils.d.ts +28 -0
  41. package/dist/src/frameworks/javascript-web/utils.js +153 -0
  42. package/dist/src/frameworks/nextjs/nextjs-wizard-agent.d.ts +7 -0
  43. package/dist/src/frameworks/nextjs/nextjs-wizard-agent.js +98 -0
  44. package/dist/src/frameworks/nextjs/utils.d.ts +12 -0
  45. package/dist/src/frameworks/nextjs/utils.js +51 -0
  46. package/dist/src/frameworks/python/python-wizard-agent.d.ts +7 -0
  47. package/dist/src/frameworks/python/python-wizard-agent.js +193 -0
  48. package/dist/src/frameworks/python/utils.d.ts +28 -0
  49. package/dist/src/frameworks/python/utils.js +146 -0
  50. package/dist/src/frameworks/react-native/react-native-wizard-agent.d.ts +6 -0
  51. package/dist/src/frameworks/react-native/react-native-wizard-agent.js +84 -0
  52. package/dist/src/frameworks/react-native/utils.d.ts +21 -0
  53. package/dist/src/frameworks/react-native/utils.js +82 -0
  54. package/dist/src/frameworks/react-router/react-router-wizard-agent.d.ts +7 -0
  55. package/dist/src/frameworks/react-router/react-router-wizard-agent.js +98 -0
  56. package/dist/src/frameworks/react-router/utils.d.ts +13 -0
  57. package/dist/src/frameworks/react-router/utils.js +160 -0
  58. package/dist/src/frameworks/swift/swift-wizard-agent.d.ts +7 -0
  59. package/dist/src/frameworks/swift/swift-wizard-agent.js +72 -0
  60. package/dist/src/frameworks/swift/utils.d.ts +12 -0
  61. package/dist/src/frameworks/swift/utils.js +82 -0
  62. package/dist/src/frameworks/unity/unity-wizard-agent.d.ts +6 -0
  63. package/dist/src/frameworks/unity/unity-wizard-agent.js +79 -0
  64. package/dist/src/frameworks/unity/utils.d.ts +12 -0
  65. package/dist/src/frameworks/unity/utils.js +66 -0
  66. package/dist/src/frameworks/unreal/unreal-wizard-agent.d.ts +6 -0
  67. package/dist/src/frameworks/unreal/unreal-wizard-agent.js +77 -0
  68. package/dist/src/frameworks/unreal/utils.d.ts +10 -0
  69. package/dist/src/frameworks/unreal/utils.js +29 -0
  70. package/dist/src/frameworks/vue/vue-wizard-agent.d.ts +4 -0
  71. package/dist/src/frameworks/vue/vue-wizard-agent.js +64 -0
  72. package/dist/src/lib/agent-hooks.d.ts +26 -0
  73. package/dist/src/lib/agent-hooks.js +118 -0
  74. package/dist/src/lib/agent-interface.d.ts +175 -0
  75. package/dist/src/lib/agent-interface.js +1217 -0
  76. package/dist/src/lib/agent-runner.d.ts +9 -0
  77. package/dist/src/lib/agent-runner.js +415 -0
  78. package/dist/src/lib/ampli-config.d.ts +105 -0
  79. package/dist/src/lib/ampli-config.js +178 -0
  80. package/dist/src/lib/api.d.ts +107 -0
  81. package/dist/src/lib/api.js +442 -0
  82. package/dist/src/lib/commandments.d.ts +1 -0
  83. package/dist/src/lib/commandments.js +24 -0
  84. package/dist/src/lib/console-query.d.ts +27 -0
  85. package/dist/src/lib/console-query.js +121 -0
  86. package/dist/src/lib/constants.d.ts +124 -0
  87. package/dist/src/lib/constants.js +170 -0
  88. package/dist/src/lib/detect-amplitude.d.ts +31 -0
  89. package/dist/src/lib/detect-amplitude.js +407 -0
  90. package/dist/src/lib/framework-config.d.ts +188 -0
  91. package/dist/src/lib/framework-config.js +21 -0
  92. package/dist/src/lib/health-checks/endpoints.d.ts +3 -0
  93. package/dist/src/lib/health-checks/endpoints.js +45 -0
  94. package/dist/src/lib/health-checks/index.d.ts +4 -0
  95. package/dist/src/lib/health-checks/index.js +22 -0
  96. package/dist/src/lib/health-checks/readiness.d.ts +24 -0
  97. package/dist/src/lib/health-checks/readiness.js +118 -0
  98. package/dist/src/lib/health-checks/statuspage.d.ts +9 -0
  99. package/dist/src/lib/health-checks/statuspage.js +104 -0
  100. package/dist/src/lib/health-checks/types.d.ts +31 -0
  101. package/dist/src/lib/health-checks/types.js +9 -0
  102. package/dist/src/lib/helper-functions.d.ts +1 -0
  103. package/dist/src/lib/helper-functions.js +5 -0
  104. package/dist/src/lib/middleware/benchmark.d.ts +54 -0
  105. package/dist/src/lib/middleware/benchmark.js +48 -0
  106. package/dist/src/lib/middleware/benchmarks/cache-tracker.d.ts +44 -0
  107. package/dist/src/lib/middleware/benchmarks/cache-tracker.js +80 -0
  108. package/dist/src/lib/middleware/benchmarks/compaction-tracker.d.ts +29 -0
  109. package/dist/src/lib/middleware/benchmarks/compaction-tracker.js +59 -0
  110. package/dist/src/lib/middleware/benchmarks/context-size-tracker.d.ts +26 -0
  111. package/dist/src/lib/middleware/benchmarks/context-size-tracker.js +55 -0
  112. package/dist/src/lib/middleware/benchmarks/cost-tracker.d.ts +16 -0
  113. package/dist/src/lib/middleware/benchmarks/cost-tracker.js +75 -0
  114. package/dist/src/lib/middleware/benchmarks/duration-tracker.d.ts +20 -0
  115. package/dist/src/lib/middleware/benchmarks/duration-tracker.js +39 -0
  116. package/dist/src/lib/middleware/benchmarks/index.d.ts +9 -0
  117. package/dist/src/lib/middleware/benchmarks/index.js +67 -0
  118. package/dist/src/lib/middleware/benchmarks/json-writer.d.ts +15 -0
  119. package/dist/src/lib/middleware/benchmarks/json-writer.js +144 -0
  120. package/dist/src/lib/middleware/benchmarks/summary.d.ts +9 -0
  121. package/dist/src/lib/middleware/benchmarks/summary.js +105 -0
  122. package/dist/src/lib/middleware/benchmarks/token-tracker.d.ts +40 -0
  123. package/dist/src/lib/middleware/benchmarks/token-tracker.js +76 -0
  124. package/dist/src/lib/middleware/benchmarks/turn-counter.d.ts +34 -0
  125. package/dist/src/lib/middleware/benchmarks/turn-counter.js +58 -0
  126. package/dist/src/lib/middleware/config.d.ts +24 -0
  127. package/dist/src/lib/middleware/config.js +96 -0
  128. package/dist/src/lib/middleware/index.d.ts +11 -0
  129. package/dist/src/lib/middleware/index.js +17 -0
  130. package/dist/src/lib/middleware/phase-detector.d.ts +8 -0
  131. package/dist/src/lib/middleware/phase-detector.js +63 -0
  132. package/dist/src/lib/middleware/pipeline.d.ts +29 -0
  133. package/dist/src/lib/middleware/pipeline.js +81 -0
  134. package/dist/src/lib/middleware/schemas.d.ts +27 -0
  135. package/dist/src/lib/middleware/schemas.js +84 -0
  136. package/dist/src/lib/middleware/types.d.ts +94 -0
  137. package/dist/src/lib/middleware/types.js +8 -0
  138. package/dist/src/lib/package-manager-detection.d.ts +42 -0
  139. package/dist/src/lib/package-manager-detection.js +292 -0
  140. package/dist/src/lib/registry.d.ts +3 -0
  141. package/dist/src/lib/registry.js +42 -0
  142. package/dist/src/lib/safe-tools.d.ts +2 -0
  143. package/dist/src/lib/safe-tools.js +214 -0
  144. package/dist/src/lib/wizard-session.d.ts +220 -0
  145. package/dist/src/lib/wizard-session.js +127 -0
  146. package/dist/src/lib/wizard-tools.d.ts +82 -0
  147. package/dist/src/lib/wizard-tools.js +499 -0
  148. package/dist/src/run.d.ts +19 -0
  149. package/dist/src/run.js +151 -0
  150. package/dist/src/steps/add-mcp-server-to-clients/MCPClient.d.ts +30 -0
  151. package/dist/src/steps/add-mcp-server-to-clients/MCPClient.js +141 -0
  152. package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.d.ts +29 -0
  153. package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.js +180 -0
  154. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +20 -0
  155. package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js +63 -0
  156. package/dist/src/steps/add-mcp-server-to-clients/clients/codex.d.ts +28 -0
  157. package/dist/src/steps/add-mcp-server-to-clients/clients/codex.js +77 -0
  158. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.d.ts +24 -0
  159. package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +60 -0
  160. package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.d.ts +27 -0
  161. package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.js +101 -0
  162. package/dist/src/steps/add-mcp-server-to-clients/clients/zed.d.ts +26 -0
  163. package/dist/src/steps/add-mcp-server-to-clients/clients/zed.js +102 -0
  164. package/dist/src/steps/add-mcp-server-to-clients/defaults.d.ts +44 -0
  165. package/dist/src/steps/add-mcp-server-to-clients/defaults.js +123 -0
  166. package/dist/src/steps/add-mcp-server-to-clients/index.d.ts +19 -0
  167. package/dist/src/steps/add-mcp-server-to-clients/index.js +110 -0
  168. package/dist/src/steps/add-or-update-environment-variables.d.ts +10 -0
  169. package/dist/src/steps/add-or-update-environment-variables.js +188 -0
  170. package/dist/src/steps/index.d.ts +4 -0
  171. package/dist/src/steps/index.js +20 -0
  172. package/dist/src/steps/run-prettier.d.ts +5 -0
  173. package/dist/src/steps/run-prettier.js +90 -0
  174. package/dist/src/steps/upload-environment-variables/EnvironmentProvider.d.ts +11 -0
  175. package/dist/src/steps/upload-environment-variables/EnvironmentProvider.js +11 -0
  176. package/dist/src/steps/upload-environment-variables/index.d.ts +6 -0
  177. package/dist/src/steps/upload-environment-variables/index.js +37 -0
  178. package/dist/src/steps/upload-environment-variables/providers/vercel.d.ts +15 -0
  179. package/dist/src/steps/upload-environment-variables/providers/vercel.js +145 -0
  180. package/dist/src/telemetry.d.ts +2 -0
  181. package/dist/src/telemetry.js +12 -0
  182. package/dist/src/ui/index.d.ts +8 -0
  183. package/dist/src/ui/index.js +16 -0
  184. package/dist/src/ui/logging-ui.d.ts +56 -0
  185. package/dist/src/ui/logging-ui.js +157 -0
  186. package/dist/src/ui/tui/App.d.ts +6 -0
  187. package/dist/src/ui/tui/App.js +34 -0
  188. package/dist/src/ui/tui/components/AmplitudeLogo.d.ts +5 -0
  189. package/dist/src/ui/tui/components/AmplitudeLogo.js +81 -0
  190. package/dist/src/ui/tui/components/AmplitudeTextLogo.d.ts +3 -0
  191. package/dist/src/ui/tui/components/AmplitudeTextLogo.js +31 -0
  192. package/dist/src/ui/tui/components/ConsoleView.d.ts +23 -0
  193. package/dist/src/ui/tui/components/ConsoleView.js +220 -0
  194. package/dist/src/ui/tui/components/TitleBar.d.ts +6 -0
  195. package/dist/src/ui/tui/components/TitleBar.js +16 -0
  196. package/dist/src/ui/tui/console-commands.d.ts +16 -0
  197. package/dist/src/ui/tui/console-commands.js +31 -0
  198. package/dist/src/ui/tui/context/CommandModeContext.d.ts +2 -0
  199. package/dist/src/ui/tui/context/CommandModeContext.js +3 -0
  200. package/dist/src/ui/tui/flows.d.ts +48 -0
  201. package/dist/src/ui/tui/flows.js +154 -0
  202. package/dist/src/ui/tui/hooks/useScreenInput.d.ts +13 -0
  203. package/dist/src/ui/tui/hooks/useScreenInput.js +18 -0
  204. package/dist/src/ui/tui/hooks/useStdoutDimensions.d.ts +9 -0
  205. package/dist/src/ui/tui/hooks/useStdoutDimensions.js +29 -0
  206. package/dist/src/ui/tui/ink-ui.d.ts +62 -0
  207. package/dist/src/ui/tui/ink-ui.js +142 -0
  208. package/dist/src/ui/tui/primitives/CardLayout.d.ts +12 -0
  209. package/dist/src/ui/tui/primitives/CardLayout.js +9 -0
  210. package/dist/src/ui/tui/primitives/ConfirmationInput.d.ts +13 -0
  211. package/dist/src/ui/tui/primitives/ConfirmationInput.js +35 -0
  212. package/dist/src/ui/tui/primitives/DissolveTransition.d.ts +21 -0
  213. package/dist/src/ui/tui/primitives/DissolveTransition.js +143 -0
  214. package/dist/src/ui/tui/primitives/EventPlanViewer.d.ts +9 -0
  215. package/dist/src/ui/tui/primitives/EventPlanViewer.js +9 -0
  216. package/dist/src/ui/tui/primitives/KagiSmallWebViewer.d.ts +7 -0
  217. package/dist/src/ui/tui/primitives/KagiSmallWebViewer.js +101 -0
  218. package/dist/src/ui/tui/primitives/LoadingBox.d.ts +8 -0
  219. package/dist/src/ui/tui/primitives/LoadingBox.js +9 -0
  220. package/dist/src/ui/tui/primitives/LogViewer.d.ts +11 -0
  221. package/dist/src/ui/tui/primitives/LogViewer.js +55 -0
  222. package/dist/src/ui/tui/primitives/PickerMenu.d.ts +20 -0
  223. package/dist/src/ui/tui/primitives/PickerMenu.js +212 -0
  224. package/dist/src/ui/tui/primitives/ProgressList.d.ts +15 -0
  225. package/dist/src/ui/tui/primitives/ProgressList.js +29 -0
  226. package/dist/src/ui/tui/primitives/PromptLabel.d.ts +11 -0
  227. package/dist/src/ui/tui/primitives/PromptLabel.js +12 -0
  228. package/dist/src/ui/tui/primitives/ReportViewer.d.ts +12 -0
  229. package/dist/src/ui/tui/primitives/ReportViewer.js +99 -0
  230. package/dist/src/ui/tui/primitives/ScreenErrorBoundary.d.ts +26 -0
  231. package/dist/src/ui/tui/primitives/ScreenErrorBoundary.js +29 -0
  232. package/dist/src/ui/tui/primitives/SlashCommandInput.d.ts +21 -0
  233. package/dist/src/ui/tui/primitives/SlashCommandInput.js +85 -0
  234. package/dist/src/ui/tui/primitives/SnakeGame.d.ts +1 -0
  235. package/dist/src/ui/tui/primitives/SnakeGame.js +1 -0
  236. package/dist/src/ui/tui/primitives/SplitView.d.ts +11 -0
  237. package/dist/src/ui/tui/primitives/SplitView.js +8 -0
  238. package/dist/src/ui/tui/primitives/TabContainer.d.ts +18 -0
  239. package/dist/src/ui/tui/primitives/TabContainer.js +30 -0
  240. package/dist/src/ui/tui/primitives/index.d.ts +23 -0
  241. package/dist/src/ui/tui/primitives/index.js +19 -0
  242. package/dist/src/ui/tui/router.d.ts +61 -0
  243. package/dist/src/ui/tui/router.js +104 -0
  244. package/dist/src/ui/tui/screen-registry.d.ts +19 -0
  245. package/dist/src/ui/tui/screen-registry.js +56 -0
  246. package/dist/src/ui/tui/screens/ActivationOptionsScreen.d.ts +12 -0
  247. package/dist/src/ui/tui/screens/ActivationOptionsScreen.js +57 -0
  248. package/dist/src/ui/tui/screens/AuthScreen.d.ts +18 -0
  249. package/dist/src/ui/tui/screens/AuthScreen.js +107 -0
  250. package/dist/src/ui/tui/screens/ChecklistScreen.d.ts +22 -0
  251. package/dist/src/ui/tui/screens/ChecklistScreen.js +122 -0
  252. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.d.ts +24 -0
  253. package/dist/src/ui/tui/screens/DataIngestionCheckScreen.js +113 -0
  254. package/dist/src/ui/tui/screens/DataSetupScreen.d.ts +17 -0
  255. package/dist/src/ui/tui/screens/DataSetupScreen.js +73 -0
  256. package/dist/src/ui/tui/screens/IntroScreen.d.ts +16 -0
  257. package/dist/src/ui/tui/screens/IntroScreen.js +86 -0
  258. package/dist/src/ui/tui/screens/LoginScreen.d.ts +15 -0
  259. package/dist/src/ui/tui/screens/LoginScreen.js +65 -0
  260. package/dist/src/ui/tui/screens/LogoutScreen.d.ts +12 -0
  261. package/dist/src/ui/tui/screens/LogoutScreen.js +28 -0
  262. package/dist/src/ui/tui/screens/McpScreen.d.ts +26 -0
  263. package/dist/src/ui/tui/screens/McpScreen.js +148 -0
  264. package/dist/src/ui/tui/screens/OutageScreen.d.ts +10 -0
  265. package/dist/src/ui/tui/screens/OutageScreen.js +17 -0
  266. package/dist/src/ui/tui/screens/OutroScreen.d.ts +11 -0
  267. package/dist/src/ui/tui/screens/OutroScreen.js +69 -0
  268. package/dist/src/ui/tui/screens/RegionSelectScreen.d.ts +17 -0
  269. package/dist/src/ui/tui/screens/RegionSelectScreen.js +40 -0
  270. package/dist/src/ui/tui/screens/RunScreen.d.ts +16 -0
  271. package/dist/src/ui/tui/screens/RunScreen.js +212 -0
  272. package/dist/src/ui/tui/screens/SettingsOverrideScreen.d.ts +10 -0
  273. package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +23 -0
  274. package/dist/src/ui/tui/screens/SetupScreen.d.ts +13 -0
  275. package/dist/src/ui/tui/screens/SetupScreen.js +73 -0
  276. package/dist/src/ui/tui/screens/SlackScreen.d.ts +25 -0
  277. package/dist/src/ui/tui/screens/SlackScreen.js +97 -0
  278. package/dist/src/ui/tui/services/mcp-installer.d.ts +25 -0
  279. package/dist/src/ui/tui/services/mcp-installer.js +82 -0
  280. package/dist/src/ui/tui/start-tui.d.ts +10 -0
  281. package/dist/src/ui/tui/start-tui.js +50 -0
  282. package/dist/src/ui/tui/store.d.ts +231 -0
  283. package/dist/src/ui/tui/store.js +568 -0
  284. package/dist/src/ui/tui/styles.d.ts +31 -0
  285. package/dist/src/ui/tui/styles.js +33 -0
  286. package/dist/src/ui/wizard-ui.d.ts +110 -0
  287. package/dist/src/ui/wizard-ui.js +18 -0
  288. package/dist/src/utils/ampli-settings.d.ts +37 -0
  289. package/dist/src/utils/ampli-settings.js +182 -0
  290. package/dist/src/utils/analytics.d.ts +35 -0
  291. package/dist/src/utils/analytics.js +133 -0
  292. package/dist/src/utils/anthropic-status.d.ts +17 -0
  293. package/dist/src/utils/anthropic-status.js +51 -0
  294. package/dist/src/utils/api-key-store.d.ts +35 -0
  295. package/dist/src/utils/api-key-store.js +176 -0
  296. package/dist/src/utils/bash.d.ts +2 -0
  297. package/dist/src/utils/bash.js +53 -0
  298. package/dist/src/utils/custom-headers.d.ts +9 -0
  299. package/dist/src/utils/custom-headers.js +23 -0
  300. package/dist/src/utils/debug.d.ts +23 -0
  301. package/dist/src/utils/debug.js +86 -0
  302. package/dist/src/utils/environment.d.ts +4 -0
  303. package/dist/src/utils/environment.js +76 -0
  304. package/dist/src/utils/file-utils.d.ts +2 -0
  305. package/dist/src/utils/file-utils.js +16 -0
  306. package/dist/src/utils/get-api-key.d.ts +17 -0
  307. package/dist/src/utils/get-api-key.js +50 -0
  308. package/dist/src/utils/logging.d.ts +9 -0
  309. package/dist/src/utils/logging.js +48 -0
  310. package/dist/src/utils/oauth.d.ts +53 -0
  311. package/dist/src/utils/oauth.js +354 -0
  312. package/dist/src/utils/package-json.d.ts +25 -0
  313. package/dist/src/utils/package-json.js +26 -0
  314. package/dist/src/utils/package-manager.d.ts +21 -0
  315. package/dist/src/utils/package-manager.js +208 -0
  316. package/dist/src/utils/semver.d.ts +21 -0
  317. package/dist/src/utils/semver.js +61 -0
  318. package/dist/src/utils/setup-utils.d.ts +82 -0
  319. package/dist/src/utils/setup-utils.js +467 -0
  320. package/dist/src/utils/shell-completions.d.ts +10 -0
  321. package/dist/src/utils/shell-completions.js +199 -0
  322. package/dist/src/utils/string.d.ts +1 -0
  323. package/dist/src/utils/string.js +8 -0
  324. package/dist/src/utils/types.d.ts +72 -0
  325. package/dist/src/utils/types.js +2 -0
  326. package/dist/src/utils/urls.d.ts +14 -0
  327. package/dist/src/utils/urls.js +69 -0
  328. package/dist/src/utils/vendor/is-unicorn-supported.d.ts +1 -0
  329. package/dist/src/utils/vendor/is-unicorn-supported.js +23 -0
  330. package/dist/src/utils/wizard-abort.d.ts +13 -0
  331. package/dist/src/utils/wizard-abort.js +56 -0
  332. package/man/amplitude-wizard.1 +170 -0
  333. 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,6 @@
1
+ import type { WizardStore } from './store.js';
2
+ interface AppProps {
3
+ store: WizardStore;
4
+ }
5
+ export declare const App: ({ store }: AppProps) => import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -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,3 @@
1
+ export declare const AMP_BLUE = "#1E61F0";
2
+ export declare const AMP_CYAN = "#00D4AA";
3
+ export declare const AmplitudeTextLogo: () => import("react/jsx-runtime").JSX.Element;
@@ -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,6 @@
1
+ interface TitleBarProps {
2
+ version: string;
3
+ width: number;
4
+ }
5
+ export declare const TitleBar: ({ version, width }: TitleBarProps) => import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -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
+ }
@@ -0,0 +1,2 @@
1
+ /** True when the user is actively typing a slash command in the command bar. */
2
+ export declare const CommandModeContext: import("react").Context<boolean>;
@@ -0,0 +1,3 @@
1
+ import { createContext } from 'react';
2
+ /** True when the user is actively typing a slash command in the command bar. */
3
+ export const CommandModeContext = createContext(false);