copilotkit 4.10.1 → 4.11.0

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 (76) hide show
  1. package/README.md +8 -5
  2. package/cli-build-info.json +8 -8
  3. package/index.js +139 -34
  4. package/onboarding/index.json +2 -2
  5. package/onboarding/prompts/authenticate/start.md +27 -13
  6. package/onboarding/prompts/conversion/plan.md +3 -3
  7. package/onboarding/prompts/credentials/finalize-plan.md +30 -21
  8. package/onboarding/prompts/credentials/plan.md +20 -20
  9. package/onboarding/prompts/credentials/settle-credentials.md +9 -9
  10. package/onboarding/prompts/credentials/write-plan.md +7 -7
  11. package/onboarding/prompts/fallback/best-effort.md +9 -8
  12. package/onboarding/prompts/feature/a2ui/implement.md +6 -6
  13. package/onboarding/prompts/feature/a2ui/proof.md +6 -6
  14. package/onboarding/prompts/feature/a2ui/start.md +7 -7
  15. package/onboarding/prompts/feature/channels/implement.md +8 -8
  16. package/onboarding/prompts/feature/channels/proof.md +6 -6
  17. package/onboarding/prompts/feature/channels/start.md +17 -14
  18. package/onboarding/prompts/feature/chat-suggestions/implement.md +6 -6
  19. package/onboarding/prompts/feature/chat-suggestions/proof.md +6 -6
  20. package/onboarding/prompts/feature/chat-suggestions/start.md +7 -7
  21. package/onboarding/prompts/feature/complete.md +1 -1
  22. package/onboarding/prompts/feature/learning/implement.md +12 -12
  23. package/onboarding/prompts/feature/learning/proof.md +7 -7
  24. package/onboarding/prompts/feature/learning/start.md +6 -6
  25. package/onboarding/prompts/feature/open-generative-ui/implement.md +6 -6
  26. package/onboarding/prompts/feature/open-generative-ui/proof.md +6 -6
  27. package/onboarding/prompts/feature/open-generative-ui/start.md +7 -7
  28. package/onboarding/prompts/feature/realtime-sync/implement.md +7 -7
  29. package/onboarding/prompts/feature/realtime-sync/proof.md +6 -6
  30. package/onboarding/prompts/feature/realtime-sync/start.md +6 -6
  31. package/onboarding/prompts/feature/rich-threads/implement.md +8 -8
  32. package/onboarding/prompts/feature/rich-threads/proof.md +6 -6
  33. package/onboarding/prompts/feature/rich-threads/start.md +6 -6
  34. package/onboarding/prompts/feature/stop.md +6 -6
  35. package/onboarding/prompts/feature/voice/implement.md +6 -6
  36. package/onboarding/prompts/feature/voice/proof.md +6 -6
  37. package/onboarding/prompts/feature/voice/start.md +7 -7
  38. package/onboarding/prompts/framework/ag2.md +2 -2
  39. package/onboarding/prompts/framework/agno.md +2 -2
  40. package/onboarding/prompts/framework/built-in.md +2 -2
  41. package/onboarding/prompts/framework/claude-sdk-python.md +2 -2
  42. package/onboarding/prompts/framework/claude-sdk-typescript.md +2 -2
  43. package/onboarding/prompts/framework/crewai-flows.md +2 -2
  44. package/onboarding/prompts/framework/deep-agents.md +2 -2
  45. package/onboarding/prompts/framework/google-adk.md +2 -2
  46. package/onboarding/prompts/framework/langgraph-fastapi.md +2 -2
  47. package/onboarding/prompts/framework/langgraph-python.md +2 -2
  48. package/onboarding/prompts/framework/langgraph-typescript.md +2 -2
  49. package/onboarding/prompts/framework/llamaindex.md +2 -2
  50. package/onboarding/prompts/framework/mastra.md +2 -2
  51. package/onboarding/prompts/framework/ms-agent-dotnet.md +2 -2
  52. package/onboarding/prompts/framework/ms-agent-harness-dotnet.md +2 -2
  53. package/onboarding/prompts/framework/ms-agent-python.md +2 -2
  54. package/onboarding/prompts/framework/pydantic-ai.md +2 -2
  55. package/onboarding/prompts/framework/strands-python.md +2 -2
  56. package/onboarding/prompts/framework/strands-typescript.md +2 -2
  57. package/onboarding/prompts/frontend/angular.md +3 -3
  58. package/onboarding/prompts/frontend/nextjs.md +3 -3
  59. package/onboarding/prompts/frontend/plan.md +17 -12
  60. package/onboarding/prompts/frontend/react-native.md +2 -2
  61. package/onboarding/prompts/frontend/react-spa.md +2 -2
  62. package/onboarding/prompts/frontend/vue.md +2 -2
  63. package/onboarding/prompts/implementation/build-and-validate.md +29 -17
  64. package/onboarding/prompts/proof/complete.md +22 -14
  65. package/onboarding/prompts/proof/oss-baseline.md +5 -5
  66. package/onboarding/prompts/proof/round-trip.md +16 -15
  67. package/onboarding/prompts/research/gather.md +18 -4
  68. package/onboarding/prompts/research/route.md +9 -10
  69. package/onboarding/prompts/starter/clone.md +6 -6
  70. package/onboarding/prompts/stopped/run-failed.md +3 -3
  71. package/onboarding/prompts/subagent/create-plan.md +1 -1
  72. package/onboarding/prompts/subagent/prove-oss-baseline.md +1 -1
  73. package/onboarding/prompts/subagent/prove-round-trip.md +32 -15
  74. package/onboarding/prompts/unsupported/no-validated-path.md +4 -4
  75. package/package.json +1 -1
  76. package/release/release-tool.js +1 -1
