copilotkit 4.26.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 +418 -40
  2. package/cli-build-info.json +7 -7
  3. package/index.js +15343 -9085
  4. package/onboarding/index.json +3 -2
  5. package/onboarding/prompts/authenticate/start.md +48 -56
  6. package/onboarding/prompts/conversion/plan.md +3 -3
  7. package/onboarding/prompts/credentials/finalize-plan.md +42 -29
  8. package/onboarding/prompts/credentials/plan.md +50 -34
  9. package/onboarding/prompts/credentials/settle-credentials.md +38 -14
  10. package/onboarding/prompts/credentials/write-plan.md +122 -47
  11. package/onboarding/prompts/deployment/choose-local.md +17 -20
  12. package/onboarding/prompts/deployment/local-evaluation.md +45 -21
  13. package/onboarding/prompts/fallback/best-effort.md +14 -16
  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 +10 -8
  18. package/onboarding/prompts/feature/channels/implement.md +11 -8
  19. package/onboarding/prompts/feature/channels/plan.md +15 -7
  20. package/onboarding/prompts/feature/channels/proof.md +8 -7
  21. package/onboarding/prompts/feature/channels/start.md +11 -10
  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 +10 -8
  26. package/onboarding/prompts/feature/complete.md +2 -2
  27. package/onboarding/prompts/feature/learning/implement.md +14 -12
  28. package/onboarding/prompts/feature/learning/plan.md +4 -4
  29. package/onboarding/prompts/feature/learning/proof.md +24 -14
  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 +10 -8
  35. package/onboarding/prompts/feature/realtime-sync/implement.md +7 -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 +8 -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 +10 -8
  48. package/onboarding/prompts/framework/ag2.md +20 -5
  49. package/onboarding/prompts/framework/agno.md +25 -9
  50. package/onboarding/prompts/framework/built-in.md +21 -6
  51. package/onboarding/prompts/framework/claude-sdk-python.md +11 -5
  52. package/onboarding/prompts/framework/claude-sdk-typescript.md +13 -6
  53. package/onboarding/prompts/framework/crewai-flows.md +24 -10
  54. package/onboarding/prompts/framework/custom-ag-ui.md +62 -28
  55. package/onboarding/prompts/framework/deep-agents.md +26 -9
  56. package/onboarding/prompts/framework/google-adk.md +18 -5
  57. package/onboarding/prompts/framework/langgraph-fastapi.md +20 -5
  58. package/onboarding/prompts/framework/langgraph-python.md +20 -5
  59. package/onboarding/prompts/framework/langgraph-typescript.md +27 -7
  60. package/onboarding/prompts/framework/llamaindex.md +24 -8
  61. package/onboarding/prompts/framework/mastra.md +21 -8
  62. package/onboarding/prompts/framework/ms-agent-dotnet.md +24 -6
  63. package/onboarding/prompts/framework/ms-agent-harness-dotnet.md +24 -5
  64. package/onboarding/prompts/framework/ms-agent-python.md +21 -5
  65. package/onboarding/prompts/framework/pydantic-ai.md +20 -5
  66. package/onboarding/prompts/framework/strands-python.md +27 -12
  67. package/onboarding/prompts/framework/strands-typescript.md +27 -12
  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 +21 -13
  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 +27 -20
  75. package/onboarding/prompts/proof/complete.md +9 -7
  76. package/onboarding/prompts/proof/oss-baseline.md +9 -6
  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 +54 -202
  83. package/onboarding/prompts/starter/clone.md +141 -57
  84. package/onboarding/prompts/stopped/run-failed.md +5 -3
  85. package/onboarding/prompts/subagent/create-plan.md +73 -22
  86. package/onboarding/prompts/subagent/implement-and-validate.md +27 -34
  87. package/onboarding/prompts/subagent/inspect-repository.md +3 -2
  88. package/onboarding/prompts/subagent/prove-oss-baseline.md +10 -5
  89. package/onboarding/prompts/subagent/prove-round-trip.md +46 -54
  90. package/onboarding/prompts/unsupported/no-validated-path.md +5 -4
  91. package/package.json +1 -1
  92. package/release/release-tool.js +19 -2
