copilotkit 4.9.1 → 4.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/cli-build-info.json +8 -8
  2. package/index.js +151 -21
  3. package/onboarding/index.json +11 -0
  4. package/onboarding/prompts/authenticate/start.md +83 -32
  5. package/onboarding/prompts/credentials/finalize-plan.md +51 -33
  6. package/onboarding/prompts/credentials/plan.md +37 -25
  7. package/onboarding/prompts/fallback/best-effort.md +22 -11
  8. package/onboarding/prompts/framework/ag2.md +4 -15
  9. package/onboarding/prompts/framework/agno.md +4 -15
  10. package/onboarding/prompts/framework/built-in.md +4 -14
  11. package/onboarding/prompts/framework/claude-sdk-python.md +4 -14
  12. package/onboarding/prompts/framework/claude-sdk-typescript.md +4 -14
  13. package/onboarding/prompts/framework/crewai-flows.md +11 -23
  14. package/onboarding/prompts/framework/deep-agents.md +4 -15
  15. package/onboarding/prompts/framework/google-adk.md +3 -15
  16. package/onboarding/prompts/framework/langgraph-fastapi.md +3 -15
  17. package/onboarding/prompts/framework/langgraph-python.md +3 -15
  18. package/onboarding/prompts/framework/langgraph-typescript.md +3 -15
  19. package/onboarding/prompts/framework/llamaindex.md +4 -15
  20. package/onboarding/prompts/framework/mastra.md +3 -15
  21. package/onboarding/prompts/framework/ms-agent-dotnet.md +18 -49
  22. package/onboarding/prompts/framework/ms-agent-harness-dotnet.md +20 -30
  23. package/onboarding/prompts/framework/ms-agent-python.md +3 -15
  24. package/onboarding/prompts/framework/pydantic-ai.md +4 -14
  25. package/onboarding/prompts/framework/strands-python.md +4 -14
  26. package/onboarding/prompts/framework/strands-typescript.md +4 -14
  27. package/onboarding/prompts/frontend/angular.md +13 -18
  28. package/onboarding/prompts/frontend/nextjs.md +20 -15
  29. package/onboarding/prompts/frontend/plan.md +9 -14
  30. package/onboarding/prompts/frontend/react-native.md +7 -15
  31. package/onboarding/prompts/frontend/react-spa.md +5 -15
  32. package/onboarding/prompts/frontend/vue.md +8 -15
  33. package/onboarding/prompts/implementation/build-and-validate.md +22 -13
  34. package/onboarding/prompts/proof/complete.md +32 -5
  35. package/onboarding/prompts/proof/oss-baseline.md +3 -3
  36. package/onboarding/prompts/proof/round-trip.md +197 -72
  37. package/onboarding/prompts/starter/clone.md +67 -0
  38. package/onboarding/prompts/subagent/create-plan.md +26 -15
  39. package/onboarding/prompts/subagent/implement-and-validate.md +19 -10
  40. package/onboarding/prompts/subagent/inspect-repository.md +19 -7
  41. package/onboarding/prompts/subagent/prove-oss-baseline.md +1 -1
  42. package/onboarding/prompts/subagent/prove-round-trip.md +176 -68
  43. package/onboarding/prompts/unsupported/no-validated-path.md +2 -2
  44. package/package.json +1 -1
  45. package/release/release-tool.js +15 -1
@@ -2,20 +2,20 @@
2
2
  "schemaVersion": 1,
3
3
  "package": {
4
4
  "name": "copilotkit",
5
- "version": "4.9.1"
5
+ "version": "4.9.4"
6
6
  },
7
7
  "intelligence": {
8
- "commit": "0528d9de0d7915386d789deb676d44c4668842b1"
8
+ "commit": "db031f9bc6f6c3918774aa8e375b6938ad66bb5e"
9
9
  },
10
10
  "copilotKit": {
11
- "submittedInput": "2ad03320fe1f0834b138113fffe791781e5b226e",
12
- "commit": "2ad03320fe1f0834b138113fffe791781e5b226e"
11
+ "submittedInput": "f6f2dc4bb62b50d2f09384619f5b9e8fe7edde02",
12
+ "commit": "f6f2dc4bb62b50d2f09384619f5b9e8fe7edde02"
13
13
  },
14
14
  "channel": "production",
15
- "triggeringActor": "MikeRyanDev",
15
+ "triggeringActor": "copilotkit-qa-bot[bot]",
16
16
  "workflow": {
17
- "runId": "32915219082",
18
- "runUrl": "https://github.com/CopilotKit/Intelligence/actions/runs/32915219082"
17
+ "runId": "33113403059",
18
+ "runUrl": "https://github.com/CopilotKit/Intelligence/actions/runs/33113403059"
19
19
  },
