@ggui-ai/ui-gen 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/adapters/generation-dispatch.d.ts +9 -2
  2. package/dist/adapters/generation-dispatch.js +693 -89
  3. package/dist/adapters/generation-dispatch.js.map +1 -1
  4. package/dist/adapters/index.js +28 -11
  5. package/dist/adapters/index.js.map +1 -1
  6. package/dist/advanced/index.d.ts +5 -3
  7. package/dist/advanced/index.js +714 -101
  8. package/dist/advanced/index.js.map +1 -1
  9. package/dist/blueprint-validator.js +267 -3
  10. package/dist/blueprint-validator.js.map +1 -1
  11. package/dist/boilerplate.js +14 -2
  12. package/dist/boilerplate.js.map +1 -1
  13. package/dist/check/index.d.ts +1 -1
  14. package/dist/check/index.js +11 -1
  15. package/dist/check/index.js.map +1 -1
  16. package/dist/{create-ui-generator-B9kV4U9h.d.ts → create-ui-generator-CF0EL0Li.d.ts} +13 -1
  17. package/dist/{dispatch-Deo9qzrG.d.ts → dispatch-D75M-OfZ.d.ts} +1 -1
  18. package/dist/evaluation/axis-checks/index.d.ts +3 -3
  19. package/dist/evaluation/axis-checks/index.js +101 -0
  20. package/dist/evaluation/axis-checks/index.js.map +1 -1
  21. package/dist/evaluation/axis-checks/registry.d.ts +1 -1
  22. package/dist/evaluation/axis-checks/registry.js +101 -0
  23. package/dist/evaluation/axis-checks/registry.js.map +1 -1
  24. package/dist/evaluation/index.d.ts +46 -3
  25. package/dist/evaluation/index.js +358 -17
  26. package/dist/evaluation/index.js.map +1 -1
  27. package/dist/harness/check/runtime-render/index.d.ts +2 -2
  28. package/dist/harness/check/runtime-render/index.js +268 -3
  29. package/dist/harness/check/runtime-render/index.js.map +1 -1
  30. package/dist/harness/check/runtime-render/render-check-worker.d.ts +2 -0
  31. package/dist/harness/check/runtime-render/render-check-worker.js +1332 -0
  32. package/dist/harness/check/runtime-render/render-check-worker.js.map +1 -0
  33. package/dist/harness/index.d.ts +2 -2
  34. package/dist/harness/index.js +263 -18
  35. package/dist/harness/index.js.map +1 -1
  36. package/dist/harness/llm-trace-sink.d.ts +1 -1
  37. package/dist/harness/llm-trace-sink.js.map +1 -1
  38. package/dist/harness/prompts.js +17 -3
  39. package/dist/harness/prompts.js.map +1 -1
  40. package/dist/harness/result-types.d.ts +1 -1
  41. package/dist/harness/runtime.d.ts +9 -2
  42. package/dist/harness/runtime.js +20 -6
  43. package/dist/harness/runtime.js.map +1 -1
  44. package/dist/harness/types-public.d.ts +1 -1
  45. package/dist/harness/types-public.js +14 -2
  46. package/dist/harness/types-public.js.map +1 -1
  47. package/dist/harness/validator-trace-sink.d.ts +1 -1
  48. package/dist/index.d.ts +5 -3
  49. package/dist/index.js +708 -95
  50. package/dist/index.js.map +1 -1
  51. package/dist/{llm-router-1TyI0_TV.d.ts → llm-router-BEVtbAb9.d.ts} +61 -4
  52. package/dist/patch.d.ts +1 -1
  53. package/dist/provider-adapter.d.ts +16 -6
  54. package/dist/provider-adapter.js.map +1 -1
  55. package/dist/providers/index.d.ts +19 -6
  56. package/dist/providers/index.js.map +1 -1
  57. package/dist/{render-check-CNZjHD5g.d.ts → render-check-BZoIE8-u.d.ts} +21 -1
  58. package/dist/{types-public-C36k1q6s.d.ts → types-public-DIpjC-OA.d.ts} +1 -1
  59. package/dist/workflows.d.ts +1 -1
  60. package/package.json +12 -12
  61. package/src/adapters/generation-dispatch.ts +9 -0
  62. package/src/adapters/openrouter/client.ts +2 -2
  63. package/src/adapters/openrouter/types.ts +10 -0
  64. package/src/boilerplate/generate.ts +10 -2
  65. package/src/boilerplate/json-schema-ts.ts +22 -2
  66. package/src/boilerplate/system-prompt.ts +1 -0
  67. package/src/compile.ts +1 -1
  68. package/src/contract-context.ts +10 -2
  69. package/src/create-ui-generator.ts +14 -0
  70. package/src/design-system-docs.ts +6 -4
  71. package/src/evaluation/axis-checks/checks/state-ui-affordance.ts +162 -0
  72. package/src/evaluation/axis-checks/registry.ts +2 -0
  73. package/src/evaluation/index.ts +11 -0
  74. package/src/evaluation/llm-evaluator.ts +14 -1
  75. package/src/evaluation/visual-evaluator.ts +44 -65
  76. package/src/harness/check/runtime-render/adapter.ts +18 -0
  77. package/src/harness/check/runtime-render/index.ts +8 -0
  78. package/src/harness/check/runtime-render/prepare-mockup.ts +14 -0
  79. package/src/harness/check/runtime-render/production-act-shim.ts +158 -0
  80. package/src/harness/check/runtime-render/render-check-host.ts +201 -0
  81. package/src/harness/check/runtime-render/render-check-worker.ts +80 -0
  82. package/src/harness/check/runtime-render/render-check.ts +112 -1
  83. package/src/harness/coding/run-eval-round.ts +61 -5
  84. package/src/harness/index.ts +1 -1
  85. package/src/harness/llm-router.ts +397 -18
  86. package/src/harness/llm-trace-sink.ts +2 -1
  87. package/src/harness/runtime.ts +7 -0
  88. package/src/index.ts +5 -5
  89. package/src/provider-adapter.ts +16 -6
  90. package/src/providers/bedrock.ts +5 -4
  91. package/src/providers/index.ts +16 -4
  92. package/src/tools/render-check.ts +19 -7