@@ -26,6 +26,22 @@ bring them into the run root before you report, and name them under Files change
26
26
  completion step verifies that the changed files exist in this project, so work left in
27
27
  another tree ends the run with nothing in the developer's hands.
28
28
 
29
+ <!-- sandboxed-harness -->
30
+ If your harness runs commands in a sandbox, a sandboxed command has no network, cannot
31
+ listen on a port, and cannot connect to localhost. It does not always fail: a package
32
+ install can wait with no output until you stop it. So request escalation on the first run,
33
+ not after a hang or an error, for these commands:
34
+
35
+ - the dependency install,
36
+ - the commands that start the app and agent servers,
37
+ - HTTP requests to those servers.
38
+
39
+ Where the harness takes a prefix rule, request one for each command, all at once.
40
+ <!-- /sandboxed-harness -->
41
+
42
+ If a command hangs with no output, or fails because it has no network or cannot listen on a
43
+ port, a sandbox probably blocked it. Stop it and run it again with escalation.
44
+
29
45
  Before validation, inspect the current changed and untracked paths. Leave out the paths that
30
46
  were already changed or untracked when the run started and that this run did not edit.
31
47
  Compare every other changed path with the paths the plan named. If a changed path
@@ -84,6 +100,13 @@ Wiring is not behavior. Add the CopilotKit SDK dependency, wrap the agent in the
84
100
  middleware, mount the runtime, connect AG-UI, and render what the agent already returns.
85
101
  Those are the parts this run adds.
86
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
+
87
110
  A run whose `environmentPath` ends in `.env.local` hosts the CopilotKit runtime in that
88
111
  Next.js app, never in a separate server: no other process reads the key from that file.
89
112
 
@@ -110,10 +133,10 @@ new one. After wiring, run the recorded baseline checks and report any regressio
110
133
 
111
134
  Where the plan names a CopilotKit dependency upgrade, apply its moves before you wire
112
135
  Intelligence: declare each exact version in its app's manifest, then install with the
113
- project's package manager. Then check the installed tree:
136
+ project's package manager, under the install rule above. Then check the installed tree:
114
137
 
115
138
  ```text
116
- npx --prefer-offline --yes copilotkit@4.26.0 onboard upgrade-plan --check --json
139
+ npx --prefer-offline --yes copilotkit@4.28.0 onboard upgrade-plan --check --json
117
140
  ```
118
141
 
119
142
  `single` means every direct dependency resolved to one version. `duplicates` names each
@@ -128,7 +151,7 @@ If the check finds duplicates or the baseline regresses, put the manifests and l
128
151
  back, leave Intelligence unwired, and report what failed:
129
152
 
130
153
  ```text
131
- npx --prefer-offline --yes copilotkit@4.26.0 onboard upgrade-plan --revert --json
154
+ npx --prefer-offline --yes copilotkit@4.28.0 onboard upgrade-plan --revert --json
132
155
  ```
133
156
 
134
157
  Then end your turn. Never add an `overrides`, `resolutions`, or `pnpm.overrides` block to
@@ -164,7 +187,7 @@ Where the plan names a Learning Container id, check that the container exists fi
164
187
  this from the target app directory, before you write any selector:
165
188
 
166
189
  ```text
167
- npx --prefer-offline --yes copilotkit@4.26.0 learning containers get <id> --json
190
+ npx --prefer-offline --yes copilotkit@4.28.0 learning containers get <id> --json
168
191
  ```
169
192
 
170
193
  `"status": "success"` means the container exists. An `error.code` of
@@ -186,36 +209,6 @@ constructor for it, and never write an id the plan does not name: a selector poi
186
209
  id the platform does not hold answers `LEARNING_CONTAINER_NOT_FOUND` on every thread create.
187
210
  Where the plan names no container, write no selector.
188
211
 