package/README.md CHANGED
@@ -229,10 +229,13 @@ npx --yes copilotkit@latest onboard start \
229
229
  | `add-chat-suggestions` | Configure and send visible chat suggestions |
230
230
  | `add-voice` | Add documented voice transcription to the existing composer |
231
231
  | `add-realtime-sync` | Prove managed thread changes sync between active clients |
232
- | `add-channels` | Connect Slack or Teams and prove a real mention |
233
232
 
234
- Run `copilotkit channels setup` to copy `onboard start --intent add-channels` with a run id.
235
- `add-channels` does not need a CopilotKit web app. The graph asks Slack or Teams.
233
+ Run `copilotkit channels setup` to copy the same small `onboard start --run <id>`
234
+ prompt as the website CTA. There is no `--intent add-channels`. The copied
235
+ prompt has no Channel sentence. When the project has no frontend, the root graph
236
+ asks which frontend they want and offers Slack and Microsoft Teams there. If the
237
+ copied prompt came from a Slack or Teams docs page, that page is the named
238
+ frontend.
236
239
  Its first prompt records the coding agent with `onboard identify`, including when
237
240
  the entry command omitted `--coding-agent`. Channel setup stage events include
238
241
  the existing `onboarding_run_id` when the command runs inside an onboarding run;
@@ -370,8 +373,8 @@ copilotkit channels setup
370
373
  copilotkit channels setup --no-clipboard
