copilotkit 0.0.25 → 0.0.27

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 (47) hide show
  1. package/dist/commands/base-command.js +1 -1
  2. package/dist/commands/base-command.js.map +1 -1
  3. package/dist/commands/dev.js +1 -1
  4. package/dist/commands/dev.js.map +1 -1
  5. package/dist/commands/init.js +329 -102
  6. package/dist/commands/init.js.map +1 -1
  7. package/dist/commands/login.js +1 -1
  8. package/dist/commands/login.js.map +1 -1
  9. package/dist/commands/logout.js +1 -1
  10. package/dist/commands/logout.js.map +1 -1
  11. package/dist/lib/init/index.d.ts +4 -3
  12. package/dist/lib/init/index.js +243 -59
  13. package/dist/lib/init/index.js.map +1 -1
  14. package/dist/lib/init/questions.d.ts +1 -0
  15. package/dist/lib/init/questions.js +198 -35
  16. package/dist/lib/init/questions.js.map +1 -1
  17. package/dist/lib/init/scaffold/agent.d.ts +1 -0
  18. package/dist/lib/init/scaffold/agent.js +1 -1
  19. package/dist/lib/init/scaffold/agent.js.map +1 -1
  20. package/dist/lib/init/scaffold/crew-inputs.js +1 -1
  21. package/dist/lib/init/scaffold/crew-inputs.js.map +1 -1
  22. package/dist/lib/init/scaffold/env.d.ts +1 -0
  23. package/dist/lib/init/scaffold/env.js +5 -2
  24. package/dist/lib/init/scaffold/env.js.map +1 -1
  25. package/dist/lib/init/scaffold/index.d.ts +1 -0
  26. package/dist/lib/init/scaffold/index.js +133 -32
  27. package/dist/lib/init/scaffold/index.js.map +1 -1
  28. package/dist/lib/init/scaffold/langgraph-assistants.js +1 -1
  29. package/dist/lib/init/scaffold/langgraph-assistants.js.map +1 -1
  30. package/dist/lib/init/scaffold/packages.d.ts +1 -0
  31. package/dist/lib/init/scaffold/shadcn.d.ts +1 -0
  32. package/dist/lib/init/scaffold/shadcn.js +126 -28
  33. package/dist/lib/init/scaffold/shadcn.js.map +1 -1
  34. package/dist/lib/init/types/index.d.ts +2 -1
  35. package/dist/lib/init/types/index.js +114 -8
  36. package/dist/lib/init/types/index.js.map +1 -1
  37. package/dist/lib/init/types/questions.d.ts +164 -36
  38. package/dist/lib/init/types/questions.js +112 -6
  39. package/dist/lib/init/types/questions.js.map +1 -1
  40. package/dist/lib/init/types/templates.d.ts +1 -1
  41. package/dist/lib/init/types/templates.js +3 -3
  42. package/dist/lib/init/types/templates.js.map +1 -1
  43. package/dist/utils/version.d.ts +1 -1
  44. package/dist/utils/version.js +1 -1
  45. package/dist/utils/version.js.map +1 -1
  46. package/oclif.manifest.json +4 -7
  47. 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.25\";\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(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.27\";\n"],"mappings":";AACA,OAAOA,YAAW;;;ACAlB,OAAOC,WAAU;AACjB,OAAO,UAAU;AACjB,OAAO,aAAa;AACpB,OAAOC,aAAY;AACnB,OAAO,UAAU;AACjB,OAAO,aAAa;AACpB,OAAO,SAAS;AAChB,OAAO,WAAW;AAClB,OAAO,cAAc;;;ACTrB,SAAQ,oBAAoB,YAAY,qBAAoB;AAC5D,OAAO,eAAe;AAEf,IAAM,yBAAyB,QAAQ,IAAI,0BAA0B;AAErE,SAAS,iBAAiB,UAAuB;AACtD,SAAO,WAAW;AAAA,IAChB,OAAO;AAAA,MACL,cAAc;AAAA,QACZ,KAAK,GAAG,sBAAsB;AAAA,QAC9B,aAAa;AAAA,QACb,SAAS,MAAM;AACb,iBAAO;AAAA,YACL,iBAAiB;AAAA,YACjB,eAAe;AAAA,UACjB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;;;ACpBA,SAAQ,iBAAgB;AAExB,OAAO,UAAU;AAEV,IAAM,mBAAN,MAAuB;AAAA,EAQ5B,YAA6B,UAI1B;AAJ0B;AAK3B,QAAI,QAAQ,IAAI,qBAAqB,QAAQ;AAC3C;AAAA,IACF;AAEA,UAAM,kBAAkB,QAAQ,IAAI,qBAAqB;AAEzD,SAAK,mBAAmB;AAAA,MACtB,SAAS;AAAA,IACX;AAGA,QAAI,KAAK,UAAU,QAAQ;AACzB,WAAK,SAAS,KAAK,SAAS;AAAA,IAC9B;AAEA,QAAI,KAAK,UAAU,OAAO;AACxB,WAAK,QAAQ,KAAK,SAAS;AAC3B,WAAK,iBAAiB,QAAQ,KAAK,SAAS;AAAA,IAC9C;AAEA,QAAI,KAAK,UAAU,gBAAgB;AACjC,WAAK,iBAAiB,KAAK,SAAS;AAAA,IACtC;AAEA,SAAK,UAAU,IAAI,UAAU;AAAA,MAC3B,UAAU;AAAA,MACV,SAAS,QAAQ,IAAI,oBAAoB;AAAA,IAC3C,CAAC;AAED,UAAM,SAAS,IAAI,KAAK,EAAC,aAAa,gBAAe,CAAC;AACtD,QAAI,CAAC,OAAO,IAAI,aAAa,GAAG;AAC9B,aAAO,IAAI,eAAe,OAAO,WAAW,CAAC;AAAA,IAC/C;AAAA,EACF;AAAA,EA7CQ;AAAA,EACA,mBAAwC,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS,IAAI,KAAK,EAAC,aAAa,gBAAe,CAAC;AAAA,EA0ChD,iBAAyB;AAC/B,UAAM,cAAc,KAAK,OAAO,IAAI,aAAa;AACjD,QAAI,CAAC,aAAa;AAChB,YAAMC,eAAc,OAAO,WAAW;AACtC,WAAK,OAAO,IAAI,eAAeA,YAAW;AAC1C,aAAOA;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEO,MACL,OAIe;AACf,QAAI,CAAC,KAAK,SAAS;AACjB,aAAO,QAAQ,QAAQ;AAAA,IACzB;AAEA,UAAM,UAAU;AAAA,MACd,QAAQ,KAAK,SAAS,KAAK,SAAS;AAAA,MACpC,OAAO,KAAK,QAAQ,KAAK,QAAQ;AAAA,MACjC,aAAa,KAAK,eAAe;AAAA,MACjC,OAAO,MAAM;AAAA,MACb,YAAY;AAAA,QACV,GAAG,KAAK;AAAA,QACR,GAAG,MAAM;AAAA,QACT,SAAS,KAAK,iBAAiB;AAAA,UAC7B,eAAe,KAAK;AAAA,QACtB,IAAI;AAAA,QACJ,iBAAiB;AAAA,UACf,GAAG,MAAM;AAAA,UACT,GAAG,KAAK;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,WAAK,QAAS,MAAM,SAAS,CAAC,QAAQ;AACpC,YAAI,KAAK;AAEP,kBAAQ;AAAA,QACV;AAEA,gBAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;;;AF5EO,IAAM,cAAN,MAAkB;AAAA,EACN,SAAS,IAAIC,MAAK,EAAC,aAAa,gBAAe,CAAC;AAAA,EAChD,yBAAyB,QAAQ,IAAI,0BAA0B;AAAA,EAEhF,WAA+B;AAC7B,WAAO,KAAK,OAAO,IAAI,UAAU;AAAA,EACnC;AAAA,EAEA,cAAkC;AAChC,UAAM,WAAW,KAAK,OAAO,IAAI,UAAU;AAC3C,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,KAAiC;AAC5C,SAAK,OAAO,OAAO,UAAU;AAAA,EAC/B;AAAA,EAEA,MAAM,aAAa,KAAsC;AACvD,QAAI,WAAW,KAAK,YAAY;AAEhC,QAAI,CAAC,UAAU;AACb,UAAI;AACF,cAAM,EAAC,YAAW,IAAI,MAAM,SAAS,OAAO;AAAA,UAC1C;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS;AAAA,UACX;AAAA,QACF,CAAC;AACD,YAAI,aAAa;AACf,gBAAM,cAAc,MAAM,KAAK,MAAM,EAAC,gBAAgB,MAAK,CAAC;AAC5D,qBAAW,YAAY;AACvB,iBAAO;AAAA,QACT,OAAO;AACL,cAAI,MAAM,qCAAqC;AAAA,QACjD;AAAA,MACF,SAAS,OAAO;AACd,YAAI,iBAAiB,SAAS,MAAM,SAAS,mBAAmB;AAC9D,cAAI,MAAM,MAAM,OAAO,4BAA4B,CAAC;AAAA,QACtD;AAEA,cAAM;AAAA,MACR;AAAA,IACF;AAEA,QAAI;AAEJ,UAAMC,cAAa,iBAAiB,QAAQ;AAC5C,QAAI;AACF,WAAK,MAAMA,YAAW,GAAG,MAAM;AAAA,IACjC,SAAS,OAAO;AACd,UAAI,IAAI,MAAM,IAAI,8DAA8D,CAAC;AACjF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,CAAC,GAAG,gBAAgB,CAAC,GAAG,MAAM;AAChC,UAAI,MAAM,qCAAqC;AAAA,IACjD;AAEA,WAAO,EAAC,UAAU,MAAM,GAAG,MAAM,cAAc,GAAG,aAAY;AAAA,EAChE;AAAA,EAEA,MAAM,MAAM,EAAC,eAAc,IAAgC,EAAC,gBAAgB,KAAI,GAA2B;AACzG,UAAM,UAAU,IAAI,iDAA0C,EAAE,MAAM;AACtE,QAAI;AACJ,gBAAY,IAAI,iBAAiB;AAEjC,UAAM,MAAM,QAAQ;AACpB,QAAI,IAAI,KAAK,CAAC;AACd,QAAI,IAAI,QAAQ,WAAW,EAAC,UAAU,KAAI,CAAC,CAAC;AAC5C,QAAI,IAAI,QAAQ,KAAK,CAAC;AAEtB,UAAM,OAAO,MAAM,QAAQ;AAC3B,UAAM,QAAQC,QAAO,YAAY,EAAE,EAAE,SAAS,KAAK;AAEnD,WAAO,IAAI,QAAQ,OAAO,YAAY;AACpC,YAAM,SAAS,IAAI,OAAO,MAAM,MAAM;AAAA,MAAC,CAAC;AAExC,YAAM,UAAU,MAAM;AAAA,QACpB,OAAO;AAAA,QACP,YAAY,CAAC;AAAA,MACf,CAAC;AAED,cAAQ,OAAO;AAEf,UAAI,KAAK,aAAa,OAAO,KAAK,QAAQ;AACxC,cAAM,EAAC,UAAU,MAAM,aAAY,IAAI,IAAI;AAE3C,oBAAY,IAAI,iBAAiB,EAAC,QAAQ,KAAK,IAAI,gBAAgB,aAAa,IAAI,OAAO,KAAK,MAAK,CAAC;AACtG,cAAM,UAAU,MAAM;AAAA,UACpB,OAAO;AAAA,UACP,YAAY;AAAA,YACV,gBAAgB,aAAa;AAAA,YAC7B,QAAQ,KAAK;AAAA,YACb,OAAO,KAAK;AAAA,UACd;AAAA,QACF,CAAC;AAED,YAAI,UAAU,IAAI,MAAM,OAAO;AAC7B,cAAI,OAAO,GAAG,EAAE,KAAK,EAAC,SAAS,gBAAe,CAAC;AAC/C,kBAAQ,KAAK,eAAe;AAC5B;AAAA,QACF;AAEA,aAAK,OAAO,IAAI,YAAY,QAAQ;AACpC,YAAI,OAAO,GAAG,EAAE,KAAK,EAAC,SAAS,kBAAiB,CAAC;AACjD,gBAAQ,QAAQ,uCAAgC,MAAM,IAAI,SAAS,EAAE,KAAK,KAAK,CAAC,EAAE;AAClF,YAAI,gBAAgB;AAClB,kBAAQ,KAAK,CAAC;AAAA,QAChB,OAAO;AACL,iBAAO,MAAM;AACb,kBAAQ,EAAC,UAAU,MAAM,aAAY,CAAC;AAAA,QACxC;AAAA,MACF,CAAC;AAED,WAAK,GAAG,KAAK,sBAAsB,0CAA0C,IAAI,mBAAmB,KAAK,EAAE;AAAA,IAC7G,CAAC;AAAA,EACH;AACF;;;AGjJA,SAAS,eAAe;AACxB,OAAO,UAAU,0BAA0B;;;ACApC,IAAM,cAAc;;;ADG3B,OAAOC,YAAW;AAEX,IAAM,cAAN,cAA0B,QAAQ;AAAA,EACvC,MAAM,OAAO;AACX,UAAM,KAAK,gBAAgB;AAE3B,QAAI,QAAQ,IAAI,oBAAoB,QAAQ;AAC1C;AAAA,IACF;AAEA,WAAO,KAAK;AAAA,MACV,KAAK,QAAQ,IAAI,cAAc;AAAA,MAC/B,cAAc;AAAA,QACZ,mBAAmB;AAAA,MACrB;AAAA;AAAA,MAEA,kBAAkB;AAAA;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAM,KAAU;AACpB,QAAI,QAAQ,IAAI,oBAAoB,QAAQ;AAC1C,YAAM,MAAM,GAAG;AACf;AAAA,IACF;AAEA,WAAO,iBAAiB,GAAG;AAC3B,UAAM,MAAM,GAAG;AAAA,EACjB;AAAA,EAEA,MAAM,UAAU;AACd,QAAI,QAAQ,IAAI,oBAAoB,QAAQ;AAC1C;AAAA,IACF;AAEA,WAAO,MAAM;AAAA,EACf;AAAA,EAEA,MAAM,MAAM;AAAA,EAAC;AAAA,EAEb,MAAM,kBAAkB;AACtB,UAAM,WAAW,MAAM,MAAM,GAAG,sBAAsB,cAAc;AAEpE,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,eAAe,KAAK;AAE1B,QAAI,CAAC,gBAAgB,iBAAiB,aAAa;AACjD;AAAA,IACF;AAAA,EAWF;AAAA,EAEA,MAAM,cAAc,SAAiB;AACnC,SAAK,IAAI,OAAMA,OAAM,IAAI,OAAO,CAAC;AACjC,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AJ9DA,IAAqB,cAArB,MAAqB,qBAAoB,YAAY;AAAA,EAKnD,YAAY,MAAgB,QAAwB,cAAc,IAAI,YAAY,GAAG;AACnF,UAAM,MAAM,MAAM;AADgC;AAAA,EAEpD;AAAA,EANA,OAAgB,cAAc;AAAA,EAE9B,OAAgB,WAAW,CAAC,0BAA0B;AAAA,EAMtD,MAAa,MAAqB;AAChC,UAAM,KAAK,MAAM,YAAW;AAC5B,SAAK,IAAI,kBAAkB;AAC3B,UAAM,KAAK,YAAY,OAAO,IAAI;AAClC,SAAK,IAAIC,OAAM,MAAM,0BAA0B,CAAC;AAAA,EAClD;AACF;","names":["chalk","Conf","crypto","anonymousId","Conf","trpcClient","crypto","chalk","chalk"]}
