copilotkit 0.0.31 → 0.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +8 -7
  2. package/dist/commands/base-command.js +2 -4
  3. package/dist/commands/base-command.js.map +1 -1
  4. package/dist/commands/dev.js +2 -4
  5. package/dist/commands/dev.js.map +1 -1
  6. package/dist/commands/init.d.ts +13 -14
  7. package/dist/commands/init.js +155 -135
  8. package/dist/commands/init.js.map +1 -1
  9. package/dist/commands/login.js +2 -4
  10. package/dist/commands/login.js.map +1 -1
  11. package/dist/commands/logout.js +2 -4
  12. package/dist/commands/logout.js.map +1 -1
  13. package/dist/lib/init/index.d.ts +1 -1
  14. package/dist/lib/init/index.js +92 -112
  15. package/dist/lib/init/index.js.map +1 -1
  16. package/dist/lib/init/questions.js +56 -83
  17. package/dist/lib/init/questions.js.map +1 -1
  18. package/dist/lib/init/scaffold/agent.js +19 -9
  19. package/dist/lib/init/scaffold/agent.js.map +1 -1
  20. package/dist/lib/init/scaffold/crew-inputs.js.map +1 -1
  21. package/dist/lib/init/scaffold/env.js +11 -14
  22. package/dist/lib/init/scaffold/env.js.map +1 -1
  23. package/dist/lib/init/scaffold/github.js.map +1 -1
  24. package/dist/lib/init/scaffold/index.js +72 -71
  25. package/dist/lib/init/scaffold/index.js.map +1 -1
  26. package/dist/lib/init/scaffold/langgraph-assistants.js +11 -14
  27. package/dist/lib/init/scaffold/langgraph-assistants.js.map +1 -1
  28. package/dist/lib/init/scaffold/packages.js.map +1 -1
  29. package/dist/lib/init/scaffold/shadcn.d.ts +1 -1
  30. package/dist/lib/init/scaffold/shadcn.js +42 -48
  31. package/dist/lib/init/scaffold/shadcn.js.map +1 -1
  32. package/dist/lib/init/types/index.d.ts +1 -1
  33. package/dist/lib/init/types/index.js +40 -46
  34. package/dist/lib/init/types/index.js.map +1 -1
  35. package/dist/lib/init/types/questions.d.ts +22 -24
  36. package/dist/lib/init/types/questions.js +30 -31
  37. package/dist/lib/init/types/questions.js.map +1 -1
  38. package/dist/lib/init/types/templates.d.ts +2 -2
  39. package/dist/lib/init/types/templates.js +10 -15
  40. package/dist/lib/init/types/templates.js.map +1 -1
  41. package/dist/lib/init/utils.d.ts +3 -0
  42. package/dist/lib/init/utils.js +8 -0
  43. package/dist/lib/init/utils.js.map +1 -0
  44. package/dist/services/analytics.service.js.map +1 -1
  45. package/dist/services/auth.service.js.map +1 -1
  46. package/dist/services/tunnel.service.js.map +1 -1
  47. package/dist/utils/detect-endpoint-type.utils.d.ts +1 -1
  48. package/dist/utils/version.d.ts +1 -1
  49. package/dist/utils/version.js +1 -1
  50. package/dist/utils/version.js.map +1 -1
  51. package/oclif.manifest.json +33 -56
  52. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/logout.ts","../../src/services/auth.service.ts","../../src/utils/trpc.ts","../../src/services/analytics.service.ts","../../src/commands/base-command.ts","../../src/utils/version.ts"],"sourcesContent":["import {Config} from '@oclif/core'\nimport chalk from 'chalk'\nimport ora from 'ora'\n\nimport {AuthService} from '../services/auth.service.js'\nimport { BaseCommand } from './base-command.js'\n\nexport default class CloudLogout extends BaseCommand {\n static override description = 'Logout from Copilot Cloud'\n\n static override examples = ['<%= config.bin %> logout']\n\n constructor(argv: string[], config: Config, private authService = new AuthService()) {\n super(argv, config)\n }\n\n public async run(): Promise<void> {\n await this.parse(CloudLogout)\n this.log(\"Logging out...\\n\");\n await this.authService.logout(this);\n this.log(chalk.green('Successfully logged out!'))\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): Promise<LoginResponse> {\n let cliToken = this.getCLIToken()\n // Check authentication\n if (!cliToken) {\n try {\n const {shouldLogin} = 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 if (shouldLogin) {\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 cmd.log(chalk.red('Could not authenticate with Copilot Cloud. Please try again.'))\n process.exit(1)\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 {AnalyticsEvents} from './events.js'\nimport Conf from 'conf'\n\nexport class AnalyticsService {\n private segment: Analytics | 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(private readonly authData?: {\n userId: string,\n email: string,\n organizationId: string,\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\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 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 segment_group: this.organizationId,\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","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: process.env.SENTRY_DSN || \"https://1eea15d32e2eacb0456a77db5e39aeeb@o4507288195170304.ingest.us.sentry.io/4508581448581120\",\n integrations: [\n consoleIntegration(),\n ],\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.31\";\n"],"mappings":"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","names":["chalk","Conf","crypto","anonymousId","Conf","trpcClient","crypto","chalk","chalk"]}
1
+ {"version":3,"sources":["../../src/commands/logout.ts","../../src/services/auth.service.ts","../../src/utils/trpc.ts","../../src/services/analytics.service.ts","../../src/commands/base-command.ts","../../src/utils/version.ts"],"sourcesContent":["import {Config} from '@oclif/core'\nimport chalk from 'chalk'\nimport ora from 'ora'\n\nimport {AuthService} from '../services/auth.service.js'\nimport {BaseCommand} from './base-command.js'\n\nexport default class CloudLogout extends BaseCommand {\n static override description = 'Logout from Copilot Cloud'\n\n static override examples = ['<%= config.bin %> logout']\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 await this.parse(CloudLogout)\n this.log('Logging out...\\n')\n await this.authService.logout(this)\n this.log(chalk.green('Successfully logged out!'))\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): Promise<LoginResponse> {\n let cliToken = this.getCLIToken()\n // Check authentication\n if (!cliToken) {\n try {\n const {shouldLogin} = 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 if (shouldLogin) {\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 cmd.log(chalk.red('Could not authenticate with Copilot Cloud. Please try again.'))\n process.exit(1)\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 {AnalyticsEvents} from './events.js'\nimport Conf from 'conf'\n\nexport class AnalyticsService {\n private segment: Analytics | 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 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","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.33\";\n"],"mappings":"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","names":["chalk","Conf","crypto","anonymousId","Conf","trpcClient","crypto","chalk","chalk"]}
@@ -1,5 +1,5 @@
1
1
  export { questions } from './questions.js';
2
- export { AGENT_FRAMEWORKS, AgentFrameworkSchema, ApiKeySchema, CHAT_COMPONENTS, CREW_FLOW_TEMPLATES, CREW_TYPES, ChatComponentSchema, Config, ConfigFlags, ConfigSchema, CrewFlowTemplateSchema, CrewTypeSchema, LANGGRAPH_AGENTS, LangGraphAgentSchema, NameSchema, Question, TokenSchema, UrlSchema, YES_NO, YesNoSchema, sanitizers } from './types/questions.js';
2
+ export { ApiKeySchema, CHAT_COMPONENTS, CREW_FLOW_TEMPLATES, CREW_TYPES, ChatComponentSchema, Config, ConfigFlags, ConfigSchema, CrewFlowTemplateSchema, CrewTypeSchema, LANGGRAPH_AGENTS, LangGraphAgentSchema, MODES, ModeSchema, NameSchema, Question, TokenSchema, UrlSchema, YES_NO, YesNoSchema, sanitizers } from './types/questions.js';
3
3
  export { ChatTemplate, StarterTemplate, Template, templateMapping } from './types/templates.js';
4
4
  export { scaffoldShadCN } from './scaffold/shadcn.js';
5
5
  export { scaffoldEnv } from './scaffold/env.js';
@@ -1,7 +1,14 @@
1
1
  // src/lib/init/types/questions.ts
2
2
  import { z } from "zod";
3
3
  import { Flags } from "@oclif/core";
4
- var AGENT_FRAMEWORKS = ["CrewAI", "LangGraph", "MCP", "None"];
4
+
5
+ // src/lib/init/utils.ts
6
+ var isLocalhost = (url) => {
7
+ return url.includes("localhost") || url.includes("127.0.0.1") || url.includes("0.0.0.0");
8
+ };
9
+
10
+ // src/lib/init/types/questions.ts
11
+ var MODES = ["CrewAI", "LangGraph", "MCP", "Standard"];
5
12
  var CREW_TYPES = ["Crews", "Flows"];
6
13
  var CHAT_COMPONENTS = ["CopilotChat", "CopilotSidebar", "Headless", "CopilotPopup"];
7
14
  var LANGGRAPH_AGENTS = ["Python Starter", "TypeScript Starter"];
@@ -29,7 +36,7 @@ var sanitizers = {
29
36
  return value.trim().replace(/\s/g, "");
30
37
  }
31
38
  };
