copilotkit 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/dev.js +4 -4
- package/bin/run.js +7 -7
- package/dist/commands/base-command.js +1 -1
- package/dist/commands/base-command.js.map +1 -1
- package/dist/commands/create.d.ts +3 -0
- package/dist/commands/create.js +209 -6
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/dev.js +2 -2
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/init.js +209 -6
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.js +1 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +1 -1
- package/dist/commands/logout.js.map +1 -1
- package/dist/lib/init/index.js +3 -1
- package/dist/lib/init/index.js.map +1 -1
- package/dist/lib/init/scaffold/env.js +3 -1
- package/dist/lib/init/scaffold/env.js.map +1 -1
- package/dist/lib/init/scaffold/index.js +3 -1
- package/dist/lib/init/scaffold/index.js.map +1 -1
- package/dist/lib/init/scaffold/langgraph-assistants.js +3 -1
- package/dist/lib/init/scaffold/langgraph-assistants.js.map +1 -1
- package/dist/utils/version.d.ts +1 -1
- package/dist/utils/version.js +1 -1
- package/dist/utils/version.js.map +1 -1
- package/oclif.manifest.json +10 -2
- package/package.json +35 -41
package/dist/commands/dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/dev.ts","../../src/services/auth.service.ts","../../src/utils/trpc.ts","../../src/services/analytics.service.ts","../../src/utils/detect-endpoint-type.utils.ts","../../src/services/tunnel.service.ts","../../src/commands/base-command.ts","../../src/utils/version.ts"],"sourcesContent":["import { Config, Flags } from \"@oclif/core\";\nimport inquirer from \"inquirer\";\nimport { createId } from \"@paralleldrive/cuid2\";\nimport ora, { Ora } from \"ora\";\nimport chalk from \"chalk\";\n\nimport { AuthService } from \"../services/auth.service.js\";\nimport { createTRPCClient } from \"../utils/trpc.js\";\nimport {\n detectRemoteEndpointType,\n getHumanReadableEndpointType,\n RemoteEndpointType,\n} from \"../utils/detect-endpoint-type.utils.js\";\nimport { TunnelService } from \"../services/tunnel.service.js\";\nimport { AnalyticsService } from \"../services/analytics.service.js\";\nimport { BaseCommand } from \"./base-command.js\";\n\nconst DEFAULT_CLOUD_BASE_URL = \"https://cloud.copilotkit.ai\";\nconst CLOUD_BASE_URL =\n process.env.COPILOT_CLOUD_BASE_URL ?? DEFAULT_CLOUD_BASE_URL;\n\nexport default class Dev extends BaseCommand {\n static override flags = {\n port: Flags.string({ description: \"port\", required: true }),\n project: Flags.string({\n description: \"project ID (can be found in the Copilot Cloud dashboard)\",\n }),\n };\n\n static override description =\n \"Start local development for a CopilotKit project\";\n static override examples = [\n \"<%= config.bin %> <%= command.id %> --port 8000 --project proj_mv3laowus0lz11kklo57bdr6\",\n ];\n\n private trpcClient: ReturnType<typeof createTRPCClient> | null = null;\n private copilotCloudTunnelId: string | null = null;\n\n constructor(\n argv: string[],\n config: Config,\n private authService = new AuthService(),\n private tunnelService = new TunnelService(),\n ) {\n super(argv, config);\n }\n\n private async pingTunnelRecursively(): Promise<void> {\n if (!this.copilotCloudTunnelId) {\n return;\n }\n\n try {\n await this.trpcClient!.pingLocalTunnel.query({\n localTunnelId: this.copilotCloudTunnelId!,\n });\n } catch (error: any) {\n if (error?.data?.code === \"NOT_FOUND\") {\n this.gracefulError(error.message);\n } else {\n this.gracefulError(\n \"Failed to ping tunnel. The connection may have been lost.\",\n );\n }\n }\n\n await new Promise((resolve) => setTimeout(resolve, 5000));\n await this.pingTunnelRecursively();\n }\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Dev);\n\n // Check authentication\n const { cliToken, organization, user } =\n await this.authService.requireLogin(this, \"general\");\n const analytics = new AnalyticsService({\n userId: user.id,\n organizationId: organization.id,\n email: user.email,\n });\n\n this.trpcClient = createTRPCClient(cliToken);\n\n const availableProjects = await this.trpcClient.listOrgProjects.query({\n orgId: organization.id,\n });\n let selectedProjectId: string | null = null;\n\n // Get project ID\n if (flags.project) {\n if (\n !availableProjects.some((project: any) => project.id === flags.project)\n ) {\n this.log(chalk.red(`Project with ID ${flags.project} not found`));\n process.exit(1);\n }\n\n selectedProjectId = flags.project;\n this.log(chalk.green(`✅ Selected project ${selectedProjectId}`));\n } else {\n const { projectId } = await inquirer.prompt([\n {\n name: \"projectId\",\n type: \"list\",\n message: \"Select a project\",\n choices: availableProjects.map((project: any) => ({\n value: project.id,\n name: `${project.name} (ID: ${project.id})${availableProjects.length === 1 ? \" (press Enter to confirm)\" : \"\"}`,\n })),\n },\n ]);\n\n selectedProjectId = projectId;\n }\n\n // Remote endpoint type detection\n const { type: remoteEndpointType } = await detectRemoteEndpointType(\n `http://localhost:${flags.port}`,\n );\n\n if (remoteEndpointType === RemoteEndpointType.Invalid) {\n return this.gracefulError(\n `Invalid remote endpoint. Please ensure you are running a compatible endpoint at port ${flags.port} and try again.`,\n );\n }\n\n const humanReadableRemoteEndpointType =\n getHumanReadableEndpointType(remoteEndpointType);\n\n await analytics.track({\n event: \"cli.dev.initiatied\",\n properties: {\n port: flags.port,\n projectId: selectedProjectId!,\n endpointType: remoteEndpointType,\n },\n });\n\n this.log(\n chalk.green(`✅ ${humanReadableRemoteEndpointType} endpoint detected`),\n );\n const spinner = ora(\"Creating tunnel...\\n\").start();\n\n const tunnelId = createId();\n\n // Starting tunnel\n const setupTunnel = this.setupTunnel({\n tunnelId,\n port: parseInt(flags.port),\n subdomain: createId(),\n onSuccess: async ({ url, id }) => {\n // Print tunnel info\n this.log(\"\\nTunnel Information:\\n\");\n this.log(`${chalk.bold.cyan(\"• Tunnel URL:\\t\\t\")} ${chalk.white(url)}`);\n this.log(\n `${chalk.bold.cyan(\"• Endpoint Type:\\t\")} ${chalk.white(humanReadableRemoteEndpointType)}`,\n );\n this.log(\n `${chalk.bold.cyan(\"• Project:\\t\\t\")} ${chalk.white(`${CLOUD_BASE_URL}/projects/${selectedProjectId!}`)}`,\n );\n this.log(chalk.yellow(\"\\nPress Ctrl+C to stop the tunnel\"));\n this.log(\"\\n\");\n\n spinner.text = \"Linking local tunnel to Copilot Cloud...\";\n\n // Report to Cloud\n const { localTunnelId } =\n await this.trpcClient!.reportRemoteEndpointLocalTunnel.mutate({\n tunnelId: id,\n projectId: selectedProjectId!,\n endpointType:\n remoteEndpointType === RemoteEndpointType.CopilotKit\n ? \"CopilotKit\"\n : \"LangGraphCloud\",\n tunnelUrl: url,\n port: parseInt(flags.port),\n });\n\n this.copilotCloudTunnelId = localTunnelId;\n\n await analytics.track({\n event: \"cli.dev.tunnel.created\",\n properties: {\n tunnelId: localTunnelId,\n port: flags.port,\n projectId: selectedProjectId!,\n endpointType: remoteEndpointType,\n },\n });\n\n spinner.color = \"green\";\n spinner.text = \"🚀 Local tunnel is live and linked to Copilot Cloud!\\n\";\n spinner.succeed();\n\n await this.pingTunnelRecursively();\n },\n onTunnelClose: async ({ id }) => {\n if (this.copilotCloudTunnelId) {\n await analytics.track({\n event: \"cli.dev.tunnel.closed\",\n properties: {\n tunnelId: id,\n },\n });\n\n await this.trpcClient!.deleteLocalTunnel.mutate({\n localTunnelId: this.copilotCloudTunnelId!,\n });\n this.copilotCloudTunnelId = null;\n }\n },\n spinner,\n });\n\n await Promise.all([setupTunnel]);\n }\n\n private async setupTunnel({\n port,\n subdomain,\n onSuccess,\n onTunnelClose,\n spinner,\n tunnelId,\n }: {\n port: number;\n subdomain?: string;\n onSuccess: (params: { url: string; id: string }) => Promise<void>;\n onTunnelClose: (params: { id: string }) => Promise<void>;\n spinner: Ora;\n tunnelId: string;\n }) {\n const TUNNEL_TIMEOUT = 15000; // 15 seconds\n const CONNECTION_TEST_TIMEOUT = 5000; // 5 seconds\n\n // First, test if the local port is accessible\n spinner.text = `Testing connection to localhost:${port}...`;\n try {\n const testResponse = await Promise.race([\n fetch(`http://localhost:${port}`, { method: \"HEAD\" }),\n new Promise((_, reject) =>\n setTimeout(\n () => reject(new Error(\"Connection timeout\")),\n CONNECTION_TEST_TIMEOUT,\n ),\n ),\n ]);\n } catch (error) {\n spinner.fail();\n return this.gracefulError(\n `Cannot connect to localhost:${port}. Please ensure your application is running on port ${port} and try again.`,\n );\n }\n\n spinner.text = \"Creating tunnel...\";\n\n try {\n // Create the tunnel with timeout\n const tunnel = await Promise.race([\n this.tunnelService.create({\n port,\n subdomain: tunnelId,\n }),\n new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error(\"Tunnel creation timeout\")),\n TUNNEL_TIMEOUT,\n ),\n ),\n ]);\n\n // Handle tunnel events\n tunnel.on(\"request\", (info: any) => {\n this.log(\n `${chalk.green(\"➜\")} ${chalk.white(new Date().toISOString())} - ${info.method} ${info.path}`,\n );\n });\n\n tunnel.on(\"error\", (err: any) => {\n this.gracefulError(chalk.red(`Tunnel error: ${err.message}`));\n });\n\n tunnel.on(\"close\", async () => {\n this.log(chalk.yellow(\"\\nTunnel closed\"));\n await onTunnelClose({ id: tunnelId });\n process.exit(0);\n });\n\n // Keep the process alive until Ctrl+C\n await Promise.all([\n new Promise<void>(() => {\n process.on(\"SIGINT\", async () => {\n this.log(\"\\nShutting down tunnel...\");\n await onTunnelClose({ id: tunnelId });\n tunnel.close();\n process.exit(0);\n });\n\n process.on(\"SIGTERM\", async () => {\n this.log(\"\\nShutting down tunnel...\");\n await onTunnelClose({ id: tunnelId });\n tunnel.close();\n process.exit(0);\n });\n }),\n onSuccess({ url: tunnel.url, id: tunnelId }),\n ]);\n } catch (error: any) {\n spinner.fail();\n if (error.message === \"Tunnel creation timeout\") {\n return this.gracefulError(\n `Unable to establish tunnel connection after ${TUNNEL_TIMEOUT / 1000} seconds.\\n\\n` +\n `This usually means:\\n` +\n `• Network connectivity issues\\n` +\n `• Tunnel service is temporarily unavailable\\n` +\n `• Firewall blocking outbound connections\\n\\n` +\n `Please try:\\n` +\n `1. Check your internet connection\\n` +\n `2. Try again in a few moments\\n`,\n );\n } else if (error.message === \"Connection timeout\") {\n return this.gracefulError(\n `Cannot connect to localhost:${port}. Please ensure your application is running on port ${port} and try again.`,\n );\n } else {\n return this.gracefulError(`Failed to create tunnel: ${error.message}`);\n }\n }\n }\n}\n","// @ts-ignore\nimport Conf from \"conf\";\nimport cors from \"cors\";\nimport express from \"express\";\nimport crypto from \"node:crypto\";\nimport open from \"open\";\nimport getPort from \"get-port\";\nimport ora from \"ora\";\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\nimport { Command } from \"@oclif/core\";\nimport { createTRPCClient } from \"../utils/trpc.js\";\nimport { AnalyticsService } from \"../services/analytics.service.js\";\nimport { BaseCommand } from \"../commands/base-command.js\";\n\ninterface LoginResponse {\n cliToken: string;\n user: {\n email: string;\n id: string;\n };\n organization: {\n id: string;\n };\n}\n\nexport class AuthService {\n private readonly config = new Conf({ projectName: \"CopilotKitCLI\" });\n private readonly COPILOT_CLOUD_BASE_URL =\n 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(\n cmd: Command,\n context?: \"cloud-features\" | \"general\",\n ): Promise<LoginResponse> {\n let cliToken = this.getCLIToken();\n // Check authentication\n if (!cliToken) {\n try {\n let shouldLogin = true;\n\n // For cloud features, automatically proceed with login\n // For general usage, ask for confirmation\n if (context !== \"cloud-features\") {\n const response = await inquirer.prompt([\n {\n name: \"shouldLogin\",\n type: \"confirm\",\n message:\n \"🪁 You are not yet authenticated. Authenticate with Copilot Cloud? (press Enter to confirm)\",\n default: true,\n },\n ]);\n shouldLogin = response.shouldLogin;\n }\n\n if (shouldLogin) {\n // Show different message for cloud features vs general usage\n if (context === \"cloud-features\") {\n cmd.log(\n chalk.cyan(\"\\n🚀 Setting up Copilot Cloud authentication...\\n\"),\n );\n }\n const loginResult = await this.login({ exitAfterLogin: false });\n cliToken = loginResult.cliToken;\n return loginResult;\n } else {\n cmd.error(\"Authentication required to proceed.\");\n }\n } catch (error) {\n if (error instanceof Error && error.name === \"ExitPromptError\") {\n cmd.error(chalk.yellow(\"\\nAuthentication cancelled\"));\n }\n\n throw error;\n }\n }\n\n let me;\n\n const trpcClient = createTRPCClient(cliToken);\n try {\n me = await trpcClient.me.query();\n } catch (error) {\n // Token is invalid/expired, trigger new login\n cmd.log(\n chalk.yellow(\"Your authentication has expired. Re-authenticating...\"),\n );\n try {\n const loginResult = await this.login({ exitAfterLogin: false });\n return loginResult;\n } catch (loginError) {\n cmd.log(\n chalk.red(\n \"Could not authenticate with Copilot Cloud. Please run: npx copilotkit@latest login\",\n ),\n );\n process.exit(1);\n }\n }\n\n if (!me.organization || !me.user) {\n cmd.error(\"Authentication required to proceed.\");\n }\n\n return { cliToken, user: me.user, organization: me.organization };\n }\n\n async login(\n { exitAfterLogin }: { exitAfterLogin?: boolean } = { exitAfterLogin: true },\n ): 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, reject) => {\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 if (state !== req.query.state) {\n res.status(401).json({ message: \"Invalid state\" });\n spinner.fail(\"Invalid state\");\n server.close();\n reject(new Error(\"OAuth state mismatch\"));\n return;\n }\n\n analytics = new AnalyticsService({\n userId: user.id,\n organizationId: organization.id,\n email: user.email,\n });\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 this.config.set(\"cliToken\", cliToken);\n res.status(200).json({ message: \"Callback called\" });\n spinner.succeed(\n `🪁 Successfully logged in as ${chalk.hex(\"#7553fc\")(user.email)}`,\n );\n if (exitAfterLogin) {\n process.exit(0);\n } else {\n server.close();\n resolve({ cliToken, user, organization });\n }\n });\n\n open(\n `${this.COPILOT_CLOUD_BASE_URL}/cli-auth?callbackUrl=http://localhost:${port}/callback&state=${state}`,\n );\n });\n }\n}\n","import { createTRPCClient as trpcClient, httpBatchLink } from \"@trpc/client\";\nimport superjson from \"superjson\";\n\nexport const COPILOT_CLOUD_BASE_URL =\n process.env.COPILOT_CLOUD_BASE_URL || \"https://cloud.copilotkit.ai\";\n\nexport function createTRPCClient(cliToken: string): any {\n return trpcClient({\n links: [\n httpBatchLink({\n url: `${COPILOT_CLOUD_BASE_URL}/api/trpc-cli`,\n transformer: superjson,\n headers: () => {\n return {\n \"x-trpc-source\": \"cli\",\n \"x-cli-token\": cliToken,\n };\n },\n }),\n ],\n });\n}\n","import { Analytics } from \"@segment/analytics-node\";\nimport { PostHog } from \"posthog-node\";\nimport { AnalyticsEvents } from \"./events.js\";\nimport Conf from \"conf\";\n\nexport class AnalyticsService {\n private segment: Analytics | undefined;\n private posthog: PostHog | undefined;\n private globalProperties: Record<string, any> = {};\n private userId: string | undefined;\n private email: string | undefined;\n private organizationId: string | undefined;\n private config = new Conf({ projectName: \"CopilotKitCLI\" });\n\n constructor(\n private readonly authData?: {\n userId: string;\n email: string;\n organizationId: string;\n },\n ) {\n if (process.env.SEGMENT_DISABLED === \"true\") {\n return;\n }\n\n const segmentWriteKey =\n process.env.SEGMENT_WRITE_KEY || \"9Pv6QyExYef2P4hPz4gks6QAvNMi2AOf\";\n\n this.globalProperties = {\n service: \"cli\",\n };\n\n if (this.authData?.userId) {\n this.userId = this.authData.userId;\n }\n\n if (this.authData?.email) {\n this.email = this.authData.email;\n this.globalProperties.email = this.authData.email;\n }\n\n if (this.authData?.organizationId) {\n this.organizationId = this.authData.organizationId;\n }\n\n this.segment = new Analytics({\n writeKey: segmentWriteKey,\n disable: process.env.SEGMENT_DISABLE === \"true\",\n });\n\n // Initialize PostHog for feature flags\n if (process.env.POSTHOG_DISABLED !== \"true\") {\n const posthogKey =\n process.env.POSTHOG_KEY ||\n \"phc_XZdymVYjrph9Mi0xZYGNyCKexxgblXRR1jMENCtdz5Q\"; // Default key\n const posthogHost =\n process.env.POSTHOG_HOST || \"https://eu.i.posthog.com\";\n\n this.posthog = new PostHog(posthogKey, {\n host: posthogHost,\n });\n }\n\n const config = new Conf({ projectName: \"CopilotKitCLI\" });\n if (!config.get(\"anonymousId\")) {\n config.set(\"anonymousId\", crypto.randomUUID());\n }\n }\n\n private getAnonymousId(): string {\n const anonymousId = this.config.get(\"anonymousId\");\n if (!anonymousId) {\n const anonymousId = crypto.randomUUID();\n this.config.set(\"anonymousId\", anonymousId);\n return anonymousId;\n }\n\n return anonymousId as string;\n }\n\n public track<K extends keyof AnalyticsEvents>(\n event: Omit<Parameters<Analytics[\"track\"]>[0], \"userId\"> & {\n event: K;\n properties: AnalyticsEvents[K];\n },\n ): Promise<void> {\n if (!this.segment) {\n return Promise.resolve();\n }\n\n const payload = {\n userId: this.userId ? this.userId : undefined,\n email: this.email ? this.email : undefined,\n anonymousId: this.getAnonymousId(),\n event: event.event,\n properties: {\n ...this.globalProperties,\n ...event.properties,\n $groups: this.organizationId\n ? {\n segment_group: this.organizationId,\n }\n : undefined,\n eventProperties: {\n ...event.properties,\n ...this.globalProperties,\n },\n },\n };\n\n return new Promise((resolve, reject) => {\n this.segment!.track(payload, (err) => {\n if (err) {\n // Resolve anyway\n resolve();\n }\n\n resolve();\n });\n });\n }\n\n /**\n * Check if a feature flag is enabled\n */\n public async isFeatureEnabled(flagKey: string): Promise<boolean> {\n if (!this.posthog) {\n return false;\n }\n\n try {\n // Use authenticated user ID if available, otherwise use anonymous ID\n const distinctId = this.userId || this.getAnonymousId();\n const flag = await this.posthog.isFeatureEnabled(flagKey, distinctId);\n return Boolean(flag);\n } catch (error) {\n // If there's an error checking the flag, return false (flag disabled)\n console.warn(`Failed to check feature flag ${flagKey}:`, error);\n return false;\n }\n }\n\n /**\n * Get feature flag payload\n */\n public async getFeatureFlagPayload(flagKey: string): Promise<any> {\n if (!this.posthog) {\n return null;\n }\n\n try {\n // Use authenticated user ID if available, otherwise use anonymous ID\n const distinctId = this.userId || this.getAnonymousId();\n const payload = await this.posthog.getFeatureFlagPayload(\n flagKey,\n distinctId,\n );\n return payload;\n } catch (error) {\n // If there's an error getting the payload, return null\n console.warn(`Failed to get feature flag payload ${flagKey}:`, error);\n return null;\n }\n }\n\n /**\n * Shutdown analytics services\n */\n public async shutdown(): Promise<void> {\n if (this.posthog) {\n await this.posthog.shutdown();\n }\n }\n}\n","export enum RemoteEndpointType {\n LangGraphPlatform = \"LangGraphPlatform\",\n CopilotKit = \"CopilotKit\",\n CrewAI = \"CrewAI\",\n MCP = \"MCP\",\n Invalid = \"Invalid\",\n}\n\nconst removeTrailingSlash = (url: string) => url.replace(/\\/$/, \"\");\n\nexport const getHumanReadableEndpointType = (type: RemoteEndpointType) => {\n switch (type) {\n case RemoteEndpointType.LangGraphPlatform:\n return \"LangGraph Platform\";\n case RemoteEndpointType.CopilotKit:\n return \"CopilotKit\";\n case RemoteEndpointType.CrewAI:\n return \"CrewAI\";\n case RemoteEndpointType.MCP:\n return \"MCP\";\n default:\n return \"Invalid\";\n }\n};\n\nexport async function detectRemoteEndpointType(url: string): Promise<{\n url: string;\n type: RemoteEndpointType;\n humanReadableType: string;\n}> {\n // First check base URL\n const [isLangGraph, isLangGraphFastAPI, isCopilot, isCrewAI, isMCP] =\n await Promise.all([\n isLangGraphPlatformEndpoint(url),\n isLangGraphFastAPIEndpoint(url),\n isCopilotKitEndpoint(url),\n isCrewAIEndpoint(url),\n isMCPEndpoint(url),\n ]);\n\n // Check base endpoints first\n if (isLangGraph || isLangGraphFastAPI) {\n return {\n url,\n type: RemoteEndpointType.LangGraphPlatform,\n humanReadableType: \"LangGraph Platform\",\n };\n }\n\n if (isCopilot) {\n return {\n url,\n type: RemoteEndpointType.CopilotKit,\n humanReadableType: \"CopilotKit\",\n };\n }\n\n if (isCrewAI) {\n return {\n url,\n type: RemoteEndpointType.CrewAI,\n humanReadableType: \"CrewAI\",\n };\n }\n\n if (isMCP) {\n return {\n url,\n type: RemoteEndpointType.MCP,\n humanReadableType: \"MCP\",\n };\n }\n\n // If no match and URL doesn't already end with /copilotkit, try that path\n if (!url.endsWith(\"/copilotkit\")) {\n const copilotKitUrl = `${removeTrailingSlash(url)}/copilotkit`;\n const isCopilotWithPath = await isCopilotKitEndpoint(copilotKitUrl);\n\n if (isCopilotWithPath) {\n return {\n url: copilotKitUrl,\n type: RemoteEndpointType.CopilotKit,\n humanReadableType: \"CopilotKit\",\n };\n }\n }\n\n return {\n url,\n type: RemoteEndpointType.Invalid,\n humanReadableType: \"Invalid\",\n };\n}\n\nasync function isLangGraphPlatformEndpoint(\n url: string,\n retries: number = 0,\n): Promise<boolean> {\n let response;\n\n try {\n response = await fetch(`${url}/assistants/search`, {\n method: \"POST\",\n\n body: JSON.stringify({\n metadata: {},\n limit: 99,\n offset: 0,\n }),\n });\n } catch (error) {\n return false;\n }\n\n if (!response.ok) {\n if (response.status === 502) {\n if (retries < 3) {\n console.log(\"RETRYING LGC\", retries + 1);\n return isLangGraphPlatformEndpoint(url, retries + 1);\n }\n }\n\n if (response.status === 403) {\n return true;\n }\n\n return false;\n }\n\n const data = await response.json();\n\n if (data[0].assistant_id) {\n return true;\n }\n\n return false;\n}\n\nasync function isLangGraphFastAPIEndpoint(url: string): Promise<boolean> {\n let response;\n\n try {\n response = await fetch(`${url}/health`, {\n method: \"GET\",\n });\n } catch (error) {\n return false;\n }\n\n return response.ok;\n}\n\nasync function isCopilotKitEndpoint(\n url: string,\n retries: number = 0,\n): Promise<boolean> {\n let response;\n\n try {\n response = await fetch(`${url}/info`, {\n method: \"POST\",\n body: JSON.stringify({}),\n });\n } catch (error) {\n return false;\n }\n\n if (!response.ok) {\n if (response.status === 502) {\n if (retries < 3) {\n console.log(\"RETRYING CK\", retries + 1);\n return isCopilotKitEndpoint(url, retries + 1);\n }\n }\n\n return false;\n }\n\n const data = await response.json();\n\n if (data.agents && data.actions) {\n return true;\n }\n\n return false;\n}\n\nasync function isCrewAIEndpoint(url: string): Promise<boolean> {\n return url.toLowerCase().includes(\"crew\");\n}\n\nasync function isMCPEndpoint(_url: string): Promise<boolean> {\n return true;\n}\n","import type { Tunnel } from \"localtunnel\";\n\nimport axios from \"axios\";\nimport localtunnel from \"localtunnel\";\n\nexport interface TunnelOptions {\n port: number;\n subdomain?: string;\n}\n\nexport class TunnelService {\n private readonly META_DATA_URL =\n \"https://metadata-cdn.copilotkit.ai/cloud.config.json\";\n\n async create(options: TunnelOptions): Promise<Tunnel> {\n const metadata = await this.getMetaData();\n\n return localtunnel({\n ...options,\n host: metadata.tunnelHost,\n });\n }\n\n async getMetaData() {\n const response = await axios.get<{\n tunnelHost: string;\n }>(this.META_DATA_URL);\n return response.data;\n }\n}\n","import { Command } from \"@oclif/core\";\nimport Sentry, { consoleIntegration } from \"@sentry/node\";\nimport { LIB_VERSION } from \"../utils/version.js\";\nimport { COPILOT_CLOUD_BASE_URL } from \"../utils/trpc.js\";\nimport chalk from \"chalk\";\n\nexport class BaseCommand extends Command {\n async init() {\n await this.checkCLIVersion();\n\n if (process.env.SENTRY_DISABLED === \"true\") {\n return;\n }\n\n Sentry.init({\n dsn:\n process.env.SENTRY_DSN ||\n \"https://1eea15d32e2eacb0456a77db5e39aeeb@o4507288195170304.ingest.us.sentry.io/4508581448581120\",\n integrations: [consoleIntegration()],\n // Tracing\n tracesSampleRate: 1.0, // Capture 100% of the transactions\n });\n }\n\n async catch(err: any) {\n if (process.env.SENTRY_DISABLED !== \"true\") {\n Sentry.captureException(err);\n }\n\n const message = err?.message ?? \"Unknown error\";\n\n this.log(\"\\n\" + chalk.red(message) + \"\\n\");\n\n const exitCode = err?.oclif?.exit ?? 1;\n this.exit(exitCode);\n }\n\n async finally() {\n if (process.env.SENTRY_DISABLED === \"true\") {\n return;\n }\n\n Sentry.close();\n }\n\n async run() {}\n\n async checkCLIVersion() {\n try {\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 } catch {\n // Version check is non-critical — don't crash the CLI when offline\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 = \"1.0.0\";\n"],"mappings":"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","names":["inquirer","ora","chalk","Conf","crypto","anonymousId","Conf","trpcClient","crypto","chalk","chalk","inquirer","ora"]}
|
|
1
|
+
{"version":3,"sources":["../../src/commands/dev.ts","../../src/services/auth.service.ts","../../src/utils/trpc.ts","../../src/services/analytics.service.ts","../../src/utils/detect-endpoint-type.utils.ts","../../src/services/tunnel.service.ts","../../src/commands/base-command.ts","../../src/utils/version.ts"],"sourcesContent":["import { Config, Flags } from \"@oclif/core\";\nimport inquirer from \"inquirer\";\nimport { createId } from \"@paralleldrive/cuid2\";\nimport ora, { Ora } from \"ora\";\nimport chalk from \"chalk\";\n\nimport { AuthService } from \"../services/auth.service.js\";\nimport { createTRPCClient } from \"../utils/trpc.js\";\nimport {\n detectRemoteEndpointType,\n getHumanReadableEndpointType,\n RemoteEndpointType,\n} from \"../utils/detect-endpoint-type.utils.js\";\nimport { TunnelService } from \"../services/tunnel.service.js\";\nimport { AnalyticsService } from \"../services/analytics.service.js\";\nimport { BaseCommand } from \"./base-command.js\";\n\nconst DEFAULT_CLOUD_BASE_URL = \"https://cloud.copilotkit.ai\";\nconst CLOUD_BASE_URL =\n process.env.COPILOT_CLOUD_BASE_URL ?? DEFAULT_CLOUD_BASE_URL;\n\nexport default class Dev extends BaseCommand {\n static override flags = {\n port: Flags.string({ description: \"port\", required: true }),\n project: Flags.string({\n description: \"project ID (can be found in the Copilot Cloud dashboard)\",\n }),\n };\n\n static override description =\n \"Start local development for a CopilotKit project\";\n static override examples = [\n \"<%= config.bin %> <%= command.id %> --port 8000 --project proj_mv3laowus0lz11kklo57bdr6\",\n ];\n\n private trpcClient: ReturnType<typeof createTRPCClient> | null = null;\n private copilotCloudTunnelId: string | null = null;\n\n constructor(\n argv: string[],\n config: Config,\n private authService = new AuthService(),\n private tunnelService = new TunnelService(),\n ) {\n super(argv, config);\n }\n\n private async pingTunnelRecursively(): Promise<void> {\n if (!this.copilotCloudTunnelId) {\n return;\n }\n\n try {\n await this.trpcClient!.pingLocalTunnel.query({\n localTunnelId: this.copilotCloudTunnelId!,\n });\n } catch (error: any) {\n if (error?.data?.code === \"NOT_FOUND\") {\n this.gracefulError(error.message);\n } else {\n this.gracefulError(\n \"Failed to ping tunnel. The connection may have been lost.\",\n );\n }\n }\n\n await new Promise((resolve) => setTimeout(resolve, 5000));\n await this.pingTunnelRecursively();\n }\n\n public async run(): Promise<void> {\n const { flags } = await this.parse(Dev);\n\n // Check authentication\n const { cliToken, organization, user } =\n await this.authService.requireLogin(this, \"general\");\n const analytics = new AnalyticsService({\n userId: user.id,\n organizationId: organization.id,\n email: user.email,\n });\n\n this.trpcClient = createTRPCClient(cliToken);\n\n const availableProjects = await this.trpcClient.listOrgProjects.query({\n orgId: organization.id,\n });\n let selectedProjectId: string | null = null;\n\n // Get project ID\n if (flags.project) {\n if (\n !availableProjects.some((project: any) => project.id === flags.project)\n ) {\n this.log(chalk.red(`Project with ID ${flags.project} not found`));\n process.exit(1);\n }\n\n selectedProjectId = flags.project;\n this.log(chalk.green(`✅ Selected project ${selectedProjectId}`));\n } else {\n const { projectId } = await inquirer.prompt([\n {\n name: \"projectId\",\n type: \"list\",\n message: \"Select a project\",\n choices: availableProjects.map((project: any) => ({\n value: project.id,\n name: `${project.name} (ID: ${project.id})${availableProjects.length === 1 ? \" (press Enter to confirm)\" : \"\"}`,\n })),\n },\n ]);\n\n selectedProjectId = projectId;\n }\n\n // Remote endpoint type detection\n const { type: remoteEndpointType } = await detectRemoteEndpointType(\n `http://localhost:${flags.port}`,\n );\n\n if (remoteEndpointType === RemoteEndpointType.Invalid) {\n return this.gracefulError(\n `Invalid remote endpoint. Please ensure you are running a compatible endpoint at port ${flags.port} and try again.`,\n );\n }\n\n const humanReadableRemoteEndpointType =\n getHumanReadableEndpointType(remoteEndpointType);\n\n await analytics.track({\n event: \"cli.dev.initiatied\",\n properties: {\n port: flags.port,\n projectId: selectedProjectId!,\n endpointType: remoteEndpointType,\n },\n });\n\n this.log(\n chalk.green(`✅ ${humanReadableRemoteEndpointType} endpoint detected`),\n );\n const spinner = ora(\"Creating tunnel...\\n\").start();\n\n const tunnelId = createId();\n\n // Starting tunnel\n const setupTunnel = this.setupTunnel({\n tunnelId,\n port: parseInt(flags.port),\n subdomain: createId(),\n onSuccess: async ({ url, id }) => {\n // Print tunnel info\n this.log(\"\\nTunnel Information:\\n\");\n this.log(`${chalk.bold.cyan(\"• Tunnel URL:\\t\\t\")} ${chalk.white(url)}`);\n this.log(\n `${chalk.bold.cyan(\"• Endpoint Type:\\t\")} ${chalk.white(humanReadableRemoteEndpointType)}`,\n );\n this.log(\n `${chalk.bold.cyan(\"• Project:\\t\\t\")} ${chalk.white(`${CLOUD_BASE_URL}/projects/${selectedProjectId!}`)}`,\n );\n this.log(chalk.yellow(\"\\nPress Ctrl+C to stop the tunnel\"));\n this.log(\"\\n\");\n\n spinner.text = \"Linking local tunnel to Copilot Cloud...\";\n\n // Report to Cloud\n const { localTunnelId } =\n await this.trpcClient!.reportRemoteEndpointLocalTunnel.mutate({\n tunnelId: id,\n projectId: selectedProjectId!,\n endpointType:\n remoteEndpointType === RemoteEndpointType.CopilotKit\n ? \"CopilotKit\"\n : \"LangGraphCloud\",\n tunnelUrl: url,\n port: parseInt(flags.port),\n });\n\n this.copilotCloudTunnelId = localTunnelId;\n\n await analytics.track({\n event: \"cli.dev.tunnel.created\",\n properties: {\n tunnelId: localTunnelId,\n port: flags.port,\n projectId: selectedProjectId!,\n endpointType: remoteEndpointType,\n },\n });\n\n spinner.color = \"green\";\n spinner.text = \"🚀 Local tunnel is live and linked to Copilot Cloud!\\n\";\n spinner.succeed();\n\n await this.pingTunnelRecursively();\n },\n onTunnelClose: async ({ id }) => {\n if (this.copilotCloudTunnelId) {\n await analytics.track({\n event: \"cli.dev.tunnel.closed\",\n properties: {\n tunnelId: id,\n },\n });\n\n await this.trpcClient!.deleteLocalTunnel.mutate({\n localTunnelId: this.copilotCloudTunnelId!,\n });\n this.copilotCloudTunnelId = null;\n }\n },\n spinner,\n });\n\n [await setupTunnel];\n }\n\n private async setupTunnel({\n port,\n subdomain,\n onSuccess,\n onTunnelClose,\n spinner,\n tunnelId,\n }: {\n port: number;\n subdomain?: string;\n onSuccess: (params: { url: string; id: string }) => Promise<void>;\n onTunnelClose: (params: { id: string }) => Promise<void>;\n spinner: Ora;\n tunnelId: string;\n }) {\n const TUNNEL_TIMEOUT = 15000; // 15 seconds\n const CONNECTION_TEST_TIMEOUT = 5000; // 5 seconds\n\n // First, test if the local port is accessible\n spinner.text = `Testing connection to localhost:${port}...`;\n try {\n const testResponse = await Promise.race([\n fetch(`http://localhost:${port}`, { method: \"HEAD\" }),\n new Promise((_, reject) =>\n setTimeout(\n () => reject(new Error(\"Connection timeout\")),\n CONNECTION_TEST_TIMEOUT,\n ),\n ),\n ]);\n } catch (error) {\n spinner.fail();\n return this.gracefulError(\n `Cannot connect to localhost:${port}. Please ensure your application is running on port ${port} and try again.`,\n );\n }\n\n spinner.text = \"Creating tunnel...\";\n\n try {\n // Create the tunnel with timeout\n const tunnel = await Promise.race([\n this.tunnelService.create({\n port,\n subdomain: tunnelId,\n }),\n new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error(\"Tunnel creation timeout\")),\n TUNNEL_TIMEOUT,\n ),\n ),\n ]);\n\n // Handle tunnel events\n tunnel.on(\"request\", (info: any) => {\n this.log(\n `${chalk.green(\"➜\")} ${chalk.white(new Date().toISOString())} - ${info.method} ${info.path}`,\n );\n });\n\n tunnel.on(\"error\", (err: any) => {\n this.gracefulError(chalk.red(`Tunnel error: ${err.message}`));\n });\n\n tunnel.on(\"close\", async () => {\n this.log(chalk.yellow(\"\\nTunnel closed\"));\n await onTunnelClose({ id: tunnelId });\n process.exit(0);\n });\n\n // Keep the process alive until Ctrl+C\n await Promise.all([\n new Promise<void>(() => {\n process.on(\"SIGINT\", async () => {\n this.log(\"\\nShutting down tunnel...\");\n await onTunnelClose({ id: tunnelId });\n tunnel.close();\n process.exit(0);\n });\n\n process.on(\"SIGTERM\", async () => {\n this.log(\"\\nShutting down tunnel...\");\n await onTunnelClose({ id: tunnelId });\n tunnel.close();\n process.exit(0);\n });\n }),\n onSuccess({ url: tunnel.url, id: tunnelId }),\n ]);\n } catch (error: any) {\n spinner.fail();\n if (error.message === \"Tunnel creation timeout\") {\n return this.gracefulError(\n `Unable to establish tunnel connection after ${TUNNEL_TIMEOUT / 1000} seconds.\\n\\n` +\n `This usually means:\\n` +\n `• Network connectivity issues\\n` +\n `• Tunnel service is temporarily unavailable\\n` +\n `• Firewall blocking outbound connections\\n\\n` +\n `Please try:\\n` +\n `1. Check your internet connection\\n` +\n `2. Try again in a few moments\\n`,\n );\n } else if (error.message === \"Connection timeout\") {\n return this.gracefulError(\n `Cannot connect to localhost:${port}. Please ensure your application is running on port ${port} and try again.`,\n );\n } else {\n return this.gracefulError(`Failed to create tunnel: ${error.message}`);\n }\n }\n }\n}\n","// @ts-ignore\nimport Conf from \"conf\";\nimport cors from \"cors\";\nimport express from \"express\";\nimport crypto from \"node:crypto\";\nimport open from \"open\";\nimport getPort from \"get-port\";\nimport ora from \"ora\";\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\nimport { Command } from \"@oclif/core\";\nimport { createTRPCClient } from \"../utils/trpc.js\";\nimport { AnalyticsService } from \"../services/analytics.service.js\";\nimport { BaseCommand } from \"../commands/base-command.js\";\n\ninterface LoginResponse {\n cliToken: string;\n user: {\n email: string;\n id: string;\n };\n organization: {\n id: string;\n };\n}\n\nexport class AuthService {\n private readonly config = new Conf({ projectName: \"CopilotKitCLI\" });\n private readonly COPILOT_CLOUD_BASE_URL =\n 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(\n cmd: Command,\n context?: \"cloud-features\" | \"general\",\n ): Promise<LoginResponse> {\n let cliToken = this.getCLIToken();\n // Check authentication\n if (!cliToken) {\n try {\n let shouldLogin = true;\n\n // For cloud features, automatically proceed with login\n // For general usage, ask for confirmation\n if (context !== \"cloud-features\") {\n const response = await inquirer.prompt([\n {\n name: \"shouldLogin\",\n type: \"confirm\",\n message:\n \"🪁 You are not yet authenticated. Authenticate with Copilot Cloud? (press Enter to confirm)\",\n default: true,\n },\n ]);\n shouldLogin = response.shouldLogin;\n }\n\n if (shouldLogin) {\n // Show different message for cloud features vs general usage\n if (context === \"cloud-features\") {\n cmd.log(\n chalk.cyan(\"\\n🚀 Setting up Copilot Cloud authentication...\\n\"),\n );\n }\n const loginResult = await this.login({ exitAfterLogin: false });\n cliToken = loginResult.cliToken;\n return loginResult;\n } else {\n cmd.error(\"Authentication required to proceed.\");\n }\n } catch (error) {\n if (error instanceof Error && error.name === \"ExitPromptError\") {\n cmd.error(chalk.yellow(\"\\nAuthentication cancelled\"));\n }\n\n throw error;\n }\n }\n\n let me;\n\n const trpcClient = createTRPCClient(cliToken);\n try {\n me = await trpcClient.me.query();\n } catch (error) {\n // Token is invalid/expired, trigger new login\n cmd.log(\n chalk.yellow(\"Your authentication has expired. Re-authenticating...\"),\n );\n try {\n const loginResult = await this.login({ exitAfterLogin: false });\n return loginResult;\n } catch (loginError) {\n cmd.log(\n chalk.red(\n \"Could not authenticate with Copilot Cloud. Please run: npx copilotkit@latest login\",\n ),\n );\n process.exit(1);\n }\n }\n\n if (!me.organization || !me.user) {\n cmd.error(\"Authentication required to proceed.\");\n }\n\n return { cliToken, user: me.user, organization: me.organization };\n }\n\n async login(\n { exitAfterLogin }: { exitAfterLogin?: boolean } = { exitAfterLogin: true },\n ): 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, reject) => {\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 if (state !== req.query.state) {\n res.status(401).json({ message: \"Invalid state\" });\n spinner.fail(\"Invalid state\");\n server.close();\n reject(new Error(\"OAuth state mismatch\"));\n return;\n }\n\n analytics = new AnalyticsService({\n userId: user.id,\n organizationId: organization.id,\n email: user.email,\n });\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 this.config.set(\"cliToken\", cliToken);\n res.status(200).json({ message: \"Callback called\" });\n spinner.succeed(\n `🪁 Successfully logged in as ${chalk.hex(\"#7553fc\")(user.email)}`,\n );\n if (exitAfterLogin) {\n process.exit(0);\n } else {\n server.close();\n resolve({ cliToken, user, organization });\n }\n });\n\n open(\n `${this.COPILOT_CLOUD_BASE_URL}/cli-auth?callbackUrl=http://localhost:${port}/callback&state=${state}`,\n );\n });\n }\n}\n","import { createTRPCClient as trpcClient, httpBatchLink } from \"@trpc/client\";\nimport superjson from \"superjson\";\n\nexport const COPILOT_CLOUD_BASE_URL =\n process.env.COPILOT_CLOUD_BASE_URL || \"https://cloud.copilotkit.ai\";\n\nexport function createTRPCClient(cliToken: string): any {\n return trpcClient({\n links: [\n httpBatchLink({\n url: `${COPILOT_CLOUD_BASE_URL}/api/trpc-cli`,\n transformer: superjson,\n headers: () => {\n return {\n \"x-trpc-source\": \"cli\",\n \"x-cli-token\": cliToken,\n };\n },\n }),\n ],\n });\n}\n","import { Analytics } from \"@segment/analytics-node\";\nimport { PostHog } from \"posthog-node\";\nimport { AnalyticsEvents } from \"./events.js\";\nimport Conf from \"conf\";\n\nexport class AnalyticsService {\n private segment: Analytics | undefined;\n private posthog: PostHog | undefined;\n private globalProperties: Record<string, any> = {};\n private userId: string | undefined;\n private email: string | undefined;\n private organizationId: string | undefined;\n private config = new Conf({ projectName: \"CopilotKitCLI\" });\n\n constructor(\n private readonly authData?: {\n userId: string;\n email: string;\n organizationId: string;\n },\n ) {\n if (process.env.SEGMENT_DISABLED === \"true\") {\n return;\n }\n\n const segmentWriteKey =\n process.env.SEGMENT_WRITE_KEY || \"9Pv6QyExYef2P4hPz4gks6QAvNMi2AOf\";\n\n this.globalProperties = {\n service: \"cli\",\n };\n\n if (this.authData?.userId) {\n this.userId = this.authData.userId;\n }\n\n if (this.authData?.email) {\n this.email = this.authData.email;\n this.globalProperties.email = this.authData.email;\n }\n\n if (this.authData?.organizationId) {\n this.organizationId = this.authData.organizationId;\n }\n\n this.segment = new Analytics({\n writeKey: segmentWriteKey,\n disable: process.env.SEGMENT_DISABLE === \"true\",\n });\n\n // Initialize PostHog for feature flags\n if (process.env.POSTHOG_DISABLED !== \"true\") {\n const posthogKey =\n process.env.POSTHOG_KEY ||\n \"phc_XZdymVYjrph9Mi0xZYGNyCKexxgblXRR1jMENCtdz5Q\"; // Default key\n const posthogHost =\n process.env.POSTHOG_HOST || \"https://eu.i.posthog.com\";\n\n this.posthog = new PostHog(posthogKey, {\n host: posthogHost,\n });\n }\n\n const config = new Conf({ projectName: \"CopilotKitCLI\" });\n if (!config.get(\"anonymousId\")) {\n config.set(\"anonymousId\", crypto.randomUUID());\n }\n }\n\n private getAnonymousId(): string {\n const anonymousId = this.config.get(\"anonymousId\");\n if (!anonymousId) {\n const anonymousId = crypto.randomUUID();\n this.config.set(\"anonymousId\", anonymousId);\n return anonymousId;\n }\n\n return anonymousId as string;\n }\n\n public track<K extends keyof AnalyticsEvents>(\n event: Omit<Parameters<Analytics[\"track\"]>[0], \"userId\"> & {\n event: K;\n properties: AnalyticsEvents[K];\n },\n ): Promise<void> {\n if (!this.segment) {\n return Promise.resolve();\n }\n\n const payload = {\n userId: this.userId ? this.userId : undefined,\n email: this.email ? this.email : undefined,\n anonymousId: this.getAnonymousId(),\n event: event.event,\n properties: {\n ...this.globalProperties,\n ...event.properties,\n $groups: this.organizationId\n ? {\n segment_group: this.organizationId,\n }\n : undefined,\n eventProperties: {\n ...event.properties,\n ...this.globalProperties,\n },\n },\n };\n\n return new Promise((resolve, reject) => {\n this.segment!.track(payload, (err) => {\n if (err) {\n // Resolve anyway\n resolve();\n }\n\n resolve();\n });\n });\n }\n\n /**\n * Check if a feature flag is enabled\n */\n public async isFeatureEnabled(flagKey: string): Promise<boolean> {\n if (!this.posthog) {\n return false;\n }\n\n try {\n // Use authenticated user ID if available, otherwise use anonymous ID\n const distinctId = this.userId || this.getAnonymousId();\n const flag = await this.posthog.isFeatureEnabled(flagKey, distinctId);\n return Boolean(flag);\n } catch (error) {\n // If there's an error checking the flag, return false (flag disabled)\n console.warn(`Failed to check feature flag ${flagKey}:`, error);\n return false;\n }\n }\n\n /**\n * Get feature flag payload\n */\n public async getFeatureFlagPayload(flagKey: string): Promise<any> {\n if (!this.posthog) {\n return null;\n }\n\n try {\n // Use authenticated user ID if available, otherwise use anonymous ID\n const distinctId = this.userId || this.getAnonymousId();\n const payload = await this.posthog.getFeatureFlagPayload(\n flagKey,\n distinctId,\n );\n return payload;\n } catch (error) {\n // If there's an error getting the payload, return null\n console.warn(`Failed to get feature flag payload ${flagKey}:`, error);\n return null;\n }\n }\n\n /**\n * Shutdown analytics services\n */\n public async shutdown(): Promise<void> {\n if (this.posthog) {\n await this.posthog.shutdown();\n }\n }\n}\n","export enum RemoteEndpointType {\n LangGraphPlatform = \"LangGraphPlatform\",\n CopilotKit = \"CopilotKit\",\n CrewAI = \"CrewAI\",\n MCP = \"MCP\",\n Invalid = \"Invalid\",\n}\n\nconst removeTrailingSlash = (url: string) => url.replace(/\\/$/, \"\");\n\nexport const getHumanReadableEndpointType = (type: RemoteEndpointType) => {\n switch (type) {\n case RemoteEndpointType.LangGraphPlatform:\n return \"LangGraph Platform\";\n case RemoteEndpointType.CopilotKit:\n return \"CopilotKit\";\n case RemoteEndpointType.CrewAI:\n return \"CrewAI\";\n case RemoteEndpointType.MCP:\n return \"MCP\";\n default:\n return \"Invalid\";\n }\n};\n\nexport async function detectRemoteEndpointType(url: string): Promise<{\n url: string;\n type: RemoteEndpointType;\n humanReadableType: string;\n}> {\n // First check base URL\n const [isLangGraph, isLangGraphFastAPI, isCopilot, isCrewAI, isMCP] =\n await Promise.all([\n isLangGraphPlatformEndpoint(url),\n isLangGraphFastAPIEndpoint(url),\n isCopilotKitEndpoint(url),\n isCrewAIEndpoint(url),\n isMCPEndpoint(url),\n ]);\n\n // Check base endpoints first\n if (isLangGraph || isLangGraphFastAPI) {\n return {\n url,\n type: RemoteEndpointType.LangGraphPlatform,\n humanReadableType: \"LangGraph Platform\",\n };\n }\n\n if (isCopilot) {\n return {\n url,\n type: RemoteEndpointType.CopilotKit,\n humanReadableType: \"CopilotKit\",\n };\n }\n\n if (isCrewAI) {\n return {\n url,\n type: RemoteEndpointType.CrewAI,\n humanReadableType: \"CrewAI\",\n };\n }\n\n if (isMCP) {\n return {\n url,\n type: RemoteEndpointType.MCP,\n humanReadableType: \"MCP\",\n };\n }\n\n // If no match and URL doesn't already end with /copilotkit, try that path\n if (!url.endsWith(\"/copilotkit\")) {\n const copilotKitUrl = `${removeTrailingSlash(url)}/copilotkit`;\n const isCopilotWithPath = await isCopilotKitEndpoint(copilotKitUrl);\n\n if (isCopilotWithPath) {\n return {\n url: copilotKitUrl,\n type: RemoteEndpointType.CopilotKit,\n humanReadableType: \"CopilotKit\",\n };\n }\n }\n\n return {\n url,\n type: RemoteEndpointType.Invalid,\n humanReadableType: \"Invalid\",\n };\n}\n\nasync function isLangGraphPlatformEndpoint(\n url: string,\n retries: number = 0,\n): Promise<boolean> {\n let response;\n\n try {\n response = await fetch(`${url}/assistants/search`, {\n method: \"POST\",\n\n body: JSON.stringify({\n metadata: {},\n limit: 99,\n offset: 0,\n }),\n });\n } catch (error) {\n return false;\n }\n\n if (!response.ok) {\n if (response.status === 502) {\n if (retries < 3) {\n console.log(\"RETRYING LGC\", retries + 1);\n return isLangGraphPlatformEndpoint(url, retries + 1);\n }\n }\n\n if (response.status === 403) {\n return true;\n }\n\n return false;\n }\n\n const data = await response.json();\n\n if (data[0].assistant_id) {\n return true;\n }\n\n return false;\n}\n\nasync function isLangGraphFastAPIEndpoint(url: string): Promise<boolean> {\n let response;\n\n try {\n response = await fetch(`${url}/health`, {\n method: \"GET\",\n });\n } catch (error) {\n return false;\n }\n\n return response.ok;\n}\n\nasync function isCopilotKitEndpoint(\n url: string,\n retries: number = 0,\n): Promise<boolean> {\n let response;\n\n try {\n response = await fetch(`${url}/info`, {\n method: \"POST\",\n body: JSON.stringify({}),\n });\n } catch (error) {\n return false;\n }\n\n if (!response.ok) {\n if (response.status === 502) {\n if (retries < 3) {\n console.log(\"RETRYING CK\", retries + 1);\n return isCopilotKitEndpoint(url, retries + 1);\n }\n }\n\n return false;\n }\n\n const data = await response.json();\n\n if (data.agents && data.actions) {\n return true;\n }\n\n return false;\n}\n\nasync function isCrewAIEndpoint(url: string): Promise<boolean> {\n return url.toLowerCase().includes(\"crew\");\n}\n\nasync function isMCPEndpoint(_url: string): Promise<boolean> {\n return true;\n}\n","import type { Tunnel } from \"localtunnel\";\n\nimport axios from \"axios\";\nimport localtunnel from \"localtunnel\";\n\nexport interface TunnelOptions {\n port: number;\n subdomain?: string;\n}\n\nexport class TunnelService {\n private readonly META_DATA_URL =\n \"https://metadata-cdn.copilotkit.ai/cloud.config.json\";\n\n async create(options: TunnelOptions): Promise<Tunnel> {\n const metadata = await this.getMetaData();\n\n return localtunnel({\n ...options,\n host: metadata.tunnelHost,\n });\n }\n\n async getMetaData() {\n const response = await axios.get<{\n tunnelHost: string;\n }>(this.META_DATA_URL);\n return response.data;\n }\n}\n","import { Command } from \"@oclif/core\";\nimport Sentry, { consoleIntegration } from \"@sentry/node\";\nimport { LIB_VERSION } from \"../utils/version.js\";\nimport { COPILOT_CLOUD_BASE_URL } from \"../utils/trpc.js\";\nimport chalk from \"chalk\";\n\nexport class BaseCommand extends Command {\n async init() {\n await this.checkCLIVersion();\n\n if (process.env.SENTRY_DISABLED === \"true\") {\n return;\n }\n\n Sentry.init({\n dsn:\n process.env.SENTRY_DSN ||\n \"https://1eea15d32e2eacb0456a77db5e39aeeb@o4507288195170304.ingest.us.sentry.io/4508581448581120\",\n integrations: [consoleIntegration()],\n // Tracing\n tracesSampleRate: 1.0, // Capture 100% of the transactions\n });\n }\n\n async catch(err: any) {\n if (process.env.SENTRY_DISABLED !== \"true\") {\n Sentry.captureException(err);\n }\n\n const message = err?.message ?? \"Unknown error\";\n\n this.log(\"\\n\" + chalk.red(message) + \"\\n\");\n\n const exitCode = err?.oclif?.exit ?? 1;\n this.exit(exitCode);\n }\n\n async finally() {\n if (process.env.SENTRY_DISABLED === \"true\") {\n return;\n }\n\n Sentry.close();\n }\n\n async run() {}\n\n async checkCLIVersion() {\n try {\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 } catch {\n // Version check is non-critical — don't crash the CLI when offline\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 = \"1.0.2\";\n"],"mappings":"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","names":["inquirer","ora","chalk","Conf","crypto","anonymousId","Conf","trpcClient","crypto","chalk","chalk","inquirer","ora"]}
|
package/dist/commands/init.js
CHANGED
|
@@ -3,7 +3,7 @@ import { Command } from "@oclif/core";
|
|
|
3
3
|
import Sentry, { consoleIntegration } from "@sentry/node";
|
|
4
4
|
|
|
5
5
|
// src/utils/version.ts
|
|
6
|
-
var LIB_VERSION = "1.0.
|
|
6
|
+
var LIB_VERSION = "1.0.2";
|
|
7
7
|
|
|
8
8
|
// src/utils/trpc.ts
|
|
9
9
|
import { createTRPCClient as trpcClient, httpBatchLink } from "@trpc/client";
|
|
@@ -209,7 +209,11 @@ var TEMPLATE_REPOS = {
|
|
|
209
209
|
a2a: "https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/a2a-middleware",
|
|
210
210
|
"microsoft-agent-framework-dotnet": "https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/ms-agent-framework-dotnet",
|
|
211
211
|
"microsoft-agent-framework-py": "https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/ms-agent-framework-python",
|
|
212
|
-
"mcp-apps": "https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/mcp-apps"
|
|
212
|
+
"mcp-apps": "https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/mcp-apps",
|
|
213
|
+
"agentcore-langgraph": "https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/agentcore",
|
|
214
|
+
"agentcore-strands": "https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/agentcore",
|
|
215
|
+
a2ui: "https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/langgraph-python",
|
|
216
|
+
opengenui: "https://github.com/CopilotKit/CopilotKit/tree/main/examples/integrations/langgraph-python"
|
|
213
217
|
};
|
|
214
218
|
var FRAMEWORK_DOCUMENTATION = {
|
|
215
219
|
"langgraph-py": "https://langchain-ai.github.io/langgraph/concepts/why-langgraph",
|
|
@@ -225,7 +229,11 @@ var FRAMEWORK_DOCUMENTATION = {
|
|
|
225
229
|
a2a: "https://a2a-protocol.org/latest/",
|
|
226
230
|
"microsoft-agent-framework-dotnet": "https://learn.microsoft.com/en-us/agent-framework/",
|
|
227
231
|
"microsoft-agent-framework-py": "https://learn.microsoft.com/en-us/agent-framework/",
|
|
228
|
-
"mcp-apps": "https://modelcontextprotocol.github.io/ext-apps"
|
|
232
|
+
"mcp-apps": "https://modelcontextprotocol.github.io/ext-apps",
|
|
233
|
+
"agentcore-langgraph": "https://docs.copilotkit.ai/agentcore/quickstart",
|
|
234
|
+
"agentcore-strands": "https://docs.copilotkit.ai/agentcore/quickstart",
|
|
235
|
+
a2ui: "https://a2ui.org/specification/",
|
|
236
|
+
opengenui: "https://docs.copilotkit.ai"
|
|
229
237
|
};
|
|
230
238
|
var FRAMEWORK_EMOJI = {
|
|
231
239
|
"langgraph-js": "\u{1F99C}",
|
|
@@ -241,7 +249,11 @@ var FRAMEWORK_EMOJI = {
|
|
|
241
249
|
"aws-strands-py": "\u{1F9EC}",
|
|
242
250
|
"microsoft-agent-framework-dotnet": "\u{1F7E6}",
|
|
243
251
|
"microsoft-agent-framework-py": "\u{1F7E6}",
|
|
244
|
-
"mcp-apps": "\u264D"
|
|
252
|
+
"mcp-apps": "\u264D",
|
|
253
|
+
"agentcore-langgraph": "\u2601\uFE0F",
|
|
254
|
+
"agentcore-strands": "\u2601\uFE0F",
|
|
255
|
+
a2ui: "\u{1F3A8}",
|
|
256
|
+
opengenui: "\u{1F5BC}\uFE0F"
|
|
245
257
|
};
|
|
246
258
|
var KITE = `
|
|
247
259
|
\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF\u28FF
|
|
@@ -356,6 +368,11 @@ Directory "${projectName}" already exists.`));
|
|
|
356
368
|
await fs2.ensureDir(projectDir);
|
|
357
369
|
spinner.text = theme.secondary.bold("Downloading template...");
|
|
358
370
|
await this.downloadTemplate(projectDir, options.agentFramework, spinner);
|
|
371
|
+
await this.applyShowcaseConfig(projectDir, options.agentFramework);
|
|
372
|
+
if (options.agentFramework === "agentcore-langgraph" || options.agentFramework === "agentcore-strands") {
|
|
373
|
+
spinner.text = theme.secondary.bold("Configuring AgentCore...");
|
|
374
|
+
await this.configureAgentCore(projectDir, options.agentFramework);
|
|
375
|
+
}
|
|
359
376
|
const displayName = usingCurrentDir ? "current directory" : `"${projectName}"`;
|
|
360
377
|
spinner.succeed(
|
|
361
378
|
theme.secondary.bold(`Project ${displayName} created successfully!`)
|
|
@@ -462,14 +479,188 @@ Your project is ready to explore CopilotKit locally.`
|
|
|
462
479
|
},
|
|
463
480
|
{ name: `${FRAMEWORK_EMOJI.agno} Agno`, value: "agno" },
|
|
464
481
|
{ name: `${FRAMEWORK_EMOJI.ag2} AG2`, value: "ag2" },
|
|
465
|
-
{ name: `${FRAMEWORK_EMOJI.a2a} A2A`, value: "a2a" }
|
|
482
|
+
{ name: `${FRAMEWORK_EMOJI.a2a} A2A`, value: "a2a" },
|
|
483
|
+
{
|
|
484
|
+
name: `${FRAMEWORK_EMOJI["agentcore-langgraph"]} AgentCore + LangGraph`,
|
|
485
|
+
value: "agentcore-langgraph"
|
|
486
|
+
},
|
|
487
|
+
{
|
|
488
|
+
name: `${FRAMEWORK_EMOJI["agentcore-strands"]} AgentCore + Strands`,
|
|
489
|
+
value: "agentcore-strands"
|
|
490
|
+
},
|
|
491
|
+
{ name: `${FRAMEWORK_EMOJI.a2ui} A2UI`, value: "a2ui" },
|
|
492
|
+
{
|
|
493
|
+
name: `${FRAMEWORK_EMOJI.opengenui} Open Generative UI`,
|
|
494
|
+
value: "opengenui"
|
|
495
|
+
}
|
|
466
496
|
]
|
|
467
497
|
}
|
|
468
498
|
]);
|
|
469
499
|
return framework;
|
|
470
500
|
}
|
|
501
|
+
async configureAgentCore(projectDir, framework) {
|
|
502
|
+
const pattern = framework === "agentcore-langgraph" ? "langgraph-single-agent" : "strands-single-agent";
|
|
503
|
+
const suffix = framework === "agentcore-langgraph" ? "-lg" : "-st";
|
|
504
|
+
const examplePath = path2.join(projectDir, "config.yaml.example");
|
|
505
|
+
const configPath = path2.join(projectDir, "config.yaml");
|
|
506
|
+
if (!await fs2.pathExists(examplePath)) {
|
|
507
|
+
throw new Error(
|
|
508
|
+
`config.yaml.example not found in the AgentCore template at "${projectDir}". The downloaded template may be incomplete. Please try again.`
|
|
509
|
+
);
|
|
510
|
+
}
|
|
511
|
+
let content = await fs2.readFile(examplePath, "utf-8");
|
|
512
|
+
const patternRegex = /^(\s*pattern:\s*)\S+(.*)$/m;
|
|
513
|
+
const stackRegex = /^(\s*stack_name_base:\s*)\S+(.*)$/m;
|
|
514
|
+
if (!patternRegex.test(content) || !stackRegex.test(content)) {
|
|
515
|
+
throw new Error(
|
|
516
|
+
`Unexpected config.yaml.example format in the AgentCore template. Expected "pattern:" and "stack_name_base:" keys. Please try again or report this issue at https://github.com/CopilotKit/CopilotKit/issues`
|
|
517
|
+
);
|
|
518
|
+
}
|
|
519
|
+
content = content.replace(patternRegex, `$1${pattern}$2`);
|
|
520
|
+
content = content.replace(
|
|
521
|
+
stackRegex,
|
|
522
|
+
`$1my-copilotkit-agentcore${suffix}$2`
|
|
523
|
+
);
|
|
524
|
+
await fs2.writeFile(configPath, content, "utf-8");
|
|
525
|
+
const isLanggraph = framework === "agentcore-langgraph";
|
|
526
|
+
const removeAgent = isLanggraph ? "strands-single-agent" : "langgraph-single-agent";
|
|
527
|
+
const removeScript = isLanggraph ? "deploy-strands.sh" : "deploy-langgraph.sh";
|
|
528
|
+
const keepScript = isLanggraph ? "deploy-langgraph.sh" : "deploy-strands.sh";
|
|
529
|
+
await Promise.all([
|
|
530
|
+
fs2.remove(path2.join(projectDir, "agents", removeAgent)),
|
|
531
|
+
fs2.remove(path2.join(projectDir, removeScript)),
|
|
532
|
+
fs2.remove(path2.join(projectDir, "infra-terraform"))
|
|
533
|
+
]);
|
|
534
|
+
const keepScriptPath = path2.join(projectDir, keepScript);
|
|
535
|
+
if (await fs2.pathExists(keepScriptPath)) {
|
|
536
|
+
await fs2.move(keepScriptPath, path2.join(projectDir, "deploy.sh"));
|
|
537
|
+
}
|
|
538
|
+
const deployShPath = path2.join(projectDir, "deploy.sh");
|
|
539
|
+
if (await fs2.pathExists(deployShPath)) {
|
|
540
|
+
let deployContent = await fs2.readFile(deployShPath, "utf-8");
|
|
541
|
+
deployContent = deployContent.replace(/\(isolated from deploy-(?:langgraph|strands)\.sh\)\s*/g, "").replace(/# Using Terraform instead\?.*\n/g, "");
|
|
542
|
+
await fs2.writeFile(deployShPath, deployContent, "utf-8");
|
|
543
|
+
}
|
|
544
|
+
const configYamlPath = path2.join(projectDir, "config.yaml");
|
|
545
|
+
if (await fs2.pathExists(configYamlPath)) {
|
|
546
|
+
let configContent = await fs2.readFile(configYamlPath, "utf-8");
|
|
547
|
+
configContent = configContent.replace(
|
|
548
|
+
/# overwritten by deploy-langgraph\.sh \/ deploy-strands\.sh/g,
|
|
549
|
+
"# set by the CLI \u2014 do not change"
|
|
550
|
+
);
|
|
551
|
+
await fs2.writeFile(configYamlPath, configContent, "utf-8");
|
|
552
|
+
}
|
|
553
|
+
const agentShortName = isLanggraph ? "langgraph" : "strands";
|
|
554
|
+
const otherShortName = isLanggraph ? "strands" : "langgraph";
|
|
555
|
+
for (const relPath of ["docker/docker-compose.yml", "docker/up.sh"]) {
|
|
556
|
+
const filePath = path2.join(projectDir, relPath);
|
|
557
|
+
if (await fs2.pathExists(filePath)) {
|
|
558
|
+
let fileContent = await fs2.readFile(filePath, "utf-8");
|
|
559
|
+
fileContent = fileContent.replaceAll(
|
|
560
|
+
`AGENT:-${otherShortName}`,
|
|
561
|
+
`AGENT:-${agentShortName}`
|
|
562
|
+
);
|
|
563
|
+
fileContent = fileContent.replaceAll(
|
|
564
|
+
`echo "${otherShortName}"`,
|
|
565
|
+
`echo "${agentShortName}"`
|
|
566
|
+
);
|
|
567
|
+
await fs2.writeFile(filePath, fileContent, "utf-8");
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
const resolveEnvPath = path2.join(projectDir, "docker/resolve-env.py");
|
|
571
|
+
if (await fs2.pathExists(resolveEnvPath)) {
|
|
572
|
+
let resolveContent = await fs2.readFile(resolveEnvPath, "utf-8");
|
|
573
|
+
resolveContent = resolveContent.replaceAll(
|
|
574
|
+
`os.environ.get("AGENT", "${otherShortName}")`,
|
|
575
|
+
`os.environ.get("AGENT", "${agentShortName}")`
|
|
576
|
+
);
|
|
577
|
+
await fs2.writeFile(resolveEnvPath, resolveContent, "utf-8");
|
|
578
|
+
}
|
|
579
|
+
const frameworkLabel = isLanggraph ? "LangGraph" : "Strands";
|
|
580
|
+
const stackSuffix = isLanggraph ? "lg" : "st";
|
|
581
|
+
const agentFolder = isLanggraph ? "langgraph-single-agent" : "strands-single-agent";
|
|
582
|
+
const readme = `# CopilotKit + AWS AgentCore (${frameworkLabel})
|
|
583
|
+
|
|
584
|
+
Chat UI with generative charts, shared-state todo canvas, and inline tool rendering \u2014 deployed on AWS Bedrock AgentCore.
|
|
585
|
+
|
|
586
|
+
## Prerequisites
|
|
587
|
+
|
|
588
|
+
| Tool | Version |
|
|
589
|
+
| ------- | ---------------------------- |
|
|
590
|
+
| AWS CLI | configured (\`aws configure\`) |
|
|
591
|
+
| Node.js | 18+ |
|
|
592
|
+
| Python | 3.8+ |
|
|
593
|
+
| Docker | running |
|
|
594
|
+
|
|
595
|
+
## Deploy
|
|
596
|
+
|
|
597
|
+
1. **Edit \`config.yaml\`** \u2014 set \`stack_name_base\` and \`admin_user_email\`
|
|
598
|
+
|
|
599
|
+
2. **Deploy:**
|
|
600
|
+
|
|
601
|
+
\`\`\`bash
|
|
602
|
+
./deploy.sh # full deploy (infra + frontend)
|
|
603
|
+
./deploy.sh --skip-frontend # infra/agent only
|
|
604
|
+
./deploy.sh --skip-backend # frontend only
|
|
605
|
+
\`\`\`
|
|
606
|
+
|
|
607
|
+
3. **Open** the Amplify URL printed at the end. Sign in with your email.
|
|
608
|
+
|
|
609
|
+
## Local Development
|
|
610
|
+
|
|
611
|
+
\`\`\`bash
|
|
612
|
+
cd docker
|
|
613
|
+
cp .env.example .env
|
|
614
|
+
# Fill in AWS creds \u2014 STACK_NAME, MEMORY_ID, and aws-exports.json are auto-resolved
|
|
615
|
+
./up.sh --build
|
|
616
|
+
\`\`\`
|
|
617
|
+
|
|
618
|
+
- **Frontend** \u2192 hot reloads on save
|
|
619
|
+
- **Agent** \u2192 rebuild on changes: \`docker compose up --build agent\`
|
|
620
|
+
- **Browser** \u2192 \`http://localhost:3000\`
|
|
621
|
+
|
|
622
|
+
The full chain runs locally: \`browser:3000 \u2192 bridge:3001 \u2192 agent:8080\`. AWS is only used for Memory and Gateway.
|
|
623
|
+
|
|
624
|
+
## What's inside
|
|
625
|
+
|
|
626
|
+
| Piece | What it does |
|
|
627
|
+
| ------------------------------ | ---------------------------------------------------------- |
|
|
628
|
+
| \`frontend/\` | Vite + React with CopilotKit chat, charts, todo canvas |
|
|
629
|
+
| \`agents/${agentFolder}/\` | ${frameworkLabel} agent with tools + shared todo state |
|
|
630
|
+
| \`infra-cdk/\` | CDK: Cognito, AgentCore, CopilotKit Lambda, Amplify |
|
|
631
|
+
| \`docker/\` | Local dev via Docker Compose |
|
|
632
|
+
|
|
633
|
+
## Tear down
|
|
634
|
+
|
|
635
|
+
\`\`\`bash
|
|
636
|
+
cd infra-cdk && npx cdk@latest destroy --all --output ../cdk.out-${stackSuffix}
|
|
637
|
+
\`\`\`
|
|
638
|
+
|
|
639
|
+
## Docs
|
|
640
|
+
|
|
641
|
+
- [CopilotKit](https://docs.copilotkit.ai)
|
|
642
|
+
- [AWS Bedrock AgentCore](https://aws.amazon.com/bedrock/agentcore/)
|
|
643
|
+
- [AgentCore + CopilotKit Guide](https://docs.copilotkit.ai/agentcore/quickstart)
|
|
644
|
+
`;
|
|
645
|
+
await fs2.writeFile(path2.join(projectDir, "README.md"), readme, "utf-8");
|
|
646
|
+
}
|
|
471
647
|
async downloadTemplate(projectDir, framework, spinner) {
|
|
472
648
|
const templateRef = TEMPLATE_REPOS[framework];
|
|
649
|
+
if (templateRef.startsWith("/")) {
|
|
650
|
+
const EXCLUDE = [
|
|
651
|
+
"node_modules",
|
|
652
|
+
"cdk.out",
|
|
653
|
+
".git",
|
|
654
|
+
"__pycache__",
|
|
655
|
+
".venv"
|
|
656
|
+
];
|
|
657
|
+
await fs2.copy(templateRef, projectDir, {
|
|
658
|
+
filter: (src) => !EXCLUDE.some(
|
|
659
|
+
(ex) => src.split("/").includes(ex) || src.includes(`/${ex}`)
|
|
660
|
+
)
|
|
661
|
+
});
|
|
662
|
+
return;
|
|
663
|
+
}
|
|
473
664
|
if (isValidGitHubUrl(templateRef)) {
|
|
474
665
|
const success = await cloneGitHubSubdirectory(
|
|
475
666
|
templateRef,
|
|
@@ -497,9 +688,21 @@ Your project is ready to explore CopilotKit locally.`
|
|
|
497
688
|
});
|
|
498
689
|
await fs2.remove(tempFile);
|
|
499
690
|
} catch (error) {
|
|
500
|
-
throw new Error(`Failed to download template: ${error.message}
|
|
691
|
+
throw new Error(`Failed to download template: ${error.message}`, {
|
|
692
|
+
cause: error
|
|
693
|
+
});
|
|
501
694
|
}
|
|
502
695
|
}
|
|
696
|
+
static SHOWCASE_FRAMEWORKS = {
|
|
697
|
+
a2ui: "a2ui",
|
|
698
|
+
opengenui: "opengenui"
|
|
699
|
+
};
|
|
700
|
+
async applyShowcaseConfig(projectDir, framework) {
|
|
701
|
+
const showcase = _Create.SHOWCASE_FRAMEWORKS[framework];
|
|
702
|
+
if (!showcase) return;
|
|
703
|
+
const configPath = path2.join(projectDir, "showcase.json");
|
|
704
|
+
await fs2.writeJSON(configPath, { showcase });
|
|
705
|
+
}
|
|
503
706
|
};
|
|
504
707
|
|
|
505
708
|
// src/commands/init.ts
|