@@ -1,11 +1,12 @@
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';
3
+ export { ChatTemplate, StarterTemplate, Template, templateMapping } from './types/templates.js';
2
4
  export { scaffoldShadCN } from './scaffold/shadcn.js';
3
5
  export { scaffoldEnv } from './scaffold/env.js';
4
6
  export { cloneGitHubSubdirectory, isValidGitHubUrl } from './scaffold/github.js';
5
7
  export { scaffoldPackages } from './scaffold/packages.js';
6
8
  export { AgentTemplates, scaffoldAgent } from './scaffold/agent.js';
7
9
  export { addCrewInputs } from './scaffold/crew-inputs.js';
8
- export { AGENT_FRAMEWORKS, AgentFramework, CHAT_COMPONENTS, CREW_FLOW_TEMPLATES, CREW_TYPES, ChatComponent, Config, ConfigFlags, CrewFlowTemplate, CrewType, Fields, LANGGRAPH_AGENTS, LangGraphAgent, Question, YesNo } from './types/questions.js';
9
- export { ChatTemplate, StarterTemplate, Template, templateMapping } from './types/templates.js';
10
- import 'ora';
11
10
  import '@oclif/core/interfaces';
11
+ import 'zod';
12
+ import 'ora';
@@ -1,15 +1,108 @@
1
1
  // src/lib/init/types/questions.ts
