copilotkit 4.9.37 → 4.9.50

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 (67) hide show
  1. package/README.md +185 -7
  2. package/cli-build-info.json +7 -7
  3. package/index.js +7908 -4788
  4. package/onboarding/index.json +162 -1
  5. package/onboarding/prompts/authenticate/start.md +33 -16
  6. package/onboarding/prompts/conversion/plan.md +3 -3
  7. package/onboarding/prompts/credentials/finalize-plan.md +13 -13
  8. package/onboarding/prompts/credentials/plan.md +20 -20
  9. package/onboarding/prompts/fallback/best-effort.md +6 -6
  10. package/onboarding/prompts/feature/a2ui/implement.md +32 -0
  11. package/onboarding/prompts/feature/a2ui/proof.md +34 -0
  12. package/onboarding/prompts/feature/a2ui/start.md +55 -0
  13. package/onboarding/prompts/feature/chat-suggestions/implement.md +28 -0
  14. package/onboarding/prompts/feature/chat-suggestions/proof.md +26 -0
  15. package/onboarding/prompts/feature/chat-suggestions/start.md +46 -0
  16. package/onboarding/prompts/feature/learning/implement.md +44 -0
  17. package/onboarding/prompts/feature/learning/proof.md +27 -0
  18. package/onboarding/prompts/feature/learning/start.md +52 -0
  19. package/onboarding/prompts/feature/open-generative-ui/implement.md +28 -0
  20. package/onboarding/prompts/feature/open-generative-ui/proof.md +27 -0
  21. package/onboarding/prompts/feature/open-generative-ui/start.md +47 -0
  22. package/onboarding/prompts/feature/realtime-sync/implement.md +38 -0
  23. package/onboarding/prompts/feature/realtime-sync/proof.md +28 -0
  24. package/onboarding/prompts/feature/realtime-sync/start.md +50 -0
  25. package/onboarding/prompts/feature/rich-threads/implement.md +41 -0
  26. package/onboarding/prompts/feature/rich-threads/proof.md +27 -0
  27. package/onboarding/prompts/feature/rich-threads/start.md +52 -0
  28. package/onboarding/prompts/feature/stop.md +41 -0
  29. package/onboarding/prompts/feature/voice/implement.md +28 -0
  30. package/onboarding/prompts/feature/voice/proof.md +27 -0
  31. package/onboarding/prompts/feature/voice/start.md +45 -0
  32. package/onboarding/prompts/framework/ag2.md +2 -2
  33. package/onboarding/prompts/framework/agno.md +2 -2
  34. package/onboarding/prompts/framework/built-in.md +2 -2
  35. package/onboarding/prompts/framework/claude-sdk-python.md +2 -2
  36. package/onboarding/prompts/framework/claude-sdk-typescript.md +2 -2
  37. package/onboarding/prompts/framework/crewai-flows.md +2 -2
  38. package/onboarding/prompts/framework/deep-agents.md +2 -2
  39. package/onboarding/prompts/framework/google-adk.md +2 -2
  40. package/onboarding/prompts/framework/langgraph-fastapi.md +2 -2
  41. package/onboarding/prompts/framework/langgraph-python.md +2 -2
  42. package/onboarding/prompts/framework/langgraph-typescript.md +2 -2
  43. package/onboarding/prompts/framework/llamaindex.md +2 -2
  44. package/onboarding/prompts/framework/mastra.md +2 -2
  45. package/onboarding/prompts/framework/ms-agent-dotnet.md +2 -2
  46. package/onboarding/prompts/framework/ms-agent-harness-dotnet.md +2 -2
  47. package/onboarding/prompts/framework/ms-agent-python.md +2 -2
  48. package/onboarding/prompts/framework/pydantic-ai.md +2 -2
  49. package/onboarding/prompts/framework/strands-python.md +2 -2
  50. package/onboarding/prompts/framework/strands-typescript.md +2 -2
  51. package/onboarding/prompts/frontend/angular.md +3 -3
  52. package/onboarding/prompts/frontend/nextjs.md +3 -3
  53. package/onboarding/prompts/frontend/plan.md +6 -6
  54. package/onboarding/prompts/frontend/react-native.md +2 -2
  55. package/onboarding/prompts/frontend/react-spa.md +2 -2
  56. package/onboarding/prompts/frontend/vue.md +2 -2
  57. package/onboarding/prompts/implementation/build-and-validate.md +33 -13
  58. package/onboarding/prompts/proof/complete.md +20 -7
  59. package/onboarding/prompts/proof/oss-baseline.md +5 -5
  60. package/onboarding/prompts/proof/round-trip.md +9 -9
  61. package/onboarding/prompts/starter/clone.md +5 -5
  62. package/onboarding/prompts/subagent/create-plan.md +11 -3
  63. package/onboarding/prompts/subagent/prove-oss-baseline.md +1 -1
  64. package/onboarding/prompts/subagent/prove-round-trip.md +29 -11
  65. package/onboarding/prompts/unsupported/no-validated-path.md +2 -2
  66. package/package.json +1 -1
  67. package/release/release-tool.js +37 -11
