@ggui-ai/ui-gen 0.25.0 → 0.27.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 (117) hide show
  1. package/README.md +2 -2
  2. package/dist/{adapter-Cg_rkpGq.d.ts → adapter-h4_V69LI.d.ts} +49 -1
  3. package/dist/adapters/base.d.ts +6 -1
  4. package/dist/adapters/base.js.map +1 -1
  5. package/dist/adapters/generation-dispatch.d.ts +8 -5
  6. package/dist/adapters/generation-dispatch.js +1174 -198
  7. package/dist/adapters/generation-dispatch.js.map +1 -1
  8. package/dist/adapters/index.js +59 -16
  9. package/dist/adapters/index.js.map +1 -1
  10. package/dist/advanced/index.d.ts +10 -9
  11. package/dist/advanced/index.js +1215 -216
  12. package/dist/advanced/index.js.map +1 -1
  13. package/dist/blueprint-validator.js +416 -92
  14. package/dist/blueprint-validator.js.map +1 -1
  15. package/dist/boilerplate.d.ts +2 -2
  16. package/dist/boilerplate.js +10 -5
  17. package/dist/boilerplate.js.map +1 -1
  18. package/dist/check/index.d.ts +3 -8
  19. package/dist/check/index.js +55 -2
  20. package/dist/check/index.js.map +1 -1
  21. package/dist/{create-ui-generator-DFnnArrv.d.ts → create-ui-generator-BrZHF0cf.d.ts} +3 -4
  22. package/dist/{design-mode-DLufhrNp.d.ts → design-mode-DGWN_Gkm.d.ts} +1 -1
  23. package/dist/{dispatch-CStl9eAw.d.ts → dispatch-B07TI30d.d.ts} +2 -2
  24. package/dist/evaluation/axis-checks/index.d.ts +5 -4
  25. package/dist/evaluation/axis-checks/index.js.map +1 -1
  26. package/dist/evaluation/axis-checks/registry.d.ts +4 -3
  27. package/dist/evaluation/index.d.ts +124 -546
  28. package/dist/evaluation/index.js +588 -65
  29. package/dist/evaluation/index.js.map +1 -1
  30. package/dist/evaluation/types.d.ts +17 -0
  31. package/dist/evaluation/types.js.map +1 -1
  32. package/dist/{generate-9IeNT4ZY.d.ts → generate-tSO_shQ0.d.ts} +1 -1
  33. package/dist/harness/check/runtime-render/index.d.ts +5 -5
  34. package/dist/harness/check/runtime-render/index.js +416 -92
  35. package/dist/harness/check/runtime-render/index.js.map +1 -1
  36. package/dist/harness/check/runtime-render/render-check-worker.js +393 -88
  37. package/dist/harness/check/runtime-render/render-check-worker.js.map +1 -1
  38. package/dist/harness/index.d.ts +4 -5
  39. package/dist/harness/index.js +36 -7
  40. package/dist/harness/index.js.map +1 -1
  41. package/dist/harness/prompts.d.ts +2 -2
  42. package/dist/harness/prompts.js +7 -1
  43. package/dist/harness/prompts.js.map +1 -1
  44. package/dist/harness/result-types.d.ts +17 -3
  45. package/dist/harness/result-types.js.map +1 -1
  46. package/dist/harness/runtime.d.ts +14 -6
  47. package/dist/harness/runtime.js +13 -7
  48. package/dist/harness/runtime.js.map +1 -1
  49. package/dist/harness/types-public.d.ts +4 -2
  50. package/dist/harness/types-public.js +10 -5
  51. package/dist/harness/types-public.js.map +1 -1
  52. package/dist/harness/validator-trace-sink.d.ts +4 -3
  53. package/dist/index.d.ts +46 -11
  54. package/dist/index.js +1217 -214
  55. package/dist/index.js.map +1 -1
  56. package/dist/patch.d.ts +3 -3
  57. package/dist/{prompts-YU9piOgs.d.ts → prompts-BhNUuRoZ.d.ts} +1 -1
  58. package/dist/tools/render-check-worker.js +8 -1
  59. package/dist/tools/render-check-worker.js.map +1 -1
  60. package/dist/{types-public-BJTLpzWn.d.ts → types-public-h8IMnYuh.d.ts} +388 -3
  61. package/dist/validation/index.d.ts +1 -1
  62. package/dist/validation/index.js +1 -1
  63. package/dist/validation/index.js.map +1 -1
  64. package/dist/visual-evaluator-C2strxqD.d.ts +639 -0
  65. package/dist/workflows.d.ts +3 -3
  66. package/package.json +12 -12
  67. package/src/adapters/base.ts +6 -1
  68. package/src/adapters/claude/message-parser.ts +5 -6
  69. package/src/adapters/claude/sdk-tool-pins.ts +44 -0
  70. package/src/adapters/claude/sdk.ts +3 -3
  71. package/src/adapters/claude/source-capture.ts +20 -0
  72. package/src/adapters/generation-dispatch.ts +2 -0
  73. package/src/boilerplate/free-design-prompt.ts +3 -3
  74. package/src/boilerplate/hard-sections.ts +1 -1
  75. package/src/boilerplate/system-prompt.ts +3 -2
  76. package/src/boilerplate/templates/layouts/chat-mobile.tsx.tmpl +3 -1
  77. package/src/boilerplate/templates/layouts/chat-universal.tsx.tmpl +3 -1
  78. package/src/boilerplate/templates/layouts/fullscreen-desktop.tsx.tmpl +3 -1
  79. package/src/boilerplate/templates/layouts/fullscreen-universal.tsx.tmpl +3 -1
  80. package/src/check/run-tier0.ts +67 -3
  81. package/src/contract-context.ts +1 -1
  82. package/src/design-system-docs.ts +2 -1
  83. package/src/evaluation/cost-tracker.ts +54 -6
  84. package/src/evaluation/criteria/edge-probe.ts +286 -0
  85. package/src/evaluation/criteria/edge.ts +202 -0
  86. package/src/evaluation/criteria/resolve.ts +74 -8
  87. package/src/evaluation/index.ts +5 -1
  88. package/src/evaluation/judge-spend.ts +48 -0
  89. package/src/evaluation/loop.ts +25 -4
  90. package/src/evaluation/message-parsing.ts +11 -12
  91. package/src/evaluation/types-public.ts +95 -0
  92. package/src/evaluation/types.ts +10 -0
  93. package/src/evaluation/visual-evaluator.ts +236 -40
  94. package/src/harness/check/runtime-render/adapter.ts +18 -0
  95. package/src/harness/check/runtime-render/probe-pending.ts +111 -0
  96. package/src/harness/check/runtime-render/render-check-host.ts +10 -6
  97. package/src/harness/check/runtime-render/render-check-worker.ts +6 -3
  98. package/src/harness/check/runtime-render/render-check.ts +417 -133
  99. package/src/harness/check/runtime-render/walk.ts +200 -0
  100. package/src/harness/coding/assemble-result.ts +2 -0
  101. package/src/harness/coding/generate-task-runner.ts +27 -0
  102. package/src/harness/coding/init-session.ts +5 -3
  103. package/src/harness/coding/run-coding-turn.ts +5 -1
  104. package/src/harness/coding/run-eval-round.ts +63 -3
  105. package/src/harness/in-loop-evaluation.ts +39 -0
  106. package/src/harness/llm-router.ts +58 -1
  107. package/src/harness/result-types.ts +9 -0
  108. package/src/harness/runtime.ts +9 -0
  109. package/src/harness/types-public.ts +10 -1
  110. package/src/index.ts +5 -0
  111. package/src/internal/verdict-line.ts +33 -0
  112. package/src/taught-tokens.ts +31 -0
  113. package/src/tools/render-check-worker.ts +2 -1
  114. package/src/tools/render-check.ts +8 -7
  115. package/src/validation/primitives.ts +1 -1
  116. package/dist/llm-router-nfO7wPec.d.ts +0 -267
  117. package/dist/{bank-CT4eEkta.d.ts → bank-Ctdp3FUA.d.ts} +3 -3