2
+ import { z } from "zod";
2
3
  import { Flags } from "@oclif/core";
3
- var AGENT_FRAMEWORKS = ["CrewAI", "LangGraph", "None"];
4
+ var AGENT_FRAMEWORKS = ["CrewAI", "LangGraph"];
4
5
  var CREW_TYPES = ["Crews", "Flows"];
5
6
  var CHAT_COMPONENTS = ["CopilotChat", "CopilotSidebar", "Headless", "CopilotPopup"];
6
- var LANGGRAPH_AGENTS = ["Python Starter", "TypeScript Starter", "None"];
7
- var CREW_FLOW_TEMPLATES = ["Starter", "None"];
7
+ var LANGGRAPH_AGENTS = ["Python Starter", "TypeScript Starter"];
8
+ var CREW_FLOW_TEMPLATES = ["Starter"];
9
+ var YES_NO = ["Yes", "No"];
10
+ var sanitizers = {
11
+ // Remove trailing slash from URLs
12
+ url: (value) => {
13
+ if (!value) return value;
14
+ return value.trim().replace(/\/+$/, "");
15
+ },
16
+ // Trim whitespace from strings
17
+ trim: (value) => {
18
+ if (!value) return value;
19
+ return value.trim();
20
+ },
21
+ // Lowercase strings
22
+ lowercase: (value) => {
23
+ if (!value) return value;
24
+ return value.toLowerCase().trim();
25
+ },
26
+ // Clean API keys (remove whitespace)
27
+ apiKey: (value) => {
28
+ if (!value) return value;
29
+ return value.trim().replace(/\s/g, "");
30
+ }
31
+ };
32
+ var AgentFrameworkSchema = z.enum(AGENT_FRAMEWORKS);
33
+ var CrewTypeSchema = z.enum(CREW_TYPES);
34
+ var ChatComponentSchema = z.enum(CHAT_COMPONENTS);
35
+ var LangGraphAgentSchema = z.enum(LANGGRAPH_AGENTS);
36
+ var CrewFlowTemplateSchema = z.enum(CREW_FLOW_TEMPLATES);
37
+ var YesNoSchema = z.enum(YES_NO);
38
+ var UrlSchema = z.preprocess(
39
+ (val) => sanitizers.url(String(val)),
40
+ z.string().url("Please enter a valid URL").min(1, "URL is required")
41
+ );
42
+ var TokenSchema = z.preprocess(
43
+ (val) => sanitizers.trim(String(val)),
44
+ z.string().min(1, "Token is required")
45
+ );
46
+ var ApiKeySchema = z.preprocess(
47
+ (val) => sanitizers.apiKey(String(val)),
48
+ z.string().min(1, "API key is required")
49
+ );
50
+ var NameSchema = z.preprocess(
51
+ (val) => sanitizers.trim(String(val)),
52
+ z.string().min(1, "Name is required")
53
+ );
54
+ var ConfigSchema = z.object({
55
+ // Core fields
56
+ copilotKitVersion: z.string().optional(),
57
+ agentFramework: AgentFrameworkSchema,
58
+ chatUi: ChatComponentSchema.optional(),
59
+ // Yes/No fields
60
+ alreadyDeployed: YesNoSchema.optional(),
61
+ fastApiEnabled: YesNoSchema.optional(),
62
+ useCopilotCloud: YesNoSchema.optional(),
63
+ // LangGraph specific fields
64
+ langGraphAgent: LangGraphAgentSchema.optional(),
65
+ langGraphPlatform: YesNoSchema.optional(),
66
+ langGraphPlatformUrl: UrlSchema.optional(),
67
+ langGraphRemoteEndpointURL: UrlSchema.optional(),
68
+ // CrewAI specific fields
69
+ crewType: CrewTypeSchema.optional(),
70
+ crewName: NameSchema.optional(),
71
+ crewUrl: UrlSchema.optional(),
72
+ crewBearerToken: TokenSchema.optional(),
73
+ crewFlowAgent: CrewFlowTemplateSchema.optional(),
74
+ // API keys and tokens
75
+ copilotCloudPublicApiKey: z.string().optional(),
76
+ langSmithApiKey: ApiKeySchema.optional(),
77
+ llmToken: ApiKeySchema.optional()
78
+ }).refine(
79
+ (data) => {
80
+ if (data.agentFramework === "CrewAI" && data.crewType === "Crews") {
81
+ return !!data.crewUrl && !!data.crewBearerToken;
82
+ }
83
+ return true;
84
+ },
85
+ {
86
+ message: "Crew URL and bearer token are required for CrewAI Crews",
87
+ path: ["crewUrl", "crewBearerToken"]
88
+ }
89
+ ).refine(
90
+ (data) => {
91
+ if (data.agentFramework === "LangGraph" && data.alreadyDeployed === "Yes" && data.langGraphPlatform === "Yes") {
92
+ return !!data.langGraphPlatformUrl && !!data.langSmithApiKey;
93
+ }
94
+ return true;
95
+ },
96
+ {
97
+ message: "LangGraph Platform URL and LangSmith API key are required",
98
+ path: ["langGraphPlatformUrl", "langSmithApiKey"]
99
+ }
100
+ );
8
101
  var ConfigFlags = {
9
102
  copilotKitVersion: Flags.string({ description: "CopilotKit version to use (e.g. 1.7.0)" }),
10
103
  agentFramework: Flags.string({ description: "Agent framework to power your copilot", options: AGENT_FRAMEWORKS }),
11
- fastApiEnabled: Flags.string({ description: "Use FastAPI to serve your agent locally", options: ["Yes", "No"] }),
12
- useCopilotCloud: Flags.string({ description: "Use Copilot Cloud for production-ready hosting", options: ["Yes", "No"] }),
104
+ fastApiEnabled: Flags.string({ description: "Use FastAPI to serve your agent locally", options: YES_NO }),
105
+ useCopilotCloud: Flags.string({ description: "Use Copilot Cloud for production-ready hosting", options: YES_NO }),
13
106
  chatUi: Flags.string({ description: "Chat UI component to add to your app", options: CHAT_COMPONENTS }),
14
107
  langGraphAgent: Flags.string({ description: "LangGraph agent template to use", options: LANGGRAPH_AGENTS }),
15
108
  crewType: Flags.string({ description: "CrewAI implementation type", options: CREW_TYPES }),
@@ -22,14 +115,14 @@ var ConfigFlags = {
22
115
  };
23
116
 
24
117
  // src/lib/init/types/templates.ts
25
- var BASE_URL = "https://registry.copilotkit.ai/r";
118
+ var BASE_URL = "http://localhost:3002/r";
26
119
  var templateMapping = {
27
- "LangGraphPlatform": `${BASE_URL}/langgraph-platform-starter.json`,
120
+ "LangGraphPlatformRuntime": `${BASE_URL}/langgraph-platform-starter.json`,
28
121
  "RemoteEndpoint": `${BASE_URL}/remote-endpoint-starter.json`,
29
122
  "CrewEnterprise": [
30
123
  `${BASE_URL}/coagents-crew-starter.json`
31
124
  ],
32
- "LangGraphGeneric": `${BASE_URL}/generic-lg-starter.json`,
125
+ "LangGraphGeneric": `${BASE_URL}/generic-lg-starter-with-cloud.json`,
33
126
  "CrewFlowsStarter": [
34
127
  `${BASE_URL}/coagents-starter-ui.json`,
35
128
  `${BASE_URL}/agent-layout.json`,
@@ -46,13 +139,34 @@ var templateMapping = {
46
139
  };
47
140
 
48
141
  // src/lib/init/questions.ts
142
+ var validateUrl = (input) => {
143
+ try {
144
+ const sanitized = sanitizers.url(input);
145
+ const result = UrlSchema.safeParse(sanitized);
146
+ if (result.success) return true;
147
+ return result.error.errors[0]?.message || "Invalid URL format";
148
+ } catch (error) {
149
+ return "Invalid URL format";
150
+ }
151
+ };
152
+ var validateRequired = (input) => {
153
+ return sanitizers.trim(input) ? true : "This field is required";
154
+ };
49
155
  var questions = [
50
156
  // Core setup questions - always shown first
51
157
  {
52
158
  type: "select",
53
159
  name: "agentFramework",
54
160
  message: "\u{1F916} Choose your AI framework:",
55
- choices: Array.from(AGENT_FRAMEWORKS)
161
+ choices: Array.from(AGENT_FRAMEWORKS),
162
+ validate: (input) => {
163
+ try {
164
+ AgentFrameworkSchema.parse(input);
165
+ return true;
166
+ } catch (error) {
167
+ return "Please select a valid framework";
168
+ }
169
+ }
56
170
  },
57
171
  // CrewAI specific questions - shown when CrewAI selected
58
172
  {
@@ -60,7 +174,15 @@ var questions = [
60
174
  name: "crewType",
61
175
  message: "\u{1F465} What kind of CrewAI implementation would you like to use?",
62
176
  choices: Array.from(CREW_TYPES),
63
- when: (answers) => answers.agentFramework === "CrewAI"
177
+ when: (answers) => answers.agentFramework === "CrewAI",
178
+ validate: (input) => {
179
+ try {
180
+ CrewTypeSchema.parse(input);
181
+ return true;
182
+ } catch (error) {
183
+ return "Please select a valid crew type";
184
+ }
185
+ }
64
186
  },
65
187
  // CrewAI Crews specific questions - shown when CrewAI Crews selected
66
188
  {
@@ -68,20 +190,26 @@ var questions = [
68
190
  name: "crewName",
69
191
  message: "\u{1F465} What would you like to name your crew? (can be anything)",
70
192
  when: (answers) => answers.agentFramework === "CrewAI" && answers.crewType === "Crews",
71
- default: "MyCopilotCrew"
193
+ default: "MyCopilotCrew",
194
+ validate: validateRequired,
195
+ sanitize: sanitizers.trim
72
196
  },
73
197
  {
74
198
  type: "input",
75
199
  name: "crewUrl",
76
- message: "\u{1F517} Enter your Crew's URL:",
77
- when: (answers) => answers.agentFramework === "CrewAI" && answers.crewType === "Crews"
200
+ message: "\u{1F517} Enter your Crew's Enterprise URL (more info at https://app.crewai.com):",
201
+ when: (answers) => answers.agentFramework === "CrewAI" && answers.crewType === "Crews",
202
+ validate: validateUrl,
203
+ sanitize: sanitizers.url
78
204
  },
79
205
  {
80
206
  type: "input",
81
207
  name: "crewBearerToken",
82
208
  message: "\u{1F511} Enter your Crew's bearer token:",
83
209
  when: (answers) => answers.agentFramework === "CrewAI" && answers.crewType === "Crews",
84
- sensitive: true
210
+ sensitive: true,
211
+ validate: validateRequired,
212
+ sanitize: sanitizers.trim
85
213
  },
86
214
  // CrewAI Flows specific questions - shown when CrewAI Flows selected
87
215
  {
@@ -96,26 +224,49 @@ var questions = [
96
224
  type: "yes/no",
97
225
  name: "alreadyDeployed",
98
226
  message: "\u{1F680} Is your LangGraph agent already deployed?",
99
- when: (answers) => answers.agentFramework === "LangGraph"
227
+ when: (answers) => answers.agentFramework === "LangGraph",
228
+ validate: (input) => {
229
+ try {
230
+ YesNoSchema.parse(input);
231
+ return true;
232
+ } catch (error) {
233
+ return "Please select Yes or No";
234
+ }
235
+ }
100
236
  },
101
237
  {
102
238
  type: "yes/no",
103
239
  name: "langGraphPlatform",
104
- message: "\u{1F99C}\u{1F517} Is it hosted with LangGraph Platform (local or cloud)?",
105
- when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "Yes"
240
+ message: "\u{1F99C}\u{1F517} Is it hosted with LangGraph Platform (either self-hosted or in LangSmith)?",
241
+ when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "Yes",
242
+ validate: (input) => {
243
+ try {
244
+ YesNoSchema.parse(input);
245
+ return true;
246
+ } catch (error) {
247
+ return "Please select Yes or No";
248
+ }
249
+ }
106
250
  },
107
251
  {
108
252
  type: "input",
109
253
  name: "langGraphPlatformUrl",
110
254
  message: "\u{1F99C}\u{1F517} Enter your LangGraph platform URL:",
111
- when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "Yes" && answers.langGraphPlatform === "Yes"
112
- },
113
- {
114
- type: "input",
115
- name: "langGraphRemoteEndpointURL",
116
- message: "\u{1F50C} Enter your LangGraph endpoint URL:",
117
- when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "Yes" && answers.langGraphPlatform === "No"
255
+ when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "Yes" && answers.langGraphPlatform === "Yes",
256
+ validate: validateUrl,
257
+ sanitize: sanitizers.url
118
258
  },
259
+ // {
260
+ // type: 'input',
261
+ // name: 'langGraphRemoteEndpointURL',
262
+ // message: '🔌 Enter your LangGraph endpoint URL:',
263
+ // when: (answers) =>
264
+ // answers.agentFramework === 'LangGraph' &&
265
+ // answers.alreadyDeployed === 'Yes' &&
266
+ // answers.langGraphPlatform === 'No',
267
+ // validate: validateUrl,
268
+ // sanitize: sanitizers.url
269
+ // },
119
270
  {
120
271
  type: "select",
121
272
  name: "langGraphAgent",
@@ -128,14 +279,24 @@ var questions = [
128
279
  name: "langSmithApiKey",
129
280
  message: "\u{1F99C}\u{1F517} Enter your LangSmith API key (required by LangGraph Platform) :",
130
281
  when: (answers) => answers.agentFramework === "LangGraph" && answers.langGraphPlatform === "Yes",
131
- sensitive: true
282
+ sensitive: true,
283
+ validate: validateRequired,
284
+ sanitize: sanitizers.apiKey
132
285
  },
133
286
  // Deployment options
134
287
  {
135
288
  type: "yes/no",
136
289
  name: "useCopilotCloud",
137
290
  message: "\u{1FA81} Deploy with Copilot Cloud? (recommended for production)",
138
- when: (answers) => !(answers.agentFramework === "CrewAI" && answers.crewType === "Crews") && answers.crewType !== "Flows" && answers.alreadyDeployed === "Yes"
291
+ when: (answers) => !(answers.agentFramework === "CrewAI" && answers.crewType === "Crews") && answers.crewType !== "Flows" && answers.alreadyDeployed === "Yes" && answers.langGraphPlatform !== "No",
292
+ validate: (input) => {
293
+ try {
294
+ YesNoSchema.parse(input);
295
+ return true;
296
+ } catch (error) {
297
+ return "Please select Yes or No";
298
+ }
299
+ }
139
300
  },
140
301
  // {
141
302
  // type: 'yes/no',
@@ -148,20 +309,22 @@ var questions = [
148
309
  // answers.useCopilotCloud !== 'Yes',
149
310
  // },
150
311
  // UI components - always shown last
151
- {
152
- type: "select",
153
- name: "chatUi",
154
- message: "\u{1F4AC} Select a UI component for your copilot:",
155
- choices: Array.from(CHAT_COMPONENTS),
156
- default: "CopilotChat",
157
- when: (answers) => answers.agentFramework === "None"
158
- },
312
+ // {
313
+ // type: 'select',
314
+ // name: 'chatUi',
315
+ // message: '💬 Select a UI component for your copilot:',
316
+ // choices: Array.from(CHAT_COMPONENTS),
317
+ // default: 'CopilotChat',
318
+ // when: (answers) => answers.agentFramework === 'None',
319
+ // },
159
320
  {
160
321
  type: "input",
161
322
  name: "llmToken",
162
323
  message: "\u{1F511} Enter your OpenAI API key (required for agent functionality):",
163
324
  when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "No" || answers.agentFramework === "CrewAI" && answers.crewType === "Flows",
164
- sensitive: true
325
+ sensitive: true,
326
+ validate: validateRequired,
327
+ sanitize: sanitizers.apiKey
165
328
  }
166
329
  ];
167
330
 
@@ -170,28 +333,33 @@ import spawn from "cross-spawn";
170
333
  async function scaffoldShadCN(userAnswers) {
171
334
  try {
172
335
  const components = [];
173
- if (userAnswers.agentFramework !== "None") {
174
- switch (userAnswers.agentFramework) {
175
- case "LangGraph":
176
- if (userAnswers.langGraphAgent && userAnswers.langGraphAgent !== "None") {
177
- components.push(...templateMapping.LangGraphStarter);
178
- } else {
179
- components.push(templateMapping.LangGraphGeneric);
180
- }
181
- break;
182
- case "CrewAI":
183
- if (userAnswers.crewType === "Crews") {
184
- components.push(...templateMapping.CrewEnterprise);
185
- } else if (userAnswers.crewFlowAgent) {
186
- components.push(...templateMapping.CrewFlowsStarter);
187
- } else {
188
- components.push(templateMapping.RemoteEndpoint);
336
+ switch (userAnswers.agentFramework) {
337
+ case "LangGraph":
338
+ if (userAnswers.langGraphAgent) {
339
+ components.push(...templateMapping.LangGraphStarter);
340
+ } else {
341
+ components.push(templateMapping.LangGraphGeneric);
342
+ if (userAnswers.useCopilotCloud !== "Yes") {
343
+ if (userAnswers.langGraphPlatform === "Yes") {
344
+ components.push(templateMapping.LangGraphPlatformRuntime);
345
+ } else {
346
+ components.push(templateMapping.RemoteEndpoint);
347
+ }
189
348
  }
190
- break;
191
- default:
349
+ }
350
+ break;
351
+ case "CrewAI":
352
+ if (userAnswers.crewType === "Crews") {
353
+ components.push(...templateMapping.CrewEnterprise);
354
+ } else if (userAnswers.crewFlowAgent) {
355
+ components.push(...templateMapping.CrewFlowsStarter);
356
+ } else {
192
357
  components.push(templateMapping.RemoteEndpoint);
193
- break;
194
- }
358
+ }
359
+ break;
360
+ default:
361
+ components.push(templateMapping.RemoteEndpoint);
362
+ break;
195
363
  }
196
364
  await new Promise((resolve) => setTimeout(resolve, 100));
197
365
  try {
@@ -218,7 +386,7 @@ import fs from "fs";
218
386
  async function getLangGraphAgents(url, langSmithApiKey) {
219
387
  try {
220
388
  const response = await fetch(
221
- `${url}/assistants/search`,
389
+ `${url.trim().replace(/\/$/, "")}/assistants/search`,
222
390
  {
223
391
  method: "POST",
224
392
  headers: {
@@ -263,13 +431,16 @@ async function scaffoldEnv(flags, userAnswers) {
263
431
  newEnvValues += `NEXT_PUBLIC_COPILOTKIT_AGENT_NAME=${userAnswers.crewName}
264
432
  `;
265
433
  }
266
- if (userAnswers.langGraphAgent !== "None" && userAnswers.langGraphPlatform !== "Yes") {
434
+ if (userAnswers.langGraphAgent) {
267
435
  newEnvValues += `NEXT_PUBLIC_COPILOTKIT_AGENT_NAME=sample_agent
268
436
  `;
269
437
  newEnvValues += `LANGGRAPH_DEPLOYMENT_URL=http://localhost:8123
270
438
  `;
271
439
  } else if (userAnswers.langGraphPlatform === "Yes" && userAnswers.useCopilotCloud === "No") {
272
440
  newEnvValues += `LANGGRAPH_DEPLOYMENT_URL=${userAnswers.langGraphPlatformUrl}
441
+ `;
442
+ } else if (userAnswers.langGraphRemoteEndpointURL) {
443
+ newEnvValues += `COPILOTKIT_REMOTE_ENDPOINT=${userAnswers.langGraphRemoteEndpointURL}
273
444
  `;
274
445
  }
275
446
  if (flags.runtimeUrl) {
@@ -467,7 +638,7 @@ import chalk3 from "chalk";
467
638
  import path3 from "path";
468
639
  import fs4 from "fs";
469
640
  async function scaffoldAgent(userAnswers) {
470
- if (userAnswers.agentFramework === "None" || userAnswers.agentFramework === "CrewAI" && userAnswers.crewType === "Crews" || userAnswers.agentFramework === "LangGraph" && (!userAnswers.langGraphAgent || userAnswers.langGraphAgent === "None")) {
641
+ if (userAnswers.agentFramework === "CrewAI" && userAnswers.crewType === "Crews" || userAnswers.agentFramework === "LangGraph" && !userAnswers.langGraphAgent) {
471
642
  return;
472
643
  }
473
644
  const spinner = ora2({
@@ -566,7 +737,7 @@ async function addCrewInputs(url, token) {
566
737
  }
567
738
  }
568
739
  async function getCrewInputs(url, token) {
569
- const response = await fetch(`${url}/inputs`, {
740
+ const response = await fetch(`${url.trim()}/inputs`, {
570
741
  headers: {
571
742
  Authorization: `Bearer ${token}`
572
743
  }
@@ -579,16 +750,29 @@ async function getCrewInputs(url, token) {
579
750
  }
580
751
  export {
581
752
  AGENT_FRAMEWORKS,
753
+ AgentFrameworkSchema,
582
754
  AgentTemplates,
755
+ ApiKeySchema,
583
756
  CHAT_COMPONENTS,
584
757
  CREW_FLOW_TEMPLATES,
585
758
  CREW_TYPES,
759
+ ChatComponentSchema,
586
760
  ConfigFlags,
761
+ ConfigSchema,
762
+ CrewFlowTemplateSchema,
763
+ CrewTypeSchema,
587
764
  LANGGRAPH_AGENTS,
765
+ LangGraphAgentSchema,
766
+ NameSchema,
767
+ TokenSchema,
768
+ UrlSchema,
769
+ YES_NO,
770
+ YesNoSchema,
588
771
  addCrewInputs,
589
772
  cloneGitHubSubdirectory,
590
773
  isValidGitHubUrl,
591
774
  questions,
775
+ sanitizers,
592
776
  scaffoldAgent,
593
777
  scaffoldEnv,
594
778
  scaffoldPackages,