371
374
  ```
372
375
 
373
- The command copies `onboard start --intent add-channels` with a run id.
374
- It installs the `channels-setup` skill, then prints a one-line prompt to paste
376
+ The command copies the small `onboard start --run <id>` prompt.
377
+ It installs the `channels-setup` skill, then prints that prompt to paste
375
378
  into your coding agent and copies it to your clipboard. The prompt is always
376
379
  printed, so you can read it before handing it over. Pass `--no-clipboard` in a
377
380
  headless or remote shell.
@@ -2,20 +2,20 @@
2
2
  "schemaVersion": 1,
3
3
  "package": {
4
4
  "name": "copilotkit",
5
- "version": "4.10.1"
5
+ "version": "4.11.0"
6
6
  },
7
7
  "intelligence": {
8
- "commit": "b5b41dba88259cb723cfd2560be82b234417efa7"
8
+ "commit": "362d341410722307c1067c71ac14710245300cff"
9
9
  },
10
10
  "copilotKit": {
11
- "submittedInput": "7e6964f",
12
- "commit": "7e6964fc11092b685bbea62bc331d5d177b738c1"
11
+ "submittedInput": "dc1238c0bd473e259c992b85026cb30fe6b3b726",
12
+ "commit": "dc1238c0bd473e259c992b85026cb30fe6b3b726"
13
13
  },
14
14
  "channel": "production",
15
- "triggeringActor": "AlemTuzlak",
15
+ "triggeringActor": "tylerslaton",
16
16
  "workflow": {
17
- "runId": "35080956003",
18
- "runUrl": "https://github.com/CopilotKit/Intelligence/actions/runs/35080956003"
17
+ "runId": "35162202498",
18
+ "runUrl": "https://github.com/CopilotKit/Intelligence/actions/runs/35162202498"
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-09-16T09:44:44Z"
27
+ "builtAt": "2026-09-16T23:26:51Z"
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.10.1" : "dev",
100
- buildNumber: true ? "35080956003" : "dev",
101
- commitSha: true ? "b5b41dba88259cb723cfd2560be82b234417efa7" : "dev",
99
+ version: true ? "4.11.0" : "dev",
100
+ buildNumber: true ? "35162202498" : "dev",
101
+ commitSha: true ? "362d341410722307c1067c71ac14710245300cff" : "dev",
102
102
  copilotKitCommit: getTemplateRef()
103
103
  };
104
104
  }
105
105
  function getTemplateRef() {
106
- return true ? "7e6964fc11092b685bbea62bc331d5d177b738c1" : "main";
106
+ return true ? "dc1238c0bd473e259c992b85026cb30fe6b3b726" : "main";
107
107
  }
108
108
  function getC15tBackendUrl() {
109
109
  return true ? "https://calm-hazelnut-joy-copilotkit.inth.app" : "";
@@ -28668,18 +28668,22 @@ var init_repository_root = __esm({
28668
28668
  import * as fs7 from "node:fs";
28669
28669
  import * as os2 from "node:os";
28670
28670
  import * as path9 from "node:path";
28671
- function prepareProjectConfig(selection, previous, generateBindingId) {
28671
+ function prepareProjectConfig(selection, previous, generateBindingId, statedRuntimeUrl) {
28672
28672
  const telemetryBindingId = previous?.projectId === selection.projectId && previous.clerkOrgId === selection.clerkOrgId && previous.telemetryBindingId !== void 0 ? previous.telemetryBindingId : generateBindingId();
28673
28673
  return projectConfigSchema.extend({ telemetryBindingId: external_exports.string().trim().min(1) }).parse({
28674
28674
  ...selection,
28675
28675
  telemetryBindingId,
28676
- // Carried through unconditionally, including across a change of project.
28677
- // Nothing in the CLI writes it, so its only possible author is a person,
28678
- // and it describes where this directory's app serves rather than which
28676
+ // A stated URL wins. Otherwise the recorded one is carried through
28677
+ // unconditionally, including across a change of project, because it
28678
+ // describes where this directory's app serves rather than which
28679
28679
  // Intelligence project the app reports to (OSS-1090).
28680
- ...previous?.runtimeUrl === void 0 ? {} : { runtimeUrl: previous.runtimeUrl }
28680
+ ...runtimeUrlFields(statedRuntimeUrl, previous?.runtimeUrl)
28681
28681
  });
28682
28682
  }
28683
+ function runtimeUrlFields(stated, recorded) {
28684
+ const chosen = stated?.trim() === "" ? void 0 : stated ?? recorded;
28685
+ return chosen === void 0 ? {} : { runtimeUrl: chosen };
28686
+ }
28683
28687
  function projectConfigPath(dir) {
28684
28688
  return path9.join(dir, ".copilotkit", "project.json");
28685
28689
  }
@@ -28776,15 +28780,19 @@ var init_project_config = __esm({
28776
28780
  telemetryBindingId: external_exports.string().trim().min(1).optional(),
28777
28781
  /**
28778
28782
  * Absolute URL of this project's CopilotKit runtime, when the project pins
28779
- * one by hand.
28783
+ * one.
28784
+ *
28785
+ * Stated, never guessed. `copilotkit verify` works out the port from the
28786
+ * app's own dev configuration, and this is where a project whose runtime is
28787
+ * somewhere that cannot be worked out — a different mount path, a
28788
+ * container, a port that only ever appears on a command line — says so once
28789
+ * instead of passing `--runtime-url` on every invocation (OSS-1090).
28780
28790
  *
28781
- * Written by a person, not by the CLI. `copilotkit verify` works out the
28782
- * port from the app's own dev configuration, and this is where a project
28783
- * whose runtime is somewhere that cannot be worked out — a different mount
28784
- * path, a container, a port that only ever appears on a command line —
28785
- * states it once instead of passing `--runtime-url` on every invocation
28786
- * (OSS-1090). The schema is strict, so it has to be declared here for such
28787
- * a file to parse at all.
28791
+ * A person writes it, and so does `project select --runtime-url`. An
28792
+ * onboarding run settles a free port and then has nowhere to put it, so
28793
+ * `verify` falls back to its assumed default and reports on whatever holds
28794
+ * that port — in one run, an unrelated checkout (PE-58). The flag is still
28795
+ * a statement rather than a guess: the caller has to name the URL.
28788
28796
  */
28789
28797
  runtimeUrl: external_exports.string().trim().min(1).optional()
28790
28798
  }).strict();
@@ -96145,6 +96153,13 @@ function validateProjectName(raw2, existing) {
96145
96153
  message: `Intelligence project name must be ${MAX_PROJECT_NAME_LENGTH} characters or fewer.`
96146
96154
  };
96147
96155
  }
96156
+ if (name.length < MIN_PROJECT_NAME_LENGTH || GENERIC_PROJECT_NAMES.has(name.toLowerCase()) || THROWAWAY_PROJECT_NAME.test(name.toLowerCase())) {
96157
+ return {
96158
+ ok: false,
96159
+ reason: "generic",
96160
+ message: `"${name}" names a directory rather than a project. Give a name that says what this project does, so it can be told apart in the dashboard later.`
96161
+ };
96162
+ }
96148
96163
  const duplicate = existing.find(
96149
96164
  (project) => project.name.toLowerCase() === name.toLowerCase()
96150
96165
  );
@@ -96159,11 +96174,33 @@ function validateProjectName(raw2, existing) {
96159
96174
  }
96160
96175
  return { ok: true, name };
96161
96176
  }
96162
- var MAX_PROJECT_NAME_LENGTH, NUMERIC_SUFFIX, SUGGESTION_ATTEMPTS;
96177
+ var MAX_PROJECT_NAME_LENGTH, MIN_PROJECT_NAME_LENGTH, GENERIC_PROJECT_NAMES, THROWAWAY_PROJECT_NAME, NUMERIC_SUFFIX, SUGGESTION_ATTEMPTS;
96163
96178
  var init_hosted_project_name = __esm({
96164
96179
  "apps/cli/src/services/hosted-project-name.ts"() {
96165
96180
  "use strict";
96166
96181
  MAX_PROJECT_NAME_LENGTH = 100;
96182
+ MIN_PROJECT_NAME_LENGTH = 3;
96183
+ GENERIC_PROJECT_NAMES = /* @__PURE__ */ new Set([
96184
+ "api",
96185
+ "app",
96186
+ "apps",
96187
+ "backend",
96188
+ "client",
96189
+ "frontend",
96190
+ "lib",
96191
+ "libs",
96192
+ "package",
96193
+ "packages",
96194
+ "project",
96195
+ "repo",
96196
+ "server",
96197
+ "service",
96198
+ "site",
96199
+ "src",
96200
+ "web",
96201
+ "website"
96202
+ ]);
96203
+ THROWAWAY_PROJECT_NAME = /^(?:bar|baz|demo|example|foo|hello|placeholder|qux|run|sample|scratch|temp|test|tmp|trial|try)(?:[-_]?(?:\d+|[a-z]))?$/u;
96167
96204
  NUMERIC_SUFFIX = /-\d+$/;
96168
96205
  SUGGESTION_ATTEMPTS = 1e3;
96169
96206
  }
@@ -96192,6 +96229,13 @@ function defer() {
96192
96229
  });
96193
96230
  return { promise: promise3, resolve: resolve9 };
96194
96231
  }
96232
+ function hostedProjectPickerWindowStart(selectedIndex, itemCount) {
96233
+ const lastStart = Math.max(0, itemCount - MAX_HOSTED_PROJECT_PICKER_VISIBLE);
96234
+ return Math.min(
96235
+ Math.max(0, selectedIndex - MAX_HOSTED_PROJECT_PICKER_VISIBLE + 1),
96236
+ lastStart
96237
+ );
96238
+ }
96195
96239
  function ProjectExplainer({ dim = false }) {
96196
96240
  return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Text, { dimColor: dim, children: "An Intelligence project is where this app's threads, messages, and analytics are stored." });
96197
96241
  }
@@ -96386,12 +96430,21 @@ function HostedProjectSelect({
96386
96430
  })),
96387
96431
  { label: "Create a new project", value: "__create__" }
96388
96432
  ];
96433
+ const windowStart = hostedProjectPickerWindowStart(
96434
+ pickerIndex,
96435
+ items.length
96436
+ );
96437
+ const visibleItems = items.slice(
96438
+ windowStart,
96439
+ windowStart + MAX_HOSTED_PROJECT_PICKER_VISIBLE
96440
+ );
96389
96441
  return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(Box_default, { flexDirection: "column", children: [
96390
96442
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Text, { children: "Connect this app to one of your existing projects, or create a new one." }),
96391
96443
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(ProjectExplainer, { dim: true }),
96392
96444
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Text, { children: " " }),
96393
96445
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Text, { children: "Select a project (\u2191/\u2193 to move, Enter to choose, Esc to cancel):" }),
96394
- items.map((item, index2) => {
96446
+ visibleItems.map((item, visibleIndex) => {
96447
+ const index2 = windowStart + visibleIndex;
96395
96448
  const selected = index2 === pickerIndex;
96396
96449
  return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
96397
96450
  Text,
@@ -96442,7 +96495,7 @@ function HostedProjectSelect({
96442
96495
  }
96443
96496
  return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Text, { children: view.message });
96444
96497
  }
96445
- var import_react37, import_jsx_runtime7;
96498
+ var import_react37, import_jsx_runtime7, MAX_HOSTED_PROJECT_PICKER_VISIBLE;
96446
96499
  var init_hosted_project_select = __esm({
96447
96500
  async "apps/cli/src/ui/hosted-project-select.tsx"() {
96448
96501
  "use strict";
@@ -96452,6 +96505,7 @@ var init_hosted_project_select = __esm({
96452
96505
  init_hosted_project_name();
96453
96506
  init_theme();
96454
96507
  import_jsx_runtime7 = __toESM(require_jsx_runtime(), 1);
96508
+ MAX_HOSTED_PROJECT_PICKER_VISIBLE = 6;
96455
96509
  }
96456
96510
  });
96457
96511
 
@@ -96813,7 +96867,7 @@ var init_telemetry_identity_events = __esm({
96813
96867
  // apps/cli/src/commands/project-select-effects.ts
96814
96868
  import { randomUUID as randomUUID3 } from "node:crypto";
96815
96869
  import * as path18 from "node:path";
96816
- function persistSelection(dir, selection) {
96870
+ function persistSelection(dir, selection, statedRuntimeUrl) {
96817
96871
  try {
96818
96872
  const previous = readProjectConfig(dir) ?? null;
96819
96873
  const config3 = prepareProjectConfig(
@@ -96823,7 +96877,8 @@ function persistSelection(dir, selection) {
96823
96877
  clerkOrgId: selection.organizationId
96824
96878
  },
96825
96879
  previous,
96826
- randomUUID3
96880
+ randomUUID3,
96881
+ statedRuntimeUrl
96827
96882
  );
96828
96883
  writeProjectConfig(dir, config3);
96829
96884
  return {
@@ -97014,9 +97069,9 @@ function toRequest(options) {
97014
97069
  }
97015
97070
  return null;
97016
97071
  }
97017
- async function completeSelection(apiClient, selection) {
97072
+ async function completeSelection(apiClient, selection, statedRuntimeUrl) {
97018
97073
  const recordDir = resolveProjectConfigWriteDir(process.cwd());
97019
- const persisted = persistSelection(recordDir, selection);
97074
+ const persisted = persistSelection(recordDir, selection, statedRuntimeUrl);
97020
97075
  if (persisted.bindingId === null) {
97021
97076
  return withoutSelection(persisted.outcome);
97022
97077
  }
@@ -97067,7 +97122,7 @@ The recorded selection is kept, so finish it with \`${projectSelectRetryCommand(
97067
97122
  configPath
97068
97123
  };
97069
97124
  }
97070
- async function driveFlagSelect(apiClient, request) {
97125
+ async function driveFlagSelect(apiClient, request, statedRuntimeUrl) {
97071
97126
  const { prompts, refusal } = createFlagPrompts(request);
97072
97127
  let result;
97073
97128
  try {
@@ -97097,7 +97152,7 @@ async function driveFlagSelect(apiClient, request) {
97097
97152
  ...recorded.suggestedName === void 0 ? {} : { suggestedName: recorded.suggestedName }
97098
97153
  });
97099
97154
  }
97100
- return await completeSelection(apiClient, result);
97155
+ return await completeSelection(apiClient, result, statedRuntimeUrl);
97101
97156
  }
97102
97157
  async function drivePicker(apiClient, options) {
97103
97158
  let outcome = { kind: "canceled" };
@@ -97136,7 +97191,7 @@ async function drivePicker(apiClient, options) {
97136
97191
  if (selection === null) {
97137
97192
  return withoutSelection(outcome);
97138
97193
  }
97139
- return await completeSelection(apiClient, selection);
97194
+ return await completeSelection(apiClient, selection, options.runtimeUrl);
97140
97195
  }
97141
97196
  async function driveProjectSelect(options, render2 = { renderToStderr: false }) {
97142
97197
  const auth2 = authStore.get();
@@ -97155,7 +97210,10 @@ async function driveProjectSelect(options, render2 = { renderToStderr: false })
97155
97210
  productOrganizationId: auth2.clerkOrgId
97156
97211
  });
97157
97212
  const request = toRequest(options);
97158
- return request === null ? await drivePicker(apiClient, render2) : await driveFlagSelect(apiClient, request);
97213
+ return request === null ? await drivePicker(apiClient, {
97214
+ ...render2,
97215
+ ...options.runtimeUrl === void 0 ? {} : { runtimeUrl: options.runtimeUrl }
97216
+ }) : await driveFlagSelect(apiClient, request, options.runtimeUrl);
97159
97217
  }
97160
97218
  async function runProjectSelect(options = {}) {
97161
97219
  const { outcome } = await driveProjectSelect(options);
@@ -97863,7 +97921,9 @@ function buildSkillsOnboardPrompt() {
97863
97921
  }
97864
97922
  function buildChannelsSetupPrompt() {
97865
97923
  const runId = randomBytes2(9).toString("base64url");
97866
- return `npx --yes copilotkit@latest onboard start --intent add-channels --run=${runId}`;
97924
+ return `Help me get started with CopilotKit. Run this command and follow the instructions:
97925
+
97926
+ npx --yes copilotkit@latest onboard start --run=${runId}`;
97867
97927
  }
97868
97928
  var SKILLS_ONBOARD_AGENT_PROMPT, CHANNELS_SETUP_SKILL;
97869
97929
  var init_agent_prompt = __esm({
@@ -387601,6 +387661,9 @@ ${detail}${NOTHING_PROVED}`;
387601
387661
  ""
