copilotkit 0.0.28 → 0.0.30

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.
@@ -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.28\";\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.30\";\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,7 +1,7 @@
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"];
4
+ var AGENT_FRAMEWORKS = ["CrewAI", "LangGraph", "None"];
5
5
  var CREW_TYPES = ["Crews", "Flows"];
6
6
  var CHAT_COMPONENTS = ["CopilotChat", "CopilotSidebar", "Headless", "CopilotPopup"];
7
7
  var LANGGRAPH_AGENTS = ["Python Starter", "TypeScript Starter"];
@@ -115,27 +115,29 @@ var ConfigFlags = {
115
115
  };
116
116
 
117
117
  // src/lib/init/types/templates.ts
118
- var BASE_URL = "http://registry.copilotkit.ai/r";
118
+ var BASE_URL = "https://registry.copilotkit.ai/r";
119
119
  var templateMapping = {
120
- "LangGraphPlatformRuntime": `${BASE_URL}/langgraph-platform-starter.json`,
120
+ // Runtimes
121
121
  "RemoteEndpoint": `${BASE_URL}/remote-endpoint-starter.json`,
122
+ "LangGraphPlatformRuntime": `${BASE_URL}/langgraph-platform-starter.json`,
123
+ // CrewAI
122
124
  "CrewEnterprise": [
123
125
  `${BASE_URL}/coagents-crew-starter.json`
124
126
  ],
125
- "LangGraphGeneric": `${BASE_URL}/generic-lg-starter-with-cloud.json`,
126
127
  "CrewFlowsStarter": [
127
128
  `${BASE_URL}/coagents-starter-ui.json`,
128
129
  `${BASE_URL}/agent-layout.json`,
129
130
  `${BASE_URL}/remote-endpoint.json`
130
131
  ],
132
+ // LangGraph
133
+ "LangGraphGeneric": `${BASE_URL}/generic-lg-starter.json`,
131
134
  "LangGraphStarter": [
132
135
  `${BASE_URL}/langgraph-platform-starter.json`,
133
136
  `${BASE_URL}/coagents-starter-ui.json`
134
137
  ],
135
- "Standard": `${BASE_URL}/standard-starter.json`,
136
- "CopilotChat": `${BASE_URL}/chat.json`,
137
- "CopilotPopup": `${BASE_URL}/popup.json`,
138
- "CopilotSidebar": `${BASE_URL}/sidebar.json`
138
+ // No Agent
139
+ "StandardStarter": `${BASE_URL}/standard-starter.json`,
140
+ "StandardRuntime": `${BASE_URL}/standard-runtime.json`
139
141
  };
140
142
 
141
143
  // src/lib/init/questions.ts
