@ggui-ai/ui-gen 0.20.0 → 0.22.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 (93) hide show
  1. package/dist/adapters/base.d.ts +7 -0
  2. package/dist/adapters/base.js +1 -0
  3. package/dist/adapters/base.js.map +1 -1
  4. package/dist/adapters/generation-dispatch.d.ts +17 -3
  5. package/dist/adapters/generation-dispatch.js +1078 -3464
  6. package/dist/adapters/generation-dispatch.js.map +1 -1
  7. package/dist/adapters/index.js +60 -3
  8. package/dist/adapters/index.js.map +1 -1
  9. package/dist/advanced/index.d.ts +4 -4
  10. package/dist/advanced/index.js +1346 -3557
  11. package/dist/advanced/index.js.map +1 -1
  12. package/dist/blueprint-validator.js +10 -3
  13. package/dist/blueprint-validator.js.map +1 -1
  14. package/dist/boilerplate.js +2 -2
  15. package/dist/boilerplate.js.map +1 -1
  16. package/dist/check/index.d.ts +1 -1
  17. package/dist/check/index.js.map +1 -1
  18. package/dist/{create-ui-generator-CxPvudbs.d.ts → create-ui-generator-BEkzEtNz.d.ts} +2 -2
  19. package/dist/{dispatch-N8wdNOX-.d.ts → dispatch-DJNpQ7DI.d.ts} +1 -1
  20. package/dist/evaluation/axis-checks/index.d.ts +3 -3
  21. package/dist/evaluation/axis-checks/index.js.map +1 -1
  22. package/dist/evaluation/axis-checks/registry.d.ts +1 -1
  23. package/dist/evaluation/index.d.ts +38 -6
  24. package/dist/evaluation/index.js +670 -3374
  25. package/dist/evaluation/index.js.map +1 -1
  26. package/dist/harness/check/runtime-render/index.d.ts +2 -2
  27. package/dist/harness/check/runtime-render/index.js +10 -3
  28. package/dist/harness/check/runtime-render/index.js.map +1 -1
  29. package/dist/harness/check/runtime-render/render-check-worker.js +5 -3
  30. package/dist/harness/check/runtime-render/render-check-worker.js.map +1 -1
  31. package/dist/harness/index.d.ts +2 -2
  32. package/dist/harness/index.js +587 -30
  33. package/dist/harness/index.js.map +1 -1
  34. package/dist/harness/llm-trace-sink.d.ts +7 -1
  35. package/dist/harness/llm-trace-sink.js.map +1 -1
  36. package/dist/harness/prompts.js +1 -1
  37. package/dist/harness/prompts.js.map +1 -1
  38. package/dist/harness/result-types.d.ts +15 -2
  39. package/dist/harness/result-types.js.map +1 -1
  40. package/dist/harness/runtime.d.ts +11 -2
  41. package/dist/harness/runtime.js +3 -3
  42. package/dist/harness/runtime.js.map +1 -1
  43. package/dist/harness/types-public.d.ts +1 -1
  44. package/dist/harness/types-public.js +2 -2
  45. package/dist/harness/types-public.js.map +1 -1
  46. package/dist/harness/validator-trace-sink.d.ts +1 -1
  47. package/dist/index.d.ts +23 -7
  48. package/dist/index.js +1346 -3557
  49. package/dist/index.js.map +1 -1
  50. package/dist/{llm-router-D7fjBhtr.d.ts → llm-router-DwwUK1bz.d.ts} +16 -3
  51. package/dist/patch.d.ts +1 -1
  52. package/dist/providers/index.js +5 -4
  53. package/dist/providers/index.js.map +1 -1
  54. package/dist/{render-check-WfOVO9kU.d.ts → render-check-C0CqVceF.d.ts} +17 -0
  55. package/dist/{types-public-DKR_h70H.d.ts → types-public-mM_-1Yk3.d.ts} +59 -1
  56. package/dist/validation/index.d.ts +1 -1
  57. package/dist/validation/index.js +1 -1
  58. package/dist/validation/index.js.map +1 -1
  59. package/dist/workflows.d.ts +1 -1
  60. package/package.json +16 -12
  61. package/src/adapters/base.ts +8 -0
  62. package/src/adapters/claude/claude-code-login.ts +128 -0
  63. package/src/adapters/claude/sdk.ts +9 -1
  64. package/src/adapters/generation-dispatch.ts +19 -2
  65. package/src/adapters/openai/tokens.ts +18 -0
  66. package/src/adapters/provider-router.ts +28 -0
  67. package/src/boilerplate/generate.ts +19 -4
  68. package/src/boilerplate/hard-sections.ts +1 -1
  69. package/src/boilerplate/templates/layouts/chat-mobile.tsx.tmpl +7 -3
  70. package/src/boilerplate/templates/layouts/chat-universal.tsx.tmpl +7 -3
  71. package/src/contract-context.ts +1 -1
  72. package/src/create-ui-generator.ts +49 -10
  73. package/src/evaluation/design-identity.ts +16 -5
  74. package/src/evaluation/index.ts +1 -0
  75. package/src/evaluation/llm-evaluator.ts +40 -13
  76. package/src/evaluation/types-public.ts +58 -0
  77. package/src/evaluation/visual-evaluator.ts +240 -30
  78. package/src/generator-build.ts +158 -0
  79. package/src/harness/check/runtime-render/adapter.ts +9 -0
  80. package/src/harness/check/runtime-render/render-check.ts +26 -5
  81. package/src/harness/claude-code-login-query.ts +529 -0
  82. package/src/harness/coding/assemble-result.ts +18 -2
  83. package/src/harness/coding/generate-task-runner.ts +75 -36
  84. package/src/harness/coding/run-coding-turn.ts +9 -0
  85. package/src/harness/coding/run-eval-round.ts +338 -38
  86. package/src/harness/enforced-coding.ts +20 -0
  87. package/src/harness/llm-router.ts +390 -55
  88. package/src/harness/llm-trace-sink.ts +7 -1
  89. package/src/harness/result-types.ts +14 -0
  90. package/src/harness/runtime.ts +6 -0
  91. package/src/index.ts +2 -1
  92. package/src/providers/openai.ts +31 -19
  93. package/src/validation/primitives.ts +1 -1