@@ -1,7 +1,7 @@
1
1
  # Prove the user journey
2
2
 
3
3
  Do not do the proof work yourself. Spawn one proof subagent. Tell it to run
4
- `npx --yes copilotkit@4.9.37 onboard read subagent/prove-round-trip` first and follow the
4
+ `npx --yes copilotkit@4.9.50 onboard read subagent/prove-round-trip` first and follow the
5
5
  prompt it returns. If that read fails because the subagent cannot use the shell, stop that
6
6
  subagent. Run the same command yourself, then spawn a fresh subagent with the returned prompt
7
7
  and the same handoff. Give it the selected framework, frontend, model, approved plan, selected
@@ -23,13 +23,13 @@ pass the time.
23
23
  Report each attempt at the journey as it ends, counting from one:
24
24
 
25
25
  ```text
26
- npx --yes copilotkit@4.9.37 onboard checkpoint --phase journey-attempted --attempt 1
26
+ npx --yes copilotkit@4.9.50 onboard checkpoint --phase journey-attempted --attempt 1
27
27
  ```
28
28
 
29
29
  Record what that proof returned before you route on it:
30
30
 
31
31
  ```text
32
- npx --yes copilotkit@4.9.37 onboard proof --step round-trip --outcome <passed|failed|skipped>
32
+ npx --yes copilotkit@4.9.50 onboard proof --step round-trip --outcome <passed|failed|skipped>
33
33
  ```
34
34
 
35
35
  Report the gate whatever it returned. A proof that never ran is `skipped`, not failed. The
@@ -37,7 +37,7 @@ command prints one line and sends nothing else. Where a repair cycle runs the pr
37
37
  record each attempt as it ends.
38
38
 
39
39
  For every protected-path audit in this prompt, run
40
- `npx --yes copilotkit@4.9.37 onboard audit` from the target app directory. If its result
40
+ `npx --yes copilotkit@4.9.50 onboard audit` from the target app directory. If its result
41
41
  starts with `Status: blocked`, report the printed reason and use the route-out rules below.
42
42
  A blocked audit proved nothing changed and is not a preservation failure. If a
43
43
  protected-path audit reports a changed path, decide it the way the implementation prompt
@@ -46,13 +46,13 @@ returns none, so a finding with no Files changed section to test against routes
46
46
  path one of those sections names is this run's own change and routes out too. Accept a
47
47
  path only when a section this run collected covers the step that wrote it and does not
48
48
  name it:
49
- `npx --yes copilotkit@4.9.37 onboard protect --accept-external --path <path>`. Then run
49
+ `npx --yes copilotkit@4.9.50 onboard protect --accept-external --path <path>`. Then run
50
50
  the audit again and name the path in the closing summary. Never repair, reset, or revert a