20
20
  "validationResult": "passed",
21
21
  "ag2": {
@@ -24,5 +24,5 @@
24
24
  "revision": "main",
25
25
  "pinned": false
26
26
  },
27
- "builtAt": "2026-08-26T00:29:57Z"
27
+ "builtAt": "2026-08-27T20:28:56Z"
28
28
  }
package/index.js CHANGED
@@ -96,14 +96,14 @@ function getTelemetryEndpointUrl() {
96
96
  }
97
97
  function getBuildInfo() {
98
98
  return {
99
- version: true ? "4.9.1" : "dev",
100
- buildNumber: true ? "32915219082" : "dev",
101
- commitSha: true ? "0528d9de0d7915386d789deb676d44c4668842b1" : "dev",
99
+ version: true ? "4.9.4" : "dev",
100
+ buildNumber: true ? "33113403059" : "dev",
101
+ commitSha: true ? "db031f9bc6f6c3918774aa8e375b6938ad66bb5e" : "dev",
102
102
  copilotKitCommit: getTemplateRef()
103
103
  };
104
104
  }
105
105
  function getTemplateRef() {
106
- return true ? "2ad03320fe1f0834b138113fffe791781e5b226e" : "main";
106
+ return true ? "f6f2dc4bb62b50d2f09384619f5b9e8fe7edde02" : "main";
107
107
  }