@@ -1,7 +1,18 @@
1
1
  /**
2
2
  * Provider adapter contract — the narrow surface every concrete LLM
3
- * provider client (Anthropic, Google, OpenAI, OpenRouter) implements
4
- * before the generator wires them in.
3
+ * provider client (Anthropic, Google, OpenAI, OpenRouter, Bedrock)
4
+ * implements.
5
+ *
6
+ * **Real role:** a provider-agnostic one-shot LLM caller for
7
+ * lightweight callers that need a single `complete()` round-trip — NOT
8
+ * a generation harness. The primary consumer is the negotiator's LLM
9
+ * seam (`@ggui-ai/mcp-server`'s `llm-backed-negotiator.ts`, via
10
+ * {@link selectAdapter} from `./providers/index.js`); other lightweight
11
+ * one-shot callers use it the same way. It is explicitly NOT part of
12
+ * the generation dispatch path: `createUiGenerator()` accepts no
13
+ * adapter option, and generation-call 429 retry/backoff lives entirely
14
+ * in `harness/llm-router.ts`'s `apiCall()` — a separate retry story for
15
+ * a separate call shape (an agentic SDK loop, not a single completion).
5
16
  *
6
17
  * The contract is deliberately defined independently of concrete
7
18
  * adapters so:
@@ -9,10 +20,9 @@
9
20
  * - Adapter implementations can be written against a stable surface —
10
21
  * every concrete adapter MUST pass
11
22
  * {@link providerAdapterContract} or it isn't a `ProviderAdapter`.
12
- * - Downstream callers (`createUiGenerator`, render handlers, retry /
13
- * backoff plumbing) build against ONE structured failure shape
14
- * ({@link ProviderError}) instead of inventing per-provider error
15
- * UX.
23
+ * - Downstream one-shot callers build against ONE structured failure
24
+ * shape ({@link ProviderError}) instead of inventing per-provider
25
+ * error UX.
16
26
  * - The negotiator + cache layers can branch on
17
27
  * `error.kind === 'rate-limited'` etc. without parsing strings.
18
28
  *
@@ -7,8 +7,8 @@
7
7
  *
8
8
  * ## Why this adapter exists
9
9
  *
10
- * Anyone running the generator on an AWS-credentialed host (EC2, ECS,
11
- * Lambda, EKS) can target Bedrock without managing API keys: IAM is
10
+ * Anyone running a one-shot LLM caller on an AWS-credentialed host
11
+ * (EC2, ECS, Lambda, EKS) can target Bedrock without managing API keys: IAM is
12
12
  * the auth boundary, AWS rotates host credentials automatically, and
13
13
  * a misconfigured IAM role surfaces as a clear `AccessDeniedException`
14
14
  * the SDK funnels through `mapError`. The alternative — parking a
@@ -198,8 +198,9 @@ export interface BedrockAdapterOptions {
198
198
  *
199
199
  * No API key — IAM is the auth boundary. The returned `ProviderAdapter`
200
200
  * satisfies the same contract as `createAnthropicAdapter`, so it
201
- * slots into `createUiGenerator({ adapter })` interchangeably (modulo
202
- * the per-provider model-id namespace differences).
201
+ * slots into any one-shot `ProviderAdapter` caller (e.g. `selectAdapter`)
202
+ * interchangeably (modulo the per-provider model-id namespace
203
+ * differences).
203
204
  */