51
51
  protected path.
52
52
 
53
53
  If the proof result starts with `Status: passed`, run the protected-path audit. Continue to
54
54
  `proof/complete` only if that audit passes. After the audit passes, run
55
- `npx --yes copilotkit@4.9.37 onboard read proof/complete`. A performed surface outcome with
55
+ `npx --yes copilotkit@4.9.50 onboard read proof/complete`. A performed surface outcome with
56
56
  the full round trip is core success even if a continued-development tool fails. A skipped
57
57
  surface outcome still enters `proof/complete` so the CLI records the blocked result. Do not
58
58
  describe a skipped surface as proved. Keep the Skills and MCP results separate from the proof
@@ -108,7 +108,7 @@ Restart each project-owned process changed by the repair. Report the cycle, coun
108
108
  one:
109
109
 
110
110
  ```text
111
- npx --yes copilotkit@4.9.37 onboard checkpoint --phase repair-attempted --attempt 1
111
+ npx --yes copilotkit@4.9.50 onboard checkpoint --phase repair-attempted --attempt 1
112
112
  ```
113
113
 
114
114
  Then spawn a fresh proof subagent
@@ -126,7 +126,7 @@ and proof cycles.
126
126
 
127
127
  Route out only when the failure is not yours to fix, when the same proof still fails after
128
128
  three attempts, or when no evidence of the round trip can be produced. In those cases run
129
- `npx --yes copilotkit@4.9.37 onboard read unsupported/no-validated-path`. All three are
129
+ `npx --yes copilotkit@4.9.50 onboard read unsupported/no-validated-path`. All three are
130
130
  about the round trip itself. A round trip that proved is not one of them, whatever failed
131
131
  after it.
132
132
 
@@ -136,7 +136,7 @@ Run the feedback command without another developer question. The CLI telemetry g
136
136
  whether the report is sent.
137
137
 
138
138
  ```text
139
- npx --yes copilotkit@4.9.37 onboard feedback
139
+ npx --yes copilotkit@4.9.50 onboard feedback
140
140
  ```
141
141
 
142
142
  Write at most four lines to standard input: the step you stopped at and what stopped it.
@@ -43,7 +43,7 @@ the derived name.
43
43
  Only if the developer asks for an existing project, or asks to see the projects they have,
44
44
  read the choices:
45
45
 
46
- `npx --yes copilotkit@4.9.37 project list --json`
46
+ `npx --yes copilotkit@4.9.50 project list --json`
47
47
 
48
48
  Then ask which one to use. Do not order the projects by creation time. If the developer
49
49
  already gave this answer, do not ask again. Do not read a secret value. Do not show or
@@ -53,7 +53,7 @@ Run the command from the parent directory. Do not inspect another entry in the p
53
53
  directory. Replace each placeholder with the recorded value. Do not run a placeholder as
54
54
  a shell argument.
55
55
 
56
- `npx --yes copilotkit@4.9.37 init --name <project-name> --framework <framework-id> --channel none --no-banner --create <name> --install`
56
+ `npx --yes copilotkit@4.9.50 init --name <project-name> --framework <framework-id> --channel none --no-banner --create <name> --install`
57
57
 
58
58
  Pass the confirmed name to both `--name` and `--create`: the app directory and its
59
59
  Intelligence project take the same name here. If the developer names an existing project,
@@ -69,14 +69,14 @@ account. The command does not need terminal input.
69
69
  If the command succeeds, do not rebuild the starter by hand. Report the clone first:
70
70
 
71
71
  ```text
72
- npx --yes copilotkit@4.9.37 onboard checkpoint --phase starter-cloned
72
+ npx --yes copilotkit@4.9.50 onboard checkpoint --phase starter-cloned
73
73
  ```
74
74
 
75
75
  Then inspect only the generated
76
76
  paths inside the target directory. Record the files, install result, project connection,
77
77
  and validation commands. Then run
