copilotkit 4.27.0 → 4.28.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 (92) hide show
  1. package/README.md +155 -23
  2. package/cli-build-info.json +7 -7
  3. package/index.js +7748 -4981
  4. package/onboarding/index.json +3 -2
  5. package/onboarding/prompts/authenticate/start.md +42 -55
  6. package/onboarding/prompts/conversion/plan.md +3 -3
  7. package/onboarding/prompts/credentials/finalize-plan.md +28 -24
  8. package/onboarding/prompts/credentials/plan.md +31 -28
  9. package/onboarding/prompts/credentials/settle-credentials.md +7 -7
  10. package/onboarding/prompts/credentials/write-plan.md +54 -36
  11. package/onboarding/prompts/deployment/choose-local.md +9 -9
  12. package/onboarding/prompts/deployment/local-evaluation.md +11 -11
  13. package/onboarding/prompts/fallback/best-effort.md +9 -13
  14. package/onboarding/prompts/feature/a2ui/implement.md +4 -4
  15. package/onboarding/prompts/feature/a2ui/plan.md +3 -3
  16. package/onboarding/prompts/feature/a2ui/proof.md +5 -5
  17. package/onboarding/prompts/feature/a2ui/start.md +8 -8
  18. package/onboarding/prompts/feature/channels/implement.md +7 -7
  19. package/onboarding/prompts/feature/channels/plan.md +5 -5
  20. package/onboarding/prompts/feature/channels/proof.md +8 -7
  21. package/onboarding/prompts/feature/channels/start.md +9 -9
  22. package/onboarding/prompts/feature/chat-suggestions/implement.md +4 -4
  23. package/onboarding/prompts/feature/chat-suggestions/plan.md +3 -3
  24. package/onboarding/prompts/feature/chat-suggestions/proof.md +5 -5
  25. package/onboarding/prompts/feature/chat-suggestions/start.md +8 -8
  26. package/onboarding/prompts/feature/complete.md +2 -2
  27. package/onboarding/prompts/feature/learning/implement.md +12 -12
  28. package/onboarding/prompts/feature/learning/plan.md +4 -4
  29. package/onboarding/prompts/feature/learning/proof.md +13 -13
  30. package/onboarding/prompts/feature/learning/start.md +8 -8
  31. package/onboarding/prompts/feature/open-generative-ui/implement.md +4 -4
  32. package/onboarding/prompts/feature/open-generative-ui/plan.md +3 -3
  33. package/onboarding/prompts/feature/open-generative-ui/proof.md +5 -5
  34. package/onboarding/prompts/feature/open-generative-ui/start.md +8 -8
  35. package/onboarding/prompts/feature/realtime-sync/implement.md +5 -5
  36. package/onboarding/prompts/feature/realtime-sync/plan.md +3 -3
  37. package/onboarding/prompts/feature/realtime-sync/proof.md +5 -5
  38. package/onboarding/prompts/feature/realtime-sync/start.md +7 -7
  39. package/onboarding/prompts/feature/rich-threads/implement.md +6 -6
  40. package/onboarding/prompts/feature/rich-threads/plan.md +3 -3
  41. package/onboarding/prompts/feature/rich-threads/proof.md +5 -5
  42. package/onboarding/prompts/feature/rich-threads/start.md +7 -7
  43. package/onboarding/prompts/feature/stop.md +4 -4
  44. package/onboarding/prompts/feature/voice/implement.md +4 -4
  45. package/onboarding/prompts/feature/voice/plan.md +4 -4
  46. package/onboarding/prompts/feature/voice/proof.md +5 -5
  47. package/onboarding/prompts/feature/voice/start.md +8 -8
  48. package/onboarding/prompts/framework/ag2.md +3 -3
  49. package/onboarding/prompts/framework/agno.md +3 -3
  50. package/onboarding/prompts/framework/built-in.md +3 -3
  51. package/onboarding/prompts/framework/claude-sdk-python.md +3 -3
  52. package/onboarding/prompts/framework/claude-sdk-typescript.md +3 -3
  53. package/onboarding/prompts/framework/crewai-flows.md +6 -6
  54. package/onboarding/prompts/framework/custom-ag-ui.md +4 -4
  55. package/onboarding/prompts/framework/deep-agents.md +3 -3
  56. package/onboarding/prompts/framework/google-adk.md +3 -3
  57. package/onboarding/prompts/framework/langgraph-fastapi.md +3 -3
  58. package/onboarding/prompts/framework/langgraph-python.md +3 -3
  59. package/onboarding/prompts/framework/langgraph-typescript.md +3 -3
  60. package/onboarding/prompts/framework/llamaindex.md +3 -3
  61. package/onboarding/prompts/framework/mastra.md +3 -3
  62. package/onboarding/prompts/framework/ms-agent-dotnet.md +5 -5
  63. package/onboarding/prompts/framework/ms-agent-harness-dotnet.md +5 -5
  64. package/onboarding/prompts/framework/ms-agent-python.md +3 -3
  65. package/onboarding/prompts/framework/pydantic-ai.md +3 -3
  66. package/onboarding/prompts/framework/strands-python.md +3 -3
  67. package/onboarding/prompts/framework/strands-typescript.md +3 -3
  68. package/onboarding/prompts/frontend/angular.md +4 -4
  69. package/onboarding/prompts/frontend/nextjs.md +4 -4
  70. package/onboarding/prompts/frontend/plan.md +12 -12
  71. package/onboarding/prompts/frontend/react-native.md +3 -3
  72. package/onboarding/prompts/frontend/react-spa.md +3 -3
  73. package/onboarding/prompts/frontend/vue.md +3 -3
  74. package/onboarding/prompts/implementation/build-and-validate.md +16 -14
  75. package/onboarding/prompts/proof/complete.md +6 -7
  76. package/onboarding/prompts/proof/oss-baseline.md +8 -5
  77. package/onboarding/prompts/proof/round-trip.md +18 -20
  78. package/onboarding/prompts/research/gather.md +38 -10
  79. package/onboarding/prompts/research/merge.md +3 -3
  80. package/onboarding/prompts/research/preflight.md +2 -2
  81. package/onboarding/prompts/research/route.md +10 -4
  82. package/onboarding/prompts/setup/questions.md +53 -234
  83. package/onboarding/prompts/starter/clone.md +42 -33
  84. package/onboarding/prompts/stopped/run-failed.md +3 -3
  85. package/onboarding/prompts/subagent/create-plan.md +32 -34
  86. package/onboarding/prompts/subagent/implement-and-validate.md +12 -35
  87. package/onboarding/prompts/subagent/inspect-repository.md +1 -1
  88. package/onboarding/prompts/subagent/prove-oss-baseline.md +1 -1
  89. package/onboarding/prompts/subagent/prove-round-trip.md +35 -52
  90. package/onboarding/prompts/unsupported/no-validated-path.md +3 -3
  91. package/package.json +1 -1
  92. package/release/release-tool.js +8 -1