package/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # @ggui-ai/ui-gen
2
2
 
3
- UI generation harness for [ggui](https://github.com/ggui-ai/ggui) — the engine that turns a `DataContract` into a working React component.
3
+ UI generation harness for [GGUI](https://github.com/ggui-ai/ggui) — the engine that turns a `DataContract` into a working React component.
4
4
 
5
5
  It bundles the three coupled pieces of the generation pipeline:
6
6
 
7
- - **System prompt** — the instructions that tell the LLM _how_ to code against the ggui design system.
7
+ - **System prompt** — the instructions that tell the LLM _how_ to code against the GGUI design system.
8
8
  - **Coding harness** — the multi-turn loop (implement → self-check → patch → evaluate) plus provider adapters for Claude, OpenAI, and Google models.
9
9
  - **Evaluation engine** — deterministic checks and LLM-judged scoring of generated components.
10
10
 
@@ -1,7 +1,7 @@
1
1
  import { RuntimeRenderCheck } from './harness/types-public.js';
2
2
  import { GenerationRuntimeProbeCheck } from '@ggui-ai/mcp-server-core';
3
3
  import { JsonObject, DataContract } from '@ggui-ai/protocol';
4
- import { P as ProbeHostLoad } from './types-public-BJTLpzWn.js';
4
+ import { f as ProbeHostLoad, g as ProbePendingAffordance } from './types-public-h8IMnYuh.js';
5
5
 
6
6
  /**
7
7
  * The subprocess bounds of one isolated check (ggui#1380). They are
@@ -38,6 +38,30 @@ interface RenderCheckHostOptions {
38
38
  readonly bounds?: Partial<RenderCheckHostBounds>;
39
39
  }
40
40
 
41
+ /**
42
+ * The action walk (ggui#1652): find a control that dispatches one action by
43
+ * walking the card's screens, as a person would, in a mount of its own.
44
+ *
45
+ * A screen is the card's set of controls, told apart by each control's tag,
46
+ * type, label (its aria-label, placeholder or text) and disabled state, never
47
+ * by typed values, selection or generated names.
48
+ * Picking an answer is the same screen unless it enables or disables a
49
+ * control; a wizard's next step, or an Edit button that now reads Save, is a
50
+ * new one. Each control is pressed once per screen. When every control on
51
+ * the current screen has been pressed, the walk returns over controls it has
52
+ * already pressed to the nearest screen that still has one to press. A press
53
+ * that leads back to a screen already seen is not progress, so Back and Next
54
+ * cannot loop, in any language. The walk stops at the first press that
55
+ * dispatches the action, when every reachable control has been pressed, at
56
+ * a cap on presses, or at its deadline. Neither the cap nor the deadline
57
+ * stops it while it is on the first screen with a control there still
58
+ * unpressed; once a press leaves the first screen both apply, and a
59
+ * first-screen control left unpressed is pressed only if a known route
60
+ * leads back to it (a one-way wizard has none).
61
+ */
62
+
63
+ type WalkStop = "dispatched" | "explored" | "press-cap" | "deadline" | "no-mount";
64
+
41
65
  /**
42
66
  * 3-state outcome. Internal to runtime-render.
43
67
  * The adapter maps this to existing EvalIssue shapes:
@@ -88,8 +112,23 @@ interface RenderCheckIssue {
88
112
  * beside `{ primed: 0 }` or `{ error }` than beside `{ primed: 1 }`.
89
113
  */
90
114
  readonly inputPriming?: InputPrimingDiagnostic;
115
+ /** For action-wiring (ggui#1652): how far the walk over the card's screens got without dispatching the action. */
116
+ readonly walk?: ActionWalkDiagnostic;
91
117
  };
92
118
  }
