Browse Source

CLI: Add onboarding wizard and auth command

Remon Oldenbeuving 3 months ago
parent
commit
f4fb2e2f35

+ 2 - 2
cli/esbuild.config.mjs

@@ -149,8 +149,8 @@ const __dirname = __dirname__(__filename);
 		"socket.io-client",
 		"sound-play",
 		"stream-json",
-		"string-width",
-		"strip-ansi",
+		// "string-width",
+		// "strip-ansi",
 		"strip-bom",
 		"tiktoken",
 		"tmp",

+ 1 - 0
cli/package.json

@@ -74,6 +74,7 @@
 		"ink-spinner": "^5.0.0",
 		"ink-table": "^3.1.0",
 		"ink-text-input": "^6.0.0",
+		"inquirer": "^12.10.0",
 		"is-wsl": "^3.1.0",
 		"isbinaryfile": "^5.0.2",
 		"jotai": "^2.14.0",

+ 2 - 55
cli/src/config/defaults.ts

@@ -45,7 +45,7 @@ export const DEFAULT_AUTO_APPROVAL: AutoApprovalConfig = {
 	},
 }
 
-export const DEFAULT_CONFIG: CLIConfig = {
+export const DEFAULT_CONFIG = {
 	version: "1.0.0",
 	mode: "code",
 	telemetry: true,
@@ -60,57 +60,4 @@ export const DEFAULT_CONFIG: CLIConfig = {
 	],
 	autoApproval: DEFAULT_AUTO_APPROVAL,
 	theme: "dark",
-}
-
-export function createDefaultProvider(provider: string): any {
-	switch (provider) {
-		case "kilocode":
-			return {
-				id: "kilocode-default",
-				provider: "kilocode",
-				kilocodeToken: "",
-				kilocodeModel: "anthropic/claude-sonnet-4",
-			}
-		case "anthropic":
-			return {
-				id: "anthropic-default",
-				provider: "anthropic",
-				apiKey: "",
-				apiModelId: "claude-3-5-sonnet-20241022",
-			}
-		case "openai-native":
-			return {
-				id: "openai-default",
-				provider: "openai-native",
-				openAiNativeApiKey: "",
-				apiModelId: "gpt-4o",
-			}
-		case "openrouter":
-			return {
-				id: "openrouter-default",
-				provider: "openrouter",
-				openRouterApiKey: "",
-				openRouterModelId: "anthropic/claude-3-5-sonnet",
-			}
-		case "ollama":
-			return {
-				id: "ollama-default",
-				provider: "ollama",
-				ollamaBaseUrl: "http://localhost:11434",
-				ollamaModelId: "llama3.2",
-			}
-		case "openai":
-			return {
-				id: "openai-default",
-				provider: "openai",
-				openAiApiKey: "",
-				openAiBaseUrl: "",
-				apiModelId: "gpt-4o",
-			}
-		default:
-			return {
-				id: `${provider}-default`,
-				provider,
-			}
-	}
-}
+} satisfies CLIConfig

+ 1 - 4
cli/src/config/persistence.ts