78
- `npx --yes copilotkit@4.9.37 onboard read proof/round-trip`.
78
+ `npx --yes copilotkit@4.9.50 onboard read proof/round-trip`.
79
79
 
80
80
  If the command fails, report its exact error and do not claim that the starter is ready.
81
81
  Then run
82
- `npx --yes copilotkit@4.9.37 onboard read unsupported/no-validated-path`.
82
+ `npx --yes copilotkit@4.9.50 onboard read unsupported/no-validated-path`.
@@ -122,7 +122,7 @@ here is work the developer did not ask for.
122
122
  Plan the threads drawer itself: add it from the selected drawer page, where this frontend
123
123
  does not already render one. Where this journey's frontend framework ships no threads
124
124
  drawer -- React Native --, plan that the thread is proved by
125
- `npx --yes copilotkit@4.9.37 verify --round-trip`, which needs no browser. Do not plan a
125
+ `npx --yes copilotkit@4.9.50 verify --round-trip`, which needs no browser. Do not plan a
126
126
  step that opens the managed Intelligence dashboard.
127
127
 
128
128
  ## Order the plan into steps
@@ -138,8 +138,16 @@ list to re-derive: a path you leave out of it is not protected, and a path you a
138
138
  is not in the baseline the audit reads. Do not name a protected path as a path a step
139
139
  changes. Do not name a path that overlaps a protected path. The paths overlap when they are
140
140
  equal or either path is an ancestor directory on a path-segment boundary. `apps/a` overlaps
141
- `apps/a/src`, but not `apps/ab`. `app.ts` does not overlap `app.tsx`. If the plan needs
142
- one, return `Status: blocked` before approval.
141
+ `apps/a/src`, but not `apps/ab`. `app.ts` does not overlap `app.tsx`.
142
+
143
+ If a step cannot be written any other way, ask for the path instead of taking it. Adding a
144
+ feature to an app the developer already built is the case this exists for: the option lives
145
+ in a file they wrote, and on an app whose work was never committed that file is in the
146
+ baseline. List every such path under `Authorization requested`, one line each, with the path
147
+ and one sentence saying what the step changes there and why no other file will do. Keep the
148
+ step in the plan. Return `Status: blocked` only when the plan needs a protected path you
149
+ cannot justify in that sentence.
150
+
143
151
  Return the protected path list as part of the plan.
144
152
 
145
153
  Keep final validation and proof outside the implementation steps. The developer approves
@@ -19,7 +19,7 @@ Prove the live runtime in this order:
19
19
  4. Confirm from project files that the runtime constructor passes a `runner` option rather
20
20
  than an `intelligence` option. A package, import, project file, or key is not use proof.
21
21
  5. Run
22
- `npx --yes copilotkit@4.9.37 verify --expect-runtime oss --round-trip --agent <expected-agent-id> --json`,
22
+ `npx --yes copilotkit@4.9.50 verify --expect-runtime oss --round-trip --agent <expected-agent-id> --json`,
23
23
  with the runtime URL or auth header options that this project needs. Require exit zero
24
24
  and the JSON `ok` field to be `true`.
25
25
  6. Drive one real request through the existing frontend, CopilotKit runtime, and expected
@@ -90,8 +90,11 @@ A server that never answered has written the reason to its own output, and readi
90
90
  output is faster than starting it again.
91
91
 
92
92
  Leave the agent and frontend servers running after proof. Record each process ID and a
93
- safe command that stops that process. Record the frontend URL, written with `localhost`
94
- rather than an IP literal, and the commands that start both servers again.
93
+ safe command that stops that process. Record the commands that start both servers again.
94
+
95
+ Record the frontend URL the server you started reports, and treat it as provisional. Step 4
96
+ replaces it with the URL the CLI resolves. Do not compose one of your own from a port you
97
+ read here.
95
98
 
96
99
  ## Step 3 -- Identify the process that answered
97
100
 
