@ggui-ai/ui-gen 0.28.0 → 0.29.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.
- package/dist/{adapter-h4_V69LI.d.ts → adapter-DLQ-5COm.d.ts} +1 -1
- package/dist/adapters/base.js +2 -27
- package/dist/adapters/base.js.map +1 -1
- package/dist/adapters/generation-dispatch.d.ts +14 -6
- package/dist/adapters/generation-dispatch.js +40 -19260
- package/dist/adapters/generation-dispatch.js.map +1 -1
- package/dist/adapters/index.d.ts +1 -1
- package/dist/adapters/index.js +25 -3561
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/types.js +2 -9
- package/dist/adapters/types.js.map +1 -1
- package/dist/advanced/index.d.ts +13 -12
- package/dist/advanced/index.js +63 -21954
- package/dist/advanced/index.js.map +1 -1
- package/dist/{bank-Ctdp3FUA.d.ts → bank-LWaiAtaA.d.ts} +1 -1
- package/dist/blueprint-validator.js +6 -2301
- package/dist/blueprint-validator.js.map +1 -1
- package/dist/boilerplate.d.ts +3 -2
- package/dist/boilerplate.js +6 -1867
- package/dist/boilerplate.js.map +1 -1
- package/dist/check/index.d.ts +3 -2
- package/dist/check/index.js +6 -1923
- package/dist/check/index.js.map +1 -1
- package/dist/chunk-33B3BAWS.js +24 -0
- package/dist/chunk-33B3BAWS.js.map +1 -0
- package/dist/chunk-3HSGA6NI.js +591 -0
- package/dist/chunk-3HSGA6NI.js.map +1 -0
- package/dist/chunk-3NNNGNTO.js +1707 -0
- package/dist/chunk-3NNNGNTO.js.map +1 -0
- package/dist/chunk-3T2HMTON.js +79 -0
- package/dist/chunk-3T2HMTON.js.map +1 -0
- package/dist/chunk-3ZSSDV3L.js +123 -0
- package/dist/chunk-3ZSSDV3L.js.map +1 -0
- package/dist/chunk-4MBR5GA3.js +99 -0
- package/dist/chunk-4MBR5GA3.js.map +1 -0
- package/dist/chunk-56NJFD55.js +337 -0
- package/dist/chunk-56NJFD55.js.map +1 -0
- package/dist/chunk-5AGTY555.js +26 -0
- package/dist/chunk-5AGTY555.js.map +1 -0
- package/dist/chunk-5EJM7EGY.js +115 -0
- package/dist/chunk-5EJM7EGY.js.map +1 -0
- package/dist/chunk-5KXCQLLR.js +529 -0
- package/dist/chunk-5KXCQLLR.js.map +1 -0
- package/dist/chunk-5VBXHVEH.js +171 -0
- package/dist/chunk-5VBXHVEH.js.map +1 -0
- package/dist/chunk-6KDDEING.js +515 -0
- package/dist/chunk-6KDDEING.js.map +1 -0
- package/dist/chunk-6VDRWAP6.js +123 -0
- package/dist/chunk-6VDRWAP6.js.map +1 -0
- package/dist/chunk-732IBFEJ.js +2400 -0
- package/dist/chunk-732IBFEJ.js.map +1 -0
- package/dist/chunk-73AURS3I.js +46 -0
- package/dist/chunk-73AURS3I.js.map +1 -0
- package/dist/chunk-77H5SKLX.js +8 -0
- package/dist/chunk-77H5SKLX.js.map +1 -0
- package/dist/chunk-7QE3AHLE.js +35 -0
- package/dist/chunk-7QE3AHLE.js.map +1 -0
- package/dist/chunk-A375NNWN.js +11 -0
- package/dist/chunk-A375NNWN.js.map +1 -0
- package/dist/chunk-AOU33EFS.js +140 -0
- package/dist/chunk-AOU33EFS.js.map +1 -0
- package/dist/chunk-BA4QYA6E.js +461 -0
- package/dist/chunk-BA4QYA6E.js.map +1 -0
- package/dist/chunk-DBP764GL.js +3 -0
- package/dist/chunk-DBP764GL.js.map +1 -0
- package/dist/chunk-DUU3ZJDQ.js +41 -0
- package/dist/chunk-DUU3ZJDQ.js.map +1 -0
- package/dist/chunk-DXKRBXNU.js +30 -0
- package/dist/chunk-DXKRBXNU.js.map +1 -0
- package/dist/chunk-FB7OEEAH.js +1467 -0
- package/dist/chunk-FB7OEEAH.js.map +1 -0
- package/dist/chunk-FLRNMZV2.js +18 -0
- package/dist/chunk-FLRNMZV2.js.map +1 -0
- package/dist/chunk-FWJIMKFZ.js +2032 -0
- package/dist/chunk-FWJIMKFZ.js.map +1 -0
- package/dist/chunk-FXRHWYIQ.js +163 -0
- package/dist/chunk-FXRHWYIQ.js.map +1 -0
- package/dist/chunk-G3PMV62Z.js +33 -0
- package/dist/chunk-G3PMV62Z.js.map +1 -0
- package/dist/chunk-GAJI7Y3P.js +13 -0
- package/dist/chunk-GAJI7Y3P.js.map +1 -0
- package/dist/chunk-GYINWMPR.js +2052 -0
- package/dist/chunk-GYINWMPR.js.map +1 -0
- package/dist/chunk-HD6ABIK7.js +484 -0
- package/dist/chunk-HD6ABIK7.js.map +1 -0
- package/dist/chunk-HDQVHYO6.js +100 -0
- package/dist/chunk-HDQVHYO6.js.map +1 -0
- package/dist/chunk-IHUT3SIW.js +7 -0
- package/dist/chunk-IHUT3SIW.js.map +1 -0
- package/dist/chunk-JDH5EGNZ.js +126 -0
- package/dist/chunk-JDH5EGNZ.js.map +1 -0
- package/dist/chunk-JMD4RGSV.js +37 -0
- package/dist/chunk-JMD4RGSV.js.map +1 -0
- package/dist/chunk-KJWGZL5B.js +33 -0
- package/dist/chunk-KJWGZL5B.js.map +1 -0
- package/dist/chunk-MKMDQFZ7.js +86 -0
- package/dist/chunk-MKMDQFZ7.js.map +1 -0
- package/dist/chunk-NF6JUZWF.js +85 -0
- package/dist/chunk-NF6JUZWF.js.map +1 -0
- package/dist/chunk-O2YC6XDC.js +1933 -0
- package/dist/chunk-O2YC6XDC.js.map +1 -0
- package/dist/chunk-OVLH5ICV.js +29 -0
- package/dist/chunk-OVLH5ICV.js.map +1 -0
- package/dist/chunk-PBOYHGSD.js +106 -0
- package/dist/chunk-PBOYHGSD.js.map +1 -0
- package/dist/chunk-PJFH7QWA.js +81 -0
- package/dist/chunk-PJFH7QWA.js.map +1 -0
- package/dist/chunk-PUH4CXGZ.js +284 -0
- package/dist/chunk-PUH4CXGZ.js.map +1 -0
- package/dist/chunk-QLXXPGTV.js +18 -0
- package/dist/chunk-QLXXPGTV.js.map +1 -0
- package/dist/chunk-R5GIGPW2.js +2845 -0
- package/dist/chunk-R5GIGPW2.js.map +1 -0
- package/dist/chunk-RH4IUSTO.js +83 -0
- package/dist/chunk-RH4IUSTO.js.map +1 -0
- package/dist/chunk-S2GVXKKY.js +153 -0
- package/dist/chunk-S2GVXKKY.js.map +1 -0
- package/dist/chunk-TVHGKFJS.js +58 -0
- package/dist/chunk-TVHGKFJS.js.map +1 -0
- package/dist/chunk-U7GALWLG.js +66 -0
- package/dist/chunk-U7GALWLG.js.map +1 -0
- package/dist/chunk-VTC263LT.js +256 -0
- package/dist/chunk-VTC263LT.js.map +1 -0
- package/dist/chunk-WEOXFEVE.js +739 -0
- package/dist/chunk-WEOXFEVE.js.map +1 -0
- package/dist/chunk-WYHP46LT.js +28 -0
- package/dist/chunk-WYHP46LT.js.map +1 -0
- package/dist/chunk-XGLO5LGG.js +274 -0
- package/dist/chunk-XGLO5LGG.js.map +1 -0
- package/dist/chunk-XRBCRKA2.js +29 -0
- package/dist/chunk-XRBCRKA2.js.map +1 -0
- package/dist/chunk-XW7ADFFV.js +340 -0
- package/dist/chunk-XW7ADFFV.js.map +1 -0
- package/dist/chunk-YIQ42IUX.js +34 -0
- package/dist/chunk-YIQ42IUX.js.map +1 -0
- package/dist/chunk-YJZTUY7B.js +101 -0
- package/dist/chunk-YJZTUY7B.js.map +1 -0
- package/dist/chunk-Z3CXME3K.js +107 -0
- package/dist/chunk-Z3CXME3K.js.map +1 -0
- package/dist/classifier/index.js +2 -527
- package/dist/classifier/index.js.map +1 -1
- package/dist/client-JBPCXU7W.js +4 -0
- package/dist/client-JBPCXU7W.js.map +1 -0
- package/dist/compose.js +3 -367
- package/dist/compose.js.map +1 -1
- package/dist/cost-tracker-HHGQ4FTW.js +67 -0
- package/dist/cost-tracker-HHGQ4FTW.js.map +1 -0
- package/dist/{create-ui-generator-BrZHF0cf.d.ts → create-ui-generator-BY-WeaPi.d.ts} +3 -3
- package/dist/{design-mode-DGWN_Gkm.d.ts → design-mode-XyOQmzE0.d.ts} +4 -3
- package/dist/{dispatch-B07TI30d.d.ts → dispatch-8LzTddKw.d.ts} +3 -2
- package/dist/dist-UALN6ZVB.js +543 -0
- package/dist/dist-UALN6ZVB.js.map +1 -0
- package/dist/dupe-break-X6K7QFIS.js +4 -0
- package/dist/dupe-break-X6K7QFIS.js.map +1 -0
- package/dist/evaluation/axis-checks/index.d.ts +5 -4
- package/dist/evaluation/axis-checks/index.js +6 -1914
- package/dist/evaluation/axis-checks/index.js.map +1 -1
- package/dist/evaluation/axis-checks/registry.d.ts +3 -2
- package/dist/evaluation/axis-checks/registry.js +3 -1844
- package/dist/evaluation/axis-checks/registry.js.map +1 -1
- package/dist/evaluation/index.d.ts +49 -132
- package/dist/evaluation/index.js +302 -6466
- package/dist/evaluation/index.js.map +1 -1
- package/dist/evaluation/types.d.ts +3 -2
- package/dist/evaluation/types.js +2 -5
- package/dist/evaluation/types.js.map +1 -1
- package/dist/fragments/index.js +2 -338
- package/dist/fragments/index.js.map +1 -1
- package/dist/{generate-tSO_shQ0.d.ts → generate-DQ4ci90s.d.ts} +1 -1
- package/dist/harness/check/runtime-render/index.d.ts +35 -15
- package/dist/harness/check/runtime-render/index.js +6 -2390
- package/dist/harness/check/runtime-render/index.js.map +1 -1
- package/dist/harness/check/runtime-render/render-check-worker.js +4 -1739
- package/dist/harness/check/runtime-render/render-check-worker.js.map +1 -1
- package/dist/harness/index.d.ts +3 -2
- package/dist/harness/index.js +23 -5126
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/llm-trace-sink.js +2 -24
- package/dist/harness/llm-trace-sink.js.map +1 -1
- package/dist/harness/prompts.d.ts +2 -2
- package/dist/harness/prompts.js +8 -324
- package/dist/harness/prompts.js.map +1 -1
- package/dist/harness/result-types.d.ts +6 -5
- package/dist/harness/result-types.js +2 -0
- package/dist/harness/result-types.js.map +1 -1
- package/dist/harness/runtime.d.ts +22 -5
- package/dist/harness/runtime.js +10 -2313
- package/dist/harness/runtime.js.map +1 -1
- package/dist/harness/types-public.d.ts +3 -2
- package/dist/harness/types-public.js +16 -2954
- package/dist/harness/types-public.js.map +1 -1
- package/dist/harness/validator-trace-sink.d.ts +3 -2
- package/dist/harness/validator-trace-sink.js +2 -26
- package/dist/harness/validator-trace-sink.js.map +1 -1
- package/dist/hash.js +2 -39
- package/dist/hash.js.map +1 -1
- package/dist/hashline-5OKREIRM.js +4 -0
- package/dist/hashline-5OKREIRM.js.map +1 -0
- package/dist/index.d.ts +50 -11
- package/dist/index.js +57 -22015
- package/dist/index.js.map +1 -1
- package/dist/llm-evaluator-PN3WFCS4.js +653 -0
- package/dist/llm-evaluator-PN3WFCS4.js.map +1 -0
- package/dist/magic-string.es-2NZTC4GZ.js +1307 -0
- package/dist/magic-string.es-2NZTC4GZ.js.map +1 -0
- package/dist/patch.d.ts +3 -2
- package/dist/patch.js +2 -56
- package/dist/patch.js.map +1 -1
- package/dist/policy-VCYKGSAC.js +5 -0
- package/dist/policy-VCYKGSAC.js.map +1 -0
- package/dist/policy.js +2 -35
- package/dist/policy.js.map +1 -1
- package/dist/primitive-index-2OF6F4TZ.js +131 -0
- package/dist/primitive-index-2OF6F4TZ.js.map +1 -0
- package/dist/primitive-slice-WTMBLYFJ.js +235 -0
- package/dist/primitive-slice-WTMBLYFJ.js.map +1 -0
- package/dist/{prompts-BhNUuRoZ.d.ts → prompts-CLZGywMP.d.ts} +1 -1
- package/dist/provider-adapter-contract.js +10407 -14204
- package/dist/provider-adapter-contract.js.map +1 -1
- package/dist/provider-adapter.js +2 -44
- package/dist/provider-adapter.js.map +1 -1
- package/dist/providers/index.d.ts +89 -1
- package/dist/providers/index.js +115 -44
- package/dist/providers/index.js.map +1 -1
- package/dist/raw-C6KBH5I3.js +141 -0
- package/dist/raw-C6KBH5I3.js.map +1 -0
- package/dist/raw-FXSBXQTZ.js +7 -0
- package/dist/raw-FXSBXQTZ.js.map +1 -0
- package/dist/raw-MURDUPGK.js +8 -0
- package/dist/raw-MURDUPGK.js.map +1 -0
- package/dist/raw-T3GW3UVX.js +8 -0
- package/dist/raw-T3GW3UVX.js.map +1 -0
- package/dist/render-check-host-ZNIS6BJ5.js +5 -0
- package/dist/render-check-host-ZNIS6BJ5.js.map +1 -0
- package/dist/sdk-4JNSDNSR.js +6 -0
- package/dist/sdk-4JNSDNSR.js.map +1 -0
- package/dist/sdk-DIVJMHCX.js +7 -0
- package/dist/sdk-DIVJMHCX.js.map +1 -0
- package/dist/sdk-QRJOCRTS.js +7 -0
- package/dist/sdk-QRJOCRTS.js.map +1 -0
- package/dist/tag-balance-CTHCTRJ7.js +123 -0
- package/dist/tag-balance-CTHCTRJ7.js.map +1 -0
- package/dist/tools/get-primitives-ts.d.ts +1 -1
- package/dist/tools/get-primitives-ts.js +3 -1
- package/dist/tools/get-primitives-ts.js.map +1 -1
- package/dist/tools/render-check-worker.js +3 -40
- package/dist/tools/render-check-worker.js.map +1 -1
- package/dist/{types-public-h8IMnYuh.d.ts → types-public-hYlrerZh.d.ts} +35 -2
- package/dist/validation/index.d.ts +2 -2
- package/dist/validation/index.js +3 -498
- package/dist/validation/index.js.map +1 -1
- package/dist/{visual-evaluator-C2strxqD.d.ts → visual-evaluator-KskajxD5.d.ts} +14 -4
- package/dist/visual-evaluator-TGEXYQTP.js +12 -0
- package/dist/visual-evaluator-TGEXYQTP.js.map +1 -0
- package/dist/workflows.d.ts +3 -2
- package/dist/workflows.js +2 -151
- package/dist/workflows.js.map +1 -1
- package/package.json +20 -16
- package/src/adapters/claude/sdk.ts +4 -2
- package/src/adapters/claude/tool-bridge.ts +2 -1
- package/src/adapters/generation-dispatch.ts +9 -0
- package/src/adapters/openai/raw.ts +4 -0
- package/src/adapters/openai/sdk.ts +6 -1
- package/src/adapters/openai/tokens.ts +21 -7
- package/src/adapters/tool-bridge.ts +1 -1
- package/src/adapters/tools.ts +1 -1
- package/src/advanced/feedback.ts +1 -2
- package/src/advanced/generator.ts +4 -3
- package/src/boilerplate/free-design-prompt.ts +7 -0
- package/src/boilerplate/generate.ts +18 -5
- package/src/boilerplate/hard-sections.ts +8 -3
- package/src/boilerplate/react-hooks.ts +56 -0
- package/src/boilerplate/system-prompt.ts +12 -3
- package/src/check/run-tier0.ts +233 -8
- package/src/check/type-checker.ts +128 -16
- package/src/coding-agent/tools.ts +26 -3
- package/src/design-mode.ts +4 -9
- package/src/evaluation/axis-checks/checks/state-merge.ts +2 -4
- package/src/evaluation/axis-checks/checks/state-payload.ts +1 -28
- package/src/evaluation/axis-checks/checks/tint.ts +197 -0
- package/src/evaluation/axis-checks/helpers.ts +121 -0
- package/src/evaluation/axis-checks/registry.ts +2 -0
- package/src/evaluation/criteria/__fixtures__/edge-v2-draw2.json +4629 -0
- package/src/evaluation/criteria/bank.ts +1 -1
- package/src/evaluation/criteria/edge-instruments.ts +14 -0
- package/src/evaluation/criteria/edge-probe-v2.ts +352 -0
- package/src/evaluation/criteria/edge-v2.ts +242 -0
- package/src/evaluation/criteria/resolve.ts +24 -5
- package/src/evaluation/index.ts +3 -5
- package/src/evaluation/mcp-server.ts +0 -50
- package/src/evaluation/types-public.ts +6 -1
- package/src/evaluation/visual-evaluator.ts +161 -30
- package/src/harness/check/runtime-render/index.ts +28 -4
- package/src/harness/check/runtime-render/render-check.ts +20 -21
- package/src/harness/claude-agent-sdk-loader.ts +93 -0
- package/src/harness/claude-code-login-query.ts +1 -1
- package/src/harness/coding/generate-task-runner.ts +1 -0
- package/src/harness/coding/run-coding-turn.ts +3 -0
- package/src/harness/coding/run-eval-round.ts +9 -0
- package/src/harness/llm-router.ts +50 -2
- package/src/harness/runtime.ts +17 -0
- package/src/index.ts +9 -0
- package/src/providers/anthropic-tool-call.ts +263 -0
- package/src/providers/index.ts +13 -0
- package/src/tools/get-primitives-ts.ts +1 -1
- package/src/tools/render-check.ts +4 -4
- package/src/validation/primitives.ts +2 -1
- package/src/evaluation/loop.ts +0 -218
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/evaluation/llm-evaluator.ts"],"names":[],"mappings":"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","file":"llm-evaluator-PN3WFCS4.js","sourcesContent":["// packages/ui-gen/src/evaluation/llm-evaluator.ts\n//\n// Parallel per-criterion LLM evaluator with cached mother prompt.\n//\n// Architecture:\n// 1. Mother prompt (cached, sent once): user request + contract + design system + all criteria definitions\n// 2. 7 parallel per-criterion LLM calls, each reusing the cached mother prompt\n// 3. Each call returns a focused tool response for one criterion\n//\n// Tiers:\n// Tier 1 — Critical (always blocks): functionality, crash → { pass: boolean, issues?: string[] }\n// Tier 2 — Quality (LLM decides): interactivity, accessibility, layout, loading, visual → { result: 'fail'|'warn'|'pass', issues?: string[] }\n//\n// Caching: Anthropic ephemeral cache, OpenAI auto-cache, Google explicit cache.\n// Same system prompt across all 7 calls → first call caches, 6 remaining hit cache.\n\nimport { buildStylingProfileJudgeBlock } from '../boilerplate/styling-profile.js';\nimport type { GenerationProfileInput } from '../boilerplate/styling-profile.js';\nimport type {\n EvalIssue,\n EvalResult,\n EvalCategory,\n CriterionCoverage,\n CriterionRunStatus,\n} from './types-public.js';\nimport { LLM_EVAL_STATIC_CRITERIA } from './types-public.js';\nimport { createAgent } from '../harness/llm-router';\nimport type { AgentConfig, LLMToolDef, LLMAgent, LLMToolCallResponse } from '../harness/llm-router';\nimport type { JsonObject } from '@ggui-ai/protocol';\nimport { getCriterionById } from './types-public.js';\nimport { DEFAULT_DESIGN_MODE, type DesignMode } from '../design-mode.js';\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Safely coerce LLM tool output to string[].\n *\n * LLMs sometimes return `issues` as a JSON string instead of an array.\n * Iterating a string goes character-by-character, creating thousands of\n * single-char \"issues\". This helper handles: string[] (pass-through),\n * string (JSON parse), or anything else (empty array).\n */\nfunction coerceStringArray(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.filter((v): v is string => typeof v === 'string' && v.length > 1);\n }\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) {\n return parsed.filter((v): v is string => typeof v === 'string' && v.length > 1);\n }\n } catch {\n // Not JSON — treat the whole string as a single issue\n if (value.length > 1) return [value];\n }\n }\n return [];\n}\n\n// =============================================================================\n// Public interfaces\n// =============================================================================\n\nexport interface LLMEvalContext {\n sourceCode: string;\n originalPrompt: string;\n designContext?: string;\n contract?: unknown;\n /**\n * Which triad produced the source. Selects the criteria text\n * (`criteriaFor`) and the mother prompt's styling rules: in `free`\n * mode the `tokens` criterion narrows to color and the `visual`\n * criterion + \"Design System Rules\" block become arm-neutral. Absent\n * means `constrained` (byte-identical to the pre-`designMode` prompt).\n */\n designMode?: DesignMode;\n /** The app's generation profile (#991) — the judge reads the same text the coder was given. */\n profile?: GenerationProfileInput;\n}\n\nexport interface LLMEvalConfig {\n provider: 'claude' | 'openai' | 'google' | 'openrouter';\n model?: string;\n /**\n * Explicit per-call credentials/routing (#484) — see\n * `AgentConfig.routeOverride`. Threaded onto the agent this\n * evaluator constructs so it never falls back to reading\n * `process.env`. Absent (default) preserves existing behavior.\n */\n routeOverride?: AgentConfig['routeOverride'];\n /**\n * Provider-429-retry observer (#489) — see `AgentConfig.onRetry`.\n * Threaded onto the agent this evaluator constructs so a rate-limited\n * retry inside an evaluation turn's `apiCall()` reaches the same\n * caller the coding leg reaches. Absent (default) preserves existing\n * behavior (retries still happen; no observer fires).\n */\n onRetry?: AgentConfig['onRetry'];\n}\n\n/** A request-specific evaluation criterion generated by the LLM. */\nexport interface DynamicCriterion {\n name: string;\n description: string;\n}\n\n/** Pre-warmed evaluation context (generated during coding, consumed at eval time). */\nexport interface PreWarmedEvalContext {\n motherPrompt: string;\n dynamicCriteria: DynamicCriterion[];\n}\n\n// =============================================================================\n// Mother prompt builder (cacheable context)\n// =============================================================================\n\nexport interface EvalContext {\n originalPrompt: string;\n contract?: unknown;\n designSystemSummary?: string;\n /** See `LLMEvalContext.designMode`. */\n designMode?: DesignMode;\n /** See `LLMEvalContext.profile`. */\n profile?: GenerationProfileInput;\n}\n\n/**\n * Arm-neutral styling rules for `designMode: 'free'` — replaces the\n * constrained \"Design System Rules\" block. Mirrors the free prompt: color\n * on the closed token manifest, everything else may be literal, raw HTML\n * + CSS is a first-class choice.\n */\nconst FREE_STYLING_RULES = `## Styling Rules (important for evaluation)\n- Color: every color must be a bare \\`var(--ggui-color-*)\\` token — a hardcoded #hex, rgb()/hsl() or CSS named color is a fail, and so is a literal fallback inside \\`var(--ggui-*, …)\\`.\n- Accent text (eyebrow, tagline, link, label) painted with a bare \\`var(--ggui-color-primary-300…600)\\` is a readability fail — the accent ink is \\`var(--ggui-color-link)\\`; a tint as text on a primary fill and a deep stop (700–900) on a light tint are fine\n- Spacing, typography, radius, shadow geometry and layout values MAY be literals (\\`padding: '20px'\\`, \\`fontSize: 18\\`, \\`borderRadius: 12\\`) — NEVER flag them.\n- Raw HTML elements with inline styles or \\`<style>\\` blocks are a first-class choice — never flag \"not using the design system\" or reward using it.\n- When \\`@ggui-ai/design\\` primitives ARE used, their enum/scale props (\\`variant=\"primary\"\\`, \\`size=\"lg\"\\`, \\`gap=\"md\"\\`, \\`tone=\"muted\"\\`, \\`surface=\"accent\"\\`) are valid.\n- One \\`export default function Component\\` — helper components as named functions above it are fine`;\n\nconst CONSTRAINED_STYLING_RULES = `## Design System Rules (important for evaluation)\n- Spacing props (\\`gap\\`, \\`padding\\`, \\`margin\\`) take a t-shirt-scale name: \\`gap=\"md\"\\`, \\`padding=\"lg\"\\` (\\`none|xs|sm|md|lg|xl|2xl\\`). **These ARE design tokens** — each resolves to a \\`--ggui-spacing-*\\` variable. A raw \\`var(--ggui-spacing-*)\\` string is an accepted escape hatch. NEVER flag a scale name as \"hardcoded\". Only a numeric prop (\\`padding={24}\\`) or a raw CSS length (\\`gap=\"13px\"\\`) bypasses the scale and should be warned.\n- All colors must use CSS variables: \\`color=\"var(--ggui-color-onContainer)\"\\` — hardcoded #hex or rgb() is a fail\n- Accent text (eyebrow, tagline, link, label) painted with a bare \\`primary-300…600\\` stop is a readability fail — the accent ink is \\`var(--ggui-color-link)\\` (or \\`tone=\"emphasized\"\\`); tints as text on a primary fill and deep stops on a light tint are fine\n- Component props that take enum/scale values — \\`variant=\"primary\"\\`, \\`size=\"lg\"\\`, \\`gap=\"md\"\\`, \\`padding=\"lg\"\\`, \\`shadow=\"md\"\\`, \\`radius=\"lg\"\\`, \\`tone=\"muted\"\\`, \\`surface=\"accent\"\\` — are all design system tokens and are always valid\n- One \\`export default function Component\\` — helper components as named functions above it are fine`;\n\nconst CONSTRAINED_VISUAL_REFERENCE = `**visual**: Design system consistency.\n- Uses CSS variables (var(--ggui-*)) for colors, not hardcoded values\n- Consistent use of spacing tokens\n- Proper use of component variants (primary, outline, ghost)\n- Shadow, border-radius from design system tokens`;\n\nconst FREE_VISUAL_REFERENCE = `**visual**: Visual composition.\n- Clear hierarchy (one focal point, headings distinct from body), consistent spacing rhythm\n- Coherent palette drawn from the theme color tokens\n- Fit to the canvas: fluid width, nothing cramped or stretched\n- No reward or penalty for using (or not using) the design-system primitives`;\n\nconst CONSTRAINED_RAW_CLICK_TARGET_GAP = `- A raw \\`<div>\\` / \\`<span>\\` used as a click target without \\`as={Clickable}\\`\n (no role, no keyboard) — or any hand-rolled interactive element.`;\n\nconst FREE_RAW_CLICK_TARGET_GAP = `- A raw \\`<div>\\` / \\`<span>\\` used as a click target with no \\`role=\"button\"\\`,\n \\`tabIndex\\` and keyboard handler — a real \\`<button>\\` / \\`<a href>\\` is the\n correct raw element and is never a gap.`;\n\nexport function buildMotherPrompt(ctx: EvalContext): string {\n const parts: string[] = [];\n const designMode = ctx.designMode ?? DEFAULT_DESIGN_MODE;\n const free = designMode === 'free';\n\n parts.push(\n free\n ? `You are evaluating a generated React component. It was composed freely — raw HTML elements, inline styles and <style> blocks are allowed and the ggui design package is optional — against a data contract and a theme-token color rule.\nThe code has already passed automated checks (compilation, security, imports, color tokens).\nYour job is to evaluate ONE specific quality criterion per call.`\n : `You are evaluating a generated React component built with the ggui design system.\nThe code has already passed automated checks (compilation, security, imports, design tokens).\nYour job is to evaluate ONE specific quality criterion per call.`,\n );\n\n parts.push(`## About This Prompt\nThis system prompt has 2 sections:\n1. **Context** — the original user request and data contract\n2. **Criteria Reference** — definitions for all 7 evaluation criteria (your call will focus on one)\n\n## Input Messages\nYou will receive ONE user message per call containing:\n1. Which criterion to evaluate (e.g., \"Evaluate FUNCTIONALITY\")\n2. The source code with line numbers\n3. Example outputs showing the expected tool response format\n\nRespond with a single tool call (evaluate_{criterion}). Report ALL issues you find for that criterion, not just the first one. Each issue should be an actionable fix instruction.\n\n## Issue-array discipline (applies to EVERY criterion)\nThe \"issues\" array is for confirmed defects ONLY. Before adding an entry, it must be something you are CERTAIN is missing or broken. NEVER add:\n- a self-negating note (\"…actually this is fine\", \"so no issue here\", \"no actual crash scenarios are present\");\n- a speculative / conditional note (\"if the data is shaped X then…\", \"this may break when…\");\n- a \"should be verified\" / \"double-check that…\" note.\nIf you are not certain something is broken, it is a PASS — omit it entirely. An entry you describe as acceptable still counts against the score, so describing a non-issue is worse than saying nothing.`);\n\n parts.push(`## Original Request\n${ctx.originalPrompt}`);\n\n if (ctx.contract) {\n parts.push(`## Data Contract (JSON Schema → TypeScript types)\n\nThe component's boilerplate was generated from this contract. All types are compiler-enforced:\n- \\`props\\` → \\`interface Props\\` — every field must be rendered in the UI\n- \\`actionSpec\\` (flat map keyed by action name) → \\`useAction<Payload>(name)\\` hooks — each must be wired to a UI element (button, form, etc.)\n- \\`actionSpec[name].nextStep\\` (optional) — names an agent-side MCP tool the agent SHOULD invoke on its\n next turn after the action fires. Surfaces as advisory event metadata; the component does NOT call\n the named tool. Use it to judge whether button labels/icons match the underlying action's intent.\n- \\`streamSpec\\` (flat map keyed by channel name) → \\`useStream<T>(name)\\` hooks — each must be consumed with null guard (\\`.latest && ...\\`)\n- \\`agentCapabilities.tools\\` is a READ-ONLY catalog — the AGENT invokes these. The component never calls them.\n References surface only via \\`actionSpec[*].nextStep\\` and \\`streamSpec[*].source.tool\\`. Do NOT flag\n missing component-side calls for these.\n- \\`clientCapabilities.gadgets\\` → a map keyed by npm PACKAGE name; each package maps export\n names to a descriptor. Two kinds, both contract features that MUST be used:\n • Built-in browser capabilities (\\`useGeolocation\\`, \\`useCamera\\`, \\`useClipboardWrite\\`,\n \\`useMicrophone\\`, \\`useFilePicker\\`, \\`useClipboardPaste\\`, \\`useNotifications\\`) — imported\n from \\`@ggui-ai/gadgets\\`.\n • Registered third-party gadgets — hooks or components — imported from their OWN package\n (e.g. \\`import { useChartTheme } from '@ggui-samples/gadget-chart'\\`). The boilerplate\n emits that import. Any export listed under \\`clientCapabilities.gadgets\\` IS part of the\n contract — NEVER flag it as \"not part of the contract\".\n\n\\`\\`\\`json\n${JSON.stringify(ctx.contract).slice(0, 6000)}\n\\`\\`\\``);\n }\n\n if (ctx.designSystemSummary) {\n parts.push(`## Design System\n${ctx.designSystemSummary}`);\n }\n\n parts.push(`${free ? FREE_STYLING_RULES : CONSTRAINED_STYLING_RULES}\n\n## Evaluation Criteria Reference\n\n### Tier 1 — Critical (blocks delivery)\n\n**functionality**: Does the component implement ALL features in the original request?\n- Check every noun/verb in the request against the rendered output\n- Missing feature = fail, even if other features work perfectly\n- Partial implementation = fail (e.g., search UI exists but doesn't filter)\n\n**crash**: Are there runtime crash scenarios?\n- Uninitialized state used in render (e.g., items.map when items could be undefined)\n- Missing event handlers referenced in JSX\n- Destructuring undefined objects\n- Array access without bounds checking\n- Missing null/undefined guards before .map(), .filter(), .length\n\n### Tier 2 — Quality (fail if severe, warn if improvement)\n\n**interactivity**: Does it have interactive elements appropriate for its purpose?\n- Forms should have submit buttons\n- Lists should be navigable\n- Editable fields should have save/cancel\n- Interactive components should have hover/focus feedback\n\n**accessibility**: Semantic HTML, labels, alt text, keyboard navigation, ARIA state.\n- Form inputs must have associated labels (label prop or aria-label)\n- Images need alt text\n- Interactive elements need keyboard support\n- Interactive controls expose their state (aria-checked / aria-selected / aria-expanded / aria-pressed), never styling alone\n- Proper heading hierarchy (h1 > h2 > h3)\n\n**layout**: Spacing, alignment, visual grouping.\n- Consistent spacing between sections\n- Related items grouped visually\n- No overlapping or cramped elements\n- Proper use of containers and cards for grouping\n\n**loading**: Loading/error/empty states for dynamic data.\n- Components receiving async data should show loading state\n- Error boundaries or error messages for failure cases\n- Empty states (\"No items found\") when data arrays could be empty\n\n${free ? FREE_VISUAL_REFERENCE : CONSTRAINED_VISUAL_REFERENCE}\n\n## Primitive Accessibility (built-in — do NOT flag as missing)\n\nggui design-system primitives ship their own ARIA. The code you are\nreading imports them from \\`@ggui-ai/design\\`; the source does NOT show\ntheir internal markup. NEVER report a primitive below as missing a\nrole, aria-*, label, or keyboard support — it is already there:\n\n- \\`Input\\` / \\`Select\\` / \\`TextArea\\` — render a real \\`<label htmlFor>\\` from\n the \\`label\\` prop, plus \\`aria-invalid\\` + \\`aria-describedby\\` + an error\n \\`role=\"alert\"\\`. A primitive that has a \\`label\\` prop IS labelled.\n- \\`RadioGroup\\` — \\`role=\"radiogroup\"\\` + \\`aria-labelledby\\` from its \\`label\\`.\n- \\`Checkbox\\` — wrapped in its own \\`<label>\\`.\n- \\`Toggle\\` — \\`role=\"switch\"\\` + \\`aria-checked\\` + \\`aria-label\\`.\n- \\`Progress\\` — \\`role=\"progressbar\"\\` + \\`aria-valuenow/min/max\\` + \\`aria-label\\`.\n- \\`Slider\\` — full \\`aria-valuenow/min/max\\` slider semantics.\n- \\`Spinner\\` — \\`role=\"status\"\\` + \\`aria-label=\"Loading\"\\`.\n- \\`Skeleton\\` — \\`aria-hidden\\` (correctly decorative).\n- \\`Tabs\\` — full \\`role=\"tablist\"/\"tab\"/\"tabpanel\"\\` + \\`aria-selected/controls\\`.\n- \\`Stepper\\` — \\`<nav aria-label=\"Progress\">\\` + \\`aria-current=\"step\"\\` on the\n active step; steps become real buttons when \\`onStepClick\\` is passed. It is\n display-only by design — the component owning the step index in its own\n \\`useState\\` is CORRECT, never a gap.\n- \\`Accordion\\` — \\`aria-expanded\\` + \\`aria-controls\\` + \\`role=\"region\"\\`.\n- \\`Alert\\` — \\`role=\"alert\"\\`; \\`Toast\\` — \\`role=\"alert\"\\` + \\`aria-live\\`.\n- \\`Tooltip\\` — \\`role=\"tooltip\"\\`.\n- \\`Clickable\\` (trait, applied via \\`as={Clickable}\\`) — \\`role=\"button\"\\` +\n \\`tabIndex={0}\\` + Enter/Space keyboard activation.\n- \\`Icon\\` — decorative by default (\\`aria-hidden\\`); exposes \\`role=\"img\"\\` +\n the label ONLY when an \\`aria-label\\` prop is passed. A bare \\`<Icon>\\` next\n to text is CORRECTLY silent — never ask for \\`aria-hidden\\`, it is there.\n\nREAL accessibility gaps worth flagging:\n${free ? FREE_RAW_CLICK_TARGET_GAP : CONSTRAINED_RAW_CLICK_TARGET_GAP}\n- A hand-rolled control whose state (checked / selected / expanded /\n pressed) is conveyed ONLY by styling — e.g. a styled-div \"checkbox\"\n with a check icon + strikethrough label but no \\`role=\"checkbox\"\\` /\n \\`aria-checked\\`. Note \\`as={Clickable}\\` adds button + keyboard\n semantics but NOT state — \\`aria-checked\\` / \\`aria-pressed\\` /\n \\`aria-selected\\` / \\`aria-expanded\\` must be passed explicitly.\n- An \\`<img>\\` / \\`<Image>\\` with no alt text.\n- \\`<Input>\\` / \\`<Select>\\` / \\`<TextArea>\\` used with NO \\`label\\` prop.\n- An icon-only \\`<Button>\\` (no text child) with no \\`aria-label\\`.\n- Live or streaming data (stream \\`.latest\\`, counters, real-time clocks)\n rendered in a plain element with no \\`aria-live\\` / \\`role=\"status\"\\`.\n- Inverted or skipped heading levels (an \\`<Heading level={3}>\\` rendered\n before the page's \\`<Heading level={1}>\\`).`);\n\n const profileBlock = buildStylingProfileJudgeBlock(ctx.profile);\n if (profileBlock.length > 0) parts.push(profileBlock);\n return parts.join('\\n\\n');\n}\n\n// =============================================================================\n// Per-criterion tool definitions\n// =============================================================================\n\n/** Tier 1 tool schema: binary pass/fail with issues list */\nfunction makeTier1Tool(criterion: string): LLMToolDef {\n return {\n name: `evaluate_${criterion}`,\n description: `Submit evaluation result for ${criterion}`,\n parameters: {\n type: 'object',\n required: ['pass'],\n properties: {\n pass: { type: 'boolean' },\n issues: {\n type: 'array',\n items: { type: 'string' },\n description: 'List of specific issues found',\n },\n },\n },\n };\n}\n\n/** Tier 2 tool schema: fail/warn/pass with issues list */\nfunction makeTier2Tool(criterion: string): LLMToolDef {\n return {\n name: `evaluate_${criterion}`,\n description: `Submit evaluation result for ${criterion}`,\n parameters: {\n type: 'object',\n required: ['result'],\n properties: {\n result: {\n type: 'string',\n enum: ['fail', 'warn', 'pass'],\n },\n issues: {\n type: 'array',\n items: { type: 'string' },\n description: 'List of specific issues found',\n },\n },\n },\n };\n}\n\n// =============================================================================\n// Per-criterion user prompts\n// =============================================================================\n\nfunction getCriterionPrompt(\n criterion: string,\n numberedSource: string,\n designMode: DesignMode,\n): string {\n const sourceBlock = `\\nSource code (with line numbers):\\n\\`\\`\\`tsx\\n${numberedSource}\\n\\`\\`\\``;\n\n // Use criteria.ts as single source of truth when available\n const criterionDef = getCriterionById(criterion, designMode);\n if (criterionDef && criterionDef.tier > 0) {\n return `${criterionDef.evalInstruction}\n${sourceBlock}\n\nReturn your evaluation using the evaluate_${criterion} tool.`;\n }\n\n // Fallback for criteria not yet in criteria.ts\n\n switch (criterion) {\n case 'functionality':\n return `Evaluate FUNCTIONALITY: Does this component implement ALL features from the request AND the data contract?\n\nCheck against BOTH sources:\n1. **Original request** — each feature must be coded AND rendered in JSX\n2. **Data contract** (if present in the context above) — verify:\n - ALL Props fields are rendered somewhere in the UI (not just accepted as params)\n - ALL useAction hooks are wired to clickable UI elements (buttons, forms, cards)\n - ALL useStream hooks have their \\`.latest\\` data rendered (with null guard)\n - ALL clientCapabilities hooks (useGeolocation / useCamera / etc.) are called in the component body and their values either render directly or thread into a context / action payload\n\nA contract hook that is declared but never used in JSX is a MISSING feature.\n\n**CRITICAL RULE:** The \"issues\" array must ONLY contain MISSING or BROKEN features. Do NOT list features that ARE implemented.\n\nDesign token usage (hardcoded colors, numeric spacing) is NOT a functionality issue — ignore it here.\n${sourceBlock}\n\nReturn your evaluation using the evaluate_functionality tool.\n\nExample outputs:\n- All features present: {\"pass\": true}\n- Missing features: {\"pass\": false, \"issues\": [\"Add Task form is not rendered — only state logic exists\", \"useAction('refresh') is declared but never wired to any button\"]}\n\nOnly missing or broken features go in the issues array. Nothing else.`;\n\n case 'crash':\n return `Evaluate CRASH SAFETY: Are there ACTUAL runtime crash scenarios in this component?\n\n**CRITICAL RULE:** The \"issues\" array must ONLY contain code that WILL crash. Do NOT include safe code in the issues array — not even to explain why it's safe. If you checked a line and it has a guard, do not mention it at all.\n\n**These WILL crash (include in issues):**\n- .map() / .filter() / .length on a variable that is never initialized\n- Accessing a property of a value that could be undefined without a guard\n- Calling a function that is never defined\n- useStream().latest.field WITHOUT null guard — .latest is T | null\n- Optional Props field (has \\`?\\` in interface) accessed as props.field.x without guard — WILL crash if undefined\n- Array item field that could be undefined: items.map(item => item.priority.toUpperCase()) when priority is optional\n\n**These are SAFE (do NOT include in issues):**\n- Optional chaining: props.items?.map() — SAFE, skip it\n- Fallback values: items || [] — SAFE, skip it\n- Default parameters: (items = []) — SAFE, skip it\n- useState initializer: useState([]) — SAFE, skip it\n- Null check: items && items.map() — SAFE, skip it\n- stream.latest && stream.latest.field — SAFE, guarded\n- stream.all.map(...) — SAFE, .all is always an array (never null)\n- stream.all.length — SAFE, always a number\n- toolResult.data && toolResult.data.field — SAFE, guarded\n\nIf everything is safe, return {\"pass\": true} with no issues array.\n${sourceBlock}\n\nReturn your evaluation using the evaluate_crash tool.\n\nExample outputs:\n- Everything safe: {\"pass\": true}\n- Has crash: {\"pass\": false, \"issues\": [\"Line 41: selectedItem.name — selectedItem comes from .find() which returns undefined when no match, no guard\"]}\n\nOnly unguarded crash risks go in the issues array. Nothing else.`;\n\n case 'interactivity':\n return `Evaluate INTERACTIVITY: Does this component have sufficient interactive elements for its purpose?\n\nConsider: forms need submit buttons, lists need selection/navigation, editable content needs save/cancel, interactive elements need hover/focus feedback.\n\n**Contract actions** (if present): every useAction hook from the data contract should be triggered by a visible, clickable UI element. A declared action with no triggering button/link/form is a missing interaction.\n\n**Only list MISSING interactive elements in the issues array.** Do not list interactions that are present and working.\n${sourceBlock}\n\nReturn your evaluation using the evaluate_interactivity tool.\n\nExample outputs:\n- Sufficient: {\"result\": \"pass\"}\n- Minor gap: {\"result\": \"warn\", \"issues\": [\"No hover feedback on list items — users can't tell items are clickable\"]}\n- Severe gap: {\"result\": \"fail\", \"issues\": [\"Form has no submit button — users cannot complete the workflow\"]}\n\nUse 'fail' only for issues that block the component's core purpose.`;\n\n case 'accessibility':\n return `Evaluate ACCESSIBILITY: Check for missing labels, alt text, semantic HTML, keyboard navigation.\n\nLook for: form inputs without labels, images without alt text, non-semantic elements used for interactive purposes, missing aria attributes, heading hierarchy issues.\n\n**Only list MISSING accessibility features in the issues array.** Do not list things that are already accessible.\n${sourceBlock}\n\nReturn your evaluation using the evaluate_accessibility tool.\n\nExample outputs:\n- Clean: {\"result\": \"pass\"}\n- Minor issues: {\"result\": \"warn\", \"issues\": [\"Email input missing label prop\", \"Task edit uses double-click with no keyboard alternative\"]}\n- Severe: {\"result\": \"fail\", \"issues\": [\"No form inputs have labels — entire form is inaccessible to screen readers\"]}\n\nUse 'fail' only if the issue blocks delivery. Use 'warn' for improvements.`;\n\n case 'layout':\n return `Evaluate LAYOUT: Check spacing, alignment, visual grouping, and overall composition.\n\nLook for: inconsistent spacing, cramped elements, missing visual grouping (cards/sections), overlapping concerns in single containers, poor responsive patterns.\n\n**Only list ACTUAL layout problems in the issues array.** Do not list layout aspects that are working correctly.\n${sourceBlock}\n\nReturn your evaluation using the evaluate_layout tool.\n\nExample outputs:\n- Clean: {\"result\": \"pass\"}\n- Minor issues: {\"result\": \"warn\", \"issues\": [\"Header and content area have no visual separation\", \"Button group lacks consistent spacing\"]}\n- Severe: {\"result\": \"fail\", \"issues\": [\"All content rendered in a flat list with no visual structure — needs cards or sections\"]}\n\nUse 'fail' only for layouts that are fundamentally broken.`;\n\n case 'loading':\n return `Evaluate LOADING/EMPTY/ERROR STATES: Does the component handle async data, empty collections, and error cases?\n\nLook for: arrays that could be empty but have no empty state message, missing error handling for operations that can fail.\n\n**Contract-specific checks** (if present):\n- useStream hooks deliver data over time — consider showing a \"waiting for data\" state before .latest arrives\n- clientCapabilities hooks (e.g. useGeolocation) may return permission denials or undefined values — defensive null guards expected before threading into JSX\n\n**Only list MISSING states in the issues array.** Do not list states that are already handled. Components that receive all data via props (no streams, no async capabilities) do NOT need loading states — return pass.\n${sourceBlock}\n\nReturn your evaluation using the evaluate_loading tool.\n\nExample outputs:\n- Not applicable (props-driven): {\"result\": \"pass\"}\n- Missing states: {\"result\": \"warn\", \"issues\": [\"No empty state when items array is empty — should show 'No items found'\"]}\n- Severe: {\"result\": \"fail\", \"issues\": [\"Component shows blank screen when data hasn't loaded yet — needs loading spinner\"]}`;\n\n case 'visual':\n return `Evaluate VISUAL CONSISTENCY: Is the component using the design system correctly?\n\nLook for: hardcoded colors instead of CSS variables, numeric/raw-CSS spacing props that bypass the t-shirt scale, style objects that bypass the design system.\n\n**Only list ACTUAL design system violations in the issues array.** Do not list correct token usage. A t-shirt-scale spacing name (\\`gap=\"md\"\\`, \\`padding=\"lg\"\\`) IS correct token usage — never flag it as hardcoded; only numeric (\\`padding={16}\\`) or raw-CSS-length (\\`gap=\"13px\"\\`) spacing is a violation. Note: intentional custom colors (e.g., status indicators, category colors) are acceptable when no semantic token fits.\n${sourceBlock}\n\nReturn your evaluation using the evaluate_visual tool.\n\nExample outputs:\n- Clean: {\"result\": \"pass\"}\n- Minor issues: {\"result\": \"warn\", \"issues\": [\"Line 45: hardcoded '#f3f4f6' should use var(--ggui-color-sunken)\", \"Line 80: numeric padding={16} should use a scale name like padding='md'\"]}\n- Severe: {\"result\": \"fail\", \"issues\": [\"Component uses entirely custom styling with no design system tokens\"]}\n\nUse 'fail' only for pervasive design system violations. Use 'warn' for isolated cases.`;\n\n default:\n return `Evaluate ${criterion.toUpperCase()}.${sourceBlock}\\n\\nReturn your evaluation using the evaluate_${criterion} tool.`;\n }\n}\n\n// =============================================================================\n// Default models\n// =============================================================================\n\nfunction getDefaultEvalModel(provider: string): string {\n switch (provider) {\n case 'claude':\n return 'claude-haiku-5-5';\n case 'openai':\n return 'gpt-5.6-luna';\n case 'google':\n return 'gemini-3.5-flash-lite';\n default:\n return 'claude-haiku-5-5';\n }\n}\n\n// =============================================================================\n// Per-criterion evaluation call\n// =============================================================================\n\ninterface CriterionResult {\n criterion: string;\n tier: 1 | 2;\n issues: EvalIssue[];\n pass: boolean;\n /**\n * Did this criterion actually produce a verdict? The evaluator\n * fail-opens (`pass: true`) on LLM errors and missing tool calls so a\n * flaky call never blocks generation — this field is what keeps that\n * fail-open honest: `skipped` means `pass` carries zero evidence.\n */\n coverage: CriterionRunStatus;\n /** Populated for `skipped` — why the criterion produced no verdict. */\n skipReason?: string;\n /** This call's token accounting. The cache counts are present only when the\n * provider reported them — absent means unreported, never zero (ggui#1281). */\n tokens: { in: number; out: number; cacheRead?: number; cacheCreation?: number };\n durationMs: number;\n}\n\n/** A call's token accounting, carrying the prompt-cache counts only when the\n * provider reported them (the router's rule: absent is \"unreported\"). */\nfunction callTokens(response: LLMToolCallResponse): CriterionResult['tokens'] {\n return {\n in: response.inputTokens,\n out: response.outputTokens,\n ...(response.cacheReadTokens !== undefined ? { cacheRead: response.cacheReadTokens } : {}),\n ...(response.cacheCreationTokens !== undefined ? { cacheCreation: response.cacheCreationTokens } : {}),\n };\n}\n\n/**\n * The evaluation's summed token accounting. `inputTokens` is the NON-cached\n * input (the router's convention); the cache counts are the sums of what the\n * calls reported, and stay absent when no call reported one — so a caller can\n * tell \"no cache reads\" from \"the provider does not say\" (ggui#1281).\n */\nexport interface LLMEvalTokenUsage {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens?: number;\n cacheCreationTokens?: number;\n}\n\n/**\n * All valid categories for LLM evaluation — derived from the ONE static\n * list in types-public so the coverage stamp here and the harness's\n * bypass stamp (`notApplicableCoverage`) can never disagree on the set.\n */\nconst TIER_1_CRITERIA = LLM_EVAL_STATIC_CRITERIA.filter((c) => c.tier === 1).map((c) => c.criterion);\nconst TIER_2_CRITERIA = LLM_EVAL_STATIC_CRITERIA.filter((c) => c.tier === 2).map((c) => c.criterion);\n\nasync function evalCriterion(\n criterion: string,\n tier: 1 | 2,\n motherPrompt: string,\n numberedSource: string,\n agent: LLMAgent,\n model: string,\n designMode: DesignMode,\n): Promise<CriterionResult> {\n const start = Date.now();\n const tool = tier === 1 ? makeTier1Tool(criterion) : makeTier2Tool(criterion);\n const userPrompt = getCriterionPrompt(criterion, numberedSource, designMode);\n\n try {\n const response = await agent.callTools(\n model,\n motherPrompt,\n userPrompt,\n [tool],\n 'required',\n );\n\n const call = response.toolCalls[0];\n const durationMs = Date.now() - start;\n\n if (!call) {\n console.warn(`[eval] ${criterion}: no tool call returned`);\n return {\n criterion,\n tier,\n issues: [],\n pass: true,\n coverage: 'skipped',\n skipReason: 'no tool call returned',\n tokens: callTokens(response),\n durationMs,\n };\n }\n\n const raw = call.input as JsonObject;\n const issues: EvalIssue[] = [];\n let pass: boolean;\n\n if (tier === 1) {\n // Tier 1: binary pass/fail\n pass = raw.pass === true;\n const rawIssues = coerceStringArray(raw.issues);\n for (const desc of rawIssues) {\n issues.push({\n tier: 1,\n result: 'fail',\n category: criterion as EvalCategory,\n severity: 'critical',\n description: desc,\n fix: desc, // The issue description often includes the fix for tier 1\n });\n }\n // If pass is false but no issues listed, add a generic one\n if (!pass && issues.length === 0) {\n issues.push({\n tier: 1,\n result: 'fail',\n category: criterion as EvalCategory,\n severity: 'critical',\n description: `${criterion} check failed`,\n fix: `Fix ${criterion} issues`,\n });\n }\n } else {\n // Tier 2: fail/warn/pass\n const result = (raw.result as string) ?? 'pass';\n pass = result === 'pass';\n const rawIssues = coerceStringArray(raw.issues);\n const outcome = result === 'fail' ? 'fail' : 'warn';\n for (const desc of rawIssues) {\n issues.push({\n tier: 2,\n result: outcome as 'fail' | 'warn',\n category: criterion as EvalCategory,\n severity: result === 'fail' ? 'critical' : 'major',\n description: desc,\n fix: desc,\n });\n }\n }\n\n return {\n criterion,\n tier,\n issues,\n pass,\n coverage: 'ran',\n tokens: callTokens(response),\n durationMs,\n };\n } catch (e) {\n const durationMs = Date.now() - start;\n const message = e instanceof Error ? e.message : String(e);\n console.error(`[eval] ${criterion}: error — ${message}`);\n // On error, treat as pass to avoid blocking on flaky LLM calls.\n // `coverage: 'skipped'` discloses the fail-open: this criterion\n // produced NO verdict, and consumers must not read its `pass`\n // membership as evidence.\n return {\n criterion,\n tier,\n issues: [],\n pass: true,\n coverage: 'skipped',\n skipReason: message,\n tokens: { in: 0, out: 0 },\n durationMs,\n };\n }\n}\n\n// =============================================================================\n// Pre-warming\n// =============================================================================\n\n/**\n * Pre-warm evaluation context during the coding phase.\n *\n * Builds the mother prompt during coding so it's ready when eval starts.\n * The result can be passed to runLLMEvaluation() to avoid redundant work.\n */\nexport async function preWarmEval(\n context: LLMEvalContext,\n _config: LLMEvalConfig,\n): Promise<PreWarmedEvalContext> {\n const motherPrompt = buildMotherPrompt({\n originalPrompt: context.originalPrompt,\n contract: context.contract,\n designSystemSummary: context.designContext,\n designMode: context.designMode,\n profile: context.profile,\n });\n\n return { motherPrompt, dynamicCriteria: [] };\n}\n\n// =============================================================================\n// Response parsing (backward compat — used by tests)\n// =============================================================================\n\n/** Tier 1 categories — always tier 1 regardless of what LLM returns */\nconst TIER_1_CATEGORIES = new Set<string>(['functionality', 'crash']);\n\n/** Tier 2 categories */\nconst TIER_2_CATEGORIES = new Set<string>([\n 'interactivity',\n 'accessibility',\n 'layout',\n 'loading',\n 'visual',\n]);\n\n/** All valid categories for LLM evaluation */\nconst VALID_CATEGORIES = new Set<string>([\n ...TIER_1_CATEGORIES,\n ...TIER_2_CATEGORIES,\n]);\n\n/**\n * Parse the raw tool call input into a typed EvalResult.\n *\n * Exported for testing — not part of the public API.\n * Retained for backward compatibility with existing tests.\n */\nexport function parseEvalResponse(raw: JsonObject): EvalResult {\n const rawIssues = (raw.issues ?? []) as Array<JsonObject>;\n const rawPass = (raw.pass ?? []) as string[];\n\n const issues: EvalIssue[] = rawIssues\n .filter((i) => {\n const cat = i.category as string;\n return VALID_CATEGORIES.has(cat);\n })\n .map((i) => {\n const category = i.category as string;\n const isTier1 = TIER_1_CATEGORIES.has(category);\n\n // Enforce correct tier based on category\n const tier = isTier1 ? 1 : 2;\n\n // Tier 1 issues are always 'fail' (critical checks)\n // Tier 2 issues: LLM decides 'fail' or 'warn'\n const result = isTier1\n ? 'fail'\n : ((i.result as string) === 'fail' ? 'fail' : 'warn');\n\n return {\n tier: tier as 1 | 2,\n result: result as 'fail' | 'warn',\n category: category as EvalCategory,\n severity: (i.severity as 'critical' | 'major') || (isTier1 ? 'critical' : 'major'),\n description: (i.description as string) || '',\n fix: (i.fix as string) || '',\n };\n });\n\n return {\n issues,\n pass: rawPass,\n };\n}\n\n// =============================================================================\n// Main evaluation function\n// =============================================================================\n\n/**\n * Run LLM evaluation with parallel per-criterion calls.\n *\n * Runs 7 static criteria (2 tier 1 + 5 tier 2) plus 0-3 dynamic criteria\n * generated from the user's request. All run in parallel with a shared\n * mother prompt (cached by the provider). Wall time ~2s for all criteria.\n *\n * @param preWarmedContext - Optional pre-warmed context from `preWarmEval()`.\n * If provided, skips mother prompt building and dynamic criteria generation.\n */\nexport async function runLLMEvaluation(\n context: LLMEvalContext,\n config: LLMEvalConfig,\n preWarmedContext?: PreWarmedEvalContext | null,\n): Promise<EvalResult & LLMEvalTokenUsage> {\n const providerName = config.provider;\n const model = config.model || getDefaultEvalModel(providerName);\n const routerProvider =\n providerName === 'claude'\n ? ('anthropic' as const)\n : (providerName as 'openai' | 'google');\n\n // Use pre-warmed context if available, otherwise build fresh\n const designMode = context.designMode ?? DEFAULT_DESIGN_MODE;\n const motherPrompt = preWarmedContext?.motherPrompt ?? buildMotherPrompt({\n originalPrompt: context.originalPrompt,\n contract: context.contract,\n designSystemSummary: context.designContext,\n designMode,\n profile: context.profile,\n });\n\n // Add line numbers to source\n const numberedSource = context.sourceCode\n .split('\\n')\n .map((line, i) => `${String(i + 1).padStart(4)} | ${line}`)\n .join('\\n');\n\n // Create a single agent — all calls share the same client + cache.\n // Pass the full config (not just the bare provider string) so a\n // caller-supplied `routeOverride` (#484) reaches the constructed\n // `LLMAgent` instance and it never falls back to `process.env`.\n const agent = createAgent({\n provider: routerProvider,\n model,\n routeOverride: config.routeOverride,\n onRetry: config.onRetry,\n });\n\n // Dynamic criteria removed — they generated overly strict edge-case checks\n // that wasted coding turns on nitpicks. Will be replaced by a holistic\n // reviewer in auto-improve mode.\n\n const evalStart = Date.now();\n\n const totalCriteriaCount = TIER_1_CRITERIA.length + TIER_2_CRITERIA.length;\n\n // Run ALL criteria in parallel: 7 static (2 tier 1 + 5 tier 2)\n const results = await Promise.all([\n ...TIER_1_CRITERIA.map(c => evalCriterion(c, 1, motherPrompt, numberedSource, agent, model, designMode)),\n ...TIER_2_CRITERIA.map(c => evalCriterion(c, 2, motherPrompt, numberedSource, agent, model, designMode)),\n ]);\n\n // Merge results\n const allIssues: EvalIssue[] = [];\n const passCategories: string[] = [];\n let totalIn = 0;\n let totalOut = 0;\n // Measured, not estimated: summed from what the calls reported; absent\n // while no call has reported one (ggui#1281).\n let cacheRead: number | undefined;\n let cacheCreation: number | undefined;\n\n for (const r of results) {\n allIssues.push(...r.issues);\n if (r.pass) {\n passCategories.push(r.criterion);\n }\n totalIn += r.tokens.in;\n totalOut += r.tokens.out;\n if (r.tokens.cacheRead !== undefined) cacheRead = (cacheRead ?? 0) + r.tokens.cacheRead;\n if (r.tokens.cacheCreation !== undefined) cacheCreation = (cacheCreation ?? 0) + r.tokens.cacheCreation;\n }\n\n const wallMs = Date.now() - evalStart;\n\n // Per-criterion coverage — one row per criterion, ALWAYS all of them,\n // so a consumer can tell \"ran clean\" from \"silently didn't run\"\n // (the fail-open paths above return pass:true with zero evidence).\n const criteriaCoverage: CriterionCoverage[] = results.map((r) => ({\n criterion: r.criterion,\n tier: r.tier,\n status: r.coverage,\n ...(r.skipReason !== undefined ? { reason: r.skipReason } : {}),\n }));\n const skippedCount = criteriaCoverage.filter((c) => c.status === 'skipped').length;\n\n // Log per-criterion results\n for (const r of results) {\n const issueCount = r.issues.length;\n const status = r.coverage === 'skipped'\n ? 'SKIPPED'\n : r.pass ? 'PASS' : r.tier === 1 ? 'FAIL' : (r.issues.some(i => i.result === 'fail') ? 'FAIL' : 'WARN');\n const issueLabel = issueCount > 0 ? ` (${issueCount} issue${issueCount > 1 ? 's' : ''})` : '';\n console.log(`[eval] ${r.criterion}: ${status}${issueLabel} ${(r.durationMs / 1000).toFixed(1)}s`);\n }\n console.log(\n `[eval] total: ${(wallMs / 1000).toFixed(1)}s wall (${totalCriteriaCount} parallel) | ` +\n `in=${totalIn} out=${totalOut} cacheRead=${cacheRead ?? 'unreported'} cacheWrite=${cacheCreation ?? 'unreported'} | ` +\n `issues=${allIssues.length} pass=${passCategories.length}` +\n (skippedCount > 0 ? ` skipped=${skippedCount}` : ''),\n );\n\n return {\n issues: allIssues,\n pass: passCategories,\n criteriaCoverage,\n inputTokens: totalIn,\n outputTokens: totalOut,\n ...(cacheRead !== undefined ? { cacheReadTokens: cacheRead } : {}),\n ...(cacheCreation !== undefined ? { cacheCreationTokens: cacheCreation } : {}),\n };\n}\n"]}
|