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.
- package/README.md +8 -5
- package/cli-build-info.json +8 -8
- package/index.js +139 -34
- package/onboarding/index.json +2 -2
- package/onboarding/prompts/authenticate/start.md +27 -13
- package/onboarding/prompts/conversion/plan.md +3 -3
- package/onboarding/prompts/credentials/finalize-plan.md +30 -21
- package/onboarding/prompts/credentials/plan.md +20 -20
- package/onboarding/prompts/credentials/settle-credentials.md +9 -9
- package/onboarding/prompts/credentials/write-plan.md +7 -7
- package/onboarding/prompts/fallback/best-effort.md +9 -8
- package/onboarding/prompts/feature/a2ui/implement.md +6 -6
- package/onboarding/prompts/feature/a2ui/proof.md +6 -6
- package/onboarding/prompts/feature/a2ui/start.md +7 -7
- package/onboarding/prompts/feature/channels/implement.md +8 -8
- package/onboarding/prompts/feature/channels/proof.md +6 -6
- package/onboarding/prompts/feature/channels/start.md +17 -14
- package/onboarding/prompts/feature/chat-suggestions/implement.md +6 -6
- package/onboarding/prompts/feature/chat-suggestions/proof.md +6 -6
- package/onboarding/prompts/feature/chat-suggestions/start.md +7 -7
- package/onboarding/prompts/feature/complete.md +1 -1
- package/onboarding/prompts/feature/learning/implement.md +12 -12
- package/onboarding/prompts/feature/learning/proof.md +7 -7
- package/onboarding/prompts/feature/learning/start.md +6 -6
- package/onboarding/prompts/feature/open-generative-ui/implement.md +6 -6
- package/onboarding/prompts/feature/open-generative-ui/proof.md +6 -6
- package/onboarding/prompts/feature/open-generative-ui/start.md +7 -7
- package/onboarding/prompts/feature/realtime-sync/implement.md +7 -7
- package/onboarding/prompts/feature/realtime-sync/proof.md +6 -6
- package/onboarding/prompts/feature/realtime-sync/start.md +6 -6
- package/onboarding/prompts/feature/rich-threads/implement.md +8 -8
- package/onboarding/prompts/feature/rich-threads/proof.md +6 -6
- package/onboarding/prompts/feature/rich-threads/start.md +6 -6
- package/onboarding/prompts/feature/stop.md +6 -6
- package/onboarding/prompts/feature/voice/implement.md +6 -6
- package/onboarding/prompts/feature/voice/proof.md +6 -6
- package/onboarding/prompts/feature/voice/start.md +7 -7
- package/onboarding/prompts/framework/ag2.md +2 -2
- package/onboarding/prompts/framework/agno.md +2 -2
- package/onboarding/prompts/framework/built-in.md +2 -2
- package/onboarding/prompts/framework/claude-sdk-python.md +2 -2
- package/onboarding/prompts/framework/claude-sdk-typescript.md +2 -2
- package/onboarding/prompts/framework/crewai-flows.md +2 -2
- package/onboarding/prompts/framework/deep-agents.md +2 -2
- package/onboarding/prompts/framework/google-adk.md +2 -2
- package/onboarding/prompts/framework/langgraph-fastapi.md +2 -2
- package/onboarding/prompts/framework/langgraph-python.md +2 -2
- package/onboarding/prompts/framework/langgraph-typescript.md +2 -2
- package/onboarding/prompts/framework/llamaindex.md +2 -2
- package/onboarding/prompts/framework/mastra.md +2 -2
- package/onboarding/prompts/framework/ms-agent-dotnet.md +2 -2
- package/onboarding/prompts/framework/ms-agent-harness-dotnet.md +2 -2
- package/onboarding/prompts/framework/ms-agent-python.md +2 -2
- package/onboarding/prompts/framework/pydantic-ai.md +2 -2
- package/onboarding/prompts/framework/strands-python.md +2 -2
- package/onboarding/prompts/framework/strands-typescript.md +2 -2
- package/onboarding/prompts/frontend/angular.md +3 -3
- package/onboarding/prompts/frontend/nextjs.md +3 -3
- package/onboarding/prompts/frontend/plan.md +17 -12
- package/onboarding/prompts/frontend/react-native.md +2 -2
- package/onboarding/prompts/frontend/react-spa.md +2 -2
- package/onboarding/prompts/frontend/vue.md +2 -2
- package/onboarding/prompts/implementation/build-and-validate.md +29 -17
- package/onboarding/prompts/proof/complete.md +22 -14
- package/onboarding/prompts/proof/oss-baseline.md +5 -5
- package/onboarding/prompts/proof/round-trip.md +16 -15
- package/onboarding/prompts/research/gather.md +18 -4
- package/onboarding/prompts/research/route.md +9 -10
- package/onboarding/prompts/starter/clone.md +6 -6
- package/onboarding/prompts/stopped/run-failed.md +3 -3
- package/onboarding/prompts/subagent/create-plan.md +1 -1
- package/onboarding/prompts/subagent/prove-oss-baseline.md +1 -1
- package/onboarding/prompts/subagent/prove-round-trip.md +32 -15
- package/onboarding/prompts/unsupported/no-validated-path.md +4 -4
- package/package.json +1 -1
- 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 --
|
|
235
|
-
|
|
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 --
|
|
374
|
-
It installs the `channels-setup` skill, then prints
|
|
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.
|
package/cli-build-info.json
CHANGED
|
@@ -2,20 +2,20 @@
|
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"package": {
|
|
4
4
|
"name": "copilotkit",
|
|
5
|
-
"version": "4.
|
|
5
|
+
"version": "4.11.0"
|
|
6
6
|
},
|
|
7
7
|
"intelligence": {
|
|
8
|
-
"commit": "
|
|
8
|
+
"commit": "362d341410722307c1067c71ac14710245300cff"
|
|
9
9
|
},
|
|
10
10
|
"copilotKit": {
|
|
11
|
-
"submittedInput": "
|
|
12
|
-
"commit": "
|
|
11
|
+
"submittedInput": "dc1238c0bd473e259c992b85026cb30fe6b3b726",
|
|
12
|
+
"commit": "dc1238c0bd473e259c992b85026cb30fe6b3b726"
|
|
13
13
|
},
|
|
14
14
|
"channel": "production",
|
|
15
|
-
"triggeringActor": "
|
|
15
|
+
"triggeringActor": "tylerslaton",
|
|
16
16
|
"workflow": {
|
|
17
|
-
"runId": "
|
|
18
|
-
"runUrl": "https://github.com/CopilotKit/Intelligence/actions/runs/
|
|
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-
|
|
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.
|
|
100
|
-
buildNumber: true ? "
|
|
101
|
-
commitSha: true ? "
|
|
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 ? "
|
|
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
|
-
//
|
|
28677
|
-
//
|
|
28678
|
-
//
|
|
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
|
|
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
|
|
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
|
-
*
|
|
28782
|
-
*
|
|
28783
|
-
*
|
|
28784
|
-
*
|
|
28785
|
-
*
|
|
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
|
-
|
|
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,
|
|
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 `
|
|
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
|
|
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
|
-
|
|
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" },
|
package/onboarding/index.json
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"graphTree": "
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
82
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
122
|
+
`npx --yes copilotkit@4.11.0 onboard read unsupported/no-validated-path`.
|