119
+ /**
120
+ * The action walk's account of an action it could not dispatch (ggui#1652):
121
+ * how many controls it pressed across how many screens, why it stopped,
122
+ * whether any screen rendered a control naming the action, and the last
123
+ * controls it pressed. Never the first button in the page.
124
+ */
125
+ interface ActionWalkDiagnostic {
126
+ readonly presses: number;
127
+ readonly screens: number;
128
+ readonly stoppedBy: Exclude<WalkStop, "dispatched">;
129
+ readonly namedControlSeen: boolean;
130
+ readonly lastPressed: readonly string[];
131
+ }
93
132
  /**
94
133
  * Outcome of `primeInputs` before the action-wiring probe (ggui#1187). A
95
134
  * priming failure never aborts the check — it is recorded here, on every
@@ -124,12 +163,21 @@ interface RenderCheckResult {
124
163
  readonly renderMs: number;
125
164
  /** Host load around an isolated check (absent in-process). */
126
165
  readonly hostLoad?: ProbeHostLoad;
166
+ /** ggui#1398: the pending-affordance walk, report-only; absent when no action walk ran. */
167
+ readonly pendingAffordance?: ProbePendingAffordance;
127
168
  };
128
169
  }
129
170
  interface RunRenderCheckInput {
130
171
  readonly sourceCode: string;
131
172
  readonly mockupProps: JsonObject;
132
173
  readonly contract?: DataContract;
174
+ /**
175
+ * Epoch ms by which the check must finish: set by the isolating host from
176
+ * its own bound, absent in-process. The report-only pending phase is
177
+ * skipped when less than {@link PENDING_PHASE_RESERVE_MS} remains, so it
178
+ * can never push a check past its bound (ggui#1398).
179
+ */
180
+ readonly deadlineAt?: number;
133
181
  }