@@ -32,8 +32,8 @@ Wiring is not behavior. The CopilotKit SDK dependency, the middleware the agent
32
32
  in, the runtime mount, the AG-UI connection, and a frontend that renders what the agent
33
33
  already returns are wiring. Plan them as ordinary steps.
34
34
 
35
- Every item on the behavior list is a change the developer has to approve, so it is a risky
36
- change. Where a step needs one, plan it as its own item, name the file and the exact change, and state that it
35
+ Every item on the behavior list is a change the developer has to approve, so it goes under
36
+ `Changes that need your approval`. Where a step needs one, plan it as its own item, name the file and the exact change, and state that it
37
37
  changes how the agent answers everywhere, not only in CopilotKit. A system prompt the
38
38
  developer wrote is the agent's behavior rather than a setting this run tunes until a
39
39
  component renders. Where the plan cannot be written without such a change and you cannot
@@ -97,7 +97,7 @@ against a dead host, and the failure arrives as an empty-body 404 with no cause
97
97
  Ask the CLI for the dependency upgrade, from the target directory:
98
98
 
99
99
  ```text
100
- npx --prefer-offline --yes copilotkit@4.27.0 onboard upgrade-plan --json
100
+ npx --prefer-offline --yes copilotkit@4.28.0 onboard upgrade-plan --json
101
101
  ```
102
102
 
103
103
  It reads the installed tree and the registry. Read `status`:
@@ -118,7 +118,7 @@ It reads the installed tree and the registry. Read `status`:
118
118
 
119
119
  The floor is 1.70.0 because the runtime resolves managed Intelligence entitlement
120
120
  authority from that version. Below it, the Intelligence features stay dark with no error.
121
- An exact pin is usually deliberate, so a move of one is a risky change the developer
121
+ An exact pin is usually deliberate, so a move of one is a change the developer
122
122
  approves, not a repair the run invents halfway through. Where the developer needs a pin held, return
123
123
  `Status: blocked` and name `unsupported/no-validated-path` as the outcome.
124
124
 
@@ -185,33 +185,22 @@ here is work the developer did not ask for.
185
185
  Plan the threads drawer itself: add it from the selected drawer page, where this frontend
186
186
  does not already render one. Where this journey's frontend framework ships no threads
187
187
  drawer -- React Native --, plan that the thread is proved by
