copilotkit 0.0.51 → 0.0.52
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/bin/run.js +13 -1
- package/dist/commands/base-command.js +7 -6
- package/dist/commands/base-command.js.map +1 -1
- package/dist/commands/create.d.ts +1 -17
- package/dist/commands/create.js +96 -520
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/dev.js +7 -6
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/init.d.ts +1 -27
- package/dist/commands/init.js +104 -1989
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.js +7 -6
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +7 -6
- package/dist/commands/logout.js.map +1 -1
- package/dist/utils/version.d.ts +1 -1
- package/dist/utils/version.js +1 -1
- package/dist/utils/version.js.map +1 -1
- package/oclif.manifest.json +3 -3
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/init.ts","../../src/services/auth.service.ts","../../src/utils/trpc.ts","../../src/services/analytics.service.ts","../../src/commands/base-command.ts","../../src/utils/version.ts","../../src/commands/create.ts","../../src/lib/init/types/questions.ts","../../src/lib/init/utils.ts","../../src/lib/init/types/templates.ts","../../src/lib/init/ide-docs.ts","../../src/lib/init/questions.ts","../../src/lib/init/scaffold/shadcn.ts","../../src/lib/init/scaffold/env.ts","../../src/lib/init/scaffold/langgraph-assistants.ts","../../src/lib/init/scaffold/github.ts","../../src/lib/init/scaffold/packages.ts","../../src/lib/init/scaffold/agent.ts","../../src/lib/init/scaffold/crew-inputs.ts"],"sourcesContent":["import {Config, Flags} from '@oclif/core'\nimport inquirer from 'inquirer'\nimport path from 'path'\nimport fs from 'fs'\n\nimport {AuthService} from '../services/auth.service.js'\nimport {AnalyticsService} from '../services/analytics.service.js'\nimport {BaseCommand} from './base-command.js'\nimport Create from './create.js'\nimport {\n getQuestionsForBranch,\n Config as OptionsConfig,\n ConfigSchema,\n scaffoldEnv,\n scaffoldAgent,\n scaffoldShadCN,\n ConfigFlags,\n addCrewInputs,\n sanitizers,\n YES_NO,\n handleIDEDocsSetup,\n SupportedIDE,\n} from '../lib/init/index.js'\nimport {createTRPCClient} from '../utils/trpc.js'\nimport chalk from 'chalk'\nimport ora from 'ora'\n\n// A/B/C Test Feature Flags\ntype ABCTestBranch = 'A' | 'B' | 'C'\n\nexport default class CloudInit extends BaseCommand {\n private trpcClient: ReturnType<typeof createTRPCClient> | null = null\n private analytics: AnalyticsService | null = null\n private startTime: number = Date.now()\n private analyticsQueue: Array<{event: string; properties: any}> = []\n\n static override description = 'Set up CopilotKit in your Next.js project, or create a new project if none exists'\n\n static override examples = ['<%= config.bin %> init', '<%= config.bin %> init --dir ./my-app']\n\n static override flags = {\n ...BaseCommand.flags,\n ...ConfigFlags,\n runtimeUrl: Flags.string({description: 'runtime URL'}),\n project: Flags.string({description: 'project ID (can be found in the Copilot Cloud dashboard)'}),\n dir: Flags.string({description: 'directory of the Next.js project', default: '.'}),\n }\n\n constructor(\n argv: string[],\n config: Config,\n private authService = new AuthService(),\n ) {\n super(argv, config)\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(CloudInit)\n\n try {\n // Initialize analytics (unauthenticated initially)\n this.analytics = new AnalyticsService()\n\n // Check if a Next.js app exists in the current directory\n const nextJsAppExists = this.isNextJsProject(flags)\n\n if (!nextJsAppExists) {\n this.log(chalk.gray('Running copilotkit create to set up a new project...\\n'))\n const createCommand = new Create(this.argv, this.config, this.authService)\n await createCommand.run()\n return\n }\n\n this.log(chalk.magenta('\\n🪁 Welcome to CopilotKit'))\n if (flags.booth) {\n this.log(chalk.gray(\"Thanks for giving CopilotKit a try! Now, let's try to impress you 💪\\n\"))\n } else {\n this.log(chalk.gray(\"Let's power up your Next.js project with AI capabilities\\n\"))\n }\n\n const projectValidated = this.validateProjectCompatibility(flags)\n\n // Track init started (queued)\n this.queueAnalytics('cli.init.started', {\n nextjs_detected: projectValidated,\n flags_used: Object.keys(flags).filter((key) => flags[key] !== undefined && key !== 'help'),\n })\n\n let userAnswers: OptionsConfig\n let cloudSetupInfo: {cliToken: string; organization: any; selectedProjectId?: string; apiKey?: string} | null =\n null\n\n if (flags.booth) {\n userAnswers = await this.getBoothAnswers()\n } else {\n const result = await this.getUserAnswers(flags)\n userAnswers = result.config\n cloudSetupInfo = result.cloudSetupInfo\n }\n\n // Track mode selection (queued)\n this.queueAnalytics('cli.init.mode_selected', {\n mode: userAnswers.mode,\n cloud_setup_completed: !!cloudSetupInfo,\n deployment_choice: userAnswers.deploymentChoice,\n })\n\n if (userAnswers.mode === 'Mastra') {\n this.log(chalk.magenta(`\\n🔗 Please go to https://docs.copilotkit.ai/mastra/quickstart to get started.`))\n process.exit(0)\n } else if (userAnswers.mode === 'AG2') {\n this.log(chalk.magenta(`\\n🔗 Please go to https://docs.copilotkit.ai/ag2/quickstart to get started.`))\n process.exit(0)\n } else if (userAnswers.mode === 'Agno') {\n this.log(chalk.magenta(`\\n🔗 Please go to https://docs.copilotkit.ai/agno/quickstart to get started.`))\n process.exit(0)\n } else if (userAnswers.mode === 'LlamaIndex') {\n this.log(chalk.magenta(`\\n🔗 Please go to https://docs.copilotkit.ai/llamaindex/quickstart to get started.`))\n process.exit(0)\n }\n\n // Determine if cloud deployment is needed based on the user's choice\n const needsCloudDeployment =\n userAnswers.deploymentChoice === 'Copilot Cloud' || // Branch B choice\n userAnswers.useCopilotCloud === 'Yes' || // Branch C choice\n userAnswers.mode === 'CrewAI' || // CrewAI always needs cloud\n (!userAnswers.deploymentChoice && !userAnswers.useCopilotCloud) // Branch A default (no questions = cloud)\n\n // Track cloud deployment selection (queued)\n this.queueAnalytics('cli.init.cloud_deployment_selected', {\n deployment_choice: userAnswers.deploymentChoice,\n use_copilot_cloud: userAnswers.useCopilotCloud,\n needs_cloud_deployment: needsCloudDeployment,\n mode: userAnswers.mode,\n })\n\n if (needsCloudDeployment) {\n if (cloudSetupInfo) {\n // Already signed up, just complete deployment setup\n await this.completeCloudDeploymentSetup(flags, userAnswers, cloudSetupInfo)\n } else {\n // Sign up now for deployment\n await this.setupCloud(flags, userAnswers)\n }\n }\n\n // Run scaffolding tasks sequentially\n await scaffoldEnv(flags, userAnswers)\n await scaffoldShadCN(flags, userAnswers)\n\n let agentScaffolded = false\n if (!flags.booth) {\n await scaffoldAgent(userAnswers)\n agentScaffolded = true\n }\n\n if (userAnswers.crewUrl && userAnswers.crewBearerToken)\n await addCrewInputs(userAnswers.crewUrl, userAnswers.crewBearerToken)\n\n // Add IDE docs setup after scaffolding but before final summary\n if (userAnswers.setupIDEDocs === 'Yes' && userAnswers.selectedIDE !== 'skip') {\n const ideDocsSpinner = ora({\n text: 'Setting up CopilotKit IDE documentation...',\n color: 'cyan',\n }).start()\n\n try {\n await handleIDEDocsSetup(userAnswers.selectedIDE as SupportedIDE, flags.dir, ideDocsSpinner)\n } catch (error) {\n ideDocsSpinner.fail('IDE documentation setup failed, but you can configure it manually later')\n // Don't fail the entire process\n }\n }\n\n // Track successful completion (queued)\n this.queueAnalytics('cli.init.completed', {\n mode: userAnswers.mode,\n cloud_setup_completed: !!cloudSetupInfo,\n cloud_deployment: needsCloudDeployment,\n deployment_choice: userAnswers.deploymentChoice,\n agent_scaffolded: agentScaffolded,\n api_key_in_env: !!userAnswers.copilotCloudPublicApiKey,\n duration_ms: Date.now() - this.startTime,\n })\n\n // Flush all analytics events at the end\n await this.flushAnalytics()\n\n if (flags.booth) {\n this.log('\\n-----\\n')\n this.log(chalk.magenta('🎉 Your CopilotKit setup is complete! 🎉\\n'))\n this.log(chalk.bold('\\n🚀 Next steps:'))\n this.log(` - Start the Next.js app: ${chalk.gray('$')} ${chalk.cyan('npm run dev')}`)\n this.log(` - Navigate to ${chalk.blue('http://localhost:3000/copilotkit')}`)\n this.log(` - Talk to your agent.`)\n this.log(chalk.magenta('\\nThanks for giving CopilotKit a try! 🪁\\n'))\n } else {\n this.finalSummary(userAnswers, cloudSetupInfo?.selectedProjectId)\n }\n } catch (error) {\n // Track failure (queued)\n this.queueAnalytics('cli.init.failed', {\n error: (error as Error).message,\n step: 'unknown',\n duration_ms: Date.now() - this.startTime,\n })\n\n // Flush analytics even on error\n await this.flushAnalytics()\n\n this.gracefulError((error as Error).message)\n }\n }\n\n /**\n * Get A/B/C test branch from feature flags\n */\n private async getABCTestBranch(): Promise<ABCTestBranch> {\n // Default to Branch C (current flow)\n const defaultBranch: ABCTestBranch = 'C'\n\n if (!this.analytics) {\n return defaultBranch\n }\n\n try {\n // Get the enterprise-by-default feature flag payload\n const payload = await this.analytics.getFeatureFlagPayload('enterprise-by-default')\n\n if (payload && typeof payload === 'object' && payload.branch) {\n return payload.branch as ABCTestBranch\n }\n\n return defaultBranch\n } catch (error) {\n // If there's an error checking feature flags, use default\n return defaultBranch\n }\n }\n\n /**\n * Queue an analytics event to be sent later (non-blocking)\n */\n private queueAnalytics(event: string, properties: any) {\n this.analyticsQueue.push({event, properties})\n }\n\n /**\n * Send all queued analytics events in fire-and-forget manner\n */\n private async flushAnalytics() {\n if (!this.analytics || this.analyticsQueue.length === 0) {\n return\n }\n\n // Send all events in parallel without waiting\n const promises = this.analyticsQueue.map(({event, properties}) =>\n this.analytics!.track({event: event as any, properties}).catch(() => {\n // Silently ignore analytics errors\n }),\n )\n\n // Fire and forget - don't await\n Promise.all(promises).catch(() => {\n // Silently ignore any analytics errors\n })\n\n // Shutdown PostHog connection\n if (this.analytics) {\n this.analytics.shutdown().catch(() => {\n // Silently ignore shutdown errors\n })\n }\n }\n\n private async getBoothAnswers(): Promise<OptionsConfig> {\n const url = await inquirer.prompt({\n type: 'input',\n message: \"🦜🔗 What is the LangGraph's agent URL?\",\n name: 'agentURL',\n validate: (value: string) => {\n if (!value)\n return 'You need a URL to continue, it should be present on the screen. If you need help, feel free to ask!'\n if (!value.includes('http') || !value.includes('://')) return 'Please provide a valid URL'\n return true\n },\n })\n\n return {\n mode: 'LangGraph',\n langGraphPlatformUrl: url.agentURL,\n useCopilotCloud: 'No',\n alreadyDeployed: 'Yes',\n langGraphPlatform: 'Yes',\n }\n }\n\n private async getUserAnswers(flags: any): Promise<{\n config: OptionsConfig\n cloudSetupInfo: {cliToken: string; organization: any; selectedProjectId?: string; apiKey?: string} | null\n }> {\n // Create initial answers object from flags\n const initialAnswers: Partial<OptionsConfig> = {}\n\n // Process flag values and convert to the format expected by the config\n Object.keys(flags).forEach((flagName) => {\n if (flagName in ConfigFlags && flags[flagName] !== undefined) {\n const camelCaseFlagName = flagName.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())\n if (YES_NO.includes(flags[flagName] as any)) {\n initialAnswers[camelCaseFlagName as keyof OptionsConfig] = flags[flagName]\n } else if (flags[flagName]) {\n initialAnswers[camelCaseFlagName as keyof OptionsConfig] = flags[flagName]\n }\n }\n })\n\n // Determine A/B/C test branch\n const abcBranch = await this.getABCTestBranch()\n\n // Track which branch was selected\n this.queueAnalytics('cli.init.abc_branch_selected', {\n branch: abcBranch,\n })\n\n // Get questions for the selected branch\n const questionsForBranch = getQuestionsForBranch(abcBranch)\n\n let cloudSetupInfo: {cliToken: string; organization: any; selectedProjectId?: string; apiKey?: string} | null = null\n let earlyApiKey: string | undefined\n\n // Filter out questions that are already answered by flags\n const inquirerQuestions = questionsForBranch\n .map((q) => {\n // Skip this question if it's already answered by a flag\n if (initialAnswers[q.name as keyof OptionsConfig] !== undefined) {\n return null\n }\n\n // Common question properties\n const baseQuestion = {\n name: q.name,\n message: q.message,\n when: (answers: any) => {\n const combinedAnswers = {...initialAnswers, ...answers}\n return q.when ? q.when(combinedAnswers) : true\n },\n default: q.default,\n validate: q.validate,\n }\n\n // Map question types to inquirer format\n switch (q.type) {\n case 'yes/no':\n return {\n ...baseQuestion,\n type: 'list',\n choices: ['Yes', 'No'],\n }\n case 'select':\n return {\n ...baseQuestion,\n type: 'list',\n choices: q.choices,\n }\n case 'input':\n default:\n return {\n ...baseQuestion,\n type: q.sensitive ? 'password' : 'input',\n mask: q.sensitive ? '*' : undefined,\n filter: q.sanitize ? (input: string) => q.sanitize!(input) : undefined,\n }\n }\n })\n .filter((q) => q !== null)\n\n // Prompt for remaining questions\n const promptAnswers = await inquirer.prompt(inquirerQuestions as any)\n\n // Combine all answers including the API key from early signup\n const answers = {\n ...initialAnswers,\n ...promptAnswers,\n ...(earlyApiKey && {copilotCloudPublicApiKey: earlyApiKey}),\n }\n\n // For Branch B, always get API key first (before deployment choice)\n if (abcBranch === 'B' && !cloudSetupInfo) {\n // Show informational message\n this.log(chalk.cyan('\\n🔑 Now you will get an API key'))\n this.log(chalk.gray('Setting up your cloud account and retrieving your API key...\\n'))\n\n try {\n const tempConfig = {...answers, signupForCopilotCloud: 'Yes'} as OptionsConfig\n const cloudSignupResult = await this.setupApiKey(flags, tempConfig)\n cloudSetupInfo = cloudSignupResult\n answers.copilotCloudPublicApiKey = cloudSignupResult.apiKey\n\n // Update analytics service with authenticated user info\n if (this.analytics && cloudSetupInfo.cliToken) {\n const trpcClient = createTRPCClient(cloudSetupInfo.cliToken)\n const me = await trpcClient.me.query()\n if (me.user && me.organization) {\n this.analytics = new AnalyticsService({\n userId: me.user.id,\n organizationId: me.organization.id,\n email: me.user.email,\n })\n }\n }\n\n this.queueAnalytics('cli.init.branch_b_api_key_setup_completed', {\n branch: abcBranch,\n projectId: cloudSetupInfo.selectedProjectId || 'unknown',\n api_key_retrieved: !!cloudSetupInfo.apiKey,\n })\n } catch (error) {\n this.queueAnalytics('cli.init.branch_b_api_key_setup_failed', {\n error: (error as Error).message,\n branch: abcBranch,\n })\n throw error\n }\n }\n\n // For Branch A, show informational message and automatically set up cloud\n if (abcBranch === 'A' && !cloudSetupInfo) {\n // Show informational message\n this.log(chalk.cyan('\\n🔑 Now get your API key'))\n this.log(chalk.gray('Setting up your cloud account and retrieving your API key...\\n'))\n\n try {\n const tempConfig = {...answers, signupForCopilotCloud: 'Yes'} as OptionsConfig\n const cloudSignupResult = await this.setupApiKey(flags, tempConfig)\n cloudSetupInfo = cloudSignupResult\n answers.copilotCloudPublicApiKey = cloudSignupResult.apiKey\n\n // Update analytics service with authenticated user info\n if (this.analytics && cloudSetupInfo.cliToken) {\n const trpcClient = createTRPCClient(cloudSetupInfo.cliToken)\n const me = await trpcClient.me.query()\n if (me.user && me.organization) {\n this.analytics = new AnalyticsService({\n userId: me.user.id,\n organizationId: me.organization.id,\n email: me.user.email,\n })\n }\n }\n\n this.queueAnalytics('cli.init.branch_a_cloud_setup_completed', {\n branch: abcBranch,\n projectId: cloudSetupInfo.selectedProjectId || 'unknown',\n api_key_retrieved: !!cloudSetupInfo.apiKey,\n })\n } catch (error) {\n this.queueAnalytics('cli.init.branch_a_cloud_setup_failed', {\n error: (error as Error).message,\n branch: abcBranch,\n })\n throw error\n }\n }\n\n if (answers.langGraphPlatform === 'No') {\n this.log(\n '\\nCurrently the CLI only supports scaffolding LangGraph Platform agents. Use our quickstart guide to get started:\\n',\n )\n this.log(chalk.blue('https://docs.copilotkit.ai/coagents/quickstart/langgraph'))\n process.exit(0)\n }\n\n try {\n const spinner = ora({text: 'Validating configuration...', color: 'green'}).start()\n const validatedConfig = ConfigSchema.parse(answers)\n spinner.succeed(`🔍 Configuration validated successfully`)\n return {config: validatedConfig, cloudSetupInfo}\n } catch (error: any) {\n const spinner = ora({text: 'Validation failed...', color: 'red'}).start()\n if (error.errors) {\n const formattedErrors = error.errors.map((err: any) => `- ${err.path.join('.')}: ${err.message}`).join('\\n')\n spinner.fail(chalk.red('Configuration validation failed:'))\n console.error(chalk.red(formattedErrors))\n process.exit(1)\n }\n spinner.fail(chalk.red('Unexpected validation error:'))\n console.error(chalk.red(error.message || 'Unknown error'))\n process.exit(1)\n }\n }\n\n private async setupCloud(flags: any, userAnswers: OptionsConfig) {\n const {cliToken, organization} = await this.authService.requireLogin(this, 'cloud-features')\n this.trpcClient = createTRPCClient(cliToken)\n const availableProjects = await this.trpcClient.listOrgProjects.query({orgId: organization.id})\n let selectedProjectId: string\n\n // Get project ID\n if (flags.project) {\n if (!availableProjects.some((project: any) => project.id === flags.project)) {\n this.log(chalk.red(`📁 Project with ID ${flags.project} not found`))\n process.exit(1)\n }\n\n selectedProjectId = flags.project\n this.log(chalk.green(`📁 Selected project ${selectedProjectId}`))\n } else {\n const {projectId} = await inquirer.prompt([\n {\n name: 'projectId',\n type: 'list',\n message: '📁 Choose a project:',\n choices: availableProjects.map((project: any) => ({\n value: project.id,\n name: `${project.name} (ID: ${project.id})${availableProjects.length === 1 ? ' (press Enter to confirm)' : ''}`,\n })),\n },\n ])\n\n selectedProjectId = projectId\n }\n\n const copilotCloudPublicApiKey = await this.trpcClient.getCopilotCloudPublicApiKey.query({\n projectId: selectedProjectId,\n })\n\n // Validate and update configuration\n try {\n // Apply sanitization to any properties that might need it\n const sanitizedConfig = {\n ...userAnswers,\n copilotCloudPublicApiKey: copilotCloudPublicApiKey?.key,\n crewUrl: userAnswers.crewUrl ? sanitizers.url(userAnswers.crewUrl) : undefined,\n langGraphPlatformUrl: userAnswers.langGraphPlatformUrl\n ? sanitizers.url(userAnswers.langGraphPlatformUrl)\n : undefined,\n langGraphRemoteEndpointURL: userAnswers.langGraphRemoteEndpointURL\n ? sanitizers.url(userAnswers.langGraphRemoteEndpointURL)\n : undefined,\n crewBearerToken: userAnswers.crewBearerToken ? sanitizers.apiKey(userAnswers.crewBearerToken) : undefined,\n langSmithApiKey: userAnswers.langSmithApiKey ? sanitizers.apiKey(userAnswers.langSmithApiKey) : undefined,\n llmToken: userAnswers.llmToken ? sanitizers.apiKey(userAnswers.llmToken) : undefined,\n }\n\n // Validate the sanitized config\n const updatedConfig = ConfigSchema.parse(sanitizedConfig)\n\n // Update with the validated config\n Object.assign(userAnswers, updatedConfig)\n } catch (error: any) {\n this.log(chalk.red(`Failed to update configuration with Copilot Cloud API key: ${error.message}`))\n }\n\n if (userAnswers.crewUrl && userAnswers.crewName && userAnswers.crewBearerToken) {\n const isFlow = userAnswers.crewType === 'Flows'\n const crewSpinner = ora({\n text: chalk(`👥 Adding CrewAI ${isFlow ? 'Flow' : 'Crew'} to Copilot Cloud...`),\n color: 'cyan',\n }).start()\n\n try {\n await this.trpcClient.createRemoteEndpoint.mutate({\n type: isFlow ? 'CrewAIFlows' : 'CrewAI',\n projectId: selectedProjectId,\n config: {\n type: isFlow ? 'CrewAIFlows' : 'CrewAI',\n url: userAnswers.crewUrl, // Already sanitized\n agentName: userAnswers.crewName,\n agentDescription: `A helpful CrewAI ${isFlow ? 'Flow' : 'Crew'}`,\n crewApiBearerToken: userAnswers.crewBearerToken,\n },\n })\n crewSpinner.succeed(chalk(`👥 CrewAI ${isFlow ? 'Flow' : 'Crew'} added to Copilot Cloud`))\n } catch (error) {\n crewSpinner.fail(chalk(`👥 Failed to add CrewAI ${isFlow ? 'Flow' : 'Crew'} to Copilot Cloud`))\n console.error(error)\n process.exit(1)\n }\n }\n\n if (\n userAnswers.mode === 'LangGraph' &&\n userAnswers.useCopilotCloud === 'Yes' &&\n userAnswers.alreadyDeployed === 'Yes'\n ) {\n const langGraphSpinner = ora({\n text: chalk('🦜🔗 Adding LangGraph to Copilot Cloud...'),\n color: 'cyan',\n }).start()\n\n if (userAnswers.langGraphPlatform === 'Yes' && userAnswers.langGraphPlatformUrl) {\n try {\n if (!userAnswers.langSmithApiKey) {\n langGraphSpinner.fail(chalk('🦜🔗 LangSmith API key not found. Please provide a valid LangSmith API key.'))\n process.exit(1)\n }\n\n await this.trpcClient.createLGCRemoteEndpoint.mutate({\n type: 'LangGraphCloud',\n projectId: selectedProjectId,\n config: {\n deploymentUrl: userAnswers.langGraphPlatformUrl, // Already sanitized\n langsmithApiKey: userAnswers.langSmithApiKey,\n agents: [],\n },\n })\n\n langGraphSpinner.succeed(chalk('🦜🔗 LangGraph Cloud remote endpoint created'))\n } catch (error) {\n langGraphSpinner.fail(chalk('🦜🔗 Failed to create LangGraph Cloud remote endpoint. Please try again.'))\n process.exit(1)\n }\n } else if (userAnswers.langGraphRemoteEndpointURL) {\n try {\n await this.trpcClient.createRemoteEndpoint.mutate({\n type: 'CopilotKit',\n projectId: selectedProjectId,\n config: {\n type: 'CopilotKit',\n url: userAnswers.langGraphRemoteEndpointURL, // Already sanitized\n },\n })\n langGraphSpinner.succeed(chalk('🦜🔗 LangGraph remote endpoint created'))\n } catch (error) {\n langGraphSpinner.fail(chalk('🦜🔗 Failed to create LangGraph remote endpoint. Please try again.'))\n process.exit(1)\n }\n }\n }\n }\n\n private async setupApiKey(\n flags: any,\n userAnswers: OptionsConfig,\n ): Promise<{cliToken: string; organization: any; selectedProjectId?: string; apiKey?: string}> {\n this.log(chalk.cyan('\\n🔑 Setting up your API key...\\n'))\n\n const {cliToken, organization} = await this.authService.requireLogin(this, 'cloud-features')\n this.trpcClient = createTRPCClient(cliToken)\n\n const availableProjects = await this.trpcClient.listOrgProjects.query({orgId: organization.id})\n let selectedProjectId: string | undefined\n\n // Get project ID for future use\n if (flags.project) {\n if (!availableProjects.some((project: any) => project.id === flags.project)) {\n this.log(chalk.red(`📁 Project with ID ${flags.project} not found`))\n process.exit(1)\n }\n selectedProjectId = flags.project\n this.log(chalk.green(`📁 Selected project ${selectedProjectId}`))\n } else if (availableProjects.length === 1) {\n // Auto-select if only one project\n selectedProjectId = availableProjects[0].id\n this.log(chalk.green(`📁 Auto-selected project ${selectedProjectId}`))\n } else {\n const {projectId} = await inquirer.prompt([\n {\n name: 'projectId',\n type: 'list',\n message: '📁 Choose a project:',\n choices: availableProjects.map((project: any) => ({\n value: project.id,\n name: `${project.name} (ID: ${project.id})`,\n })),\n },\n ])\n selectedProjectId = projectId\n }\n\n // Immediately fetch the public API key\n let apiKey: string | undefined\n if (selectedProjectId) {\n const spinner = ora({\n text: 'Retrieving your API key...',\n color: 'cyan',\n }).start()\n\n try {\n const copilotCloudPublicApiKey = await this.trpcClient.getCopilotCloudPublicApiKey.query({\n projectId: selectedProjectId,\n })\n\n apiKey = copilotCloudPublicApiKey?.key\n spinner.succeed('✅ API key retrieved successfully')\n } catch (error) {\n spinner.fail('Failed to retrieve API key, but continuing with setup')\n console.error(error)\n }\n }\n\n this.log(chalk.green('✅ API key setup complete!\\n'))\n\n return {cliToken, organization, selectedProjectId, apiKey}\n }\n\n private async completeCloudDeploymentSetup(\n flags: any,\n userAnswers: OptionsConfig,\n cloudSetupInfo: {cliToken: string; organization: any; selectedProjectId?: string; apiKey?: string},\n ) {\n // Reuse existing connection\n if (!this.trpcClient) {\n this.trpcClient = createTRPCClient(cloudSetupInfo.cliToken)\n }\n\n const selectedProjectId = cloudSetupInfo.selectedProjectId!\n\n // API key is already set from early signup, just handle remote endpoint creation\n\n // Handle CrewAI remote endpoint creation\n if (userAnswers.crewUrl && userAnswers.crewName && userAnswers.crewBearerToken) {\n const isFlow = userAnswers.crewType === 'Flows'\n const crewSpinner = ora({\n text: chalk(`👥 Adding CrewAI ${isFlow ? 'Flow' : 'Crew'} to Copilot Cloud...`),\n color: 'cyan',\n }).start()\n\n try {\n await this.trpcClient.createRemoteEndpoint.mutate({\n type: isFlow ? 'CrewAIFlows' : 'CrewAI',\n projectId: selectedProjectId,\n config: {\n type: isFlow ? 'CrewAIFlows' : 'CrewAI',\n url: userAnswers.crewUrl,\n agentName: userAnswers.crewName,\n agentDescription: `A helpful CrewAI ${isFlow ? 'Flow' : 'Crew'}`,\n crewApiBearerToken: userAnswers.crewBearerToken,\n },\n })\n crewSpinner.succeed(chalk(`👥 CrewAI ${isFlow ? 'Flow' : 'Crew'} added to Copilot Cloud`))\n } catch (error) {\n crewSpinner.fail(chalk(`👥 Failed to add CrewAI ${isFlow ? 'Flow' : 'Crew'} to Copilot Cloud`))\n console.error(error)\n process.exit(1)\n }\n }\n\n // Handle LangGraph remote endpoint creation\n if (\n userAnswers.mode === 'LangGraph' &&\n userAnswers.useCopilotCloud === 'Yes' &&\n userAnswers.alreadyDeployed === 'Yes'\n ) {\n const langGraphSpinner = ora({\n text: chalk('🦜🔗 Adding LangGraph to Copilot Cloud...'),\n color: 'cyan',\n }).start()\n\n if (userAnswers.langGraphPlatform === 'Yes' && userAnswers.langGraphPlatformUrl) {\n try {\n if (!userAnswers.langSmithApiKey) {\n langGraphSpinner.fail(chalk('🦜🔗 LangSmith API key not found. Please provide a valid LangSmith API key.'))\n process.exit(1)\n }\n\n await this.trpcClient.createLGCRemoteEndpoint.mutate({\n type: 'LangGraphCloud',\n projectId: selectedProjectId,\n config: {\n deploymentUrl: userAnswers.langGraphPlatformUrl,\n langsmithApiKey: userAnswers.langSmithApiKey,\n agents: [],\n },\n })\n\n langGraphSpinner.succeed(chalk('🦜🔗 LangGraph Cloud remote endpoint created'))\n } catch (error) {\n langGraphSpinner.fail(chalk('🦜🔗 Failed to create LangGraph Cloud remote endpoint. Please try again.'))\n process.exit(1)\n }\n } else if (userAnswers.langGraphRemoteEndpointURL) {\n try {\n await this.trpcClient.createRemoteEndpoint.mutate({\n type: 'CopilotKit',\n projectId: selectedProjectId,\n config: {\n type: 'CopilotKit',\n url: userAnswers.langGraphRemoteEndpointURL,\n },\n })\n langGraphSpinner.succeed(chalk('🦜🔗 LangGraph remote endpoint created'))\n } catch (error) {\n langGraphSpinner.fail(chalk('🦜🔗 Failed to create LangGraph remote endpoint. Please try again.'))\n process.exit(1)\n }\n }\n }\n }\n\n private isNextJsProject(flags: any): boolean {\n try {\n const projectPath = path.resolve(process.cwd(), flags.dir as string)\n if (!fs.existsSync(projectPath)) {\n return false\n }\n\n const packageJsonPath = path.join(projectPath, 'package.json')\n if (!fs.existsSync(packageJsonPath)) {\n return false\n }\n\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'))\n return !!(packageJson.dependencies?.next || packageJson.devDependencies?.next)\n } catch {\n return false\n }\n }\n\n private validateProjectCompatibility(flags: any): boolean {\n const spinner = ora('Checking Next.js project compatibility...').start()\n\n try {\n if (!this.isNextJsProject(flags)) {\n const projectPath = path.resolve(process.cwd(), flags.dir as string)\n if (!fs.existsSync(projectPath)) {\n spinner.fail(`Directory ${flags.dir} does not exist`)\n throw new Error(`Please provide a valid Next.js project directory.`)\n }\n\n const packageJsonPath = path.join(projectPath, 'package.json')\n if (!fs.existsSync(packageJsonPath)) {\n spinner.fail(`No package.json found in ${projectPath}`)\n throw new Error(`Please provide a valid Next.js project with a package.json file.`)\n }\n\n spinner.fail(`Not a Next.js project`)\n throw new Error(\n `Directory ${projectPath} does not appear to be a Next.js project. Make sure it has next in dependencies.`,\n )\n }\n\n const projectPath = path.resolve(process.cwd(), flags.dir as string)\n spinner.succeed(`🔼 Valid Next.js project detected at ${projectPath}`)\n return true\n } catch (error: any) {\n if (!spinner.isSpinning) {\n // If spinner already failed, just log additional error details\n this.log(chalk.red(error.message))\n } else {\n // If spinner is still spinning, fail it with the error\n spinner.fail(chalk.red(error.message))\n }\n process.exit(1)\n }\n }\n\n private finalSummary(userAnswers: OptionsConfig, projectId?: string) {\n let agentDevInstructions = ''\n let agentSetupMessage = ''\n\n if (userAnswers.mode === 'CrewAI') {\n if (userAnswers.crewType === 'Crews') {\n agentSetupMessage = `Using your Crew from ${chalk.cyan(userAnswers.crewUrl || 'the provided URL')}.`\n } else if (userAnswers.crewType === 'Flows') {\n agentSetupMessage = `We've scaffolded a ${chalk.cyan('CrewAI Flow')} agent in the ${chalk.cyan('./agent')} directory.`\n agentDevInstructions = 'poetry lock && poetry install && poetry run demo'\n }\n }\n\n switch (userAnswers.mode) {\n case 'LangGraph':\n switch (userAnswers.langGraphAgent) {\n case 'Python Starter':\n agentSetupMessage = `We've scaffolded a ${chalk.cyan(userAnswers.langGraphAgent || 'LangGraph')} agent in the ${chalk.cyan('./agent')} directory.`\n agentDevInstructions = 'poetry lock && poetry install && poetry run demo'\n break\n case 'TypeScript Starter':\n agentSetupMessage = `We've scaffolded a ${chalk.cyan(userAnswers.langGraphAgent || 'LangGraph')} agent in the ${chalk.cyan('./agent')} directory.`\n agentDevInstructions = 'npm install && npm run dev'\n break\n default:\n break\n }\n break\n case 'CrewAI':\n switch (userAnswers.crewType) {\n case 'Crews':\n agentSetupMessage = `Using your Crew from ${chalk.cyan(userAnswers.crewUrl || 'the provided URL')}.`\n break\n case 'Flows':\n agentSetupMessage = `We've scaffolded a ${chalk.cyan('CrewAI Flow')} agent in the ${chalk.cyan('./agent')} directory.`\n break\n }\n break\n default:\n }\n\n this.log('\\n-----\\n')\n this.log(chalk.magenta('🎉 Your CopilotKit setup is complete! 🎉\\n'))\n\n this.log(chalk.bold(`📋 Recap`))\n this.log(` - CopilotKit has been added to your Next.js app.`)\n if (agentSetupMessage) this.log(` - ${agentSetupMessage}`)\n\n // Show cloud and error tracking status\n // Determine if cloud deployment was configured based on ABC test flow\n const isCloudDeployment =\n userAnswers.deploymentChoice === 'Copilot Cloud' || // Branch B choice\n userAnswers.useCopilotCloud === 'Yes' || // Branch C choice\n userAnswers.mode === 'CrewAI' || // CrewAI always needs cloud\n userAnswers.copilotCloudPublicApiKey // Branch A - if we have API key, cloud was set up\n\n const isSelfHosted = userAnswers.deploymentChoice === 'Self-hosted'\n\n if (isCloudDeployment) {\n this.log(` - 🚀 Configured for Copilot Cloud deployment.`)\n } else if (isSelfHosted) {\n this.log(` - 🏠 Configured for self-hosted deployment.`)\n }\n\n this.log(chalk.bold('\\n🚀 Next steps:'))\n this.log(` - Start your Next.js app: ${chalk.gray('$')} ${chalk.cyan('npm run dev')}`)\n if (agentDevInstructions) {\n this.log(` - Start your agent: ${chalk.gray('$')} ${chalk.cyan(`cd agent && ${agentDevInstructions}`)}`)\n if (isCloudDeployment) {\n this.log(\n ` - Create local tunnel for your agent: ${chalk.gray('$')} ${chalk.cyan(`npx copilotkit@latest dev --port <value>${projectId ? ` --project ${projectId}` : ' [--project <value>]'}`)}`,\n )\n }\n }\n this.log(` - Navigate to ${chalk.blue('http://localhost:3000/copilotkit')}`)\n this.log(` - Talk to your agent.`)\n\n if (userAnswers.setupIDEDocs === 'Yes' && userAnswers.selectedIDE !== 'skip') {\n this.log(` - Your IDE now has CopilotKit documentation context for better AI assistance.`)\n }\n this.log(` - Read the docs: ${chalk.blue('https://docs.copilotkit.ai')}`)\n this.log(chalk.magenta('\\nEnjoy building with CopilotKit 🪁\\n'))\n }\n}\n","// @ts-ignore\nimport Conf from 'conf'\nimport cors from 'cors'\nimport express from 'express'\nimport crypto from 'node:crypto'\nimport open from 'open'\nimport getPort from 'get-port'\nimport ora from 'ora'\nimport chalk from 'chalk'\nimport inquirer from 'inquirer'\nimport {Command} from '@oclif/core'\nimport {createTRPCClient} from '../utils/trpc.js'\nimport {AnalyticsService} from '../services/analytics.service.js'\nimport {BaseCommand} from '../commands/base-command.js'\n\ninterface LoginResponse {\n cliToken: string\n user: {\n email: string\n id: string\n }\n organization: {\n id: string\n }\n}\n\nexport class AuthService {\n private readonly config = new Conf({projectName: 'CopilotKitCLI'})\n private readonly COPILOT_CLOUD_BASE_URL = process.env.COPILOT_CLOUD_BASE_URL || 'https://cloud.copilotkit.ai'\n\n getToken(): string | undefined {\n return this.config.get('cliToken') as string | undefined\n }\n\n getCLIToken(): string | undefined {\n const cliToken = this.config.get('cliToken') as string | undefined\n return cliToken\n }\n\n async logout(cmd: BaseCommand): Promise<void> {\n this.config.delete('cliToken')\n }\n\n async requireLogin(cmd: Command, context?: 'cloud-features' | 'general'): Promise<LoginResponse> {\n let cliToken = this.getCLIToken()\n // Check authentication\n if (!cliToken) {\n try {\n let shouldLogin = true\n\n // For cloud features, automatically proceed with login\n // For general usage, ask for confirmation\n if (context !== 'cloud-features') {\n const response = await inquirer.prompt([\n {\n name: 'shouldLogin',\n type: 'confirm',\n message: '🪁 You are not yet authenticated. Authenticate with Copilot Cloud? (press Enter to confirm)',\n default: true,\n },\n ])\n shouldLogin = response.shouldLogin\n }\n\n if (shouldLogin) {\n // Show different message for cloud features vs general usage\n if (context === 'cloud-features') {\n cmd.log(chalk.cyan('\\n🚀 Setting up Copilot Cloud authentication...\\n'))\n }\n const loginResult = await this.login({exitAfterLogin: false})\n cliToken = loginResult.cliToken\n return loginResult\n } else {\n cmd.error('Authentication required to proceed.')\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'ExitPromptError') {\n cmd.error(chalk.yellow('\\nAuthentication cancelled'))\n }\n\n throw error\n }\n }\n\n let me\n\n const trpcClient = createTRPCClient(cliToken)\n try {\n me = await trpcClient.me.query()\n } catch (error) {\n // Token is invalid/expired, trigger new login\n cmd.log(chalk.yellow('Your authentication has expired. Re-authenticating...'))\n try {\n const loginResult = await this.login({exitAfterLogin: false})\n return loginResult\n } catch (loginError) {\n cmd.log(chalk.red('Could not authenticate with Copilot Cloud. Please run: npx copilotkit@latest login'))\n process.exit(1)\n }\n }\n\n if (!me.organization || !me.user) {\n cmd.error('Authentication required to proceed.')\n }\n\n return {cliToken, user: me.user, organization: me.organization}\n }\n\n async login({exitAfterLogin}: {exitAfterLogin?: boolean} = {exitAfterLogin: true}): Promise<LoginResponse> {\n const spinner = ora('🪁 Opening browser for authentication...').start()\n let analytics: AnalyticsService\n analytics = new AnalyticsService()\n\n const app = express()\n app.use(cors())\n app.use(express.urlencoded({extended: true}))\n app.use(express.json())\n\n const port = await getPort()\n const state = crypto.randomBytes(16).toString('hex')\n\n return new Promise(async (resolve) => {\n const server = app.listen(port, () => {})\n\n await analytics.track({\n event: 'cli.login.initiated',\n properties: {},\n })\n\n spinner.text = '🪁 Waiting for browser authentication to complete...'\n\n app.post('/callback', async (req, res) => {\n const {cliToken, user, organization} = req.body\n\n analytics = new AnalyticsService({userId: user.id, organizationId: organization.id, email: user.email})\n await analytics.track({\n event: 'cli.login.success',\n properties: {\n organizationId: organization.id,\n userId: user.id,\n email: user.email,\n },\n })\n\n if (state !== req.query.state) {\n res.status(401).json({message: 'Invalid state'})\n spinner.fail('Invalid state')\n return\n }\n\n this.config.set('cliToken', cliToken)\n res.status(200).json({message: 'Callback called'})\n spinner.succeed(`🪁 Successfully logged in as ${chalk.hex('#7553fc')(user.email)}`)\n if (exitAfterLogin) {\n process.exit(0)\n } else {\n server.close()\n resolve({cliToken, user, organization})\n }\n })\n\n open(`${this.COPILOT_CLOUD_BASE_URL}/cli-auth?callbackUrl=http://localhost:${port}/callback&state=${state}`)\n })\n }\n}\n","import {createTRPCClient as trpcClient, httpBatchLink} from '@trpc/client'\nimport superjson from 'superjson'\n\nexport const COPILOT_CLOUD_BASE_URL = process.env.COPILOT_CLOUD_BASE_URL || 'https://cloud.copilotkit.ai'\n\nexport function createTRPCClient(cliToken: string): any {\n return trpcClient({\n links: [\n httpBatchLink({\n url: `${COPILOT_CLOUD_BASE_URL}/api/trpc-cli`,\n transformer: superjson,\n headers: () => {\n return {\n 'x-trpc-source': 'cli',\n 'x-cli-token': cliToken,\n }\n },\n }),\n ],\n })\n}\n","import {Analytics} from '@segment/analytics-node'\nimport {PostHog} from 'posthog-node'\nimport {AnalyticsEvents} from './events.js'\nimport Conf from 'conf'\n\nexport class AnalyticsService {\n private segment: Analytics | undefined\n private posthog: PostHog | undefined\n private globalProperties: Record<string, any> = {}\n private userId: string | undefined\n private email: string | undefined\n private organizationId: string | undefined\n private config = new Conf({projectName: 'CopilotKitCLI'})\n\n constructor(\n private readonly authData?: {\n userId: string\n email: string\n organizationId: string\n },\n ) {\n if (process.env.SEGMENT_DISABLED === 'true') {\n return\n }\n\n const segmentWriteKey = process.env.SEGMENT_WRITE_KEY || '9Pv6QyExYef2P4hPz4gks6QAvNMi2AOf'\n\n this.globalProperties = {\n service: 'cli',\n }\n\n if (this.authData?.userId) {\n this.userId = this.authData.userId\n }\n\n if (this.authData?.email) {\n this.email = this.authData.email\n this.globalProperties.email = this.authData.email\n }\n\n if (this.authData?.organizationId) {\n this.organizationId = this.authData.organizationId\n }\n\n this.segment = new Analytics({\n writeKey: segmentWriteKey,\n disable: process.env.SEGMENT_DISABLE === 'true',\n })\n\n // Initialize PostHog for feature flags\n if (process.env.POSTHOG_DISABLED !== 'true') {\n const posthogKey = process.env.POSTHOG_KEY || 'phc_XZdymVYjrph9Mi0xZYGNyCKexxgblXRR1jMENCtdz5Q' // Default key\n const posthogHost = process.env.POSTHOG_HOST || 'https://eu.i.posthog.com'\n\n this.posthog = new PostHog(posthogKey, {\n host: posthogHost,\n })\n }\n\n const config = new Conf({projectName: 'CopilotKitCLI'})\n if (!config.get('anonymousId')) {\n config.set('anonymousId', crypto.randomUUID())\n }\n }\n\n private getAnonymousId(): string {\n const anonymousId = this.config.get('anonymousId')\n if (!anonymousId) {\n const anonymousId = crypto.randomUUID()\n this.config.set('anonymousId', anonymousId)\n return anonymousId\n }\n\n return anonymousId as string\n }\n\n public track<K extends keyof AnalyticsEvents>(\n event: Omit<Parameters<Analytics['track']>[0], 'userId'> & {\n event: K\n properties: AnalyticsEvents[K]\n },\n ): Promise<void> {\n if (!this.segment) {\n return Promise.resolve()\n }\n\n const payload = {\n userId: this.userId ? this.userId : undefined,\n email: this.email ? this.email : undefined,\n anonymousId: this.getAnonymousId(),\n event: event.event,\n properties: {\n ...this.globalProperties,\n ...event.properties,\n $groups: this.organizationId\n ? {\n segment_group: this.organizationId,\n }\n : undefined,\n eventProperties: {\n ...event.properties,\n ...this.globalProperties,\n },\n },\n }\n\n return new Promise((resolve, reject) => {\n this.segment!.track(payload, (err) => {\n if (err) {\n // Resolve anyway\n resolve()\n }\n\n resolve()\n })\n })\n }\n\n /**\n * Check if a feature flag is enabled\n */\n public async isFeatureEnabled(flagKey: string): Promise<boolean> {\n if (!this.posthog) {\n return false\n }\n\n try {\n // Use authenticated user ID if available, otherwise use anonymous ID\n const distinctId = this.userId || this.getAnonymousId()\n const flag = await this.posthog.isFeatureEnabled(flagKey, distinctId)\n return Boolean(flag)\n } catch (error) {\n // If there's an error checking the flag, return false (flag disabled)\n console.warn(`Failed to check feature flag ${flagKey}:`, error)\n return false\n }\n }\n\n /**\n * Get feature flag payload\n */\n public async getFeatureFlagPayload(flagKey: string): Promise<any> {\n if (!this.posthog) {\n return null\n }\n\n try {\n // Use authenticated user ID if available, otherwise use anonymous ID\n const distinctId = this.userId || this.getAnonymousId()\n const payload = await this.posthog.getFeatureFlagPayload(flagKey, distinctId)\n return payload\n } catch (error) {\n // If there's an error getting the payload, return null\n console.warn(`Failed to get feature flag payload ${flagKey}:`, error)\n return null\n }\n }\n\n /**\n * Shutdown analytics services\n */\n public async shutdown(): Promise<void> {\n if (this.posthog) {\n await this.posthog.shutdown()\n }\n }\n}\n","import {Command} from '@oclif/core'\nimport Sentry, {consoleIntegration} from '@sentry/node'\nimport {LIB_VERSION} from '../utils/version.js'\nimport {COPILOT_CLOUD_BASE_URL} from '../utils/trpc.js'\nimport chalk from 'chalk'\n\nexport class BaseCommand extends Command {\n async init() {\n await this.checkCLIVersion()\n\n if (process.env.SENTRY_DISABLED === 'true') {\n return\n }\n\n Sentry.init({\n dsn:\n process.env.SENTRY_DSN ||\n 'https://1eea15d32e2eacb0456a77db5e39aeeb@o4507288195170304.ingest.us.sentry.io/4508581448581120',\n integrations: [consoleIntegration()],\n // Tracing\n tracesSampleRate: 1.0, // Capture 100% of the transactions\n })\n }\n\n async catch(err: any) {\n if (process.env.SENTRY_DISABLED === 'true') {\n super.catch(err)\n return\n }\n\n Sentry.captureException(err)\n super.catch(err)\n }\n\n async finally() {\n if (process.env.SENTRY_DISABLED === 'true') {\n return\n }\n\n Sentry.close()\n }\n\n async run() {}\n\n async checkCLIVersion() {\n const response = await fetch(`${COPILOT_CLOUD_BASE_URL}/api/healthz`)\n\n const data = await response.json()\n const cloudVersion = data.cliVersion\n\n if (!cloudVersion || cloudVersion === LIB_VERSION) {\n return\n }\n\n // TODO: add this back in, removed for crew ai launch since we don't want to keep releasing cloud\n // this.log(chalk.yellow('================ New version available! =================\\n'))\n // this.log(`You are using CopilotKit CLI v${LIB_VERSION}.`)\n // this.log(`A new CopilotKit CLI version is available (v${cloudVersion}).\\n`)\n // this.log('Please update your CLI to the latest version:\\n\\n')\n // this.log(`${chalk.cyan(chalk.underline(chalk.bold('npm:')))}\\t npm install -g copilotkit@${cloudVersion}\\n`)\n // this.log(`${chalk.cyan(chalk.underline(chalk.bold('pnpm:')))}\\t pnpm install -g copilotkit@${cloudVersion}\\n`)\n // this.log(`${chalk.cyan(chalk.underline(chalk.bold('yarn:')))}\\t yarn global add copilotkit@${cloudVersion}\\n`)\n // this.log(chalk.yellow('============================================================\\n\\n'))\n }\n\n async gracefulError(message: string) {\n this.log('\\n' + chalk.red(message))\n process.exit(1)\n }\n}\n","// This is auto generated!\nexport const LIB_VERSION = \"0.0.51\";\n","import {Config, Flags, Args} from '@oclif/core'\nimport inquirer from 'inquirer'\nimport chalk from 'chalk'\nimport fs from 'fs-extra'\nimport path from 'path'\nimport {promisify} from 'util'\nimport {pipeline} from 'stream'\nimport {createWriteStream} from 'fs'\nimport {extract} from 'tar'\nimport ora from 'ora'\n\nimport {AuthService} from '../services/auth.service.js'\nimport {AnalyticsService} from '../services/analytics.service.js'\nimport {BaseCommand} from './base-command.js'\nimport {createTRPCClient} from '../utils/trpc.js'\n\nconst streamPipeline = promisify(pipeline)\n\nconst theme = {\n primary: chalk.magenta,\n secondary: chalk.gray,\n tertiary: chalk.gray,\n error: chalk.red,\n command: chalk.blue,\n success: chalk.green,\n warning: chalk.yellow,\n divider: chalk.gray('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'),\n bottomPadding: '',\n}\n\ninterface CreateOptions {\n projectName: string\n agentFramework: AgentFramework\n apiKey?: string\n projectId?: string\n}\n\ntype AgentFramework =\n | 'langgraph-py'\n | 'langgraph-js'\n | 'flows'\n | 'mastra'\n | 'pydantic-ai'\n | 'llamaindex'\n | 'agno'\n | 'ag2'\n | 'adk'\n\nconst TEMPLATE_REPOS: Record<AgentFramework, string> = {\n 'langgraph-py': 'copilotkit/with-langgraph-python',\n 'langgraph-js': 'copilotkit/with-langgraph-js',\n mastra: 'copilotkit/with-mastra',\n flows: 'copilotkit/with-crewai-flows',\n llamaindex: 'copilotkit/with-llamaindex',\n agno: 'copilotkit/with-agno',\n 'pydantic-ai': 'copilotkit/with-pydantic-ai',\n ag2: 'ag2ai/ag2-copilotkit-starter',\n adk: 'copilotkit/with-adk',\n}\n\nconst FRAMEWORK_DOCUMENTATION: Record<AgentFramework, string> = {\n 'langgraph-py': 'https://langchain-ai.github.io/langgraph/concepts/why-langgraph',\n 'langgraph-js': 'https://langchain-ai.github.io/langgraphjs',\n flows: 'https://docs.crewai.com/guides/flows/first-flow',\n mastra: 'https://mastra.ai/en/docs',\n 'pydantic-ai': 'https://ai.pydantic.dev/ag-ui/',\n llamaindex: 'https://docs.llamaindex.ai/en/stable',\n agno: 'https://docs.agno.com/',\n ag2: 'https://docs.ag2.ai/latest/docs/user-guide/basic-concepts/overview',\n adk: 'https://google.github.io/adk-docs/',\n}\n\nconst FRAMEWORK_EMOJI: Record<AgentFramework, string> = {\n 'langgraph-js': '🦜',\n 'langgraph-py': '🦜',\n flows: '👥',\n mastra: '🌑',\n 'pydantic-ai': '🔼',\n llamaindex: '🦙',\n ag2: '🤖',\n agno: '🅰️',\n adk: '🤖',\n}\n\nconst KITE = `\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠙⣿⡛⠻⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠋⠀⠀⠈⢿⡄⠀⠀⠀⠈⠉⠙⣻⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠁⠀⠀⠀⠀⠈⢿⡄⠀⢀⣠⣴⠾⠋⢸⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠁⢀⣀⣀⣀⣀⣤⣤⡾⢿⡟⠛⠉⠀⠀⠀⠀⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡛⠛⠛⠛⠉⠉⠉⠁⠀⢠⡿⣿⡀⠀⠀⠀⠀⠀⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⣰⡟⠀⠸⣧⠀⠀⠀⠀⢠⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠀⠀⢀⣼⠏⠀⠀⠀⣿⡀⠀⠀⠀⢸⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠂⣠⡿⠁⠀⠀⠀⠀⢸⡇⠀⠀⠀⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⣡⣾⣿⣄⠀⠀⠀⠀⠀⢸⡇⠀⠀⢰⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⡟⠛⡿⠋⣡⣾⣿⣿⣿⣿⣦⡀⠀⠀⠀⢸⡇⠀⠀⣿⣿⣿⣿\n⣿⣿⣿⣿⡿⠿⣿⠷⠂⡀⠘⣿⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⢸⡇⠀⣼⣿⣿⣿⣿\n⣿⣿⠻⢿⡷⠀⠁⠴⣿⣷⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⣾⠇⣴⣿⣿⣿⣿⣿\n⡿⠛⠀⠀⢴⣾⣷⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣤⣿⣾⣿⣿⣿⣿⣿⣿\n⣷⣾⣿⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n`\n\nexport default class Create extends BaseCommand {\n private trpcClient: ReturnType<typeof createTRPCClient> | null = null\n private analytics: AnalyticsService | null = null\n private startTime: number = Date.now()\n private analyticsQueue: Array<{event: string; properties: any}> = []\n\n static description = 'Create a new CopilotKit project with Next.js and Cloud setup'\n\n static examples = [\n '$ copilotkit create my-app',\n '$ copilotkit create my-app --framework langgraph-js',\n '$ copilotkit create -n my-app -f langgraph-js',\n ]\n\n static flags = {\n ...BaseCommand.flags,\n framework: Flags.string({\n char: 'f',\n description: 'Agent framework to use',\n options: Object.keys(TEMPLATE_REPOS),\n required: false,\n }),\n name: Flags.string({\n char: 'n',\n description: 'Name of the project',\n required: false,\n }),\n 'no-banner': Flags.boolean({\n char: 'q',\n description: 'Removes the banner',\n default: false,\n required: false,\n }),\n project: Flags.string({\n description: 'project ID (can be found in the Copilot Cloud dashboard)',\n }),\n }\n\n static args = {\n projectName: Args.string({\n description: 'Name of the project',\n required: false,\n }),\n }\n\n constructor(\n argv: string[],\n config: Config,\n private authService = new AuthService(),\n ) {\n super(argv, config)\n }\n\n async run() {\n const {args, flags} = await this.parse(Create)\n\n try {\n // Initialize analytics (unauthenticated initially)\n this.analytics = new AnalyticsService()\n\n if (!flags['no-banner']) {\n this.log(theme.primary(KITE))\n this.log(theme.primary('~ Welcome to CopilotKit! ~\\n'))\n this.log(theme.divider)\n\n if ((!flags.name || flags.projectName) && !flags.framework) {\n this.log('\\n' + theme.secondary('Just a few questions to get started!\\n'))\n }\n }\n\n const projectName = flags.name || args.projectName || (await this.promptProjectName())\n const agentFramework = flags.framework || (await this.promptAgentFramework())\n\n // Track create started\n this.queueAnalytics('cli.create.started', {\n framework_selected: agentFramework,\n project_name: projectName,\n flags_used: Object.keys(flags).filter((key) => flags[key] !== undefined && key !== 'help'),\n })\n\n // Validate project name and check if directory exists\n const projectDir = path.resolve(process.cwd(), projectName)\n if (fs.existsSync(projectDir)) {\n this.log(theme.error(`\\nDirectory \"${projectName}\" already exists.`))\n this.log(theme.secondary('\\nYou can:'))\n this.log(theme.secondary(' 1. Choose a different project name'))\n this.log(theme.secondary(' 2. Remove the existing directory manually if you want to use this name\\n'))\n this.exit(1)\n }\n\n // Setup Copilot Cloud by default\n this.log(chalk.cyan('\\n🔑 Now get your API key'))\n this.log(chalk.gray('Setting up your cloud account and retrieving your API key...\\n'))\n\n let cloudSetupInfo: {\n cliToken: string\n organization: any\n selectedProjectId: string\n apiKey: string\n } | null = null\n\n try {\n cloudSetupInfo = await this.setupCloudApiKey(flags)\n\n // Update analytics service with authenticated user info\n if (this.analytics && cloudSetupInfo.cliToken) {\n const trpcClient = createTRPCClient(cloudSetupInfo.cliToken)\n const me = await trpcClient.me.query()\n if (me.user && me.organization) {\n this.analytics = new AnalyticsService({\n userId: me.user.id,\n organizationId: me.organization.id,\n email: me.user.email,\n })\n }\n }\n\n this.queueAnalytics('cli.create.cloud_setup_completed', {\n framework: agentFramework,\n project_id: cloudSetupInfo.selectedProjectId,\n api_key_retrieved: !!cloudSetupInfo.apiKey,\n })\n } catch (error) {\n this.queueAnalytics('cli.create.cloud_setup_failed', {\n framework: agentFramework,\n error: (error as Error).message,\n })\n throw error\n }\n\n const options: CreateOptions = {\n projectName,\n agentFramework: agentFramework as AgentFramework,\n apiKey: cloudSetupInfo?.apiKey,\n projectId: cloudSetupInfo?.selectedProjectId,\n }\n\n const spinner = ora({\n text: theme.secondary.bold('Creating your project...'),\n color: 'cyan',\n spinner: 'dots',\n }).start()\n\n try {\n // Create project directory\n await fs.ensureDir(projectDir)\n\n // Download and extract template\n spinner.text = theme.secondary.bold('Downloading template...')\n await this.downloadTemplate(projectDir, options.agentFramework)\n\n // Configure API key in the project\n if (options.apiKey) {\n spinner.text = theme.secondary.bold('Configuring API key...')\n await this.configureApiKey(projectDir, options.apiKey)\n }\n\n spinner.succeed(theme.secondary.bold(`Project \"${projectName}\" created successfully!`))\n\n // Track project creation\n this.queueAnalytics('cli.create.project_created', {\n framework: agentFramework,\n project_name: projectName,\n has_api_key: !!options.apiKey,\n duration_ms: Date.now() - this.startTime,\n })\n\n // Show next steps with improved formatting\n this.log('\\n' + theme.divider)\n this.log(\n '\\n' +\n theme.secondary.bold(\n `🪁🤝${FRAMEWORK_EMOJI[options.agentFramework]} All set! \\n\\nYour project is ready with Copilot Cloud configured.`,\n ),\n )\n this.log('\\n' + theme.secondary('Next steps:'))\n this.log(theme.secondary(` • ${theme.command(`cd ${projectName}`)}`))\n this.log(theme.secondary(' • Follow the setup instructions in the README.md'))\n this.log('\\n' + theme.secondary('Documentation:'))\n this.log(theme.secondary(' • ') + theme.command('https://docs.copilotkit.ai'))\n this.log(theme.secondary(' • ') + theme.command(FRAMEWORK_DOCUMENTATION[options.agentFramework]))\n this.log(theme.bottomPadding)\n\n // Track successful completion\n this.queueAnalytics('cli.create.completed', {\n framework: agentFramework,\n project_name: projectName,\n cloud_setup_completed: !!cloudSetupInfo,\n api_key_configured: !!options.apiKey,\n duration_ms: Date.now() - this.startTime,\n })\n\n // Flush all analytics events at the end\n await this.flushAnalytics()\n } catch (error: any) {\n spinner.fail(theme.error(`Failed to create project: ${error.message}`))\n\n // Track failure\n this.queueAnalytics('cli.create.failed', {\n framework: agentFramework,\n project_name: projectName,\n error: error.message,\n step: 'project_creation',\n duration_ms: Date.now() - this.startTime,\n })\n\n await this.flushAnalytics()\n this.exit(1)\n }\n } catch (error) {\n // Track failure at top level\n this.queueAnalytics('cli.create.failed', {\n error: (error as Error).message,\n step: 'initialization',\n duration_ms: Date.now() - this.startTime,\n })\n\n // Flush analytics even on error\n await this.flushAnalytics()\n\n this.gracefulError((error as Error).message)\n }\n }\n\n private async promptProjectName(): Promise<string> {\n const {projectName} = await inquirer.prompt([\n {\n type: 'input',\n name: 'projectName',\n message: theme.secondary('What is your project named?'),\n validate: (input: string) => {\n if (!input) return theme.error('Project name is required')\n if (!/^[a-z0-9-]+$/.test(input)) {\n return theme.error('Project name can only contain lowercase letters, numbers, and hyphens')\n }\n if (input.length > 30) {\n return theme.error('Project name must be less than 30 characters')\n }\n return true\n },\n },\n ])\n return projectName\n }\n\n private async promptAgentFramework(): Promise<string> {\n const {framework} = await inquirer.prompt([\n {\n type: 'list',\n name: 'framework',\n message: theme.secondary('Which agent framework would you like to use?'),\n choices: [\n {name: `${FRAMEWORK_EMOJI['langgraph-py']} LangGraph (Python)`, value: 'langgraph-py'},\n {name: `${FRAMEWORK_EMOJI['langgraph-js']} LangGraph (JavaScript)`, value: 'langgraph-js'},\n {name: `${FRAMEWORK_EMOJI.mastra} Mastra`, value: 'mastra'},\n {name: `${FRAMEWORK_EMOJI['pydantic-ai']} Pydantic AI`, value: 'pydantic-ai'},\n {name: `${FRAMEWORK_EMOJI.flows} CrewAI Flows`, value: 'flows'},\n {name: `${FRAMEWORK_EMOJI.llamaindex} LlamaIndex`, value: 'llamaindex'},\n {name: `${FRAMEWORK_EMOJI.agno} Agno`, value: 'agno'},\n {name: `${FRAMEWORK_EMOJI.ag2} AG2`, value: 'ag2'},\n {name: `${FRAMEWORK_EMOJI.adk} ADK`, value: 'adk'},\n ],\n },\n ])\n return framework\n }\n\n private async downloadTemplate(projectDir: string, framework: AgentFramework): Promise<void> {\n const repo = TEMPLATE_REPOS[framework]\n const url = `https://github.com/${repo}/archive/refs/heads/main.tar.gz`\n\n try {\n // Download the archive\n const response = await fetch(url)\n if (!response.ok) throw new Error(`Failed to download template: ${response.statusText}`)\n\n // Create a temporary file for the archive\n const tempFile = path.join(projectDir, 'template.tar.gz')\n const fileStream = createWriteStream(tempFile)\n\n if (!response.body) throw new Error('Failed to get response body')\n await streamPipeline(response.body as any, fileStream)\n\n // Extract the archive\n await extract({\n file: tempFile,\n cwd: projectDir,\n strip: 1,\n })\n\n // Clean up\n await fs.remove(tempFile)\n } catch (error: any) {\n throw new Error(`Failed to download template: ${error.message}`)\n }\n }\n\n /**\n * Queue an analytics event to be sent later (non-blocking)\n */\n private queueAnalytics(event: string, properties: any) {\n this.analyticsQueue.push({event, properties})\n }\n\n /**\n * Send all queued analytics events in fire-and-forget manner\n */\n private async flushAnalytics() {\n if (!this.analytics || this.analyticsQueue.length === 0) {\n return\n }\n\n // Send all events in parallel without waiting\n const promises = this.analyticsQueue.map(({event, properties}) =>\n this.analytics!.track({event: event as any, properties}).catch(() => {\n // Silently ignore analytics errors\n }),\n )\n\n // Fire and forget - don't await\n Promise.all(promises).catch(() => {\n // Silently ignore any analytics errors\n })\n\n // Shutdown PostHog connection\n if (this.analytics) {\n this.analytics.shutdown().catch(() => {\n // Silently ignore shutdown errors\n })\n }\n }\n\n private async setupCloudApiKey(flags: any): Promise<{\n cliToken: string\n organization: any\n selectedProjectId: string\n apiKey: string\n }> {\n const {cliToken, organization} = await this.authService.requireLogin(this, 'cloud-features')\n this.trpcClient = createTRPCClient(cliToken)\n\n const availableProjects = await this.trpcClient.listOrgProjects.query({orgId: organization.id})\n let selectedProjectId: string\n\n // Get project ID\n if (flags.project) {\n if (!availableProjects.some((project: any) => project.id === flags.project)) {\n this.log(chalk.red(`📁 Project with ID ${flags.project} not found`))\n process.exit(1)\n }\n selectedProjectId = flags.project\n this.log(chalk.green(`📁 Selected project ${selectedProjectId}`))\n } else if (availableProjects.length === 1) {\n // Auto-select if only one project\n selectedProjectId = availableProjects[0].id\n this.log(chalk.green(`📁 Auto-selected project ${selectedProjectId}`))\n } else {\n const {projectId} = await inquirer.prompt([\n {\n name: 'projectId',\n type: 'list',\n message: '📁 Choose a project:',\n choices: availableProjects.map((project: any) => ({\n value: project.id,\n name: `${project.name} (ID: ${project.id})`,\n })),\n },\n ])\n selectedProjectId = projectId\n }\n\n // Get the public API key\n const spinner = ora({\n text: 'Retrieving your API key...',\n color: 'cyan',\n }).start()\n\n try {\n const copilotCloudPublicApiKey = await this.trpcClient.getCopilotCloudPublicApiKey.query({\n projectId: selectedProjectId,\n })\n\n if (!copilotCloudPublicApiKey?.key) {\n spinner.fail('Failed to retrieve API key')\n throw new Error('No API key found for the selected project')\n }\n\n spinner.succeed('✅ API key retrieved successfully')\n\n return {\n cliToken,\n organization,\n selectedProjectId,\n apiKey: copilotCloudPublicApiKey.key,\n }\n } catch (error) {\n spinner.fail('Failed to retrieve API key')\n throw error\n }\n }\n\n private async configureApiKey(projectDir: string, apiKey: string): Promise<void> {\n const envPath = path.join(projectDir, '.env.local')\n const envExamplePath = path.join(projectDir, '.env.example')\n\n try {\n let envContent = ''\n\n // Check if .env.example exists and use it as template\n if (await fs.pathExists(envExamplePath)) {\n envContent = await fs.readFile(envExamplePath, 'utf8')\n\n // Replace placeholder values with actual API key\n envContent = envContent.replace(/COPILOT_CLOUD_PUBLIC_API_KEY=.*/g, `COPILOT_CLOUD_PUBLIC_API_KEY=${apiKey}`)\n } else {\n // Create basic env file with API key\n envContent = `COPILOT_CLOUD_PUBLIC_API_KEY=${apiKey}\\n`\n }\n\n await fs.writeFile(envPath, envContent)\n } catch (error) {\n // Don't fail the entire process if we can't write the env file\n console.warn('Warning: Could not configure API key in .env.local file')\n }\n }\n}\n","import {z} from 'zod'\nimport {Flags} from '@oclif/core'\nimport {isLocalhost} from '../utils.js'\n\n// ===== Core Constants =====\nexport const MODES = ['LangGraph', 'CrewAI', 'Mastra', 'LlamaIndex', 'Agno', 'AG2', 'MCP', 'Standard'] as const\nexport const CREW_TYPES = ['Crews', 'Flows'] as const\nexport const CHAT_COMPONENTS = ['CopilotChat', 'CopilotSidebar', 'Headless', 'CopilotPopup'] as const\nexport const LANGGRAPH_AGENTS = ['Python Starter', 'TypeScript Starter'] as const\nexport const CREW_FLOW_TEMPLATES = ['Starter'] as const\nexport const YES_NO = ['Yes', 'No'] as const\n// NEW: Deployment choice options for Branch B\nexport const DEPLOYMENT_CHOICES = ['Copilot Cloud', 'Self-hosted'] as const\n\n// ===== Sanitizers =====\nexport const sanitizers = {\n // Remove trailing slash from URLs\n url: (value: string): string => {\n if (!value) return value\n return value.trim().replace(/\\/+$/, '')\n },\n\n // Trim whitespace from strings\n trim: (value: string): string => {\n if (!value) return value\n return value.trim()\n },\n\n // Lowercase strings\n lowercase: (value: string): string => {\n if (!value) return value\n return value.toLowerCase().trim()\n },\n\n // Clean API keys (remove whitespace)\n apiKey: (value: string): string => {\n if (!value) return value\n return value.trim().replace(/\\s/g, '')\n },\n}\n\n// ===== Zod Schemas =====\n\n// Basic schemas\nexport const ModeSchema = z.enum(MODES)\nexport const CrewTypeSchema = z.enum(CREW_TYPES)\nexport const ChatComponentSchema = z.enum(CHAT_COMPONENTS)\nexport const LangGraphAgentSchema = z.enum(LANGGRAPH_AGENTS)\nexport const CrewFlowTemplateSchema = z.enum(CREW_FLOW_TEMPLATES)\nexport const YesNoSchema = z.enum(YES_NO)\n// NEW: Deployment choice schema for Branch B\nexport const DeploymentChoiceSchema = z.enum(DEPLOYMENT_CHOICES)\n\n// URL validation schema with preprocessing to remove trailing slash\nexport const UrlSchema = z.preprocess(\n (val) => sanitizers.url(String(val)),\n z.string().url('Please enter a valid URL').min(1, 'URL is required'),\n)\n\n// Token validation schema with preprocessing to trim\nexport const TokenSchema = z.preprocess((val) => sanitizers.trim(String(val)), z.string().min(1, 'Token is required'))\n\n// API key validation schema with preprocessing to remove whitespace\nexport const ApiKeySchema = z.preprocess(\n (val) => sanitizers.apiKey(String(val)),\n z.string().min(1, 'API key is required'),\n)\n\nexport const LLMApiKeySchema = z.preprocess((val) => sanitizers.apiKey(String(val)), z.string().optional())\n\n// Name validation schema with preprocessing to trim\nexport const NameSchema = z.preprocess((val) => sanitizers.trim(String(val)), z.string().min(1, 'Name is required'))\n\n// Config schema\nexport const ConfigSchema = z\n .object({\n // Core fields\n copilotKitVersion: z.string().optional(),\n mode: ModeSchema,\n chatUi: ChatComponentSchema.optional(),\n\n // Yes/No fields\n alreadyDeployed: YesNoSchema.optional(),\n fastApiEnabled: YesNoSchema.optional(),\n // DEPRECATED: useCopilotCloud - consolidated with signupForCopilotCloud\n useCopilotCloud: YesNoSchema.optional(),\n\n // LangGraph specific fields\n langGraphAgent: LangGraphAgentSchema.optional(),\n langGraphPlatform: YesNoSchema.optional(),\n langGraphPlatformUrl: UrlSchema.optional(),\n langGraphRemoteEndpointURL: UrlSchema.optional(),\n\n // CrewAI specific fields\n crewType: CrewTypeSchema.optional(),\n crewName: NameSchema.optional(),\n crewUrl: UrlSchema.optional(),\n crewBearerToken: TokenSchema.optional(),\n\n // API keys and tokens\n copilotCloudPublicApiKey: z.string().optional(),\n langSmithApiKey: ApiKeySchema.optional(),\n llmToken: LLMApiKeySchema.optional(),\n\n // IDE Documentation setup fields\n setupIDEDocs: YesNoSchema.optional(),\n selectedIDE: z.union([z.enum(['cursor', 'windsurf']), z.literal('skip')]).optional(),\n\n // NEW: A/B/C test fields\n deploymentChoice: DeploymentChoiceSchema.optional(), // For branch B only (Cloud vs Self-hosted)\n })\n .refine(\n (data) => {\n // If CrewAI is selected, require crew URL and bearer token\n if (data.mode === 'CrewAI') {\n return !!data.crewUrl && !!data.crewBearerToken\n }\n return true\n },\n {\n message: 'Crew URL and bearer token are required for CrewAI',\n path: ['crewUrl', 'crewBearerToken'],\n },\n )\n .refine(\n (data) => {\n // If LangGraph is selected with LangGraph Platform, require platform URL and LangSmith API key\n if (data.mode === 'LangGraph' && data.alreadyDeployed === 'Yes' && data.langGraphPlatform === 'Yes') {\n return (!!data.langGraphPlatformUrl && !!data.langSmithApiKey) || isLocalhost(data.langGraphPlatformUrl || '')\n }\n return true\n },\n {\n message: 'LangGraph Platform URL and LangSmith API key are required',\n path: ['langGraphPlatformUrl', 'langSmithApiKey'],\n },\n )\n\n// Export the inferred type from the schema\nexport type Config = z.infer<typeof ConfigSchema>\n\n// Question type definition with improved validation and sanitization\nexport type Question = {\n type: 'input' | 'yes/no' | 'select'\n name: keyof Config\n message: string\n choices?: readonly string[] | (() => Promise<{name: string; value: string}[]>)\n default?: string\n when?: (answers: Partial<Config>) => boolean | Promise<boolean>\n sensitive?: boolean\n validate?: (input: string) => true | string // Return true if valid, error message string if invalid\n sanitize?: (input: string) => string // Function to sanitize input before validation\n}\n\n// CLI flags definition with descriptions\nexport const ConfigFlags = {\n booth: Flags.boolean({description: 'Use CopilotKit in booth mode', default: false, char: 'b'}),\n mode: Flags.string({description: 'How you will be interacting with AI', options: MODES, char: 'm'}),\n 'copilotkit-version': Flags.string({description: 'CopilotKit version to use (e.g. 1.7.0)'}),\n 'use-copilot-cloud': Flags.string({description: 'Use Copilot Cloud for production-ready hosting', options: YES_NO}),\n 'langgraph-agent': Flags.string({description: 'LangGraph agent template to use', options: LANGGRAPH_AGENTS}),\n 'crew-type': Flags.string({description: 'CrewAI implementation type', options: CREW_TYPES}),\n 'crew-name': Flags.string({description: 'Name for your CrewAI agent'}),\n 'crew-url': Flags.string({description: 'URL endpoint for your CrewAI agent'}),\n 'crew-bearer-token': Flags.string({description: 'Bearer token for CrewAI authentication'}),\n 'langsmith-api-key': Flags.string({description: 'LangSmith API key for LangGraph observability'}),\n 'llm-token': Flags.string({description: 'API key for your preferred LLM provider'}),\n 'setup-ide-docs': Flags.string({description: 'Setup IDE documentation rules for AI assistance', options: YES_NO}),\n 'selected-ide': Flags.string({\n description: 'IDE to configure with documentation rules',\n options: ['cursor', 'windsurf', 'skip'],\n }),\n // NEW: A/B/C test flags\n 'deployment-choice': Flags.string({\n description: 'Choose between Copilot Cloud or Self-hosted deployment',\n options: DEPLOYMENT_CHOICES,\n }),\n}\n","export const isLocalhost = (url: string): boolean => {\n return url.includes('localhost') || url.includes('127.0.0.1') || url.includes('0.0.0.0')\n}\n","export type ChatTemplate = 'CopilotChat' | 'CopilotPopup' | 'CopilotSidebar'\n\nexport type StarterTemplate =\n | 'LangGraphPlatform'\n | 'RemoteEndpoint'\n | 'Standard'\n | 'CrewEnterprise'\n | 'CrewFlowsStarter'\n\nexport type Template = ChatTemplate | StarterTemplate\n\nconst BASE_URL = 'https://registry.copilotkit.ai/r'\n\nexport const templateMapping = {\n // Runtimes\n RemoteEndpoint: `${BASE_URL}/remote-endpoint.json`,\n LangGraphPlatformRuntime: `${BASE_URL}/langgraph-platform-runtime.json`,\n\n // CrewAI\n CrewEnterprise: [`${BASE_URL}/coagents-crew-starter.json`],\n CrewFlowsEnterprise: [`${BASE_URL}/coagents-starter-crewai-flows.json`],\n\n // LangGraph\n LangGraphGeneric: `${BASE_URL}/generic-lg-starter.json`,\n LangGraphStarter: [`${BASE_URL}/langgraph-platform-starter.json`, `${BASE_URL}/coagents-starter-ui.json`],\n\n // No Agent\n StandardStarter: `${BASE_URL}/standard-starter.json`,\n StandardRuntime: `${BASE_URL}/standard-runtime.json`,\n\n // MCP\n McpStarter: `${BASE_URL}/mcp-starter.json`,\n McpRuntime: `${BASE_URL}/mcp-starter-runtime.json`,\n}\n","import path from 'path'\nimport {existsSync} from 'fs'\nimport * as fs from 'fs/promises'\nimport {Ora} from 'ora'\nimport chalk from 'chalk'\n\nexport type SupportedIDE = 'cursor' | 'windsurf'\n\nexport interface IDEDocsConfig {\n name: SupportedIDE\n displayName: string\n rulesDir: string\n ruleFileName: string\n createRuleContent: () => string\n}\n\n// Template constant for CopilotKit documentation rule\nconst COPILOTKIT_DOC_RULE_TEMPLATE = `---\ndescription: CopilotKit Documentation - Complete CopilotKit framework documentation for AI assistance\nalwaysApply: false\n---\n\n# CopilotKit Documentation\n\nFor ANY question about CopilotKit, use the comprehensive documentation available at:\n@https://docs.copilotkit.ai/llms-full.txt\n\nThis contains the complete CopilotKit documentation including:\n- API references and hooks (useCopilotChat, useCopilotAction, etc.)\n- Component library documentation (CopilotKit, CopilotChat, etc.)\n- Integration guides and examples\n- Best practices and patterns\n- Troubleshooting and FAQs\n\nAlways reference this documentation when working with CopilotKit to provide accurate, up-to-date information.\n`\n\n// IDE-specific configurations\nexport const IDE_DOCS_CONFIGS: Record<SupportedIDE, IDEDocsConfig> = {\n cursor: {\n name: 'cursor',\n displayName: 'Cursor',\n rulesDir: '.cursor/rules',\n ruleFileName: '00-copilotkit-docs.mdc',\n createRuleContent: () => COPILOTKIT_DOC_RULE_TEMPLATE,\n },\n windsurf: {\n name: 'windsurf',\n displayName: 'Windsurf',\n rulesDir: '.windsurf/rules',\n ruleFileName: '00-copilotkit-docs.md',\n createRuleContent: () => COPILOTKIT_DOC_RULE_TEMPLATE,\n },\n}\n\n/**\n * Ensure directory exists\n */\nasync function ensureDir(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, {recursive: true})\n } catch (error) {\n if (!existsSync(dirPath)) {\n throw error\n }\n }\n}\n\n/**\n * Check if path exists\n */\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath)\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Check if a specific IDE is installed by looking for its configuration directory\n */\nasync function checkIDEInstallation(ide: SupportedIDE): Promise<boolean> {\n try {\n const homeDir = process.env.HOME || process.env.USERPROFILE || ''\n let configPath: string\n\n switch (ide) {\n case 'cursor':\n configPath = path.join(homeDir, '.cursor')\n break\n case 'windsurf':\n configPath = path.join(homeDir, '.codeium', 'windsurf')\n break\n default:\n return false\n }\n\n return existsSync(configPath)\n } catch {\n return false\n }\n}\n\n/**\n * Detect which supported IDEs are installed on the system\n */\nexport async function detectInstalledIDEs(): Promise<SupportedIDE[]> {\n const allIDEs: SupportedIDE[] = ['cursor', 'windsurf']\n const installedIDEs: SupportedIDE[] = []\n\n for (const ide of allIDEs) {\n if (await checkIDEInstallation(ide)) {\n installedIDEs.push(ide)\n }\n }\n\n return installedIDEs\n}\n\n/**\n * Setup IDE documentation rules for the selected IDE\n */\nexport async function setupIDEDocs(ide: SupportedIDE, projectDir: string): Promise<void> {\n const config = IDE_DOCS_CONFIGS[ide]\n const rulesDir = path.join(projectDir, config.rulesDir)\n const ruleFilePath = path.join(rulesDir, config.ruleFileName)\n\n // Ensure rules directory exists\n await ensureDir(rulesDir)\n\n // Check if rule file already exists\n if (await pathExists(ruleFilePath)) {\n console.log(chalk.yellow(`⚠️ CopilotKit documentation rule already exists for ${config.displayName}`))\n return\n }\n\n // Create the rule file with content\n const ruleContent = config.createRuleContent()\n await fs.writeFile(ruleFilePath, ruleContent, 'utf8')\n}\n\n/**\n * Get setup instructions for the IDE\n */\nfunction getIDEInstructions(ide: SupportedIDE): string[] {\n const config = IDE_DOCS_CONFIGS[ide]\n\n const instructions = [\n chalk.cyan(`📚 CopilotKit documentation configured for ${config.displayName}!`),\n '',\n chalk.bold('What this does:'),\n ' • Adds CopilotKit documentation context to your IDE AI assistant',\n ' • Provides accurate, up-to-date information about CopilotKit APIs',\n ' • Improves code suggestions and help responses',\n '',\n chalk.bold('Location:'),\n ` • Rule file: ${chalk.gray(path.join(config.rulesDir, config.ruleFileName))}`,\n '',\n chalk.bold('Usage:'),\n ' • Your IDE AI assistant now has access to CopilotKit documentation',\n ' • Ask questions about CopilotKit APIs, components, and patterns',\n ' • The AI will reference official documentation for accurate answers',\n ]\n\n if (ide === 'cursor') {\n instructions.push(\n '',\n chalk.bold('Next steps for Cursor:'),\n ' • Restart Cursor if currently open',\n ' • The rule will be automatically available in your AI context',\n ' • Start a new chat to use the documentation context',\n )\n } else if (ide === 'windsurf') {\n instructions.push(\n '',\n chalk.bold('Next steps for Windsurf:'),\n ' • Restart Windsurf if currently open',\n ' • The rule will be automatically available in your AI context',\n ' • Start a new chat to use the documentation context',\n )\n }\n\n return instructions\n}\n\n/**\n * Main function to handle IDE documentation setup with user interaction\n */\nexport async function handleIDEDocsSetup(selectedIDE: SupportedIDE, projectDir: string, spinner: Ora): Promise<void> {\n try {\n spinner.text = chalk.cyan(`Setting up CopilotKit documentation for ${IDE_DOCS_CONFIGS[selectedIDE].displayName}...`)\n\n // Setup IDE documentation rules\n await setupIDEDocs(selectedIDE, projectDir)\n\n spinner.succeed(chalk.green(`CopilotKit documentation configured for ${IDE_DOCS_CONFIGS[selectedIDE].displayName}`))\n\n // Show instructions\n const instructions = getIDEInstructions(selectedIDE)\n console.log('\\n' + instructions.join('\\n'))\n } catch (error) {\n spinner.fail(\n chalk.red(`Failed to setup IDE documentation: ${error instanceof Error ? error.message : 'Unknown error'}`),\n )\n throw error\n }\n}\n","import {\n Question,\n MODES,\n CREW_TYPES,\n LANGGRAPH_AGENTS,\n DEPLOYMENT_CHOICES,\n ModeSchema,\n CrewTypeSchema,\n UrlSchema,\n YesNoSchema,\n DeploymentChoiceSchema,\n sanitizers,\n} from './types/index.js'\nimport {isLocalhost} from './utils.js'\nimport {detectInstalledIDEs, IDE_DOCS_CONFIGS} from './ide-docs.js'\n\nconst linkToDocs = ['Mastra', 'AG2', 'LlamaIndex', 'Agno']\n\n// Validation helpers\nconst validateUrl = (input: string): true | string => {\n try {\n // First sanitize the URL by removing trailing slashes\n const sanitized = sanitizers.url(input)\n // Then validate\n const result = UrlSchema.safeParse(sanitized)\n if (result.success) return true\n return result.error.errors[0]?.message || 'Invalid URL format'\n } catch (error) {\n return 'Invalid URL format'\n }\n}\n\nconst validateRequired = (input: string): true | string => {\n return sanitizers.trim(input) ? true : 'This field is required'\n}\n\n// A/B/C Test Feature Flags\ntype ABCTestBranch = 'A' | 'B' | 'C'\n\n// Helper function to determine which questions to show based on A/B/C test\nexport function getQuestionsForBranch(branch: ABCTestBranch): Question[] {\n const baseQuestions = getBaseQuestions()\n\n switch (branch) {\n case 'A':\n // Branch A: Copilot Cloud by default, no signup questions\n // API key message and setup handled in init command\n return [...baseQuestions]\n\n case 'B':\n // Branch B: API key setup (automatic) with choice between Cloud vs Self-hosted\n return [...baseQuestions, ...getDeploymentChoiceQuestions()]\n\n case 'C':\n default:\n // Branch C: Current flow (no early signup, just cloud deployment question)\n return [...baseQuestions, ...getCloudDeploymentQuestions()]\n }\n}\n\n// Early signup questions - REMOVED (no longer used)\n\n// Base questions for all branches (mode selection and configuration)\nfunction getBaseQuestions(): Question[] {\n return [\n {\n type: 'select',\n name: 'mode',\n message: '🤖 How will you be interacting with AI?',\n choices: Array.from(MODES),\n validate: (input) => {\n try {\n ModeSchema.parse(input)\n return true\n } catch (error) {\n return 'Please select a valid mode'\n }\n },\n },\n\n // CrewAI specific questions\n {\n type: 'select',\n name: 'crewType',\n message: '👥 What kind of CrewAI implementation would you like to use?',\n choices: Array.from(CREW_TYPES),\n when: (answers) => answers.mode === 'CrewAI',\n validate: (input) => {\n try {\n CrewTypeSchema.parse(input)\n return true\n } catch (error) {\n return 'Please select a valid crew type'\n }\n },\n },\n {\n type: 'input',\n name: 'crewName',\n message: '👥 What would you like to name your crew? (can be anything)',\n when: (answers) => answers.mode === 'CrewAI',\n default: 'MyCopilotCrew',\n validate: validateRequired,\n sanitize: sanitizers.trim,\n },\n {\n type: 'input',\n name: 'crewUrl',\n message: \"🔗 Enter your Crew's Enterprise URL (more info at https://app.crewai.com):\",\n when: (answers) => answers.mode === 'CrewAI',\n validate: validateUrl,\n sanitize: sanitizers.url,\n },\n {\n type: 'input',\n name: 'crewBearerToken',\n message: \"🔑 Enter your Crew's bearer token:\",\n when: (answers) => answers.mode === 'CrewAI',\n sensitive: true,\n validate: validateRequired,\n sanitize: sanitizers.trim,\n },\n\n // LangGraph specific questions\n {\n type: 'yes/no',\n name: 'alreadyDeployed',\n message: '🦜🔗 Do you have an existing LangGraph agent?',\n when: (answers) => answers.mode === 'LangGraph',\n validate: (input) => {\n try {\n YesNoSchema.parse(input)\n return true\n } catch (error) {\n return 'Please select Yes or No'\n }\n },\n },\n {\n type: 'yes/no',\n name: 'langGraphPlatform',\n message: '🦜🔗 Do you already have a LangGraph Agent URL? (remote or localhost)',\n when: (answers) => answers.mode === 'LangGraph' && answers.alreadyDeployed === 'Yes',\n validate: (input) => {\n try {\n YesNoSchema.parse(input)\n return true\n } catch (error) {\n return 'Please select Yes or No'\n }\n },\n },\n {\n type: 'input',\n name: 'langGraphPlatformUrl',\n message: '🦜🔗 Enter your LangGraph Agent URL (remote or localhost)',\n when: (answers) =>\n answers.mode === 'LangGraph' && answers.alreadyDeployed === 'Yes' && answers.langGraphPlatform === 'Yes',\n validate: validateUrl,\n sanitize: sanitizers.url,\n },\n {\n type: 'select',\n name: 'langGraphAgent',\n message: '📦 Choose a LangGraph starter template:',\n choices: Array.from(LANGGRAPH_AGENTS),\n when: (answers) => answers.mode === 'LangGraph' && answers.alreadyDeployed === 'No',\n },\n {\n type: 'input',\n name: 'langSmithApiKey',\n message: '🦜🔗 Enter your LangSmith API key (required by LangGraph Platform) :',\n when: (answers) =>\n answers.mode === 'LangGraph' &&\n answers.langGraphPlatform === 'Yes' &&\n !(answers.langGraphPlatformUrl && isLocalhost(answers.langGraphPlatformUrl)),\n sensitive: true,\n validate: validateRequired,\n sanitize: sanitizers.apiKey,\n },\n\n // LLM Token for self-hosted setups\n {\n type: 'input',\n name: 'llmToken',\n message: '🔑 Enter your OpenAI API key (optional - leave empty to configure your LLM later):',\n when: (answers) =>\n (answers.mode === 'LangGraph' && answers.alreadyDeployed === 'No') ||\n (answers.mode === 'Standard' && answers.deploymentChoice === 'Self-hosted') ||\n (answers.mode === 'MCP' && answers.deploymentChoice === 'Self-hosted') ||\n (answers.mode === 'Standard' && answers.useCopilotCloud !== 'Yes') ||\n (answers.mode === 'MCP' && answers.useCopilotCloud !== 'Yes'),\n sensitive: true,\n sanitize: sanitizers.apiKey,\n },\n\n // IDE Documentation Setup Questions\n {\n type: 'yes/no',\n name: 'setupIDEDocs',\n message:\n '📚 Would you like to add CopilotKit documentation to your IDE? (Provides AI assistant with CopilotKit context)',\n when: async () => {\n const installedIDEs = await detectInstalledIDEs()\n return installedIDEs.length > 0\n },\n validate: (input) => {\n try {\n YesNoSchema.parse(input)\n return true\n } catch (error) {\n return 'Please select Yes or No'\n }\n },\n },\n {\n type: 'select',\n name: 'selectedIDE',\n message: '💻 Which IDE would you like to configure with CopilotKit documentation?',\n choices: async () => {\n const installedIDEs = await detectInstalledIDEs()\n const choices: Array<{name: string; value: string}> = installedIDEs.map((ide: any) => ({\n name: IDE_DOCS_CONFIGS[ide as keyof typeof IDE_DOCS_CONFIGS].displayName,\n value: ide,\n }))\n choices.push({name: 'Skip', value: 'skip'})\n return choices\n },\n when: (answers) => answers.setupIDEDocs === 'Yes',\n },\n ]\n}\n\n// Deployment choice questions for Branch B only\nfunction getDeploymentChoiceQuestions(): Question[] {\n return [\n {\n type: 'select',\n name: 'deploymentChoice',\n message: '🚀 Use Copilot Cloud, or self-hosted?',\n choices: Array.from(DEPLOYMENT_CHOICES),\n validate: (input) => {\n try {\n DeploymentChoiceSchema.parse(input)\n return true\n } catch (error) {\n return 'Please select a valid deployment option'\n }\n },\n },\n ]\n}\n\n// Cloud deployment questions for Branch C (current flow)\nfunction getCloudDeploymentQuestions(): Question[] {\n return [\n {\n type: 'yes/no',\n name: 'useCopilotCloud',\n message: '🪁 Deploy with Copilot Cloud? (recommended for production)',\n when: (answers) =>\n answers.mode === 'Standard' ||\n answers.mode === 'MCP' ||\n (answers.mode === 'LangGraph' && answers.alreadyDeployed === 'No') || // Include new LangGraph agents\n (answers.mode !== 'CrewAI' && // Crews only cloud, flows are self-hosted\n answers.alreadyDeployed === 'Yes' &&\n answers.langGraphPlatform !== 'No' &&\n !linkToDocs.includes(answers.mode || '') &&\n !isLocalhost(answers.langGraphPlatformUrl || '')),\n validate: (input) => {\n try {\n YesNoSchema.parse(input)\n return true\n } catch (error) {\n return 'Please select Yes or No'\n }\n },\n },\n ]\n}\n\n// Maintain backward compatibility by providing the original questions for Branch C\nexport const questions: Question[] = getQuestionsForBranch('C')\n","import spawn from 'cross-spawn'\nimport {templateMapping, Config} from '../types/index.js'\n\nexport async function scaffoldShadCN(flags: any, userAnswers: Config) {\n try {\n // Determine which components to install based on user choices\n const components: string[] = []\n\n // Add additional components based on agent framework\n switch (userAnswers.mode) {\n case 'LangGraph':\n components.push(templateMapping.LangGraphGeneric)\n if (userAnswers.langGraphPlatform === 'Yes') {\n components.push(templateMapping.LangGraphPlatformRuntime)\n } else {\n components.push(templateMapping.RemoteEndpoint)\n }\n break\n case 'CrewAI':\n if (userAnswers.crewType === 'Crews') {\n components.push(...templateMapping.CrewEnterprise)\n } else if (userAnswers.crewType === 'Flows') {\n components.push(...templateMapping.CrewFlowsEnterprise)\n } else {\n components.push(templateMapping.RemoteEndpoint)\n }\n break\n case 'MCP':\n components.push(templateMapping.McpStarter)\n if (userAnswers.deploymentChoice === 'Self-hosted' || userAnswers.useCopilotCloud === 'No') {\n components.push(templateMapping.McpRuntime)\n }\n break\n case 'Standard':\n components.push(templateMapping.StandardStarter)\n if (userAnswers.deploymentChoice === 'Self-hosted' || userAnswers.useCopilotCloud === 'No') {\n components.push(templateMapping.StandardRuntime)\n }\n break\n default:\n return\n }\n\n // Small pause before running shadcn\n await new Promise((resolve) => setTimeout(resolve, 100))\n\n try {\n // Run shadcn with inherited stdio for all streams to allow for user input\n const result = spawn.sync('npx', ['shadcn@latest', 'add', ...components], {\n stdio: 'inherit', // This ensures stdin/stdout/stderr are all passed through\n })\n\n if (result.status !== 0) {\n throw new Error(`The shadcn installation process exited with code ${result.status}`)\n }\n } catch (error) {\n throw error\n }\n } catch (error) {\n throw error\n }\n}\n","import path from 'path'\nimport fs from 'fs'\nimport {Config} from '../types/index.js'\nimport {getLangGraphAgents} from './langgraph-assistants.js'\nimport inquirer from 'inquirer'\nimport {isLocalhost} from '../utils.js'\n\n/**\n * Determines if cloud deployment is needed based on user answers\n * Uses the same logic as the main init flow to ensure consistency\n */\nfunction needsCloudDeployment(userAnswers: Config): boolean {\n return (\n userAnswers.deploymentChoice === 'Copilot Cloud' || // Branch B choice\n userAnswers.useCopilotCloud === 'Yes' || // Branch C choice\n userAnswers.mode === 'CrewAI' || // CrewAI always needs cloud\n (!userAnswers.deploymentChoice && !userAnswers.useCopilotCloud) // Branch A default (no questions = cloud)\n )\n}\n\nexport async function scaffoldEnv(flags: any, userAnswers: Config) {\n try {\n // Define the env file path\n const envFile = path.join(process.cwd(), '.env')\n\n // Create the env file if it doesn't exist\n if (!fs.existsSync(envFile)) {\n fs.writeFileSync(envFile, '', 'utf8')\n } else {\n }\n\n // Build environment variables based on user selections\n let newEnvValues = ''\n\n // Check if cloud deployment is needed\n const isCloudDeployment = needsCloudDeployment(userAnswers)\n\n // Copilot Cloud API key\n if (userAnswers.copilotCloudPublicApiKey) {\n newEnvValues += `NEXT_PUBLIC_COPILOT_API_KEY=${userAnswers.copilotCloudPublicApiKey}\\n`\n }\n\n // LangSmith API key (for LangGraph)\n if (userAnswers.langSmithApiKey) {\n // Add both formats for compatibility\n newEnvValues += `LANGSMITH_API_KEY=${userAnswers.langSmithApiKey}\\n`\n }\n\n // LLM API key - set as both LLM_TOKEN and OPENAI_API_KEY for compatibility\n if (userAnswers.llmToken) {\n newEnvValues += `OPENAI_API_KEY=${userAnswers.llmToken}\\n`\n }\n\n // CrewAI name\n if (userAnswers.crewName) {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_AGENT_NAME=${userAnswers.crewName}\\n`\n }\n\n if (userAnswers.langGraphAgent) {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_AGENT_NAME=sample_agent\\n`\n newEnvValues += `LANGGRAPH_DEPLOYMENT_URL=http://localhost:8123\\n`\n } else if (userAnswers.langGraphPlatform === 'Yes' && !isCloudDeployment) {\n newEnvValues += `LANGGRAPH_DEPLOYMENT_URL=${userAnswers.langGraphPlatformUrl}\\n`\n } else if (userAnswers.langGraphRemoteEndpointURL) {\n newEnvValues += `COPILOTKIT_REMOTE_ENDPOINT=${userAnswers.langGraphRemoteEndpointURL}\\n`\n }\n\n // Runtime URL if provided via flags\n if (flags.runtimeUrl) {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_RUNTIME_URL=${flags.runtimeUrl}\\n`\n } else if (!isCloudDeployment && userAnswers.crewType !== 'Crews' && userAnswers.crewType !== 'Flows') {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_RUNTIME_URL=/api/copilotkit\\n`\n }\n\n if (\n userAnswers.langGraphPlatformUrl &&\n (userAnswers.langSmithApiKey || isLocalhost(userAnswers.langGraphPlatformUrl))\n ) {\n const langGraphAgents = await getLangGraphAgents(\n userAnswers.langGraphPlatformUrl,\n userAnswers.langSmithApiKey || '',\n )\n let langGraphAgent = ''\n if (langGraphAgents.length > 1) {\n const {langGraphAgentChoice} = await inquirer.prompt([\n {\n type: 'list',\n name: 'langGraphAgentChoice',\n message: '🦜🔗 Which agent from your graph would you like to use?',\n choices: langGraphAgents.map((agent: any) => ({\n name: agent.graph_id,\n value: agent.graph_id,\n })),\n },\n ])\n langGraphAgent = langGraphAgentChoice\n } else if (langGraphAgents.length === 1) {\n langGraphAgent = langGraphAgents[0].graph_id\n } else {\n throw new Error('No agents found in your LangGraph endpoint')\n }\n\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_AGENT_NAME=${langGraphAgent}\\n`\n }\n\n // Append the variables to the .env file\n if (newEnvValues) {\n fs.appendFileSync(envFile, newEnvValues)\n }\n } catch (error) {\n throw error\n }\n}\n","export type LangGraphAgent = {\n assistant_id: string\n graph_id: string\n config: {\n tags: string[]\n recursion_limit: number\n configurable: Record<string, any>\n }\n created_at: string\n updated_at: string\n metadata: Record<string, any>\n version: number\n name: string\n description: string\n}\n\nexport async function getLangGraphAgents(url: string, langSmithApiKey: string) {\n try {\n const response = await fetch(`${url.trim().replace(/\\/$/, '')}/assistants/search`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Api-Key': langSmithApiKey,\n },\n body: JSON.stringify({\n limit: 10,\n offset: 0,\n }),\n })\n\n return (await response.json()) as LangGraphAgent[]\n } catch (error) {\n throw new Error(`Failed to get LangGraph agents: ${error}`)\n }\n}\n","import {execSync} from 'child_process'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as os from 'os'\nimport {Config} from '../types/index.js'\nimport chalk from 'chalk'\nimport ora, {Ora} from 'ora'\n\n/**\n * Clones a specific subdirectory from a GitHub repository\n *\n * @param githubUrl - The GitHub URL to the repository or subdirectory\n * @param destinationPath - The local path where the content should be copied\n * @param spinner - The spinner to update with progress information\n * @returns A boolean indicating success or failure\n */\nexport async function cloneGitHubSubdirectory(\n githubUrl: string,\n destinationPath: string,\n spinner: Ora,\n): Promise<boolean> {\n try {\n // Parse the GitHub URL to extract repo info\n const {owner, repo, branch, subdirectoryPath} = parseGitHubUrl(githubUrl)\n\n spinner.text = chalk.cyan(`Cloning from ${owner}/${repo}...`)\n\n // Method 1: Use sparse checkout (more efficient than full clone)\n return await sparseCheckout(owner, repo, branch, subdirectoryPath, destinationPath, spinner)\n } catch (error) {\n spinner.text = chalk.red(`Failed to clone from GitHub: ${error}`)\n return false\n }\n}\n\n/**\n * Uses Git sparse-checkout to efficiently download only the needed subdirectory\n */\nasync function sparseCheckout(\n owner: string,\n repo: string,\n branch: string,\n subdirectoryPath: string,\n destinationPath: string,\n spinner: Ora,\n): Promise<boolean> {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'copilotkit-sparse-'))\n\n try {\n spinner.text = chalk.cyan('Creating temporary workspace...')\n\n // Initialize git repo\n execSync('git init', {cwd: tempDir, stdio: 'pipe'})\n\n spinner.text = chalk.cyan('Connecting to repository...')\n\n // Add remote\n execSync(`git remote add origin https://github.com/${owner}/${repo}.git`, {cwd: tempDir, stdio: 'pipe'})\n\n // Enable sparse checkout\n execSync('git config core.sparseCheckout true', {cwd: tempDir, stdio: 'pipe'})\n\n // Specify which subdirectory to checkout\n fs.writeFileSync(path.join(tempDir, '.git/info/sparse-checkout'), subdirectoryPath)\n\n spinner.text = chalk.cyan('Downloading agent files...')\n\n // Pull only the specified branch\n execSync(`git pull origin ${branch} --depth=1`, {cwd: tempDir, stdio: 'pipe'})\n\n // Copy the subdirectory to the destination\n const sourcePath = path.join(tempDir, subdirectoryPath)\n if (!fs.existsSync(sourcePath)) {\n throw new Error(`Subdirectory '${subdirectoryPath}' not found in the repository.`)\n }\n\n // Ensure destination directory exists\n fs.mkdirSync(destinationPath, {recursive: true})\n\n spinner.text = chalk.cyan('Installing agent files...')\n\n // Copy the subdirectory to the destination\n await copyDirectoryAsync(sourcePath, destinationPath)\n\n return true\n } finally {\n // Clean up the temporary directory\n try {\n fs.rmSync(tempDir, {recursive: true, force: true})\n } catch (error) {\n console.warn(`Failed to clean up temporary directory: ${error}`)\n }\n }\n}\n\n/**\n * Recursively copies a directory with async pauses\n */\nasync function copyDirectoryAsync(source: string, destination: string): Promise<void> {\n // Create destination directory if it doesn't exist\n if (!fs.existsSync(destination)) {\n fs.mkdirSync(destination, {recursive: true})\n }\n\n // Read all files/directories from source\n const entries = fs.readdirSync(source, {withFileTypes: true})\n\n for (const entry of entries) {\n const srcPath = path.join(source, entry.name)\n const destPath = path.join(destination, entry.name)\n\n if (entry.isDirectory()) {\n // Recursively copy subdirectories\n await copyDirectoryAsync(srcPath, destPath)\n } else {\n // Copy files\n fs.copyFileSync(srcPath, destPath)\n }\n\n // For large directories, add small pauses\n if (entries.length > 10) {\n await new Promise((resolve) => setTimeout(resolve, 1))\n }\n }\n}\n\n/**\n * Parses a GitHub URL to extract owner, repo, branch and subdirectory path\n */\nfunction parseGitHubUrl(githubUrl: string): {\n owner: string\n repo: string\n branch: string\n subdirectoryPath: string\n} {\n const url = new URL(githubUrl)\n\n if (url.hostname !== 'github.com') {\n throw new Error('Only GitHub URLs are supported')\n }\n\n const pathParts = url.pathname.split('/').filter(Boolean)\n\n if (pathParts.length < 2) {\n throw new Error('Invalid GitHub URL format')\n }\n\n const owner = pathParts[0]\n const repo = pathParts[1]\n let branch = 'main' // Default branch\n let subdirectoryPath = ''\n\n if (pathParts.length > 3 && (pathParts[2] === 'tree' || pathParts[2] === 'blob')) {\n branch = pathParts[3]\n subdirectoryPath = pathParts.slice(4).join('/')\n }\n\n return {owner, repo, branch, subdirectoryPath}\n}\n\n/**\n * Validates if a string is a valid GitHub URL\n */\nexport function isValidGitHubUrl(url: string): boolean {\n try {\n const parsedUrl = new URL(url)\n return parsedUrl.hostname === 'github.com' && parsedUrl.pathname.split('/').filter(Boolean).length >= 2\n } catch {\n return false\n }\n}\n","/*\n Currently unusued but will be used in the future once we have more time to think\n about what to use outside of shadcn/ui.\n*/\n\nimport spawn from 'cross-spawn'\nimport {Config} from '../types/index.js'\nimport chalk from 'chalk'\nimport fs from 'fs'\nimport ora from 'ora'\n\ntype PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun'\n\nexport async function scaffoldPackages(userAnswers: Config) {\n const spinner = ora({\n text: chalk.cyan('Preparing to install packages...'),\n color: 'cyan',\n }).start()\n\n try {\n const packages = [\n `@copilotkit/react-ui@${userAnswers.copilotKitVersion}`,\n `@copilotkit/react-core@${userAnswers.copilotKitVersion}`,\n `@copilotkit/runtime@${userAnswers.copilotKitVersion}`,\n ]\n\n // Small pause before starting\n await new Promise((resolve) => setTimeout(resolve, 50))\n\n const packageManager = detectPackageManager()\n const installCommand = detectInstallCommand(packageManager)\n\n spinner.text = chalk.cyan(`Using ${packageManager} to install packages...`)\n\n // Pause the spinner for the package installation\n spinner.stop()\n\n console.log(chalk.cyan('\\n⚙️ Installing packages...\\n'))\n\n const result = spawn.sync(packageManager, [installCommand, ...packages], {\n stdio: 'inherit', // This ensures stdin/stdout/stderr are all passed through\n })\n\n if (result.status !== 0) {\n throw new Error(`Package installation process exited with code ${result.status}`)\n }\n\n // Resume the spinner for success message\n spinner.start()\n spinner.succeed(chalk.green('CopilotKit packages installed successfully'))\n } catch (error) {\n // Use spinner for consistent error reporting\n if (!spinner.isSpinning) {\n spinner.start()\n }\n spinner.fail(chalk.red('Failed to install CopilotKit packages'))\n throw error\n }\n}\n\nfunction detectPackageManager(): PackageManager {\n // Check for lock files in the current directory\n const files = fs.readdirSync(process.cwd())\n\n if (files.includes('bun.lockb')) return 'bun'\n if (files.includes('pnpm-lock.yaml')) return 'pnpm'\n if (files.includes('yarn.lock')) return 'yarn'\n if (files.includes('package-lock.json')) return 'npm'\n\n // Default to npm if no lock file found\n return 'npm'\n}\n\nfunction detectInstallCommand(packageManager: PackageManager): string {\n switch (packageManager) {\n case 'yarn':\n case 'pnpm':\n return 'add'\n default:\n return 'install'\n }\n}\n","import ora from 'ora'\nimport chalk from 'chalk'\nimport {cloneGitHubSubdirectory} from './github.js'\nimport {Config} from '../types/index.js'\nimport path from 'path'\nimport fs from 'fs'\n\nexport async function scaffoldAgent(userAnswers: Config) {\n if (\n userAnswers.mode === 'CrewAI' ||\n (userAnswers.mode === 'LangGraph' && !userAnswers.langGraphAgent) ||\n userAnswers.mode === 'Standard' ||\n userAnswers.mode === 'MCP'\n ) {\n return\n }\n\n const spinner = ora({\n text: chalk.cyan('Setting up AI agent...'),\n color: 'cyan',\n }).start()\n\n let template = ''\n switch (userAnswers.mode) {\n case 'LangGraph':\n if (userAnswers.langGraphAgent === 'Python Starter') {\n template = AgentTemplates.LangGraph.Starter.Python\n } else {\n template = AgentTemplates.LangGraph.Starter.TypeScript\n }\n break\n }\n\n if (!template) {\n spinner.fail(chalk.red('Failed to determine agent template'))\n throw new Error('Failed to determine agent template')\n }\n\n const agentDir = path.join(process.cwd(), 'agent')\n\n try {\n await cloneGitHubSubdirectory(template, agentDir, spinner)\n\n // Create .env file in the agent directory\n spinner.text = chalk.cyan('Creating agent environment variables...')\n\n let envContent = ''\n\n // Add OpenAI API key if provided\n if (userAnswers.llmToken) {\n envContent += `OPENAI_API_KEY=${userAnswers.llmToken}\\n`\n }\n\n // Add LangSmith API key for LangGraph\n if (userAnswers.mode === 'LangGraph' && userAnswers.langSmithApiKey) {\n envContent += `LANGSMITH_API_KEY=${userAnswers.langSmithApiKey}\\n`\n }\n\n if (envContent) {\n const agentEnvFile = path.join(agentDir, '.env')\n fs.writeFileSync(agentEnvFile, envContent, 'utf8')\n spinner.text = chalk.cyan('Added API keys to agent .env file')\n }\n\n // Add LangSmith API key for LangGraph\n if (userAnswers.mode === 'LangGraph' && userAnswers.langSmithApiKey) {\n envContent += `LANGSMITH_API_KEY=${userAnswers.langSmithApiKey}\\n`\n }\n\n if (envContent) {\n const agentEnvFile = path.join(agentDir, '.env')\n fs.writeFileSync(agentEnvFile, envContent, 'utf8')\n spinner.text = chalk.cyan('Added API keys to agent .env file')\n }\n\n if (envContent) {\n const agentEnvFile = path.join(agentDir, '.env')\n fs.writeFileSync(agentEnvFile, envContent, 'utf8')\n spinner.text = chalk.cyan('Added API keys to agent .env file')\n }\n } catch (error) {\n spinner.fail(chalk.red('Failed to clone agent template'))\n throw error\n }\n\n spinner.succeed(`${userAnswers.mode} agent cloned successfully`)\n}\n\nexport const AgentTemplates = {\n LangGraph: {\n Starter: {\n Python: 'https://github.com/CopilotKit/coagents-starter-langgraph/tree/main/agent-py',\n TypeScript: 'https://github.com/CopilotKit/coagents-starter-langgraph/tree/main/agent-js',\n },\n },\n CrewAI: {\n Flows: {\n Starter: 'https://github.com/CopilotKit/coagents-starter-crewai-flows/tree/main/agent-py',\n },\n },\n}\n","import * as fs from 'fs/promises'\nimport ora from 'ora'\nimport * as path from 'path'\n\nexport async function addCrewInputs(url: string, token: string) {\n try {\n const spinner = ora('Analyzing crew inputs...').start()\n // Get inputs from the crew API\n const inputs = await getCrewInputs(url, token)\n spinner.text = 'Adding inputs to app/copilotkit/page.tsx...'\n\n // Path to the file we need to modify\n let filePath = path.join(process.cwd(), 'app', 'copilotkit', 'page.tsx')\n\n // check if non-src file exists\n try {\n await fs.access(filePath)\n } catch {\n filePath = path.join(process.cwd(), 'src', 'app', 'copilotkit', 'page.tsx')\n }\n\n // check if src file exists\n try {\n await fs.access(filePath)\n } catch {\n throw new Error('app/copilotkit/page.tsx and src/app/copilotkit/page.tsx not found')\n }\n\n // Read the file content\n let fileContent = await fs.readFile(filePath, 'utf8')\n\n // Replace all instances of \"YOUR_INPUTS_HERE\" with the inputs array as a string\n const inputsString = JSON.stringify(inputs)\n fileContent = fileContent.replace(/\\[[\"']YOUR_INPUTS_HERE[\"']\\]/g, inputsString)\n\n // Write the updated content back to the file\n await fs.writeFile(filePath, fileContent, 'utf8')\n\n spinner.succeed('Successfully added crew inputs to app/copilotkit/page.tsx')\n } catch (error) {\n console.error('Error updating crew inputs:', error)\n throw error\n }\n}\n\nasync function getCrewInputs(url: string, token: string): Promise<string[]> {\n const response = await fetch(`${url.trim()}/inputs`, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch inputs: ${response.statusText}`)\n }\n\n const data = (await response.json()) as {inputs: string[]}\n return data.inputs\n}\n"],"mappings":"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","names":["Flags","inquirer","path","fs","Conf","crypto","anonymousId","Conf","trpcClient","crypto","chalk","inquirer","chalk","ora","chalk","trpcClient","ora","inquirer","Flags","Flags","path","fs","chalk","path","fs","inquirer","path","fs","inquirer","fs","path","chalk","spawn","chalk","ora","ora","chalk","path","fs","ora","chalk","fs","ora","path","chalk","ora","Flags","needsCloudDeployment","inquirer","answers","trpcClient","path","fs","projectPath"]}
|
|
1
|
+
{"version":3,"sources":["../../src/commands/init.ts","../../src/commands/base-command.ts","../../src/utils/version.ts","../../src/utils/trpc.ts","../../src/commands/create.ts","../../src/lib/init/types/questions.ts","../../src/lib/init/utils.ts"],"sourcesContent":["import {Config, Flags} from '@oclif/core'\n\nimport {BaseCommand} from './base-command.js'\nimport Create from './create.js'\nimport {ConfigFlags} from '../lib/init/types/questions.js'\n\nexport default class CloudInit extends BaseCommand {\n static override description = 'Set up CopilotKit in your Next.js project, or create a new project if none exists'\n\n static override examples = ['<%= config.bin %> init', '<%= config.bin %> init --dir ./my-app']\n\n static override flags = {\n ...BaseCommand.flags,\n ...ConfigFlags,\n runtimeUrl: Flags.string({description: 'runtime URL'}),\n project: Flags.string({description: 'project ID (can be found in the Copilot Cloud dashboard)'}),\n dir: Flags.string({description: 'directory of the Next.js project', default: '.'}),\n }\n\n constructor(argv: string[], config: Config) {\n super(argv, config)\n }\n\n public async run(): Promise<void> {\n const {flags} = await this.parse(CloudInit)\n this.log('`copilotkit init` now routes to `copilotkit create`.')\n\n const createCommand = new Create([], this.config)\n await createCommand.run()\n }\n}\n","import {Command} from '@oclif/core'\nimport Sentry, {consoleIntegration} from '@sentry/node'\nimport {LIB_VERSION} from '../utils/version.js'\nimport {COPILOT_CLOUD_BASE_URL} from '../utils/trpc.js'\nimport chalk from 'chalk'\n\nexport class BaseCommand extends Command {\n async init() {\n await this.checkCLIVersion()\n\n if (process.env.SENTRY_DISABLED === 'true') {\n return\n }\n\n Sentry.init({\n dsn:\n process.env.SENTRY_DSN ||\n 'https://1eea15d32e2eacb0456a77db5e39aeeb@o4507288195170304.ingest.us.sentry.io/4508581448581120',\n integrations: [consoleIntegration()],\n // Tracing\n tracesSampleRate: 1.0, // Capture 100% of the transactions\n })\n }\n\n async catch(err: any) {\n if (process.env.SENTRY_DISABLED !== 'true') {\n Sentry.captureException(err)\n }\n\n const message = err?.message ?? 'Unknown error'\n\n this.log('\\n' + chalk.red(message) + '\\n')\n\n const exitCode = err?.oclif?.exit ?? 1\n this.exit(exitCode)\n }\n\n async finally() {\n if (process.env.SENTRY_DISABLED === 'true') {\n return\n }\n\n Sentry.close()\n }\n\n async run() {}\n\n async checkCLIVersion() {\n const response = await fetch(`${COPILOT_CLOUD_BASE_URL}/api/healthz`)\n\n const data = await response.json()\n const cloudVersion = data.cliVersion\n\n if (!cloudVersion || cloudVersion === LIB_VERSION) {\n return\n }\n\n // TODO: add this back in, removed for crew ai launch since we don't want to keep releasing cloud\n // this.log(chalk.yellow('================ New version available! =================\\n'))\n // this.log(`You are using CopilotKit CLI v${LIB_VERSION}.`)\n // this.log(`A new CopilotKit CLI version is available (v${cloudVersion}).\\n`)\n // this.log('Please update your CLI to the latest version:\\n\\n')\n // this.log(`${chalk.cyan(chalk.underline(chalk.bold('npm:')))}\\t npm install -g copilotkit@${cloudVersion}\\n`)\n // this.log(`${chalk.cyan(chalk.underline(chalk.bold('pnpm:')))}\\t pnpm install -g copilotkit@${cloudVersion}\\n`)\n // this.log(`${chalk.cyan(chalk.underline(chalk.bold('yarn:')))}\\t yarn global add copilotkit@${cloudVersion}\\n`)\n // this.log(chalk.yellow('============================================================\\n\\n'))\n }\n\n async gracefulError(message: string) {\n this.log('\\n' + chalk.red(message))\n process.exit(1)\n }\n}\n","// This is auto generated!\nexport const LIB_VERSION = \"0.0.52\";\n","import {createTRPCClient as trpcClient, httpBatchLink} from '@trpc/client'\nimport superjson from 'superjson'\n\nexport const COPILOT_CLOUD_BASE_URL = process.env.COPILOT_CLOUD_BASE_URL || 'https://cloud.copilotkit.ai'\n\nexport function createTRPCClient(cliToken: string): any {\n return trpcClient({\n links: [\n httpBatchLink({\n url: `${COPILOT_CLOUD_BASE_URL}/api/trpc-cli`,\n transformer: superjson,\n headers: () => {\n return {\n 'x-trpc-source': 'cli',\n 'x-cli-token': cliToken,\n }\n },\n }),\n ],\n })\n}\n","import {Config, Flags, Args} from '@oclif/core'\nimport inquirer from 'inquirer'\nimport chalk from 'chalk'\nimport fs from 'fs-extra'\nimport path from 'path'\nimport {promisify} from 'util'\nimport {pipeline} from 'stream'\nimport {createWriteStream} from 'fs'\nimport {extract} from 'tar'\nimport ora from 'ora'\n\nimport {BaseCommand} from './base-command.js'\n\nconst streamPipeline = promisify(pipeline)\n\nconst theme = {\n primary: chalk.magenta,\n secondary: chalk.gray,\n tertiary: chalk.gray,\n error: chalk.red,\n command: chalk.blue,\n success: chalk.green,\n warning: chalk.yellow,\n divider: chalk.gray('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'),\n bottomPadding: '',\n}\n\ninterface CreateOptions {\n projectName: string\n agentFramework: AgentFramework\n}\n\ntype AgentFramework =\n | 'langgraph-py'\n | 'langgraph-js'\n | 'flows'\n | 'mastra'\n | 'pydantic-ai'\n | 'llamaindex'\n | 'agno'\n | 'ag2'\n | 'adk'\n\nconst TEMPLATE_REPOS: Record<AgentFramework, string> = {\n 'langgraph-py': 'copilotkit/with-langgraph-python',\n 'langgraph-js': 'copilotkit/with-langgraph-js',\n mastra: 'copilotkit/with-mastra',\n flows: 'copilotkit/with-crewai-flows',\n llamaindex: 'copilotkit/with-llamaindex',\n agno: 'copilotkit/with-agno',\n 'pydantic-ai': 'copilotkit/with-pydantic-ai',\n ag2: 'ag2ai/ag2-copilotkit-starter',\n adk: 'copilotkit/with-adk',\n}\n\nconst FRAMEWORK_DOCUMENTATION: Record<AgentFramework, string> = {\n 'langgraph-py': 'https://langchain-ai.github.io/langgraph/concepts/why-langgraph',\n 'langgraph-js': 'https://langchain-ai.github.io/langgraphjs',\n flows: 'https://docs.crewai.com/guides/flows/first-flow',\n mastra: 'https://mastra.ai/en/docs',\n 'pydantic-ai': 'https://ai.pydantic.dev/ag-ui/',\n llamaindex: 'https://docs.llamaindex.ai/en/stable',\n agno: 'https://docs.agno.com/',\n ag2: 'https://docs.ag2.ai/latest/docs/user-guide/basic-concepts/overview',\n adk: 'https://google.github.io/adk-docs/',\n}\n\nconst FRAMEWORK_EMOJI: Record<AgentFramework, string> = {\n 'langgraph-js': '🦜',\n 'langgraph-py': '🦜',\n flows: '👥',\n mastra: '🌑',\n 'pydantic-ai': '🔼',\n llamaindex: '🦙',\n ag2: '🤖',\n agno: '🅰️',\n adk: '🤖',\n}\n\nconst KITE = `\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠙⣿⡛⠻⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠋⠀⠀⠈⢿⡄⠀⠀⠀⠈⠉⠙⣻⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠁⠀⠀⠀⠀⠈⢿⡄⠀⢀⣠⣴⠾⠋⢸⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠁⢀⣀⣀⣀⣀⣤⣤⡾⢿⡟⠛⠉⠀⠀⠀⠀⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡛⠛⠛⠛⠉⠉⠉⠁⠀⢠⡿⣿⡀⠀⠀⠀⠀⠀⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⣰⡟⠀⠸⣧⠀⠀⠀⠀⢠⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠀⠀⢀⣼⠏⠀⠀⠀⣿⡀⠀⠀⠀⢸⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠂⣠⡿⠁⠀⠀⠀⠀⢸⡇⠀⠀⠀⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⣡⣾⣿⣄⠀⠀⠀⠀⠀⢸⡇⠀⠀⢰⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⡟⠛⡿⠋⣡⣾⣿⣿⣿⣿⣦⡀⠀⠀⠀⢸⡇⠀⠀⣿⣿⣿⣿\n⣿⣿⣿⣿⡿⠿⣿⠷⠂⡀⠘⣿⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⢸⡇⠀⣼⣿⣿⣿⣿\n⣿⣿⠻⢿⡷⠀⠁⠴⣿⣷⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⣾⠇⣴⣿⣿⣿⣿⣿\n⡿⠛⠀⠀⢴⣾⣷⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣤⣿⣾⣿⣿⣿⣿⣿⣿\n⣷⣾⣿⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n`\n\nexport default class Create extends BaseCommand {\n static description = 'Create a new CopilotKit project'\n\n static examples = [\n '$ copilotkit create my-app',\n '$ copilotkit create my-app --framework langgraph-js',\n '$ copilotkit create -n my-app -f langgraph-js',\n ]\n\n static flags = {\n ...BaseCommand.flags,\n framework: Flags.string({\n char: 'f',\n description: 'Agent framework to use',\n options: Object.keys(TEMPLATE_REPOS),\n required: false,\n }),\n name: Flags.string({\n char: 'n',\n description: 'Name of the project',\n required: false,\n }),\n 'no-banner': Flags.boolean({\n char: 'q',\n description: 'Removes the banner',\n default: false,\n required: false,\n }),\n project: Flags.string({\n description: 'project ID (deprecated, kept for backwards compatibility)',\n }),\n }\n\n static args = {\n projectName: Args.string({\n description: 'Name of the project',\n required: false,\n }),\n }\n\n constructor(argv: string[], config: Config) {\n super(argv, config)\n }\n\n async run() {\n const {args, flags} = await this.parse(Create)\n\n if (!flags['no-banner']) {\n this.log(theme.primary(KITE))\n this.log(theme.primary('~ Welcome to CopilotKit! ~\\n'))\n this.log(theme.divider)\n\n if ((!flags.name || flags.projectName) && !flags.framework) {\n this.log('\\n' + theme.secondary('Just a few questions to get started!\\n'))\n }\n }\n\n const projectNameInput = flags.name || args.projectName || (await this.promptProjectName())\n const projectName = projectNameInput.trim()\n const usingCurrentDir = projectName === '.' || projectName === './'\n const agentFramework = flags.framework || (await this.promptAgentFramework())\n\n const projectDir = usingCurrentDir ? process.cwd() : path.resolve(process.cwd(), projectName)\n\n if (usingCurrentDir) {\n const allowedEntries = new Set(['.git', '.gitignore', '.DS_Store'])\n const existingEntries = await fs.readdir(projectDir)\n const blockingEntries = existingEntries.filter((entry) => !allowedEntries.has(entry))\n\n if (blockingEntries.length > 0) {\n this.log(theme.error('\\nCurrent directory is not empty.'))\n this.log(theme.secondary('\\nPlease run create in an empty directory or specify a new project name.'))\n this.exit(1)\n }\n } else if (await fs.pathExists(projectDir)) {\n this.log(theme.error(`\\nDirectory \"${projectName}\" already exists.`))\n this.log(theme.secondary('\\nYou can:'))\n this.log(theme.secondary(' 1. Choose a different project name'))\n this.log(theme.secondary(' 2. Remove the existing directory manually if you want to use this name\\n'))\n this.exit(1)\n }\n\n const options: CreateOptions = {\n projectName,\n agentFramework: agentFramework as AgentFramework,\n }\n\n const spinner = ora({\n text: theme.secondary.bold('Creating your project...'),\n color: 'cyan',\n spinner: 'dots',\n }).start()\n\n try {\n await fs.ensureDir(projectDir)\n\n spinner.text = theme.secondary.bold('Downloading template...')\n await this.downloadTemplate(projectDir, options.agentFramework)\n\n const displayName = usingCurrentDir ? 'current directory' : `\"${projectName}\"`\n spinner.succeed(theme.secondary.bold(`Project ${displayName} created successfully!`))\n } catch (error: any) {\n spinner.fail(theme.error(`Failed to create project: ${error.message}`))\n this.exit(1)\n }\n\n this.log('\\n' + theme.divider)\n this.log(\n '\\n' +\n theme.secondary.bold(\n `🪁🤝${FRAMEWORK_EMOJI[options.agentFramework]} All set! \\n\\nYour project is ready to explore CopilotKit locally.`,\n ),\n )\n this.log('\\n' + theme.secondary('Next steps:'))\n if (usingCurrentDir) {\n this.log(theme.secondary(' • You are already inside your new project directory'))\n } else {\n this.log(theme.secondary(` • ${theme.command(`cd ${projectName}`)}`))\n }\n this.log(theme.secondary(' • Follow the setup instructions in the README.md'))\n this.log('\\n' + theme.secondary('Documentation:'))\n this.log(theme.secondary(' • ') + theme.command('https://docs.copilotkit.ai'))\n this.log(theme.secondary(' • ') + theme.command(FRAMEWORK_DOCUMENTATION[options.agentFramework]))\n this.log(theme.bottomPadding)\n }\n\n private async promptProjectName(): Promise<string> {\n const {projectName} = await inquirer.prompt([\n {\n type: 'input',\n name: 'projectName',\n message: theme.secondary('What is your project named?'),\n validate: (input: string) => {\n if (!input) return theme.error('Project name is required')\n if (!/^[a-z0-9-]+$/.test(input)) {\n return theme.error('Project name can only contain lowercase letters, numbers, and hyphens')\n }\n if (input.length > 30) {\n return theme.error('Project name must be less than 30 characters')\n }\n return true\n },\n },\n ])\n return projectName\n }\n\n private async promptAgentFramework(): Promise<string> {\n const {framework} = await inquirer.prompt([\n {\n type: 'list',\n name: 'framework',\n message: theme.secondary('Which agent framework would you like to use?'),\n choices: [\n {name: `${FRAMEWORK_EMOJI['langgraph-py']} LangGraph (Python)`, value: 'langgraph-py'},\n {name: `${FRAMEWORK_EMOJI['langgraph-js']} LangGraph (JavaScript)`, value: 'langgraph-js'},\n {name: `${FRAMEWORK_EMOJI.mastra} Mastra`, value: 'mastra'},\n {name: `${FRAMEWORK_EMOJI['pydantic-ai']} Pydantic AI`, value: 'pydantic-ai'},\n {name: `${FRAMEWORK_EMOJI.adk} ADK`, value: 'adk'},\n {name: `${FRAMEWORK_EMOJI.flows} CrewAI Flows`, value: 'flows'},\n {name: `${FRAMEWORK_EMOJI.llamaindex} LlamaIndex`, value: 'llamaindex'},\n {name: `${FRAMEWORK_EMOJI.agno} Agno`, value: 'agno'},\n {name: `${FRAMEWORK_EMOJI.ag2} AG2`, value: 'ag2'},\n ],\n },\n ])\n return framework\n }\n\n private async downloadTemplate(projectDir: string, framework: AgentFramework): Promise<void> {\n const repo = TEMPLATE_REPOS[framework]\n const url = `https://github.com/${repo}/archive/refs/heads/main.tar.gz`\n\n try {\n const response = await fetch(url)\n if (!response.ok) throw new Error(`Failed to download template: ${response.statusText}`)\n\n const tempFile = path.join(projectDir, 'template.tar.gz')\n const fileStream = createWriteStream(tempFile)\n\n if (!response.body) throw new Error('Failed to get response body')\n await streamPipeline(response.body as any, fileStream)\n\n await extract({\n file: tempFile,\n cwd: projectDir,\n strip: 1,\n })\n\n await fs.remove(tempFile)\n } catch (error: any) {\n throw new Error(`Failed to download template: ${error.message}`)\n }\n }\n}\n","import {z} from 'zod'\nimport {Flags} from '@oclif/core'\nimport {isLocalhost} from '../utils.js'\n\n// ===== Core Constants =====\nexport const MODES = ['LangGraph', 'CrewAI', 'Mastra', 'LlamaIndex', 'Agno', 'AG2', 'MCP', 'Standard'] as const\nexport const CREW_TYPES = ['Crews', 'Flows'] as const\nexport const CHAT_COMPONENTS = ['CopilotChat', 'CopilotSidebar', 'Headless', 'CopilotPopup'] as const\nexport const LANGGRAPH_AGENTS = ['Python Starter', 'TypeScript Starter'] as const\nexport const CREW_FLOW_TEMPLATES = ['Starter'] as const\nexport const YES_NO = ['Yes', 'No'] as const\n// NEW: Deployment choice options for Branch B\nexport const DEPLOYMENT_CHOICES = ['Copilot Cloud', 'Self-hosted'] as const\n\n// ===== Sanitizers =====\nexport const sanitizers = {\n // Remove trailing slash from URLs\n url: (value: string): string => {\n if (!value) return value\n return value.trim().replace(/\\/+$/, '')\n },\n\n // Trim whitespace from strings\n trim: (value: string): string => {\n if (!value) return value\n return value.trim()\n },\n\n // Lowercase strings\n lowercase: (value: string): string => {\n if (!value) return value\n return value.toLowerCase().trim()\n },\n\n // Clean API keys (remove whitespace)\n apiKey: (value: string): string => {\n if (!value) return value\n return value.trim().replace(/\\s/g, '')\n },\n}\n\n// ===== Zod Schemas =====\n\n// Basic schemas\nexport const ModeSchema = z.enum(MODES)\nexport const CrewTypeSchema = z.enum(CREW_TYPES)\nexport const ChatComponentSchema = z.enum(CHAT_COMPONENTS)\nexport const LangGraphAgentSchema = z.enum(LANGGRAPH_AGENTS)\nexport const CrewFlowTemplateSchema = z.enum(CREW_FLOW_TEMPLATES)\nexport const YesNoSchema = z.enum(YES_NO)\n// NEW: Deployment choice schema for Branch B\nexport const DeploymentChoiceSchema = z.enum(DEPLOYMENT_CHOICES)\n\n// URL validation schema with preprocessing to remove trailing slash\nexport const UrlSchema = z.preprocess(\n (val) => sanitizers.url(String(val)),\n z.string().url('Please enter a valid URL').min(1, 'URL is required'),\n)\n\n// Token validation schema with preprocessing to trim\nexport const TokenSchema = z.preprocess((val) => sanitizers.trim(String(val)), z.string().min(1, 'Token is required'))\n\n// API key validation schema with preprocessing to remove whitespace\nexport const ApiKeySchema = z.preprocess(\n (val) => sanitizers.apiKey(String(val)),\n z.string().min(1, 'API key is required'),\n)\n\nexport const LLMApiKeySchema = z.preprocess((val) => sanitizers.apiKey(String(val)), z.string().optional())\n\n// Name validation schema with preprocessing to trim\nexport const NameSchema = z.preprocess((val) => sanitizers.trim(String(val)), z.string().min(1, 'Name is required'))\n\n// Config schema\nexport const ConfigSchema = z\n .object({\n // Core fields\n copilotKitVersion: z.string().optional(),\n mode: ModeSchema,\n chatUi: ChatComponentSchema.optional(),\n\n // Yes/No fields\n alreadyDeployed: YesNoSchema.optional(),\n fastApiEnabled: YesNoSchema.optional(),\n // DEPRECATED: useCopilotCloud - consolidated with signupForCopilotCloud\n useCopilotCloud: YesNoSchema.optional(),\n\n // LangGraph specific fields\n langGraphAgent: LangGraphAgentSchema.optional(),\n langGraphPlatform: YesNoSchema.optional(),\n langGraphPlatformUrl: UrlSchema.optional(),\n langGraphRemoteEndpointURL: UrlSchema.optional(),\n\n // CrewAI specific fields\n crewType: CrewTypeSchema.optional(),\n crewName: NameSchema.optional(),\n crewUrl: UrlSchema.optional(),\n crewBearerToken: TokenSchema.optional(),\n\n // API keys and tokens\n copilotCloudPublicApiKey: z.string().optional(),\n langSmithApiKey: ApiKeySchema.optional(),\n llmToken: LLMApiKeySchema.optional(),\n\n // IDE Documentation setup fields\n setupIDEDocs: YesNoSchema.optional(),\n selectedIDE: z.union([z.enum(['cursor', 'windsurf']), z.literal('skip')]).optional(),\n\n // NEW: A/B/C test fields\n deploymentChoice: DeploymentChoiceSchema.optional(), // For branch B only (Cloud vs Self-hosted)\n })\n .refine(\n (data) => {\n // If CrewAI is selected, require crew URL and bearer token\n if (data.mode === 'CrewAI') {\n return !!data.crewUrl && !!data.crewBearerToken\n }\n return true\n },\n {\n message: 'Crew URL and bearer token are required for CrewAI',\n path: ['crewUrl', 'crewBearerToken'],\n },\n )\n .refine(\n (data) => {\n // If LangGraph is selected with LangGraph Platform, require platform URL and LangSmith API key\n if (data.mode === 'LangGraph' && data.alreadyDeployed === 'Yes' && data.langGraphPlatform === 'Yes') {\n return (!!data.langGraphPlatformUrl && !!data.langSmithApiKey) || isLocalhost(data.langGraphPlatformUrl || '')\n }\n return true\n },\n {\n message: 'LangGraph Platform URL and LangSmith API key are required',\n path: ['langGraphPlatformUrl', 'langSmithApiKey'],\n },\n )\n\n// Export the inferred type from the schema\nexport type Config = z.infer<typeof ConfigSchema>\n\n// Question type definition with improved validation and sanitization\nexport type Question = {\n type: 'input' | 'yes/no' | 'select'\n name: keyof Config\n message: string\n choices?: readonly string[] | (() => Promise<{name: string; value: string}[]>)\n default?: string\n when?: (answers: Partial<Config>) => boolean | Promise<boolean>\n sensitive?: boolean\n validate?: (input: string) => true | string // Return true if valid, error message string if invalid\n sanitize?: (input: string) => string // Function to sanitize input before validation\n}\n\n// CLI flags definition with descriptions\nexport const ConfigFlags = {\n booth: Flags.boolean({description: 'Use CopilotKit in booth mode', default: false, char: 'b'}),\n mode: Flags.string({description: 'How you will be interacting with AI', options: MODES, char: 'm'}),\n 'copilotkit-version': Flags.string({description: 'CopilotKit version to use (e.g. 1.7.0)'}),\n 'use-copilot-cloud': Flags.string({description: 'Use Copilot Cloud for production-ready hosting', options: YES_NO}),\n 'langgraph-agent': Flags.string({description: 'LangGraph agent template to use', options: LANGGRAPH_AGENTS}),\n 'crew-type': Flags.string({description: 'CrewAI implementation type', options: CREW_TYPES}),\n 'crew-name': Flags.string({description: 'Name for your CrewAI agent'}),\n 'crew-url': Flags.string({description: 'URL endpoint for your CrewAI agent'}),\n 'crew-bearer-token': Flags.string({description: 'Bearer token for CrewAI authentication'}),\n 'langsmith-api-key': Flags.string({description: 'LangSmith API key for LangGraph observability'}),\n 'llm-token': Flags.string({description: 'API key for your preferred LLM provider'}),\n 'setup-ide-docs': Flags.string({description: 'Setup IDE documentation rules for AI assistance', options: YES_NO}),\n 'selected-ide': Flags.string({\n description: 'IDE to configure with documentation rules',\n options: ['cursor', 'windsurf', 'skip'],\n }),\n // NEW: A/B/C test flags\n 'deployment-choice': Flags.string({\n description: 'Choose between Copilot Cloud or Self-hosted deployment',\n options: DEPLOYMENT_CHOICES,\n }),\n}\n","export const isLocalhost = (url: string): boolean => {\n return url.includes('localhost') || url.includes('127.0.0.1') || url.includes('0.0.0.0')\n}\n"],"mappings":"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","names":["Flags","chalk","chalk","Flags","Flags","Flags"]}
|
package/dist/commands/login.js
CHANGED
|
@@ -278,7 +278,7 @@ import { Command } from "@oclif/core";
|
|
|
278
278
|
import Sentry, { consoleIntegration } from "@sentry/node";
|
|
279
279
|
|
|
280
280
|
// src/utils/version.ts
|
|
281
|
-
var LIB_VERSION = "0.0.
|
|
281
|
+
var LIB_VERSION = "0.0.52";
|
|
282
282
|
|
|
283
283
|
// src/commands/base-command.ts
|
|
284
284
|
import chalk2 from "chalk";
|
|
@@ -297,12 +297,13 @@ var BaseCommand = class extends Command {
|
|
|
297
297
|
});
|
|
298
298
|
}
|
|
299
299
|
async catch(err) {
|
|
300
|
-
if (process.env.SENTRY_DISABLED
|
|
301
|
-
|
|
302
|
-
return;
|
|
300
|
+
if (process.env.SENTRY_DISABLED !== "true") {
|
|
301
|
+
Sentry.captureException(err);
|
|
303
302
|
}
|
|
304
|
-
|
|
305
|
-
|
|
303
|
+
const message = err?.message ?? "Unknown error";
|
|
304
|
+
this.log("\n" + chalk2.red(message) + "\n");
|
|
305
|
+
const exitCode = err?.oclif?.exit ?? 1;
|
|
306
|
+
this.exit(exitCode);
|
|
306
307
|
}
|
|
307
308
|
async finally() {
|
|
308
309
|
if (process.env.SENTRY_DISABLED === "true") {
|