134
182
  /**
135
183
  * Options of {@link runRenderCheck} (ggui#1380): the host's options —
@@ -41,8 +41,13 @@ interface ClaudeSdkConfig extends AdapterConfig {
41
41
  env?: Record<string, string>;
42
42
  /** MCP server configs for Claude Agent SDK (keyed by name) */
43
43
  mcpServers?: Record<string, McpServerConfig>;
44
- /** Allowed tool names for Claude Agent SDK */
44
+ /** Tool names to approve. Absent → every tool of every server in `mcpServers` (ggui#1714). */
45
45
  allowedTools?: string[];
46
+ /**
47
+ * CLI built-in tools to offer the model (e.g. `['Write']`). Default: none.
48
+ * An explicit opt-in: a built-in that writes or executes acts on the host (ggui#1714).
49
+ */
50
+ builtinTools?: readonly string[];
46
51
  /** Subagent definitions for Claude Agent SDK */
47
52
  agents?: Record<string, AgentDefinition>;
48
53
  /** Custom CLI path for Docker deployments */
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/base.ts"],"names":[],"mappings":";AA2FO,IAAe,mBAAf,MAAgC;AAAA,EAKrC,YAA+B,MAAA,EAA0B;AAA1B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAA2B;AAAA,EAA3B,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiB/B,eAAe,cAAA,EAAgC;AAC7C,IAAA,OAAO,iBAAiB,cAAc,CAAA;AAAA,EACxC;AACF;AAQA,SAAS,iBAAiB,OAAA,EAAyB;AACjD,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACtC,EAAA,OAAO,cAAc,CAAA,GAAI,OAAA,CAAQ,KAAA,CAAM,UAAA,GAAa,CAAC,CAAA,GAAI,OAAA;AAC3D;AAKO,SAAS,cAAA,CACd,WACG,WAAA,EACM;AACT,EAAA,IAAI,MAAA,CAAO,QAAQ,OAAO,IAAA;AAC1B,EAAA,IAAI,MAAA,CAAO,YAAY,OAAO,IAAA;AAC9B,EAAA,IAAI,MAAA,CAAO,iBAAiB,OAAO,IAAA;AACnC,EAAA,OAAO,WAAA,CAAY,KAAK,CAAC,IAAA,KAAS,CAAC,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAC,CAAA;AACvD","file":"base.js","sourcesContent":["// packages/ui-gen/src/adapters/base.ts\n//\n// Abstract base class for all generator adapters.\n\nimport type { McpServerConfig, AgentDefinition } from '@anthropic-ai/claude-agent-sdk';\nimport type { JsonObject } from '@ggui-ai/protocol';\nimport type { AdapterResult, ToolDefinition, ProviderName, AdapterMode } from './types';\n\n/**\n * Core configuration shared by all adapters.\n */\nexport interface AdapterConfig {\n /** API key for the provider (BYOK) */\n apiKey?: string;\n /** Use Bedrock instead of direct API (Claude only) */\n useBedrock?: boolean;\n /**\n * ggui#1185 — run on the machine's own Claude Code login instead of a key.\n * Claude SDK adapter only. The adapter strips every provider key from the\n * spawned env and pins the run tool-less, config-less and non-bare (see\n * `claude/claude-code-login.ts`). Opt-in; absent ⇒ key-based auth.\n */\n claudeCodeLogin?: boolean;\n /**\n * Thinking level for models with extended thinking (Gemini 3.x Flash\n * via the Interactions API). Mirrors the API's `thinking_level` enum —\n * `'minimal'` is the floor (the API has NO true off), then `'low'` /\n * `'medium'` / `'high'`. Omitted → provider default, and Gemini 3.5\n * Flash defaults thinking ON with no cap — the dominant latency cost\n * in contract-bounded UI generation. Only the Google adapter consumes\n * this today.\n */\n thinkingLevel?: 'minimal' | 'low' | 'medium' | 'high';\n}\n\n/**\n * Extended configuration for Claude Agent SDK adapter.\n * Separated from AdapterConfig to avoid polluting the base interface\n * with provider-specific concerns.\n */\nexport interface ClaudeSdkConfig extends AdapterConfig {\n /** Working directory for SDK subprocess */\n cwd?: string;\n /** Environment variables for SDK subprocess */\n env?: Record<string, string>;\n /** MCP server configs for Claude Agent SDK (keyed by name) */\n mcpServers?: Record<string, McpServerConfig>;\n /** Allowed tool names for Claude Agent SDK */\n allowedTools?: string[];\n /** Subagent definitions for Claude Agent SDK */\n agents?: Record<string, AgentDefinition>;\n /** Custom CLI path for Docker deployments */\n cliPath?: string;\n /** stderr callback for debug logging */\n stderr?: (data: string) => void;\n /** Progress callback */\n onProgress?: (event: { type: string; [key: string]: unknown }) => void;\n}\n\n/**\n * Union config type — adapters accept their specific config\n * but the registry uses this union so callers can pass any config.\n */\nexport type AnyAdapterConfig = AdapterConfig | ClaudeSdkConfig;\n\n/**\n * Parameters for a single generation run.\n */\nexport interface GenerateParams {\n /** System prompt (HOW to build — shared across all SDKs) */\n systemPrompt: string;\n /** User prompt (WHAT to build — the specific request) */\n userPrompt: string;\n /** Model identifier (provider-native format, e.g., 'claude-sonnet-4-6') */\n model: string;\n /** SDK-agnostic tool definitions */\n tools: ToolDefinition[];\n /** Maximum agentic loop turns */\n maxTurns: number;\n /** Model-specific options (e.g., speed_priority for Claude fast mode) */\n modelOptions?: JsonObject;\n}\n\n/**\n * Abstract base class for generator adapters.\n *\n * Each adapter wraps a specific provider SDK (Claude, OpenAI, Google)\n * in either raw API mode or agent SDK mode, and implements the tool-use\n * loop using the SDK's native API. All adapters produce the same\n * output format (AdapterResult).\n */\nexport abstract class GeneratorAdapter {\n abstract readonly provider: ProviderName;\n abstract readonly mode: AdapterMode;\n abstract readonly displayName: string;\n\n constructor(protected readonly config: AnyAdapterConfig) {}\n\n /**\n * Run UI generation with the given tools, prompt, and model.\n */\n abstract generate(params: GenerateParams): Promise<AdapterResult>;\n\n /**\n * Check if this adapter can run (SDK installed, credentials available).\n */\n abstract isAvailable(): boolean;\n\n /**\n * Map a LiteLLM-format model ID to this SDK's native format.\n * Default: strips the provider prefix (e.g., 'anthropic/claude-sonnet-4-6' -> 'claude-sonnet-4-6').\n * Override only if the prefix convention differs.\n */\n resolveModelId(litellmModelId: string): string {\n return stripModelPrefix(litellmModelId);\n }\n}\n\n/**\n * Strip provider prefix from LiteLLM-format model IDs.\n * 'anthropic/claude-sonnet-4-6' -> 'claude-sonnet-4-6'\n * 'openai/gpt-5.3-codex' -> 'gpt-5.3-codex'\n * 'gemini/gemini-3-flash-preview' -> 'gemini-3-flash-preview'\n */\nfunction stripModelPrefix(modelId: string): string {\n const slashIndex = modelId.indexOf('/');\n return slashIndex >= 0 ? modelId.slice(slashIndex + 1) : modelId;\n}\n\n/**\n * Check if credentials are available from config or environment variables.\n */\nexport function hasCredentials(\n config: AdapterConfig,\n ...envVarNames: string[]\n): boolean {\n if (config.apiKey) return true;\n if (config.useBedrock) return true;\n if (config.claudeCodeLogin) return true;\n return envVarNames.some((name) => !!process.env[name]);\n}\n"]}
1
+ {"version":3,"sources":["../../src/adapters/base.ts"],"names":[],"mappings":";AAgGO,IAAe,mBAAf,MAAgC;AAAA,EAKrC,YAA+B,MAAA,EAA0B;AAA1B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAA2B;AAAA,EAA3B,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiB/B,eAAe,cAAA,EAAgC;AAC7C,IAAA,OAAO,iBAAiB,cAAc,CAAA;AAAA,EACxC;AACF;AAQA,SAAS,iBAAiB,OAAA,EAAyB;AACjD,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACtC,EAAA,OAAO,cAAc,CAAA,GAAI,OAAA,CAAQ,KAAA,CAAM,UAAA,GAAa,CAAC,CAAA,GAAI,OAAA;AAC3D;AAKO,SAAS,cAAA,CACd,WACG,WAAA,EACM;AACT,EAAA,IAAI,MAAA,CAAO,QAAQ,OAAO,IAAA;AAC1B,EAAA,IAAI,MAAA,CAAO,YAAY,OAAO,IAAA;AAC9B,EAAA,IAAI,MAAA,CAAO,iBAAiB,OAAO,IAAA;AACnC,EAAA,OAAO,WAAA,CAAY,KAAK,CAAC,IAAA,KAAS,CAAC,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAC,CAAA;AACvD","file":"base.js","sourcesContent":["// packages/ui-gen/src/adapters/base.ts\n//\n// Abstract base class for all generator adapters.\n\nimport type { McpServerConfig, AgentDefinition } from '@anthropic-ai/claude-agent-sdk';\nimport type { JsonObject } from '@ggui-ai/protocol';\nimport type { AdapterResult, ToolDefinition, ProviderName, AdapterMode } from './types';\n\n/**\n * Core configuration shared by all adapters.\n */\nexport interface AdapterConfig {\n /** API key for the provider (BYOK) */\n apiKey?: string;\n /** Use Bedrock instead of direct API (Claude only) */\n useBedrock?: boolean;\n /**\n * ggui#1185 — run on the machine's own Claude Code login instead of a key.\n * Claude SDK adapter only. The adapter strips every provider key from the\n * spawned env and pins the run tool-less, config-less and non-bare (see\n * `claude/claude-code-login.ts`). Opt-in; absent ⇒ key-based auth.\n */\n claudeCodeLogin?: boolean;\n /**\n * Thinking level for models with extended thinking (Gemini 3.x Flash\n * via the Interactions API). Mirrors the API's `thinking_level` enum —\n * `'minimal'` is the floor (the API has NO true off), then `'low'` /\n * `'medium'` / `'high'`. Omitted → provider default, and Gemini 3.5\n * Flash defaults thinking ON with no cap — the dominant latency cost\n * in contract-bounded UI generation. Only the Google adapter consumes\n * this today.\n */\n thinkingLevel?: 'minimal' | 'low' | 'medium' | 'high';\n}\n\n/**\n * Extended configuration for Claude Agent SDK adapter.\n * Separated from AdapterConfig to avoid polluting the base interface\n * with provider-specific concerns.\n */\nexport interface ClaudeSdkConfig extends AdapterConfig {\n /** Working directory for SDK subprocess */\n cwd?: string;\n /** Environment variables for SDK subprocess */\n env?: Record<string, string>;\n /** MCP server configs for Claude Agent SDK (keyed by name) */\n mcpServers?: Record<string, McpServerConfig>;\n /** Tool names to approve. Absent → every tool of every server in `mcpServers` (ggui#1714). */\n allowedTools?: string[];\n /**\n * CLI built-in tools to offer the model (e.g. `['Write']`). Default: none.\n * An explicit opt-in: a built-in that writes or executes acts on the host (ggui#1714).\n */\n builtinTools?: readonly string[];\n /** Subagent definitions for Claude Agent SDK */\n agents?: Record<string, AgentDefinition>;\n /** Custom CLI path for Docker deployments */\n cliPath?: string;\n /** stderr callback for debug logging */\n stderr?: (data: string) => void;\n /** Progress callback */\n onProgress?: (event: { type: string; [key: string]: unknown }) => void;\n}\n\n/**\n * Union config type — adapters accept their specific config\n * but the registry uses this union so callers can pass any config.\n */\nexport type AnyAdapterConfig = AdapterConfig | ClaudeSdkConfig;\n\n/**\n * Parameters for a single generation run.\n */\nexport interface GenerateParams {\n /** System prompt (HOW to build — shared across all SDKs) */\n systemPrompt: string;\n /** User prompt (WHAT to build — the specific request) */\n userPrompt: string;\n /** Model identifier (provider-native format, e.g., 'claude-sonnet-4-6') */\n model: string;\n /** SDK-agnostic tool definitions */\n tools: ToolDefinition[];\n /** Maximum agentic loop turns */\n maxTurns: number;\n /** Model-specific options (e.g., speed_priority for Claude fast mode) */\n modelOptions?: JsonObject;\n}\n\n/**\n * Abstract base class for generator adapters.\n *\n * Each adapter wraps a specific provider SDK (Claude, OpenAI, Google)\n * in either raw API mode or agent SDK mode, and implements the tool-use\n * loop using the SDK's native API. All adapters produce the same\n * output format (AdapterResult).\n */\nexport abstract class GeneratorAdapter {\n abstract readonly provider: ProviderName;\n abstract readonly mode: AdapterMode;\n abstract readonly displayName: string;\n\n constructor(protected readonly config: AnyAdapterConfig) {}\n\n /**\n * Run UI generation with the given tools, prompt, and model.\n */\n abstract generate(params: GenerateParams): Promise<AdapterResult>;\n\n /**\n * Check if this adapter can run (SDK installed, credentials available).\n */\n abstract isAvailable(): boolean;\n\n /**\n * Map a LiteLLM-format model ID to this SDK's native format.\n * Default: strips the provider prefix (e.g., 'anthropic/claude-sonnet-4-6' -> 'claude-sonnet-4-6').\n * Override only if the prefix convention differs.\n */\n resolveModelId(litellmModelId: string): string {\n return stripModelPrefix(litellmModelId);\n }\n}\n\n/**\n * Strip provider prefix from LiteLLM-format model IDs.\n * 'anthropic/claude-sonnet-4-6' -> 'claude-sonnet-4-6'\n * 'openai/gpt-5.3-codex' -> 'gpt-5.3-codex'\n * 'gemini/gemini-3-flash-preview' -> 'gemini-3-flash-preview'\n */\nfunction stripModelPrefix(modelId: string): string {\n const slashIndex = modelId.indexOf('/');\n return slashIndex >= 0 ? modelId.slice(slashIndex + 1) : modelId;\n}\n\n/**\n * Check if credentials are available from config or environment variables.\n */\nexport function hasCredentials(\n config: AdapterConfig,\n ...envVarNames: string[]\n): boolean {\n if (config.apiKey) return true;\n if (config.useBedrock) return true;\n if (config.claudeCodeLogin) return true;\n return envVarNames.some((name) => !!process.env[name]);\n}\n"]}
@@ -2,17 +2,18 @@ import { EvaluationConfig } from '../evaluation/types.js';
2
2
  import { RuntimeRenderCheck } from '../harness/types-public.js';
