copilotkit 0.0.25 → 0.0.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/commands/base-command.js +1 -1
  2. package/dist/commands/base-command.js.map +1 -1
  3. package/dist/commands/dev.js +1 -1
  4. package/dist/commands/dev.js.map +1 -1
  5. package/dist/commands/init.js +274 -48
  6. package/dist/commands/init.js.map +1 -1
  7. package/dist/commands/login.js +1 -1
  8. package/dist/commands/login.js.map +1 -1
  9. package/dist/commands/logout.js +1 -1
  10. package/dist/commands/logout.js.map +1 -1
  11. package/dist/lib/init/index.d.ts +4 -3
  12. package/dist/lib/init/index.js +201 -16
  13. package/dist/lib/init/index.js.map +1 -1
  14. package/dist/lib/init/questions.d.ts +1 -0
  15. package/dist/lib/init/questions.js +174 -14
  16. package/dist/lib/init/questions.js.map +1 -1
  17. package/dist/lib/init/scaffold/agent.d.ts +1 -0
  18. package/dist/lib/init/scaffold/crew-inputs.js +1 -1
  19. package/dist/lib/init/scaffold/crew-inputs.js.map +1 -1
  20. package/dist/lib/init/scaffold/env.d.ts +1 -0
  21. package/dist/lib/init/scaffold/env.js +1 -1
  22. package/dist/lib/init/scaffold/env.js.map +1 -1
  23. package/dist/lib/init/scaffold/index.d.ts +1 -0
  24. package/dist/lib/init/scaffold/index.js +109 -4
  25. package/dist/lib/init/scaffold/index.js.map +1 -1
  26. package/dist/lib/init/scaffold/langgraph-assistants.js +1 -1
  27. package/dist/lib/init/scaffold/langgraph-assistants.js.map +1 -1
  28. package/dist/lib/init/scaffold/packages.d.ts +1 -0
  29. package/dist/lib/init/scaffold/shadcn.d.ts +1 -0
  30. package/dist/lib/init/scaffold/shadcn.js +107 -2
  31. package/dist/lib/init/scaffold/shadcn.js.map +1 -1
  32. package/dist/lib/init/types/index.d.ts +2 -1
  33. package/dist/lib/init/types/index.js +108 -2
  34. package/dist/lib/init/types/index.js.map +1 -1
  35. package/dist/lib/init/types/questions.d.ts +164 -36
  36. package/dist/lib/init/types/questions.js +109 -3
  37. package/dist/lib/init/types/questions.js.map +1 -1
  38. package/dist/utils/version.d.ts +1 -1
  39. package/dist/utils/version.js +1 -1
  40. package/dist/utils/version.js.map +1 -1
  41. package/oclif.manifest.json +1 -1
  42. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/logout.ts","../../src/services/auth.service.ts","../../src/utils/trpc.ts","../../src/services/analytics.service.ts","../../src/commands/base-command.ts","../../src/utils/version.ts"],"sourcesContent":["import {Config} from '@oclif/core'\nimport chalk from 'chalk'\nimport ora from 'ora'\n\nimport {AuthService} from '../services/auth.service.js'\nimport { BaseCommand } from './base-command.js'\n\nexport default class CloudLogout extends BaseCommand {\n static override description = 'Logout from Copilot Cloud'\n\n static override examples = ['<%= config.bin %> logout']\n\n constructor(argv: string[], config: Config, private authService = new AuthService()) {\n super(argv, config)\n }\n\n public async run(): Promise<void> {\n await this.parse(CloudLogout)\n this.log(\"Logging out...\\n\");\n await this.authService.logout(this);\n this.log(chalk.green('Successfully logged out!'))\n }\n}\n","// @ts-ignore\nimport Conf from 'conf'\nimport cors from 'cors'\nimport express from 'express'\nimport crypto from 'node:crypto'\nimport open from 'open'\nimport getPort from 'get-port'\nimport ora from 'ora'\nimport chalk from 'chalk'\nimport inquirer from 'inquirer'\nimport {Command} from '@oclif/core'\nimport {createTRPCClient} from '../utils/trpc.js'\nimport {AnalyticsService} from '../services/analytics.service.js'\nimport { BaseCommand } from '../commands/base-command.js'\n\ninterface LoginResponse {\n cliToken: string\n user: {\n email: string\n id: string\n }\n organization: {\n id: string\n }\n}\n\nexport class AuthService {\n private readonly config = new Conf({projectName: 'CopilotKitCLI'})\n private readonly COPILOT_CLOUD_BASE_URL = process.env.COPILOT_CLOUD_BASE_URL || 'https://cloud.copilotkit.ai'\n\n getToken(): string | undefined {\n return this.config.get('cliToken') as string | undefined\n }\n\n getCLIToken(): string | undefined {\n const cliToken = this.config.get('cliToken') as string | undefined\n return cliToken\n }\n\n async logout(cmd: BaseCommand): Promise<void> {\n this.config.delete('cliToken')\n }\n\n async requireLogin(cmd: Command): Promise<LoginResponse> {\n let cliToken = this.getCLIToken()\n // Check authentication\n if (!cliToken) {\n try {\n const {shouldLogin} = await inquirer.prompt([\n {\n name: 'shouldLogin',\n type: 'confirm',\n message: '🪁 You are not yet authenticated. Authenticate with Copilot Cloud? (press Enter to confirm)',\n default: true,\n },\n ])\n if (shouldLogin) {\n const loginResult = await this.login({exitAfterLogin: false})\n cliToken = loginResult.cliToken\n return loginResult\n } else {\n cmd.error('Authentication required to proceed.')\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'ExitPromptError') {\n cmd.error(chalk.yellow('\\nAuthentication cancelled'))\n }\n\n throw error\n }\n }\n\n let me\n\n const trpcClient = createTRPCClient(cliToken)\n try {\n me = await trpcClient.me.query()\n } catch (error) {\n cmd.log(chalk.red('Could not authenticate with Copilot Cloud. Please try again.'))\n process.exit(1)\n }\n\n if (!me.organization || !me.user) {\n cmd.error('Authentication required to proceed.')\n }\n\n return {cliToken, user: me.user, organization: me.organization}\n }\n\n async login({exitAfterLogin}: {exitAfterLogin?: boolean} = {exitAfterLogin: true}): Promise<LoginResponse> {\n const spinner = ora(\"🪁 Opening browser for authentication...\").start()\n let analytics: AnalyticsService\n analytics = new AnalyticsService()\n\n const app = express()\n app.use(cors())\n app.use(express.urlencoded({extended: true}))\n app.use(express.json())\n\n const port = await getPort()\n const state = crypto.randomBytes(16).toString('hex')\n\n return new Promise(async (resolve) => {\n const server = app.listen(port, () => {})\n\n await analytics.track({\n event: 'cli.login.initiated',\n properties: {},\n })\n\n spinner.text = '🪁 Waiting for browser authentication to complete...'\n\n app.post('/callback', async (req, res) => {\n const {cliToken, user, organization} = req.body\n\n analytics = new AnalyticsService({userId: user.id, organizationId: organization.id, email: user.email})\n await analytics.track({\n event: 'cli.login.success',\n properties: {\n organizationId: organization.id,\n userId: user.id,\n email: user.email,\n },\n })\n\n if (state !== req.query.state) {\n res.status(401).json({message: 'Invalid state'})\n spinner.fail('Invalid state')\n return\n }\n\n this.config.set('cliToken', cliToken)\n res.status(200).json({message: 'Callback called'})\n spinner.succeed(`🪁 Successfully logged in as ${chalk.hex('#7553fc')(user.email)}`)\n if (exitAfterLogin) {\n process.exit(0)\n } else {\n server.close();\n resolve({cliToken, user, organization});\n }\n })\n\n open(`${this.COPILOT_CLOUD_BASE_URL}/cli-auth?callbackUrl=http://localhost:${port}/callback&state=${state}`)\n })\n }\n}\n","import {createTRPCClient as trpcClient, httpBatchLink} from '@trpc/client'\nimport superjson from 'superjson'\n\nexport const COPILOT_CLOUD_BASE_URL = process.env.COPILOT_CLOUD_BASE_URL || 'https://cloud.copilotkit.ai'\n\nexport function createTRPCClient(cliToken: string): any {\n return trpcClient({\n links: [\n httpBatchLink({\n url: `${COPILOT_CLOUD_BASE_URL}/api/trpc-cli`,\n transformer: superjson,\n headers: () => {\n return {\n 'x-trpc-source': 'cli',\n 'x-cli-token': cliToken,\n }\n },\n }),\n ],\n })\n}\n","import {Analytics} from '@segment/analytics-node'\nimport {AnalyticsEvents} from './events.js'\nimport Conf from 'conf'\n\nexport class AnalyticsService {\n private segment: Analytics | undefined\n private globalProperties: Record<string, any> = {}\n private userId: string | undefined;\n private email: string | undefined;\n private organizationId: string | undefined;\n private config = new Conf({projectName: 'CopilotKitCLI'})\n\n constructor(private readonly authData?: {\n userId: string,\n email: string,\n organizationId: string,\n }) {\n if (process.env.SEGMENT_DISABLED === 'true') {\n return;\n }\n\n const segmentWriteKey = process.env.SEGMENT_WRITE_KEY || \"9Pv6QyExYef2P4hPz4gks6QAvNMi2AOf\"\n\n this.globalProperties = {\n service: 'cli',\n }\n\n\n if (this.authData?.userId) {\n this.userId = this.authData.userId\n }\n\n if (this.authData?.email) {\n this.email = this.authData.email\n this.globalProperties.email = this.authData.email\n }\n\n if (this.authData?.organizationId) {\n this.organizationId = this.authData.organizationId\n }\n\n this.segment = new Analytics({\n writeKey: segmentWriteKey,\n disable: process.env.SEGMENT_DISABLE === 'true',\n })\n\n const config = new Conf({projectName: 'CopilotKitCLI'})\n if (!config.get('anonymousId')) {\n config.set('anonymousId', crypto.randomUUID())\n }\n }\n\n private getAnonymousId(): string {\n const anonymousId = this.config.get('anonymousId')\n if (!anonymousId) {\n const anonymousId = crypto.randomUUID()\n this.config.set('anonymousId', anonymousId)\n return anonymousId\n }\n\n return anonymousId as string;\n }\n\n public track<K extends keyof AnalyticsEvents>(\n event: Omit<Parameters<Analytics['track']>[0], 'userId'> & {\n event: K\n properties: AnalyticsEvents[K]\n },\n ): Promise<void> {\n if (!this.segment) {\n return Promise.resolve();\n }\n\n const payload = {\n userId: this.userId ? this.userId : undefined,\n email: this.email ? this.email : undefined,\n anonymousId: this.getAnonymousId(),\n event: event.event,\n properties: {\n ...this.globalProperties,\n ...event.properties,\n $groups: this.organizationId ? {\n segment_group: this.organizationId,\n } : undefined,\n eventProperties: {\n ...event.properties,\n ...this.globalProperties,\n },\n },\n }\n\n return new Promise((resolve, reject) => {\n this.segment!.track(payload, (err) => {\n if (err) {\n // Resolve anyway\n resolve();\n }\n\n resolve();\n })\n });\n }\n}\n","import { Command } from \"@oclif/core\";\nimport Sentry, { consoleIntegration } from \"@sentry/node\";\nimport { LIB_VERSION } from \"../utils/version.js\";\nimport { COPILOT_CLOUD_BASE_URL } from \"../utils/trpc.js\";\nimport chalk from \"chalk\";\n\nexport class BaseCommand extends Command {\n async init() {\n await this.checkCLIVersion();\n\n if (process.env.SENTRY_DISABLED === 'true') {\n return;\n }\n\n Sentry.init({\n dsn: process.env.SENTRY_DSN || \"https://1eea15d32e2eacb0456a77db5e39aeeb@o4507288195170304.ingest.us.sentry.io/4508581448581120\",\n integrations: [\n consoleIntegration(),\n ],\n // Tracing\n tracesSampleRate: 1.0, // Capture 100% of the transactions\n });\n }\n\n async catch(err: any) {\n if (process.env.SENTRY_DISABLED === 'true') {\n super.catch(err)\n return;\n }\n\n Sentry.captureException(err)\n super.catch(err)\n }\n\n async finally() {\n if (process.env.SENTRY_DISABLED === 'true') {\n return;\n }\n\n Sentry.close()\n }\n \n async run() {}\n\n async checkCLIVersion() {\n const response = await fetch(`${COPILOT_CLOUD_BASE_URL}/api/healthz`)\n\n const data = await response.json()\n const cloudVersion = data.cliVersion\n\n if (!cloudVersion || cloudVersion === LIB_VERSION) {\n return;\n }\n\n // TODO: add this back in, removed for crew ai launch since we don't want to keep releasing cloud\n // this.log(chalk.yellow('================ New version available! =================\\n'))\n // this.log(`You are using CopilotKit CLI v${LIB_VERSION}.`)\n // this.log(`A new CopilotKit CLI version is available (v${cloudVersion}).\\n`)\n // this.log('Please update your CLI to the latest version:\\n\\n')\n // this.log(`${chalk.cyan(chalk.underline(chalk.bold('npm:')))}\\t npm install -g copilotkit@${cloudVersion}\\n`)\n // this.log(`${chalk.cyan(chalk.underline(chalk.bold('pnpm:')))}\\t pnpm install -g copilotkit@${cloudVersion}\\n`)\n // this.log(`${chalk.cyan(chalk.underline(chalk.bold('yarn:')))}\\t yarn global add copilotkit@${cloudVersion}\\n`)\n // this.log(chalk.yellow('============================================================\\n\\n'))\n }\n\n async gracefulError(message: string) {\n this.log(\"\\n\" +chalk.red(message))\n process.exit(1)\n }\n}\n","// This is auto generated!\nexport const LIB_VERSION = \"0.0.25\";\n"],"mappings":"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","names":["chalk","Conf","crypto","anonymousId","Conf","trpcClient","crypto","chalk","chalk"]}
1
+ {"version":3,"sources":["../../src/commands/logout.ts","../../src/services/auth.service.ts","../../src/utils/trpc.ts","../../src/services/analytics.service.ts","../../src/commands/base-command.ts","../../src/utils/version.ts"],"sourcesContent":["import {Config} from '@oclif/core'\nimport chalk from 'chalk'\nimport ora from 'ora'\n\nimport {AuthService} from '../services/auth.service.js'\nimport { BaseCommand } from './base-command.js'\n\nexport default class CloudLogout extends BaseCommand {\n static override description = 'Logout from Copilot Cloud'\n\n static override examples = ['<%= config.bin %> logout']\n\n constructor(argv: string[], config: Config, private authService = new AuthService()) {\n super(argv, config)\n }\n\n public async run(): Promise<void> {\n await this.parse(CloudLogout)\n this.log(\"Logging out...\\n\");\n await this.authService.logout(this);\n this.log(chalk.green('Successfully logged out!'))\n }\n}\n","// @ts-ignore\nimport Conf from 'conf'\nimport cors from 'cors'\nimport express from 'express'\nimport crypto from 'node:crypto'\nimport open from 'open'\nimport getPort from 'get-port'\nimport ora from 'ora'\nimport chalk from 'chalk'\nimport inquirer from 'inquirer'\nimport {Command} from '@oclif/core'\nimport {createTRPCClient} from '../utils/trpc.js'\nimport {AnalyticsService} from '../services/analytics.service.js'\nimport { BaseCommand } from '../commands/base-command.js'\n\ninterface LoginResponse {\n cliToken: string\n user: {\n email: string\n id: string\n }\n organization: {\n id: string\n }\n}\n\nexport class AuthService {\n private readonly config = new Conf({projectName: 'CopilotKitCLI'})\n private readonly COPILOT_CLOUD_BASE_URL = process.env.COPILOT_CLOUD_BASE_URL || 'https://cloud.copilotkit.ai'\n\n getToken(): string | undefined {\n return this.config.get('cliToken') as string | undefined\n }\n\n getCLIToken(): string | undefined {\n const cliToken = this.config.get('cliToken') as string | undefined\n return cliToken\n }\n\n async logout(cmd: BaseCommand): Promise<void> {\n this.config.delete('cliToken')\n }\n\n async requireLogin(cmd: Command): Promise<LoginResponse> {\n let cliToken = this.getCLIToken()\n // Check authentication\n if (!cliToken) {\n try {\n const {shouldLogin} = await inquirer.prompt([\n {\n name: 'shouldLogin',\n type: 'confirm',\n message: '🪁 You are not yet authenticated. Authenticate with Copilot Cloud? (press Enter to confirm)',\n default: true,\n },\n ])\n if (shouldLogin) {\n const loginResult = await this.login({exitAfterLogin: false})\n cliToken = loginResult.cliToken\n return loginResult\n } else {\n cmd.error('Authentication required to proceed.')\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'ExitPromptError') {\n cmd.error(chalk.yellow('\\nAuthentication cancelled'))\n }\n\n throw error\n }\n }\n\n let me\n\n const trpcClient = createTRPCClient(cliToken)\n try {\n me = await trpcClient.me.query()\n } catch (error) {\n cmd.log(chalk.red('Could not authenticate with Copilot Cloud. Please try again.'))\n process.exit(1)\n }\n\n if (!me.organization || !me.user) {\n cmd.error('Authentication required to proceed.')\n }\n\n return {cliToken, user: me.user, organization: me.organization}\n }\n\n async login({exitAfterLogin}: {exitAfterLogin?: boolean} = {exitAfterLogin: true}): Promise<LoginResponse> {\n const spinner = ora(\"🪁 Opening browser for authentication...\").start()\n let analytics: AnalyticsService\n analytics = new AnalyticsService()\n\n const app = express()\n app.use(cors())\n app.use(express.urlencoded({extended: true}))\n app.use(express.json())\n\n const port = await getPort()\n const state = crypto.randomBytes(16).toString('hex')\n\n return new Promise(async (resolve) => {\n const server = app.listen(port, () => {})\n\n await analytics.track({\n event: 'cli.login.initiated',\n properties: {},\n })\n\n spinner.text = '🪁 Waiting for browser authentication to complete...'\n\n app.post('/callback', async (req, res) => {\n const {cliToken, user, organization} = req.body\n\n analytics = new AnalyticsService({userId: user.id, organizationId: organization.id, email: user.email})\n await analytics.track({\n event: 'cli.login.success',\n properties: {\n organizationId: organization.id,\n userId: user.id,\n email: user.email,\n },\n })\n\n if (state !== req.query.state) {\n res.status(401).json({message: 'Invalid state'})\n spinner.fail('Invalid state')\n return\n }\n\n this.config.set('cliToken', cliToken)\n res.status(200).json({message: 'Callback called'})\n spinner.succeed(`🪁 Successfully logged in as ${chalk.hex('#7553fc')(user.email)}`)\n if (exitAfterLogin) {\n process.exit(0)\n } else {\n server.close();\n resolve({cliToken, user, organization});\n }\n })\n\n open(`${this.COPILOT_CLOUD_BASE_URL}/cli-auth?callbackUrl=http://localhost:${port}/callback&state=${state}`)\n })\n }\n}\n","import {createTRPCClient as trpcClient, httpBatchLink} from '@trpc/client'\nimport superjson from 'superjson'\n\nexport const COPILOT_CLOUD_BASE_URL = process.env.COPILOT_CLOUD_BASE_URL || 'https://cloud.copilotkit.ai'\n\nexport function createTRPCClient(cliToken: string): any {\n return trpcClient({\n links: [\n httpBatchLink({\n url: `${COPILOT_CLOUD_BASE_URL}/api/trpc-cli`,\n transformer: superjson,\n headers: () => {\n return {\n 'x-trpc-source': 'cli',\n 'x-cli-token': cliToken,\n }\n },\n }),\n ],\n })\n}\n","import {Analytics} from '@segment/analytics-node'\nimport {AnalyticsEvents} from './events.js'\nimport Conf from 'conf'\n\nexport class AnalyticsService {\n private segment: Analytics | undefined\n private globalProperties: Record<string, any> = {}\n private userId: string | undefined;\n private email: string | undefined;\n private organizationId: string | undefined;\n private config = new Conf({projectName: 'CopilotKitCLI'})\n\n constructor(private readonly authData?: {\n userId: string,\n email: string,\n organizationId: string,\n }) {\n if (process.env.SEGMENT_DISABLED === 'true') {\n return;\n }\n\n const segmentWriteKey = process.env.SEGMENT_WRITE_KEY || \"9Pv6QyExYef2P4hPz4gks6QAvNMi2AOf\"\n\n this.globalProperties = {\n service: 'cli',\n }\n\n\n if (this.authData?.userId) {\n this.userId = this.authData.userId\n }\n\n if (this.authData?.email) {\n this.email = this.authData.email\n this.globalProperties.email = this.authData.email\n }\n\n if (this.authData?.organizationId) {\n this.organizationId = this.authData.organizationId\n }\n\n this.segment = new Analytics({\n writeKey: segmentWriteKey,\n disable: process.env.SEGMENT_DISABLE === 'true',\n })\n\n const config = new Conf({projectName: 'CopilotKitCLI'})\n if (!config.get('anonymousId')) {\n config.set('anonymousId', crypto.randomUUID())\n }\n }\n\n private getAnonymousId(): string {\n const anonymousId = this.config.get('anonymousId')\n if (!anonymousId) {\n const anonymousId = crypto.randomUUID()\n this.config.set('anonymousId', anonymousId)\n return anonymousId\n }\n\n return anonymousId as string;\n }\n\n public track<K extends keyof AnalyticsEvents>(\n event: Omit<Parameters<Analytics['track']>[0], 'userId'> & {\n event: K\n properties: AnalyticsEvents[K]\n },\n ): Promise<void> {\n if (!this.segment) {\n return Promise.resolve();\n }\n\n const payload = {\n userId: this.userId ? this.userId : undefined,\n email: this.email ? this.email : undefined,\n anonymousId: this.getAnonymousId(),\n event: event.event,\n properties: {\n ...this.globalProperties,\n ...event.properties,\n $groups: this.organizationId ? {\n segment_group: this.organizationId,\n } : undefined,\n eventProperties: {\n ...event.properties,\n ...this.globalProperties,\n },\n },\n }\n\n return new Promise((resolve, reject) => {\n this.segment!.track(payload, (err) => {\n if (err) {\n // Resolve anyway\n resolve();\n }\n\n resolve();\n })\n });\n }\n}\n","import { Command } from \"@oclif/core\";\nimport Sentry, { consoleIntegration } from \"@sentry/node\";\nimport { LIB_VERSION } from \"../utils/version.js\";\nimport { COPILOT_CLOUD_BASE_URL } from \"../utils/trpc.js\";\nimport chalk from \"chalk\";\n\nexport class BaseCommand extends Command {\n async init() {\n await this.checkCLIVersion();\n\n if (process.env.SENTRY_DISABLED === 'true') {\n return;\n }\n\n Sentry.init({\n dsn: process.env.SENTRY_DSN || \"https://1eea15d32e2eacb0456a77db5e39aeeb@o4507288195170304.ingest.us.sentry.io/4508581448581120\",\n integrations: [\n consoleIntegration(),\n ],\n // Tracing\n tracesSampleRate: 1.0, // Capture 100% of the transactions\n });\n }\n\n async catch(err: any) {\n if (process.env.SENTRY_DISABLED === 'true') {\n super.catch(err)\n return;\n }\n\n Sentry.captureException(err)\n super.catch(err)\n }\n\n async finally() {\n if (process.env.SENTRY_DISABLED === 'true') {\n return;\n }\n\n Sentry.close()\n }\n \n async run() {}\n\n async checkCLIVersion() {\n const response = await fetch(`${COPILOT_CLOUD_BASE_URL}/api/healthz`)\n\n const data = await response.json()\n const cloudVersion = data.cliVersion\n\n if (!cloudVersion || cloudVersion === LIB_VERSION) {\n return;\n }\n\n // TODO: add this back in, removed for crew ai launch since we don't want to keep releasing cloud\n // this.log(chalk.yellow('================ New version available! =================\\n'))\n // this.log(`You are using CopilotKit CLI v${LIB_VERSION}.`)\n // this.log(`A new CopilotKit CLI version is available (v${cloudVersion}).\\n`)\n // this.log('Please update your CLI to the latest version:\\n\\n')\n // this.log(`${chalk.cyan(chalk.underline(chalk.bold('npm:')))}\\t npm install -g copilotkit@${cloudVersion}\\n`)\n // this.log(`${chalk.cyan(chalk.underline(chalk.bold('pnpm:')))}\\t pnpm install -g copilotkit@${cloudVersion}\\n`)\n // this.log(`${chalk.cyan(chalk.underline(chalk.bold('yarn:')))}\\t yarn global add copilotkit@${cloudVersion}\\n`)\n // this.log(chalk.yellow('============================================================\\n\\n'))\n }\n\n async gracefulError(message: string) {\n this.log(\"\\n\" +chalk.red(message))\n process.exit(1)\n }\n}\n","// This is auto generated!\nexport const LIB_VERSION = \"0.0.26\";\n"],"mappings":"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","names":["chalk","Conf","crypto","anonymousId","Conf","trpcClient","crypto","chalk","chalk"]}
@@ -1,11 +1,12 @@
1
1
  export { questions } from './questions.js';
2
+ export { AGENT_FRAMEWORKS, AgentFrameworkSchema, ApiKeySchema, CHAT_COMPONENTS, CREW_FLOW_TEMPLATES, CREW_TYPES, ChatComponentSchema, Config, ConfigFlags, ConfigSchema, CrewFlowTemplateSchema, CrewTypeSchema, LANGGRAPH_AGENTS, LangGraphAgentSchema, NameSchema, Question, TokenSchema, UrlSchema, YES_NO, YesNoSchema, sanitizers } from './types/questions.js';
3
+ export { ChatTemplate, StarterTemplate, Template, templateMapping } from './types/templates.js';
2
4
  export { scaffoldShadCN } from './scaffold/shadcn.js';
3
5
  export { scaffoldEnv } from './scaffold/env.js';
4
6
  export { cloneGitHubSubdirectory, isValidGitHubUrl } from './scaffold/github.js';
5
7
  export { scaffoldPackages } from './scaffold/packages.js';
6
8
  export { AgentTemplates, scaffoldAgent } from './scaffold/agent.js';
7
9
  export { addCrewInputs } from './scaffold/crew-inputs.js';
8
- export { AGENT_FRAMEWORKS, AgentFramework, CHAT_COMPONENTS, CREW_FLOW_TEMPLATES, CREW_TYPES, ChatComponent, Config, ConfigFlags, CrewFlowTemplate, CrewType, Fields, LANGGRAPH_AGENTS, LangGraphAgent, Question, YesNo } from './types/questions.js';
9
- export { ChatTemplate, StarterTemplate, Template, templateMapping } from './types/templates.js';
10
- import 'ora';
11
10
  import '@oclif/core/interfaces';
11
+ import 'zod';
12
+ import 'ora';
@@ -1,15 +1,108 @@
1
1
  // src/lib/init/types/questions.ts
2
+ import { z } from "zod";
2
3
  import { Flags } from "@oclif/core";
3
4
  var AGENT_FRAMEWORKS = ["CrewAI", "LangGraph", "None"];
4
5
  var CREW_TYPES = ["Crews", "Flows"];
5
6
  var CHAT_COMPONENTS = ["CopilotChat", "CopilotSidebar", "Headless", "CopilotPopup"];
6
7
  var LANGGRAPH_AGENTS = ["Python Starter", "TypeScript Starter", "None"];
7
8
  var CREW_FLOW_TEMPLATES = ["Starter", "None"];
9
+ var YES_NO = ["Yes", "No"];
10
+ var sanitizers = {
11
+ // Remove trailing slash from URLs
12
+ url: (value) => {
13
+ if (!value) return value;
14
+ return value.trim().replace(/\/+$/, "");
15
+ },
16
+ // Trim whitespace from strings
17
+ trim: (value) => {
18
+ if (!value) return value;
19
+ return value.trim();
20
+ },
21
+ // Lowercase strings
22
+ lowercase: (value) => {
23
+ if (!value) return value;
24
+ return value.toLowerCase().trim();
25
+ },
26
+ // Clean API keys (remove whitespace)
27
+ apiKey: (value) => {
28
+ if (!value) return value;
29
+ return value.trim().replace(/\s/g, "");
30
+ }
31
+ };
32
+ var AgentFrameworkSchema = z.enum(AGENT_FRAMEWORKS);
33
+ var CrewTypeSchema = z.enum(CREW_TYPES);
34
+ var ChatComponentSchema = z.enum(CHAT_COMPONENTS);
35
+ var LangGraphAgentSchema = z.enum(LANGGRAPH_AGENTS);
36
+ var CrewFlowTemplateSchema = z.enum(CREW_FLOW_TEMPLATES);
37
+ var YesNoSchema = z.enum(YES_NO);
38
+ var UrlSchema = z.preprocess(
39
+ (val) => sanitizers.url(String(val)),
40
+ z.string().url("Please enter a valid URL").min(1, "URL is required")
41
+ );
42
+ var TokenSchema = z.preprocess(
43
+ (val) => sanitizers.trim(String(val)),
44
+ z.string().min(1, "Token is required")
45
+ );
46
+ var ApiKeySchema = z.preprocess(
47
+ (val) => sanitizers.apiKey(String(val)),
48
+ z.string().min(1, "API key is required")
49
+ );
50
+ var NameSchema = z.preprocess(
51
+ (val) => sanitizers.trim(String(val)),
52
+ z.string().min(1, "Name is required")
53
+ );
54
+ var ConfigSchema = z.object({
55
+ // Core fields
56
+ copilotKitVersion: z.string().optional(),
57
+ agentFramework: AgentFrameworkSchema,
58
+ chatUi: ChatComponentSchema.optional(),
59
+ // Yes/No fields
60
+ alreadyDeployed: YesNoSchema.optional(),
61
+ fastApiEnabled: YesNoSchema.optional(),
62
+ useCopilotCloud: YesNoSchema.optional(),
63
+ // LangGraph specific fields
64
+ langGraphAgent: LangGraphAgentSchema.optional(),
65
+ langGraphPlatform: YesNoSchema.optional(),
66
+ langGraphPlatformUrl: UrlSchema.optional(),
67
+ langGraphRemoteEndpointURL: UrlSchema.optional(),
68
+ // CrewAI specific fields
69
+ crewType: CrewTypeSchema.optional(),
70
+ crewName: NameSchema.optional(),
71
+ crewUrl: UrlSchema.optional(),
72
+ crewBearerToken: TokenSchema.optional(),
73
+ crewFlowAgent: CrewFlowTemplateSchema.optional(),
74
+ // API keys and tokens
75
+ copilotCloudPublicApiKey: z.string().optional(),
76
+ langSmithApiKey: ApiKeySchema.optional(),
77
+ llmToken: ApiKeySchema.optional()
78
+ }).refine(
79
+ (data) => {
80
+ if (data.agentFramework === "CrewAI" && data.crewType === "Crews") {
81
+ return !!data.crewUrl && !!data.crewBearerToken;
82
+ }
83
+ return true;
84
+ },
85
+ {
86
+ message: "Crew URL and bearer token are required for CrewAI Crews",
87
+ path: ["crewUrl", "crewBearerToken"]
88
+ }
89
+ ).refine(
90
+ (data) => {
91
+ if (data.agentFramework === "LangGraph" && data.alreadyDeployed === "Yes" && data.langGraphPlatform === "Yes") {
92
+ return !!data.langGraphPlatformUrl && !!data.langSmithApiKey;
93
+ }
94
+ return true;
95
+ },
96
+ {
97
+ message: "LangGraph Platform URL and LangSmith API key are required",
98
+ path: ["langGraphPlatformUrl", "langSmithApiKey"]
99
+ }
100
+ );
8
101
  var ConfigFlags = {
9
102
  copilotKitVersion: Flags.string({ description: "CopilotKit version to use (e.g. 1.7.0)" }),
10
103
  agentFramework: Flags.string({ description: "Agent framework to power your copilot", options: AGENT_FRAMEWORKS }),
11
- fastApiEnabled: Flags.string({ description: "Use FastAPI to serve your agent locally", options: ["Yes", "No"] }),
12
- useCopilotCloud: Flags.string({ description: "Use Copilot Cloud for production-ready hosting", options: ["Yes", "No"] }),
104
+ fastApiEnabled: Flags.string({ description: "Use FastAPI to serve your agent locally", options: YES_NO }),
105
+ useCopilotCloud: Flags.string({ description: "Use Copilot Cloud for production-ready hosting", options: YES_NO }),
13
106
  chatUi: Flags.string({ description: "Chat UI component to add to your app", options: CHAT_COMPONENTS }),
14
107
  langGraphAgent: Flags.string({ description: "LangGraph agent template to use", options: LANGGRAPH_AGENTS }),
15
108
  crewType: Flags.string({ description: "CrewAI implementation type", options: CREW_TYPES }),
@@ -46,13 +139,34 @@ var templateMapping = {
46
139
  };
47
140
 
48
141
  // src/lib/init/questions.ts
142
+ var validateUrl = (input) => {
143
+ try {
144
+ const sanitized = sanitizers.url(input);
145
+ const result = UrlSchema.safeParse(sanitized);
146
+ if (result.success) return true;
147
+ return result.error.errors[0]?.message || "Invalid URL format";
148
+ } catch (error) {
149
+ return "Invalid URL format";
150
+ }
151
+ };
152
+ var validateRequired = (input) => {
153
+ return sanitizers.trim(input) ? true : "This field is required";
154
+ };
49
155
  var questions = [
50
156
  // Core setup questions - always shown first
51
157
  {
52
158
  type: "select",
53
159
  name: "agentFramework",
54
160
  message: "\u{1F916} Choose your AI framework:",
55
- choices: Array.from(AGENT_FRAMEWORKS)
161
+ choices: Array.from(AGENT_FRAMEWORKS),
162
+ validate: (input) => {
163
+ try {
164
+ AgentFrameworkSchema.parse(input);
165
+ return true;
166
+ } catch (error) {
167
+ return "Please select a valid framework";
168
+ }
169
+ }
56
170
  },
57
171
  // CrewAI specific questions - shown when CrewAI selected
58
172
  {
@@ -60,7 +174,15 @@ var questions = [
60
174
  name: "crewType",
61
175
  message: "\u{1F465} What kind of CrewAI implementation would you like to use?",
62
176
  choices: Array.from(CREW_TYPES),
63
- when: (answers) => answers.agentFramework === "CrewAI"
177
+ when: (answers) => answers.agentFramework === "CrewAI",
178
+ validate: (input) => {
179
+ try {
180
+ CrewTypeSchema.parse(input);
181
+ return true;
182
+ } catch (error) {
183
+ return "Please select a valid crew type";
184
+ }
185
+ }
64
186
  },
65
187
  // CrewAI Crews specific questions - shown when CrewAI Crews selected
66
188
  {
@@ -68,20 +190,26 @@ var questions = [
68
190
  name: "crewName",
69
191
  message: "\u{1F465} What would you like to name your crew? (can be anything)",
70
192
  when: (answers) => answers.agentFramework === "CrewAI" && answers.crewType === "Crews",
71
- default: "MyCopilotCrew"
193
+ default: "MyCopilotCrew",
194
+ validate: validateRequired,
195
+ sanitize: sanitizers.trim
72
196
  },
73
197
  {
74
198
  type: "input",
75
199
  name: "crewUrl",
76
200
  message: "\u{1F517} Enter your Crew's URL:",
77
- when: (answers) => answers.agentFramework === "CrewAI" && answers.crewType === "Crews"
201
+ when: (answers) => answers.agentFramework === "CrewAI" && answers.crewType === "Crews",
202
+ validate: validateUrl,
203
+ sanitize: sanitizers.url
78
204
  },
79
205
  {
80
206
  type: "input",
81
207
  name: "crewBearerToken",
82
208
  message: "\u{1F511} Enter your Crew's bearer token:",
83
209
  when: (answers) => answers.agentFramework === "CrewAI" && answers.crewType === "Crews",
84
- sensitive: true
210
+ sensitive: true,
211
+ validate: validateRequired,
212
+ sanitize: sanitizers.trim
85
213
  },
86
214
  // CrewAI Flows specific questions - shown when CrewAI Flows selected
87
215
  {
@@ -96,25 +224,45 @@ var questions = [
96
224
  type: "yes/no",
97
225
  name: "alreadyDeployed",
98
226
  message: "\u{1F680} Is your LangGraph agent already deployed?",
99
- when: (answers) => answers.agentFramework === "LangGraph"
227
+ when: (answers) => answers.agentFramework === "LangGraph",
228
+ validate: (input) => {
229
+ try {
230
+ YesNoSchema.parse(input);
231
+ return true;
232
+ } catch (error) {
233
+ return "Please select Yes or No";
234
+ }
235
+ }
100
236
  },
101
237
  {
102
238
  type: "yes/no",
103
239
  name: "langGraphPlatform",
104
240
  message: "\u{1F99C}\u{1F517} Is it hosted with LangGraph Platform (local or cloud)?",
105
- when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "Yes"
241
+ when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "Yes",
242
+ validate: (input) => {
243
+ try {
244
+ YesNoSchema.parse(input);
245
+ return true;
246
+ } catch (error) {
247
+ return "Please select Yes or No";
248
+ }
249
+ }
106
250
  },
107
251
  {
108
252
  type: "input",
109
253
  name: "langGraphPlatformUrl",
110
254
  message: "\u{1F99C}\u{1F517} Enter your LangGraph platform URL:",
111
- when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "Yes" && answers.langGraphPlatform === "Yes"
255
+ when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "Yes" && answers.langGraphPlatform === "Yes",
256
+ validate: validateUrl,
257
+ sanitize: sanitizers.url
112
258
  },
113
259
  {
114
260
  type: "input",
115
261
  name: "langGraphRemoteEndpointURL",
116
262
  message: "\u{1F50C} Enter your LangGraph endpoint URL:",
117
- when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "Yes" && answers.langGraphPlatform === "No"
263
+ when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "Yes" && answers.langGraphPlatform === "No",
264
+ validate: validateUrl,
265
+ sanitize: sanitizers.url
118
266
  },
119
267
  {
120
268
  type: "select",
@@ -128,14 +276,24 @@ var questions = [
128
276
  name: "langSmithApiKey",
129
277
  message: "\u{1F99C}\u{1F517} Enter your LangSmith API key (required by LangGraph Platform) :",
130
278
  when: (answers) => answers.agentFramework === "LangGraph" && answers.langGraphPlatform === "Yes",
131
- sensitive: true
279
+ sensitive: true,
280
+ validate: validateRequired,
281
+ sanitize: sanitizers.apiKey
132
282
  },
133
283
  // Deployment options
134
284
  {
135
285
  type: "yes/no",
136
286
  name: "useCopilotCloud",
137
287
  message: "\u{1FA81} Deploy with Copilot Cloud? (recommended for production)",
138
- when: (answers) => !(answers.agentFramework === "CrewAI" && answers.crewType === "Crews") && answers.crewType !== "Flows" && answers.alreadyDeployed === "Yes"
288
+ when: (answers) => !(answers.agentFramework === "CrewAI" && answers.crewType === "Crews") && answers.crewType !== "Flows" && answers.alreadyDeployed === "Yes",
289
+ validate: (input) => {
290
+ try {
291
+ YesNoSchema.parse(input);
292
+ return true;
293
+ } catch (error) {
294
+ return "Please select Yes or No";
295
+ }
296
+ }
139
297
  },
140
298
  // {
141
299
  // type: 'yes/no',
@@ -161,7 +319,9 @@ var questions = [
161
319
  name: "llmToken",
162
320
  message: "\u{1F511} Enter your OpenAI API key (required for agent functionality):",
163
321
  when: (answers) => answers.agentFramework === "LangGraph" && answers.alreadyDeployed === "No" || answers.agentFramework === "CrewAI" && answers.crewType === "Flows",
164
- sensitive: true
322
+ sensitive: true,
323
+ validate: validateRequired,
324
+ sanitize: sanitizers.apiKey
165
325
  }
166
326
  ];
167
327
 
@@ -192,6 +352,18 @@ async function scaffoldShadCN(userAnswers) {
192
352
  components.push(templateMapping.RemoteEndpoint);
193
353
  break;
194
354
  }
355
+ } else {
356
+ switch (userAnswers.chatUi) {
357
+ case "CopilotChat":
358
+ components.push(...templateMapping.CopilotChat);
359
+ break;
360
+ case "CopilotSidebar":
361
+ components.push(...templateMapping.CopilotSidebar);
362
+ break;
363
+ case "CopilotPopup":
364
+ components.push(...templateMapping.CopilotPopup);
365
+ break;
366
+ }
195
367
  }
196
368
  await new Promise((resolve) => setTimeout(resolve, 100));
197
369
  try {
@@ -218,7 +390,7 @@ import fs from "fs";
218
390
  async function getLangGraphAgents(url, langSmithApiKey) {
219
391
  try {
220
392
  const response = await fetch(
221
- `${url}/assistants/search`,
393
+ `${url.trim().replace(/\/$/, "")}/assistants/search`,
222
394
  {
223
395
  method: "POST",
224
396
  headers: {
@@ -566,7 +738,7 @@ async function addCrewInputs(url, token) {
566
738
  }
567
739
  }
568
740
  async function getCrewInputs(url, token) {
569
- const response = await fetch(`${url}/inputs`, {
741
+ const response = await fetch(`${url.trim()}/inputs`, {
570
742
  headers: {
571
743
  Authorization: `Bearer ${token}`
572
744
  }
@@ -579,16 +751,29 @@ async function getCrewInputs(url, token) {
579
751
  }
580
752
  export {
581
753
  AGENT_FRAMEWORKS,
754
+ AgentFrameworkSchema,
582
755
  AgentTemplates,
756
+ ApiKeySchema,
583
757
  CHAT_COMPONENTS,
584
758
  CREW_FLOW_TEMPLATES,
585
759
  CREW_TYPES,
760
+ ChatComponentSchema,
586
761
  ConfigFlags,
762
+ ConfigSchema,
763
+ CrewFlowTemplateSchema,
764
+ CrewTypeSchema,
587
765
  LANGGRAPH_AGENTS,
766
+ LangGraphAgentSchema,
767
+ NameSchema,
768
+ TokenSchema,
769
+ UrlSchema,
770
+ YES_NO,
771
+ YesNoSchema,
588
772
  addCrewInputs,
589
773
  cloneGitHubSubdirectory,
590
774
  isValidGitHubUrl,
591
775
  questions,
776
+ sanitizers,
592
777
  scaffoldAgent,
593
778
  scaffoldEnv,
594
779
  scaffoldPackages,