package/src/index.ts CHANGED
@@ -21,7 +21,8 @@ export {
21
21
  } from './create-ui-generator.js';
22
22
  export type { CreateUiGeneratorOptions } from './create-ui-generator.js';
23
23
  export type { ProviderRetryInfo } from './harness/llm-router.js';
24
- export type { GenerationResult } from './harness/result-types.js';
24
+ export type { GenerationResult, SameExchangeBreak } from './harness/result-types.js';
25
+ export type { UiGenBuild } from './generator-build.js';
25
26
 
26
27
  // Generator registry seam re-export. The interface + slug helpers live
27
28
  // in `@ggui-ai/mcp-server-core`; the in-memory factory lives in
@@ -137,19 +137,25 @@ export function createOpenAiAdapter(
137
137
  *
138
138
  * Token-cap parameter selection:
139
139
  *
140
- * - `gpt-5*`, `o1*`, `o3*`, `o4*` (reasoning + new-API models) →
141
- * `max_completion_tokens`. The legacy `max_tokens` field returns
142
- * 400 `unsupported_parameter` on these models per the OpenAI 2024-09
143
- * deprecation: "Unsupported parameter: 'max_tokens' is not supported
144
- * with this model. Use 'max_completion_tokens' instead."
145
- * - Everything else (`gpt-4*`, `gpt-3.5*`, etc.) → `max_tokens` for
146
- * backwards-compat with the chat-completions field that's been
147
- * stable since 2023.
140
+ * - OpenAI, `gpt-N*` with N ≥ 5 (gpt-5, gpt-6, …) and `o1*`, `o3*`,
141
+ * `o4*` (reasoning + new-API models) → `max_completion_tokens`. The
142
+ * legacy `max_tokens` field returns 400 `unsupported_parameter` on
143
+ * these models per the OpenAI 2024-09 deprecation: "Unsupported
144
+ * parameter: 'max_tokens' is not supported with this model. Use
145
+ * 'max_completion_tokens' instead."
146
+ * - OpenAI, everything else (`gpt-4*`, `gpt-3.5*`, etc.) →
147
+ * `max_tokens` for backwards-compat with the chat-completions field
148
+ * that's been stable since 2023.
149
+ * - OpenRouter, every model → `max_tokens`. The rule above is
150
+ * OpenAI's, not the gateway's: OpenRouter's catalog lists only
151
+ * `max_tokens` for `openai/gpt-6-luna` and `openai/gpt-6-sol`, and
152
+ * accepts it for every other slug. Keyed on the provider, so no
153
+ * model id — slugged or bare — can switch an OpenRouter body.
148
154
  *
149
- * Heuristic chosen over a hard model-list because new gpt-5.x variants
150
- * ship continuously; the prefix is the contract OpenAI exposes. Same
151
- * heuristic applies to OpenRouter which wires to backing models — when
152
- * a caller picks `gpt-5.6-luna` through OpenRouter the same rule fires.
155
+ * A generation-number rule rather than a hard model list, because new
156
+ * variants ship continuously and the generation is the contract OpenAI
157
+ * exposes (ggui#1255: the `gpt-5` prefix alone sent every gpt-6 id,
158
+ * the live `gpt-6-astra` included, down the legacy field).
153
159
  */
154
160
  export function buildOpenAiBody(request: ProviderRequest): Record<string, unknown> {
155
161
  const body: Record<string, unknown> = {
@@ -160,21 +166,27 @@ export function buildOpenAiBody(request: ProviderRequest): Record<string, unknow
160
166
  ],
161
167
  };
162
168
  if (request.maxTokens !== undefined) {
163
- body[selectMaxTokensField(request.route.model)] = request.maxTokens;
169
+ const field =
170
+ request.route.provider === 'openrouter'
171
+ ? 'max_tokens'
172
+ : selectMaxTokensField(request.route.model);
173
+ body[field] = request.maxTokens;
164
174
  }
165
175
  return body;
166
176
  }
167
177
 
168
178
  /**
169
- * Pick which token-cap field name to send. Bare-string match on the
170
- * leading model identifier — no SDK lookup, no async; runs once per
171
- * request body build.
179
+ * Pick which token-cap field name an OpenAI request sends, from a BARE
180
+ * OpenAI model id (`gpt-6-luna`, not `openai/gpt-6-luna` — an
181
+ * `<author>/` slug is a gateway id and is deliberately not stripped).
182
+ * The gpt generation is read as a number, so `gpt-50` is not `gpt-5`.
183
+ * No SDK lookup, no async; runs once per request body build.
172
184
  */
173
185
  export function selectMaxTokensField(model: string): 'max_tokens' | 'max_completion_tokens' {
174
186
  const m = model.toLowerCase();
175
- if (m.startsWith('gpt-5') || m.startsWith('o1') || m.startsWith('o3') || m.startsWith('o4')) {
176
- return 'max_completion_tokens';
177
- }
187
+ const generation = /^gpt-(\d+)/.exec(m);
188
+ if (generation !== null && Number(generation[1]) >= 5) return 'max_completion_tokens';
189
+ if (m.startsWith('o1') || m.startsWith('o3') || m.startsWith('o4')) return 'max_completion_tokens';
178
190
  return 'max_tokens';
179
191
  }
180
192