189
- ## Install the CopilotKit Skills
190
-
191
- The main coding agent gives you the developer's answer on the Skills install. Where the
192
- whole-plan implementation handoff carries no answer, read the approved plan. Approving the
193
- plan without a word on the Skills approves the install. A repair handoff that carries no
194
- Skills answer never installs them.
195
-
196
- Where `.agents/skills` already holds the CopilotKit skills, do not install them again.
197
- Report that they are in place.
198
-
199
- Install the Skills only when the developer approved them. Where the developer declined
200
- them, do not install them, and do not call that a change from the plan. Report in the
201
- Validation section that the developer declined them.
202
-
203
- Install them after you run the full validation list. Tell the developer what the skills
204
- install writes into this project before you run it: a `.agents/skills` directory holding
205
- one folder per CopilotKit skill, linked into `.claude/skills`. Both sit in the working tree,
206
- so the install shows up in `git status` and can land in a commit. You cannot know whether
207
- this project keeps those directories in version control, so name them before you write them
208
- rather than after.
209
-
210
- Then run `npx skills add CopilotKit/CopilotKit/skills -y` in the target app directory.
211
-
212
- The plan names both directories under `Files the run writes itself`, so they are not
213
- departures. Name them under Files changed. Do not register an MCP server: the Skills read
214
- the CopilotKit documentation without one.
215
-
216
- Check whether the install succeeded, and record the command result in the Validation
217
- section. A failed install does not change your status. Report it and continue.
218
-
219
212
  ## Report the result
220
213
 
221
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.26.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
@@ -58,7 +58,8 @@ Find evidence for:
58
58
  `detection` block the CLI proposed
59
59
  - for an existing agent in no listed framework, whether it speaks AG-UI: a class that
60
60
  extends `AbstractAgent` and implements `run`, or an endpoint that streams AG-UI events.
61
- Cite the file
61
+ If it does not, name its entry point: the function or HTTP route that runs it. Cite the
62
+ file
62
63
  - current CopilotKit integration and configuration
63
64
  - authentication boundaries
64
65
  - initial changed and untracked paths, without file contents
@@ -13,12 +13,15 @@ instance of next dev running?`. A free port does not help. If a `next dev` proce
13
13
  runs from this app, reuse that server. Prove against its port. If a start still fails with
14
14
  that message, name the process that holds the lock. Give its PID and working directory.
15
15
 
16
+ <!-- sandboxed-harness -->
16
17
  If your harness runs commands in a sandbox, a sandboxed command cannot listen on a port or
17
18
  connect to localhost. Before the first server start, request escalation with a prefix rule
18
19
  for the project's own dev script. Before the first request to a local server, request
19
- escalation with a prefix rule for `curl`. If a local request still fails after 0 ms
20
- (`Failed to connect ... after 0 ms`) while the port shows a listener, the sandbox blocked
21
- it. Run it again with escalation, and do not record a failed predicate or step.
20
+ escalation with a prefix rule for `curl`.
21
+ <!-- /sandboxed-harness -->
22
+ If a local request fails after 0 ms (`Failed to connect ... after 0 ms`) while the port
23
+ shows a listener, a sandbox blocked it. Run it again with escalation, and do not record a
24
+ failed predicate or step.
22
25
 
23
26
  Prove the live runtime in this order:
24
27
 
@@ -32,8 +35,10 @@ Prove the live runtime in this order:
32
35
  4. Confirm from project files that the runtime constructor passes a `runner` option rather
33
36
  than an `intelligence` option. A package, import, project file, or key is not use proof.
34
37
  5. Run
35
- `npx --prefer-offline --yes copilotkit@4.26.0 verify --expect-runtime oss --round-trip --agent <expected-agent-id> --json`,
36
- with the runtime URL or auth header options that this project needs. Require exit zero
38
+ `npx --prefer-offline --yes copilotkit@4.28.0 verify --expect-runtime oss --round-trip --agent <expected-agent-id> --json`,
39
+ with the runtime URL or auth header options that this project needs. Add
40
+ `--runtime-url <url>` when the report names a runtime URL the dev server does not
41
+ serve. Require exit zero
37
42
  and the JSON `ok` field to be `true`.
38
43
  6. Drive one real request through the existing frontend, CopilotKit runtime, and expected
39
44
  agent. Require the existing user-visible result.
@@ -25,11 +25,12 @@ render, and never report a round trip proved by a prompt this run rewrote.
25
25
 
26
26
  Run the steps below in the order they appear. They are the proof. Do not design a
27
27
  different sequence of your own, and do not drop a step because an earlier one looked
28
- convincing. Step 6 has a web form and a React Native form: run the one that matches this
28
+ convincing. A check that passed is the evidence for what it checks. Send only the requests
29
+ the steps name: no SDK calls, AG-UI requests, or thread reads of your own to confirm a pass. Step 6 has a web form and a React Native form: run the one that matches this
29
30
  journey's frontend, and run only that one.
30
31
 
31
32
  A run that cloned a starter is the one exception. When the main coding agent tells you
32
- 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
33
34
  or device, and report `skipped-cloned-starter` as the surface-check outcome.
34
35
 
35
36
  Where this is a second attempt after a repair, run every step from the proof checks through
@@ -75,7 +76,7 @@ about the failure it was spawned to clear.
75
76
  Run this from the target app directory:
76
77
 
77
78
  ```text