32
- var AgentFrameworkSchema = z.enum(AGENT_FRAMEWORKS);
39
+ var ModeSchema = z.enum(MODES);
33
40
  var CrewTypeSchema = z.enum(CREW_TYPES);
34
41
  var ChatComponentSchema = z.enum(CHAT_COMPONENTS);
35
42
  var LangGraphAgentSchema = z.enum(LANGGRAPH_AGENTS);
@@ -39,28 +46,22 @@ var UrlSchema = z.preprocess(
39
46
  (val) => sanitizers.url(String(val)),
40
47
  z.string().url("Please enter a valid URL").min(1, "URL is required")
41
48
  );
42
- var TokenSchema = z.preprocess(
43
- (val) => sanitizers.trim(String(val)),
44
- z.string().min(1, "Token is required")
45
- );
49
+ var TokenSchema = z.preprocess((val) => sanitizers.trim(String(val)), z.string().min(1, "Token is required"));
46
50
  var ApiKeySchema = z.preprocess(
47
51
  (val) => sanitizers.apiKey(String(val)),
48
52
  z.string().min(1, "API key is required")
49
53
  );
50
- var NameSchema = z.preprocess(
51
- (val) => sanitizers.trim(String(val)),
52
- z.string().min(1, "Name is required")
53
- );
54
+ var NameSchema = z.preprocess((val) => sanitizers.trim(String(val)), z.string().min(1, "Name is required"));
54
55
  var ConfigSchema = z.object({
55
56
  // Core fields
56
57
  copilotKitVersion: z.string().optional(),
57
- agentFramework: AgentFrameworkSchema,
58
+ mode: ModeSchema,
58
59
  chatUi: ChatComponentSchema.optional(),
59
60
  // Yes/No fields
60
61
  alreadyDeployed: YesNoSchema.optional(),
61
62
  fastApiEnabled: YesNoSchema.optional(),
62
63
  useCopilotCloud: YesNoSchema.optional(),
63
- // LangGraph specific fields
64
+ // LangGraph specific fields
64
65
  langGraphAgent: LangGraphAgentSchema.optional(),
65
66
  langGraphPlatform: YesNoSchema.optional(),
66
67
  langGraphPlatformUrl: UrlSchema.optional(),
@@ -77,7 +78,7 @@ var ConfigSchema = z.object({
77
78
  llmToken: ApiKeySchema.optional()
78
79
  }).refine(
79
80
  (data) => {
80
- if (data.agentFramework === "CrewAI" && data.crewType === "Crews") {
81
+ if (data.mode === "CrewAI" && data.crewType === "Crews") {
81
82
  return !!data.crewUrl && !!data.crewBearerToken;
82
83
  }
83
84
  return true;
@@ -88,8 +89,8 @@ var ConfigSchema = z.object({
88
89
  }
89
90
  ).refine(
90
91
  (data) => {
91
- if (data.agentFramework === "LangGraph" && data.alreadyDeployed === "Yes" && data.langGraphPlatform === "Yes") {
92
- return !!data.langGraphPlatformUrl && !!data.langSmithApiKey;
92
+ if (data.mode === "LangGraph" && data.alreadyDeployed === "Yes" && data.langGraphPlatform === "Yes") {
93
+ return !!data.langGraphPlatformUrl && !!data.langSmithApiKey || isLocalhost(data.langGraphPlatformUrl || "");
93
94
  }
94
95
  return true;
95
96
  },
@@ -99,49 +100,42 @@ var ConfigSchema = z.object({
99
100
  }
100
101
  );
101
102
  var ConfigFlags = {
102
- mcp: Flags.string({ description: "Scaffold a CopilotKit project with MCP" }),
103
- copilotKitVersion: Flags.string({ description: "CopilotKit version to use (e.g. 1.7.0)" }),
104
- agentFramework: Flags.string({ description: "Agent framework to power your copilot", options: AGENT_FRAMEWORKS }),
105
- fastApiEnabled: Flags.string({ description: "Use FastAPI to serve your agent locally", options: YES_NO }),
106
- useCopilotCloud: Flags.string({ description: "Use Copilot Cloud for production-ready hosting", options: YES_NO }),
107
- chatUi: Flags.string({ description: "Chat UI component to add to your app", options: CHAT_COMPONENTS }),
108
- langGraphAgent: Flags.string({ description: "LangGraph agent template to use", options: LANGGRAPH_AGENTS }),
109
- crewType: Flags.string({ description: "CrewAI implementation type", options: CREW_TYPES }),
110
- crewName: Flags.string({ description: "Name for your CrewAI agent" }),
111
- crewUrl: Flags.string({ description: "URL endpoint for your CrewAI agent" }),
112
- crewBearerToken: Flags.string({ description: "Bearer token for CrewAI authentication" }),
113
- langSmithApiKey: Flags.string({ description: "LangSmith API key for LangGraph observability" }),
114
- llmToken: Flags.string({ description: "API key for your preferred LLM provider" }),
115
- crewFlowAgent: Flags.string({ description: "CrewAI Flow template to use", options: CREW_FLOW_TEMPLATES })
103
+ booth: Flags.boolean({ description: "Use CopilotKit in booth mode", default: false, char: "b" }),
104
+ mode: Flags.string({ description: "How you will be interacting with AI", options: MODES, char: "m" }),
105
+ "copilotkit-version": Flags.string({ description: "CopilotKit version to use (e.g. 1.7.0)" }),
106
+ "use-copilot-cloud": Flags.string({ description: "Use Copilot Cloud for production-ready hosting", options: YES_NO }),
107
+ "langgraph-agent": Flags.string({ description: "LangGraph agent template to use", options: LANGGRAPH_AGENTS }),
108
+ "crew-type": Flags.string({ description: "CrewAI implementation type", options: CREW_TYPES }),
109
+ "crew-name": Flags.string({ description: "Name for your CrewAI agent" }),
110
+ "crew-url": Flags.string({ description: "URL endpoint for your CrewAI agent" }),
111
+ "crew-bearer-token": Flags.string({ description: "Bearer token for CrewAI authentication" }),
112
+ "langsmith-api-key": Flags.string({ description: "LangSmith API key for LangGraph observability" }),
113
+ "llm-token": Flags.string({ description: "API key for your preferred LLM provider" }),
114
+ "crew-flow-agent": Flags.string({ description: "CrewAI Flow template to use", options: CREW_FLOW_TEMPLATES })
116
115
  };
117
116
 
118
117
  // src/lib/init/types/templates.ts
119
118
  var BASE_URL = "https://registry.copilotkit.ai/r";
120
119
  var templateMapping = {
121
120
  // Runtimes
122
- "RemoteEndpoint": `${BASE_URL}/remote-endpoint-starter.json`,
123
- "LangGraphPlatformRuntime": `${BASE_URL}/langgraph-platform-starter.json`,
121
+ RemoteEndpoint: `${BASE_URL}/remote-endpoint-starter.json`,
122
+ LangGraphPlatformRuntime: `${BASE_URL}/langgraph-platform-starter.json`,
124
123
  // CrewAI
125
- "CrewEnterprise": [
126
- `${BASE_URL}/coagents-crew-starter.json`
127
- ],
128
- "CrewFlowsStarter": [
124
+ CrewEnterprise: [`${BASE_URL}/coagents-crew-starter.json`],
125
+ CrewFlowsStarter: [
129
126
  `${BASE_URL}/coagents-starter-ui.json`,
130
127
  `${BASE_URL}/agent-layout.json`,
131
128
  `${BASE_URL}/remote-endpoint.json`
132
129
  ],
133
130
  // LangGraph
134
- "LangGraphGeneric": `${BASE_URL}/generic-lg-starter.json`,
135
- "LangGraphStarter": [
136
- `${BASE_URL}/langgraph-platform-starter.json`,
137
- `${BASE_URL}/coagents-starter-ui.json`
138
- ],
131
+ LangGraphGeneric: `${BASE_URL}/generic-lg-starter.json`,
132
+ LangGraphStarter: [`${BASE_URL}/langgraph-platform-starter.json`, `${BASE_URL}/coagents-starter-ui.json`],
139
133
  // No Agent
140
- "StandardStarter": `${BASE_URL}/standard-starter.json`,
141
- "StandardRuntime": `${BASE_URL}/standard-runtime.json`,
134
+ StandardStarter: `${BASE_URL}/standard-starter.json`,
135
+ StandardRuntime: `${BASE_URL}/standard-runtime.json`,
142
136
  // MCP
143
- "McpStarter": `${BASE_URL}/mcp-starter.json`,
144
- "McpRuntime": `${BASE_URL}/mcp-starter-runtime.json`
137
+ McpStarter: `${BASE_URL}/mcp-starter.json`,
138
+ McpRuntime: `${BASE_URL}/mcp-starter-runtime.json`
145
139
  };
146
140
 
147
141
  // src/lib/init/questions.ts
@@ -162,15 +156,15 @@ var questions = [
162
156
  // Core setup questions - always shown first
163
157
  {
164
158
  type: "select",
165
- name: "agentFramework",
166
- message: "\u{1F916} Choose your AI framework:",
167
- choices: Array.from(AGENT_FRAMEWORKS),
159
+ name: "mode",
160
+ message: "\u{1F916} How will you be interacting with AI?",
161
+ choices: Array.from(MODES),
168
162
  validate: (input) => {
169
163
  try {
170
- AgentFrameworkSchema.parse(input);
164
+ ModeSchema.parse(input);
171
165
  return true;
172
166
  } catch (error) {
173
- return "Please select a valid framework";
167
+ return "Please select a valid mode";
174
168
  }
175
169
  }
176
170
  },
@@ -180,7 +174,7 @@ var questions = [
180
174
  name: "crewType",
181
175
  message: "\u{1F465} What kind of CrewAI implementation would you like to use?",
182
176
  choices: Array.from(CREW_TYPES),
183
- when: (answers) => answers.agentFramework === "CrewAI",
177
+ when: (answers) => answers.mode === "CrewAI",
184
178
  validate: (input) => {
185
179
  try {
186
180
  CrewTypeSchema.parse(input);
@@ -195,7 +189,7 @@ var questions = [
195
189
  type: "input",
196
190
  name: "crewName",
197
191
  message: "\u{1F465} What would you like to name your crew? (can be anything)",
198
- when: (answers) => answers.agentFramework === "CrewAI" && answers.crewType === "Crews",
192
+ when: (answers) => answers.mode === "CrewAI" && answers.crewType === "Crews",
199
193
  default: "MyCopilotCrew",
200
194
  validate: validateRequired,
201
195
  sanitize: sanitizers.trim
@@ -204,7 +198,7 @@ var questions = [
204
198
  type: "input",
205
199
  name: "crewUrl",
206
200
  message: "\u{1F517} Enter your Crew's Enterprise URL (more info at https://app.crewai.com):",
207
- when: (answers) => answers.agentFramework === "CrewAI" && answers.crewType === "Crews",
201
+ when: (answers) => answers.mode === "CrewAI" && answers.crewType === "Crews",
208
202
  validate: validateUrl,
209
203
  sanitize: sanitizers.url
210
204
  },
@@ -212,7 +206,7 @@ var questions = [
212
206
  type: "input",
213
207
  name: "crewBearerToken",
214
208
  message: "\u{1F511} Enter your Crew's bearer token:",
215
- when: (answers) => answers.agentFramework === "CrewAI" && answers.crewType === "Crews",
209
+ when: (answers) => answers.mode === "CrewAI" && answers.crewType === "Crews",
216
210
  sensitive: true,
217
211
  validate: validateRequired,
218
212
  sanitize: sanitizers.trim
@@ -223,14 +217,14 @@ var questions = [
223
217
  name: "crewFlowAgent",
224
218
  message: "\u{1F4E6} Choose a CrewAI Flow Template",
225
219
  choices: Array.from(CREW_FLOW_TEMPLATES),
226
- when: (answers) => answers.agentFramework === "CrewAI" && answers.crewType === "Flows"
220
+ when: (answers) => answers.mode === "CrewAI" && answers.crewType === "Flows"
227
221
  },
228
222
  // LangGraph specific questions - shown when LangGraph selected
229
223
  {
230
224
  type: "yes/no",
231
225
  name: "alreadyDeployed",
232
226
  message: "\u{1F99C}\u{1F517} Do you have an existing LangGraph agent?",
233
- when: (answers) => answers.agentFramework === "LangGraph",
227
+ when: (answers) => answers.mode === "LangGraph",
234
228
  validate: (input) => {
235
229
  try {
236
230
  YesNoSchema.parse(input);
@@ -244,7 +238,7 @@ var questions = [
244
238
  type: "yes/no",
245
239
  name: "langGraphPlatform",
246
240
  message: "\u{1F99C}\u{1F517} Do you already have a LangGraph Agent URL? (remote or localhost)",
247
- when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "Yes",
241
+ when: (answers) => answers.mode === "LangGraph" && answers.alreadyDeployed === "Yes",
248
242
  validate: (input) => {
249
243
  try {
250
244
  YesNoSchema.parse(input);
@@ -258,33 +252,22 @@ var questions = [
258
252
  type: "input",
259
253
  name: "langGraphPlatformUrl",
260
254
  message: "\u{1F99C}\u{1F517} Enter your LangGraph Agent URL (remote or localhost)",
261
- when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "Yes" && answers.langGraphPlatform === "Yes",
255
+ when: (answers) => answers.mode === "LangGraph" && answers.alreadyDeployed === "Yes" && answers.langGraphPlatform === "Yes",
262
256
  validate: validateUrl,
263
257
  sanitize: sanitizers.url
264
258
  },
265
- // {
266
- // type: 'input',
267
- // name: 'langGraphRemoteEndpointURL',
268
- // message: '🔌 Enter your LangGraph endpoint URL:',
269
- // when: (answers) =>
270
- // answers.agentFramework === 'LangGraph' &&
271
- // answers.alreadyDeployed === 'Yes' &&
272
- // answers.langGraphPlatform === 'No',
273
- // validate: validateUrl,
274
- // sanitize: sanitizers.url
275
- // },
276
259
  {
277
260
  type: "select",
278
261
  name: "langGraphAgent",
279
262
  message: "\u{1F4E6} Choose a LangGraph starter template:",
280
263
  choices: Array.from(LANGGRAPH_AGENTS),
281
- when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "No"
264
+ when: (answers) => answers.mode === "LangGraph" && answers.alreadyDeployed === "No"
282
265
  },
283
266
  {
284
267
  type: "input",
285
268
  name: "langSmithApiKey",
286
269
  message: "\u{1F99C}\u{1F517} Enter your LangSmith API key (required by LangGraph Platform) :",
287
- when: (answers) => answers.agentFramework === "LangGraph" && answers.langGraphPlatform === "Yes",
270
+ when: (answers) => answers.mode === "LangGraph" && answers.langGraphPlatform === "Yes" && !(answers.langGraphPlatformUrl && isLocalhost(answers.langGraphPlatformUrl)),
288
271
  sensitive: true,
289
272
  validate: validateRequired,
290
273
  sanitize: sanitizers.apiKey
@@ -294,8 +277,8 @@ var questions = [
294
277
  type: "yes/no",
295
278
  name: "useCopilotCloud",
296
279
  message: "\u{1FA81} Deploy with Copilot Cloud? (recommended for production)",
297
- when: (answers) => answers.agentFramework === "None" || answers.agentFramework === "MCP" || answers.agentFramework !== "CrewAI" && // Crews only cloud, flows are self-hosted
298
- answers.alreadyDeployed === "Yes" && answers.langGraphPlatform !== "No",
280
+ when: (answers) => answers.mode === "Standard" || answers.mode === "MCP" || answers.mode !== "CrewAI" && // Crews only cloud, flows are self-hosted
281
+ answers.alreadyDeployed === "Yes" && answers.langGraphPlatform !== "No" && !isLocalhost(answers.langGraphPlatformUrl || ""),
299
282
  validate: (input) => {
300
283
  try {
301
284
  YesNoSchema.parse(input);
@@ -305,21 +288,11 @@ var questions = [
305
288
  }
306
289
  }
307
290
  },
308
- // {
309
- // type: 'yes/no',
310
- // name: 'fastApiEnabled',
311
- // message: '⚡ Set up a FastAPI server for local development?',
312
- // when: (answers) =>
313
- // answers.agentFramework === 'LangGraph' &&
314
- // answers.alreadyDeployed === 'No' &&
315
- // answers.langGraphAgent === 'Python Starter' &&
316
- // answers.useCopilotCloud !== 'Yes',
317
- // },
318
291
  {
319
292
  type: "input",
320
293
  name: "llmToken",
321
294
  message: "\u{1F511} Enter your OpenAI API key (required for LLM interfacing):",
322
- when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "No" || answers.agentFramework === "CrewAI" && answers.crewType === "Flows" || answers.agentFramework === "None" && answers.useCopilotCloud !== "Yes" || answers.agentFramework === "MCP" && answers.useCopilotCloud !== "Yes",
295
+ when: (answers) => answers.mode === "LangGraph" && answers.alreadyDeployed === "No" || answers.mode === "CrewAI" && answers.crewType === "Flows" || answers.mode === "Standard" && answers.useCopilotCloud !== "Yes" || answers.mode === "MCP" && answers.useCopilotCloud !== "Yes",
323
296
  sensitive: true,
324
297
  validate: validateRequired,
325
298
  sanitize: sanitizers.apiKey
@@ -328,12 +301,12 @@ var questions = [
328
301
 
329
302
  // src/lib/init/scaffold/shadcn.ts
330
303
  import spawn from "cross-spawn";
331
- async function scaffoldShadCN(userAnswers) {
304
+ async function scaffoldShadCN(flags, userAnswers) {
332
305
  try {
333
306
  const components = [];
334
- switch (userAnswers.agentFramework) {
307
+ switch (userAnswers.mode) {
335
308
  case "LangGraph":
336
- if (userAnswers.langGraphAgent) {
309
+ if (userAnswers.langGraphAgent || flags.booth) {
337
310
  components.push(...templateMapping.LangGraphStarter);
338
311
  } else {
339
312
  components.push(templateMapping.LangGraphGeneric);
@@ -361,7 +334,7 @@ async function scaffoldShadCN(userAnswers) {
361
334
  components.push(templateMapping.McpRuntime);
362
335
  }
363
336
  break;
364
- case "None":
337
+ case "Standard":
365
338
  components.push(templateMapping.StandardStarter);
366
339
  if (userAnswers.useCopilotCloud !== "Yes") {
367
340
  components.push(templateMapping.StandardRuntime);
@@ -395,20 +368,17 @@ import fs from "fs";
395
368
  // src/lib/init/scaffold/langgraph-assistants.ts
396
369
  async function getLangGraphAgents(url, langSmithApiKey) {
397
370
  try {
398
- const response = await fetch(
399
- `${url.trim().replace(/\/$/, "")}/assistants/search`,
400
- {
401
- method: "POST",
402
- headers: {
403
- "Content-Type": "application/json",
404
- "X-Api-Key": langSmithApiKey
405
- },
406
- body: JSON.stringify({
407
- limit: 10,
408
- offset: 0
409
- })
410
- }
411
- );
371
+ const response = await fetch(`${url.trim().replace(/\/$/, "")}/assistants/search`, {
372
+ method: "POST",
373
+ headers: {
374
+ "Content-Type": "application/json",
375
+ "X-Api-Key": langSmithApiKey
376
+ },
377
+ body: JSON.stringify({
378
+ limit: 10,
379
+ offset: 0
380
+ })
381
+ });
412
382
  return await response.json();
413
383
  } catch (error) {
414
384
  throw new Error(`Failed to get LangGraph agents: ${error}`);
@@ -648,7 +618,7 @@ import chalk3 from "chalk";
648
618
  import path3 from "path";
649
619
  import fs4 from "fs";
650
620
  async function scaffoldAgent(userAnswers) {
651
- if (userAnswers.agentFramework === "CrewAI" && userAnswers.crewType === "Crews" || userAnswers.agentFramework === "LangGraph" && !userAnswers.langGraphAgent || userAnswers.agentFramework === "None" || userAnswers.agentFramework === "MCP") {
621
+ if (userAnswers.mode === "CrewAI" && userAnswers.crewType === "Crews" || userAnswers.mode === "LangGraph" && !userAnswers.langGraphAgent || userAnswers.mode === "Standard" || userAnswers.mode === "MCP") {
652
622
  return;
653
623
  }
654
624
  const spinner = ora2({
@@ -656,7 +626,7 @@ async function scaffoldAgent(userAnswers) {
656
626
  color: "cyan"
657
627
  }).start();
658
628
  let template = "";
659
- switch (userAnswers.agentFramework) {
629
+ switch (userAnswers.mode) {
660
630
  case "LangGraph":
661
631
  if (userAnswers.langGraphAgent === "Python Starter") {
662
632
  template = AgentTemplates.LangGraph.Starter.Python;
@@ -676,18 +646,14 @@ async function scaffoldAgent(userAnswers) {
676
646
  }
677
647
  const agentDir = path3.join(process.cwd(), "agent");
678
648
  try {
679
- await cloneGitHubSubdirectory(
680
- template,
681
- agentDir,
682
- spinner
683
- );
649
+ await cloneGitHubSubdirectory(template, agentDir, spinner);
684
650
  spinner.text = chalk3.cyan("Creating agent environment variables...");
685
651
  let envContent = "";
686
652
  if (userAnswers.llmToken) {
687
653
  envContent += `OPENAI_API_KEY=${userAnswers.llmToken}
688
654
  `;
689
655
  }
690
- if (userAnswers.agentFramework === "LangGraph" && userAnswers.langSmithApiKey) {
656
+ if (userAnswers.mode === "LangGraph" && userAnswers.langSmithApiKey) {
691
657
  envContent += `LANGSMITH_API_KEY=${userAnswers.langSmithApiKey}
692
658
  `;
693
659
  }
@@ -696,11 +662,25 @@ async function scaffoldAgent(userAnswers) {
696
662
  fs4.writeFileSync(agentEnvFile, envContent, "utf8");
697
663
  spinner.text = chalk3.cyan("Added API keys to agent .env file");
698
664
  }
665
+ if (userAnswers.mode === "LangGraph" && userAnswers.langSmithApiKey) {
666
+ envContent += `LANGSMITH_API_KEY=${userAnswers.langSmithApiKey}
667
+ `;
668
+ }
669
+ if (envContent) {
670
+ const agentEnvFile = path3.join(agentDir, ".env");
671
+ fs4.writeFileSync(agentEnvFile, envContent, "utf8");
672
+ spinner.text = chalk3.cyan("Added API keys to agent .env file");
673
+ }
674
+ if (envContent) {
675
+ const agentEnvFile = path3.join(agentDir, ".env");
676
+ fs4.writeFileSync(agentEnvFile, envContent, "utf8");
677
+ spinner.text = chalk3.cyan("Added API keys to agent .env file");
678
+ }
699
679
  } catch (error) {
700
680
  spinner.fail(chalk3.red("Failed to clone agent template"));
701
681
  throw error;
702
682
  }
703
- spinner.succeed(`${userAnswers.agentFramework} agent cloned successfully`);
683
+ spinner.succeed(`${userAnswers.mode} agent cloned successfully`);
704
684
  }
705
685
  var AgentTemplates = {
706
686
  LangGraph: {
@@ -759,8 +739,6 @@ async function getCrewInputs(url, token) {
759
739
  return data.inputs;
760
740
  }
761
741
  export {
762
- AGENT_FRAMEWORKS,
763
- AgentFrameworkSchema,
764
742
  AgentTemplates,
765
743
  ApiKeySchema,
766
744
  CHAT_COMPONENTS,
@@ -773,6 +751,8 @@ export {
773
751
  CrewTypeSchema,
774
752
  LANGGRAPH_AGENTS,
775
753
  LangGraphAgentSchema,
754
+ MODES,
755
+ ModeSchema,
776
756
  NameSchema,
777
757
  TokenSchema,
778
758
  UrlSchema,