188
- `npx --prefer-offline --yes copilotkit@4.27.0 verify --round-trip`, which needs no browser. Do not plan a
188
+ `npx --prefer-offline --yes copilotkit@4.28.0 verify --round-trip`, which needs no browser. Do not plan a
189
189
  step that opens the managed Intelligence dashboard.
190
190
 
191
191
  ## Name the files the run writes itself
192
192
 
193
193
  List these in the plan under `Files the run writes itself`, apart from the implementation
194
- steps. They are not steps, and they are not risky changes.
194
+ steps. They are not steps, and they need no approval, except a file that is also under
195
+ `Uncommitted files`: list that one under `Changes that need your approval` too.
195
196
 
196
197
  - Each `planChanges` entry from `onboard credentials`: the project key in the env file
197
198
  `environmentPath` names, the project record, and, where it lists `ignore-entries`, the
198
- lines `project select` adds to `.gitignore` so that no credential env file can be
199
- committed.
199
+ lines `project select` adds to `.gitignore` so that no credential env file and no
200
+ `.playwright-mcp/` browser snapshot can be committed.
200
201
  - `.copilotkit/proof/`, where the proof writes its evidence. It holds no source. The
201
202
  developer can delete it after the run.
202
203
 
203
- ## Name the Skills install
204
-
205
- List the CopilotKit Skills install under `Skills install`, as its own line:
206
- `npx skills add CopilotKit/CopilotKit/skills -y`. It writes `.agents/skills/` and links it
207
- into `.claude/skills/`. End the line with "say **no Skills** to skip". Where
208
- `.agents/skills` already holds the CopilotKit skills, write `in place` instead, and plan no
209
- install.
210
-
211
- The Skills install is not a risky change. It adds agent-rule files only, holds no secret,
212
- changes nothing the app runs, and comes out with one delete. Do not list it under
213
- `Risky changes`.
214
-
215
204
  ## Scaffold an empty project
216
205
 
217
206
  This section applies when the starting state is `empty` and a step runs a scaffolder, such
@@ -243,7 +232,7 @@ the plan under `Uncommitted files`, one line each, with the path and one sentenc
243
232
  what the step changes there and why no other file will do. Keep the step in the plan.
244
233
  Adding a feature to an app the developer already built is the case this exists for: the
245
234
  option lives in a file they wrote, and on an app whose work was never committed that file
246
- has uncommitted changes. Each of those edits is a risky change, so the developer's answer
235
+ has uncommitted changes. Each of those edits needs approval, so the developer's answer
247
236
  to the plan is their consent. The CLI records none.
248
237
 
249
238
  Installing or upgrading a package changes the manifest that lists it, such as `package.json`
@@ -288,15 +277,16 @@ Do not add compiler strictness the project did not have. Nothing later in the ru
288
277
  allowed to weaken type safety, so a stricter gate named here is one the run cannot get
289
278
  back out of.
290
279
 
291
- ## Name the risky changes
280
+ ## Name the changes that need approval
292
281
 
293
282
  The run shows the plan to the developer and goes on to build it without waiting. It stops
294
- for an answer only when the plan makes a risky change. `onboard start` took a backup, so
295
- `onboard restore` undoes any other change the backup holds.
283
+ for an answer only when the plan makes a change that needs approval. `onboard start` took a
284
+ backup, so `onboard restore` undoes any other change the backup holds.
296
285
 
297
- List each risky change under `Risky changes`, one line each: the path or package, what the
298
- step does to it, and why the plan needs it. Write `none` when there is no risky change. A
299
- step makes a risky change when it:
286
+ List each change that needs approval under `Changes that need your approval`, one line each: the path
287
+ or package, what the step does to it, and why the plan needs it. Write `none` when there is
288
+ none. List every other change under `What I will change`. A step makes a change that needs
289
+ approval when it:
300
290
 
301
291
  - upgrades a dependency by a major version: a move whose `to` has a different major version
302
292
  than `from`, or a move of an exact pin
@@ -306,26 +296,34 @@ step makes a risky change when it:
306
296
  - changes a file that has uncommitted changes, from `Uncommitted files`
307
297
  - untracks a file or changes `.gitignore`, other than the lines under
308
298
  `Files the run writes itself`