3
3
  import { ModelRoles, GenerationResult } from '../harness/result-types.js';
4
4
  import { ProviderName, ToolDefinition } from './types.js';
5
- import { Q as QualityConfig } from '../types-public-BJTLpzWn.js';
6
- import { A as AgentConfig, V as VisionProvider } from '../llm-router-nfO7wPec.js';
5
+ import { Q as QualityConfig, b as AgentConfig, V as VisionProvider } from '../types-public-h8IMnYuh.js';
7
6
  import { DataContract, JsonObject, GadgetDescriptor } from '@ggui-ai/protocol';
8
- import { C as CanvasClass, D as DesignMode } from '../design-mode-DLufhrNp.js';
9
- import { C as CriteriaBank } from '../bank-CT4eEkta.js';
7
+ import { C as CanvasClass, D as DesignMode } from '../design-mode-DGWN_Gkm.js';
8
+ import { C as CriteriaBank } from '../bank-Ctdp3FUA.js';
10
9
  import { G as GenerationProfileInput } from '../styling-profile-CxfvV48g.js';
11
- import { R as RenderingContext } from '../prompts-YU9piOgs.js';
10
+ import { R as RenderingContext } from '../prompts-BhNUuRoZ.js';
12
11
  import '../axes-CKVCzR_x.js';
13
12
  import '../llm.js';
14
13
  import '../types-Dh1s4K9j.js';
15
14
  import '../policy.js';
15
+ import '../visual-evaluator-C2strxqD.js';
16
+ import 'puppeteer-core';
16
17
  import 'zod';
17
18
  import '@ggui-ai/mcp-server-core';
18
19
 
@@ -83,6 +84,8 @@ interface GenerationDispatchParams {
83
84
  /** ggui#1436 — see `SingleComponentParams.visualEvaluation.criteriaBank`. */
84
85
  criteriaBank?: CriteriaBank;
85
86
  criteriaKind?: string;
87
+ /** ggui#1542 — see `SingleComponentParams.visualEvaluation.actOn`. */
88
+ actOn?: "critical" | "major";
86
89
  };
87
90
  /** Quality config controlling eval tiers and improvement behavior */
88
91
  qualityConfig?: QualityConfig;