204
205
  export function createBedrockAdapter(
205
206
  options: BedrockAdapterOptions = {},
@@ -5,6 +5,15 @@
5
5
  * providers ggui supports today: Anthropic (direct API), Google,
6
6
  * OpenAI, OpenRouter, and AWS Bedrock (Anthropic models via IAM).
7
7
  *
8
+ * **Real role:** a provider-agnostic one-shot LLM caller for
9
+ * lightweight callers that need a single `complete()` round-trip — NOT
10
+ * the generation dispatch path. `createUiGenerator()` accepts no
11
+ * adapter option; generation-call retry/backoff lives entirely in
12
+ * `harness/llm-router.ts`'s `apiCall()`. The primary consumer is the
13
+ * negotiator's LLM seam (`@ggui-ai/mcp-server`'s
14
+ * `llm-backed-negotiator.ts`, via {@link selectAdapter}); other
15
+ * lightweight one-shot callers use it the same way.
16
+ *
8
17
  * Every adapter satisfies the structural
9
18
  * {@link import('../provider-adapter.js').ProviderAdapter} contract.
10
19
  * The four direct-API adapters compose
@@ -15,15 +24,18 @@
15
24
  * because rolling our own AWS SigV4 signer for one provider isn't a
16
25
  * reasonable trade.
17
26
  *
18
- * Typical usage from the CLI:
27
+ * Typical usage — a one-shot completion:
19
28
  *
20
29
  * ```ts
21
30
  * import { createAnthropicAdapter } from '@ggui-ai/ui-gen/providers';
22
- * import { createUiGenerator } from '@ggui-ai/ui-gen';
23
31
  *
24
32
  * const adapter = createAnthropicAdapter();
25
- * const generator = createUiGenerator({ adapter });
26
- * const result = await generator.generate({ request, llm, providerKey, blueprints });
33
+ * const result = await adapter.complete({
34
+ * apiKey,
35
+ * route: { provider: 'anthropic', model: 'claude-haiku-4-5-20251001' },
36
+ * systemPrompt,
37
+ * userPrompt,
38
+ * });
27
39
  * ```
28
40
  *
29
41
  * Bedrock pool path (no API key — IAM at process boot):
@@ -28,7 +28,12 @@ import { existsSync } from 'node:fs';
28
28
  import { createRequire } from 'node:module';
29
29
  import { pathToFileURL, fileURLToPath } from 'node:url';
30
30
  import { runSandboxed } from '@ggui-ai/sandbox';
31
- import type { PropsSpec, JsonObject, JsonValue } from '@ggui-ai/protocol';
31
+ import type {
32
+ JsonObject,
33
+ JsonSchema,
34
+ JsonValue,
35
+ PropsSpec,
36
+ } from '@ggui-ai/protocol';
32
37
 
33
38
  /**
34
39
  * Generate sample props from a PropsSpec contract.
@@ -58,21 +63,28 @@ export function generateSampleProps(spec: PropsSpec): JsonObject {
58
63
  return props;
59
64
  }
60
65
 
61
- function synthesizeFromSchema(schema: { type?: string; items?: unknown; properties?: JsonObject; required?: string[] }): JsonValue | undefined {
62
- switch (schema.type) {
66
+ function synthesizeFromSchema(schema: JsonSchema): JsonValue | undefined {
67
+ // Draft-07 type arrays (`['string','null']`) synthesize from the
68
+ // first non-null member — the canonical nullability form the
69
+ // enforced-props-schema emission produces.
70
+ const declared = Array.isArray(schema.type)
71
+ ? schema.type.find((t) => t !== 'null')
72
+ : schema.type;
73
+ switch (declared) {
63
74
  case 'string': return 'sample';
64
- case 'number': return 0;
75
+ case 'number':
76
+ case 'integer': return 0;
65
77
  case 'boolean': return false;
78
+ case 'null': return null;
66
79
  case 'array': {
67
- const itemSchema = schema.items as { type?: string } | undefined;
68
- if (itemSchema) return [synthesizeFromSchema(itemSchema) ?? null];
80
+ if (schema.items) return [synthesizeFromSchema(schema.items) ?? null];
69
81
  return [];
70
82
  }
71
83
  case 'object': {
72
84
  const obj: JsonObject = {};
73
85
  if (schema.properties) {
74
86
  for (const [k, v] of Object.entries(schema.properties)) {
75
- obj[k] = synthesizeFromSchema(v as { type?: string });
87
+ obj[k] = synthesizeFromSchema(v);
76
88
  }
77
89
  }
78
90
  return obj;