78
- npx --prefer-offline --yes copilotkit@4.26.0 onboard proof-check --json
79
+ npx --prefer-offline --yes copilotkit@4.28.0 onboard proof-check --json
79
80
  ```
80
81
 
81
82
  It starts each app's `dev` script unless a server from that app already listens, and
@@ -88,8 +89,12 @@ It starts only the apps that depend on CopilotKit. If the agent runs somewhere e
88
89
  example a Python agent or a root script that starts both halves, pass the start command
89
90
  from your Step 1 record with `--server <directory>=<command>`. A relative `<directory>` is
90
91
  read from the directory you run the command in, so a sibling agent folder is `../agent`. It
91
- does not start an app inside that directory a second time. If your harness runs commands in a sandbox, request
92
- escalation for this command first: it starts servers and connects to localhost.
92
+ does not start an app inside that directory a second time.
93
+ <!-- sandboxed-harness -->
94
+ If your harness runs commands in a sandbox, request escalation for this command on its
95
+ first run: it starts servers and connects to localhost. Request a prefix rule for `curl`
96
+ in the same request, because Steps 5a and 5b send local requests too.
97
+ <!-- /sandboxed-harness -->
93
98
 
94
99
  When `status` is `passed`, record `servers`, with their process IDs and stop commands, for
95
100
  the handoff, and take the URL to open from `frontendUrl`. If `frontendUrl` is absent, the
@@ -97,8 +102,9 @@ project named no port the CLI can read: take the URL from the frontend server's
97
102
  use `localhost` as its host.
98
103
 
99
104
  A pass on `runtime-process-in-project` proves only that the process runs inside this
100
- project. Ask the running agent which graph or agent ID it serves, and compare that with the
101
- expected agent ID from Step 1. If they differ, an older build still answers on the port.
105
+ project. Read the agent IDs the runtime declares from the `verify:runtime_agents_declared`
106
+ detail, and compare them with the expected agent ID from Step 1. Do not send a request of
107
+ your own for them. If they differ, an older build still answers on the port.
102
108
  Report it, and stop it only under the rule below. The servers keep running after
103
109
  the proof. Then go to Step 5a. On Windows, and in a container that hides which process
104
110
  holds a port, the CLI cannot read the port's owner. There `runtime-process-in-project` is
@@ -126,7 +132,7 @@ Otherwise sort `firstFailure`, and run the command again after each repair:
126
132
  asking. Read the port from the log, not from the plan, and record it:
127
133
 
128
134
  ```text