108
108
  function getC15tBackendUrl() {
109
109
  return true ? "https://calm-hazelnut-joy-copilotkit.inth.app" : "";
@@ -192,6 +192,9 @@ var init_starter_source_catalog = __esm({
192
192
  STARTER_SOURCE_CATALOG = {
193
193
  "langgraph-py": langGraphPython,
194
194
  "langgraph-js": copilotKitStarter("examples/integrations/langgraph-js"),
195
+ "langgraph-fastapi": copilotKitStarter(
196
+ "examples/integrations/langgraph-fastapi"
197
+ ),
195
198
  "claude-sdk-typescript": copilotKitStarter(
196
199
  "examples/integrations/claude-sdk-typescript"
197
200
  ),
@@ -412,6 +415,7 @@ function formatInvalidFrameworkError(value) {
412
415
  function standardTemplate(framework, template, successEmoji) {
413
416
  const pythonUvTemplates = /* @__PURE__ */ new Set([
414
417
  "langgraph-py",
418
+ "langgraph-fastapi",
415
419
  "claude-sdk-python",
416
420
  "flows",
417
421
  "llamaindex",
@@ -493,6 +497,7 @@ var init_types = __esm({
493
497
  FRAMEWORK_EMOJI = {
494
498
  "langgraph-py": "\u{1F99C}",
495
499
  "langgraph-js": "\u{1F99C}",
500
+ "langgraph-fastapi": "\u{1F99C}",
496
501
  "claude-sdk-typescript": "\u{1F506}",
497
502
  "claude-sdk-python": "\u{1F506}",
498
503
  flows: "\u{1F465}",
@@ -523,6 +528,10 @@ var init_types = __esm({
523
528
  label: `${FRAMEWORK_EMOJI["langgraph-js"]} LangGraph (JavaScript)`,
524
529
  value: "langgraph-js"
525
530
  },
531
+ {
532
+ label: `${FRAMEWORK_EMOJI["langgraph-fastapi"]} LangGraph (Python, FastAPI)`,
533
+ value: "langgraph-fastapi"
534
+ },
526
535
  {
527
536
  label: `${FRAMEWORK_EMOJI["claude-sdk-typescript"]} Claude Agent SDK (TypeScript)`,
528
537
  value: "claude-sdk-typescript"
@@ -636,6 +645,11 @@ var init_types = __esm({
636
645
  TEMPLATE_REPOS["langgraph-js"],
637
646
  `\u{1FA81}\u{1F91D}${FRAMEWORK_EMOJI["langgraph-js"]}`
638
647
  ),
648
+ "langgraph-fastapi": standardTemplate(
649
+ "langgraph-fastapi",
650
+ TEMPLATE_REPOS["langgraph-fastapi"],
651
+ `\u{1FA81}\u{1F91D}${FRAMEWORK_EMOJI["langgraph-fastapi"]}`
652
+ ),
639
653
  "claude-sdk-typescript": {
640
654
  ...standardTemplate(
641
655
  "claude-sdk-typescript",
@@ -810,6 +824,7 @@ var init_types = __esm({
810
824
  THREADS_FRAMEWORKS = /* @__PURE__ */ new Set([
811
825
  "langgraph-py",
812
826
  "langgraph-js",
827
+ "langgraph-fastapi",
813
828
  "claude-sdk-typescript",
814
829
  "claude-sdk-python",
815
830
  "mastra",
@@ -833,6 +848,7 @@ var init_types = __esm({
833
848
  FRAMEWORK_LANGUAGE = {
834
849
  "langgraph-py": "python",
835
850
  "langgraph-js": "typescript",
851
+ "langgraph-fastapi": "python",
836
852
  "claude-sdk-typescript": "typescript",
837
853
  "claude-sdk-python": "python",
838
854
  flows: "python",
@@ -93356,7 +93372,7 @@ var init_cli_tips = __esm({
93356
93372
  },
93357
93373
  {
93358
93374
  id: "server-debug-for-missing-events",
93359
- text: "Enable server `debug: true` when events, state, or tool calls disappear, then use the Inspector or `/cpk-debug-events` for live AG-UI details.",
93375
+ text: "Enable server `debug: true` when events, state, or tool calls disappear, then read live AG-UI details from the Inspector in a browser, or from the runtime's `/cpk-debug-events` route on any frontend.",
93360
93376
  relevancy: 82,
93361
93377
  insight: 90
93362
93378
  },
@@ -380822,18 +380838,15 @@ function isOnboardingGraphIndex(value) {
380822
380838
  if (typeof value !== "object" || value === null)
380823
380839
  return false;
380824
380840
  const candidate = value;
380825
- return typeof candidate.root === "string" && Array.isArray(candidate.prompts) && candidate.prompts.every(
380826
- (prompt) => typeof prompt === "object" && prompt !== null && Array.isArray(prompt.edges) && prompt.edges.every((edge) => typeof edge === "string") && typeof prompt.milestone === "string" && typeof prompt.name === "string"
380841
+ return (
380842
+ // Checked first: a bundle that cannot name the graph it serves is corrupt,
380843
+ // and nothing else about it is worth inspecting.
380844
+ typeof candidate.graphTree === "string" && GRAPH_TREE_PATTERN.test(candidate.graphTree) && typeof candidate.root === "string" && Array.isArray(candidate.prompts) && candidate.prompts.every(
380845
+ (prompt) => typeof prompt === "object" && prompt !== null && Array.isArray(prompt.edges) && prompt.edges.every((edge) => typeof edge === "string") && typeof prompt.milestone === "string" && typeof prompt.name === "string"
380846
+ )
380827
380847
  );
380828
380848
  }
380829
- async function loadOnboardingPrompt(name, graphDirectory = join23(dirname9(fileURLToPath2(import.meta.url)), "onboarding")) {
380830
- if (!PROMPT_NAME_PATTERN.test(name)) {
380831
- throw new OnboardingPromptError(
380832
- "ONBOARDING_PROMPT_NOT_FOUND",
380833
- `Onboarding prompt "${name}" was not found. Copy an exact prompt name from the prior Markdown.`
380834
- );
380835
- }
380836
- let index2;
380849
+ async function readGraphIndex(graphDirectory) {
380837
380850
  try {
380838
380851
  const parsed = JSON.parse(
380839
380852
  await readFile(join23(graphDirectory, "index.json"), "utf8")
@@ -380841,7 +380854,7 @@ async function loadOnboardingPrompt(name, graphDirectory = join23(dirname9(fileU
380841
380854
  if (!isOnboardingGraphIndex(parsed)) {
380842
380855
  throw new Error("Bundled onboarding graph index has an invalid shape");
380843
380856
  }
380844
- index2 = parsed;
380857
+ return parsed;
380845
380858
  } catch (error98) {
380846
380859
  throw new OnboardingPromptError(
380847
380860
  "ONBOARDING_PROMPT_UNREADABLE",
@@ -380849,6 +380862,18 @@ async function loadOnboardingPrompt(name, graphDirectory = join23(dirname9(fileU
380849
380862
  { cause: error98 }
380850
380863
  );
380851
380864
  }
380865
+ }
380866
+ async function loadOnboardingGraphTree(graphDirectory = join23(dirname9(fileURLToPath2(import.meta.url)), "onboarding")) {
380867
+ return (await readGraphIndex(graphDirectory)).graphTree;
380868
+ }
380869
+ async function loadOnboardingPrompt(name, graphDirectory = join23(dirname9(fileURLToPath2(import.meta.url)), "onboarding")) {
380870
+ if (!PROMPT_NAME_PATTERN.test(name)) {
380871
+ throw new OnboardingPromptError(
380872
+ "ONBOARDING_PROMPT_NOT_FOUND",
380873
+ `Onboarding prompt "${name}" was not found. Copy an exact prompt name from the prior Markdown.`
380874
+ );
380875
+ }
380876
+ const index2 = await readGraphIndex(graphDirectory);
380852
380877
  const indexedPrompt = index2.prompts.find((prompt) => prompt.name === name);
380853
380878
  if (indexedPrompt === void 0) {
380854
380879
  throw new OnboardingPromptError(
@@ -380874,11 +380899,12 @@ async function loadOnboardingPrompt(name, graphDirectory = join23(dirname9(fileU
380874
380899
  );
380875
380900
  }
380876
380901
  }
380877
- var PROMPT_NAME_PATTERN, OnboardingPromptError;
380902
+ var PROMPT_NAME_PATTERN, GRAPH_TREE_PATTERN, OnboardingPromptError;
380878
380903
  var init_onboarding_graph = __esm({
380879
380904
  "apps/cli/src/services/onboarding-graph.ts"() {
380880
380905
  "use strict";
380881
380906
  PROMPT_NAME_PATTERN = /^[a-z0-9][a-z0-9._-]*(?:\/[a-z0-9][a-z0-9._-]*)*$/;
380907
+ GRAPH_TREE_PATTERN = /^[0-9a-f]{40}$/u;
380882
380908
  OnboardingPromptError = class extends Error {
380883
380909
  code;
380884
380910
  constructor(code, message, options) {
@@ -381255,6 +381281,7 @@ async function runOnboard(argv, dependencies) {
381255
381281
  cliVersion: getBuildInfo().version,
381256
381282
  randomRunId: () => randomBytes2(9).toString("base64url"),
381257
381283
  loadPrompt: loadOnboardingPrompt,
381284
+ loadGraphTree: loadOnboardingGraphTree,
381258
381285
  recordEvent: recordTelemetryEvent,
381259
381286
  submitFeedbackEvent: submitTelemetryEvent
381260
381287
  };
@@ -381278,6 +381305,8 @@ async function runOnboard(argv, dependencies) {
381278
381305
  parsed.values.run
381279
381306
  );
381280
381307
  recordStarted(deps, binding2.runId, parsed.values["coding-agent"]);
381308
+ printRunId(deps, binding2.runId);
381309
+ await printGraphTree(deps);
381281
381310
  await printPrompt(deps, binding2.runId, "authenticate/start");
381282
381311
  return;
381283
381312
  }
@@ -381297,7 +381326,10 @@ async function runOnboard(argv, dependencies) {
381297
381326
  return;
381298
381327
  }
381299
381328
  if (subcommand === "complete") {
381300
- const check4 = parseSurfaceCheck(argv.slice(1));
381329
+ const blocked2 = parseBlocker(argv.slice(1));
381330
+ if (blocked2 === void 0)
381331
+ throw new Error(BLOCKER_USAGE);
381332
+ const check4 = parseSurfaceCheck(blocked2.rest);
381301
381333
  if (check4 === void 0)
381302
381334
  throw new Error(SURFACE_CHECK_USAGE);
381303
381335
  recordBestEffort(deps, {
@@ -381306,11 +381338,12 @@ async function runOnboard(argv, dependencies) {
381306
381338
  command: "onboard",
381307
381339
  onboarding_run_id: binding.runId,
381308
381340
  cli_version: deps.cliVersion,
381309
- ...check4.kind === "visual" ? { visual_check: check4.outcome } : { device_check: check4.outcome }
381341
+ ...check4.kind === "visual" ? { visual_check: check4.outcome } : { device_check: check4.outcome },
381342
+ ...blocked2.blocker === void 0 ? {} : { blocked_by: blocked2.blocker }
381310
381343
  }
381311
381344
  });
381312
381345
  deps.stdout.write(
381313
- check4.outcome === "performed" ? "CopilotKit onboarding marked complete.\n" : blockedWithoutSurfaceProof(check4)
381346
+ completionReport({ blocker: blocked2.blocker, check: check4 })
381314
381347
  );
381315
381348
  return;
381316
381349
  }
@@ -381369,6 +381402,17 @@ async function runOnboard(argv, dependencies) {
381369
381402
  "Usage: copilotkit onboard <start|read|classify|complete|feedback|friction>"
381370
381403
  );
381371
381404
  }
381405
+ function parseBlocker(rest) {
381406
+ const flagIndex = rest.indexOf("--blocked-by");
381407
+ if (flagIndex === -1)
381408
+ return { rest };
381409
+ if (flagIndex !== rest.length - 2)
381410
+ return void 0;
381411
+ const cause = BLOCKER_CAUSES.find((known) => known === rest[flagIndex + 1]);
381412
+ if (cause === void 0)
381413
+ return void 0;
381414
+ return { blocker: cause, rest: rest.slice(0, flagIndex) };
381415
+ }
381372
381416
  function parseSurfaceCheck(rest) {
381373
381417
  if (rest.length !== 2)
381374
381418
  return void 0;
@@ -381429,6 +381473,37 @@ function blockedWithoutSurfaceProof(check4) {
381429
381473
  ""
381430
381474
  ].join("\n");
381431
381475
  }
381476
+ function blockedAfterProof(blocker) {
381477
+ const report = BLOCKER_REPORTS[blocker];
381478
+ return [
381479
+ "",
381480
+ "! Onboarding is NOT complete.",
381481
+ " The round trip was proved, and this run was then blocked by something else:",
381482
+ ` ${report.cause}`,
381483
+ " Still unverified:",
381484
+ ...report.uncovered.map((line) => ` - ${line}`),
381485
+ "",
381486
+ " This is a supported path that this run could not finish.",
381487
+ " It is NOT an unsupported path: do not read unsupported/no-validated-path,",
381488
+ " and do not tell the developer that their framework or frontend is",
381489
+ " unsupported. The journey proved; one thing after it did not.",
381490
+ "",
381491
+ " Report this run as blocked, and name the unverified lines above as the",
381492
+ " evidence it is missing. Hand over the working application anyway: the URL,",
381493
+ " the command that starts it again, and the process IDs.",
381494
+ ` To close it, ${report.close}.`,
381495
+ ""
381496
+ ].join("\n");
381497
+ }
381498
+ function completionReport(input) {
381499
+ if (input.check.outcome !== "performed") {
381500
+ const surface = blockedWithoutSurfaceProof(input.check);
381501
+ if (input.blocker === void 0)
381502
+ return surface;
381503
+ return `${surface}${blockedAfterProof(input.blocker)}`;
381504
+ }
381505
+ return input.blocker === void 0 ? "CopilotKit onboarding marked complete.\n" : blockedAfterProof(input.blocker);
381506
+ }
381432
381507
  async function reportFeedback(dependencies, runId) {
381433
381508
  const input = await readFeedbackInput(dependencies.stdin);
381434
381509
  if (!input.ok)
@@ -381539,6 +381614,16 @@ report: ${report.text}
381539
381614
  `
381540
381615
  );
381541
381616
  }
381617
+ function printRunId(dependencies, runId) {
381618
+ dependencies.stdout.write(`onboarding_run_id: ${runId}
381619
+ `);
381620
+ }
381621
+ async function printGraphTree(dependencies) {
381622
+ dependencies.stdout.write(
381623
+ `onboarding_graph_tree: ${await dependencies.loadGraphTree()}
381624
+ `
381625
+ );
381626
+ }
381542
381627
  function recordStarted(dependencies, runId, codingAgent) {
381543
381628
  recordBestEffort(dependencies, {
381544
381629
  event: "cli.onboarding.started",
@@ -381579,7 +381664,7 @@ function recordBestEffort(dependencies, event) {
381579
381664
  } catch {
381580
381665
  }
381581
381666
  }
381582
- var VISUAL_CHECK_OUTCOMES, DEVICE_CHECK_OUTCOMES, SURFACE_CHECK_USAGE;
381667
+ var VISUAL_CHECK_OUTCOMES, DEVICE_CHECK_OUTCOMES, BLOCKER_CAUSES, BLOCKER_USAGE, SURFACE_CHECK_USAGE, BLOCKER_REPORTS;
381583
381668
  var init_onboard = __esm({
381584
381669
  async "apps/cli/src/commands/onboard.ts"() {
381585
381670
  "use strict";
@@ -381601,7 +381686,52 @@ var init_onboard = __esm({
381601
381686
  "skipped-no-device",
381602
381687
  "failed"
381603
381688
  ];
381689
+ BLOCKER_CAUSES = [
381690
+ "hosted-dashboard",
381691
+ "inspector",
381692
+ "plan-excluded-capability",
381693
+ "other"
381694
+ ];
381695
+ BLOCKER_USAGE = `Usage: copilotkit onboard complete <surface-check> --blocked-by <${BLOCKER_CAUSES.join("|")}>
381696
+ Pass it alongside --visual-check or --device-check, never instead of one: which
381697
+ surface this run proved and what blocked it afterwards are separate facts.
381698
+ Use \`other\` rather than leaving the flag off. A run with no way to say it was
381699
+ blocked reads the unsupported terminal instead, and reports a path that works
381700
+ as one this release does not carry.`;
381604
381701
  SURFACE_CHECK_USAGE = "Usage: copilotkit onboard complete --visual-check <performed|skipped-no-browser-tool|failed>\n or: copilotkit onboard complete --device-check <performed|skipped-no-device|failed>\nPass exactly one. A web journey is proven in a browser and a mobile one on a device;\nwhich flag you pass is how this run states which surface it proved.";
381702
+ BLOCKER_REPORTS = {
381703
+ "hosted-dashboard": {
381704
+ cause: "the managed Intelligence dashboard did not load, or refused a sign-in.",
381705
+ close: "sign in at https://intelligence.copilotkit.ai, confirm this project is\n listed, then run this command again without `--blocked-by`",
381706
+ uncovered: [
381707
+ "managing this installation from the dashboard, which is where its keys and projects live",
381708
+ "the thread view, which is how a managed run is read back after it ends"
381709
+ ]
381710
+ },
381711
+ inspector: {
381712
+ cause: "the debugging surface for this frontend did not open.",
381713
+ close: "open the debugging surface named in the handoff, confirm it lists this\n run, then run this command again without `--blocked-by`",
381714
+ uncovered: [
381715
+ "the AG-UI event stream this frontend actually received",
381716
+ "a wiring fault that shows up only as an event that never arrives"
381717
+ ]
381718
+ },
381719
+ "plan-excluded-capability": {
381720
+ cause: "the proof asked for a capability the approved plan had already excluded\n for this framework.",
381721
+ close: "settle the exclusion against the framework's own documentation before the\n next run, and give the developer the exclusion as a named limitation",
381722
+ uncovered: [
381723
+ "that capability on this framework, which the plan excluded rather than disproved",
381724
+ "whether the exclusion in the plan is correct, which nothing in this run tested"
381725
+ ]
381726
+ },
381727
+ other: {
381728
+ cause: "a blocker outside the set this command can name.",
381729
+ close: "name the blocker in the summary in the developer's own terms, and say what\n it leaves unverified",
381730
+ uncovered: [
381731
+ "whatever the blocker covers, which this command cannot name for you"
381732
+ ]
381733
+ }
381734
+ };
381605
381735
  }
381606
381736
  });
381607
381737
 
@@ -1,4 +1,5 @@
1
1
  {
2
+ "graphTree": "1c6963da1f044e99a35706e1f6ba533c2ad835c2",
2
3
  "root": "authenticate/start",
3
4
  "prompts": [
4
5
  {
@@ -203,6 +204,7 @@
203
204
  },
204
205
  {
205
206
  "edges": [
207
+ "starter/clone",
206
208
  "credentials/finalize-plan",
207
209
  "unsupported/no-validated-path"
208
210
  ],
@@ -211,6 +213,7 @@
211
213
  },
212
214
  {
213
215
  "edges": [
216
+ "starter/clone",
214
217
  "credentials/finalize-plan",
215
218
  "unsupported/no-validated-path"
216
219
  ],
@@ -282,6 +285,14 @@
282
285
  "milestone": "proof",
283
286
  "name": "proof/round-trip"
284
287
  },
288
+ {
289
+ "edges": [
290
+ "proof/round-trip",
291
+ "unsupported/no-validated-path"
292
+ ],
293
+ "milestone": "starter",
294
+ "name": "starter/clone"
295
+ },
285
296
  {
286
297
  "edges": [],
287
298
  "milestone": "subagent",
@@ -14,16 +14,21 @@ question from the documentation this graph gives you. Another checkout on this m
14
14
  not a source. The developer running this has none, so an answer taken from one is an
15
15
  answer they cannot get, and it hides the documentation gap that blocks them.
16
16
 
17
- Before you run a command or spawn a subagent, send this exact message:
17
+ Send this exact message once, as your first message in this onboarding run, before
18
+ anything else:
18
19
 
19
20
  Welcome to CopilotKit. I will check sign-in, inspect your project, recommend a setup, and
20
21
  show you a plan before I change files. After you approve the plan, I will build the
21
22
  integration, prove the full round trip, and leave the app running with its URLs.
22
23
 
24
+ That message belongs to the run, not to this prompt. If you already sent it in this run, do
25
+ not send it again, including on a second read of this prompt. It has no value after the
26
+ first send, and a developer who reads it repeatedly learns to skim the region it sits in.
27
+
23
28
  Do not ask for separate feedback consent. The feedback commands enforce the developer's
24
29
  CLI telemetry setting when a later step tries to send a report.
25
30
 
26
- Run `npx --yes copilotkit@4.9.1 login --json` before any project work. This command
31
+ Run `npx --yes copilotkit@4.9.4 login --json` before any project work. This command
27
32
  checks the current session. It starts sign-in only as needed. Treat this as a long-lived
28
33
  streaming process. Do not wait for the command to exit before you read its standard output.
29
34
 
@@ -41,29 +46,63 @@ Do not use `whoami` for this check. It has no JSON output and some failures exit
41
46
  zero. Do not put account tokens or credentials in the conversation.
42
47
 
43
48
  Before you ask the developer any setup question, finish every read-only investigation and
44
- preflight check in this section. Record whether your coding-agent environment has browser
45
- or device control. Use the control that matches the selected surface later. Do not install
46
- a browser or device tool during this preflight. Do not ask the developer about this tool
47
- limit.
49
+ preflight check in this section.
50
+
51
+ Prove whether your coding-agent environment has browser or device control. Do not assume it
52
+ either way, and do not report what you expect to be true: a run that guesses here records a
53
+ capability the rest of the graph then trusts. Use a browser or device tool already
54
+ configured for the coding agent you are running as, the same way a later step uses the
55
+ CopilotKit documentation server. With a browser tool, open one inert page such as
56
+ `about:blank` and read its title. With a device tool and no browser, list the booted devices
57
+ in one command: `adb devices -l`. Record the outcome of that attempt: `available` when the
58
+ tool answered, `unavailable` when there was none to call or the page did not open. Use
59
+ the control that matches the selected surface later.
60
+
61
+ Where the browser probe answered, register nothing. The harness came equipped and the run
62
+ owes it no setup.
63
+
64
+ Where no browser tool answered, register one for the coding agent you are running as, then
65
+ run the same probe again and record what the second attempt did. Register this server:
66
+
67
+ ```text
68
+ npx --yes @playwright/mcp@latest --browser chrome --isolated --output-dir <project>/.copilotkit/proof/browser
69
+ ```
70
+
71
+ Replace `<project>` with the absolute path of the target project directory. The server is
72
+ registered against the coding agent rather than against a directory, so a relative path here
73
+ resolves wherever that server happens to start.
74
+
75
+ `--browser chrome` drives the Google Chrome the developer already has, so this downloads no
76
+ browser. `--isolated` keeps the profile in memory, so it never touches their own Chrome
77
+ profile. `--output-dir` is what keeps the snapshots and screenshots out of the developer's
78
+ repository root: without it this server writes them to `.playwright-mcp/` beside their code,
79
+ which a project that never asked for a browser has no reason to carry, and which the graph's
80
+ own evidence rule already has a place for. Register it the way your own harness registers a
81
+ server, which is the mechanism a later step uses for the CopilotKit documentation server.
82
+
83
+ Tell the developer in one line what you registered, that it drives their installed Chrome,
84
+ and that it lives in this coding agent's configuration rather than in their repository. Do
85
+ not ask them to approve it, and do not ask a second question about it.
86
+
87
+ Do not add a browser or device driver to the project. A driver added there is a
88
+ devDependency and a browser download in the diff of a repository that never asked for one,
89
+ which is a different thing from a server registered against the coding agent.
90
+
91
+ Where the second probe still does not answer -- no Chrome to drive, no network, or a
92
+ harness that cannot register a server -- record `unavailable` and carry it. Do not keep
93
+ trying, and do not ask the developer about this tool limit.
94
+
95
+ Registering a server does not boot a device. Where the device probe found none, that is the
96
+ whole finding, and a browser is not a substitute for a device.
48
97
 
49
98
  Spawn one research subagent. Give it the full text of the research brief at the end of this
50
- prompt and tell it to follow that brief and return only its findings. Add these tasks:
51
-
52
- - Find the target app or runtime directory that owns `.env` and CopilotKit setup.
53
- - Check whether `.copilotkit/project.json` has `projectId`, `projectSlug`, and `clerkOrgId`.
54
- - Check whether `.env` has a non-empty `INTELLIGENCE_API_KEY` entry.
55
- - Record the `.env` file modification time without returning it.
56
- - Report whether an agent, frontend, and CopilotKit integration are present.
57
- - Report whether the runtime constructor uses a `runner` option, an `intelligence`
58
- option, or neither can be proved from project files.
99
+ prompt and tell it to follow that brief and return only its findings. Wait for the
100
+ subagent to finish.
59
101
 
60
- Do not print either file or any secret value. Return only paths, presence checks, and missing
61
- field names. Wait for the subagent to finish.
62
-
63
- If the findings show an empty project and do not prove its purpose, ask one guided question
64
- about the user outcome. This asks what the developer wants to build before you select a
65
- framework. Give two or three short examples and offer a minimal starter. Record the answer
66
- and give it to each later subagent.
102
+ If neither the developer nor the repository findings prove what the project is for, ask
103
+ one guided question about the user outcome. This asks what the developer wants to build
104
+ before you select a framework. Give two or three short examples and offer a minimal
105
+ starter. Record the answer and give it to each later subagent.
67
106
 
68
107
  If a repository file exists, each finding must cite it. For an empty project, the subagent
69
108
  must cite its directory check and report absent parts.
@@ -75,13 +114,13 @@ that the repository answers.
75
114
  Do not infer a working OSS path from packages, imports, project files, or keys. If an
76
115
  agent, frontend, and CopilotKit integration are present, prove the live starting state
77
116
  before any project file changes. Run
78
- `npx --yes copilotkit@4.9.1 onboard read proof/oss-baseline`.
117
+ `npx --yes copilotkit@4.9.4 onboard read proof/oss-baseline`.
79
118
 
80
119
  For every other inspected state, run
81
- `npx --yes copilotkit@4.9.1 onboard read credentials/plan`.
120
+ `npx --yes copilotkit@4.9.4 onboard read credentials/plan`.
82
121
 
83
122
  If authentication or inspection stops onboarding, run
84
- `npx --yes copilotkit@4.9.1 onboard read unsupported/no-validated-path`.
123
+ `npx --yes copilotkit@4.9.4 onboard read unsupported/no-validated-path`.
85
124
 
86
125
  ## Research subagent brief
87
126
 
@@ -94,16 +133,27 @@ Everything below the rule is the subagent's prompt. Give it verbatim.
94
133
  Inspect the repository without changing it. Find evidence for:
95
134
 
96
135
  - what the project is for, in the project's own words
97
- - any existing agent framework
98
- - any existing frontend
99
- - current CopilotKit packages and configuration
136
+ - the target app or runtime directory that owns `.env` and the CopilotKit setup
137
+ - whether the target project directory contains any entries
138
+ - any existing agent framework and frontend
139
+ - current CopilotKit integration and configuration, including whether
140
+ `.copilotkit/project.json` has `projectId`, `projectSlug`, and `clerkOrgId`
100
141
  - authentication boundaries
101
- - names of required credential variables, without reading their values
142
+ - names of required credential variables and whether `.env` has a non-empty
143
+ `INTELLIGENCE_API_KEY`
144
+ - retain the `.env` modification time for a later comparison without returning it
102
145
  - package manager and lockfile
103
146
  - required toolchains and their installed versions
104
147
  - declared ports and whether each port is available
148
+ - whether the runtime constructor uses a `runner` option, an `intelligence` option, or
149
+ neither can be proved from project files
105
150
  - CopilotKit package versions and package compatibility risks
106
151
 
152
+ For the CopilotKit versions, report the exact installed version of every `@copilotkit/*`
153
+ dependency, read from the lockfile rather than a manifest range, and state whether any of
154
+ them is below 1.64.0. The conversion decides its upgrade from exactly that, and a caret
155
+ range does not answer it.
156
+
107
157
  A project states what it is for in its `README.md`, in its package description, or in
108
158
  the prompt of an agent it already has. Quote that statement rather than rewriting it. An
109
159
  empty project carries it in the README alone, and that makes the README the whole of the
@@ -115,6 +165,7 @@ what you run next. Keep this preflight read-only. Do not install packages, stop
115
165
  or change a port. Check only the toolchains and ports that repository files require.
116
166
 
117
167
  Return the file paths and a short finding for each item. State each absent or unproved item.
118
- Do not read, print, or return secret values. Do not read a file outside the project
119
- directory. Do not run or return another onboarding command. Stop after returning the
120
- findings to the main coding agent.
168
+ Do not read, print, or return secret values. For `.env` and `.copilotkit/project.json`
169
+ checks, return only paths, presence checks, and missing field names. Do not read a file
170
+ outside the project directory. Do not run or return another onboarding command. Stop after
171
+ returning the findings to the main coding agent.