copilotkit 0.0.58 → 0.0.59
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/LICENSE +21 -0
- package/dist/commands/base-command.js +9 -6
- package/dist/commands/base-command.js.map +1 -1
- package/dist/commands/create.d.ts +1 -1
- package/dist/commands/create.js +230 -59
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/dev.js +94 -35
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/init.d.ts +0 -20
- package/dist/commands/init.js +239 -209
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.js +44 -20
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +44 -20
- package/dist/commands/logout.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/init/ide-docs.d.ts +1 -1
- package/dist/lib/init/ide-docs.js +19 -5
- package/dist/lib/init/ide-docs.js.map +1 -1
- package/dist/lib/init/index.js +171 -67
- package/dist/lib/init/index.js.map +1 -1
- package/dist/lib/init/questions.d.ts +1 -1
- package/dist/lib/init/questions.js +77 -18
- package/dist/lib/init/questions.js.map +1 -1
- package/dist/lib/init/scaffold/agent.js +30 -23
- package/dist/lib/init/scaffold/agent.js.map +1 -1
- package/dist/lib/init/scaffold/crew-inputs.js +17 -4
- package/dist/lib/init/scaffold/crew-inputs.js.map +1 -1
- package/dist/lib/init/scaffold/env.js +14 -11
- package/dist/lib/init/scaffold/env.js.map +1 -1
- package/dist/lib/init/scaffold/github.js +27 -6
- package/dist/lib/init/scaffold/github.js.map +1 -1
- package/dist/lib/init/scaffold/index.js +152 -62
- package/dist/lib/init/scaffold/index.js.map +1 -1
- package/dist/lib/init/scaffold/langgraph-assistants.js +14 -11
- package/dist/lib/init/scaffold/langgraph-assistants.js.map +1 -1
- package/dist/lib/init/scaffold/packages.js +3 -1
- package/dist/lib/init/scaffold/packages.js.map +1 -1
- package/dist/lib/init/scaffold/shadcn.js +88 -23
- package/dist/lib/init/scaffold/shadcn.js.map +1 -1
- package/dist/lib/init/types/index.js +77 -18
- package/dist/lib/init/types/index.js.map +1 -1
- package/dist/lib/init/types/questions.d.ts +19 -19
- package/dist/lib/init/types/questions.js +73 -17
- package/dist/lib/init/types/questions.js.map +1 -1
- package/dist/lib/init/types/templates.d.ts +2 -2
- package/dist/lib/init/types/templates.js +4 -1
- package/dist/lib/init/types/templates.js.map +1 -1
- package/dist/lib/init/utils.js.map +1 -1
- package/dist/services/analytics.service.d.ts +1 -1
- package/dist/services/analytics.service.js +4 -1
- package/dist/services/analytics.service.js.map +1 -1
- package/dist/services/auth.service.d.ts +1 -1
- package/dist/services/auth.service.js +35 -14
- package/dist/services/auth.service.js.map +1 -1
- package/dist/services/events.d.ts +33 -33
- package/dist/services/tunnel.service.js.map +1 -1
- package/dist/utils/detect-endpoint-type.utils.d.ts +1 -1
- package/dist/utils/detect-endpoint-type.utils.js +11 -4
- package/dist/utils/detect-endpoint-type.utils.js.map +1 -1
- package/dist/utils/trpc.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 +4 -162
- package/package.json +8 -4
|
@@ -11,10 +11,27 @@ var isLocalhost = (url) => {
|
|
|
11
11
|
};
|
|
12
12
|
|
|
13
13
|
// src/lib/init/types/questions.ts
|
|
14
|
-
var MODES = [
|
|
14
|
+
var MODES = [
|
|
15
|
+
"LangGraph",
|
|
16
|
+
"CrewAI",
|
|
17
|
+
"Mastra",
|
|
18
|
+
"LlamaIndex",
|
|
19
|
+
"Agno",
|
|
20
|
+
"AG2",
|
|
21
|
+
"MCP",
|
|
22
|
+
"Standard"
|
|
23
|
+
];
|
|
15
24
|
var CREW_TYPES = ["Crews", "Flows"];
|
|
16
|
-
var CHAT_COMPONENTS = [
|
|
17
|
-
|
|
25
|
+
var CHAT_COMPONENTS = [
|
|
26
|
+
"CopilotChat",
|
|
27
|
+
"CopilotSidebar",
|
|
28
|
+
"Headless",
|
|
29
|
+
"CopilotPopup"
|
|
30
|
+
];
|
|
31
|
+
var LANGGRAPH_AGENTS = [
|
|
32
|
+
"Python Starter",
|
|
33
|
+
"TypeScript Starter"
|
|
34
|
+
];
|
|
18
35
|
var CREW_FLOW_TEMPLATES = ["Starter"];
|
|
19
36
|
var YES_NO = ["Yes", "No"];
|
|
20
37
|
var DEPLOYMENT_CHOICES = ["Copilot Cloud", "Self-hosted"];
|
|
@@ -51,13 +68,22 @@ var UrlSchema = z.preprocess(
|
|
|
51
68
|
(val) => sanitizers.url(String(val)),
|
|
52
69
|
z.string().url("Please enter a valid URL").min(1, "URL is required")
|
|
53
70
|
);
|
|
54
|
-
var TokenSchema = z.preprocess(
|
|
71
|
+
var TokenSchema = z.preprocess(
|
|
72
|
+
(val) => sanitizers.trim(String(val)),
|
|
73
|
+
z.string().min(1, "Token is required")
|
|
74
|
+
);
|
|
55
75
|
var ApiKeySchema = z.preprocess(
|
|
56
76
|
(val) => sanitizers.apiKey(String(val)),
|
|
57
77
|
z.string().min(1, "API key is required")
|
|
58
78
|
);
|
|
59
|
-
var LLMApiKeySchema = z.preprocess(
|
|
60
|
-
|
|
79
|
+
var LLMApiKeySchema = z.preprocess(
|
|
80
|
+
(val) => sanitizers.apiKey(String(val)),
|
|
81
|
+
z.string().optional()
|
|
82
|
+
);
|
|
83
|
+
var NameSchema = z.preprocess(
|
|
84
|
+
(val) => sanitizers.trim(String(val)),
|
|
85
|
+
z.string().min(1, "Name is required")
|
|
86
|
+
);
|
|
61
87
|
var ConfigSchema = z.object({
|
|
62
88
|
// Core fields
|
|
63
89
|
copilotKitVersion: z.string().optional(),
|
|
@@ -112,18 +138,48 @@ var ConfigSchema = z.object({
|
|
|
112
138
|
}
|
|
113
139
|
);
|
|
114
140
|
var ConfigFlags = {
|
|
115
|
-
booth: Flags.boolean({
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
141
|
+
booth: Flags.boolean({
|
|
142
|
+
description: "Use CopilotKit in booth mode",
|
|
143
|
+
default: false,
|
|
144
|
+
char: "b"
|
|
145
|
+
}),
|
|
146
|
+
mode: Flags.string({
|
|
147
|
+
description: "How you will be interacting with AI",
|
|
148
|
+
options: MODES,
|
|
149
|
+
char: "m"
|
|
150
|
+
}),
|
|
151
|
+
"copilotkit-version": Flags.string({
|
|
152
|
+
description: "CopilotKit version to use (e.g. 1.7.0)"
|
|
153
|
+
}),
|
|
154
|
+
"use-copilot-cloud": Flags.string({
|
|
155
|
+
description: "Use Copilot Cloud for production-ready hosting",
|
|
156
|
+
options: YES_NO
|
|
157
|
+
}),
|
|
158
|
+
"langgraph-agent": Flags.string({
|
|
159
|
+
description: "LangGraph agent template to use",
|
|
160
|
+
options: LANGGRAPH_AGENTS
|
|
161
|
+
}),
|
|
162
|
+
"crew-type": Flags.string({
|
|
163
|
+
description: "CrewAI implementation type",
|
|
164
|
+
options: CREW_TYPES
|
|
165
|
+
}),
|
|
121
166
|
"crew-name": Flags.string({ description: "Name for your CrewAI agent" }),
|
|
122
|
-
"crew-url": Flags.string({
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
"
|
|
126
|
-
|
|
167
|
+
"crew-url": Flags.string({
|
|
168
|
+
description: "URL endpoint for your CrewAI agent"
|
|
169
|
+
}),
|
|
170
|
+
"crew-bearer-token": Flags.string({
|
|
171
|
+
description: "Bearer token for CrewAI authentication"
|
|
172
|
+
}),
|
|
173
|
+
"langsmith-api-key": Flags.string({
|
|
174
|
+
description: "LangSmith API key for LangGraph observability"
|
|
175
|
+
}),
|
|
176
|
+
"llm-token": Flags.string({
|
|
177
|
+
description: "API key for your preferred LLM provider"
|
|
178
|
+
}),
|
|
179
|
+
"setup-ide-docs": Flags.string({
|
|
180
|
+
description: "Setup IDE documentation rules for AI assistance",
|
|
181
|
+
options: YES_NO
|
|
182
|
+
}),
|
|
127
183
|
"selected-ide": Flags.string({
|
|
128
184
|
description: "IDE to configure with documentation rules",
|
|
129
185
|
options: ["cursor", "windsurf", "skip"]
|
|
@@ -146,7 +202,10 @@ var templateMapping = {
|
|
|
146
202
|
CrewFlowsEnterprise: [`${BASE_URL}/coagents-starter-crewai-flows.json`],
|
|
147
203
|
// LangGraph
|
|
148
204
|
LangGraphGeneric: `${BASE_URL}/generic-lg-starter.json`,
|
|
149
|
-
LangGraphStarter: [
|
|
205
|
+
LangGraphStarter: [
|
|
206
|
+
`${BASE_URL}/langgraph-platform-starter.json`,
|
|
207
|
+
`${BASE_URL}/coagents-starter-ui.json`
|
|
208
|
+
],
|
|
150
209
|
// No Agent
|
|
151
210
|
StandardStarter: `${BASE_URL}/standard-starter.json`,
|
|
152
211
|
StandardRuntime: `${BASE_URL}/standard-runtime.json`,
|
|
@@ -194,12 +253,18 @@ async function scaffoldShadCN(flags, userAnswers) {
|
|
|
194
253
|
}
|
|
195
254
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
196
255
|
try {
|
|
197
|
-
const result = spawn.sync(
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
256
|
+
const result = spawn.sync(
|
|
257
|
+
"npx",
|
|
258
|
+
["shadcn@latest", "add", ...components],
|
|
259
|
+
{
|
|
260
|
+
stdio: "inherit"
|
|
261
|
+
// This ensures stdin/stdout/stderr are all passed through
|
|
262
|
+
}
|
|
263
|
+
);
|
|
201
264
|
if (result.status !== 0) {
|
|
202
|
-
throw new Error(
|
|
265
|
+
throw new Error(
|
|
266
|
+
`The shadcn installation process exited with code ${result.status}`
|
|
267
|
+
);
|
|
203
268
|
}
|
|
204
269
|
} catch (error) {
|
|
205
270
|
throw error;
|
|
@@ -216,17 +281,20 @@ import fs from "fs";
|
|
|
216
281
|
// src/lib/init/scaffold/langgraph-assistants.ts
|
|
217
282
|
async function getLangGraphAgents(url, langSmithApiKey) {
|
|
218
283
|
try {
|
|
219
|
-
const response = await fetch(
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
284
|
+
const response = await fetch(
|
|
285
|
+
`${url.trim().replace(/\/$/, "")}/assistants/search`,
|
|
286
|
+
{
|
|
287
|
+
method: "POST",
|
|
288
|
+
headers: {
|
|
289
|
+
"Content-Type": "application/json",
|
|
290
|
+
"X-Api-Key": langSmithApiKey
|
|
291
|
+
},
|
|
292
|
+
body: JSON.stringify({
|
|
293
|
+
limit: 10,
|
|
294
|
+
offset: 0
|
|
295
|
+
})
|
|
296
|
+
}
|
|
297
|
+
);
|
|
230
298
|
return await response.json();
|
|
231
299
|
} catch (error) {
|
|
232
300
|
throw new Error(`Failed to get LangGraph agents: ${error}`);
|
|
@@ -330,7 +398,14 @@ async function cloneGitHubSubdirectory(githubUrl, destinationPath, spinner) {
|
|
|
330
398
|
try {
|
|
331
399
|
const { owner, repo, branch, subdirectoryPath } = parseGitHubUrl(githubUrl);
|
|
332
400
|
spinner.text = chalk.cyan(`Cloning from ${owner}/${repo}...`);
|
|
333
|
-
return await sparseCheckout(
|
|
401
|
+
return await sparseCheckout(
|
|
402
|
+
owner,
|
|
403
|
+
repo,
|
|
404
|
+
branch,
|
|
405
|
+
subdirectoryPath,
|
|
406
|
+
destinationPath,
|
|
407
|
+
spinner
|
|
408
|
+
);
|
|
334
409
|
} catch (error) {
|
|
335
410
|
spinner.text = chalk.red(`Failed to clone from GitHub: ${error}`);
|
|
336
411
|
return false;
|
|
@@ -342,14 +417,28 @@ async function sparseCheckout(owner, repo, branch, subdirectoryPath, destination
|
|
|
342
417
|
spinner.text = chalk.cyan("Creating temporary workspace...");
|
|
343
418
|
execSync("git init", { cwd: tempDir, stdio: "pipe" });
|
|
344
419
|
spinner.text = chalk.cyan("Connecting to repository...");
|
|
345
|
-
execSync(`git remote add origin https://github.com/${owner}/${repo}.git`, {
|
|
346
|
-
|
|
347
|
-
|
|
420
|
+
execSync(`git remote add origin https://github.com/${owner}/${repo}.git`, {
|
|
421
|
+
cwd: tempDir,
|
|
422
|
+
stdio: "pipe"
|
|
423
|
+
});
|
|
424
|
+
execSync("git config core.sparseCheckout true", {
|
|
425
|
+
cwd: tempDir,
|
|
426
|
+
stdio: "pipe"
|
|
427
|
+
});
|
|
428
|
+
fs2.writeFileSync(
|
|
429
|
+
path2.join(tempDir, ".git/info/sparse-checkout"),
|
|
430
|
+
subdirectoryPath
|
|
431
|
+
);
|
|
348
432
|
spinner.text = chalk.cyan("Downloading agent files...");
|
|
349
|
-
execSync(`git pull origin ${branch} --depth=1`, {
|
|
433
|
+
execSync(`git pull origin ${branch} --depth=1`, {
|
|
434
|
+
cwd: tempDir,
|
|
435
|
+
stdio: "pipe"
|
|
436
|
+
});
|
|
350
437
|
const sourcePath = path2.join(tempDir, subdirectoryPath);
|
|
351
438
|
if (!fs2.existsSync(sourcePath)) {
|
|
352
|
-
throw new Error(
|
|
439
|
+
throw new Error(
|
|
440
|
+
`Subdirectory '${subdirectoryPath}' not found in the repository.`
|
|
441
|
+
);
|
|
353
442
|
}
|
|
354
443
|
fs2.mkdirSync(destinationPath, { recursive: true });
|
|
355
444
|
spinner.text = chalk.cyan("Installing agent files...");
|
|
@@ -436,7 +525,9 @@ async function scaffoldPackages(userAnswers) {
|
|
|
436
525
|
// This ensures stdin/stdout/stderr are all passed through
|
|
437
526
|
});
|
|
438
527
|
if (result.status !== 0) {
|
|
439
|
-
throw new Error(
|
|
528
|
+
throw new Error(
|
|
529
|
+
`Package installation process exited with code ${result.status}`
|
|
530
|
+
);
|
|
440
531
|
}
|
|
441
532
|
spinner.start();
|
|
442
533
|
spinner.succeed(chalk2.green("CopilotKit packages installed successfully"));
|
|
@@ -511,20 +602,6 @@ async function scaffoldAgent(userAnswers) {
|
|
|
511
602
|
fs4.writeFileSync(agentEnvFile, envContent, "utf8");
|
|
512
603
|
spinner.text = chalk3.cyan("Added API keys to agent .env file");
|
|
513
604
|
}
|
|
514
|
-
if (userAnswers.mode === "LangGraph" && userAnswers.langSmithApiKey) {
|
|
515
|
-
envContent += `LANGSMITH_API_KEY=${userAnswers.langSmithApiKey}
|
|
516
|
-
`;
|
|
517
|
-
}
|
|
518
|
-
if (envContent) {
|
|
519
|
-
const agentEnvFile = path3.join(agentDir, ".env");
|
|
520
|
-
fs4.writeFileSync(agentEnvFile, envContent, "utf8");
|
|
521
|
-
spinner.text = chalk3.cyan("Added API keys to agent .env file");
|
|
522
|
-
}
|
|
523
|
-
if (envContent) {
|
|
524
|
-
const agentEnvFile = path3.join(agentDir, ".env");
|
|
525
|
-
fs4.writeFileSync(agentEnvFile, envContent, "utf8");
|
|
526
|
-
spinner.text = chalk3.cyan("Added API keys to agent .env file");
|
|
527
|
-
}
|
|
528
605
|
} catch (error) {
|
|
529
606
|
spinner.fail(chalk3.red("Failed to clone agent template"));
|
|
530
607
|
throw error;
|
|
@@ -534,13 +611,13 @@ async function scaffoldAgent(userAnswers) {
|
|
|
534
611
|
var AgentTemplates = {
|
|
535
612
|
LangGraph: {
|
|
536
613
|
Starter: {
|
|
537
|
-
Python: "https://github.com/CopilotKit/
|
|
538
|
-
TypeScript: "https://github.com/CopilotKit/
|
|
614
|
+
Python: "https://github.com/CopilotKit/CopilotKit/tree/main/examples/starters/coagents-langgraph/agent-py",
|
|
615
|
+
TypeScript: "https://github.com/CopilotKit/CopilotKit/tree/main/examples/starters/coagents-langgraph/agent-js"
|
|
539
616
|
}
|
|
540
617
|
},
|
|
541
618
|
CrewAI: {
|
|
542
619
|
Flows: {
|
|
543
|
-
Starter: "https://github.com/CopilotKit/coagents-
|
|
620
|
+
Starter: "https://github.com/CopilotKit/CopilotKit/tree/main/examples/starters/coagents-crewai-flows/agent-py"
|
|
544
621
|
}
|
|
545
622
|
}
|
|
546
623
|
};
|
|
@@ -558,18 +635,31 @@ async function addCrewInputs(url, token) {
|
|
|
558
635
|
try {
|
|
559
636
|
await fs5.access(filePath);
|
|
560
637
|
} catch {
|
|
561
|
-
filePath = path4.join(
|
|
638
|
+
filePath = path4.join(
|
|
639
|
+
process.cwd(),
|
|
640
|
+
"src",
|
|
641
|
+
"app",
|
|
642
|
+
"copilotkit",
|
|
643
|
+
"page.tsx"
|
|
644
|
+
);
|
|
562
645
|
}
|
|
563
646
|
try {
|
|
564
647
|
await fs5.access(filePath);
|
|
565
648
|
} catch {
|
|
566
|
-
throw new Error(
|
|
649
|
+
throw new Error(
|
|
650
|
+
"app/copilotkit/page.tsx and src/app/copilotkit/page.tsx not found"
|
|
651
|
+
);
|
|
567
652
|
}
|
|
568
653
|
let fileContent = await fs5.readFile(filePath, "utf8");
|
|
569
654
|
const inputsString = JSON.stringify(inputs);
|
|
570
|
-
fileContent = fileContent.replace(
|
|
655
|
+
fileContent = fileContent.replace(
|
|
656
|
+
/\[["']YOUR_INPUTS_HERE["']\]/g,
|
|
657
|
+
inputsString
|
|
658
|
+
);
|
|
571
659
|
await fs5.writeFile(filePath, fileContent, "utf8");
|
|
572
|
-
spinner.succeed(
|
|
660
|
+
spinner.succeed(
|
|
661
|
+
"Successfully added crew inputs to app/copilotkit/page.tsx"
|
|
662
|
+
);
|
|
573
663
|
} catch (error) {
|
|
574
664
|
console.error("Error updating crew inputs:", error);
|
|
575
665
|
throw error;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/init/scaffold/shadcn.ts","../../../../src/lib/init/types/questions.ts","../../../../src/lib/init/utils.ts","../../../../src/lib/init/types/templates.ts","../../../../src/lib/init/scaffold/env.ts","../../../../src/lib/init/scaffold/langgraph-assistants.ts","../../../../src/lib/init/scaffold/github.ts","../../../../src/lib/init/scaffold/packages.ts","../../../../src/lib/init/scaffold/agent.ts","../../../../src/lib/init/scaffold/crew-inputs.ts"],"sourcesContent":["import spawn from 'cross-spawn'\nimport {templateMapping, Config} from '../types/index.js'\n\nexport async function scaffoldShadCN(flags: any, userAnswers: Config) {\n try {\n // Determine which components to install based on user choices\n const components: string[] = []\n\n // Add additional components based on agent framework\n switch (userAnswers.mode) {\n case 'LangGraph':\n components.push(templateMapping.LangGraphGeneric)\n if (userAnswers.langGraphPlatform === 'Yes') {\n components.push(templateMapping.LangGraphPlatformRuntime)\n } else {\n components.push(templateMapping.RemoteEndpoint)\n }\n break\n case 'CrewAI':\n if (userAnswers.crewType === 'Crews') {\n components.push(...templateMapping.CrewEnterprise)\n } else if (userAnswers.crewType === 'Flows') {\n components.push(...templateMapping.CrewFlowsEnterprise)\n } else {\n components.push(templateMapping.RemoteEndpoint)\n }\n break\n case 'MCP':\n components.push(templateMapping.McpStarter)\n if (userAnswers.deploymentChoice === 'Self-hosted' || userAnswers.useCopilotCloud === 'No') {\n components.push(templateMapping.McpRuntime)\n }\n break\n case 'Standard':\n components.push(templateMapping.StandardStarter)\n if (userAnswers.deploymentChoice === 'Self-hosted' || userAnswers.useCopilotCloud === 'No') {\n components.push(templateMapping.StandardRuntime)\n }\n break\n default:\n return\n }\n\n // Small pause before running shadcn\n await new Promise((resolve) => setTimeout(resolve, 100))\n\n try {\n // Run shadcn with inherited stdio for all streams to allow for user input\n const result = spawn.sync('npx', ['shadcn@latest', 'add', ...components], {\n stdio: 'inherit', // This ensures stdin/stdout/stderr are all passed through\n })\n\n if (result.status !== 0) {\n throw new Error(`The shadcn installation process exited with code ${result.status}`)\n }\n } catch (error) {\n throw error\n }\n } catch (error) {\n throw error\n }\n}\n","import {z} from 'zod'\nimport {Flags} from '@oclif/core'\nimport {isLocalhost} from '../utils.js'\n\n// ===== Core Constants =====\nexport const MODES = ['LangGraph', 'CrewAI', 'Mastra', 'LlamaIndex', 'Agno', 'AG2', 'MCP', 'Standard'] as const\nexport const CREW_TYPES = ['Crews', 'Flows'] as const\nexport const CHAT_COMPONENTS = ['CopilotChat', 'CopilotSidebar', 'Headless', 'CopilotPopup'] as const\nexport const LANGGRAPH_AGENTS = ['Python Starter', 'TypeScript Starter'] as const\nexport const CREW_FLOW_TEMPLATES = ['Starter'] as const\nexport const YES_NO = ['Yes', 'No'] as const\n// NEW: Deployment choice options for Branch B\nexport const DEPLOYMENT_CHOICES = ['Copilot Cloud', 'Self-hosted'] as const\n\n// ===== Sanitizers =====\nexport const sanitizers = {\n // Remove trailing slash from URLs\n url: (value: string): string => {\n if (!value) return value\n return value.trim().replace(/\\/+$/, '')\n },\n\n // Trim whitespace from strings\n trim: (value: string): string => {\n if (!value) return value\n return value.trim()\n },\n\n // Lowercase strings\n lowercase: (value: string): string => {\n if (!value) return value\n return value.toLowerCase().trim()\n },\n\n // Clean API keys (remove whitespace)\n apiKey: (value: string): string => {\n if (!value) return value\n return value.trim().replace(/\\s/g, '')\n },\n}\n\n// ===== Zod Schemas =====\n\n// Basic schemas\nexport const ModeSchema = z.enum(MODES)\nexport const CrewTypeSchema = z.enum(CREW_TYPES)\nexport const ChatComponentSchema = z.enum(CHAT_COMPONENTS)\nexport const LangGraphAgentSchema = z.enum(LANGGRAPH_AGENTS)\nexport const CrewFlowTemplateSchema = z.enum(CREW_FLOW_TEMPLATES)\nexport const YesNoSchema = z.enum(YES_NO)\n// NEW: Deployment choice schema for Branch B\nexport const DeploymentChoiceSchema = z.enum(DEPLOYMENT_CHOICES)\n\n// URL validation schema with preprocessing to remove trailing slash\nexport const UrlSchema = z.preprocess(\n (val) => sanitizers.url(String(val)),\n z.string().url('Please enter a valid URL').min(1, 'URL is required'),\n)\n\n// Token validation schema with preprocessing to trim\nexport const TokenSchema = z.preprocess((val) => sanitizers.trim(String(val)), z.string().min(1, 'Token is required'))\n\n// API key validation schema with preprocessing to remove whitespace\nexport const ApiKeySchema = z.preprocess(\n (val) => sanitizers.apiKey(String(val)),\n z.string().min(1, 'API key is required'),\n)\n\nexport const LLMApiKeySchema = z.preprocess((val) => sanitizers.apiKey(String(val)), z.string().optional())\n\n// Name validation schema with preprocessing to trim\nexport const NameSchema = z.preprocess((val) => sanitizers.trim(String(val)), z.string().min(1, 'Name is required'))\n\n// Config schema\nexport const ConfigSchema = z\n .object({\n // Core fields\n copilotKitVersion: z.string().optional(),\n mode: ModeSchema,\n chatUi: ChatComponentSchema.optional(),\n\n // Yes/No fields\n alreadyDeployed: YesNoSchema.optional(),\n fastApiEnabled: YesNoSchema.optional(),\n // DEPRECATED: useCopilotCloud - consolidated with signupForCopilotCloud\n useCopilotCloud: YesNoSchema.optional(),\n\n // LangGraph specific fields\n langGraphAgent: LangGraphAgentSchema.optional(),\n langGraphPlatform: YesNoSchema.optional(),\n langGraphPlatformUrl: UrlSchema.optional(),\n langGraphRemoteEndpointURL: UrlSchema.optional(),\n\n // CrewAI specific fields\n crewType: CrewTypeSchema.optional(),\n crewName: NameSchema.optional(),\n crewUrl: UrlSchema.optional(),\n crewBearerToken: TokenSchema.optional(),\n\n // API keys and tokens\n copilotCloudPublicApiKey: z.string().optional(),\n langSmithApiKey: ApiKeySchema.optional(),\n llmToken: LLMApiKeySchema.optional(),\n\n // IDE Documentation setup fields\n setupIDEDocs: YesNoSchema.optional(),\n selectedIDE: z.union([z.enum(['cursor', 'windsurf']), z.literal('skip')]).optional(),\n\n // NEW: A/B/C test fields\n deploymentChoice: DeploymentChoiceSchema.optional(), // For branch B only (Cloud vs Self-hosted)\n })\n .refine(\n (data) => {\n // If CrewAI is selected, require crew URL and bearer token\n if (data.mode === 'CrewAI') {\n return !!data.crewUrl && !!data.crewBearerToken\n }\n return true\n },\n {\n message: 'Crew URL and bearer token are required for CrewAI',\n path: ['crewUrl', 'crewBearerToken'],\n },\n )\n .refine(\n (data) => {\n // If LangGraph is selected with LangGraph Platform, require platform URL and LangSmith API key\n if (data.mode === 'LangGraph' && data.alreadyDeployed === 'Yes' && data.langGraphPlatform === 'Yes') {\n return (!!data.langGraphPlatformUrl && !!data.langSmithApiKey) || isLocalhost(data.langGraphPlatformUrl || '')\n }\n return true\n },\n {\n message: 'LangGraph Platform URL and LangSmith API key are required',\n path: ['langGraphPlatformUrl', 'langSmithApiKey'],\n },\n )\n\n// Export the inferred type from the schema\nexport type Config = z.infer<typeof ConfigSchema>\n\n// Question type definition with improved validation and sanitization\nexport type Question = {\n type: 'input' | 'yes/no' | 'select'\n name: keyof Config\n message: string\n choices?: readonly string[] | (() => Promise<{name: string; value: string}[]>)\n default?: string\n when?: (answers: Partial<Config>) => boolean | Promise<boolean>\n sensitive?: boolean\n validate?: (input: string) => true | string // Return true if valid, error message string if invalid\n sanitize?: (input: string) => string // Function to sanitize input before validation\n}\n\n// CLI flags definition with descriptions\nexport const ConfigFlags = {\n booth: Flags.boolean({description: 'Use CopilotKit in booth mode', default: false, char: 'b'}),\n mode: Flags.string({description: 'How you will be interacting with AI', options: MODES, char: 'm'}),\n 'copilotkit-version': Flags.string({description: 'CopilotKit version to use (e.g. 1.7.0)'}),\n 'use-copilot-cloud': Flags.string({description: 'Use Copilot Cloud for production-ready hosting', options: YES_NO}),\n 'langgraph-agent': Flags.string({description: 'LangGraph agent template to use', options: LANGGRAPH_AGENTS}),\n 'crew-type': Flags.string({description: 'CrewAI implementation type', options: CREW_TYPES}),\n 'crew-name': Flags.string({description: 'Name for your CrewAI agent'}),\n 'crew-url': Flags.string({description: 'URL endpoint for your CrewAI agent'}),\n 'crew-bearer-token': Flags.string({description: 'Bearer token for CrewAI authentication'}),\n 'langsmith-api-key': Flags.string({description: 'LangSmith API key for LangGraph observability'}),\n 'llm-token': Flags.string({description: 'API key for your preferred LLM provider'}),\n 'setup-ide-docs': Flags.string({description: 'Setup IDE documentation rules for AI assistance', options: YES_NO}),\n 'selected-ide': Flags.string({\n description: 'IDE to configure with documentation rules',\n options: ['cursor', 'windsurf', 'skip'],\n }),\n // NEW: A/B/C test flags\n 'deployment-choice': Flags.string({\n description: 'Choose between Copilot Cloud or Self-hosted deployment',\n options: DEPLOYMENT_CHOICES,\n }),\n}\n","export const isLocalhost = (url: string): boolean => {\n return url.includes('localhost') || url.includes('127.0.0.1') || url.includes('0.0.0.0')\n}\n","export type ChatTemplate = 'CopilotChat' | 'CopilotPopup' | 'CopilotSidebar'\n\nexport type StarterTemplate =\n | 'LangGraphPlatform'\n | 'RemoteEndpoint'\n | 'Standard'\n | 'CrewEnterprise'\n | 'CrewFlowsStarter'\n\nexport type Template = ChatTemplate | StarterTemplate\n\nconst BASE_URL = 'https://registry.copilotkit.ai/r'\n\nexport const templateMapping = {\n // Runtimes\n RemoteEndpoint: `${BASE_URL}/remote-endpoint.json`,\n LangGraphPlatformRuntime: `${BASE_URL}/langgraph-platform-runtime.json`,\n\n // CrewAI\n CrewEnterprise: [`${BASE_URL}/coagents-crew-starter.json`],\n CrewFlowsEnterprise: [`${BASE_URL}/coagents-starter-crewai-flows.json`],\n\n // LangGraph\n LangGraphGeneric: `${BASE_URL}/generic-lg-starter.json`,\n LangGraphStarter: [`${BASE_URL}/langgraph-platform-starter.json`, `${BASE_URL}/coagents-starter-ui.json`],\n\n // No Agent\n StandardStarter: `${BASE_URL}/standard-starter.json`,\n StandardRuntime: `${BASE_URL}/standard-runtime.json`,\n\n // MCP\n McpStarter: `${BASE_URL}/mcp-starter.json`,\n McpRuntime: `${BASE_URL}/mcp-starter-runtime.json`,\n}\n","import path from 'path'\nimport fs from 'fs'\nimport {Config} from '../types/index.js'\nimport {getLangGraphAgents} from './langgraph-assistants.js'\nimport inquirer from 'inquirer'\nimport {isLocalhost} from '../utils.js'\n\n/**\n * Determines if cloud deployment is needed based on user answers\n * Uses the same logic as the main init flow to ensure consistency\n */\nfunction needsCloudDeployment(userAnswers: Config): boolean {\n return (\n userAnswers.deploymentChoice === 'Copilot Cloud' || // Branch B choice\n userAnswers.useCopilotCloud === 'Yes' || // Branch C choice\n userAnswers.mode === 'CrewAI' || // CrewAI always needs cloud\n (!userAnswers.deploymentChoice && !userAnswers.useCopilotCloud) // Branch A default (no questions = cloud)\n )\n}\n\nexport async function scaffoldEnv(flags: any, userAnswers: Config) {\n try {\n // Define the env file path\n const envFile = path.join(process.cwd(), '.env')\n\n // Create the env file if it doesn't exist\n if (!fs.existsSync(envFile)) {\n fs.writeFileSync(envFile, '', 'utf8')\n } else {\n }\n\n // Build environment variables based on user selections\n let newEnvValues = ''\n\n // Check if cloud deployment is needed\n const isCloudDeployment = needsCloudDeployment(userAnswers)\n\n // Copilot Cloud API key\n if (userAnswers.copilotCloudPublicApiKey) {\n newEnvValues += `NEXT_PUBLIC_COPILOT_API_KEY=${userAnswers.copilotCloudPublicApiKey}\\n`\n }\n\n // LangSmith API key (for LangGraph)\n if (userAnswers.langSmithApiKey) {\n // Add both formats for compatibility\n newEnvValues += `LANGSMITH_API_KEY=${userAnswers.langSmithApiKey}\\n`\n }\n\n // LLM API key - set as both LLM_TOKEN and OPENAI_API_KEY for compatibility\n if (userAnswers.llmToken) {\n newEnvValues += `OPENAI_API_KEY=${userAnswers.llmToken}\\n`\n }\n\n // CrewAI name\n if (userAnswers.crewName) {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_AGENT_NAME=${userAnswers.crewName}\\n`\n }\n\n if (userAnswers.langGraphAgent) {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_AGENT_NAME=sample_agent\\n`\n newEnvValues += `LANGGRAPH_DEPLOYMENT_URL=http://localhost:8123\\n`\n } else if (userAnswers.langGraphPlatform === 'Yes' && !isCloudDeployment) {\n newEnvValues += `LANGGRAPH_DEPLOYMENT_URL=${userAnswers.langGraphPlatformUrl}\\n`\n } else if (userAnswers.langGraphRemoteEndpointURL) {\n newEnvValues += `COPILOTKIT_REMOTE_ENDPOINT=${userAnswers.langGraphRemoteEndpointURL}\\n`\n }\n\n // Runtime URL if provided via flags\n if (flags.runtimeUrl) {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_RUNTIME_URL=${flags.runtimeUrl}\\n`\n } else if (!isCloudDeployment && userAnswers.crewType !== 'Crews' && userAnswers.crewType !== 'Flows') {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_RUNTIME_URL=/api/copilotkit\\n`\n }\n\n if (\n userAnswers.langGraphPlatformUrl &&\n (userAnswers.langSmithApiKey || isLocalhost(userAnswers.langGraphPlatformUrl))\n ) {\n const langGraphAgents = await getLangGraphAgents(\n userAnswers.langGraphPlatformUrl,\n userAnswers.langSmithApiKey || '',\n )\n let langGraphAgent = ''\n if (langGraphAgents.length > 1) {\n const {langGraphAgentChoice} = await inquirer.prompt([\n {\n type: 'list',\n name: 'langGraphAgentChoice',\n message: '🦜🔗 Which agent from your graph would you like to use?',\n choices: langGraphAgents.map((agent: any) => ({\n name: agent.graph_id,\n value: agent.graph_id,\n })),\n },\n ])\n langGraphAgent = langGraphAgentChoice\n } else if (langGraphAgents.length === 1) {\n langGraphAgent = langGraphAgents[0].graph_id\n } else {\n throw new Error('No agents found in your LangGraph endpoint')\n }\n\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_AGENT_NAME=${langGraphAgent}\\n`\n }\n\n // Append the variables to the .env file\n if (newEnvValues) {\n fs.appendFileSync(envFile, newEnvValues)\n }\n } catch (error) {\n throw error\n }\n}\n","export type LangGraphAgent = {\n assistant_id: string\n graph_id: string\n config: {\n tags: string[]\n recursion_limit: number\n configurable: Record<string, any>\n }\n created_at: string\n updated_at: string\n metadata: Record<string, any>\n version: number\n name: string\n description: string\n}\n\nexport async function getLangGraphAgents(url: string, langSmithApiKey: string) {\n try {\n const response = await fetch(`${url.trim().replace(/\\/$/, '')}/assistants/search`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Api-Key': langSmithApiKey,\n },\n body: JSON.stringify({\n limit: 10,\n offset: 0,\n }),\n })\n\n return (await response.json()) as LangGraphAgent[]\n } catch (error) {\n throw new Error(`Failed to get LangGraph agents: ${error}`)\n }\n}\n","import {execSync} from 'child_process'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as os from 'os'\nimport {Config} from '../types/index.js'\nimport chalk from 'chalk'\nimport ora, {Ora} from 'ora'\n\n/**\n * Clones a specific subdirectory from a GitHub repository\n *\n * @param githubUrl - The GitHub URL to the repository or subdirectory\n * @param destinationPath - The local path where the content should be copied\n * @param spinner - The spinner to update with progress information\n * @returns A boolean indicating success or failure\n */\nexport async function cloneGitHubSubdirectory(\n githubUrl: string,\n destinationPath: string,\n spinner: Ora,\n): Promise<boolean> {\n try {\n // Parse the GitHub URL to extract repo info\n const {owner, repo, branch, subdirectoryPath} = parseGitHubUrl(githubUrl)\n\n spinner.text = chalk.cyan(`Cloning from ${owner}/${repo}...`)\n\n // Method 1: Use sparse checkout (more efficient than full clone)\n return await sparseCheckout(owner, repo, branch, subdirectoryPath, destinationPath, spinner)\n } catch (error) {\n spinner.text = chalk.red(`Failed to clone from GitHub: ${error}`)\n return false\n }\n}\n\n/**\n * Uses Git sparse-checkout to efficiently download only the needed subdirectory\n */\nasync function sparseCheckout(\n owner: string,\n repo: string,\n branch: string,\n subdirectoryPath: string,\n destinationPath: string,\n spinner: Ora,\n): Promise<boolean> {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'copilotkit-sparse-'))\n\n try {\n spinner.text = chalk.cyan('Creating temporary workspace...')\n\n // Initialize git repo\n execSync('git init', {cwd: tempDir, stdio: 'pipe'})\n\n spinner.text = chalk.cyan('Connecting to repository...')\n\n // Add remote\n execSync(`git remote add origin https://github.com/${owner}/${repo}.git`, {cwd: tempDir, stdio: 'pipe'})\n\n // Enable sparse checkout\n execSync('git config core.sparseCheckout true', {cwd: tempDir, stdio: 'pipe'})\n\n // Specify which subdirectory to checkout\n fs.writeFileSync(path.join(tempDir, '.git/info/sparse-checkout'), subdirectoryPath)\n\n spinner.text = chalk.cyan('Downloading agent files...')\n\n // Pull only the specified branch\n execSync(`git pull origin ${branch} --depth=1`, {cwd: tempDir, stdio: 'pipe'})\n\n // Copy the subdirectory to the destination\n const sourcePath = path.join(tempDir, subdirectoryPath)\n if (!fs.existsSync(sourcePath)) {\n throw new Error(`Subdirectory '${subdirectoryPath}' not found in the repository.`)\n }\n\n // Ensure destination directory exists\n fs.mkdirSync(destinationPath, {recursive: true})\n\n spinner.text = chalk.cyan('Installing agent files...')\n\n // Copy the subdirectory to the destination\n await copyDirectoryAsync(sourcePath, destinationPath)\n\n return true\n } finally {\n // Clean up the temporary directory\n try {\n fs.rmSync(tempDir, {recursive: true, force: true})\n } catch (error) {\n console.warn(`Failed to clean up temporary directory: ${error}`)\n }\n }\n}\n\n/**\n * Recursively copies a directory with async pauses\n */\nasync function copyDirectoryAsync(source: string, destination: string): Promise<void> {\n // Create destination directory if it doesn't exist\n if (!fs.existsSync(destination)) {\n fs.mkdirSync(destination, {recursive: true})\n }\n\n // Read all files/directories from source\n const entries = fs.readdirSync(source, {withFileTypes: true})\n\n for (const entry of entries) {\n const srcPath = path.join(source, entry.name)\n const destPath = path.join(destination, entry.name)\n\n if (entry.isDirectory()) {\n // Recursively copy subdirectories\n await copyDirectoryAsync(srcPath, destPath)\n } else {\n // Copy files\n fs.copyFileSync(srcPath, destPath)\n }\n\n // For large directories, add small pauses\n if (entries.length > 10) {\n await new Promise((resolve) => setTimeout(resolve, 1))\n }\n }\n}\n\n/**\n * Parses a GitHub URL to extract owner, repo, branch and subdirectory path\n */\nfunction parseGitHubUrl(githubUrl: string): {\n owner: string\n repo: string\n branch: string\n subdirectoryPath: string\n} {\n const url = new URL(githubUrl)\n\n if (url.hostname !== 'github.com') {\n throw new Error('Only GitHub URLs are supported')\n }\n\n const pathParts = url.pathname.split('/').filter(Boolean)\n\n if (pathParts.length < 2) {\n throw new Error('Invalid GitHub URL format')\n }\n\n const owner = pathParts[0]\n const repo = pathParts[1]\n let branch = 'main' // Default branch\n let subdirectoryPath = ''\n\n if (pathParts.length > 3 && (pathParts[2] === 'tree' || pathParts[2] === 'blob')) {\n branch = pathParts[3]\n subdirectoryPath = pathParts.slice(4).join('/')\n }\n\n return {owner, repo, branch, subdirectoryPath}\n}\n\n/**\n * Validates if a string is a valid GitHub URL\n */\nexport function isValidGitHubUrl(url: string): boolean {\n try {\n const parsedUrl = new URL(url)\n return parsedUrl.hostname === 'github.com' && parsedUrl.pathname.split('/').filter(Boolean).length >= 2\n } catch {\n return false\n }\n}\n","/*\n Currently unusued but will be used in the future once we have more time to think\n about what to use outside of shadcn/ui.\n*/\n\nimport spawn from 'cross-spawn'\nimport {Config} from '../types/index.js'\nimport chalk from 'chalk'\nimport fs from 'fs'\nimport ora from 'ora'\n\ntype PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun'\n\nexport async function scaffoldPackages(userAnswers: Config) {\n const spinner = ora({\n text: chalk.cyan('Preparing to install packages...'),\n color: 'cyan',\n }).start()\n\n try {\n const packages = [\n `@copilotkit/react-ui@${userAnswers.copilotKitVersion}`,\n `@copilotkit/react-core@${userAnswers.copilotKitVersion}`,\n `@copilotkit/runtime@${userAnswers.copilotKitVersion}`,\n ]\n\n // Small pause before starting\n await new Promise((resolve) => setTimeout(resolve, 50))\n\n const packageManager = detectPackageManager()\n const installCommand = detectInstallCommand(packageManager)\n\n spinner.text = chalk.cyan(`Using ${packageManager} to install packages...`)\n\n // Pause the spinner for the package installation\n spinner.stop()\n\n console.log(chalk.cyan('\\n⚙️ Installing packages...\\n'))\n\n const result = spawn.sync(packageManager, [installCommand, ...packages], {\n stdio: 'inherit', // This ensures stdin/stdout/stderr are all passed through\n })\n\n if (result.status !== 0) {\n throw new Error(`Package installation process exited with code ${result.status}`)\n }\n\n // Resume the spinner for success message\n spinner.start()\n spinner.succeed(chalk.green('CopilotKit packages installed successfully'))\n } catch (error) {\n // Use spinner for consistent error reporting\n if (!spinner.isSpinning) {\n spinner.start()\n }\n spinner.fail(chalk.red('Failed to install CopilotKit packages'))\n throw error\n }\n}\n\nfunction detectPackageManager(): PackageManager {\n // Check for lock files in the current directory\n const files = fs.readdirSync(process.cwd())\n\n if (files.includes('bun.lockb')) return 'bun'\n if (files.includes('pnpm-lock.yaml')) return 'pnpm'\n if (files.includes('yarn.lock')) return 'yarn'\n if (files.includes('package-lock.json')) return 'npm'\n\n // Default to npm if no lock file found\n return 'npm'\n}\n\nfunction detectInstallCommand(packageManager: PackageManager): string {\n switch (packageManager) {\n case 'yarn':\n case 'pnpm':\n return 'add'\n default:\n return 'install'\n }\n}\n","import ora from 'ora'\nimport chalk from 'chalk'\nimport {cloneGitHubSubdirectory} from './github.js'\nimport {Config} from '../types/index.js'\nimport path from 'path'\nimport fs from 'fs'\n\nexport async function scaffoldAgent(userAnswers: Config) {\n if (\n userAnswers.mode === 'CrewAI' ||\n (userAnswers.mode === 'LangGraph' && !userAnswers.langGraphAgent) ||\n userAnswers.mode === 'Standard' ||\n userAnswers.mode === 'MCP'\n ) {\n return\n }\n\n const spinner = ora({\n text: chalk.cyan('Setting up AI agent...'),\n color: 'cyan',\n }).start()\n\n let template = ''\n switch (userAnswers.mode) {\n case 'LangGraph':\n if (userAnswers.langGraphAgent === 'Python Starter') {\n template = AgentTemplates.LangGraph.Starter.Python\n } else {\n template = AgentTemplates.LangGraph.Starter.TypeScript\n }\n break\n }\n\n if (!template) {\n spinner.fail(chalk.red('Failed to determine agent template'))\n throw new Error('Failed to determine agent template')\n }\n\n const agentDir = path.join(process.cwd(), 'agent')\n\n try {\n await cloneGitHubSubdirectory(template, agentDir, spinner)\n\n // Create .env file in the agent directory\n spinner.text = chalk.cyan('Creating agent environment variables...')\n\n let envContent = ''\n\n // Add OpenAI API key if provided\n if (userAnswers.llmToken) {\n envContent += `OPENAI_API_KEY=${userAnswers.llmToken}\\n`\n }\n\n // Add LangSmith API key for LangGraph\n if (userAnswers.mode === 'LangGraph' && userAnswers.langSmithApiKey) {\n envContent += `LANGSMITH_API_KEY=${userAnswers.langSmithApiKey}\\n`\n }\n\n if (envContent) {\n const agentEnvFile = path.join(agentDir, '.env')\n fs.writeFileSync(agentEnvFile, envContent, 'utf8')\n spinner.text = chalk.cyan('Added API keys to agent .env file')\n }\n\n // Add LangSmith API key for LangGraph\n if (userAnswers.mode === 'LangGraph' && userAnswers.langSmithApiKey) {\n envContent += `LANGSMITH_API_KEY=${userAnswers.langSmithApiKey}\\n`\n }\n\n if (envContent) {\n const agentEnvFile = path.join(agentDir, '.env')\n fs.writeFileSync(agentEnvFile, envContent, 'utf8')\n spinner.text = chalk.cyan('Added API keys to agent .env file')\n }\n\n if (envContent) {\n const agentEnvFile = path.join(agentDir, '.env')\n fs.writeFileSync(agentEnvFile, envContent, 'utf8')\n spinner.text = chalk.cyan('Added API keys to agent .env file')\n }\n } catch (error) {\n spinner.fail(chalk.red('Failed to clone agent template'))\n throw error\n }\n\n spinner.succeed(`${userAnswers.mode} agent cloned successfully`)\n}\n\nexport const AgentTemplates = {\n LangGraph: {\n Starter: {\n Python: 'https://github.com/CopilotKit/coagents-starter-langgraph/tree/main/agent-py',\n TypeScript: 'https://github.com/CopilotKit/coagents-starter-langgraph/tree/main/agent-js',\n },\n },\n CrewAI: {\n Flows: {\n Starter: 'https://github.com/CopilotKit/coagents-starter-crewai-flows/tree/main/agent-py',\n },\n },\n}\n","import * as fs from 'fs/promises'\nimport ora from 'ora'\nimport * as path from 'path'\n\nexport async function addCrewInputs(url: string, token: string) {\n try {\n const spinner = ora('Analyzing crew inputs...').start()\n // Get inputs from the crew API\n const inputs = await getCrewInputs(url, token)\n spinner.text = 'Adding inputs to app/copilotkit/page.tsx...'\n\n // Path to the file we need to modify\n let filePath = path.join(process.cwd(), 'app', 'copilotkit', 'page.tsx')\n\n // check if non-src file exists\n try {\n await fs.access(filePath)\n } catch {\n filePath = path.join(process.cwd(), 'src', 'app', 'copilotkit', 'page.tsx')\n }\n\n // check if src file exists\n try {\n await fs.access(filePath)\n } catch {\n throw new Error('app/copilotkit/page.tsx and src/app/copilotkit/page.tsx not found')\n }\n\n // Read the file content\n let fileContent = await fs.readFile(filePath, 'utf8')\n\n // Replace all instances of \"YOUR_INPUTS_HERE\" with the inputs array as a string\n const inputsString = JSON.stringify(inputs)\n fileContent = fileContent.replace(/\\[[\"']YOUR_INPUTS_HERE[\"']\\]/g, inputsString)\n\n // Write the updated content back to the file\n await fs.writeFile(filePath, fileContent, 'utf8')\n\n spinner.succeed('Successfully added crew inputs to app/copilotkit/page.tsx')\n } catch (error) {\n console.error('Error updating crew inputs:', error)\n throw error\n }\n}\n\nasync function getCrewInputs(url: string, token: string): Promise<string[]> {\n const response = await fetch(`${url.trim()}/inputs`, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch inputs: ${response.statusText}`)\n }\n\n const data = (await response.json()) as {inputs: string[]}\n return data.inputs\n}\n"],"mappings":"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","names":["fs","path","spawn","chalk","fs","ora","chalk","path","fs","ora","chalk","fs","ora","path"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/init/scaffold/shadcn.ts","../../../../src/lib/init/types/questions.ts","../../../../src/lib/init/utils.ts","../../../../src/lib/init/types/templates.ts","../../../../src/lib/init/scaffold/env.ts","../../../../src/lib/init/scaffold/langgraph-assistants.ts","../../../../src/lib/init/scaffold/github.ts","../../../../src/lib/init/scaffold/packages.ts","../../../../src/lib/init/scaffold/agent.ts","../../../../src/lib/init/scaffold/crew-inputs.ts"],"sourcesContent":["import spawn from \"cross-spawn\";\nimport { templateMapping, Config } from \"../types/index.js\";\n\nexport async function scaffoldShadCN(flags: any, userAnswers: Config) {\n try {\n // Determine which components to install based on user choices\n const components: string[] = [];\n\n // Add additional components based on agent framework\n switch (userAnswers.mode) {\n case \"LangGraph\":\n components.push(templateMapping.LangGraphGeneric);\n if (userAnswers.langGraphPlatform === \"Yes\") {\n components.push(templateMapping.LangGraphPlatformRuntime);\n } else {\n components.push(templateMapping.RemoteEndpoint);\n }\n break;\n case \"CrewAI\":\n if (userAnswers.crewType === \"Crews\") {\n components.push(...templateMapping.CrewEnterprise);\n } else if (userAnswers.crewType === \"Flows\") {\n components.push(...templateMapping.CrewFlowsEnterprise);\n } else {\n components.push(templateMapping.RemoteEndpoint);\n }\n break;\n case \"MCP\":\n components.push(templateMapping.McpStarter);\n if (\n userAnswers.deploymentChoice === \"Self-hosted\" ||\n userAnswers.useCopilotCloud === \"No\"\n ) {\n components.push(templateMapping.McpRuntime);\n }\n break;\n case \"Standard\":\n components.push(templateMapping.StandardStarter);\n if (\n userAnswers.deploymentChoice === \"Self-hosted\" ||\n userAnswers.useCopilotCloud === \"No\"\n ) {\n components.push(templateMapping.StandardRuntime);\n }\n break;\n default:\n return;\n }\n\n // Small pause before running shadcn\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n try {\n // Run shadcn with inherited stdio for all streams to allow for user input\n const result = spawn.sync(\n \"npx\",\n [\"shadcn@latest\", \"add\", ...components],\n {\n stdio: \"inherit\", // This ensures stdin/stdout/stderr are all passed through\n },\n );\n\n if (result.status !== 0) {\n throw new Error(\n `The shadcn installation process exited with code ${result.status}`,\n );\n }\n } catch (error) {\n throw error;\n }\n } catch (error) {\n throw error;\n }\n}\n","import { z } from \"zod\";\nimport { Flags } from \"@oclif/core\";\nimport { isLocalhost } from \"../utils.js\";\n\n// ===== Core Constants =====\nexport const MODES = [\n \"LangGraph\",\n \"CrewAI\",\n \"Mastra\",\n \"LlamaIndex\",\n \"Agno\",\n \"AG2\",\n \"MCP\",\n \"Standard\",\n] as const;\nexport const CREW_TYPES = [\"Crews\", \"Flows\"] as const;\nexport const CHAT_COMPONENTS = [\n \"CopilotChat\",\n \"CopilotSidebar\",\n \"Headless\",\n \"CopilotPopup\",\n] as const;\nexport const LANGGRAPH_AGENTS = [\n \"Python Starter\",\n \"TypeScript Starter\",\n] as const;\nexport const CREW_FLOW_TEMPLATES = [\"Starter\"] as const;\nexport const YES_NO = [\"Yes\", \"No\"] as const;\n// NEW: Deployment choice options for Branch B\nexport const DEPLOYMENT_CHOICES = [\"Copilot Cloud\", \"Self-hosted\"] as const;\n\n// ===== Sanitizers =====\nexport const sanitizers = {\n // Remove trailing slash from URLs\n url: (value: string): string => {\n if (!value) return value;\n return value.trim().replace(/\\/+$/, \"\");\n },\n\n // Trim whitespace from strings\n trim: (value: string): string => {\n if (!value) return value;\n return value.trim();\n },\n\n // Lowercase strings\n lowercase: (value: string): string => {\n if (!value) return value;\n return value.toLowerCase().trim();\n },\n\n // Clean API keys (remove whitespace)\n apiKey: (value: string): string => {\n if (!value) return value;\n return value.trim().replace(/\\s/g, \"\");\n },\n};\n\n// ===== Zod Schemas =====\n\n// Basic schemas\nexport const ModeSchema = z.enum(MODES);\nexport const CrewTypeSchema = z.enum(CREW_TYPES);\nexport const ChatComponentSchema = z.enum(CHAT_COMPONENTS);\nexport const LangGraphAgentSchema = z.enum(LANGGRAPH_AGENTS);\nexport const CrewFlowTemplateSchema = z.enum(CREW_FLOW_TEMPLATES);\nexport const YesNoSchema = z.enum(YES_NO);\n// NEW: Deployment choice schema for Branch B\nexport const DeploymentChoiceSchema = z.enum(DEPLOYMENT_CHOICES);\n\n// URL validation schema with preprocessing to remove trailing slash\nexport const UrlSchema = z.preprocess(\n (val) => sanitizers.url(String(val)),\n z.string().url(\"Please enter a valid URL\").min(1, \"URL is required\"),\n);\n\n// Token validation schema with preprocessing to trim\nexport const TokenSchema = z.preprocess(\n (val) => sanitizers.trim(String(val)),\n z.string().min(1, \"Token is required\"),\n);\n\n// API key validation schema with preprocessing to remove whitespace\nexport const ApiKeySchema = z.preprocess(\n (val) => sanitizers.apiKey(String(val)),\n z.string().min(1, \"API key is required\"),\n);\n\nexport const LLMApiKeySchema = z.preprocess(\n (val) => sanitizers.apiKey(String(val)),\n z.string().optional(),\n);\n\n// Name validation schema with preprocessing to trim\nexport const NameSchema = z.preprocess(\n (val) => sanitizers.trim(String(val)),\n z.string().min(1, \"Name is required\"),\n);\n\n// Config schema\nexport const ConfigSchema = z\n .object({\n // Core fields\n copilotKitVersion: z.string().optional(),\n mode: ModeSchema,\n chatUi: ChatComponentSchema.optional(),\n\n // Yes/No fields\n alreadyDeployed: YesNoSchema.optional(),\n fastApiEnabled: YesNoSchema.optional(),\n // DEPRECATED: useCopilotCloud - consolidated with signupForCopilotCloud\n useCopilotCloud: YesNoSchema.optional(),\n\n // LangGraph specific fields\n langGraphAgent: LangGraphAgentSchema.optional(),\n langGraphPlatform: YesNoSchema.optional(),\n langGraphPlatformUrl: UrlSchema.optional(),\n langGraphRemoteEndpointURL: UrlSchema.optional(),\n\n // CrewAI specific fields\n crewType: CrewTypeSchema.optional(),\n crewName: NameSchema.optional(),\n crewUrl: UrlSchema.optional(),\n crewBearerToken: TokenSchema.optional(),\n\n // API keys and tokens\n copilotCloudPublicApiKey: z.string().optional(),\n langSmithApiKey: ApiKeySchema.optional(),\n llmToken: LLMApiKeySchema.optional(),\n\n // IDE Documentation setup fields\n setupIDEDocs: YesNoSchema.optional(),\n selectedIDE: z\n .union([z.enum([\"cursor\", \"windsurf\"]), z.literal(\"skip\")])\n .optional(),\n\n // NEW: A/B/C test fields\n deploymentChoice: DeploymentChoiceSchema.optional(), // For branch B only (Cloud vs Self-hosted)\n })\n .refine(\n (data) => {\n // If CrewAI is selected, require crew URL and bearer token\n if (data.mode === \"CrewAI\") {\n return !!data.crewUrl && !!data.crewBearerToken;\n }\n return true;\n },\n {\n message: \"Crew URL and bearer token are required for CrewAI\",\n path: [\"crewUrl\", \"crewBearerToken\"],\n },\n )\n .refine(\n (data) => {\n // If LangGraph is selected with LangGraph Platform, require platform URL and LangSmith API key\n if (\n data.mode === \"LangGraph\" &&\n data.alreadyDeployed === \"Yes\" &&\n data.langGraphPlatform === \"Yes\"\n ) {\n return (\n (!!data.langGraphPlatformUrl && !!data.langSmithApiKey) ||\n isLocalhost(data.langGraphPlatformUrl || \"\")\n );\n }\n return true;\n },\n {\n message: \"LangGraph Platform URL and LangSmith API key are required\",\n path: [\"langGraphPlatformUrl\", \"langSmithApiKey\"],\n },\n );\n\n// Export the inferred type from the schema\nexport type Config = z.infer<typeof ConfigSchema>;\n\n// Question type definition with improved validation and sanitization\nexport type Question = {\n type: \"input\" | \"yes/no\" | \"select\";\n name: keyof Config;\n message: string;\n choices?:\n | readonly string[]\n | (() => Promise<{ name: string; value: string }[]>);\n default?: string;\n when?: (answers: Partial<Config>) => boolean | Promise<boolean>;\n sensitive?: boolean;\n validate?: (input: string) => true | string; // Return true if valid, error message string if invalid\n sanitize?: (input: string) => string; // Function to sanitize input before validation\n};\n\n// CLI flags definition with descriptions\nexport const ConfigFlags = {\n booth: Flags.boolean({\n description: \"Use CopilotKit in booth mode\",\n default: false,\n char: \"b\",\n }),\n mode: Flags.string({\n description: \"How you will be interacting with AI\",\n options: MODES,\n char: \"m\",\n }),\n \"copilotkit-version\": Flags.string({\n description: \"CopilotKit version to use (e.g. 1.7.0)\",\n }),\n \"use-copilot-cloud\": Flags.string({\n description: \"Use Copilot Cloud for production-ready hosting\",\n options: YES_NO,\n }),\n \"langgraph-agent\": Flags.string({\n description: \"LangGraph agent template to use\",\n options: LANGGRAPH_AGENTS,\n }),\n \"crew-type\": Flags.string({\n description: \"CrewAI implementation type\",\n options: CREW_TYPES,\n }),\n \"crew-name\": Flags.string({ description: \"Name for your CrewAI agent\" }),\n \"crew-url\": Flags.string({\n description: \"URL endpoint for your CrewAI agent\",\n }),\n \"crew-bearer-token\": Flags.string({\n description: \"Bearer token for CrewAI authentication\",\n }),\n \"langsmith-api-key\": Flags.string({\n description: \"LangSmith API key for LangGraph observability\",\n }),\n \"llm-token\": Flags.string({\n description: \"API key for your preferred LLM provider\",\n }),\n \"setup-ide-docs\": Flags.string({\n description: \"Setup IDE documentation rules for AI assistance\",\n options: YES_NO,\n }),\n \"selected-ide\": Flags.string({\n description: \"IDE to configure with documentation rules\",\n options: [\"cursor\", \"windsurf\", \"skip\"],\n }),\n // NEW: A/B/C test flags\n \"deployment-choice\": Flags.string({\n description: \"Choose between Copilot Cloud or Self-hosted deployment\",\n options: DEPLOYMENT_CHOICES,\n }),\n};\n","export const isLocalhost = (url: string): boolean => {\n return (\n url.includes(\"localhost\") ||\n url.includes(\"127.0.0.1\") ||\n url.includes(\"0.0.0.0\")\n );\n};\n","export type ChatTemplate = \"CopilotChat\" | \"CopilotPopup\" | \"CopilotSidebar\";\n\nexport type StarterTemplate =\n | \"LangGraphPlatform\"\n | \"RemoteEndpoint\"\n | \"Standard\"\n | \"CrewEnterprise\"\n | \"CrewFlowsStarter\";\n\nexport type Template = ChatTemplate | StarterTemplate;\n\nconst BASE_URL = \"https://registry.copilotkit.ai/r\";\n\nexport const templateMapping = {\n // Runtimes\n RemoteEndpoint: `${BASE_URL}/remote-endpoint.json`,\n LangGraphPlatformRuntime: `${BASE_URL}/langgraph-platform-runtime.json`,\n\n // CrewAI\n CrewEnterprise: [`${BASE_URL}/coagents-crew-starter.json`],\n CrewFlowsEnterprise: [`${BASE_URL}/coagents-starter-crewai-flows.json`],\n\n // LangGraph\n LangGraphGeneric: `${BASE_URL}/generic-lg-starter.json`,\n LangGraphStarter: [\n `${BASE_URL}/langgraph-platform-starter.json`,\n `${BASE_URL}/coagents-starter-ui.json`,\n ],\n\n // No Agent\n StandardStarter: `${BASE_URL}/standard-starter.json`,\n StandardRuntime: `${BASE_URL}/standard-runtime.json`,\n\n // MCP\n McpStarter: `${BASE_URL}/mcp-starter.json`,\n McpRuntime: `${BASE_URL}/mcp-starter-runtime.json`,\n};\n","import path from \"path\";\nimport fs from \"fs\";\nimport { Config } from \"../types/index.js\";\nimport { getLangGraphAgents } from \"./langgraph-assistants.js\";\nimport inquirer from \"inquirer\";\nimport { isLocalhost } from \"../utils.js\";\n\n/**\n * Determines if cloud deployment is needed based on user answers\n * Uses the same logic as the main init flow to ensure consistency\n */\nfunction needsCloudDeployment(userAnswers: Config): boolean {\n return (\n userAnswers.deploymentChoice === \"Copilot Cloud\" || // Branch B choice\n userAnswers.useCopilotCloud === \"Yes\" || // Branch C choice\n userAnswers.mode === \"CrewAI\" || // CrewAI always needs cloud\n (!userAnswers.deploymentChoice && !userAnswers.useCopilotCloud) // Branch A default (no questions = cloud)\n );\n}\n\nexport async function scaffoldEnv(flags: any, userAnswers: Config) {\n try {\n // Define the env file path\n const envFile = path.join(process.cwd(), \".env\");\n\n // Create the env file if it doesn't exist\n if (!fs.existsSync(envFile)) {\n fs.writeFileSync(envFile, \"\", \"utf8\");\n } else {\n }\n\n // Build environment variables based on user selections\n let newEnvValues = \"\";\n\n // Check if cloud deployment is needed\n const isCloudDeployment = needsCloudDeployment(userAnswers);\n\n // Copilot Cloud API key\n if (userAnswers.copilotCloudPublicApiKey) {\n newEnvValues += `NEXT_PUBLIC_COPILOT_API_KEY=${userAnswers.copilotCloudPublicApiKey}\\n`;\n }\n\n // LangSmith API key (for LangGraph)\n if (userAnswers.langSmithApiKey) {\n // Add both formats for compatibility\n newEnvValues += `LANGSMITH_API_KEY=${userAnswers.langSmithApiKey}\\n`;\n }\n\n // LLM API key - set as both LLM_TOKEN and OPENAI_API_KEY for compatibility\n if (userAnswers.llmToken) {\n newEnvValues += `OPENAI_API_KEY=${userAnswers.llmToken}\\n`;\n }\n\n // CrewAI name\n if (userAnswers.crewName) {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_AGENT_NAME=${userAnswers.crewName}\\n`;\n }\n\n if (userAnswers.langGraphAgent) {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_AGENT_NAME=sample_agent\\n`;\n newEnvValues += `LANGGRAPH_DEPLOYMENT_URL=http://localhost:8123\\n`;\n } else if (userAnswers.langGraphPlatform === \"Yes\" && !isCloudDeployment) {\n newEnvValues += `LANGGRAPH_DEPLOYMENT_URL=${userAnswers.langGraphPlatformUrl}\\n`;\n } else if (userAnswers.langGraphRemoteEndpointURL) {\n newEnvValues += `COPILOTKIT_REMOTE_ENDPOINT=${userAnswers.langGraphRemoteEndpointURL}\\n`;\n }\n\n // Runtime URL if provided via flags\n if (flags.runtimeUrl) {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_RUNTIME_URL=${flags.runtimeUrl}\\n`;\n } else if (\n !isCloudDeployment &&\n userAnswers.crewType !== \"Crews\" &&\n userAnswers.crewType !== \"Flows\"\n ) {\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_RUNTIME_URL=/api/copilotkit\\n`;\n }\n\n if (\n userAnswers.langGraphPlatformUrl &&\n (userAnswers.langSmithApiKey ||\n isLocalhost(userAnswers.langGraphPlatformUrl))\n ) {\n const langGraphAgents = await getLangGraphAgents(\n userAnswers.langGraphPlatformUrl,\n userAnswers.langSmithApiKey || \"\",\n );\n let langGraphAgent = \"\";\n if (langGraphAgents.length > 1) {\n const { langGraphAgentChoice } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"langGraphAgentChoice\",\n message: \"🦜🔗 Which agent from your graph would you like to use?\",\n choices: langGraphAgents.map((agent: any) => ({\n name: agent.graph_id,\n value: agent.graph_id,\n })),\n },\n ]);\n langGraphAgent = langGraphAgentChoice;\n } else if (langGraphAgents.length === 1) {\n langGraphAgent = langGraphAgents[0].graph_id;\n } else {\n throw new Error(\"No agents found in your LangGraph endpoint\");\n }\n\n newEnvValues += `NEXT_PUBLIC_COPILOTKIT_AGENT_NAME=${langGraphAgent}\\n`;\n }\n\n // Append the variables to the .env file\n if (newEnvValues) {\n fs.appendFileSync(envFile, newEnvValues);\n }\n } catch (error) {\n throw error;\n }\n}\n","export type LangGraphAgent = {\n assistant_id: string;\n graph_id: string;\n config: {\n tags: string[];\n recursion_limit: number;\n configurable: Record<string, any>;\n };\n created_at: string;\n updated_at: string;\n metadata: Record<string, any>;\n version: number;\n name: string;\n description: string;\n};\n\nexport async function getLangGraphAgents(url: string, langSmithApiKey: string) {\n try {\n const response = await fetch(\n `${url.trim().replace(/\\/$/, \"\")}/assistants/search`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Api-Key\": langSmithApiKey,\n },\n body: JSON.stringify({\n limit: 10,\n offset: 0,\n }),\n },\n );\n\n return (await response.json()) as LangGraphAgent[];\n } catch (error) {\n throw new Error(`Failed to get LangGraph agents: ${error}`);\n }\n}\n","import { execSync } from \"child_process\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { Config } from \"../types/index.js\";\nimport chalk from \"chalk\";\nimport ora, { Ora } from \"ora\";\n\n/**\n * Clones a specific subdirectory from a GitHub repository\n *\n * @param githubUrl - The GitHub URL to the repository or subdirectory\n * @param destinationPath - The local path where the content should be copied\n * @param spinner - The spinner to update with progress information\n * @returns A boolean indicating success or failure\n */\nexport async function cloneGitHubSubdirectory(\n githubUrl: string,\n destinationPath: string,\n spinner: Ora,\n): Promise<boolean> {\n try {\n // Parse the GitHub URL to extract repo info\n const { owner, repo, branch, subdirectoryPath } = parseGitHubUrl(githubUrl);\n\n spinner.text = chalk.cyan(`Cloning from ${owner}/${repo}...`);\n\n // Method 1: Use sparse checkout (more efficient than full clone)\n return await sparseCheckout(\n owner,\n repo,\n branch,\n subdirectoryPath,\n destinationPath,\n spinner,\n );\n } catch (error) {\n spinner.text = chalk.red(`Failed to clone from GitHub: ${error}`);\n return false;\n }\n}\n\n/**\n * Uses Git sparse-checkout to efficiently download only the needed subdirectory\n */\nasync function sparseCheckout(\n owner: string,\n repo: string,\n branch: string,\n subdirectoryPath: string,\n destinationPath: string,\n spinner: Ora,\n): Promise<boolean> {\n const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"copilotkit-sparse-\"));\n\n try {\n spinner.text = chalk.cyan(\"Creating temporary workspace...\");\n\n // Initialize git repo\n execSync(\"git init\", { cwd: tempDir, stdio: \"pipe\" });\n\n spinner.text = chalk.cyan(\"Connecting to repository...\");\n\n // Add remote\n execSync(`git remote add origin https://github.com/${owner}/${repo}.git`, {\n cwd: tempDir,\n stdio: \"pipe\",\n });\n\n // Enable sparse checkout\n execSync(\"git config core.sparseCheckout true\", {\n cwd: tempDir,\n stdio: \"pipe\",\n });\n\n // Specify which subdirectory to checkout\n fs.writeFileSync(\n path.join(tempDir, \".git/info/sparse-checkout\"),\n subdirectoryPath,\n );\n\n spinner.text = chalk.cyan(\"Downloading agent files...\");\n\n // Pull only the specified branch\n execSync(`git pull origin ${branch} --depth=1`, {\n cwd: tempDir,\n stdio: \"pipe\",\n });\n\n // Copy the subdirectory to the destination\n const sourcePath = path.join(tempDir, subdirectoryPath);\n if (!fs.existsSync(sourcePath)) {\n throw new Error(\n `Subdirectory '${subdirectoryPath}' not found in the repository.`,\n );\n }\n\n // Ensure destination directory exists\n fs.mkdirSync(destinationPath, { recursive: true });\n\n spinner.text = chalk.cyan(\"Installing agent files...\");\n\n // Copy the subdirectory to the destination\n await copyDirectoryAsync(sourcePath, destinationPath);\n\n return true;\n } finally {\n // Clean up the temporary directory\n try {\n fs.rmSync(tempDir, { recursive: true, force: true });\n } catch (error) {\n console.warn(`Failed to clean up temporary directory: ${error}`);\n }\n }\n}\n\n/**\n * Recursively copies a directory with async pauses\n */\nasync function copyDirectoryAsync(\n source: string,\n destination: string,\n): Promise<void> {\n // Create destination directory if it doesn't exist\n if (!fs.existsSync(destination)) {\n fs.mkdirSync(destination, { recursive: true });\n }\n\n // Read all files/directories from source\n const entries = fs.readdirSync(source, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(source, entry.name);\n const destPath = path.join(destination, entry.name);\n\n if (entry.isDirectory()) {\n // Recursively copy subdirectories\n await copyDirectoryAsync(srcPath, destPath);\n } else {\n // Copy files\n fs.copyFileSync(srcPath, destPath);\n }\n\n // For large directories, add small pauses\n if (entries.length > 10) {\n await new Promise((resolve) => setTimeout(resolve, 1));\n }\n }\n}\n\n/**\n * Parses a GitHub URL to extract owner, repo, branch and subdirectory path\n */\nfunction parseGitHubUrl(githubUrl: string): {\n owner: string;\n repo: string;\n branch: string;\n subdirectoryPath: string;\n} {\n const url = new URL(githubUrl);\n\n if (url.hostname !== \"github.com\") {\n throw new Error(\"Only GitHub URLs are supported\");\n }\n\n const pathParts = url.pathname.split(\"/\").filter(Boolean);\n\n if (pathParts.length < 2) {\n throw new Error(\"Invalid GitHub URL format\");\n }\n\n const owner = pathParts[0];\n const repo = pathParts[1];\n let branch = \"main\"; // Default branch\n let subdirectoryPath = \"\";\n\n if (\n pathParts.length > 3 &&\n (pathParts[2] === \"tree\" || pathParts[2] === \"blob\")\n ) {\n branch = pathParts[3];\n subdirectoryPath = pathParts.slice(4).join(\"/\");\n }\n\n return { owner, repo, branch, subdirectoryPath };\n}\n\n/**\n * Validates if a string is a valid GitHub URL\n */\nexport function isValidGitHubUrl(url: string): boolean {\n try {\n const parsedUrl = new URL(url);\n return (\n parsedUrl.hostname === \"github.com\" &&\n parsedUrl.pathname.split(\"/\").filter(Boolean).length >= 2\n );\n } catch {\n return false;\n }\n}\n","/*\n Currently unusued but will be used in the future once we have more time to think\n about what to use outside of shadcn/ui.\n*/\n\nimport spawn from \"cross-spawn\";\nimport { Config } from \"../types/index.js\";\nimport chalk from \"chalk\";\nimport fs from \"fs\";\nimport ora from \"ora\";\n\ntype PackageManager = \"npm\" | \"yarn\" | \"pnpm\" | \"bun\";\n\nexport async function scaffoldPackages(userAnswers: Config) {\n const spinner = ora({\n text: chalk.cyan(\"Preparing to install packages...\"),\n color: \"cyan\",\n }).start();\n\n try {\n const packages = [\n `@copilotkit/react-ui@${userAnswers.copilotKitVersion}`,\n `@copilotkit/react-core@${userAnswers.copilotKitVersion}`,\n `@copilotkit/runtime@${userAnswers.copilotKitVersion}`,\n ];\n\n // Small pause before starting\n await new Promise((resolve) => setTimeout(resolve, 50));\n\n const packageManager = detectPackageManager();\n const installCommand = detectInstallCommand(packageManager);\n\n spinner.text = chalk.cyan(`Using ${packageManager} to install packages...`);\n\n // Pause the spinner for the package installation\n spinner.stop();\n\n console.log(chalk.cyan(\"\\n⚙️ Installing packages...\\n\"));\n\n const result = spawn.sync(packageManager, [installCommand, ...packages], {\n stdio: \"inherit\", // This ensures stdin/stdout/stderr are all passed through\n });\n\n if (result.status !== 0) {\n throw new Error(\n `Package installation process exited with code ${result.status}`,\n );\n }\n\n // Resume the spinner for success message\n spinner.start();\n spinner.succeed(chalk.green(\"CopilotKit packages installed successfully\"));\n } catch (error) {\n // Use spinner for consistent error reporting\n if (!spinner.isSpinning) {\n spinner.start();\n }\n spinner.fail(chalk.red(\"Failed to install CopilotKit packages\"));\n throw error;\n }\n}\n\nfunction detectPackageManager(): PackageManager {\n // Check for lock files in the current directory\n const files = fs.readdirSync(process.cwd());\n\n if (files.includes(\"bun.lockb\")) return \"bun\";\n if (files.includes(\"pnpm-lock.yaml\")) return \"pnpm\";\n if (files.includes(\"yarn.lock\")) return \"yarn\";\n if (files.includes(\"package-lock.json\")) return \"npm\";\n\n // Default to npm if no lock file found\n return \"npm\";\n}\n\nfunction detectInstallCommand(packageManager: PackageManager): string {\n switch (packageManager) {\n case \"yarn\":\n case \"pnpm\":\n return \"add\";\n default:\n return \"install\";\n }\n}\n","import ora from \"ora\";\nimport chalk from \"chalk\";\nimport { cloneGitHubSubdirectory } from \"./github.js\";\nimport { Config } from \"../types/index.js\";\nimport path from \"path\";\nimport fs from \"fs\";\n\nexport async function scaffoldAgent(userAnswers: Config) {\n if (\n userAnswers.mode === \"CrewAI\" ||\n (userAnswers.mode === \"LangGraph\" && !userAnswers.langGraphAgent) ||\n userAnswers.mode === \"Standard\" ||\n userAnswers.mode === \"MCP\"\n ) {\n return;\n }\n\n const spinner = ora({\n text: chalk.cyan(\"Setting up AI agent...\"),\n color: \"cyan\",\n }).start();\n\n let template = \"\";\n switch (userAnswers.mode) {\n case \"LangGraph\":\n if (userAnswers.langGraphAgent === \"Python Starter\") {\n template = AgentTemplates.LangGraph.Starter.Python;\n } else {\n template = AgentTemplates.LangGraph.Starter.TypeScript;\n }\n break;\n }\n\n if (!template) {\n spinner.fail(chalk.red(\"Failed to determine agent template\"));\n throw new Error(\"Failed to determine agent template\");\n }\n\n const agentDir = path.join(process.cwd(), \"agent\");\n\n try {\n await cloneGitHubSubdirectory(template, agentDir, spinner);\n\n // Create .env file in the agent directory\n spinner.text = chalk.cyan(\"Creating agent environment variables...\");\n\n let envContent = \"\";\n\n // Add OpenAI API key if provided\n if (userAnswers.llmToken) {\n envContent += `OPENAI_API_KEY=${userAnswers.llmToken}\\n`;\n }\n\n // Add LangSmith API key for LangGraph\n if (userAnswers.mode === \"LangGraph\" && userAnswers.langSmithApiKey) {\n envContent += `LANGSMITH_API_KEY=${userAnswers.langSmithApiKey}\\n`;\n }\n\n if (envContent) {\n const agentEnvFile = path.join(agentDir, \".env\");\n fs.writeFileSync(agentEnvFile, envContent, \"utf8\");\n spinner.text = chalk.cyan(\"Added API keys to agent .env file\");\n }\n } catch (error) {\n spinner.fail(chalk.red(\"Failed to clone agent template\"));\n throw error;\n }\n\n spinner.succeed(`${userAnswers.mode} agent cloned successfully`);\n}\n\nexport const AgentTemplates = {\n LangGraph: {\n Starter: {\n Python:\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/starters/coagents-langgraph/agent-py\",\n TypeScript:\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/starters/coagents-langgraph/agent-js\",\n },\n },\n CrewAI: {\n Flows: {\n Starter:\n \"https://github.com/CopilotKit/CopilotKit/tree/main/examples/starters/coagents-crewai-flows/agent-py\",\n },\n },\n};\n","import * as fs from \"fs/promises\";\nimport ora from \"ora\";\nimport * as path from \"path\";\n\nexport async function addCrewInputs(url: string, token: string) {\n try {\n const spinner = ora(\"Analyzing crew inputs...\").start();\n // Get inputs from the crew API\n const inputs = await getCrewInputs(url, token);\n spinner.text = \"Adding inputs to app/copilotkit/page.tsx...\";\n\n // Path to the file we need to modify\n let filePath = path.join(process.cwd(), \"app\", \"copilotkit\", \"page.tsx\");\n\n // check if non-src file exists\n try {\n await fs.access(filePath);\n } catch {\n filePath = path.join(\n process.cwd(),\n \"src\",\n \"app\",\n \"copilotkit\",\n \"page.tsx\",\n );\n }\n\n // check if src file exists\n try {\n await fs.access(filePath);\n } catch {\n throw new Error(\n \"app/copilotkit/page.tsx and src/app/copilotkit/page.tsx not found\",\n );\n }\n\n // Read the file content\n let fileContent = await fs.readFile(filePath, \"utf8\");\n\n // Replace all instances of \"YOUR_INPUTS_HERE\" with the inputs array as a string\n const inputsString = JSON.stringify(inputs);\n fileContent = fileContent.replace(\n /\\[[\"']YOUR_INPUTS_HERE[\"']\\]/g,\n inputsString,\n );\n\n // Write the updated content back to the file\n await fs.writeFile(filePath, fileContent, \"utf8\");\n\n spinner.succeed(\n \"Successfully added crew inputs to app/copilotkit/page.tsx\",\n );\n } catch (error) {\n console.error(\"Error updating crew inputs:\", error);\n throw error;\n }\n}\n\nasync function getCrewInputs(url: string, token: string): Promise<string[]> {\n const response = await fetch(`${url.trim()}/inputs`, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch inputs: ${response.statusText}`);\n }\n\n const data = (await response.json()) as { inputs: string[] };\n return data.inputs;\n}\n"],"mappings":"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","names":["fs","path","spawn","chalk","fs","ora","chalk","path","fs","ora","chalk","fs","ora","path"]}
|
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
// src/lib/init/scaffold/langgraph-assistants.ts
|
|
2
2
|
async function getLangGraphAgents(url, langSmithApiKey) {
|
|
3
3
|
try {
|
|
4
|
-
const response = await fetch(
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
4
|
+
const response = await fetch(
|
|
5
|
+
`${url.trim().replace(/\/$/, "")}/assistants/search`,
|
|
6
|
+
{
|
|
7
|
+
method: "POST",
|
|
8
|
+
headers: {
|
|
9
|
+
"Content-Type": "application/json",
|
|
10
|
+
"X-Api-Key": langSmithApiKey
|
|
11
|
+
},
|
|
12
|
+
body: JSON.stringify({
|
|
13
|
+
limit: 10,
|
|
14
|
+
offset: 0
|
|
15
|
+
})
|
|
16
|
+
}
|
|
17
|
+
);
|
|
15
18
|
return await response.json();
|
|
16
19
|
} catch (error) {
|
|
17
20
|
throw new Error(`Failed to get LangGraph agents: ${error}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/init/scaffold/langgraph-assistants.ts"],"sourcesContent":["export type LangGraphAgent = {\n assistant_id: string
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/init/scaffold/langgraph-assistants.ts"],"sourcesContent":["export type LangGraphAgent = {\n assistant_id: string;\n graph_id: string;\n config: {\n tags: string[];\n recursion_limit: number;\n configurable: Record<string, any>;\n };\n created_at: string;\n updated_at: string;\n metadata: Record<string, any>;\n version: number;\n name: string;\n description: string;\n};\n\nexport async function getLangGraphAgents(url: string, langSmithApiKey: string) {\n try {\n const response = await fetch(\n `${url.trim().replace(/\\/$/, \"\")}/assistants/search`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Api-Key\": langSmithApiKey,\n },\n body: JSON.stringify({\n limit: 10,\n offset: 0,\n }),\n },\n );\n\n return (await response.json()) as LangGraphAgent[];\n } catch (error) {\n throw new Error(`Failed to get LangGraph agents: ${error}`);\n }\n}\n"],"mappings":";AAgBA,eAAsB,mBAAmB,KAAa,iBAAyB;AAC7E,MAAI;AACF,UAAM,WAAW,MAAM;AAAA,MACrB,GAAG,IAAI,KAAK,EAAE,QAAQ,OAAO,EAAE,CAAC;AAAA,MAChC;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,aAAa;AAAA,QACf;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,OAAO;AAAA,UACP,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAQ,MAAM,SAAS,KAAK;AAAA,EAC9B,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,mCAAmC,KAAK,EAAE;AAAA,EAC5D;AACF;","names":[]}
|
|
@@ -25,7 +25,9 @@ async function scaffoldPackages(userAnswers) {
|
|
|
25
25
|
// This ensures stdin/stdout/stderr are all passed through
|
|
26
26
|
});
|
|
27
27
|
if (result.status !== 0) {
|
|
28
|
-
throw new Error(
|
|
28
|
+
throw new Error(
|
|
29
|
+
`Package installation process exited with code ${result.status}`
|
|
30
|
+
);
|
|
29
31
|
}
|
|
30
32
|
spinner.start();
|
|
31
33
|
spinner.succeed(chalk.green("CopilotKit packages installed successfully"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/init/scaffold/packages.ts"],"sourcesContent":["/*\n Currently unusued but will be used in the future once we have more time to think\n about what to use outside of shadcn/ui.\n*/\n\nimport spawn from
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/init/scaffold/packages.ts"],"sourcesContent":["/*\n Currently unusued but will be used in the future once we have more time to think\n about what to use outside of shadcn/ui.\n*/\n\nimport spawn from \"cross-spawn\";\nimport { Config } from \"../types/index.js\";\nimport chalk from \"chalk\";\nimport fs from \"fs\";\nimport ora from \"ora\";\n\ntype PackageManager = \"npm\" | \"yarn\" | \"pnpm\" | \"bun\";\n\nexport async function scaffoldPackages(userAnswers: Config) {\n const spinner = ora({\n text: chalk.cyan(\"Preparing to install packages...\"),\n color: \"cyan\",\n }).start();\n\n try {\n const packages = [\n `@copilotkit/react-ui@${userAnswers.copilotKitVersion}`,\n `@copilotkit/react-core@${userAnswers.copilotKitVersion}`,\n `@copilotkit/runtime@${userAnswers.copilotKitVersion}`,\n ];\n\n // Small pause before starting\n await new Promise((resolve) => setTimeout(resolve, 50));\n\n const packageManager = detectPackageManager();\n const installCommand = detectInstallCommand(packageManager);\n\n spinner.text = chalk.cyan(`Using ${packageManager} to install packages...`);\n\n // Pause the spinner for the package installation\n spinner.stop();\n\n console.log(chalk.cyan(\"\\n⚙️ Installing packages...\\n\"));\n\n const result = spawn.sync(packageManager, [installCommand, ...packages], {\n stdio: \"inherit\", // This ensures stdin/stdout/stderr are all passed through\n });\n\n if (result.status !== 0) {\n throw new Error(\n `Package installation process exited with code ${result.status}`,\n );\n }\n\n // Resume the spinner for success message\n spinner.start();\n spinner.succeed(chalk.green(\"CopilotKit packages installed successfully\"));\n } catch (error) {\n // Use spinner for consistent error reporting\n if (!spinner.isSpinning) {\n spinner.start();\n }\n spinner.fail(chalk.red(\"Failed to install CopilotKit packages\"));\n throw error;\n }\n}\n\nfunction detectPackageManager(): PackageManager {\n // Check for lock files in the current directory\n const files = fs.readdirSync(process.cwd());\n\n if (files.includes(\"bun.lockb\")) return \"bun\";\n if (files.includes(\"pnpm-lock.yaml\")) return \"pnpm\";\n if (files.includes(\"yarn.lock\")) return \"yarn\";\n if (files.includes(\"package-lock.json\")) return \"npm\";\n\n // Default to npm if no lock file found\n return \"npm\";\n}\n\nfunction detectInstallCommand(packageManager: PackageManager): string {\n switch (packageManager) {\n case \"yarn\":\n case \"pnpm\":\n return \"add\";\n default:\n return \"install\";\n }\n}\n"],"mappings":";AAKA,OAAO,WAAW;AAElB,OAAO,WAAW;AAClB,OAAO,QAAQ;AACf,OAAO,SAAS;AAIhB,eAAsB,iBAAiB,aAAqB;AAC1D,QAAM,UAAU,IAAI;AAAA,IAClB,MAAM,MAAM,KAAK,kCAAkC;AAAA,IACnD,OAAO;AAAA,EACT,CAAC,EAAE,MAAM;AAET,MAAI;AACF,UAAM,WAAW;AAAA,MACf,wBAAwB,YAAY,iBAAiB;AAAA,MACrD,0BAA0B,YAAY,iBAAiB;AAAA,MACvD,uBAAuB,YAAY,iBAAiB;AAAA,IACtD;AAGA,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAEtD,UAAM,iBAAiB,qBAAqB;AAC5C,UAAM,iBAAiB,qBAAqB,cAAc;AAE1D,YAAQ,OAAO,MAAM,KAAK,SAAS,cAAc,yBAAyB;AAG1E,YAAQ,KAAK;AAEb,YAAQ,IAAI,MAAM,KAAK,0CAAgC,CAAC;AAExD,UAAM,SAAS,MAAM,KAAK,gBAAgB,CAAC,gBAAgB,GAAG,QAAQ,GAAG;AAAA,MACvE,OAAO;AAAA;AAAA,IACT,CAAC;AAED,QAAI,OAAO,WAAW,GAAG;AACvB,YAAM,IAAI;AAAA,QACR,iDAAiD,OAAO,MAAM;AAAA,MAChE;AAAA,IACF;AAGA,YAAQ,MAAM;AACd,YAAQ,QAAQ,MAAM,MAAM,4CAA4C,CAAC;AAAA,EAC3E,SAAS,OAAO;AAEd,QAAI,CAAC,QAAQ,YAAY;AACvB,cAAQ,MAAM;AAAA,IAChB;AACA,YAAQ,KAAK,MAAM,IAAI,uCAAuC,CAAC;AAC/D,UAAM;AAAA,EACR;AACF;AAEA,SAAS,uBAAuC;AAE9C,QAAM,QAAQ,GAAG,YAAY,QAAQ,IAAI,CAAC;AAE1C,MAAI,MAAM,SAAS,WAAW,EAAG,QAAO;AACxC,MAAI,MAAM,SAAS,gBAAgB,EAAG,QAAO;AAC7C,MAAI,MAAM,SAAS,WAAW,EAAG,QAAO;AACxC,MAAI,MAAM,SAAS,mBAAmB,EAAG,QAAO;AAGhD,SAAO;AACT;AAEA,SAAS,qBAAqB,gBAAwC;AACpE,UAAQ,gBAAgB;AAAA,IACtB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;","names":[]}
|