129
- npx --prefer-offline --yes copilotkit@4.26.0 onboard runtime-url --url <runtime-url>
135
+ npx --prefer-offline --yes copilotkit@4.28.0 onboard runtime-url --url <runtime-url>
130
136
  ```
131
137
 
132
138
  `<runtime-url>` is the project's runtime URL, or the plan's, with its port replaced by the
@@ -171,6 +177,13 @@ Otherwise sort `firstFailure`, and run the command again after each repair:
171
177
 
172
178
  Where the handoff carries a thread id from the developer, skip the numbered steps above
173
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.
174
187
  - `round-trip:page_context_reaches_agent` at `fail`: the agent answered the plain request
175
188
  and recorded nothing for the request that carried context. Return it with its evidence as
176
189
  a failed proof step. At `undetermined` and marked `advisory`, the agent answered without
@@ -206,10 +219,11 @@ for the same reason. Skip both steps and send no run. Record that they sent no r
206
219
  reason, and prove the page's data and the component in the browser instead, at Steps 6
207
220
  and 7.
208
221
 
209
- `verify --round-trip` asks a question that needs no context. Where the frontend's files
210
- call a context hook, it also sends one token as context and reports
211
- `page_context_reaches_agent`, whose `pass` proves that the agent's model sees context at
212
- 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
213
227
  `undetermined`, and this step is then the only proof of the path. A `pass` does not prove
214
228
  that the page's own entries arrive in the shape the agent reads. Nothing else before the
215
229
  browser reads that path, so a page whose data the agent never sees answers fluently over a
@@ -222,9 +236,15 @@ the agent sees the request the browser sends rather than a thinner one. Read the
222
236
  files the main coding agent named in the handoff, and search the project only for a file it
223
237
  did not name. Do not search the dependencies for the shape of an entry: the page's own call
224
238
  shows it. Send the same run
225
- 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
226
240
  publishes, and once carrying the same entries with one value changed. Use the step 1
227
- 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.
228
248
 
229
249
  For the changed run, pick one record the step 1 request matches. Add a marker to a text
230
250
  field that the answer repeats and that the step 1 request does not quote, such as its title
@@ -237,7 +257,8 @@ nothing to copy invents records. That failure belongs to the probe, not to the i
237
257
 
238
258
  Read each answer against the context it carried. The run carrying the page's context has to
239
259
  name the project's own records and no others. The run carrying the changed entry has to
240
- 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
241
262
  model that the context never reaches cannot produce the marker. A model that invents a
242
263
  different record on every call cannot produce it either, so two answers that only differ
243
264
  prove nothing. An answer without the marker means the page's data is not reaching the model.
@@ -264,8 +285,8 @@ Read the registrations this project's frontend declares, by name. Step 5a alread
264
285
  step 1 request with those declarations, so read the tool calls out of the events Step 5a
265
286
  captured for the run carrying the page's unchanged context. Do not send that request again.
266
287
  Where Step 5a sent no run because the proof checks needed `--thread`, send no run here
267
- either. Where Step 5a sent no run, because this journey shares no page data, send the step 1 request
268
- 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
269
290
  of that run's own events. Where the Step 5a run carried none of those declarations, send
270
291
  that run once more with them, and read that run instead. Never report a wiring gap from a run
271
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
@@ -296,7 +317,7 @@ For a recorded `both-oss` starting state, this step has no component to render.
296
317
  same request the baseline recorded, require the same kind of user-visible result the
297
318
  baseline produced, and require that the thread for that request is listed in the drawer.
298
319
  Where this journey's frontend framework ships no threads drawer -- React Native --, prove
299
- that thread with `npx --prefer-offline --yes copilotkit@4.26.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
300
321
  answer back off the thread and needs no browser. Where the proof checks needed `--thread`,
301
322
  prove the thread for this request with `verify --thread <id>` instead. Record which of the
302
323
  two you proved.
@@ -326,7 +347,7 @@ limit can be ten minutes. You cannot interrupt a call while it runs, so the limi
326
347
  what you do after one. If a browser call took longer than 60 seconds to return, the browser
327
348
  control is unresponsive. Do not call the browser again in this attempt. A second call to a
328
349
  hung tool waits as long as the first one did. Run