@@ -116,10 +116,7 @@ export async function loadConfig(): Promise<ConfigLoadResult> {
 	try {
 		await ensureConfigDir()
 
-		// Check if config file exists
-		try {
-			await fs.access(configFile)
-		} catch {
+		if (!(await configExists())) {
 			// File doesn't exist, write default config directly without validation
 			// (DEFAULT_CONFIG may have empty credentials which is ok for initial setup)
 			await fs.writeFile(configFile, JSON.stringify(DEFAULT_CONFIG, null, 2))

+ 17 - 71
cli/src/index.ts

@@ -6,14 +6,13 @@ loadEnvFile()
 
 import { Command } from "commander"
 import { existsSync } from "fs"
-import { spawn } from "child_process"
-import { platform } from "os"
 import { CLI } from "./cli.js"
 import { DEFAULT_MODES } from "./constants/modes/defaults.js"
-import { configExists, saveConfig, getConfigPath, ensureConfigDir } from "./config/persistence.js"
-import { DEFAULT_CONFIG } from "./config/defaults.js"
 import { getTelemetryService } from "./services/telemetry/index.js"
 import { Package } from "./constants/package.js"
+import openConfigFile from "./ui/utils/openConfig.js"
+import authWizard from "./utils/authWizard.js"
+import { configExists } from "./config/persistence.js"
 
 const program = new Command()
 let cli: CLI | null = null
@@ -83,6 +82,12 @@ program
 			getTelemetryService().trackCIModeStarted(finalPrompt.length, options.timeout)
 		}
 
+		if (!(await configExists())) {
+			console.info("Welcome to the Kilo Code CLI! 🎉\n")
+			console.info("To get you started, please fill out these following questions.")
+			await authWizard()
+		}
+
 		cli = new CLI({
 			mode: options.mode,
 			workspace: options.workspace,
@@ -94,78 +99,19 @@ program
 		await cli.dispose()
 	})
 
+program
+	.command("auth")
+	.description("Manage authentication for the Kilo Code CLI")
+	.action(async () => {
+		await authWizard()
+	})
+
 // Config command - opens the config file in the default editor
 program
 	.command("config")
 	.description("Open the configuration file in your default editor")
 	.action(async () => {
-		try {
-			// Ensure config directory exists
-			await ensureConfigDir()
-
-			// Check if config file exists, if not create it with defaults
-			const exists = await configExists()
-			if (!exists) {
-				console.log("Config file not found. Creating default configuration...")
-				// Skip validation when creating default config since tokens may be empty
-				await saveConfig(DEFAULT_CONFIG, true)
-				console.log("Default configuration created.")
-			}
-
-			// Get the config file path
-			const configPath = await getConfigPath()
-			console.log(`Opening config file: ${configPath}`)
-
-			// Determine the editor command based on platform and environment
-			const editor = process.env.EDITOR || process.env.VISUAL
-			let editorCommand: string
-			let editorArgs: string[]
-
-			if (editor) {
-				// Use user's preferred editor from environment variable
-				editorCommand = editor
-				editorArgs = [configPath]
-			} else {
-				// Use platform-specific default
-				const currentPlatform = platform()
-				switch (currentPlatform) {
-					case "darwin": // macOS
-						editorCommand = "open"
-						editorArgs = ["-t", configPath] // -t opens in default text editor
-						break
-					case "win32": // Windows
-						editorCommand = "cmd"
-						editorArgs = ["/c", "start", "", configPath]
-						break
-					default: // Linux and others
-						editorCommand = "xdg-open"
-						editorArgs = [configPath]
-						break
-				}
-			}
-
-			// Spawn the editor process
-			const editorProcess = spawn(editorCommand, editorArgs, {
-				stdio: "inherit",
-			})
-
-			editorProcess.on("error", (error) => {
-				console.error(`Failed to open editor: ${error.message}`)
-				console.error(`Tried to run: ${editorCommand} ${editorArgs.join(" ")}`)
-				console.error(`\nYou can manually edit the config file at: ${configPath}`)
-				process.exit(1)
-			})
-
-			editorProcess.on("exit", (code) => {
-				if (code !== 0 && code !== null) {
-					console.error(`Editor exited with code ${code}`)
-					console.error(`Config file location: ${configPath}`)
-				}
-			})
-		} catch (error) {
-			console.error("Error managing config file:", error instanceof Error ? error.message : String(error))
-			process.exit(1)
-		}
+		await openConfigFile()
 	})
 
 // Handle process termination signals

+ 73 - 0
cli/src/ui/utils/openConfig.ts

@@ -0,0 +1,73 @@
+import { spawn } from "child_process"
+import { platform } from "os"
+import { ensureConfigDir, configExists, saveConfig, DEFAULT_CONFIG, getConfigPath } from "../../config"
+
+export default async function openConfigFile() {
+	try {
+		// Ensure config directory exists
+		await ensureConfigDir()
+
+		// Check if config file exists, if not create it with defaults
+		const exists = await configExists()
+		if (!exists) {
+			console.log("Config file not found. Creating default configuration...")
+			// Skip validation when creating default config since tokens may be empty
+			await saveConfig(DEFAULT_CONFIG, true)
+			console.log("Default configuration created.")
+		}
+
+		// Get the config file path
+		const configPath = await getConfigPath()
+		console.log(`Opening config file: ${configPath}`)
+
+		// Determine the editor command based on platform and environment
+		const editor = process.env.EDITOR || process.env.VISUAL
+		let editorCommand: string
+		let editorArgs: string[]
+
+		if (editor) {
+			// Use user's preferred editor from environment variable
+			editorCommand = editor
+			editorArgs = [configPath]
+		} else {
+			// Use platform-specific default
+			const currentPlatform = platform()
+			switch (currentPlatform) {
+				case "darwin": // macOS
+					editorCommand = "open"
+					editorArgs = ["-t", configPath] // -t opens in default text editor
+					break
+				case "win32": // Windows
+					editorCommand = "cmd"
+					editorArgs = ["/c", "start", "", configPath]
+					break
+				default: // Linux and others
+					editorCommand = "xdg-open"
+					editorArgs = [configPath]
+					break
+			}
+		}
+
+		// Spawn the editor process
+		const editorProcess = spawn(editorCommand, editorArgs, {
+			stdio: "inherit",
+		})
+
+		editorProcess.on("error", (error) => {
+			console.error(`Failed to open editor: ${error.message}`)
+			console.error(`Tried to run: ${editorCommand} ${editorArgs.join(" ")}`)
+			console.error(`\nYou can manually edit the config file at: ${configPath}`)
+			process.exit(1)
+		})
+
+		editorProcess.on("exit", (code) => {
+			if (code !== 0 && code !== null) {
+				console.error(`Editor exited with code ${code}`)
+				console.error(`Config file location: ${configPath}`)
+			}
+		})
+	} catch (error) {
+		console.error("Error managing config file:", error instanceof Error ? error.message : String(error))
+		process.exit(1)
+	}
+}

+ 5 - 0
cli/src/ui/utils/wait.ts

@@ -0,0 +1,5 @@
+export default async function wait(t: number) {
+	return new Promise((resolve) => {
+		setTimeout(resolve, t)
+	})
+}

+ 75 - 0
cli/src/utils/authWizard.ts

@@ -0,0 +1,75 @@
+import inquirer from "inquirer"
+import { loadConfig, saveConfig, CLIConfig } from "../config"
+import openConfigFile from "../ui/utils/openConfig"
+import wait from "../ui/utils/wait"
+
+export default async function authWizard() {
+	const config = await loadConfig()
+	let providerSpecificConfig: Record<string, string> = {}
+
+	const providerOptions = [
+		{ name: "Kilo Code", value: "kilocode" },
+		{ name: "zAI", value: "zai" },
+		{ name: "Other", value: "other" },
+	] as const
+	type ProviderOption = (typeof providerOptions)[number]["value"]
+
+	const { provider } = await inquirer.prompt<{ provider: ProviderOption; kilocodeToken: string }>([
+		{
+			type: "list",
+			name: "provider",
+			message: "Please select which provider you would like to use:",
+			choices: providerOptions,
+		},
+	])
+
+	switch (provider) {
+		case "kilocode": {
+			console.info(
+				"\nPlease navigate to https://app.kilocode.ai and copy your API key from the bottom of the page!\n",
+			)
+			const { kilocodeToken } = await inquirer.prompt<{ kilocodeToken: string }>([
+				{
+					type: "password",
+					name: "kilocodeToken",
+					message: "API Key:",
+				},
+			])
+			providerSpecificConfig = { kilocodeToken, kilocodeModel: "anthropic/claude-sonnet-4.5" }
+			break
+		}
+		case "zai": {
+			const { zaiApiKey } = await inquirer.prompt<{ zaiApiKey: string }>([
+				{
+					type: "password",
+					name: "zaiApiKey",
+					message: "Please enter your zAI token:",
+				},
+			])
+			providerSpecificConfig = { zaiApiKey }
+			break
+		}
+		case "other": {
+			console.info("Please manually add your provider setttings to the config file.")
+			console.info(
+				"Check out https://github.com/Kilo-Org/kilocode/blob/main/cli/docs/PROVIDER_CONFIGURATION.md to see potential configuration options",
+			)
+			await wait(1500)
+			await openConfigFile()
+			return
+		}
+	}
+
+	const newConfig = {
+		...config.config,
+		providers: [
+			{
+				id: "default",
+				provider,
+				...providerSpecificConfig,
+			},
+		],
+	}
+
+	await saveConfig(newConfig as CLIConfig)
+}

+ 391 - 18
pnpm-lock.yaml

@@ -714,6 +714,9 @@ importers:
       ink-text-input:
         specifier: ^6.0.0
         version: 6.0.0([email protected](@types/[email protected])([email protected])([email protected]))([email protected])
+      inquirer:
+        specifier: ^12.10.0
+        version: 12.10.0(@types/[email protected])
       is-wsl:
         specifier: ^3.1.0
         version: 3.1.0
@@ -794,7 +797,7 @@ importers:
         version: 1.2.0
       puppeteer-chromium-resolver:
         specifier: ^24.0.2
-        version: '@catrielmuller/puppeteer-chromium-resolver@24.0.2'
+        version: 24.0.2
       puppeteer-core:
         specifier: ^23.4.0
         version: 23.11.1
@@ -3350,9 +3353,6 @@ packages:
     resolution: {integrity: sha512-0QhLg51eFB+SS/a4Pv5tHaRSnjJBpdFsjT3WN/Vfh6qzeFXqvaE+evVIIToYvr2lRBLg1NIB635ip8ML+/84Sg==}
     engines: {node: '>=18.0.0'}
 
-  '@catrielmuller/[email protected]':
-    resolution: {integrity: sha512-/hvJx+9/OXSwB41AlGAXmCKAczco/3IDvSC1JtkIxvpFdf904pFBuU8cciuIWrPaVGvVs31KzPE5MngfnAuz5A==}
-
   '@cerebras/[email protected]':
     resolution: {integrity: sha512-5IFlD9jvZr5fRsHd4pL4sFkzDPSvHxzM0dmk3mJG2/biRBl+3EV6CdXCabf7J8kr8hyQyK67N0rQLnYy6NSh9w==}
 
@@ -4372,6 +4372,55 @@ packages:
     cpu: [x64]
     os: [win32]
 
+  '@inquirer/[email protected]':
+    resolution: {integrity: sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==}
+    engines: {node: '>=18'}
+
+  '@inquirer/[email protected]':
+    resolution: {integrity: sha512-5+Q3PKH35YsnoPTh75LucALdAxom6xh5D1oeY561x4cqBuH24ZFVyFREPe14xgnrtmGu3EEt1dIi60wRVSnGCw==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@types/node': '>=18'
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+
+  '@inquirer/[email protected]':
+    resolution: {integrity: sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@types/node': '>=18'
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+
+  '@inquirer/[email protected]':
+    resolution: {integrity: sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@types/node': '>=18'
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+
+  '@inquirer/[email protected]':
+    resolution: {integrity: sha512-MjtjOGjr0Kh4BciaFShYpZ1s9400idOdvQ5D7u7lE6VztPFoyLcVNE5dXBmEEIQq5zi4B9h2kU+q7AVBxJMAkQ==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@types/node': '>=18'
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+
+  '@inquirer/[email protected]':
+    resolution: {integrity: sha512-+mScLhIcbPFmuvU3tAGBed78XvYHSvCl6dBiYMlzCLhpr0bzGzd8tfivMMeqND6XZiaZ1tgusbUHJEfc6YzOdA==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@types/node': '>=18'
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+
   '@inquirer/[email protected]':
     resolution: {integrity: sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==}
     engines: {node: '>=18'}
@@ -4381,6 +4430,91 @@ packages:
       '@types/node':
         optional: true
 
+  '@inquirer/[email protected]':
+    resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@types/node': '>=18'
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+
+  '@inquirer/[email protected]':
+    resolution: {integrity: sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==}
+    engines: {node: '>=18'}
+
+  '@inquirer/[email protected]':
+    resolution: {integrity: sha512-7GoWev7P6s7t0oJbenH0eQ0ThNdDJbEAEtVt9vsrYZ9FulIokvd823yLyhQlWHJPGce1wzP53ttfdCZmonMHyA==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@types/node': '>=18'
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+
+  '@inquirer/[email protected]':
+    resolution: {integrity: sha512-5QWs0KGaNMlhbdhOSCFfKsW+/dcAVC2g4wT/z2MCiZM47uLgatC5N20kpkDQf7dHx+XFct/MJvvNGy6aYJn4Pw==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@types/node': '>=18'
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+
+  '@inquirer/[email protected]':
+    resolution: {integrity: sha512-xxeW1V5SbNFNig2pLfetsDb0svWlKuhmr7MPJZMYuDnCTkpVBI+X/doudg4pznc1/U+yYmWFFOi4hNvGgUo7EA==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@types/node': '>=18'
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+
+  '@inquirer/[email protected]':
+    resolution: {integrity: sha512-X7/+dG9SLpSzRkwgG5/xiIzW0oMrV3C0HOa7YHG1WnrLK+vCQHfte4k/T80059YBdei29RBC3s+pSMvPJDU9/A==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@types/node': '>=18'
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+
+  '@inquirer/[email protected]':
+    resolution: {integrity: sha512-AWpxB7MuJrRiSfTKGJ7Y68imYt8P9N3Gaa7ySdkFj1iWjr6WfbGAhdZvw/UnhFXTHITJzxGUI9k8IX7akAEBCg==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@types/node': '>=18'
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+
+  '@inquirer/[email protected]':
+    resolution: {integrity: sha512-a5SzB/qrXafDX1Z4AZW3CsVoiNxcIYCzYP7r9RzrfMpaLpB+yWi5U8BWagZyLmwR0pKbbL5umnGRd0RzGVI8bQ==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@types/node': '>=18'
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+
+  '@inquirer/[email protected]':
+    resolution: {integrity: sha512-kaC3FHsJZvVyIjYBs5Ih8y8Bj4P/QItQWrZW22WJax7zTN+ZPXVGuOM55vzbdCP9zKUiBd9iEJVdesujfF+cAA==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@types/node': '>=18'
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+
+  '@inquirer/[email protected]':
+    resolution: {integrity: sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@types/node': '>=18'
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+
   '@ioredis/[email protected]':
     resolution: {integrity: sha512-M/T6Zewn7sDaBQEqIZ8Rb+i9y8qfGmq+5SDFSf9sA2lUZTmdDLVdOiQaeDp+Q4wElZ9HG1GAX5KhDaidp6LQsQ==}
 
@@ -5204,6 +5338,11 @@ packages:
   '@polka/[email protected]':
     resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
 
+  '@puppeteer/[email protected]':
+    resolution: {integrity: sha512-mP9iLFZwH+FapKJLeA7/fLqOlSUwYpMwjR1P5J23qd4e7qGJwecJccJqHYrjw33jmIZYV4dtiTHPD/J+1e7cEw==}
+    engines: {node: '>=18'}
+    hasBin: true
+
   '@puppeteer/[email protected]':
     resolution: {integrity: sha512-eifa0o+i8dERnngJwKrfp3dEq7ia5XFyoqB17S4gK8GhsQE4/P8nxOfQSE0zQHxzzLo/cmF+7+ywEQ7wK7Fb+w==}
     engines: {node: '>=18'}
@@ -9005,6 +9144,11 @@ packages:
     peerDependencies:
       devtools-protocol: '*'
 
+  [email protected]:
+    resolution: {integrity: sha512-rlUzQ4WzIAWdIbY/viPShhZU2n21CxDUgazXVbw4Hu1MwaeUSEksSeM6DqPgpRjCLXRk702AVRxJxoOz0dw4OA==}
+    peerDependencies:
+      devtools-protocol: '*'
+
   [email protected]:
     resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==}
 
@@ -9073,6 +9217,10 @@ packages:
     resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==}
     engines: {node: '>=18'}
 
+  [email protected]:
+    resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==}
+    engines: {node: '>= 12'}
+
   [email protected]:
     resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
 
@@ -10123,6 +10271,9 @@ packages:
   [email protected]:
     resolution: {integrity: sha512-FOFDVMGrAUNp0dDKsAU1TorWJUx2JOU1k9xdgBKKJF3IBh/Uhl2yswG5r3TEAOrCiGY2QRp1e6LVDQrCsTKO4g==}
 
+  [email protected]:
+    resolution: {integrity: sha512-QJ1R5gtck6nDcdM+nlsaJXcelPEI7ZxSMw1ujHpO1c4+9l+Nue5qlebi9xO1Z2MGr92bFOQTW7/rrheh5hHxDg==}
+
   [email protected]:
     resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
 
@@ -11988,6 +12139,10 @@ packages:
     resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
     engines: {node: '>=0.10.0'}
 
+  [email protected]:
+    resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==}
+    engines: {node: '>=0.10.0'}
+
   [email protected]:
     resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==}
     engines: {node: ^10 || ^12 || >= 14}
@@ -12133,6 +12288,15 @@ packages:
     engines: {node: '>= 0.8.0'}
     hasBin: true
 
+  [email protected]:
+    resolution: {integrity: sha512-K/epfEnDBZj2Q3NMDcgXWZye3nhSPeoJnOh8lcKWrldw54UEZfS4EmAMsAsmVbl7qKi+vjAsy39Sz4fbgRMewg==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      '@types/node': '>=18'
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+
   [email protected]:
     resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
     engines: {node: '>= 0.4'}
@@ -14138,6 +14302,10 @@ packages:
   [email protected]:
     resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
 
+  [email protected]:
+    resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==}
+    engines: {node: ^18.17.0 || >=20.5.0}
+
   [email protected]:
     resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
 
@@ -15767,6 +15935,9 @@ packages:
   [email protected]:
     resolution: {integrity: sha512-whu9e5qmnZekCP5hvlYMe7rWe4cU9seCISRlfT0vXGlCsy7psbeXHdGW6QdXrwyadvCTiD1Ft62jPaqia8ZQaA==}
 
+  [email protected]:
+    resolution: {integrity: sha512-YktJ1t0Qx7fC6OITmeZvDsT1fIiwmR6A7XIfKVHTcvztLy5vgCjglkYBEpyVHx2S6EiSawKTdAd4/mhlK/hl1A==}
+
   [email protected]:
     resolution: {integrity: sha512-3HZ2/7hdDKZvZQ7dhhITOUg4/wOrDRjyK2ZBllRB0ZCOi9u0cwq1ACHDjBB+nX+7+kltHjQvBRdeY7+W0T+7Gg==}
     engines: {node: '>=18'}
@@ -15775,6 +15946,10 @@ packages:
     resolution: {integrity: sha512-CnzhOgrZj8DvkDqI+Yx+9or33i3Y9uUYbKyYpP4C13jWwXx/keQ38RMTMmxuLCWQlxjZrOH0Foq7P2fGP7adDQ==}
     engines: {node: '>=18'}
 
+  [email protected]:
+    resolution: {integrity: sha512-8Xs6q3Ut+C8y7sAaqjIhzv1QykGWG4gc2mEZ2mYE7siZFuRp4xQVehOf8uQKSQAkeL7jXUs3mknEeiqnRqUKvQ==}
+    engines: {node: '>=18'}
+
   [email protected]:
     resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==}
 
@@ -16483,6 +16658,10 @@ packages:
     resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==}
     engines: {node: '>=18'}
 
+  [email protected]:
+    resolution: {integrity: sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==}
+    engines: {node: '>=0.12.0'}
+
   [email protected]:
     resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
 
@@ -18456,6 +18635,9 @@ packages:
   [email protected]:
     resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==}
 
+  [email protected]:
+    resolution: {integrity: sha512-wIx5Gu/LLTeexxilpk8WxU2cpGAKlfbWRO5h+my6EMD1k5PYqM1qQO1MHUFf4f3KRnhBvpbZU7VkizAgeSEf7g==}
+
   [email protected]:
     resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
 
@@ -18890,6 +19072,10 @@ packages:
     resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==}
     engines: {node: '>=12.20'}
 
+  [email protected]:
+    resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==}
+    engines: {node: '>=18'}
+
   [email protected]:
     resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==}
     engines: {node: '>=18'}
@@ -20644,7 +20830,7 @@ snapshots:
       '@babel/parser': 7.28.3
       '@babel/template': 7.27.2
       '@babel/types': 7.27.1
-      debug: 4.4.1([email protected])
+      debug: 4.4.3
       globals: 11.12.0
     transitivePeerDependencies:
       - supports-color
@@ -20679,18 +20865,6 @@ snapshots:
     dependencies:
       eventsource-parser: 3.0.2
 
-  '@catrielmuller/[email protected]':
-    dependencies:
-      '@puppeteer/browsers': 2.10.5
-      cli-progress: 3.12.0
-      eight-colors: 1.3.1
-      puppeteer-core: 24.10.2
-    transitivePeerDependencies:
-      - bare-buffer
-      - bufferutil
-      - supports-color
-      - utf-8-validate
-
   '@cerebras/[email protected]':
     dependencies:
       '@types/node': 18.19.100
@@ -22445,6 +22619,54 @@ snapshots:
   '@img/[email protected]':
     optional: true
 
+  '@inquirer/[email protected]': {}
+
+  '@inquirer/[email protected](@types/[email protected])':
+    dependencies:
+      '@inquirer/ansi': 1.0.1
+      '@inquirer/core': 10.3.0(@types/[email protected])
+      '@inquirer/figures': 1.0.14
+      '@inquirer/type': 3.0.9(@types/[email protected])
+      yoctocolors-cjs: 2.1.3
+    optionalDependencies:
+      '@types/node': 20.17.57
+
+  '@inquirer/[email protected](@types/[email protected])':
+    dependencies:
+      '@inquirer/core': 10.3.0(@types/[email protected])
+      '@inquirer/type': 3.0.9(@types/[email protected])
+    optionalDependencies:
+      '@types/node': 20.17.57
+
+  '@inquirer/[email protected](@types/[email protected])':
+    dependencies:
+      '@inquirer/ansi': 1.0.1
+      '@inquirer/figures': 1.0.14
+      '@inquirer/type': 3.0.9(@types/[email protected])
+      cli-width: 4.1.0
+      mute-stream: 2.0.0
+      signal-exit: 4.1.0
+      wrap-ansi: 6.2.0
+      yoctocolors-cjs: 2.1.3
+    optionalDependencies:
+      '@types/node': 20.17.57
+
+  '@inquirer/[email protected](@types/[email protected])':
+    dependencies:
+      '@inquirer/core': 10.3.0(@types/[email protected])
+      '@inquirer/external-editor': 1.0.2(@types/[email protected])
+      '@inquirer/type': 3.0.9(@types/[email protected])
+    optionalDependencies:
+      '@types/node': 20.17.57
+
+  '@inquirer/[email protected](@types/[email protected])':
+    dependencies:
+      '@inquirer/core': 10.3.0(@types/[email protected])
+      '@inquirer/type': 3.0.9(@types/[email protected])
+      yoctocolors-cjs: 2.1.3
+    optionalDependencies:
+      '@types/node': 20.17.57
+
   '@inquirer/[email protected](@types/[email protected])':
     dependencies:
       chardet: 2.1.0
@@ -22452,6 +22674,83 @@ snapshots:
     optionalDependencies:
       '@types/node': 24.2.1
 
+  '@inquirer/[email protected](@types/[email protected])':
+    dependencies:
+      chardet: 2.1.0
+      iconv-lite: 0.7.0
+    optionalDependencies:
+      '@types/node': 20.17.57
+
+  '@inquirer/[email protected]': {}
+
+  '@inquirer/[email protected](@types/[email protected])':
+    dependencies:
+      '@inquirer/core': 10.3.0(@types/[email protected])
+      '@inquirer/type': 3.0.9(@types/[email protected])
+    optionalDependencies:
+      '@types/node': 20.17.57
+
+  '@inquirer/[email protected](@types/[email protected])':
+    dependencies:
+      '@inquirer/core': 10.3.0(@types/[email protected])
+      '@inquirer/type': 3.0.9(@types/[email protected])
+    optionalDependencies:
+      '@types/node': 20.17.57
+
+  '@inquirer/[email protected](@types/[email protected])':
+    dependencies:
+      '@inquirer/ansi': 1.0.1
+      '@inquirer/core': 10.3.0(@types/[email protected])
+      '@inquirer/type': 3.0.9(@types/[email protected])
+    optionalDependencies:
+      '@types/node': 20.17.57
+
+  '@inquirer/[email protected](@types/[email protected])':
+    dependencies:
+      '@inquirer/checkbox': 4.3.0(@types/[email protected])
+      '@inquirer/confirm': 5.1.19(@types/[email protected])
+      '@inquirer/editor': 4.2.21(@types/[email protected])
+      '@inquirer/expand': 4.0.21(@types/[email protected])
+      '@inquirer/input': 4.2.5(@types/[email protected])
+      '@inquirer/number': 3.0.21(@types/[email protected])
+      '@inquirer/password': 4.0.21(@types/[email protected])
+      '@inquirer/rawlist': 4.1.9(@types/[email protected])
+      '@inquirer/search': 3.2.0(@types/[email protected])
+      '@inquirer/select': 4.4.0(@types/[email protected])
+    optionalDependencies:
+      '@types/node': 20.17.57
+
+  '@inquirer/[email protected](@types/[email protected])':
+    dependencies:
+      '@inquirer/core': 10.3.0(@types/[email protected])
+      '@inquirer/type': 3.0.9(@types/[email protected])
+      yoctocolors-cjs: 2.1.3
+    optionalDependencies:
+      '@types/node': 20.17.57
+
+  '@inquirer/[email protected](@types/[email protected])':
+    dependencies:
+      '@inquirer/core': 10.3.0(@types/[email protected])
+      '@inquirer/figures': 1.0.14
+      '@inquirer/type': 3.0.9(@types/[email protected])
+      yoctocolors-cjs: 2.1.3
+    optionalDependencies:
+      '@types/node': 20.17.57
+
+  '@inquirer/[email protected](@types/[email protected])':
+    dependencies:
+      '@inquirer/ansi': 1.0.1
+      '@inquirer/core': 10.3.0(@types/[email protected])
+      '@inquirer/figures': 1.0.14
+      '@inquirer/type': 3.0.9(@types/[email protected])
+      yoctocolors-cjs: 2.1.3
+    optionalDependencies:
+      '@types/node': 20.17.57
+
+  '@inquirer/[email protected](@types/[email protected])':
+    optionalDependencies:
+      '@types/node': 20.17.57
+
   '@ioredis/[email protected]': {}
 
   '@isaacs/[email protected]': {}
@@ -23372,6 +23671,19 @@ snapshots:
 
   '@polka/[email protected]': {}
 
+  '@puppeteer/[email protected]':
+    dependencies:
+      debug: 4.4.3
+      extract-zip: 2.0.1
+      progress: 2.0.3
+      proxy-agent: 6.5.0
+      semver: 7.7.3
+      tar-fs: 3.0.9
+      yargs: 17.7.2
+    transitivePeerDependencies:
+      - bare-buffer
+      - supports-color
+
   '@puppeteer/[email protected]':
     dependencies:
       debug: 4.4.1([email protected])
@@ -27895,6 +28207,12 @@ snapshots:
       mitt: 3.0.1
       zod: 3.25.76
 
+  [email protected]([email protected]):
+    dependencies:
+      devtools-protocol: 0.0.1508733
+      mitt: 3.0.1
+      zod: 3.25.76
+
   [email protected]: {}
 
   [email protected]: {}
@@ -27962,6 +28280,8 @@ snapshots:
       slice-ansi: 5.0.0
       string-width: 7.2.0
 
+  [email protected]: {}
+
   [email protected]: {}
 
   [email protected]:
@@ -29065,6 +29385,8 @@ snapshots:
 
   [email protected]: {}
 
+  [email protected]: {}
+
   [email protected]: {}
 
   [email protected]: {}
@@ -31519,6 +31841,10 @@ snapshots:
     dependencies:
       safer-buffer: 2.1.2
 
+  [email protected]:
+    dependencies:
+      safer-buffer: 2.1.2
+
   [email protected]([email protected]):
     dependencies:
       postcss: 8.5.4
@@ -31647,6 +31973,18 @@ snapshots:
 
   [email protected]: {}
 
+  [email protected](@types/[email protected]):
+    dependencies:
+      '@inquirer/ansi': 1.0.1
+      '@inquirer/core': 10.3.0(@types/[email protected])
+      '@inquirer/prompts': 7.9.0(@types/[email protected])
+      '@inquirer/type': 3.0.9(@types/[email protected])
+      mute-stream: 2.0.0
+      run-async: 4.0.6
+      rxjs: 7.8.2
+    optionalDependencies:
+      '@types/node': 20.17.57
+
   [email protected]:
     dependencies:
       es-errors: 1.3.0
@@ -32882,7 +33220,7 @@ snapshots:
 
   [email protected]:
     dependencies:
-      debug: 4.4.1([email protected])
+      debug: 4.4.3
       http-errors: 1.8.1
       resolve-path: 1.4.0
     transitivePeerDependencies:
@@ -34319,6 +34657,8 @@ snapshots:
 
   [email protected]: {}
 
+  [email protected]: {}
+
   [email protected]:
     dependencies:
       any-promise: 1.3.0
@@ -36050,6 +36390,18 @@ snapshots:
       - supports-color
       - utf-8-validate
 
+  [email protected]:
+    dependencies:
+      '@puppeteer/browsers': 2.10.12
+      cli-progress: 3.12.0
+      eight-colors: 1.3.1
+      puppeteer-core: 24.25.0
+    transitivePeerDependencies:
+      - bare-buffer
+      - bufferutil
+      - supports-color
+      - utf-8-validate
+
   [email protected]:
     dependencies:
       '@puppeteer/browsers': 2.6.1
@@ -36078,6 +36430,21 @@ snapshots:
       - supports-color
       - utf-8-validate
 
+  [email protected]:
+    dependencies:
+      '@puppeteer/browsers': 2.10.12
+      chromium-bidi: 9.1.0([email protected])
+      debug: 4.4.3
+      devtools-protocol: 0.0.1508733
+      typed-query-selector: 2.12.0
+      webdriver-bidi-protocol: 0.3.7
+      ws: 8.18.3
+    transitivePeerDependencies:
+      - bare-buffer
+      - bufferutil
+      - supports-color
+      - utf-8-validate
+
   [email protected]: {}
 
   [email protected]:
@@ -37005,6 +37372,8 @@ snapshots:
 
   [email protected]: {}
 
+  [email protected]: {}
+
   [email protected]:
     dependencies:
       queue-microtask: 1.2.3
@@ -39489,6 +39858,8 @@ snapshots:
 
   [email protected]: {}
 
+  [email protected]: {}
+
   [email protected]: {}
 
   [email protected]: {}
@@ -40023,6 +40394,8 @@ snapshots:
 
   [email protected]: {}
 
+  [email protected]: {}
+
   [email protected]: {}
 
   [email protected]: {}