387602
387662
  ].join("\n");
387603
387663
  }
387664
+ function leavesSurfaceUnproven(check4) {
387665
+ return check4.outcome !== "performed" && check4.outcome !== DECLINED_SURFACE_CHECK;
387666
+ }
387604
387667
  function parseFrontendUrl(rest) {
387605
387668
  const flagIndex = rest.indexOf("--frontend-url");
387606
387669
  if (flagIndex === -1)
@@ -387927,6 +387990,18 @@ function blockedWithoutSurfaceProof(check4) {
387927
387990
  ""
387928
387991
  ].join("\n");
387929
387992
  }
387993
+ function declinedSurfaceNote(check4) {
387994
+ const surface = check4.kind === "visual" ? "browser" : "device";
387995
+ return [
387996
+ "CopilotKit onboarding marked complete.",
387997
+ "",
387998
+ ` This run cloned a starter, so it drove no ${surface} of its own.`,
387999
+ " That code is what the starter smoke jobs drive on every change, and",
388000
+ " `copilotkit verify --round-trip` proved the agent round trip here.",
388001
+ ` To see it yourself, open the app and drive it once by hand.`,
388002
+ ""
388003
+ ].join("\n");
388004
+ }
387930
388005
  function blockedAfterProof(blocker) {
387931
388006
  const report = BLOCKER_REPORTS[blocker];
387932
388007
  return [
@@ -387950,13 +388025,15 @@ function blockedAfterProof(blocker) {
387950
388025
  ].join("\n");
387951
388026
  }
387952
388027
  function completionReport(input) {
387953
- if (input.check.outcome !== "performed") {
388028
+ if (leavesSurfaceUnproven(input.check)) {
387954
388029
  const surface = blockedWithoutSurfaceProof(input.check);
387955
388030
  if (input.blocker === void 0)
387956
388031
  return surface;
387957
388032
  return `${surface}${blockedAfterProof(input.blocker)}`;
387958
388033
  }
387959
- return input.blocker === void 0 ? "CopilotKit onboarding marked complete.\n" : blockedAfterProof(input.blocker);
388034
+ if (input.blocker !== void 0)
388035
+ return blockedAfterProof(input.blocker);
388036
+ return input.check.outcome === DECLINED_SURFACE_CHECK ? declinedSurfaceNote(input.check) : "CopilotKit onboarding marked complete.\n";
387960
388037
  }
387961
388038
  function describeSubmission(subject, submission) {
387962
388039
  switch (submission.status) {
@@ -388273,7 +388350,7 @@ function recordBestEffort(dependencies, event) {
388273
388350
  } catch {
388274
388351
  }
388275
388352
  }
388276
- var ONBOARD_SUBCOMMANDS, READ_RUN_NOT_BOUND, IDENTIFY_RUN_NOT_BOUND, STEP_RUN_NOT_BOUND, REBASELINE_USAGE, ACCEPT_USAGE, AUTHORIZE_USAGE, ACCEPT_CREDENTIAL_USAGE, PRIOR_CHANGE_USAGE, UNPLANNED_USAGE, EXCLUSIVE_MODE_USAGE, NOTHING_PROVED, NOTHING_AUTHORIZED, NOTHING_ACCEPTED, VISUAL_CHECK_OUTCOMES, DEVICE_CHECK_OUTCOMES, BLOCKER_CAUSES, BLOCKER_USAGE, SURFACE_CHECK_USAGE, FRONTEND_URL_USAGE, PROOF_STEPS, PROOF_OUTCOMES, BASELINE_PREDICATE_COUNT, PROOF_USAGE, IDENTIFY_USAGE, BLOCKER_REPORTS;
388353
+ var ONBOARD_SUBCOMMANDS, READ_RUN_NOT_BOUND, IDENTIFY_RUN_NOT_BOUND, STEP_RUN_NOT_BOUND, REBASELINE_USAGE, ACCEPT_USAGE, AUTHORIZE_USAGE, ACCEPT_CREDENTIAL_USAGE, PRIOR_CHANGE_USAGE, UNPLANNED_USAGE, EXCLUSIVE_MODE_USAGE, NOTHING_PROVED, NOTHING_AUTHORIZED, NOTHING_ACCEPTED, DECLINED_SURFACE_CHECK, VISUAL_CHECK_OUTCOMES, DEVICE_CHECK_OUTCOMES, BLOCKER_CAUSES, BLOCKER_USAGE, SURFACE_CHECK_USAGE, FRONTEND_URL_USAGE, PROOF_STEPS, PROOF_OUTCOMES, BASELINE_PREDICATE_COUNT, PROOF_USAGE, IDENTIFY_USAGE, BLOCKER_REPORTS;
388277
388354
  var init_onboard = __esm({
388278
388355
  async "apps/cli/src/commands/onboard.ts"() {
388279
388356
  "use strict";
@@ -388323,14 +388400,17 @@ var init_onboard = __esm({
388323
388400
  NOTHING_PROVED = "This is a missing baseline, not a preservation failure: no protected path has\nbeen proved changed, and none has been proved unchanged either.\n";
388324
388401
  NOTHING_AUTHORIZED = "Nothing was recorded. No path in this call was authorized, including any path\nnamed before the one above.\n";
388325
388402
  NOTHING_ACCEPTED = "Nothing was recorded. No path in this call was accepted, including any path\nnamed before the one above.\n";
388403
+ DECLINED_SURFACE_CHECK = "skipped-cloned-starter";
388326
388404
  VISUAL_CHECK_OUTCOMES = [
388327
388405
  "performed",
388328
388406
  "skipped-no-browser-tool",
388407
+ DECLINED_SURFACE_CHECK,
388329
388408
  "failed"
388330
388409
  ];
388331
388410
  DEVICE_CHECK_OUTCOMES = [
388332
388411
  "performed",
388333
388412
  "skipped-no-device",
388413
+ DECLINED_SURFACE_CHECK,
388334
388414
  "failed"
388335
388415
  ];
388336
388416
  BLOCKER_CAUSES = [
@@ -388344,7 +388424,7 @@ surface this run proved and what blocked it afterwards are separate facts.
388344
388424
  Use \`other\` rather than leaving the flag off. A run with no way to say it was
388345
388425
  blocked reads the unsupported terminal instead, and reports a path that works
388346
388426
  as one this release does not carry.`;
388347
- 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.";
388427
+ SURFACE_CHECK_USAGE = "Usage: copilotkit onboard complete --visual-check <performed|skipped-no-browser-tool|skipped-cloned-starter|failed>\n or: copilotkit onboard complete --device-check <performed|skipped-no-device|skipped-cloned-starter|failed>\n`skipped-cloned-starter` is for a run that cloned a starter and was told to open no\nbrowser. It does not block. Every other skip says the surface is unproven and does.\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.";
388348
388428
  FRONTEND_URL_USAGE = "Usage: copilotkit onboard complete <surface-check> --frontend-url <absolute url>\nPass the URL a browser actually opened, for example http://localhost:3000.\nOnly the kind of host is recorded -- loopback hostname, loopback IP literal,\nother IP literal, other name -- never the host itself.";
388349
388429
  PROOF_STEPS = ONBOARDING_PROOF_STEPS;
388350
388430
  PROOF_OUTCOMES = ONBOARDING_PROOF_OUTCOMES;
@@ -392022,6 +392102,7 @@ name the answer up front, so they run in a non-interactive shell.
392022
392102
  Options:
392023
392103
  --project <ref> Select an existing project by slug or id, no prompt
392024
392104
  --create <name> Create a project with this name and select it
392105
+ --runtime-url <url> Record where this project's runtime serves
392025
392106
  --json Emit a machine-readable result on stdout
392026
392107
  -h, --help Show help for project select
392027
392108
 
@@ -392030,6 +392111,11 @@ organization's real projects, so a typo fails with the available slugs rather
392030
392111
  than recording a selection that points at nothing. Run
392031
392112
  \`copilotkit project list --json\` first to see them.
392032
392113
 
392114
+ --runtime-url records "runtimeUrl" in the project record, so \`copilotkit verify\`
392115
+ probes the URL this project states instead of assuming port 3000. Pass it when
392116
+ the app serves somewhere that cannot be worked out from its dev configuration: a
392117
+ non-default port, a different mount path, or a container.
392118
+
392033
392119
  --json reports selected_project_slug, project_file_written,
392034
392120
  api_key_provisioned, and environment_file_written. The payload never contains
392035
392121
  the API key.
@@ -392885,6 +392971,7 @@ ${formatStaleBuildNote()}
392885
392971
  options: {
392886
392972
  project: { type: "string" },
392887
392973
  create: { type: "string" },
392974
+ "runtime-url": { type: "string" },
392888
392975
  json: { type: "boolean" }
392889
392976
  },
392890
392977
  strict: true,
@@ -392892,7 +392979,24 @@ ${formatStaleBuildNote()}
392892
392979
  });
392893
392980
  const project = parsed.values["project"];
392894
392981
  const create3 = parsed.values["create"];
392982
+ const runtimeUrl = parsed.values["runtime-url"];
392895
392983
  const json4 = parsed.values["json"] === true;
392984
+ if (runtimeUrl !== void 0 && !URL.canParse(runtimeUrl)) {
392985
+ recordTelemetryEvent({
392986
+ properties: {
392987
+ command: "project",
392988
+ subcommand: "select",
392989
+ outcome: "failed",
392990
+ error_code: "validation"
392991
+ }
392992
+ });
392993
+ process.stderr.write(
392994
+ `Error: --runtime-url must be an absolute URL (received "${runtimeUrl}").
392995
+ `
392996
+ );
392997
+ await exitWithFlush(1);
392998
+ return;
392999
+ }
392896
393000
  if (project !== void 0 && create3 !== void 0) {
392897
393001
  recordTelemetryEvent({
392898
393002
  properties: {
@@ -392929,7 +393033,8 @@ ${formatStaleBuildNote()}
392929
393033
  }
392930
393034
  const options = {
392931
393035
  ...project === void 0 ? {} : { project },
392932
- ...create3 === void 0 ? {} : { create: create3 }
393036
+ ...create3 === void 0 ? {} : { create: create3 },
393037
+ ...runtimeUrl === void 0 ? {} : { runtimeUrl }
392933
393038
  };
392934
393039
  await withTelemetry(
392935
393040
  { command: "project", subcommand: "select" },
@@ -1,8 +1,7 @@
1
1
  {
2
- "graphTree": "6b3586ba65cfeed7befa35d0c8794713198ac438",
2
+ "graphTree": "31372aea9d38d802779516dc556c136faf611b32",
3
3
  "intentRoots": {
4
4
  "add-a2ui": "feature/a2ui/start",
5
- "add-channels": "feature/channels/start",
6
5
  "add-chat-suggestions": "feature/chat-suggestions/start",
7
6
  "add-learning": "feature/learning/start",
8
7
  "add-open-generative-ui": "feature/open-generative-ui/start",
@@ -462,6 +461,7 @@
462
461
  "frontend/angular",
463
462
  "frontend/vue",
464
463
  "frontend/react-native",
464
+ "feature/channels/start",
465
465
  "unsupported/no-validated-path"
466
466
  ],
467
467
  "milestone": "frontend",
@@ -5,7 +5,7 @@
5
5
  Run this before anything else in this prompt, including the welcome message below:
6
6
 
7
7
  ```text
8
- npx --yes copilotkit@4.10.1 onboard identify --coding-agent <coding-agent-slug>
8
+ npx --yes copilotkit@4.11.0 onboard identify --coding-agent <coding-agent-slug>
9
9
  ```
10
10
 
11
11
  Report your own product with one short slug, such as `codex` or `claude-code`.
@@ -37,7 +37,7 @@ Every later command must run from the directory this run started in. A command r
37
37
  somewhere else, such as a sibling of that directory, is refused rather than answered,
38
38
  because the run it belongs to cannot be found from there. That refusal is a step to take,
39
39
  not a stop to report: run
40
- `npx --yes copilotkit@4.10.1 onboard start --run <onboarding_run_id>` in the directory
40
+ `npx --yes copilotkit@4.11.0 onboard start --run <onboarding_run_id>` in the directory
41
41
  you are now in, which binds it to the same run, then run the refused command again. Do not
42
42
  start a run without that id. A run started without it is a second run, and the work already
43
43
  done stops counting toward the first.
@@ -48,12 +48,18 @@ question from the documentation this graph gives you. Another checkout on this m
48
48
  not a source. The developer running this has none, so an answer taken from one is an
49
49
  answer they cannot get, and it hides the documentation gap that blocks them.
50
50
 
51
+ Say `CopilotKit Intelligence` in full the first time you name the platform, and never the
52
+ bare word `Intelligence`: it names nothing a developer has met yet. In a question, leave
53
+ the product name out and say what they get. This governs what you say, not the flags you
54
+ pass.
55
+
51
56
  Send this exact message once, as your first message in this onboarding run, before
52
57
  anything else:
53
58
 
54
59
  Welcome to CopilotKit. By the end of this run your own application talks to an AI agent,
55
60
  and its chat history stays. A user can close the tab, come back, and reopen any past
56
- conversation in full. The managed Intelligence platform is what keeps them. I prove that
61
+ conversation in full. The managed CopilotKit Intelligence platform is what keeps them. I
62
+ prove that
57
63
  round trip in the running app before I call it done. You finish with working software and
58
64
  the evidence that it works.
59
65
 
@@ -74,15 +80,27 @@ first send, and a developer who reads it repeatedly learns to skim the region it
74
80
  Do not ask for separate feedback consent. The feedback commands enforce the developer's
75
81
  CLI telemetry setting when a later step tries to send a report.
76
82
 
83
+ ## Where commands run
84
+
85
+ Run every command from the directory this run started in. That directory is the run root,
86
+ and every `--path` argument is read against it rather than against wherever you are
87
+ standing, so one path names one file from anywhere in the project.
88
+
89
+ One command is deliberately different. `project select` writes the credential into the
90
+ `.env` beside the directory it runs in, because that is the file the application process
91
+ loads. Run it from the directory whose application reads that file. It hoists the project
92
+ record to the repository root by itself and prints where it put it.
93
+
77
94
  ## Report a stop, wherever it happens
78
95
 
79
96
  This run reports its own stops. If you stop this run at any point, send one short report
80
97
  before you stop. That covers a stop this prompt names, a stop a later prompt names, and a
81
- stop no prompt anticipated, including one your own harness causes. Run the friction command without another developer question. The CLI telemetry gate decides whether the report is
82
- sent.
98
+ stop no prompt anticipated, including one your own harness causes. Run the friction
99
+ command without another developer question. Do not ask the developer about telemetry: the
100
+ command applies the setting they already have.
83
101
 
84
102
  ```text
85
- npx --yes copilotkit@4.10.1 onboard friction --phase stop --category <slug>
103
+ npx --yes copilotkit@4.11.0 onboard friction --phase stop --category <slug>
86
104
  ```
87
105
 
88
106
  Write one or two sentences to standard input: the step you stopped at and what stopped it.
@@ -97,13 +115,9 @@ Reporting a stop is not a route change. It does not resume the run, it is not a
97
115
  for the developer, and it does not replace whatever the rule that stopped you says to do
98
116
  next: send the report, then stop.
99
117
 
100
- Until now the route out of an unsupported path was the only place that asked for a report,
101
- so a stop anywhere else left no trace at all. A stop nobody hears about is a stop this
102
- graph cannot fix.
103
-
104
118
  ## Check sign-in
105
119
 
106
- Run `npx --yes copilotkit@4.10.1 login --json` before any project work. This command
120
+ Run `npx --yes copilotkit@4.11.0 login --json` before any project work. This command
107
121
  checks the current session. It starts sign-in only as needed. Treat this as a long-lived
108
122
  streaming process. Do not wait for the command to exit before you read its standard output.
109
123
 
@@ -139,8 +153,8 @@ Do not use `whoami` for this check. It has no JSON output and some failures exit
139
153
  zero. Do not put account tokens or credentials in the conversation.
140
154
 
141
155
  When sign-in is settled, run
142
- `npx --yes copilotkit@4.10.1 onboard read research/gather`.
156
+ `npx --yes copilotkit@4.11.0 onboard read research/gather`.
143
157
 
144
158
  If sign-in stops onboarding, run
145
- `npx --yes copilotkit@4.10.1 onboard read stopped/run-failed`. It says nothing about
159
+ `npx --yes copilotkit@4.11.0 onboard read stopped/run-failed`. It says nothing about
146
160
  whether this project's stack is supported, which is not yet known at this point.
@@ -100,7 +100,7 @@ of this journey, and a drawer that lists nothing is not a reason to mint one. Li
100
100
  tokens stay a self-hosted concern.
101
101
 
102
102
  Where this journey's frontend framework ships no threads drawer -- React Native --, the
103
- fifth item is proved by `npx --yes copilotkit@4.10.1 verify --round-trip`, which sends a
103
+ fifth item is proved by `npx --yes copilotkit@4.11.0 verify --round-trip`, which sends a
104
104
  real request and reads the answer back off the thread it landed on. The run says which of
105
105
  the two it proved. Do not send a run to the managed Intelligence dashboard to prove this.
106
106
  An authenticated browser session at a hosted dashboard is the one thing an agent-driven run
@@ -116,7 +116,7 @@ and passed -- so a run scored on either one was scored on the same fact. Every r
116
116
  resolves that condition from, while `licenseStatus` is a compatibility projection of it
117
117
  for older thread surfaces and outlives them only until those surfaces go.
118
118
 
119
- Then run `npx --yes copilotkit@4.10.1 onboard read credentials/finalize-plan`.
119
+ Then run `npx --yes copilotkit@4.11.0 onboard read credentials/finalize-plan`.
120
120
 
121
121
  If a selected page does not load after the second method, run
122
- `npx --yes copilotkit@4.10.1 onboard read unsupported/no-validated-path`.
122
+ `npx --yes copilotkit@4.11.0 onboard read unsupported/no-validated-path`.