329
- `npx --prefer-offline --yes copilotkit@4.26.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,
330
351
  and record the `frontend_assets_served` result. Report the outcome `failed` with the cause
331
352
  `browser-control-unresponsive`. The application is not at fault on this evidence: every
332
353
  step before the browser proved the runtime without one, and no repair to the project can
@@ -336,7 +357,7 @@ reach the tool.
336
357
  the page to finish loading. Do not retype the host, and do not substitute a URL a tool
337
358
  offers you by default. Where the page loads but its styling is missing or the chat
338
359
  control is dead, run
339
- `npx --prefer-offline --yes copilotkit@4.26.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`
340
361
  before you diagnose anything else. A dev server can serve its page and refuse every
341
362
  static chunk behind it, and on screen that is indistinguishable from a broken
342
363
  integration. The `frontend_assets_served` check tells the two apart.
@@ -350,7 +371,10 @@ reach the tool.
350
371
  turn is finished when the streamed text stops growing and the generative UI component
351
372
  has rendered. For a recorded `both-oss` starting state, this step has no component, and
352
373
  the turn is finished when the streamed text stops growing.
353
- 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.
354
378
  7. Read the browser console a second time, and record every error that step 3 did not
355
379
  already list. Those belong to the request.
356
380
  8. Read the network requests. Record every request the page made to the runtime endpoint
@@ -440,39 +464,7 @@ it, rather than reading the compatibility field as a pass.
440
464
 
441
465
  For every other starting state, record Step 8 as not applicable.
442
466
 
443
- The application edit ban ends only after Step 8 passes or is recorded as not applicable.
444
- Step 9 can write only the tool files named by its guide or by this step.
445
-
446
- ## Step 9 -- Set up the continued-development tools
447
-
448
- Fetch the continued-development guide from the main coding agent with the proof
449
- documentation. Try the continued-development tools after the application passes proof.
450
-
451
- The implementation subagent installs the Skills when the developer approved them. Check that
452
- it did. Look for the `.agents/skills` directory and the `.claude/skills` links in this
453
- project, and read the Skills result the implementation reported. Do not install them again.
454
-
455
- Where the developer declined them, do not install them, and do not call that a change from
456
- the plan. Report the command for them to run later instead:
457
- `npx skills add CopilotKit/CopilotKit/skills -y`.
458
-
459
- Where the developer approved them and they are missing, install them as a recovery step.
460
- Tell the developer what the skills install writes into this project before you run it: a
461
- `.agents/skills` directory holding one folder per CopilotKit skill, linked into
462
- `.claude/skills`. Both sit in the working tree, so the install shows up in `git status`
463
- and can land in a commit. You cannot know whether this project keeps those directories in
464
- version control, so name them before you write them rather than after. Then run
465
- `npx skills add CopilotKit/CopilotKit/skills -y` to install the
466
- project-scoped CopilotKit Skills. Record that the proof ran the install because the
467
- implementation did not.
468
-
469
- Do not register an MCP server: the Skills read the CopilotKit documentation without one.
470
-
471
- Check whether the install succeeded and record what you found. Record the command result.
472
- Report the Skills result separately from the proof result. A tool error does not change the
473
- proof result: this journey proved or it did not, whatever the install did.
474
-
475
- ## Step 10 -- Return the result
467
+ ## Step 9 -- Return the result
476
468
 
477
469
  Start with `Status: passed`, `Status: failed`, or `Status: blocked`.
478
470
  Use `Status: passed` when the proof attempt completed with `performed`,
@@ -10,7 +10,8 @@ If the CLI stopped this run with `## Stop: this run deleted or moved the develop
10
10
  name each path and change it listed, in the words it printed. A report that says only that
11
11
  files changed cannot be acted on: nobody reading it can tell which file moved.
12
12
  This step prints `## The developer's files` below: relay that report as printed, with its
13
- restore command.
13
+ restore command. When the report says the run started in an empty folder, relay that one
14
+ line alone: list no files and offer no restore.
14
15
 
15
16
  Stop onboarding without making more repository changes by default.
16
17
 