@@ -120,7 +123,7 @@ IPv6 only, so an IPv4 literal fails against the correct port.
120
123
  ## Step 4 -- Check the wiring
121
124
 
122
125
  With both running, check the wiring in one command before you open a browser:
123
- `npx --yes copilotkit@4.9.37 verify --json`. It reads the port from this project, so a
126
+ `npx --yes copilotkit@4.9.50 verify --json`. It reads the port from this project, so a
124
127
  non-default port needs no flag. The payload reports `runtimeUrl` and `runtimeUrlSource`. A
125
128
  `runtimeUrlSource` of `default` means nothing in the project named a port, so pass
126
129
  `--runtime-url` with the URL from step 1 in that case. Read the individual checks rather than
@@ -135,7 +138,7 @@ used the Intelligence credential. `api_key_authenticates` proves only that the k
135
138
  will not read. `verify` searches upward for the credential and a framework's env loader
136
139
  does not, so a key at the repository root is invisible to an app in a subdirectory. The
137
140
  check names the file to write instead. Write the key there, or run
138
- `npx --yes copilotkit@4.9.37 project select` from the app directory. Do not link,
141
+ `npx --yes copilotkit@4.9.50 project select` from the app directory. Do not link,
139
142
  copy, or symlink the file to work around it, and do not treat the credential as missing:
140
143
  the check above already reported that it exists.
141
144
 
@@ -144,9 +147,21 @@ mounted `mode: "single-route"` is the usual cause. Return it for implementation
144
147
  option and use a catch-all route. Do not edit it. If the check is `undetermined` because no
145
148
  thread-endpoint state exists, the runtime predates the field. Record that and continue.
146
149
 
150
+ Take the frontend URL from the payload's `frontendUrl`. It replaces whatever step 2
151
+ recorded, and every later step uses it unchanged. Where the field is absent, the project
152
+ named no port the CLI can read: keep step 2's URL, and rewrite its host as `localhost`
153
+ before you use it.
154
+
155
+ Then run the command once more with the URL you are about to open:
156
+ `npx --yes copilotkit@4.9.50 verify --frontend-url <that url> --json`. The
157
+ `frontend_assets_served` check asks that server for its page and for one of the page's own
158
+ assets, on that exact host. A `fail` there means the dev server refuses its own static
159
+ assets on the host you were about to use, and the check names the URL to use instead. This
160
+ is the cheapest step that can save the most expensive one, so run it before the browser.
161
+
147
162
  ## Step 5 -- Prove that the agent runs
148
163
 
149
- Run `npx --yes copilotkit@4.9.37 verify --round-trip --json`. It sends one request through
164
+ Run `npx --yes copilotkit@4.9.50 verify --round-trip --json`. It sends one request through
150
165
  the runtime and reads the answer back from the thread, so it separates an agent that is
151
166
  configured from an agent that works. Use `--agent <id>` when the runtime declares more
152
167
  than one. If it reports `user-not-identified`, this project's `identifyUser` reads a
@@ -223,7 +238,7 @@ For a recorded `both-oss` starting state, this step has no component to render.
223
238
  same request the baseline recorded, require the same kind of user-visible result the
224
239
  baseline produced, and require that the thread for that request is listed in the drawer.
225
240
  Where this journey's frontend framework ships no threads drawer -- React Native --, prove
226
- that thread with `npx --yes copilotkit@4.9.37 verify --round-trip`, which reads the
241
+ that thread with `npx --yes copilotkit@4.9.50 verify --round-trip`, which reads the
227
242
  answer back off the thread and needs no browser. Record which of the two you proved.
228
243
 
229
244
  Use the surface control the main coding agent recorded for your environment. It either had
@@ -247,11 +262,14 @@ under a name that says what it was.
247
262
  The surface is a browser, and it also covers browser-origin CORS and CSP, which a CLI
248
263
  request never exercises. Drive it with the browser control step 6 named.
249
264
 