@@ -223,7 +225,7 @@ var questions = [
223
225
  {
224
226
  type: "yes/no",
225
227
  name: "alreadyDeployed",
226
- message: "\u{1F680} Is your LangGraph agent already deployed?",
228
+ message: "\u{1F99C}\u{1F517} Do you have an existing LangGraph agent?",
227
229
  when: (answers) => answers.agentFramework === "LangGraph",
228
230
  validate: (input) => {
229
231
  try {
@@ -237,7 +239,7 @@ var questions = [
237
239
  {
238
240
  type: "yes/no",
239
241
  name: "langGraphPlatform",
240
- message: "\u{1F99C}\u{1F517} Is it hosted with LangGraph Platform (either self-hosted or in LangSmith)?",
242
+ message: "\u{1F99C}\u{1F517} Do you already have a LangGraph Agent URL? (remote or localhost)",
241
243
  when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "Yes",
242
244
  validate: (input) => {
243
245
  try {
@@ -251,7 +253,7 @@ var questions = [
251
253
  {
252
254
  type: "input",
253
255
  name: "langGraphPlatformUrl",
254
- message: "\u{1F99C}\u{1F517} Enter your LangGraph platform URL:",
256
+ message: "\u{1F99C}\u{1F517} Enter your LangGraph Agent URL (remote or localhost)",
255
257
  when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "Yes" && answers.langGraphPlatform === "Yes",
256
258
  validate: validateUrl,
257
259
  sanitize: sanitizers.url
@@ -288,7 +290,8 @@ var questions = [
288
290
  type: "yes/no",
289
291
  name: "useCopilotCloud",
290
292
  message: "\u{1FA81} Deploy with Copilot Cloud? (recommended for production)",
291
- when: (answers) => !(answers.agentFramework === "CrewAI" && answers.crewType === "Crews") && answers.crewType !== "Flows" && answers.alreadyDeployed === "Yes" && answers.langGraphPlatform !== "No",
293
+ when: (answers) => answers.agentFramework === "None" || answers.agentFramework !== "CrewAI" && // Crews only cloud, flows are self-hosted
294
+ answers.alreadyDeployed === "Yes" && answers.langGraphPlatform !== "No",
292
295
  validate: (input) => {
293
296
  try {
294
297
  YesNoSchema.parse(input);
@@ -308,20 +311,11 @@ var questions = [
308
311
  // answers.langGraphAgent === 'Python Starter' &&
309
312
  // answers.useCopilotCloud !== 'Yes',
310
313
  // },
311
- // UI components - always shown last
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
- // },
320
314
  {
321
315
  type: "input",
322
316
  name: "llmToken",
323
- message: "\u{1F511} Enter your OpenAI API key (required for agent functionality):",
324
- when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "No" || answers.agentFramework === "CrewAI" && answers.crewType === "Flows",
317
+ message: "\u{1F511} Enter your OpenAI API key (required for LLM interfacing):",
318
+ when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "No" || answers.agentFramework === "CrewAI" && answers.crewType === "Flows" || answers.agentFramework === "None" && answers.useCopilotCloud !== "Yes",
325
319
  sensitive: true,
326
320
  validate: validateRequired,
327
321
  sanitize: sanitizers.apiKey
@@ -357,6 +351,12 @@ async function scaffoldShadCN(userAnswers) {
357
351
  components.push(templateMapping.RemoteEndpoint);
358
352
  }
359
353
  break;
354
+ case "None":
355
+ components.push(templateMapping.StandardStarter);
356
+ if (userAnswers.useCopilotCloud !== "Yes") {
357
+ components.push(templateMapping.StandardRuntime);
358
+ }
359
+ break;
360
360
  default:
361
361
  components.push(templateMapping.RemoteEndpoint);
362
362
  break;
@@ -638,7 +638,7 @@ import chalk3 from "chalk";
638
638
  import path3 from "path";
639
639
  import fs4 from "fs";
640
640
  async function scaffoldAgent(userAnswers) {
641
- if (userAnswers.agentFramework === "CrewAI" && userAnswers.crewType === "Crews" || userAnswers.agentFramework === "LangGraph" && !userAnswers.langGraphAgent) {
641
+ if (userAnswers.agentFramework === "CrewAI" && userAnswers.crewType === "Crews" || userAnswers.agentFramework === "LangGraph" && !userAnswers.langGraphAgent || userAnswers.agentFramework === "None") {
642
642
  return;
643
643
  }
644
644
  const spinner = ora2({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/init/types/questions.ts","../../../src/lib/init/types/templates.ts","../../../src/lib/init/questions.ts","../../../src/lib/init/scaffold/shadcn.ts","../../../src/lib/init/scaffold/env.ts","../../../src/lib/init/scaffold/langgraph-assistants.ts","../../../src/lib/init/scaffold/github.ts","../../../src/lib/init/scaffold/packages.ts","../../../src/lib/init/scaffold/agent.ts","../../../src/lib/init/scaffold/crew-inputs.ts"],"sourcesContent":["import { z } from 'zod';\nimport { Flags } from \"@oclif/core\"\n\n// ===== Core Constants =====\nexport const AGENT_FRAMEWORKS = ['CrewAI', 'LangGraph'] as const;\nexport const CREW_TYPES = ['Crews', 'Flows'] as const;\nexport const CHAT_COMPONENTS = ['CopilotChat','CopilotSidebar', 'Headless', 'CopilotPopup'] as const;\nexport const LANGGRAPH_AGENTS = ['Python Starter', 'TypeScript Starter'] as const;\nexport const CREW_FLOW_TEMPLATES = ['Starter'] as const;\nexport const YES_NO = ['Yes', 'No'] as const;\n\n// ===== Sanitizers =====\nexport const sanitizers = {\n // Remove trailing slash from URLs\n url: (value: string): string => {\n if (!value) return value;\n return value.trim().replace(/\\/+$/, '');\n },\n \n // Trim whitespace from strings\n trim: (value: string): string => {\n if (!value) return value;\n return value.trim();\n },\n \n // Lowercase strings\n lowercase: (value: string): string => {\n if (!value) return value;\n return value.toLowerCase().trim();\n },\n \n // Clean API keys (remove whitespace)\n apiKey: (value: string): string => {\n if (!value) return value;\n return value.trim().replace(/\\s/g, '');\n }\n};\n\n// ===== Zod Schemas =====\n\n// Basic schemas\nexport const AgentFrameworkSchema = z.enum(AGENT_FRAMEWORKS);\nexport const CrewTypeSchema = z.enum(CREW_TYPES);\nexport const ChatComponentSchema = z.enum(CHAT_COMPONENTS);\nexport const LangGraphAgentSchema = z.enum(LANGGRAPH_AGENTS);\nexport const CrewFlowTemplateSchema = z.enum(CREW_FLOW_TEMPLATES);\nexport const YesNoSchema = z.enum(YES_NO);\n\n// URL validation schema with preprocessing to remove trailing slash\nexport const UrlSchema = z.preprocess(\n val => sanitizers.url(String(val)),\n z.string().url('Please enter a valid URL').min(1, 'URL is required')\n);\n\n// Token validation schema with preprocessing to trim\nexport const TokenSchema = z.preprocess(\n val => sanitizers.trim(String(val)),\n z.string().min(1, 'Token is required')\n);\n\n// API key validation schema with preprocessing to remove whitespace\nexport const ApiKeySchema = z.preprocess(\n val => sanitizers.apiKey(String(val)),\n z.string().min(1, 'API key is required')\n);\n\n// Name validation schema with preprocessing to trim\nexport const NameSchema = z.preprocess(\n val => sanitizers.trim(String(val)),\n z.string().min(1, 'Name is required')\n);\n\n// Config schema\nexport const ConfigSchema = z.object({\n // Core fields\n copilotKitVersion: z.string().optional(),\n agentFramework: AgentFrameworkSchema,\n chatUi: ChatComponentSchema.optional(),\n \n // Yes/No fields\n alreadyDeployed: YesNoSchema.optional(),\n fastApiEnabled: YesNoSchema.optional(),\n useCopilotCloud: YesNoSchema.optional(),\n \n // LangGraph specific fields \n langGraphAgent: LangGraphAgentSchema.optional(),\n langGraphPlatform: YesNoSchema.optional(),\n langGraphPlatformUrl: UrlSchema.optional(),\n langGraphRemoteEndpointURL: UrlSchema.optional(),\n \n // CrewAI specific fields\n crewType: CrewTypeSchema.optional(),\n crewName: NameSchema.optional(),\n crewUrl: UrlSchema.optional(),\n crewBearerToken: TokenSchema.optional(),\n crewFlowAgent: CrewFlowTemplateSchema.optional(),\n \n // API keys and tokens\n copilotCloudPublicApiKey: z.string().optional(),\n langSmithApiKey: ApiKeySchema.optional(),\n llmToken: ApiKeySchema.optional(),\n})\n.refine(\n (data) => {\n // If CrewAI is selected with Crews type, require crew URL and bearer token\n if (data.agentFramework === 'CrewAI' && data.crewType === 'Crews') {\n return !!data.crewUrl && !!data.crewBearerToken;\n }\n return true;\n },\n {\n message: \"Crew URL and bearer token are required for CrewAI Crews\",\n path: [\"crewUrl\", \"crewBearerToken\"],\n }\n)\n.refine(\n (data) => {\n // If LangGraph is selected with LangGraph Platform, require platform URL and LangSmith API key\n if (\n data.agentFramework === 'LangGraph' && \n data.alreadyDeployed === 'Yes' && \n data.langGraphPlatform === 'Yes'\n ) {\n return !!data.langGraphPlatformUrl && !!data.langSmithApiKey;\n }\n return true;\n },\n {\n message: \"LangGraph Platform URL and LangSmith API key are required\",\n path: [\"langGraphPlatformUrl\", \"langSmithApiKey\"],\n }\n);\n\n// Export the inferred type from the schema\nexport type Config = z.infer<typeof ConfigSchema>;\n\n// Question type definition with improved validation and sanitization\nexport type Question = {\n type: 'input' | 'yes/no' | 'select';\n name: keyof Config;\n message: string;\n choices?: readonly string[];\n default?: string;\n when?: (answers: Partial<Config>) => boolean;\n sensitive?: boolean;\n validate?: (input: string) => true | string; // Return true if valid, error message string if invalid\n sanitize?: (input: string) => string; // Function to sanitize input before validation\n};\n\n// CLI flags definition with descriptions\nexport const ConfigFlags = {\n copilotKitVersion: Flags.string({description: 'CopilotKit version to use (e.g. 1.7.0)'}),\n agentFramework: Flags.string({description: 'Agent framework to power your copilot', options: AGENT_FRAMEWORKS}),\n fastApiEnabled: Flags.string({description: 'Use FastAPI to serve your agent locally', options: YES_NO}),\n useCopilotCloud: Flags.string({description: 'Use Copilot Cloud for production-ready hosting', options: YES_NO}),\n chatUi: Flags.string({description: 'Chat UI component to add to your app', options: CHAT_COMPONENTS}),\n langGraphAgent: Flags.string({description: 'LangGraph agent template to use', options: LANGGRAPH_AGENTS}),\n crewType: Flags.string({description: 'CrewAI implementation type', options: CREW_TYPES}),\n crewName: Flags.string({description: 'Name for your CrewAI agent'}),\n crewUrl: Flags.string({description: 'URL endpoint for your CrewAI agent'}),\n crewBearerToken: Flags.string({description: 'Bearer token for CrewAI authentication'}),\n langSmithApiKey: Flags.string({description: 'LangSmith API key for LangGraph observability'}),\n llmToken: Flags.string({description: 'API key for your preferred LLM provider'}),\n crewFlowAgent: Flags.string({description: 'CrewAI Flow template to use', options: CREW_FLOW_TEMPLATES}),\n}","export type ChatTemplate = \n \"CopilotChat\" |\n \"CopilotPopup\" |\n \"CopilotSidebar\"\n\nexport type StarterTemplate = \n \"LangGraphPlatform\" |\n \"RemoteEndpoint\" |\n \"Standard\" |\n \"CrewEnterprise\" |\n \"CrewFlowsStarter\"\n\nexport type Template = ChatTemplate | StarterTemplate\n\nconst BASE_URL = \"http://registry.copilotkit.ai/r\"\n\nexport const templateMapping = {\n \"LangGraphPlatformRuntime\": `${BASE_URL}/langgraph-platform-starter.json`,\n \"RemoteEndpoint\": `${BASE_URL}/remote-endpoint-starter.json`,\n \"CrewEnterprise\": [\n `${BASE_URL}/coagents-crew-starter.json`,\n ],\n\n \"LangGraphGeneric\": `${BASE_URL}/generic-lg-starter-with-cloud.json`,\n\n \"CrewFlowsStarter\": [\n `${BASE_URL}/coagents-starter-ui.json`,\n `${BASE_URL}/agent-layout.json`,\n `${BASE_URL}/remote-endpoint.json`\n ],\n\n \"LangGraphStarter\": [\n `${BASE_URL}/langgraph-platform-starter.json`,\n `${BASE_URL}/coagents-starter-ui.json`,\n ],\n\n \"Standard\": `${BASE_URL}/standard-starter.json`,\n \"CopilotChat\": `${BASE_URL}/chat.json`,\n \"CopilotPopup\": `${BASE_URL}/popup.json`,\n \"CopilotSidebar\": `${BASE_URL}/sidebar.json`,\n}","import { \n Question, \n CHAT_COMPONENTS,\n AGENT_FRAMEWORKS,\n CREW_TYPES,\n LANGGRAPH_AGENTS,\n CREW_FLOW_TEMPLATES,\n AgentFrameworkSchema,\n CrewTypeSchema,\n UrlSchema,\n YesNoSchema,\n sanitizers,\n} from './types/index.js';\n\n// Validation helpers\nconst validateUrl = (input: string): true | string => {\n try {\n // First sanitize the URL by removing trailing slashes\n const sanitized = sanitizers.url(input);\n // Then validate\n const result = UrlSchema.safeParse(sanitized);\n if (result.success) return true;\n return result.error.errors[0]?.message || 'Invalid URL format';\n } catch (error) {\n return 'Invalid URL format';\n }\n};\n\nconst validateRequired = (input: string): true | string => {\n return sanitizers.trim(input) ? true : 'This field is required';\n};\n\n// Single source of truth for all questions in the CLI\n// Organized in a logical flow with improved phrasing\nexport const questions: Question[] = [\n // Core setup questions - always shown first\n {\n type: 'select',\n name: 'agentFramework',\n message: '🤖 Choose your AI framework:',\n choices: Array.from(AGENT_FRAMEWORKS),\n validate: (input) => {\n try {\n AgentFrameworkSchema.parse(input);\n return true;\n } catch (error) {\n return 'Please select a valid framework';\n }\n }\n },\n \n // CrewAI specific questions - shown when CrewAI selected\n {\n type: 'select',\n name: 'crewType',\n message: '👥 What kind of CrewAI implementation would you like to use?',\n choices: Array.from(CREW_TYPES),\n when: (answers) => answers.agentFramework === 'CrewAI',\n validate: (input) => {\n try {\n CrewTypeSchema.parse(input);\n return true;\n } catch (error) {\n return 'Please select a valid crew type';\n }\n }\n },\n\n // CrewAI Crews specific questions - shown when CrewAI Crews selected\n {\n type: 'input',\n name: 'crewName',\n message: '👥 What would you like to name your crew? (can be anything)',\n when: (answers) => answers.agentFramework === 'CrewAI' && answers.crewType === 'Crews',\n default: 'MyCopilotCrew',\n validate: validateRequired,\n sanitize: sanitizers.trim\n },\n {\n type: 'input',\n name: 'crewUrl',\n message: '🔗 Enter your Crew\\'s Enterprise URL (more info at https://app.crewai.com):',\n when: (answers) => answers.agentFramework === 'CrewAI' && answers.crewType === 'Crews',\n validate: validateUrl,\n sanitize: sanitizers.url\n },\n {\n type: 'input',\n name: 'crewBearerToken',\n message: '🔑 Enter your Crew\\'s bearer token:',\n when: (answers) => answers.agentFramework === 'CrewAI' && answers.crewType === 'Crews',\n sensitive: true,\n validate: validateRequired,\n sanitize: sanitizers.trim\n },\n\n // CrewAI Flows specific questions - shown when CrewAI Flows selected\n {\n type: 'select',\n name: 'crewFlowAgent',\n message: '📦 Choose a CrewAI Flow Template',\n choices: Array.from(CREW_FLOW_TEMPLATES),\n when: (answers) => answers.agentFramework === 'CrewAI' && answers.crewType === 'Flows',\n },\n \n // LangGraph specific questions - shown when LangGraph selected\n {\n type: 'yes/no',\n name: 'alreadyDeployed',\n message: '🚀 Is your LangGraph agent already deployed?',\n when: (answers) => answers.agentFramework === 'LangGraph',\n validate: (input) => {\n try {\n YesNoSchema.parse(input);\n return true;\n } catch (error) {\n return 'Please select Yes or No';\n }\n }\n },\n {\n type: 'yes/no',\n name: 'langGraphPlatform',\n message: '🦜🔗 Is it hosted with LangGraph Platform (either self-hosted or in LangSmith)?',\n when: (answers) => \n answers.agentFramework === 'LangGraph' && \n answers.alreadyDeployed === 'Yes',\n validate: (input) => {\n try {\n YesNoSchema.parse(input);\n return true;\n } catch (error) {\n return 'Please select Yes or No';\n }\n }\n },\n {\n type: 'input',\n name: 'langGraphPlatformUrl',\n message: '🦜🔗 Enter your LangGraph platform URL:',\n when: (answers) => \n answers.agentFramework === 'LangGraph' && \n answers.alreadyDeployed === 'Yes' &&\n answers.langGraphPlatform === 'Yes',\n validate: validateUrl,\n sanitize: sanitizers.url\n },\n // {\n // type: 'input',\n // name: 'langGraphRemoteEndpointURL',\n // message: '🔌 Enter your LangGraph endpoint URL:',\n // when: (answers) => \n // answers.agentFramework === 'LangGraph' && \n // answers.alreadyDeployed === 'Yes' &&\n // answers.langGraphPlatform === 'No',\n // validate: validateUrl,\n // sanitize: sanitizers.url\n // },\n {\n type: 'select',\n name: 'langGraphAgent',\n message: '📦 Choose a LangGraph starter template:',\n choices: Array.from(LANGGRAPH_AGENTS),\n when: (answers) => \n answers.agentFramework === 'LangGraph' && \n answers.alreadyDeployed === 'No',\n },\n {\n type: 'input',\n name: 'langSmithApiKey',\n message: '🦜🔗 Enter your LangSmith API key (required by LangGraph Platform) :',\n when: (answers) => \n answers.agentFramework === 'LangGraph' && \n answers.langGraphPlatform === 'Yes',\n sensitive: true,\n validate: validateRequired,\n sanitize: sanitizers.apiKey\n },\n \n // Deployment options\n {\n type: 'yes/no',\n name: 'useCopilotCloud',\n message: '🪁 Deploy with Copilot Cloud? (recommended for production)',\n when: (answers) => \n !(answers.agentFramework === 'CrewAI' && answers.crewType === 'Crews') &&\n answers.crewType !== 'Flows' &&\n answers.alreadyDeployed === 'Yes' &&\n answers.langGraphPlatform !== 'No',\n validate: (input) => {\n try {\n YesNoSchema.parse(input);\n return true;\n } catch (error) {\n return 'Please select Yes or No';\n }\n }\n },\n // {\n // type: 'yes/no',\n // name: 'fastApiEnabled',\n // message: '⚡ Set up a FastAPI server for local development?',\n // when: (answers) => \n // answers.agentFramework === 'LangGraph' && \n // answers.alreadyDeployed === 'No' && \n // answers.langGraphAgent === 'Python Starter' &&\n // answers.useCopilotCloud !== 'Yes',\n // },\n \n // UI components - always shown last\n // {\n // type: 'select',\n // name: 'chatUi',\n // message: '💬 Select a UI component for your copilot:',\n // choices: Array.from(CHAT_COMPONENTS),\n // default: 'CopilotChat',\n // when: (answers) => answers.agentFramework === 'None',\n // },\n {\n type: 'input',\n name: 'llmToken',\n message: '🔑 Enter your OpenAI API key (required for agent functionality):',\n when: (answers) =>\n (answers.agentFramework === 'LangGraph' && answers.alreadyDeployed === 'No') ||\n (answers.agentFramework === 'CrewAI' && answers.crewType === 'Flows'),\n sensitive: true,\n validate: validateRequired,\n sanitize: sanitizers.apiKey\n },\n];\n\n","import spawn from \"cross-spawn\"\nimport { \n templateMapping, \n Config \n} from \"../types/index.js\"\n\nexport async function scaffoldShadCN(userAnswers: Config) {\n try {\n // Determine which components to install based on user choices\n const components: string[] = []\n \n // Add additional components based on agent framework\n switch (userAnswers.agentFramework) {\n case 'LangGraph':\n if (userAnswers.langGraphAgent) {\n components.push(...templateMapping.LangGraphStarter)\n } else {\n components.push(templateMapping.LangGraphGeneric)\n if (userAnswers.useCopilotCloud !== 'Yes') {\n if (userAnswers.langGraphPlatform === 'Yes') {\n components.push(templateMapping.LangGraphPlatformRuntime)\n } else {\n components.push(templateMapping.RemoteEndpoint)\n }\n }\n }\n break\n case 'CrewAI':\n if (userAnswers.crewType === 'Crews') {\n components.push(...templateMapping.CrewEnterprise)\n } else if (userAnswers.crewFlowAgent) {\n components.push(...templateMapping.CrewFlowsStarter)\n } else {\n components.push(templateMapping.RemoteEndpoint)\n }\n break\n default:\n components.push(templateMapping.RemoteEndpoint)\n break\n }\n \n // Small pause before running shadcn\n await new Promise(resolve => setTimeout(resolve, 100));\n \n try {\n // Run shadcn with inherited stdio for all streams to allow for user input\n const result = spawn.sync('npx', ['shadcn@latest', 'add', ...components], { \n stdio: 'inherit' // This ensures stdin/stdout/stderr are all passed through\n });\n \n if (result.status !== 0) {\n throw new Error(`The shadcn installation process exited with code ${result.status}`);\n }\n } catch (error) {\n throw error;\n }\n } catch (error) {\n throw error;\n }\n}","import path from \"path\"\nimport fs from \"fs\"\nimport { Config } from \"../types/index.js\"\nimport { getLangGraphAgents } from \"./langgraph-assistants.js\"\nimport inquirer from \"inquirer\"\n\nexport async function scaffoldEnv(flags: any, userAnswers: Config) {\n try {\n // Define the env file path\n const envFile = path.join(process.cwd(), '.env')\n \n // Create the env file if it doesn't exist\n if (!fs.existsSync(envFile)) {\n fs.writeFileSync(envFile, '', 'utf8')\n } else {\n }\n \n // Build environment variables based on user selections\n let newEnvValues = ''\n \n // Copilot Cloud API key\n if (userAnswers.copilotCloudPublicApiKey) {\n newEnvValues += `NEXT_PUBLIC_COPILOT_API_KEY=${userAnswers.copilotCloudPublicApiKey}\\n`\n }\n \n // LangSmith API key (for LangGraph)\n if (userAnswers.langSmithApiKey) {\n // Add both formats for compatibility\n newEnvValues += `LANGSMITH_API_KEY=${userAnswers.langSmithApiKey}\\n`\n }\n \n // LLM API key - set as both LLM_TOKEN and OPENAI_API_KEY for compatibility\n if (userAnswers.llmToken) {\n newEnvValues += `OPENAI_API_KEY=${userAnswers.llmToken}\\n`\n }\n \n // CrewAI name\n if (userAnswers.crewName) {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_AGENT_NAME=${userAnswers.crewName}\\n`\n }\n\n if (userAnswers.langGraphAgent) {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_AGENT_NAME=sample_agent\\n`\n newEnvValues += `LANGGRAPH_DEPLOYMENT_URL=http://localhost:8123\\n`\n } else if (userAnswers.langGraphPlatform === 'Yes' && userAnswers.useCopilotCloud === 'No') {\n newEnvValues += `LANGGRAPH_DEPLOYMENT_URL=${userAnswers.langGraphPlatformUrl}\\n`\n } else if (userAnswers.langGraphRemoteEndpointURL) {\n newEnvValues += `COPILOTKIT_REMOTE_ENDPOINT=${userAnswers.langGraphRemoteEndpointURL}\\n`\n }\n\n // Runtime URL if provided via flags\n if (flags.runtimeUrl) {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_RUNTIME_URL=${flags.runtimeUrl}\\n`\n } else if (userAnswers.useCopilotCloud !== 'Yes' && userAnswers.crewType !== 'Crews') {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_RUNTIME_URL=/api/copilotkit\\n`\n }\n\n if (userAnswers.crewFlowAgent === 'Starter') {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_AGENT_NAME=sample_agent\\n`\n }\n\n if (userAnswers.langGraphPlatformUrl && userAnswers.langSmithApiKey) {\n const langGraphAgents = await getLangGraphAgents(userAnswers.langGraphPlatformUrl, userAnswers.langSmithApiKey);\n let langGraphAgent = '';\n if (langGraphAgents.length > 1) {\n const { langGraphAgentChoice } = await inquirer.prompt([\n {\n type: 'list',\n name: 'langGraphAgentChoice',\n message: '🦜🔗 Which agent from your graph would you like to use?',\n choices: langGraphAgents.map((agent: any) => ({\n name: agent.graph_id,\n value: agent.graph_id,\n }))\n }\n ]);\n langGraphAgent = langGraphAgentChoice;\n } else if (langGraphAgents.length === 1) {\n langGraphAgent = langGraphAgents[0].graph_id;\n } else {\n throw new Error('No agents found in your LangGraph endpoint');\n }\n\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_AGENT_NAME=${langGraphAgent}\\n`\n }\n\n // Append the variables to the .env file\n if (newEnvValues) {\n fs.appendFileSync(envFile, newEnvValues)\n }\n } catch (error) {\n throw error;\n }\n}\n","export type LangGraphAgent = {\n assistant_id: string;\n graph_id: string;\n config: {\n tags: string[];\n recursion_limit: number;\n configurable: Record<string, any>;\n };\n created_at: string;\n updated_at: string;\n metadata: Record<string, any>;\n version: number;\n name: string;\n description: string;\n}\n\nexport async function getLangGraphAgents(url: string, langSmithApiKey: string) {\n try {\n const response = await fetch(`${url.trim().replace(/\\/$/, '')}/assistants/search`, \n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Api-Key': langSmithApiKey\n },\n body: JSON.stringify({\n limit: 10,\n offset: 0\n })\n })\n\n return await response.json() as LangGraphAgent[];\n } catch (error) {\n throw new Error(`Failed to get LangGraph agents: ${error}`);\n }\n}","import { execSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { Config } from '../types/index.js';\nimport chalk from \"chalk\"\nimport ora, {Ora} from \"ora\";\n\n/**\n * Clones a specific subdirectory from a GitHub repository\n * \n * @param githubUrl - The GitHub URL to the repository or subdirectory\n * @param destinationPath - The local path where the content should be copied\n * @param spinner - The spinner to update with progress information\n * @returns A boolean indicating success or failure\n */\nexport async function cloneGitHubSubdirectory(\n githubUrl: string,\n destinationPath: string,\n spinner: Ora\n): Promise<boolean> {\n try {\n // Parse the GitHub URL to extract repo info\n const { owner, repo, branch, subdirectoryPath } = parseGitHubUrl(githubUrl);\n \n spinner.text = chalk.cyan(`Cloning from ${owner}/${repo}...`);\n \n // Method 1: Use sparse checkout (more efficient than full clone)\n return await sparseCheckout(owner, repo, branch, subdirectoryPath, destinationPath, spinner);\n } catch (error) {\n spinner.text = chalk.red(`Failed to clone from GitHub: ${error}`);\n return false;\n }\n}\n\n/**\n * Uses Git sparse-checkout to efficiently download only the needed subdirectory\n */\nasync function sparseCheckout(\n owner: string,\n repo: string,\n branch: string,\n subdirectoryPath: string,\n destinationPath: string,\n spinner: Ora\n): Promise<boolean> {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'copilotkit-sparse-'));\n \n try {\n spinner.text = chalk.cyan('Creating temporary workspace...');\n \n // Initialize git repo\n execSync('git init', { cwd: tempDir, stdio: 'pipe' });\n \n spinner.text = chalk.cyan('Connecting to repository...');\n \n // Add remote\n execSync(`git remote add origin https://github.com/${owner}/${repo}.git`, { cwd: tempDir, stdio: 'pipe' });\n \n // Enable sparse checkout\n execSync('git config core.sparseCheckout true', { cwd: tempDir, stdio: 'pipe' });\n \n // Specify which subdirectory to checkout\n fs.writeFileSync(path.join(tempDir, '.git/info/sparse-checkout'), subdirectoryPath);\n \n spinner.text = chalk.cyan('Downloading agent files...');\n \n // Pull only the specified branch\n execSync(`git pull origin ${branch} --depth=1`, { cwd: tempDir, stdio: 'pipe' });\n \n // Copy the subdirectory to the destination\n const sourcePath = path.join(tempDir, subdirectoryPath);\n if (!fs.existsSync(sourcePath)) {\n throw new Error(`Subdirectory '${subdirectoryPath}' not found in the repository.`);\n }\n \n // Ensure destination directory exists\n fs.mkdirSync(destinationPath, { recursive: true });\n \n spinner.text = chalk.cyan('Installing agent files...');\n \n // Copy the subdirectory to the destination\n await copyDirectoryAsync(sourcePath, destinationPath);\n \n return true;\n } finally {\n // Clean up the temporary directory\n try {\n fs.rmSync(tempDir, { recursive: true, force: true });\n } catch (error) {\n console.warn(`Failed to clean up temporary directory: ${error}`);\n }\n }\n}\n\n/**\n * Recursively copies a directory with async pauses\n */\nasync function copyDirectoryAsync(source: string, destination: string): Promise<void> {\n // Create destination directory if it doesn't exist\n if (!fs.existsSync(destination)) {\n fs.mkdirSync(destination, { recursive: true });\n }\n \n // Read all files/directories from source\n const entries = fs.readdirSync(source, { withFileTypes: true });\n \n for (const entry of entries) {\n const srcPath = path.join(source, entry.name);\n const destPath = path.join(destination, entry.name);\n \n if (entry.isDirectory()) {\n // Recursively copy subdirectories\n await copyDirectoryAsync(srcPath, destPath);\n } else {\n // Copy files\n fs.copyFileSync(srcPath, destPath);\n }\n \n // For large directories, add small pauses\n if (entries.length > 10) {\n await new Promise(resolve => setTimeout(resolve, 1));\n }\n }\n}\n\n/**\n * Parses a GitHub URL to extract owner, repo, branch and subdirectory path\n */\nfunction parseGitHubUrl(githubUrl: string): { \n owner: string; \n repo: string; \n branch: string;\n subdirectoryPath: string;\n} {\n const url = new URL(githubUrl);\n \n if (url.hostname !== 'github.com') {\n throw new Error('Only GitHub URLs are supported');\n }\n \n const pathParts = url.pathname.split('/').filter(Boolean);\n \n if (pathParts.length < 2) {\n throw new Error('Invalid GitHub URL format');\n }\n \n const owner = pathParts[0];\n const repo = pathParts[1];\n let branch = 'main'; // Default branch\n let subdirectoryPath = '';\n \n if (pathParts.length > 3 && (pathParts[2] === 'tree' || pathParts[2] === 'blob')) {\n branch = pathParts[3];\n subdirectoryPath = pathParts.slice(4).join('/');\n }\n \n return { owner, repo, branch, subdirectoryPath };\n}\n\n/**\n * Validates if a string is a valid GitHub URL\n */\nexport function isValidGitHubUrl(url: string): boolean {\n try {\n const parsedUrl = new URL(url);\n return parsedUrl.hostname === 'github.com' && \n parsedUrl.pathname.split('/').filter(Boolean).length >= 2;\n } catch {\n return false;\n }\n}\n","/*\n Currently unusued but will be used in the future once we have more time to think\n about what to use outside of shadcn/ui.\n*/\n\nimport spawn from \"cross-spawn\";\nimport { Config } from \"../types/index.js\";\nimport chalk from \"chalk\";\nimport fs from \"fs\";\nimport ora from \"ora\";\n\ntype PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';\n\nexport async function scaffoldPackages(userAnswers: Config) {\n const spinner = ora({\n text: chalk.cyan('Preparing to install packages...'),\n color: 'cyan'\n }).start();\n\n try {\n const packages = [\n `@copilotkit/react-ui@${userAnswers.copilotKitVersion}`,\n `@copilotkit/react-core@${userAnswers.copilotKitVersion}`,\n `@copilotkit/runtime@${userAnswers.copilotKitVersion}`,\n ];\n\n // Small pause before starting\n await new Promise(resolve => setTimeout(resolve, 50));\n\n const packageManager = detectPackageManager();\n const installCommand = detectInstallCommand(packageManager);\n \n spinner.text = chalk.cyan(`Using ${packageManager} to install packages...`);\n \n // Pause the spinner for the package installation\n spinner.stop();\n \n console.log(chalk.cyan('\\n⚙️ Installing packages...\\n'));\n \n const result = spawn.sync(packageManager, [installCommand, ...packages], { \n stdio: 'inherit' // This ensures stdin/stdout/stderr are all passed through\n });\n \n if (result.status !== 0) {\n throw new Error(`Package installation process exited with code ${result.status}`);\n }\n \n // Resume the spinner for success message\n spinner.start();\n spinner.succeed(chalk.green('CopilotKit packages installed successfully'));\n } catch (error) {\n // Use spinner for consistent error reporting\n if (!spinner.isSpinning) {\n spinner.start();\n }\n spinner.fail(chalk.red('Failed to install CopilotKit packages'));\n throw error;\n }\n}\n\nfunction detectPackageManager(): PackageManager {\n // Check for lock files in the current directory\n const files = fs.readdirSync(process.cwd());\n \n if (files.includes('bun.lockb')) return 'bun';\n if (files.includes('pnpm-lock.yaml')) return 'pnpm';\n if (files.includes('yarn.lock')) return 'yarn';\n if (files.includes('package-lock.json')) return 'npm';\n\n // Default to npm if no lock file found\n return 'npm';\n}\n\nfunction detectInstallCommand(packageManager: PackageManager): string {\n switch (packageManager) {\n case 'yarn':\n case 'pnpm':\n return 'add';\n default:\n return 'install';\n }\n}","import ora from \"ora\"\nimport chalk from \"chalk\"\nimport { cloneGitHubSubdirectory } from \"./github.js\"\nimport { Config } from \"../types/index.js\"\nimport path from \"path\"\nimport fs from \"fs\"\n\nexport async function scaffoldAgent(userAnswers: Config) {\n if (\n (userAnswers.agentFramework === 'CrewAI' && userAnswers.crewType === 'Crews') ||\n (userAnswers.agentFramework === 'LangGraph' && !userAnswers.langGraphAgent)\n ) {\n return;\n }\n \n const spinner = ora({\n text: chalk.cyan('Setting up AI agent...'),\n color: 'cyan'\n }).start();\n\n let template = \"\";\n switch (userAnswers.agentFramework) {\n case 'LangGraph':\n if (userAnswers.langGraphAgent === 'Python Starter') {\n template = AgentTemplates.LangGraph.Starter.Python;\n } else {\n template = AgentTemplates.LangGraph.Starter.TypeScript;\n }\n break;\n case 'CrewAI':\n if (userAnswers.crewFlowAgent === 'Starter') {\n template = AgentTemplates.CrewAI.Flows.Starter;\n }\n break;\n }\n\n if (!template) {\n spinner.fail(chalk.red('Failed to determine agent template'));\n throw new Error('Failed to determine agent template');\n }\n\n const agentDir = path.join(process.cwd(), 'agent');\n\n try {\n await cloneGitHubSubdirectory(\n template, \n agentDir,\n spinner\n );\n\n // Create .env file in the agent directory\n spinner.text = chalk.cyan('Creating agent environment variables...');\n \n let envContent = '';\n \n // Add OpenAI API key if provided\n if (userAnswers.llmToken) {\n envContent += `OPENAI_API_KEY=${userAnswers.llmToken}\\n`;\n }\n \n // Add LangSmith API key for LangGraph\n if (userAnswers.agentFramework === 'LangGraph' && userAnswers.langSmithApiKey) {\n envContent += `LANGSMITH_API_KEY=${userAnswers.langSmithApiKey}\\n`;\n }\n \n if (envContent) {\n const agentEnvFile = path.join(agentDir, '.env');\n fs.writeFileSync(agentEnvFile, envContent, 'utf8');\n spinner.text = chalk.cyan('Added API keys to agent .env file');\n }\n\n } catch (error) {\n spinner.fail(chalk.red('Failed to clone agent template'));\n throw error;\n }\n\n spinner.succeed(`${userAnswers.agentFramework} agent cloned successfully`);\n}\n\nexport const AgentTemplates = {\n LangGraph: {\n Starter: {\n Python: 'https://github.com/CopilotKit/coagents-starter-langgraph/tree/main/agent-py',\n TypeScript: 'https://github.com/CopilotKit/coagents-starter-langgraph/tree/main/agent-js',\n }\n },\n CrewAI: {\n Flows: {\n Starter: 'https://github.com/CopilotKit/coagents-starter-crewai-flows/tree/main/agent-py',\n }\n },\n}","import * as fs from 'fs/promises';\nimport ora from 'ora';\nimport * as path from 'path';\n\n\nexport async function addCrewInputs(url: string, token: string) {\n try {\n const spinner = ora('Analyzing crew inputs...').start();\n // Get inputs from the crew API\n const inputs = await getCrewInputs(url, token);\n spinner.text = 'Adding inputs to app/copilotkit/page.tsx...';\n \n // Path to the file we need to modify\n let filePath = path.join(process.cwd(), 'app', 'copilotkit', 'page.tsx');\n\n // check if non-src file exists\n try { \n await fs.access(filePath) \n } catch { \n filePath = path.join(process.cwd(), 'src', 'app', 'copilotkit', 'page.tsx');\n }\n\n // check if src file exists\n try {\n await fs.access(filePath)\n } catch {\n throw new Error('app/copilotkit/page.tsx and src/app/copilotkit/page.tsx not found');\n }\n \n // Read the file content\n let fileContent = await fs.readFile(filePath, 'utf8');\n \n // Replace all instances of \"YOUR_INPUTS_HERE\" with the inputs array as a string\n const inputsString = JSON.stringify(inputs);\n fileContent = fileContent.replace(/\\[[\"']YOUR_INPUTS_HERE[\"']\\]/g, inputsString);\n \n // Write the updated content back to the file\n await fs.writeFile(filePath, fileContent, 'utf8');\n\n spinner.succeed('Successfully added crew inputs to app/copilotkit/page.tsx');\n } catch (error) {\n console.error('Error updating crew inputs:', error);\n throw error;\n }\n}\n\nasync function getCrewInputs(url: string, token: string): Promise<string[]> {\n const response = await fetch(`${url.trim()}/inputs`, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch inputs: ${response.statusText}`);\n }\n\n const data = await response.json() as { inputs: string[] };\n return data.inputs;\n}\n\n"],"mappings":";AAAA,SAAS,SAAS;AAClB,SAAS,aAAa;AAGf,IAAM,mBAAmB,CAAC,UAAU,WAAW;AAC/C,IAAM,aAAa,CAAC,SAAS,OAAO;AACpC,IAAM,kBAAkB,CAAC,eAAc,kBAAkB,YAAY,cAAc;AACnF,IAAM,mBAAmB,CAAC,kBAAkB,oBAAoB;AAChE,IAAM,sBAAsB,CAAC,SAAS;AACtC,IAAM,SAAS,CAAC,OAAO,IAAI;AAG3B,IAAM,aAAa;AAAA;AAAA,EAExB,KAAK,CAAC,UAA0B;AAC9B,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO,MAAM,KAAK,EAAE,QAAQ,QAAQ,EAAE;AAAA,EACxC;AAAA;AAAA,EAGA,MAAM,CAAC,UAA0B;AAC/B,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO,MAAM,KAAK;AAAA,EACpB;AAAA;AAAA,EAGA,WAAW,CAAC,UAA0B;AACpC,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO,MAAM,YAAY,EAAE,KAAK;AAAA,EAClC;AAAA;AAAA,EAGA,QAAQ,CAAC,UAA0B;AACjC,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO,MAAM,KAAK,EAAE,QAAQ,OAAO,EAAE;AAAA,EACvC;AACF;AAKO,IAAM,uBAAuB,EAAE,KAAK,gBAAgB;AACpD,IAAM,iBAAiB,EAAE,KAAK,UAAU;AACxC,IAAM,sBAAsB,EAAE,KAAK,eAAe;AAClD,IAAM,uBAAuB,EAAE,KAAK,gBAAgB;AACpD,IAAM,yBAAyB,EAAE,KAAK,mBAAmB;AACzD,IAAM,cAAc,EAAE,KAAK,MAAM;AAGjC,IAAM,YAAY,EAAE;AAAA,EACzB,SAAO,WAAW,IAAI,OAAO,GAAG,CAAC;AAAA,EACjC,EAAE,OAAO,EAAE,IAAI,0BAA0B,EAAE,IAAI,GAAG,iBAAiB;AACrE;AAGO,IAAM,cAAc,EAAE;AAAA,EAC3B,SAAO,WAAW,KAAK,OAAO,GAAG,CAAC;AAAA,EAClC,EAAE,OAAO,EAAE,IAAI,GAAG,mBAAmB;AACvC;AAGO,IAAM,eAAe,EAAE;AAAA,EAC5B,SAAO,WAAW,OAAO,OAAO,GAAG,CAAC;AAAA,EACpC,EAAE,OAAO,EAAE,IAAI,GAAG,qBAAqB;AACzC;AAGO,IAAM,aAAa,EAAE;AAAA,EAC1B,SAAO,WAAW,KAAK,OAAO,GAAG,CAAC;AAAA,EAClC,EAAE,OAAO,EAAE,IAAI,GAAG,kBAAkB;AACtC;AAGO,IAAM,eAAe,EAAE,OAAO;AAAA;AAAA,EAEnC,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,gBAAgB;AAAA,EAChB,QAAQ,oBAAoB,SAAS;AAAA;AAAA,EAGrC,iBAAiB,YAAY,SAAS;AAAA,EACtC,gBAAgB,YAAY,SAAS;AAAA,EACrC,iBAAiB,YAAY,SAAS;AAAA;AAAA,EAGtC,gBAAgB,qBAAqB,SAAS;AAAA,EAC9C,mBAAmB,YAAY,SAAS;AAAA,EACxC,sBAAsB,UAAU,SAAS;AAAA,EACzC,4BAA4B,UAAU,SAAS;AAAA;AAAA,EAG/C,UAAU,eAAe,SAAS;AAAA,EAClC,UAAU,WAAW,SAAS;AAAA,EAC9B,SAAS,UAAU,SAAS;AAAA,EAC5B,iBAAiB,YAAY,SAAS;AAAA,EACtC,eAAe,uBAAuB,SAAS;AAAA;AAAA,EAG/C,0BAA0B,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9C,iBAAiB,aAAa,SAAS;AAAA,EACvC,UAAU,aAAa,SAAS;AAClC,CAAC,EACA;AAAA,EACC,CAAC,SAAS;AAER,QAAI,KAAK,mBAAmB,YAAY,KAAK,aAAa,SAAS;AACjE,aAAO,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,KAAK;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,MAAM,CAAC,WAAW,iBAAiB;AAAA,EACrC;AACF,EACC;AAAA,EACC,CAAC,SAAS;AAER,QACE,KAAK,mBAAmB,eACxB,KAAK,oBAAoB,SACzB,KAAK,sBAAsB,OAC3B;AACA,aAAO,CAAC,CAAC,KAAK,wBAAwB,CAAC,CAAC,KAAK;AAAA,IAC/C;AACA,WAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,MAAM,CAAC,wBAAwB,iBAAiB;AAAA,EAClD;AACF;AAmBO,IAAM,cAAc;AAAA,EACzB,mBAAmB,MAAM,OAAO,EAAC,aAAa,yCAAwC,CAAC;AAAA,EACvF,gBAAgB,MAAM,OAAO,EAAC,aAAa,yCAAyC,SAAS,iBAAgB,CAAC;AAAA,EAC9G,gBAAgB,MAAM,OAAO,EAAC,aAAa,2CAA2C,SAAS,OAAM,CAAC;AAAA,EACtG,iBAAiB,MAAM,OAAO,EAAC,aAAa,kDAAkD,SAAS,OAAM,CAAC;AAAA,EAC9G,QAAQ,MAAM,OAAO,EAAC,aAAa,wCAAwC,SAAS,gBAAe,CAAC;AAAA,EACpG,gBAAgB,MAAM,OAAO,EAAC,aAAa,mCAAmC,SAAS,iBAAgB,CAAC;AAAA,EACxG,UAAU,MAAM,OAAO,EAAC,aAAa,8BAA8B,SAAS,WAAU,CAAC;AAAA,EACvF,UAAU,MAAM,OAAO,EAAC,aAAa,6BAA4B,CAAC;AAAA,EAClE,SAAS,MAAM,OAAO,EAAC,aAAa,qCAAoC,CAAC;AAAA,EACzE,iBAAiB,MAAM,OAAO,EAAC,aAAa,yCAAwC,CAAC;AAAA,EACrF,iBAAiB,MAAM,OAAO,EAAC,aAAa,gDAA+C,CAAC;AAAA,EAC5F,UAAU,MAAM,OAAO,EAAC,aAAa,0CAAyC,CAAC;AAAA,EAC/E,eAAe,MAAM,OAAO,EAAC,aAAa,+BAA+B,SAAS,oBAAmB,CAAC;AACxG;;;ACtJA,IAAM,WAAW;AAEV,IAAM,kBAAkB;AAAA,EAC3B,4BAA4B,GAAG,QAAQ;AAAA,EACvC,kBAAkB,GAAG,QAAQ;AAAA,EAC7B,kBAAkB;AAAA,IACd,GAAG,QAAQ;AAAA,EACf;AAAA,EAEA,oBAAoB,GAAG,QAAQ;AAAA,EAE/B,oBAAoB;AAAA,IAChB,GAAG,QAAQ;AAAA,IACX,GAAG,QAAQ;AAAA,IACX,GAAG,QAAQ;AAAA,EACf;AAAA,EAEA,oBAAoB;AAAA,IAChB,GAAG,QAAQ;AAAA,IACX,GAAG,QAAQ;AAAA,EACf;AAAA,EAEA,YAAY,GAAG,QAAQ;AAAA,EACvB,eAAe,GAAG,QAAQ;AAAA,EAC1B,gBAAgB,GAAG,QAAQ;AAAA,EAC3B,kBAAkB,GAAG,QAAQ;AACjC;;;ACzBA,IAAM,cAAc,CAAC,UAAiC;AACpD,MAAI;AAEF,UAAM,YAAY,WAAW,IAAI,KAAK;AAEtC,UAAM,SAAS,UAAU,UAAU,SAAS;AAC5C,QAAI,OAAO,QAAS,QAAO;AAC3B,WAAO,OAAO,MAAM,OAAO,CAAC,GAAG,WAAW;AAAA,EAC5C,SAAS,OAAO;AACd,WAAO;AAAA,EACT;AACF;AAEA,IAAM,mBAAmB,CAAC,UAAiC;AACzD,SAAO,WAAW,KAAK,KAAK,IAAI,OAAO;AACzC;AAIO,IAAM,YAAwB;AAAA;AAAA,EAEnC;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS,MAAM,KAAK,gBAAgB;AAAA,IACpC,UAAU,CAAC,UAAU;AACnB,UAAI;AACF,6BAAqB,MAAM,KAAK;AAChC,eAAO;AAAA,MACT,SAAS,OAAO;AACd,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS,MAAM,KAAK,UAAU;AAAA,IAC9B,MAAM,CAAC,YAAY,QAAQ,mBAAmB;AAAA,IAC9C,UAAU,CAAC,UAAU;AACnB,UAAI;AACF,uBAAe,MAAM,KAAK;AAC1B,eAAO;AAAA,MACT,SAAS,OAAO;AACd,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,YAAY,QAAQ,mBAAmB,YAAY,QAAQ,aAAa;AAAA,IAC/E,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU,WAAW;AAAA,EACvB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,YAAY,QAAQ,mBAAmB,YAAY,QAAQ,aAAa;AAAA,IAC/E,UAAU;AAAA,IACV,UAAU,WAAW;AAAA,EACvB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,YAAY,QAAQ,mBAAmB,YAAY,QAAQ,aAAa;AAAA,IAC/E,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU,WAAW;AAAA,EACvB;AAAA;AAAA,EAGA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS,MAAM,KAAK,mBAAmB;AAAA,IACvC,MAAM,CAAC,YAAY,QAAQ,mBAAmB,YAAY,QAAQ,aAAa;AAAA,EACjF;AAAA;AAAA,EAGA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,YAAY,QAAQ,mBAAmB;AAAA,IAC9C,UAAU,CAAC,UAAU;AACnB,UAAI;AACF,oBAAY,MAAM,KAAK;AACvB,eAAO;AAAA,MACT,SAAS,OAAO;AACd,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,YACL,QAAQ,mBAAmB,eAC3B,QAAQ,oBAAoB;AAAA,IAC9B,UAAU,CAAC,UAAU;AACnB,UAAI;AACF,oBAAY,MAAM,KAAK;AACvB,eAAO;AAAA,MACT,SAAS,OAAO;AACd,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,YACL,QAAQ,mBAAmB,eAC3B,QAAQ,oBAAoB,SAC5B,QAAQ,sBAAsB;AAAA,IAChC,UAAU;AAAA,IACV,UAAU,WAAW;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS,MAAM,KAAK,gBAAgB;AAAA,IACpC,MAAM,CAAC,YACL,QAAQ,mBAAmB,eAC3B,QAAQ,oBAAoB;AAAA,EAChC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,YACL,QAAQ,mBAAmB,eAC3B,QAAQ,sBAAsB;AAAA,IAChC,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU,WAAW;AAAA,EACvB;AAAA;AAAA,EAGA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,YACL,EAAE,QAAQ,mBAAmB,YAAY,QAAQ,aAAa,YAC9D,QAAQ,aAAa,WACrB,QAAQ,oBAAoB,SAC5B,QAAQ,sBAAsB;AAAA,IAChC,UAAU,CAAC,UAAU;AACnB,UAAI;AACF,oBAAY,MAAM,KAAK;AACvB,eAAO;AAAA,MACT,SAAS,OAAO;AACd,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,CAAC,YACJ,QAAQ,mBAAmB,eAAe,QAAQ,oBAAoB,QACtE,QAAQ,mBAAmB,YAAY,QAAQ,aAAa;AAAA,IAC/D,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU,WAAW;AAAA,EACvB;AACF;;;ACrOA,OAAO,WAAW;AAMlB,eAAsB,eAAe,aAAqB;AACxD,MAAI;AAEF,UAAM,aAAuB,CAAC;AAG9B,YAAQ,YAAY,gBAAgB;AAAA,MAClC,KAAK;AACH,YAAI,YAAY,gBAAgB;AAC9B,qBAAW,KAAK,GAAG,gBAAgB,gBAAgB;AAAA,QACrD,OAAO;AACL,qBAAW,KAAK,gBAAgB,gBAAgB;AAChD,cAAI,YAAY,oBAAoB,OAAO;AACzC,gBAAI,YAAY,sBAAsB,OAAO;AAC3C,yBAAW,KAAK,gBAAgB,wBAAwB;AAAA,YAC1D,OAAO;AACL,yBAAW,KAAK,gBAAgB,cAAc;AAAA,YAChD;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF,KAAK;AACH,YAAI,YAAY,aAAa,SAAS;AACpC,qBAAW,KAAK,GAAG,gBAAgB,cAAc;AAAA,QACnD,WAAW,YAAY,eAAe;AACpC,qBAAW,KAAK,GAAG,gBAAgB,gBAAgB;AAAA,QACrD,OAAO;AACL,qBAAW,KAAK,gBAAgB,cAAc;AAAA,QAChD;AACA;AAAA,MACF;AACE,mBAAW,KAAK,gBAAgB,cAAc;AAC9C;AAAA,IACJ;AAGA,UAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,GAAG,CAAC;AAErD,QAAI;AAEF,YAAM,SAAS,MAAM,KAAK,OAAO,CAAC,iBAAiB,OAAO,GAAG,UAAU,GAAG;AAAA,QACxE,OAAO;AAAA;AAAA,MACT,CAAC;AAED,UAAI,OAAO,WAAW,GAAG;AACvB,cAAM,IAAI,MAAM,oDAAoD,OAAO,MAAM,EAAE;AAAA,MACrF;AAAA,IACF,SAAS,OAAO;AACd,YAAM;AAAA,IACR;AAAA,EACF,SAAS,OAAO;AACd,UAAM;AAAA,EACR;AACF;;;AC3DA,OAAO,UAAU;AACjB,OAAO,QAAQ;;;ACef,eAAsB,mBAAmB,KAAa,iBAAyB;AAC7E,MAAI;AACF,UAAM,WAAW,MAAM;AAAA,MAAM,GAAG,IAAI,KAAK,EAAE,QAAQ,OAAO,EAAE,CAAC;AAAA,MAC3D;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACT,gBAAgB;AAAA,UAChB,aAAa;AAAA,QACf;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,OAAO;AAAA,UACP,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IAAC;AAED,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,mCAAmC,KAAK,EAAE;AAAA,EAC5D;AACF;;;AD/BA,OAAO,cAAc;AAErB,eAAsB,YAAY,OAAY,aAAqB;AACjE,MAAI;AAEF,UAAM,UAAU,KAAK,KAAK,QAAQ,IAAI,GAAG,MAAM;AAG/C,QAAI,CAAC,GAAG,WAAW,OAAO,GAAG;AAC3B,SAAG,cAAc,SAAS,IAAI,MAAM;AAAA,IACtC,OAAO;AAAA,IACP;AAGA,QAAI,eAAe;AAGnB,QAAI,YAAY,0BAA0B;AACxC,sBAAgB,+BAA+B,YAAY,wBAAwB;AAAA;AAAA,IACrF;AAGA,QAAI,YAAY,iBAAiB;AAE/B,sBAAgB,qBAAqB,YAAY,eAAe;AAAA;AAAA,IAClE;AAGA,QAAI,YAAY,UAAU;AACxB,sBAAgB,kBAAkB,YAAY,QAAQ;AAAA;AAAA,IACxD;AAGA,QAAI,YAAY,UAAU;AACxB,sBAAgB,qCAAqC,YAAY,QAAQ;AAAA;AAAA,IAC3E;AAEA,QAAI,YAAY,gBAAgB;AAC9B,sBAAgB;AAAA;AAChB,sBAAgB;AAAA;AAAA,IAClB,WAAW,YAAY,sBAAsB,SAAS,YAAY,oBAAoB,MAAM;AAC1F,sBAAgB,4BAA4B,YAAY,oBAAoB;AAAA;AAAA,IAC9E,WAAW,YAAY,4BAA4B;AACjD,sBAAgB,8BAA8B,YAAY,0BAA0B;AAAA;AAAA,IACtF;AAGA,QAAI,MAAM,YAAY;AACpB,sBAAgB,sCAAsC,MAAM,UAAU;AAAA;AAAA,IACxE,WAAW,YAAY,oBAAoB,SAAS,YAAY,aAAa,SAAS;AACpF,sBAAgB;AAAA;AAAA,IAClB;AAEA,QAAI,YAAY,kBAAkB,WAAW;AAC3C,sBAAgB;AAAA;AAAA,IAClB;AAEA,QAAI,YAAY,wBAAwB,YAAY,iBAAiB;AACnE,YAAM,kBAAkB,MAAM,mBAAmB,YAAY,sBAAsB,YAAY,eAAe;AAC9G,UAAI,iBAAiB;AACrB,UAAI,gBAAgB,SAAS,GAAG;AAC9B,cAAM,EAAE,qBAAqB,IAAI,MAAM,SAAS,OAAO;AAAA,UACrD;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,gBAAgB,IAAI,CAAC,WAAgB;AAAA,cAC5C,MAAM,MAAM;AAAA,cACZ,OAAO,MAAM;AAAA,YACf,EAAE;AAAA,UACJ;AAAA,QACF,CAAC;AACD,yBAAiB;AAAA,MACnB,WAAW,gBAAgB,WAAW,GAAG;AACvC,yBAAiB,gBAAgB,CAAC,EAAE;AAAA,MACtC,OAAO;AACL,cAAM,IAAI,MAAM,4CAA4C;AAAA,MAC9D;AAEA,sBAAgB,qCAAqC,cAAc;AAAA;AAAA,IACrE;AAGA,QAAI,cAAc;AAChB,SAAG,eAAe,SAAS,YAAY;AAAA,IACzC;AAAA,EACF,SAAS,OAAO;AACd,UAAM;AAAA,EACR;AACF;;;AE7FA,SAAS,gBAAgB;AACzB,YAAYA,SAAQ;AACpB,YAAYC,WAAU;AACtB,YAAY,QAAQ;AAEpB,OAAO,WAAW;AAWlB,eAAsB,wBACpB,WACA,iBACA,SACkB;AAClB,MAAI;AAEF,UAAM,EAAE,OAAO,MAAM,QAAQ,iBAAiB,IAAI,eAAe,SAAS;AAE1E,YAAQ,OAAO,MAAM,KAAK,gBAAgB,KAAK,IAAI,IAAI,KAAK;AAG5D,WAAO,MAAM,eAAe,OAAO,MAAM,QAAQ,kBAAkB,iBAAiB,OAAO;AAAA,EAC7F,SAAS,OAAO;AACd,YAAQ,OAAO,MAAM,IAAI,gCAAgC,KAAK,EAAE;AAChE,WAAO;AAAA,EACT;AACF;AAKA,eAAe,eACb,OACA,MACA,QACA,kBACA,iBACA,SACkB;AAClB,QAAM,UAAa,gBAAiB,WAAQ,UAAO,GAAG,oBAAoB,CAAC;AAE3E,MAAI;AACF,YAAQ,OAAO,MAAM,KAAK,iCAAiC;AAG3D,aAAS,YAAY,EAAE,KAAK,SAAS,OAAO,OAAO,CAAC;AAEpD,YAAQ,OAAO,MAAM,KAAK,6BAA6B;AAGvD,aAAS,4CAA4C,KAAK,IAAI,IAAI,QAAQ,EAAE,KAAK,SAAS,OAAO,OAAO,CAAC;AAGzG,aAAS,uCAAuC,EAAE,KAAK,SAAS,OAAO,OAAO,CAAC;AAG/E,IAAG,kBAAmB,WAAK,SAAS,2BAA2B,GAAG,gBAAgB;AAElF,YAAQ,OAAO,MAAM,KAAK,4BAA4B;AAGtD,aAAS,mBAAmB,MAAM,cAAc,EAAE,KAAK,SAAS,OAAO,OAAO,CAAC;AAG/E,UAAM,aAAkB,WAAK,SAAS,gBAAgB;AACtD,QAAI,CAAI,eAAW,UAAU,GAAG;AAC9B,YAAM,IAAI,MAAM,iBAAiB,gBAAgB,gCAAgC;AAAA,IACnF;AAGA,IAAG,cAAU,iBAAiB,EAAE,WAAW,KAAK,CAAC;AAEjD,YAAQ,OAAO,MAAM,KAAK,2BAA2B;AAGrD,UAAM,mBAAmB,YAAY,eAAe;AAEpD,WAAO;AAAA,EACT,UAAE;AAEA,QAAI;AACF,MAAG,WAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACrD,SAAS,OAAO;AACd,cAAQ,KAAK,2CAA2C,KAAK,EAAE;AAAA,IACjE;AAAA,EACF;AACF;AAKA,eAAe,mBAAmB,QAAgB,aAAoC;AAEpF,MAAI,CAAI,eAAW,WAAW,GAAG;AAC/B,IAAG,cAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,EAC/C;AAGA,QAAM,UAAa,gBAAY,QAAQ,EAAE,eAAe,KAAK,CAAC;AAE9D,aAAW,SAAS,SAAS;AAC3B,UAAM,UAAe,WAAK,QAAQ,MAAM,IAAI;AAC5C,UAAM,WAAgB,WAAK,aAAa,MAAM,IAAI;AAElD,QAAI,MAAM,YAAY,GAAG;AAEvB,YAAM,mBAAmB,SAAS,QAAQ;AAAA,IAC5C,OAAO;AAEL,MAAG,iBAAa,SAAS,QAAQ;AAAA,IACnC;AAGA,QAAI,QAAQ,SAAS,IAAI;AACvB,YAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,CAAC,CAAC;AAAA,IACrD;AAAA,EACF;AACF;AAKA,SAAS,eAAe,WAKtB;AACA,QAAM,MAAM,IAAI,IAAI,SAAS;AAE7B,MAAI,IAAI,aAAa,cAAc;AACjC,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AAEA,QAAM,YAAY,IAAI,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;AAExD,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AAEA,QAAM,QAAQ,UAAU,CAAC;AACzB,QAAM,OAAO,UAAU,CAAC;AACxB,MAAI,SAAS;AACb,MAAI,mBAAmB;AAEvB,MAAI,UAAU,SAAS,MAAM,UAAU,CAAC,MAAM,UAAU,UAAU,CAAC,MAAM,SAAS;AAChF,aAAS,UAAU,CAAC;AACpB,uBAAmB,UAAU,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,EAChD;AAEA,SAAO,EAAE,OAAO,MAAM,QAAQ,iBAAiB;AACjD;AAKO,SAAS,iBAAiB,KAAsB;AACrD,MAAI;AACF,UAAM,YAAY,IAAI,IAAI,GAAG;AAC7B,WAAO,UAAU,aAAa,gBACvB,UAAU,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,UAAU;AAAA,EACjE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACtKA,OAAOC,YAAW;AAElB,OAAOC,YAAW;AAClB,OAAOC,SAAQ;AACf,OAAO,SAAS;AAIhB,eAAsB,iBAAiB,aAAqB;AAC1D,QAAM,UAAU,IAAI;AAAA,IAClB,MAAMD,OAAM,KAAK,kCAAkC;AAAA,IACnD,OAAO;AAAA,EACT,CAAC,EAAE,MAAM;AAET,MAAI;AACF,UAAM,WAAW;AAAA,MACf,wBAAwB,YAAY,iBAAiB;AAAA,MACrD,0BAA0B,YAAY,iBAAiB;AAAA,MACvD,uBAAuB,YAAY,iBAAiB;AAAA,IACtD;AAGA,UAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,EAAE,CAAC;AAEpD,UAAM,iBAAiB,qBAAqB;AAC5C,UAAM,iBAAiB,qBAAqB,cAAc;AAE1D,YAAQ,OAAOA,OAAM,KAAK,SAAS,cAAc,yBAAyB;AAG1E,YAAQ,KAAK;AAEb,YAAQ,IAAIA,OAAM,KAAK,0CAAgC,CAAC;AAExD,UAAM,SAASD,OAAM,KAAK,gBAAgB,CAAC,gBAAgB,GAAG,QAAQ,GAAG;AAAA,MACvE,OAAO;AAAA;AAAA,IACT,CAAC;AAED,QAAI,OAAO,WAAW,GAAG;AACvB,YAAM,IAAI,MAAM,iDAAiD,OAAO,MAAM,EAAE;AAAA,IAClF;AAGA,YAAQ,MAAM;AACd,YAAQ,QAAQC,OAAM,MAAM,4CAA4C,CAAC;AAAA,EAC3E,SAAS,OAAO;AAEd,QAAI,CAAC,QAAQ,YAAY;AACvB,cAAQ,MAAM;AAAA,IAChB;AACA,YAAQ,KAAKA,OAAM,IAAI,uCAAuC,CAAC;AAC/D,UAAM;AAAA,EACR;AACF;AAEA,SAAS,uBAAuC;AAE9C,QAAM,QAAQC,IAAG,YAAY,QAAQ,IAAI,CAAC;AAE1C,MAAI,MAAM,SAAS,WAAW,EAAG,QAAO;AACxC,MAAI,MAAM,SAAS,gBAAgB,EAAG,QAAO;AAC7C,MAAI,MAAM,SAAS,WAAW,EAAG,QAAO;AACxC,MAAI,MAAM,SAAS,mBAAmB,EAAG,QAAO;AAGhD,SAAO;AACT;AAEA,SAAS,qBAAqB,gBAAwC;AACpE,UAAQ,gBAAgB;AAAA,IACtB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;ACjFA,OAAOC,UAAS;AAChB,OAAOC,YAAW;AAGlB,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AAEf,eAAsB,cAAc,aAAqB;AACvD,MACG,YAAY,mBAAmB,YAAY,YAAY,aAAa,WACpE,YAAY,mBAAmB,eAAe,CAAC,YAAY,gBAC5D;AACA;AAAA,EACF;AAEA,QAAM,UAAUC,KAAI;AAAA,IAClB,MAAMC,OAAM,KAAK,wBAAwB;AAAA,IACzC,OAAO;AAAA,EACT,CAAC,EAAE,MAAM;AAET,MAAI,WAAW;AACf,UAAQ,YAAY,gBAAgB;AAAA,IAClC,KAAK;AACH,UAAI,YAAY,mBAAmB,kBAAkB;AACnD,mBAAW,eAAe,UAAU,QAAQ;AAAA,MAC9C,OAAO;AACL,mBAAW,eAAe,UAAU,QAAQ;AAAA,MAC9C;AACA;AAAA,IACF,KAAK;AACH,UAAI,YAAY,kBAAkB,WAAW;AAC3C,mBAAW,eAAe,OAAO,MAAM;AAAA,MACzC;AACA;AAAA,EACJ;AAEA,MAAI,CAAC,UAAU;AACb,YAAQ,KAAKA,OAAM,IAAI,oCAAoC,CAAC;AAC5D,UAAM,IAAI,MAAM,oCAAoC;AAAA,EACtD;AAEA,QAAM,WAAWH,MAAK,KAAK,QAAQ,IAAI,GAAG,OAAO;AAEjD,MAAI;AACF,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,YAAQ,OAAOG,OAAM,KAAK,yCAAyC;AAEnE,QAAI,aAAa;AAGjB,QAAI,YAAY,UAAU;AACxB,oBAAc,kBAAkB,YAAY,QAAQ;AAAA;AAAA,IACtD;AAGA,QAAI,YAAY,mBAAmB,eAAe,YAAY,iBAAiB;AAC7E,oBAAc,qBAAqB,YAAY,eAAe;AAAA;AAAA,IAChE;AAEA,QAAI,YAAY;AACd,YAAM,eAAeH,MAAK,KAAK,UAAU,MAAM;AAC/C,MAAAC,IAAG,cAAc,cAAc,YAAY,MAAM;AACjD,cAAQ,OAAOE,OAAM,KAAK,mCAAmC;AAAA,IAC/D;AAAA,EAEF,SAAS,OAAO;AACd,YAAQ,KAAKA,OAAM,IAAI,gCAAgC,CAAC;AACxD,UAAM;AAAA,EACR;AAEA,UAAQ,QAAQ,GAAG,YAAY,cAAc,4BAA4B;AAC3E;AAEO,IAAM,iBAAiB;AAAA,EAC5B,WAAW;AAAA,IACT,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,YAAY;AAAA,IACd;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,MACL,SAAS;AAAA,IACX;AAAA,EACF;AACF;;;AC3FA,YAAYC,SAAQ;AACpB,OAAOC,UAAS;AAChB,YAAYC,WAAU;AAGtB,eAAsB,cAAc,KAAa,OAAe;AAC9D,MAAI;AACF,UAAM,UAAUD,KAAI,0BAA0B,EAAE,MAAM;AAEtD,UAAM,SAAS,MAAM,cAAc,KAAK,KAAK;AAC7C,YAAQ,OAAO;AAGf,QAAI,WAAgB,WAAK,QAAQ,IAAI,GAAG,OAAO,cAAc,UAAU;AAGvE,QAAI;AACF,YAAS,WAAO,QAAQ;AAAA,IAC1B,QAAQ;AACN,iBAAgB,WAAK,QAAQ,IAAI,GAAG,OAAO,OAAO,cAAc,UAAU;AAAA,IAC5E;AAGA,QAAI;AACF,YAAS,WAAO,QAAQ;AAAA,IAC1B,QAAQ;AACN,YAAM,IAAI,MAAM,mEAAmE;AAAA,IACrF;AAGA,QAAI,cAAc,MAAS,aAAS,UAAU,MAAM;AAGpD,UAAM,eAAe,KAAK,UAAU,MAAM;AAC1C,kBAAc,YAAY,QAAQ,iCAAiC,YAAY;AAG/E,UAAS,cAAU,UAAU,aAAa,MAAM;AAEhD,YAAQ,QAAQ,2DAA2D;AAAA,EAC7E,SAAS,OAAO;AACd,YAAQ,MAAM,+BAA+B,KAAK;AAClD,UAAM;AAAA,EACR;AACF;AAEA,eAAe,cAAc,KAAa,OAAkC;AAC1E,QAAM,WAAW,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,WAAW;AAAA,IACnD,SAAS;AAAA,MACP,eAAe,UAAU,KAAK;AAAA,IAChC;AAAA,EACF,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,2BAA2B,SAAS,UAAU,EAAE;AAAA,EAClE;AAEA,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,SAAO,KAAK;AACd;","names":["fs","path","spawn","chalk","fs","ora","chalk","path","fs","ora","chalk","fs","ora","path"]}
1
+ {"version":3,"sources":["../../../src/lib/init/types/questions.ts","../../../src/lib/init/types/templates.ts","../../../src/lib/init/questions.ts","../../../src/lib/init/scaffold/shadcn.ts","../../../src/lib/init/scaffold/env.ts","../../../src/lib/init/scaffold/langgraph-assistants.ts","../../../src/lib/init/scaffold/github.ts","../../../src/lib/init/scaffold/packages.ts","../../../src/lib/init/scaffold/agent.ts","../../../src/lib/init/scaffold/crew-inputs.ts"],"sourcesContent":["import { z } from 'zod';\nimport { Flags } from \"@oclif/core\"\n\n// ===== Core Constants =====\nexport const AGENT_FRAMEWORKS = ['CrewAI', 'LangGraph', 'None'] as const;\nexport const CREW_TYPES = ['Crews', 'Flows'] as const;\nexport const CHAT_COMPONENTS = ['CopilotChat','CopilotSidebar', 'Headless', 'CopilotPopup'] as const;\nexport const LANGGRAPH_AGENTS = ['Python Starter', 'TypeScript Starter'] as const;\nexport const CREW_FLOW_TEMPLATES = ['Starter'] as const;\nexport const YES_NO = ['Yes', 'No'] as const;\n\n// ===== Sanitizers =====\nexport const sanitizers = {\n // Remove trailing slash from URLs\n url: (value: string): string => {\n if (!value) return value;\n return value.trim().replace(/\\/+$/, '');\n },\n \n // Trim whitespace from strings\n trim: (value: string): string => {\n if (!value) return value;\n return value.trim();\n },\n \n // Lowercase strings\n lowercase: (value: string): string => {\n if (!value) return value;\n return value.toLowerCase().trim();\n },\n \n // Clean API keys (remove whitespace)\n apiKey: (value: string): string => {\n if (!value) return value;\n return value.trim().replace(/\\s/g, '');\n }\n};\n\n// ===== Zod Schemas =====\n\n// Basic schemas\nexport const AgentFrameworkSchema = z.enum(AGENT_FRAMEWORKS);\nexport const CrewTypeSchema = z.enum(CREW_TYPES);\nexport const ChatComponentSchema = z.enum(CHAT_COMPONENTS);\nexport const LangGraphAgentSchema = z.enum(LANGGRAPH_AGENTS);\nexport const CrewFlowTemplateSchema = z.enum(CREW_FLOW_TEMPLATES);\nexport const YesNoSchema = z.enum(YES_NO);\n\n// URL validation schema with preprocessing to remove trailing slash\nexport const UrlSchema = z.preprocess(\n val => sanitizers.url(String(val)),\n z.string().url('Please enter a valid URL').min(1, 'URL is required')\n);\n\n// Token validation schema with preprocessing to trim\nexport const TokenSchema = z.preprocess(\n val => sanitizers.trim(String(val)),\n z.string().min(1, 'Token is required')\n);\n\n// API key validation schema with preprocessing to remove whitespace\nexport const ApiKeySchema = z.preprocess(\n val => sanitizers.apiKey(String(val)),\n z.string().min(1, 'API key is required')\n);\n\n// Name validation schema with preprocessing to trim\nexport const NameSchema = z.preprocess(\n val => sanitizers.trim(String(val)),\n z.string().min(1, 'Name is required')\n);\n\n// Config schema\nexport const ConfigSchema = z.object({\n // Core fields\n copilotKitVersion: z.string().optional(),\n agentFramework: AgentFrameworkSchema,\n chatUi: ChatComponentSchema.optional(),\n \n // Yes/No fields\n alreadyDeployed: YesNoSchema.optional(),\n fastApiEnabled: YesNoSchema.optional(),\n useCopilotCloud: YesNoSchema.optional(),\n \n // LangGraph specific fields \n langGraphAgent: LangGraphAgentSchema.optional(),\n langGraphPlatform: YesNoSchema.optional(),\n langGraphPlatformUrl: UrlSchema.optional(),\n langGraphRemoteEndpointURL: UrlSchema.optional(),\n \n // CrewAI specific fields\n crewType: CrewTypeSchema.optional(),\n crewName: NameSchema.optional(),\n crewUrl: UrlSchema.optional(),\n crewBearerToken: TokenSchema.optional(),\n crewFlowAgent: CrewFlowTemplateSchema.optional(),\n \n // API keys and tokens\n copilotCloudPublicApiKey: z.string().optional(),\n langSmithApiKey: ApiKeySchema.optional(),\n llmToken: ApiKeySchema.optional(),\n})\n.refine(\n (data) => {\n // If CrewAI is selected with Crews type, require crew URL and bearer token\n if (data.agentFramework === 'CrewAI' && data.crewType === 'Crews') {\n return !!data.crewUrl && !!data.crewBearerToken;\n }\n return true;\n },\n {\n message: \"Crew URL and bearer token are required for CrewAI Crews\",\n path: [\"crewUrl\", \"crewBearerToken\"],\n }\n)\n.refine(\n (data) => {\n // If LangGraph is selected with LangGraph Platform, require platform URL and LangSmith API key\n if (\n data.agentFramework === 'LangGraph' && \n data.alreadyDeployed === 'Yes' && \n data.langGraphPlatform === 'Yes'\n ) {\n return !!data.langGraphPlatformUrl && !!data.langSmithApiKey;\n }\n return true;\n },\n {\n message: \"LangGraph Platform URL and LangSmith API key are required\",\n path: [\"langGraphPlatformUrl\", \"langSmithApiKey\"],\n }\n);\n\n// Export the inferred type from the schema\nexport type Config = z.infer<typeof ConfigSchema>;\n\n// Question type definition with improved validation and sanitization\nexport type Question = {\n type: 'input' | 'yes/no' | 'select';\n name: keyof Config;\n message: string;\n choices?: readonly string[];\n default?: string;\n when?: (answers: Partial<Config>) => boolean;\n sensitive?: boolean;\n validate?: (input: string) => true | string; // Return true if valid, error message string if invalid\n sanitize?: (input: string) => string; // Function to sanitize input before validation\n};\n\n// CLI flags definition with descriptions\nexport const ConfigFlags = {\n copilotKitVersion: Flags.string({description: 'CopilotKit version to use (e.g. 1.7.0)'}),\n agentFramework: Flags.string({description: 'Agent framework to power your copilot', options: AGENT_FRAMEWORKS}),\n fastApiEnabled: Flags.string({description: 'Use FastAPI to serve your agent locally', options: YES_NO}),\n useCopilotCloud: Flags.string({description: 'Use Copilot Cloud for production-ready hosting', options: YES_NO}),\n chatUi: Flags.string({description: 'Chat UI component to add to your app', options: CHAT_COMPONENTS}),\n langGraphAgent: Flags.string({description: 'LangGraph agent template to use', options: LANGGRAPH_AGENTS}),\n crewType: Flags.string({description: 'CrewAI implementation type', options: CREW_TYPES}),\n crewName: Flags.string({description: 'Name for your CrewAI agent'}),\n crewUrl: Flags.string({description: 'URL endpoint for your CrewAI agent'}),\n crewBearerToken: Flags.string({description: 'Bearer token for CrewAI authentication'}),\n langSmithApiKey: Flags.string({description: 'LangSmith API key for LangGraph observability'}),\n llmToken: Flags.string({description: 'API key for your preferred LLM provider'}),\n crewFlowAgent: Flags.string({description: 'CrewAI Flow template to use', options: CREW_FLOW_TEMPLATES}),\n}","export type ChatTemplate = \n \"CopilotChat\" |\n \"CopilotPopup\" |\n \"CopilotSidebar\"\n\nexport type StarterTemplate = \n \"LangGraphPlatform\" |\n \"RemoteEndpoint\" |\n \"Standard\" |\n \"CrewEnterprise\" |\n \"CrewFlowsStarter\"\n\nexport type Template = ChatTemplate | StarterTemplate\n\nconst BASE_URL = \"https://registry.copilotkit.ai/r\"\n\nexport const templateMapping = {\n // Runtimes\n \"RemoteEndpoint\": `${BASE_URL}/remote-endpoint-starter.json`,\n \"LangGraphPlatformRuntime\": `${BASE_URL}/langgraph-platform-starter.json`,\n \n // CrewAI\n \"CrewEnterprise\": [\n `${BASE_URL}/coagents-crew-starter.json`,\n ], \n \"CrewFlowsStarter\": [\n `${BASE_URL}/coagents-starter-ui.json`,\n `${BASE_URL}/agent-layout.json`,\n `${BASE_URL}/remote-endpoint.json`\n ],\n \n // LangGraph\n \"LangGraphGeneric\": `${BASE_URL}/generic-lg-starter.json`,\n \"LangGraphStarter\": [\n `${BASE_URL}/langgraph-platform-starter.json`,\n `${BASE_URL}/coagents-starter-ui.json`,\n ],\n\n // No Agent\n \"StandardStarter\": `${BASE_URL}/standard-starter.json`,\n \"StandardRuntime\": `${BASE_URL}/standard-runtime.json`\n}","import { \n Question, \n CHAT_COMPONENTS,\n AGENT_FRAMEWORKS,\n CREW_TYPES,\n LANGGRAPH_AGENTS,\n CREW_FLOW_TEMPLATES,\n AgentFrameworkSchema,\n CrewTypeSchema,\n UrlSchema,\n YesNoSchema,\n sanitizers,\n} from './types/index.js';\n\n// Validation helpers\nconst validateUrl = (input: string): true | string => {\n try {\n // First sanitize the URL by removing trailing slashes\n const sanitized = sanitizers.url(input);\n // Then validate\n const result = UrlSchema.safeParse(sanitized);\n if (result.success) return true;\n return result.error.errors[0]?.message || 'Invalid URL format';\n } catch (error) {\n return 'Invalid URL format';\n }\n};\n\nconst validateRequired = (input: string): true | string => {\n return sanitizers.trim(input) ? true : 'This field is required';\n};\n\n// Single source of truth for all questions in the CLI\n// Organized in a logical flow with improved phrasing\nexport const questions: Question[] = [\n // Core setup questions - always shown first\n {\n type: 'select',\n name: 'agentFramework',\n message: '🤖 Choose your AI framework:',\n choices: Array.from(AGENT_FRAMEWORKS),\n validate: (input) => {\n try {\n AgentFrameworkSchema.parse(input);\n return true;\n } catch (error) {\n return 'Please select a valid framework';\n }\n }\n },\n \n // CrewAI specific questions - shown when CrewAI selected\n {\n type: 'select',\n name: 'crewType',\n message: '👥 What kind of CrewAI implementation would you like to use?',\n choices: Array.from(CREW_TYPES),\n when: (answers) => answers.agentFramework === 'CrewAI',\n validate: (input) => {\n try {\n CrewTypeSchema.parse(input);\n return true;\n } catch (error) {\n return 'Please select a valid crew type';\n }\n }\n },\n\n // CrewAI Crews specific questions - shown when CrewAI Crews selected\n {\n type: 'input',\n name: 'crewName',\n message: '👥 What would you like to name your crew? (can be anything)',\n when: (answers) => answers.agentFramework === 'CrewAI' && answers.crewType === 'Crews',\n default: 'MyCopilotCrew',\n validate: validateRequired,\n sanitize: sanitizers.trim\n },\n {\n type: 'input',\n name: 'crewUrl',\n message: '🔗 Enter your Crew\\'s Enterprise URL (more info at https://app.crewai.com):',\n when: (answers) => answers.agentFramework === 'CrewAI' && answers.crewType === 'Crews',\n validate: validateUrl,\n sanitize: sanitizers.url\n },\n {\n type: 'input',\n name: 'crewBearerToken',\n message: '🔑 Enter your Crew\\'s bearer token:',\n when: (answers) => answers.agentFramework === 'CrewAI' && answers.crewType === 'Crews',\n sensitive: true,\n validate: validateRequired,\n sanitize: sanitizers.trim\n },\n\n // CrewAI Flows specific questions - shown when CrewAI Flows selected\n {\n type: 'select',\n name: 'crewFlowAgent',\n message: '📦 Choose a CrewAI Flow Template',\n choices: Array.from(CREW_FLOW_TEMPLATES),\n when: (answers) => answers.agentFramework === 'CrewAI' && answers.crewType === 'Flows',\n },\n \n // LangGraph specific questions - shown when LangGraph selected\n {\n type: 'yes/no',\n name: 'alreadyDeployed',\n message: '🦜🔗 Do you have an existing LangGraph agent?',\n when: (answers) => answers.agentFramework === 'LangGraph',\n validate: (input) => {\n try {\n YesNoSchema.parse(input);\n return true;\n } catch (error) {\n return 'Please select Yes or No';\n }\n }\n },\n {\n type: 'yes/no',\n name: 'langGraphPlatform',\n message: '🦜🔗 Do you already have a LangGraph Agent URL? (remote or localhost)',\n when: (answers) => \n answers.agentFramework === 'LangGraph' && \n answers.alreadyDeployed === 'Yes',\n validate: (input) => {\n try {\n YesNoSchema.parse(input);\n return true;\n } catch (error) {\n return 'Please select Yes or No';\n }\n }\n },\n {\n type: 'input',\n name: 'langGraphPlatformUrl',\n message: '🦜🔗 Enter your LangGraph Agent URL (remote or localhost)',\n when: (answers) => \n answers.agentFramework === 'LangGraph' && \n answers.alreadyDeployed === 'Yes' &&\n answers.langGraphPlatform === 'Yes',\n validate: validateUrl,\n sanitize: sanitizers.url\n },\n // {\n // type: 'input',\n // name: 'langGraphRemoteEndpointURL',\n // message: '🔌 Enter your LangGraph endpoint URL:',\n // when: (answers) => \n // answers.agentFramework === 'LangGraph' && \n // answers.alreadyDeployed === 'Yes' &&\n // answers.langGraphPlatform === 'No',\n // validate: validateUrl,\n // sanitize: sanitizers.url\n // },\n {\n type: 'select',\n name: 'langGraphAgent',\n message: '📦 Choose a LangGraph starter template:',\n choices: Array.from(LANGGRAPH_AGENTS),\n when: (answers) => \n answers.agentFramework === 'LangGraph' && \n answers.alreadyDeployed === 'No',\n },\n {\n type: 'input',\n name: 'langSmithApiKey',\n message: '🦜🔗 Enter your LangSmith API key (required by LangGraph Platform) :',\n when: (answers) => \n answers.agentFramework === 'LangGraph' &&\n answers.langGraphPlatform === 'Yes',\n sensitive: true,\n validate: validateRequired,\n sanitize: sanitizers.apiKey\n },\n \n // Deployment options\n {\n type: 'yes/no',\n name: 'useCopilotCloud',\n message: '🪁 Deploy with Copilot Cloud? (recommended for production)',\n when: (answers) => \n answers.agentFramework === 'None' ||\n (\n answers.agentFramework !== 'CrewAI' && // Crews only cloud, flows are self-hosted\n answers.alreadyDeployed === 'Yes' &&\n answers.langGraphPlatform !== 'No'\n ),\n validate: (input) => {\n try {\n YesNoSchema.parse(input);\n return true;\n } catch (error) {\n return 'Please select Yes or No';\n }\n }\n },\n // {\n // type: 'yes/no',\n // name: 'fastApiEnabled',\n // message: '⚡ Set up a FastAPI server for local development?',\n // when: (answers) => \n // answers.agentFramework === 'LangGraph' && \n // answers.alreadyDeployed === 'No' && \n // answers.langGraphAgent === 'Python Starter' &&\n // answers.useCopilotCloud !== 'Yes',\n // },\n\n {\n type: 'input',\n name: 'llmToken',\n message: '🔑 Enter your OpenAI API key (required for LLM interfacing):',\n when: (answers) =>\n (answers.agentFramework === 'LangGraph' && answers.alreadyDeployed === 'No') ||\n (answers.agentFramework === 'CrewAI' && answers.crewType === 'Flows') ||\n (answers.agentFramework === 'None' && answers.useCopilotCloud !== 'Yes'),\n sensitive: true,\n validate: validateRequired,\n sanitize: sanitizers.apiKey\n },\n];\n\n","import spawn from \"cross-spawn\"\nimport { \n templateMapping, \n Config \n} from \"../types/index.js\"\n\nexport async function scaffoldShadCN(userAnswers: Config) {\n try {\n // Determine which components to install based on user choices\n const components: string[] = []\n \n // Add additional components based on agent framework\n switch (userAnswers.agentFramework) {\n case 'LangGraph':\n if (userAnswers.langGraphAgent) {\n components.push(...templateMapping.LangGraphStarter)\n } else {\n components.push(templateMapping.LangGraphGeneric)\n if (userAnswers.useCopilotCloud !== 'Yes') {\n if (userAnswers.langGraphPlatform === 'Yes') {\n components.push(templateMapping.LangGraphPlatformRuntime)\n } else {\n components.push(templateMapping.RemoteEndpoint)\n }\n }\n }\n break\n case 'CrewAI':\n if (userAnswers.crewType === 'Crews') {\n components.push(...templateMapping.CrewEnterprise)\n } else if (userAnswers.crewFlowAgent) {\n components.push(...templateMapping.CrewFlowsStarter)\n } else {\n components.push(templateMapping.RemoteEndpoint)\n }\n break\n case 'None':\n components.push(templateMapping.StandardStarter)\n if (userAnswers.useCopilotCloud !== 'Yes') {\n components.push(templateMapping.StandardRuntime)\n }\n break\n default:\n components.push(templateMapping.RemoteEndpoint)\n break\n }\n \n // Small pause before running shadcn\n await new Promise(resolve => setTimeout(resolve, 100));\n \n try {\n // Run shadcn with inherited stdio for all streams to allow for user input\n const result = spawn.sync('npx', ['shadcn@latest', 'add', ...components], { \n stdio: 'inherit' // This ensures stdin/stdout/stderr are all passed through\n });\n \n if (result.status !== 0) {\n throw new Error(`The shadcn installation process exited with code ${result.status}`);\n }\n } catch (error) {\n throw error;\n }\n } catch (error) {\n throw error;\n }\n}","import path from \"path\"\nimport fs from \"fs\"\nimport { Config } from \"../types/index.js\"\nimport { getLangGraphAgents } from \"./langgraph-assistants.js\"\nimport inquirer from \"inquirer\"\n\nexport async function scaffoldEnv(flags: any, userAnswers: Config) {\n try {\n // Define the env file path\n const envFile = path.join(process.cwd(), '.env')\n \n // Create the env file if it doesn't exist\n if (!fs.existsSync(envFile)) {\n fs.writeFileSync(envFile, '', 'utf8')\n } else {\n }\n \n // Build environment variables based on user selections\n let newEnvValues = ''\n \n // Copilot Cloud API key\n if (userAnswers.copilotCloudPublicApiKey) {\n newEnvValues += `NEXT_PUBLIC_COPILOT_API_KEY=${userAnswers.copilotCloudPublicApiKey}\\n`\n }\n \n // LangSmith API key (for LangGraph)\n if (userAnswers.langSmithApiKey) {\n // Add both formats for compatibility\n newEnvValues += `LANGSMITH_API_KEY=${userAnswers.langSmithApiKey}\\n`\n }\n \n // LLM API key - set as both LLM_TOKEN and OPENAI_API_KEY for compatibility\n if (userAnswers.llmToken) {\n newEnvValues += `OPENAI_API_KEY=${userAnswers.llmToken}\\n`\n }\n \n // CrewAI name\n if (userAnswers.crewName) {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_AGENT_NAME=${userAnswers.crewName}\\n`\n }\n\n if (userAnswers.langGraphAgent) {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_AGENT_NAME=sample_agent\\n`\n newEnvValues += `LANGGRAPH_DEPLOYMENT_URL=http://localhost:8123\\n`\n } else if (userAnswers.langGraphPlatform === 'Yes' && userAnswers.useCopilotCloud === 'No') {\n newEnvValues += `LANGGRAPH_DEPLOYMENT_URL=${userAnswers.langGraphPlatformUrl}\\n`\n } else if (userAnswers.langGraphRemoteEndpointURL) {\n newEnvValues += `COPILOTKIT_REMOTE_ENDPOINT=${userAnswers.langGraphRemoteEndpointURL}\\n`\n }\n\n // Runtime URL if provided via flags\n if (flags.runtimeUrl) {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_RUNTIME_URL=${flags.runtimeUrl}\\n`\n } else if (userAnswers.useCopilotCloud !== 'Yes' && userAnswers.crewType !== 'Crews') {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_RUNTIME_URL=/api/copilotkit\\n`\n }\n\n if (userAnswers.crewFlowAgent === 'Starter') {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_AGENT_NAME=sample_agent\\n`\n }\n\n if (userAnswers.langGraphPlatformUrl && userAnswers.langSmithApiKey) {\n const langGraphAgents = await getLangGraphAgents(userAnswers.langGraphPlatformUrl, userAnswers.langSmithApiKey);\n let langGraphAgent = '';\n if (langGraphAgents.length > 1) {\n const { langGraphAgentChoice } = await inquirer.prompt([\n {\n type: 'list',\n name: 'langGraphAgentChoice',\n message: '🦜🔗 Which agent from your graph would you like to use?',\n choices: langGraphAgents.map((agent: any) => ({\n name: agent.graph_id,\n value: agent.graph_id,\n }))\n }\n ]);\n langGraphAgent = langGraphAgentChoice;\n } else if (langGraphAgents.length === 1) {\n langGraphAgent = langGraphAgents[0].graph_id;\n } else {\n throw new Error('No agents found in your LangGraph endpoint');\n }\n\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_AGENT_NAME=${langGraphAgent}\\n`\n }\n\n // Append the variables to the .env file\n if (newEnvValues) {\n fs.appendFileSync(envFile, newEnvValues)\n }\n } catch (error) {\n throw error;\n }\n}\n","export type LangGraphAgent = {\n assistant_id: string;\n graph_id: string;\n config: {\n tags: string[];\n recursion_limit: number;\n configurable: Record<string, any>;\n };\n created_at: string;\n updated_at: string;\n metadata: Record<string, any>;\n version: number;\n name: string;\n description: string;\n}\n\nexport async function getLangGraphAgents(url: string, langSmithApiKey: string) {\n try {\n const response = await fetch(`${url.trim().replace(/\\/$/, '')}/assistants/search`, \n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Api-Key': langSmithApiKey\n },\n body: JSON.stringify({\n limit: 10,\n offset: 0\n })\n })\n\n return await response.json() as LangGraphAgent[];\n } catch (error) {\n throw new Error(`Failed to get LangGraph agents: ${error}`);\n }\n}","import { execSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport { Config } from '../types/index.js';\nimport chalk from \"chalk\"\nimport ora, {Ora} from \"ora\";\n\n/**\n * Clones a specific subdirectory from a GitHub repository\n * \n * @param githubUrl - The GitHub URL to the repository or subdirectory\n * @param destinationPath - The local path where the content should be copied\n * @param spinner - The spinner to update with progress information\n * @returns A boolean indicating success or failure\n */\nexport async function cloneGitHubSubdirectory(\n githubUrl: string,\n destinationPath: string,\n spinner: Ora\n): Promise<boolean> {\n try {\n // Parse the GitHub URL to extract repo info\n const { owner, repo, branch, subdirectoryPath } = parseGitHubUrl(githubUrl);\n \n spinner.text = chalk.cyan(`Cloning from ${owner}/${repo}...`);\n \n // Method 1: Use sparse checkout (more efficient than full clone)\n return await sparseCheckout(owner, repo, branch, subdirectoryPath, destinationPath, spinner);\n } catch (error) {\n spinner.text = chalk.red(`Failed to clone from GitHub: ${error}`);\n return false;\n }\n}\n\n/**\n * Uses Git sparse-checkout to efficiently download only the needed subdirectory\n */\nasync function sparseCheckout(\n owner: string,\n repo: string,\n branch: string,\n subdirectoryPath: string,\n destinationPath: string,\n spinner: Ora\n): Promise<boolean> {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'copilotkit-sparse-'));\n \n try {\n spinner.text = chalk.cyan('Creating temporary workspace...');\n \n // Initialize git repo\n execSync('git init', { cwd: tempDir, stdio: 'pipe' });\n \n spinner.text = chalk.cyan('Connecting to repository...');\n \n // Add remote\n execSync(`git remote add origin https://github.com/${owner}/${repo}.git`, { cwd: tempDir, stdio: 'pipe' });\n \n // Enable sparse checkout\n execSync('git config core.sparseCheckout true', { cwd: tempDir, stdio: 'pipe' });\n \n // Specify which subdirectory to checkout\n fs.writeFileSync(path.join(tempDir, '.git/info/sparse-checkout'), subdirectoryPath);\n \n spinner.text = chalk.cyan('Downloading agent files...');\n \n // Pull only the specified branch\n execSync(`git pull origin ${branch} --depth=1`, { cwd: tempDir, stdio: 'pipe' });\n \n // Copy the subdirectory to the destination\n const sourcePath = path.join(tempDir, subdirectoryPath);\n if (!fs.existsSync(sourcePath)) {\n throw new Error(`Subdirectory '${subdirectoryPath}' not found in the repository.`);\n }\n \n // Ensure destination directory exists\n fs.mkdirSync(destinationPath, { recursive: true });\n \n spinner.text = chalk.cyan('Installing agent files...');\n \n // Copy the subdirectory to the destination\n await copyDirectoryAsync(sourcePath, destinationPath);\n \n return true;\n } finally {\n // Clean up the temporary directory\n try {\n fs.rmSync(tempDir, { recursive: true, force: true });\n } catch (error) {\n console.warn(`Failed to clean up temporary directory: ${error}`);\n }\n }\n}\n\n/**\n * Recursively copies a directory with async pauses\n */\nasync function copyDirectoryAsync(source: string, destination: string): Promise<void> {\n // Create destination directory if it doesn't exist\n if (!fs.existsSync(destination)) {\n fs.mkdirSync(destination, { recursive: true });\n }\n \n // Read all files/directories from source\n const entries = fs.readdirSync(source, { withFileTypes: true });\n \n for (const entry of entries) {\n const srcPath = path.join(source, entry.name);\n const destPath = path.join(destination, entry.name);\n \n if (entry.isDirectory()) {\n // Recursively copy subdirectories\n await copyDirectoryAsync(srcPath, destPath);\n } else {\n // Copy files\n fs.copyFileSync(srcPath, destPath);\n }\n \n // For large directories, add small pauses\n if (entries.length > 10) {\n await new Promise(resolve => setTimeout(resolve, 1));\n }\n }\n}\n\n/**\n * Parses a GitHub URL to extract owner, repo, branch and subdirectory path\n */\nfunction parseGitHubUrl(githubUrl: string): { \n owner: string; \n repo: string; \n branch: string;\n subdirectoryPath: string;\n} {\n const url = new URL(githubUrl);\n \n if (url.hostname !== 'github.com') {\n throw new Error('Only GitHub URLs are supported');\n }\n \n const pathParts = url.pathname.split('/').filter(Boolean);\n \n if (pathParts.length < 2) {\n throw new Error('Invalid GitHub URL format');\n }\n \n const owner = pathParts[0];\n const repo = pathParts[1];\n let branch = 'main'; // Default branch\n let subdirectoryPath = '';\n \n if (pathParts.length > 3 && (pathParts[2] === 'tree' || pathParts[2] === 'blob')) {\n branch = pathParts[3];\n subdirectoryPath = pathParts.slice(4).join('/');\n }\n \n return { owner, repo, branch, subdirectoryPath };\n}\n\n/**\n * Validates if a string is a valid GitHub URL\n */\nexport function isValidGitHubUrl(url: string): boolean {\n try {\n const parsedUrl = new URL(url);\n return parsedUrl.hostname === 'github.com' && \n parsedUrl.pathname.split('/').filter(Boolean).length >= 2;\n } catch {\n return false;\n }\n}\n","/*\n Currently unusued but will be used in the future once we have more time to think\n about what to use outside of shadcn/ui.\n*/\n\nimport spawn from \"cross-spawn\";\nimport { Config } from \"../types/index.js\";\nimport chalk from \"chalk\";\nimport fs from \"fs\";\nimport ora from \"ora\";\n\ntype PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';\n\nexport async function scaffoldPackages(userAnswers: Config) {\n const spinner = ora({\n text: chalk.cyan('Preparing to install packages...'),\n color: 'cyan'\n }).start();\n\n try {\n const packages = [\n `@copilotkit/react-ui@${userAnswers.copilotKitVersion}`,\n `@copilotkit/react-core@${userAnswers.copilotKitVersion}`,\n `@copilotkit/runtime@${userAnswers.copilotKitVersion}`,\n ];\n\n // Small pause before starting\n await new Promise(resolve => setTimeout(resolve, 50));\n\n const packageManager = detectPackageManager();\n const installCommand = detectInstallCommand(packageManager);\n \n spinner.text = chalk.cyan(`Using ${packageManager} to install packages...`);\n \n // Pause the spinner for the package installation\n spinner.stop();\n \n console.log(chalk.cyan('\\n⚙️ Installing packages...\\n'));\n \n const result = spawn.sync(packageManager, [installCommand, ...packages], { \n stdio: 'inherit' // This ensures stdin/stdout/stderr are all passed through\n });\n \n if (result.status !== 0) {\n throw new Error(`Package installation process exited with code ${result.status}`);\n }\n \n // Resume the spinner for success message\n spinner.start();\n spinner.succeed(chalk.green('CopilotKit packages installed successfully'));\n } catch (error) {\n // Use spinner for consistent error reporting\n if (!spinner.isSpinning) {\n spinner.start();\n }\n spinner.fail(chalk.red('Failed to install CopilotKit packages'));\n throw error;\n }\n}\n\nfunction detectPackageManager(): PackageManager {\n // Check for lock files in the current directory\n const files = fs.readdirSync(process.cwd());\n \n if (files.includes('bun.lockb')) return 'bun';\n if (files.includes('pnpm-lock.yaml')) return 'pnpm';\n if (files.includes('yarn.lock')) return 'yarn';\n if (files.includes('package-lock.json')) return 'npm';\n\n // Default to npm if no lock file found\n return 'npm';\n}\n\nfunction detectInstallCommand(packageManager: PackageManager): string {\n switch (packageManager) {\n case 'yarn':\n case 'pnpm':\n return 'add';\n default:\n return 'install';\n }\n}","import ora from \"ora\"\nimport chalk from \"chalk\"\nimport { cloneGitHubSubdirectory } from \"./github.js\"\nimport { Config } from \"../types/index.js\"\nimport path from \"path\"\nimport fs from \"fs\"\n\nexport async function scaffoldAgent(userAnswers: Config) {\n if (\n (userAnswers.agentFramework === 'CrewAI' && userAnswers.crewType === 'Crews') ||\n (userAnswers.agentFramework === 'LangGraph' && !userAnswers.langGraphAgent) ||\n userAnswers.agentFramework === 'None'\n ) {\n return;\n }\n \n const spinner = ora({\n text: chalk.cyan('Setting up AI agent...'),\n color: 'cyan'\n }).start();\n\n let template = \"\";\n switch (userAnswers.agentFramework) {\n case 'LangGraph':\n if (userAnswers.langGraphAgent === 'Python Starter') {\n template = AgentTemplates.LangGraph.Starter.Python;\n } else {\n template = AgentTemplates.LangGraph.Starter.TypeScript;\n }\n break;\n case 'CrewAI':\n if (userAnswers.crewFlowAgent === 'Starter') {\n template = AgentTemplates.CrewAI.Flows.Starter;\n }\n break;\n }\n\n if (!template) {\n spinner.fail(chalk.red('Failed to determine agent template'));\n throw new Error('Failed to determine agent template');\n }\n\n const agentDir = path.join(process.cwd(), 'agent');\n\n try {\n await cloneGitHubSubdirectory(\n template, \n agentDir,\n spinner\n );\n\n // Create .env file in the agent directory\n spinner.text = chalk.cyan('Creating agent environment variables...');\n \n let envContent = '';\n \n // Add OpenAI API key if provided\n if (userAnswers.llmToken) {\n envContent += `OPENAI_API_KEY=${userAnswers.llmToken}\\n`;\n }\n \n // Add LangSmith API key for LangGraph\n if (userAnswers.agentFramework === 'LangGraph' && userAnswers.langSmithApiKey) {\n envContent += `LANGSMITH_API_KEY=${userAnswers.langSmithApiKey}\\n`;\n }\n \n if (envContent) {\n const agentEnvFile = path.join(agentDir, '.env');\n fs.writeFileSync(agentEnvFile, envContent, 'utf8');\n spinner.text = chalk.cyan('Added API keys to agent .env file');\n }\n\n } catch (error) {\n spinner.fail(chalk.red('Failed to clone agent template'));\n throw error;\n }\n\n spinner.succeed(`${userAnswers.agentFramework} agent cloned successfully`);\n}\n\nexport const AgentTemplates = {\n LangGraph: {\n Starter: {\n Python: 'https://github.com/CopilotKit/coagents-starter-langgraph/tree/main/agent-py',\n TypeScript: 'https://github.com/CopilotKit/coagents-starter-langgraph/tree/main/agent-js',\n }\n },\n CrewAI: {\n Flows: {\n Starter: 'https://github.com/CopilotKit/coagents-starter-crewai-flows/tree/main/agent-py',\n }\n },\n}","import * as fs from 'fs/promises';\nimport ora from 'ora';\nimport * as path from 'path';\n\n\nexport async function addCrewInputs(url: string, token: string) {\n try {\n const spinner = ora('Analyzing crew inputs...').start();\n // Get inputs from the crew API\n const inputs = await getCrewInputs(url, token);\n spinner.text = 'Adding inputs to app/copilotkit/page.tsx...';\n \n // Path to the file we need to modify\n let filePath = path.join(process.cwd(), 'app', 'copilotkit', 'page.tsx');\n\n // check if non-src file exists\n try { \n await fs.access(filePath) \n } catch { \n filePath = path.join(process.cwd(), 'src', 'app', 'copilotkit', 'page.tsx');\n }\n\n // check if src file exists\n try {\n await fs.access(filePath)\n } catch {\n throw new Error('app/copilotkit/page.tsx and src/app/copilotkit/page.tsx not found');\n }\n \n // Read the file content\n let fileContent = await fs.readFile(filePath, 'utf8');\n \n // Replace all instances of \"YOUR_INPUTS_HERE\" with the inputs array as a string\n const inputsString = JSON.stringify(inputs);\n fileContent = fileContent.replace(/\\[[\"']YOUR_INPUTS_HERE[\"']\\]/g, inputsString);\n \n // Write the updated content back to the file\n await fs.writeFile(filePath, fileContent, 'utf8');\n\n spinner.succeed('Successfully added crew inputs to app/copilotkit/page.tsx');\n } catch (error) {\n console.error('Error updating crew inputs:', error);\n throw error;\n }\n}\n\nasync function getCrewInputs(url: string, token: string): Promise<string[]> {\n const response = await fetch(`${url.trim()}/inputs`, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch inputs: ${response.statusText}`);\n }\n\n const data = await response.json() as { inputs: string[] };\n return data.inputs;\n}\n\n"],"mappings":"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","names":["fs","path","spawn","chalk","fs","ora","chalk","path","fs","ora","chalk","fs","ora","path"]}
@@ -1,7 +1,7 @@
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"];
4
+ var AGENT_FRAMEWORKS = ["CrewAI", "LangGraph", "None"];
5
5
  var CREW_TYPES = ["Crews", "Flows"];
6
6
  var CHAT_COMPONENTS = ["CopilotChat", "CopilotSidebar", "Headless", "CopilotPopup"];
7
7
  var LANGGRAPH_AGENTS = ["Python Starter", "TypeScript Starter"];
@@ -115,27 +115,29 @@ var ConfigFlags = {
115
115
  };
116
116
 
117
117
  // src/lib/init/types/templates.ts
118
- var BASE_URL = "http://registry.copilotkit.ai/r";
118
+ var BASE_URL = "https://registry.copilotkit.ai/r";
119
119
  var templateMapping = {
120
- "LangGraphPlatformRuntime": `${BASE_URL}/langgraph-platform-starter.json`,
120
+ // Runtimes
121
121
  "RemoteEndpoint": `${BASE_URL}/remote-endpoint-starter.json`,
122
+ "LangGraphPlatformRuntime": `${BASE_URL}/langgraph-platform-starter.json`,
123
+ // CrewAI
122
124
  "CrewEnterprise": [
123
125
  `${BASE_URL}/coagents-crew-starter.json`
124
126
  ],
125
- "LangGraphGeneric": `${BASE_URL}/generic-lg-starter-with-cloud.json`,
126
127
  "CrewFlowsStarter": [
127
128
  `${BASE_URL}/coagents-starter-ui.json`,
128
129
  `${BASE_URL}/agent-layout.json`,
129
130
  `${BASE_URL}/remote-endpoint.json`
130
131
  ],
132
+ // LangGraph
133
+ "LangGraphGeneric": `${BASE_URL}/generic-lg-starter.json`,
131
134
  "LangGraphStarter": [
132
135
  `${BASE_URL}/langgraph-platform-starter.json`,
133
136
  `${BASE_URL}/coagents-starter-ui.json`
134
137
  ],
135
- "Standard": `${BASE_URL}/standard-starter.json`,
136
- "CopilotChat": `${BASE_URL}/chat.json`,
137
- "CopilotPopup": `${BASE_URL}/popup.json`,
138
- "CopilotSidebar": `${BASE_URL}/sidebar.json`
138
+ // No Agent
139
+ "StandardStarter": `${BASE_URL}/standard-starter.json`,
140
+ "StandardRuntime": `${BASE_URL}/standard-runtime.json`
139
141
  };
140
142
 
141
143
  // src/lib/init/questions.ts
@@ -223,7 +225,7 @@ var questions = [
223
225
  {
224
226
  type: "yes/no",
225
227
  name: "alreadyDeployed",
226
- message: "\u{1F680} Is your LangGraph agent already deployed?",
228
+ message: "\u{1F99C}\u{1F517} Do you have an existing LangGraph agent?",
227
229
  when: (answers) => answers.agentFramework === "LangGraph",
228
230
  validate: (input) => {
229
231
  try {
@@ -237,7 +239,7 @@ var questions = [
237
239
  {
238
240
  type: "yes/no",
239
241
  name: "langGraphPlatform",
240
- message: "\u{1F99C}\u{1F517} Is it hosted with LangGraph Platform (either self-hosted or in LangSmith)?",
242
+ message: "\u{1F99C}\u{1F517} Do you already have a LangGraph Agent URL? (remote or localhost)",
241
243
  when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "Yes",
242
244
  validate: (input) => {
243
245
  try {
@@ -251,7 +253,7 @@ var questions = [
251
253
  {
252
254
  type: "input",
253
255
  name: "langGraphPlatformUrl",
254
- message: "\u{1F99C}\u{1F517} Enter your LangGraph platform URL:",
256
+ message: "\u{1F99C}\u{1F517} Enter your LangGraph Agent URL (remote or localhost)",
255
257
  when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "Yes" && answers.langGraphPlatform === "Yes",
256
258
  validate: validateUrl,
257
259
  sanitize: sanitizers.url
@@ -288,7 +290,8 @@ var questions = [
288
290
  type: "yes/no",
289
291
  name: "useCopilotCloud",
290
292
  message: "\u{1FA81} Deploy with Copilot Cloud? (recommended for production)",
291
- when: (answers) => !(answers.agentFramework === "CrewAI" && answers.crewType === "Crews") && answers.crewType !== "Flows" && answers.alreadyDeployed === "Yes" && answers.langGraphPlatform !== "No",
293
+ when: (answers) => answers.agentFramework === "None" || answers.agentFramework !== "CrewAI" && // Crews only cloud, flows are self-hosted
294
+ answers.alreadyDeployed === "Yes" && answers.langGraphPlatform !== "No",
292
295
  validate: (input) => {
293
296
  try {
294
297
  YesNoSchema.parse(input);
@@ -308,20 +311,11 @@ var questions = [
308
311
  // answers.langGraphAgent === 'Python Starter' &&
309
312
  // answers.useCopilotCloud !== 'Yes',
310
313
  // },
311
- // UI components - always shown last
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
- // },
320
314
  {
321
315
  type: "input",
322
316
  name: "llmToken",
323
- message: "\u{1F511} Enter your OpenAI API key (required for agent functionality):",
324
- when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "No" || answers.agentFramework === "CrewAI" && answers.crewType === "Flows",
317
+ message: "\u{1F511} Enter your OpenAI API key (required for LLM interfacing):",
318
+ when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "No" || answers.agentFramework === "CrewAI" && answers.crewType === "Flows" || answers.agentFramework === "None" && answers.useCopilotCloud !== "Yes",
325
319
  sensitive: true,
326
320
  validate: validateRequired,
327
321
  sanitize: sanitizers.apiKey