@@ -35,17 +36,17 @@ Before you show the best-effort plan, require this complete packet:
35
36
  Before you end your turn to wait for the developer, report the pause:
36
37
 
37
38
  ```text
38
- npx --prefer-offline --yes copilotkit@4.26.0 onboard checkpoint --phase awaiting-developer
39
+ npx --prefer-offline --yes copilotkit@4.28.0 onboard checkpoint --phase awaiting-developer
39
40
  ```
40
41
 
41
42
  After the developer approves the best-effort plan, run
42
- `npx --prefer-offline --yes copilotkit@4.26.0 onboard read fallback/best-effort`.
43
+ `npx --prefer-offline --yes copilotkit@4.28.0 onboard read fallback/best-effort`.
43
44
 
44
45
  Send one short report. The friction command follows the telemetry setting the developer
45
46
  already chose, so it needs no separate question.
46
47
 
47
48
  ```text
48
- npx --prefer-offline --yes copilotkit@4.26.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>"
49
50
  ```
50
51
 
51
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.26.0",
3
+ "version": "4.28.0",
4
4
  "type": "module",
5
5
  "engines": {
6
6
  "node": ">=20.9.0"
@@ -14931,7 +14931,7 @@ var FLAG_DEFINITIONS = defineFlags({
14931
14931
  // gateway stores browser event batches. Both surfaces read the derived
14932
14932
  // FF_LEARNING_TRAJECTORIES override; the gateway mirrors the env default.
14933
14933
  "learning.trajectories": {
14934
- purpose: "Gates Trajectory capture, saved reads, and Trajectory sessions as a Learning source in app-api, the realtime gateway, the web app, and the Learning scheduler and runners.",
14934
+ purpose: "Gates Trajectory capture, saved reads, live viewing, and Trajectory sessions as a Learning source in app-api, the realtime gateway, the web app, and the Learning scheduler and runners. Live viewing also requires learning.trajectory-live-view.",
14935
14935
  owner: "learning",
14936
14936
  createdAt: "2026-10-01",
14937
14937
  status: "rollout",
@@ -14944,6 +14944,16 @@ var FLAG_DEFINITIONS = defineFlags({
14944
14944
  ],
14945
14945
  defaultByEnv: { dev: true, ci: true, prod: false }
14946
14946
  },
14947
+ // Keep existing capture deployments on saved reads until every API and gateway
14948
+ // replica supports live viewing and descending history. CI exercises both paths.
14949
+ "learning.trajectory-live-view": {
14950
+ purpose: "Enables operator live viewing and newest-first history after app-api and every realtime gateway replica support them.",
14951
+ owner: "learning",
14952
+ createdAt: "2026-10-09",
14953
+ status: "rollout",
14954
+ surfaces: ["app-api", "realtime-gateway", "app-frontend"],
14955
+ defaultByEnv: { dev: false, ci: true, prod: false }
14956
+ },
14947
14957
  "analytics.pipeline": {
14948
14958
  purpose: "Gates project-scoped analytics reads and realtime projection while the durable pipeline rolls out.",
14949
14959
  owner: "analytics",
@@ -14974,7 +14984,7 @@ init_define_CLI_LOCAL_EVALUATION_SUPPORT();
14974
14984
 
14975
14985
  // apps/cli/src/config.ts
14976
14986
  function getTemplateRef() {
14977
- return true ? "6c428329c9b81b3aa7e92b602ab1c0a9431d36a3" : "main";
14987
+ return true ? "c616389550105d5a96d74501f77c6921aa79ecee" : "main";
14978
14988
  }
14979
14989
 
14980
14990
  // apps/cli/src/services/agentcore-config.ts
@@ -15172,6 +15182,13 @@ var TELEMETRY_ERROR_CODES = {
15172
15182
  * tell "the caller guessed a slug" from a malformed request.
15173
15183
  */
15174
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",
15175
15192
  /**
15176
15193
  * `project select` persisted the record and the key-provisioning call did
15177
15194
  * not succeed. Buckets as `network` because that is what it almost always