309
- - writes to an env file the app already uses, other than the key line the developer
310
- approved in the setup questions
299
+ - writes to an env file the app already uses, other than the key line for the key file
300
+ the setup answers recorded
311
301
  - changes the existing agent's behavior, as `What the existing agent's behavior is`
312
302
  defines it
313
- - changes more than 10 files in all, the same limit the backup tripwire sets for deleted
314
- files
303
+ - changes more than 10 files in all. Count only the files the plan's own steps change. Do
304
+ not count a file the framework's own tooling writes by itself, such as the `AGENTS.md`
305
+ and `CLAUDE.md` that `next dev` writes, or a file under `Files the run writes itself`.
306
+ The limit is the same one the backup tripwire sets for deleted files
315
307
  - writes a file outside the project directory
316
308
  - changes the version of any CopilotKit dependency: an `@copilotkit/*` package or the
317
309
  `copilotkit` Python package, by any amount
318
310
 
319
- The plan is also risky when the backup does not hold every file: `backup.status` is
311
+ A change the developer approved in the setup message needs no approval in the plan. The setup
312
+ answers the main coding agent gives you show it: `envFile` is `approved` for the untrack or
313
+ the `.gitignore` line that the env-file line named, and `alternative` for the key in the other
314
+ env file. `uncommittedWrites: approved` allows the connection's writes to the env file and
315
+ `.copilotkit/project.json`. Name each one under the notes instead.
316
+
317
+ The plan also needs approval when the backup does not hold every file: `backup.status` is
320
318
  `partial` or `failed` in the `backup` result the main coding agent gives you. Name it as a
321
319
  line of its own. For `partial`, name each path in `backup.notHeld` with its `why`, which
322
320
  names the limit for a size skip, and the count in `backup.moreNotHeld` if any. For
323
321
  `failed`, name the cause in `backup.detail`, and that `onboard restore` puts nothing back.
324
- A step that changes one of those paths cannot be undone. `pending` is not risky: the CLI
322
+ A step that changes one of those paths cannot be undone. `pending` needs no approval: the CLI
325
323
  takes the backup when the run moves to the chosen project, or at the next step, before any
326
324
  change. Say that in the plan.
327
325
 
328
- Do not leave a risky change out of the list to keep the run moving.
326
+ Do not leave a change that needs approval out of the list to keep the run moving.
329
327
 
330
328
  Gather what you need in as few commands as possible. Combine independent reads into one
331
329
  command rather than running them one at a time. Split a command only when its result decides
@@ -32,7 +32,7 @@ listen on a port, and cannot connect to localhost. It does not always fail: a pa
32
32
  install can wait with no output until you stop it. So request escalation on the first run,
33
33
  not after a hang or an error, for these commands:
34
34
 
35
- - the dependency install and the Skills install,
35
+ - the dependency install,
36
36
  - the commands that start the app and agent servers,
37
37
  - HTTP requests to those servers.
38
38
 
@@ -100,6 +100,13 @@ Wiring is not behavior. Add the CopilotKit SDK dependency, wrap the agent in the
100
100
  middleware, mount the runtime, connect AG-UI, and render what the agent already returns.
101
101
  Those are the parts this run adds.
102
102
 
103
+ Every install in this step follows one rule for a version the registry does not serve
104
+ yet. npm reports it as `ETARGET`, pnpm as `ERR_PNPM_NO_MATCHING_VERSION`, Yarn as
105
+ `Couldn't find any versions` or `No candidates found`, and Bun as `No version matching`.
106
+ A package published minutes earlier can name a dependency whose publish has not reached
107
+ the registry. Wait 30 seconds and run the same install once more. If it fails again,
108
+ report the first error.
109
+
103
110
  A run whose `environmentPath` ends in `.env.local` hosts the CopilotKit runtime in that
104
111
  Next.js app, never in a separate server: no other process reads the key from that file.
105
112
 
@@ -126,10 +133,10 @@ new one. After wiring, run the recorded baseline checks and report any regressio
126
133
 
127
134
  Where the plan names a CopilotKit dependency upgrade, apply its moves before you wire
128
135
  Intelligence: declare each exact version in its app's manifest, then install with the
129
- project's package manager. Then check the installed tree:
136
+ project's package manager, under the install rule above. Then check the installed tree:
130
137
 
131
138
  ```text
132
- npx --prefer-offline --yes copilotkit@4.27.0 onboard upgrade-plan --check --json
139
+ npx --prefer-offline --yes copilotkit@4.28.0 onboard upgrade-plan --check --json
133
140
  ```
134
141
 
135
142
  `single` means every direct dependency resolved to one version. `duplicates` names each
@@ -144,7 +151,7 @@ If the check finds duplicates or the baseline regresses, put the manifests and l
144
151
  back, leave Intelligence unwired, and report what failed:
145
152
 
146
153
  ```text
147
- npx --prefer-offline --yes copilotkit@4.27.0 onboard upgrade-plan --revert --json
154
+ npx --prefer-offline --yes copilotkit@4.28.0 onboard upgrade-plan --revert --json
148
155
  ```
149
156
 
150
157
  Then end your turn. Never add an `overrides`, `resolutions`, or `pnpm.overrides` block to
@@ -180,7 +187,7 @@ Where the plan names a Learning Container id, check that the container exists fi
180
187
  this from the target app directory, before you write any selector:
181
188
 
182
189
  ```text
183
- npx --prefer-offline --yes copilotkit@4.27.0 learning containers get <id> --json
190
+ npx --prefer-offline --yes copilotkit@4.28.0 learning containers get <id> --json
184
191
  ```
185
192
 
186
193
  `"status": "success"` means the container exists. An `error.code` of
@@ -202,36 +209,6 @@ constructor for it, and never write an id the plan does not name: a selector poi
202
209
  id the platform does not hold answers `LEARNING_CONTAINER_NOT_FOUND` on every thread create.
203
210
  Where the plan names no container, write no selector.
204
211
 
205
- ## Install the CopilotKit Skills
206
-
207
- The plan names the Skills install on its own line, and the build does not wait for an
208
- answer on it. Install them in a whole-plan implementation. Skip it only when the developer
209
- said no, which the main coding agent passes in the handoff. A repair handoff never installs
210
- them.
211
-
212
- Where `.agents/skills` already holds the CopilotKit skills, do not install them again.
213
- Report that they are in place.
214
-
215
- Where the developer said no, do not install them, and do not call that a change from the
216
- plan. Report in the Validation section that the developer declined them.
217
-
218
- Install them at the same time as the project's dependencies, not after validation: start both installs together. Where this run installs no dependencies,
219
- install them before you run the validation list. Tell the developer what the skills
220
- install writes into this project before you run it: a `.agents/skills` directory holding
221
- one folder per CopilotKit skill, linked into `.claude/skills`. Both sit in the working tree,
222
- so the install shows up in `git status` and can land in a commit. You cannot know whether
223
- this project keeps those directories in version control, so name them before you write them
224
- rather than after.
225
-
226
- Then run `npx skills add CopilotKit/CopilotKit/skills -y` in the target app directory.
227
-
228
- The plan names both directories under `Skills install`, so they are not departures. Name
229
- them under Files changed. Do not register an MCP server: the Skills read the CopilotKit
230
- documentation without one.
231
-
232
- Check whether the install succeeded, and record the command result in the Validation
233
- section. A failed install does not change your status. Report it and continue.
234
-
235
212
  ## Report the result
236
213
 
237
214
  Report the runtime constructor you wrote. Name whether it passes `intelligence` or
@@ -8,7 +8,7 @@ Your handoff holds the JSON of this command, which the main coding agent ran fro
8
8
  target project directory:
9
9
 
10
10
  ```text
11
- npx --prefer-offline --yes copilotkit@4.27.0 onboard inspect --json
11
+ npx --prefer-offline --yes copilotkit@4.28.0 onboard inspect --json
12
12
  ```
13
13
 
14
14
  Read that JSON. Do not run the command again. If the handoff holds no inspection JSON, run
@@ -35,7 +35,7 @@ Prove the live runtime in this order:
35
35
  4. Confirm from project files that the runtime constructor passes a `runner` option rather
36
36
  than an `intelligence` option. A package, import, project file, or key is not use proof.
37
37
  5. Run
38
- `npx --prefer-offline --yes copilotkit@4.27.0 verify --expect-runtime oss --round-trip --agent <expected-agent-id> --json`,
38
+ `npx --prefer-offline --yes copilotkit@4.28.0 verify --expect-runtime oss --round-trip --agent <expected-agent-id> --json`,
39
39
  with the runtime URL or auth header options that this project needs. Add
40
40
  `--runtime-url <url>` when the report names a runtime URL the dev server does not
41
41
  serve. Require exit zero
@@ -30,7 +30,7 @@ the steps name: no SDK calls, AG-UI requests, or thread reads of your own to con
30
30
  journey's frontend, and run only that one.
31
31
 
32
32
  A run that cloned a starter is the one exception. When the main coding agent tells you
33
- that this run cloned a starter, run Step 1 and the proof checks, then go to Step 10. Skip Steps 5a through 9, open no browser
33
+ that this run cloned a starter, run Step 1 and the proof checks, then go to Step 9. Skip Steps 5a through 8, open no browser
34
34
  or device, and report `skipped-cloned-starter` as the surface-check outcome.
35
35
 
36
36
  Where this is a second attempt after a repair, run every step from the proof checks through
@@ -76,7 +76,7 @@ about the failure it was spawned to clear.
76
76
  Run this from the target app directory:
77
77
 
78
78
  ```text
79
- npx --prefer-offline --yes copilotkit@4.27.0 onboard proof-check --json
79
+ npx --prefer-offline --yes copilotkit@4.28.0 onboard proof-check --json
80
80
  ```
81
81
 
82
82
  It starts each app's `dev` script unless a server from that app already listens, and
@@ -132,7 +132,7 @@ Otherwise sort `firstFailure`, and run the command again after each repair:
132
132
  asking. Read the port from the log, not from the plan, and record it:
133
133
 
134
134
  ```text
135
- npx --prefer-offline --yes copilotkit@4.27.0 onboard runtime-url --url <runtime-url>
135
+ npx --prefer-offline --yes copilotkit@4.28.0 onboard runtime-url --url <runtime-url>
136
136
  ```
137
137
 
138
138
  `<runtime-url>` is the project's runtime URL, or the plan's, with its port replaced by the
@@ -177,6 +177,13 @@ Otherwise sort `firstFailure`, and run the command again after each repair:
177
177
 
178
178
  Where the handoff carries a thread id from the developer, skip the numbered steps above
179
179
  and do not open the app for them. Run the checks with `--thread <id>` at once.
180
+ - `round-trip:page_context_reaches_agent` with a detail that says the starter does not pass
181
+ page context yet: it is marked `advisory`, and the checks pass. This framework's starter
182
+ and its AG-UI adapter keep the page's context off the model's prompt. That is a known gap,
183
+ not a fault of this run. Do not repair the adapter. Still run Step 5a where it applies. If
184
+ its context comparison fails, record that under the same warning rather than as a failed
185
+ step. Return the warning with the proof result. The rules below are for every other
186
+ page-context result.
180
187
  - `round-trip:page_context_reaches_agent` at `fail`: the agent answered the plain request
181
188
  and recorded nothing for the request that carried context. Return it with its evidence as
182
189
  a failed proof step. At `undetermined` and marked `advisory`, the agent answered without
@@ -212,10 +219,11 @@ for the same reason. Skip both steps and send no run. Record that they sent no r
212
219
  reason, and prove the page's data and the component in the browser instead, at Steps 6
213
220
  and 7.
214
221
 
215
- `verify --round-trip` asks a question that needs no context. Where the frontend's files
216
- call a context hook, it also sends one token as context and reports
217
- `page_context_reaches_agent`, whose `pass` proves that the agent's model sees context at
218
- all. An agent scoped to its own task answers without the token, so that check is often
222
+ `verify --round-trip` asks a question that needs no context. It then sends one token as
223
+ context and reports `page_context_reaches_agent`, also where the frontend's files call no
224
+ context hook, because the CopilotKit frontend sends context entries of its own. Without a
225
+ context hook, a `pass` proves only that a run with context answers. Where the files call a
226
+ context hook, a `pass` proves that the agent's model sees context at all. An agent scoped to its own task answers without the token, so that check is often
219
227
  `undetermined`, and this step is then the only proof of the path. A `pass` does not prove
220
228
  that the page's own entries arrive in the shape the agent reads. Nothing else before the
221
229
  browser reads that path, so a page whose data the agent never sees answers fluently over a
@@ -228,9 +236,15 @@ the agent sees the request the browser sends rather than a thinner one. Read the
228
236
  files the main coding agent named in the handoff, and search the project only for a file it
229
237
  did not name. Do not search the dependencies for the shape of an entry: the page's own call
230
238
  shows it. Send the same run
231
- body twice, to `<runtime>/agent/<agent id>/run`: once carrying the context entries the page
239
+ body twice: once carrying the context entries the page
232
240
  publishes, and once carrying the same entries with one value changed. Use the step 1
233
- request both times. Record the streamed events from each, and name both capture paths.
241
+ request both times. Write each body to a JSON file in `.copilotkit/proof/`, and send it with
242
+ `npx --prefer-offline --yes copilotkit@4.28.0 verify --send-run <file> --agent <agent id> --json`.
243
+ The command sends the body to `<runtime>/agent/<agent id>/run` and reads the events the run
244
+ streams. It writes them to `<file name>.events.jsonl` beside the body, and prints that path
245
+ with the answer text and the tool calls. Do not send a run with `curl` and read its events
246
+ with a client of your own. A managed runtime streams the events over the gateway, behind a
247
+ join token that expires 30 seconds after the run starts. Name both capture paths.
234
248
 
235
249
  For the changed run, pick one record the step 1 request matches. Add a marker to a text
236
250
  field that the answer repeats and that the step 1 request does not quote, such as its title
@@ -243,7 +257,8 @@ nothing to copy invents records. That failure belongs to the probe, not to the i
243
257
 
244
258
  Read each answer against the context it carried. The run carrying the page's context has to
245
259
  name the project's own records and no others. The run carrying the changed entry has to
246
- carry the marker, character for character, and name no record its context did not hold. A
260
+ carry the marker's 8 hex characters anywhere in it, in any case and with any punctuation
261
+ around them, and name no record its context did not hold. The model can reword the rest. A
247
262
  model that the context never reaches cannot produce the marker. A model that invents a
248
263
  different record on every call cannot produce it either, so two answers that only differ
249
264
  prove nothing. An answer without the marker means the page's data is not reaching the model.
@@ -270,8 +285,8 @@ Read the registrations this project's frontend declares, by name. Step 5a alread
270
285
  step 1 request with those declarations, so read the tool calls out of the events Step 5a
271
286
  captured for the run carrying the page's unchanged context. Do not send that request again.
272
287
  Where Step 5a sent no run because the proof checks needed `--thread`, send no run here
273
- either. Where Step 5a sent no run, because this journey shares no page data, send the step 1 request
274
- to `<runtime>/agent/<agent id>/run`, carrying those declarations, and read the tool calls out
288
+ either. Where Step 5a sent no run, because this journey shares no page data, send the step 1 request,
289
+ carrying those declarations, with `verify --send-run` the way Step 5a does, and read the tool calls out
275
290
  of that run's own events. Where the Step 5a run carried none of those declarations, send
276
291
  that run once more with them, and read that run instead. Never report a wiring gap from a run
277
292
  that carried no declarations: the agent has no component to call in it. The agent has to call one of the names the frontend registered. An
@@ -302,7 +317,7 @@ For a recorded `both-oss` starting state, this step has no component to render.
302
317
  same request the baseline recorded, require the same kind of user-visible result the
303
318
  baseline produced, and require that the thread for that request is listed in the drawer.
304
319
  Where this journey's frontend framework ships no threads drawer -- React Native --, prove
305
- that thread with `npx --prefer-offline --yes copilotkit@4.27.0 verify --round-trip`, which reads the
320
+ that thread with `npx --prefer-offline --yes copilotkit@4.28.0 verify --round-trip`, which reads the
306
321
  answer back off the thread and needs no browser. Where the proof checks needed `--thread`,
307
322
  prove the thread for this request with `verify --thread <id>` instead. Record which of the
308
323
  two you proved.
@@ -332,7 +347,7 @@ limit can be ten minutes. You cannot interrupt a call while it runs, so the limi
332
347
  what you do after one. If a browser call took longer than 60 seconds to return, the browser
333
348
  control is unresponsive. Do not call the browser again in this attempt. A second call to a
334
349
  hung tool waits as long as the first one did. Run
335
- `npx --prefer-offline --yes copilotkit@4.27.0 verify --frontend-url <the frontendUrl the proof checks resolved> --json` once,
350
+ `npx --prefer-offline --yes copilotkit@4.28.0 verify --frontend-url <the frontendUrl the proof checks resolved> --json` once,
336
351
  and record the `frontend_assets_served` result. Report the outcome `failed` with the cause
337
352
  `browser-control-unresponsive`. The application is not at fault on this evidence: every
338
353
  step before the browser proved the runtime without one, and no repair to the project can
@@ -342,7 +357,7 @@ reach the tool.
342
357
  the page to finish loading. Do not retype the host, and do not substitute a URL a tool
343
358
  offers you by default. Where the page loads but its styling is missing or the chat
344
359
  control is dead, run
345
- `npx --prefer-offline --yes copilotkit@4.27.0 verify --frontend-url <the url you opened> --json`
360
+ `npx --prefer-offline --yes copilotkit@4.28.0 verify --frontend-url <the url you opened> --json`
346
361
  before you diagnose anything else. A dev server can serve its page and refuse every
347
362
  static chunk behind it, and on screen that is indistinguishable from a broken
348
363
  integration. The `frontend_assets_served` check tells the two apart.
@@ -356,7 +371,10 @@ reach the tool.
356
371
  turn is finished when the streamed text stops growing and the generative UI component
357
372
  has rendered. For a recorded `both-oss` starting state, this step has no component, and
358
373
  the turn is finished when the streamed text stops growing.
359
- 6. Take one screenshot of the finished turn and record where you wrote it.
374
+ 6. Take one screenshot of the finished turn, and record its path. Where the browser tool
375
+ takes a path, save it in `.copilotkit/proof/`. A tool that writes into its own output
376
+ folder, such as `.playwright-mcp/`, can keep it there. Never save it among the project's
377
+ own files.
360
378
  7. Read the browser console a second time, and record every error that step 3 did not
361
379
  already list. Those belong to the request.
362
380
  8. Read the network requests. Record every request the page made to the runtime endpoint
@@ -446,42 +464,7 @@ it, rather than reading the compatibility field as a pass.
446
464
 
447
465
  For every other starting state, record Step 8 as not applicable.
448
466
 
449
- The application edit ban ends only after Step 8 passes or is recorded as not applicable.
450
- Step 9 can write only the tool files named by its guide or by this step.
451
-
452
- ## Step 9 -- Set up the continued-development tools
453
-
454
- Fetch the continued-development guide from the main coding agent with the proof
455
- documentation. Try the continued-development tools after the application passes proof.
456
-
457
- The implementation subagent installs the Skills unless the developer declined them. Check that
458
- it did. Look for the `.agents/skills` directory and the `.claude/skills` links in this
459
- project, and read the Skills result the implementation reported. Do not install them again.
460
-
461
- Where the developer declined them, do not install them, and do not call that a change from
462
- the plan. Report the command for them to run later instead:
463
- `npx skills add CopilotKit/CopilotKit/skills -y`.
464
-
465
- Where the developer did not decline them and they are missing, install them as a recovery step.
466
- Tell the developer what the skills install writes into this project before you run it: a
467
- `.agents/skills` directory holding one folder per CopilotKit skill, linked into
468
- `.claude/skills`. Both sit in the working tree, so the install shows up in `git status`
469
- and can land in a commit. You cannot know whether this project keeps those directories in
470
- version control, so name them before you write them rather than after. Then run
471
- `npx skills add CopilotKit/CopilotKit/skills -y` to install the
472
- project-scoped CopilotKit Skills.
473
- <!-- sandboxed-harness -->
474
- It needs the network, so in a sandbox request escalation for it on its first run.
475
- <!-- /sandboxed-harness -->
476
- Record that the proof ran the install because the implementation did not.
477
-
478
- Do not register an MCP server: the Skills read the CopilotKit documentation without one.
479
-
480
- Check whether the install succeeded and record what you found. Record the command result.
481
- Report the Skills result separately from the proof result. A tool error does not change the
482
- proof result: this journey proved or it did not, whatever the install did.
483
-
484
- ## Step 10 -- Return the result
467
+ ## Step 9 -- Return the result
485
468
 
486
469
  Start with `Status: passed`, `Status: failed`, or `Status: blocked`.
487
470
  Use `Status: passed` when the proof attempt completed with `performed`,
@@ -36,17 +36,17 @@ Before you show the best-effort plan, require this complete packet:
36
36
  Before you end your turn to wait for the developer, report the pause:
37
37
 
38
38
  ```text
39
- npx --prefer-offline --yes copilotkit@4.27.0 onboard checkpoint --phase awaiting-developer
39
+ npx --prefer-offline --yes copilotkit@4.28.0 onboard checkpoint --phase awaiting-developer
40
40
  ```
41
41
 
42
42
  After the developer approves the best-effort plan, run
43
- `npx --prefer-offline --yes copilotkit@4.27.0 onboard read fallback/best-effort`.
43
+ `npx --prefer-offline --yes copilotkit@4.28.0 onboard read fallback/best-effort`.
44
44
 
45
45
  Send one short report. The friction command follows the telemetry setting the developer
46
46
  already chose, so it needs no separate question.
47
47
 
48
48
  ```text
49
- npx --prefer-offline --yes copilotkit@4.27.0 onboard friction --phase stop --category <slug> --message "<sentences>"
49
+ npx --prefer-offline --yes copilotkit@4.28.0 onboard friction --phase stop --category <slug> --message "<sentences>"
50
50
  ```
51
51
 
52
52
  `--message` takes one or two sentences: the step you stopped at and what stopped it.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "copilotkit",
3
- "version": "4.27.0",
3
+ "version": "4.28.0",
4
4
  "type": "module",
5
5
  "engines": {
6
6
  "node": ">=20.9.0"
@@ -14984,7 +14984,7 @@ init_define_CLI_LOCAL_EVALUATION_SUPPORT();
14984
14984
 
14985
14985
  // apps/cli/src/config.ts
14986
14986
  function getTemplateRef() {
14987
- return true ? "3cddb360660503325b24564820c78a2ad7ee1843" : "main";
14987
+ return true ? "c616389550105d5a96d74501f77c6921aa79ecee" : "main";
14988
14988
  }
14989
14989
 
14990
14990
  // apps/cli/src/services/agentcore-config.ts
@@ -15182,6 +15182,13 @@ var TELEMETRY_ERROR_CODES = {
15182
15182
  * tell "the caller guessed a slug" from a malformed request.
15183
15183
  */
15184
15184
  PROJECT_NOT_FOUND: "PROJECT_NOT_FOUND",
15185
+ /**
15186
+ * `init --create` named a project the active organization already has.
15187
+ * Distinct from {@link TELEMETRY_ERROR_CODES.PROJECT_NOT_FOUND}, which it was
15188
+ * tagged as, so the dashboard counted a taken name as a missing project
15189
+ * (PE-784).
15190
+ */
15191
+ PROJECT_NAME_TAKEN: "PROJECT_NAME_TAKEN",
15185
15192
  /**
15186
15193
  * `project select` persisted the record and the key-provisioning call did
15187
15194
  * not succeed. Buckets as `network` because that is what it almost always