250
- 1. Open the frontend URL from step 2 and wait for the page to finish loading.
251
- Address it as `localhost` rather than an IP literal, for the reason step 3 gives
252
- for the agent. A dev server reached on the IP literal can refuse its own static
253
- assets, and a page that loads without them leaves the chat control dead. That
254
- reads as a broken integration rather than as the host name you used.
265
+ 1. Open the frontend URL step 4 resolved, exactly as that step recorded it, and wait for
266
+ the page to finish loading. Do not retype the host, and do not substitute a URL a tool
267
+ offers you by default. Where the page loads but its styling is missing or the chat
268
+ control is dead, run
269
+ `npx --yes copilotkit@4.9.50 verify --frontend-url <the url you opened> --json`
270
+ before you diagnose anything else. A dev server can serve its page and refuse every
271
+ static chunk behind it, and on screen that is indistinguishable from a broken
272
+ integration. The `frontend_assets_served` check tells the two apart.
255
273
  2. Take one page snapshot. Record whether the CopilotKit surface is on the page. A page
256
274
  that renders without it is a wiring failure rather than a proof to retry.
257
275
  3. Read the browser console before you type anything, and record every error already
@@ -30,13 +30,13 @@ Before you show the best-effort plan, require this complete packet:
30
30
  - Give the ordered proof rules.
31
31
 
32
32
  After the developer approves the best-effort plan, run
33
- `npx --yes copilotkit@4.9.37 onboard read fallback/best-effort`.
33
+ `npx --yes copilotkit@4.9.50 onboard read fallback/best-effort`.
34
34
 
35
35
  Send one short report. Run the feedback command without another developer question. The
36
36
  CLI telemetry gate decides whether the report is sent.
37
37
 
38
38
  ```text
39
- npx --yes copilotkit@4.9.37 onboard feedback
39
+ npx --yes copilotkit@4.9.50 onboard feedback
40
40
  ```
41
41
 
42
42
  Write the feedback message to the command's standard input, in at most four lines.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "copilotkit",
3
- "version": "4.9.37",
3
+ "version": "4.9.50",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -14698,7 +14698,7 @@ import * as path4 from "node:path";
14698
14698
 
14699
14699
  // apps/cli/src/config.ts
14700
14700
  function getTemplateRef() {
14701
- return true ? "aec312634129f97f90154bb416a07e8cc0c13a2a" : "main";
14701
+ return true ? "380ad1220a7bc78104baedc469c4d086c8910494" : "main";
14702
14702
  }
14703
14703
 
14704
14704
  // apps/cli/src/services/agentcore-config.ts
@@ -14896,8 +14896,15 @@ var TELEMETRY_ERROR_CODES = {
14896
14896
  */
14897
14897
  KEY_PROVISION_REFUSED: "KEY_PROVISION_REFUSED",
14898
14898
  CLI_PRODUCT_BINARY_TOO_LARGE: "CLI_PRODUCT_BINARY_TOO_LARGE",
14899
+ LEARNING_CANDIDATE_CONFLICT: "LEARNING_CANDIDATE_CONFLICT",
14900
+ LEARNING_CANDIDATE_SETTLED: "LEARNING_CANDIDATE_SETTLED",
14901
+ LEARNING_CANDIDATE_ID_INVALID: "LEARNING_CANDIDATE_ID_INVALID",
14899
14902
  LEARNING_CONTAINER_ID_INVALID: "LEARNING_CONTAINER_ID_INVALID",
14903
+ LEARNING_CONTAINER_INPUT_INVALID: "LEARNING_CONTAINER_INPUT_INVALID",
14904
+ LEARNING_CONTAINER_NOT_FOUND: "LEARNING_CONTAINER_NOT_FOUND",
14905
+ LEARNING_CONTAINER_RESPONSE_INVALID: "LEARNING_CONTAINER_RESPONSE_INVALID",
14900
14906
  LEARNING_PROJECT_ID_INVALID: "LEARNING_PROJECT_ID_INVALID",
14907
+ LEARNING_RESPONSE_INVALID: "LEARNING_RESPONSE_INVALID",
14901
14908
  LEARNING_SKILLS_BUNDLE_INVALID: "LEARNING_SKILLS_BUNDLE_INVALID",
14902
14909
  LEARNING_SKILLS_INTEGRITY_FAILED: "LEARNING_SKILLS_INTEGRITY_FAILED",
14903
14910
  LEARNING_SKILLS_OUTPUT_EXISTS: "LEARNING_SKILLS_OUTPUT_EXISTS"
@@ -15173,20 +15180,18 @@ var FRAMEWORK_TEMPLATES = {
15173
15180
  TEMPLATE_REPOS["microsoft-agent-framework-dotnet"],
15174
15181
  `\u{1FA81}\u{1F91D}${FRAMEWORK_EMOJI["microsoft-agent-framework-dotnet"]}`
15175
15182
  ),
15176
- // No root-`.env` vendor gate: the agent's model credentials are configured
15177
- // via dotnet user-secrets (GitHub Models, by default) or OpenAI/Azure
15178
- // OpenAI, none of which live in the root `.env`, so a fixed root-`.env` key
15179
- // requirement would falsely warn. The GitHub-token user-secrets command is
15180
- // credential setup (not a generic post-install build step), so it is
15181
- // surfaced as explicit credential guidance below instead.
15183
+ // No root-`.env` vendor gate: the agent's OpenAI credential is configured
15184
+ // via dotnet user-secrets. It does not live in the root `.env`, so a fixed
15185
+ // root-`.env` key requirement would falsely warn. The user-secrets command
15186
+ // is credential setup (not a generic post-install build step), so it is
15187
+ // surfaced as explicit guidance below.
15182
15188
  environment: [],
15183
15189
  setupNotes: [
15184
15190
  { text: " Set up the agent model credentials:" },
15185
15191
  {
15186
- text: " GitHub Models: ",
15187
- code: 'cd agent && dotnet user-secrets set GitHubToken "<your-github-token>"'
15188
- },
15189
- { text: " or OpenAI / Azure OpenAI \u2014 see the agent README" }
15192
+ text: " OpenAI: ",
15193
+ code: 'cd agent && dotnet user-secrets set OPENAI_API_KEY "<your-openai-api-key>"'
15194
+ }
15190
15195
  ]
15191
15196
  },
15192
15197
  "microsoft-agent-framework-py": {
@@ -15487,6 +15492,27 @@ async function scaffoldStarterForSmoke(input, scaffold = scaffoldProject) {
15487
15492
  }
15488
15493
  await scaffold({ projectDir, template: configuredTemplate });
15489
15494
  await definition.postScaffold?.(projectDir);
15495
+ if (input.framework === "microsoft-agent-framework-dotnet") {
15496
+ const command = definition.setupNotes?.find(
15497
+ (note) => note.code?.includes("dotnet user-secrets set")
15498
+ )?.code;
15499
+ const credential = command?.match(
15500
+ /dotnet user-secrets set ([A-Za-z0-9_]+)/
15501
+ )?.[1];
15502
+ const programPath = path4.join(projectDir, "agent", "Program.cs");
15503
+ const program = fs4.existsSync(programPath) ? fs4.readFileSync(programPath, "utf8") : "";
15504
+ if (!credential || !program.includes(credential)) {
15505
+ throw new StarterSmokeError(
15506
+ "STARTER_CREDENTIAL_MISMATCH",
15507
+ "Microsoft Agent Framework .NET credential guidance does not match the bound starter",
15508
+ {
15509
+ framework: input.framework,
15510
+ credential,
15511
+ revision: input.template.revision
15512
+ }
15513
+ );
15514
+ }
15515
+ }
15490
15516
  const entries = fs4.readdirSync(projectDir);
15491
15517
  return entries.join("\n");
15492
15518
  } finally {