@ggui-ai/ui-gen 0.7.0 → 0.9.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/adapters/generation-dispatch.d.ts +10 -0
- package/dist/adapters/generation-dispatch.js +172 -1392
- package/dist/adapters/generation-dispatch.js.map +1 -1
- package/dist/advanced/index.d.ts +1 -1
- package/dist/advanced/index.js +191 -1403
- package/dist/advanced/index.js.map +1 -1
- package/dist/boilerplate.js +3 -2
- package/dist/boilerplate.js.map +1 -1
- package/dist/compose.js +5 -5
- package/dist/compose.js.map +1 -1
- package/dist/{create-ui-generator-GX7tvbyH.d.ts → create-ui-generator-B9kV4U9h.d.ts} +13 -0
- package/dist/evaluation/axis-checks/index.js +32 -1
- package/dist/evaluation/axis-checks/index.js.map +1 -1
- package/dist/evaluation/axis-checks/registry.js +32 -1
- package/dist/evaluation/axis-checks/registry.js.map +1 -1
- package/dist/evaluation/index.js +57 -12
- package/dist/evaluation/index.js.map +1 -1
- package/dist/fragments/index.js +5 -5
- package/dist/fragments/index.js.map +1 -1
- package/dist/harness/index.d.ts +4 -125
- package/dist/harness/index.js +34 -19
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/runtime.d.ts +9 -0
- package/dist/harness/runtime.js +3 -2
- package/dist/harness/runtime.js.map +1 -1
- package/dist/harness/types-public.js +8 -7
- package/dist/harness/types-public.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +191 -1403
- package/dist/index.js.map +1 -1
- package/dist/llm-router-1TyI0_TV.d.ts +156 -0
- package/dist/providers/index.d.ts +35 -93
- package/dist/providers/index.js +13 -8
- package/dist/providers/index.js.map +1 -1
- package/dist/validation/index.js +2 -2
- package/dist/validation/index.js.map +1 -1
- package/package.json +18 -18
- package/src/adapters/generation-dispatch.ts +19 -2
- package/src/boilerplate/system-prompt.ts +3 -2
- package/src/create-ui-generator.ts +44 -11
- package/src/evaluation/axis-checks/checks/state-merge.ts +1 -1
- package/src/evaluation/axis-checks/checks/universal.ts +39 -0
- package/src/evaluation/llm-evaluator.ts +13 -3
- package/src/evaluation/visual-evaluator.ts +5 -1
- package/src/fragments/realtime.ts +3 -3
- package/src/fragments/state.ts +2 -2
- package/src/harness/coding/init-session.ts +4 -1
- package/src/harness/coding/run-eval-round.ts +6 -0
- package/src/harness/llm-router.ts +59 -14
- package/src/harness/runtime.ts +8 -0
- package/src/providers/bedrock.ts +84 -22
- package/src/validation/ui-compiler.ts +2 -2
|
@@ -235,6 +235,31 @@ function runNoPhantomUseState(input) {
|
|
|
235
235
|
}
|
|
236
236
|
return issues;
|
|
237
237
|
}
|
|
238
|
+
function runPropSeedNoResync(input) {
|
|
239
|
+
if (input.compiledCode === null) return [];
|
|
240
|
+
const src = input.sourceCode;
|
|
241
|
+
const issues = [];
|
|
242
|
+
const re = /const\s*\[\s*(\w+)\s*,\s*(\w+)\s*\]\s*=\s*useState(?:<[^>]*>)?\s*\(\s*props\??\.(\w+)/g;
|
|
243
|
+
for (const m of src.matchAll(re)) {
|
|
244
|
+
const [full, stateVar, setter, propName] = m;
|
|
245
|
+
const idx = m.index ?? 0;
|
|
246
|
+
const after = src.slice(idx + full.length);
|
|
247
|
+
if (!new RegExp(`\\b${setter}\\s*\\(`).test(after)) continue;
|
|
248
|
+
const resync = new RegExp(
|
|
249
|
+
`\\[[^\\[\\]]*props\\??\\.${propName}\\b[^\\[\\]]*\\]`
|
|
250
|
+
);
|
|
251
|
+
if (resync.test(src)) continue;
|
|
252
|
+
issues.push(
|
|
253
|
+
mkIssue(
|
|
254
|
+
"universal.prop_seed_no_resync",
|
|
255
|
+
`useState(props.${propName}) seeds "${stateVar}" and mutates it, but no effect depends on [props.${propName}] \u2014 a ggui_amend repaint pushes new props that never reach this display (#480).`,
|
|
256
|
+
`Add \`useEffect(() => ${setter}(props.${propName}), [props.${propName}]);\` so agent repaints re-seed the state, or derive the display directly from props.${propName}.`,
|
|
257
|
+
"warn"
|
|
258
|
+
)
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
return issues;
|
|
262
|
+
}
|
|
238
263
|
var UNIVERSAL_CHECKS = [
|
|
239
264
|
{
|
|
240
265
|
id: "universal.prop_coverage",
|
|
@@ -253,6 +278,12 @@ var UNIVERSAL_CHECKS = [
|
|
|
253
278
|
axis: "render",
|
|
254
279
|
values: ALL_RENDER_VALUES,
|
|
255
280
|
run: runNoPhantomUseState
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
id: "universal.prop_seed_no_resync",
|
|
284
|
+
axis: "render",
|
|
285
|
+
values: ALL_RENDER_VALUES,
|
|
286
|
+
run: runPropSeedNoResync
|
|
256
287
|
}
|
|
257
288
|
];
|
|
258
289
|
|
|
@@ -272,7 +303,7 @@ function runStateSeededFromProps(input) {
|
|
|
272
303
|
mkIssue(
|
|
273
304
|
"state.merge.seeded_from_props",
|
|
274
305
|
`Entity collection "${e.name}" is not seeded from props \u2014 no useState initializer reads props.${e.name}.`,
|
|
275
|
-
`Add \`const [${e.name}, set${cap(e.name)}] = useState(props.${e.name});\` so stream/action updates
|
|
306
|
+
`Add \`const [${e.name}, set${cap(e.name)}] = useState(props.${e.name});\` paired with \`useEffect(() => set${cap(e.name)}(props.${e.name}), [props.${e.name}]);\` so stream/action updates merge into live state AND agent repaints (ggui_amend) re-seed it (#480).`
|
|
276
307
|
)
|
|
277
308
|
);
|
|
278
309
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/evaluation/axis-checks/helpers.ts","../../../src/evaluation/axis-checks/checks/universal.ts","../../../src/evaluation/axis-checks/checks/state-merge.ts","../../../src/evaluation/axis-checks/checks/realtime.ts","../../../src/evaluation/axis-checks/checks/writes.ts","../../../src/evaluation/axis-checks/checks/state-payload.ts","../../../src/evaluation/axis-checks/checks/tooling.ts","../../../src/evaluation/axis-checks/extras.ts","../../../src/evaluation/axis-checks/registry.ts"],"names":["REALTIME_ACTIVE","mkIssue"],"mappings":"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","file":"registry.js","sourcesContent":["// packages/ui-gen/src/evaluation/axis-checks/helpers.ts\n//\n// Shared contract inspection + source-scan helpers used by axis checks.\n// Ported from the retired mode-checks/ modules.\n\nimport type { ActionEntry, DataContract, JsonObject, JsonValue } from \"@ggui-ai/protocol\";\nimport {\n HOOK_NAME_RE,\n listContractGadgets,\n STDLIB_GADGETS_PACKAGE,\n} from \"@ggui-ai/protocol\";\nimport type { EvalIssue } from \"../types-public.js\";\n\n// =============================================================================\n// Contract shape helpers\n// =============================================================================\n\nexport interface PropShape {\n type?: string;\n required?: boolean;\n items?: { type?: string; properties?: Record<string, unknown> };\n schema?: {\n type?: string;\n items?: { type?: string; properties?: Record<string, unknown> };\n };\n}\n\nexport interface EntityCollection {\n name: string;\n idField: string;\n}\n\nexport interface SubmitAction {\n name: string;\n payloadKeys: string[];\n}\n\nconst ID_FIELD_CANDIDATES = [\"id\", \"uuid\", \"symbol\", \"key\", \"slug\", \"code\"];\n\nfunction getItemsProperties(p: PropShape): Record<string, unknown> | undefined {\n return p.items?.properties ?? p.schema?.items?.properties;\n}\n\nfunction inferIdField(itemProps: Record<string, unknown> | undefined): string {\n if (!itemProps) return \"id\";\n for (const cand of ID_FIELD_CANDIDATES) {\n if (cand in itemProps) return cand;\n }\n for (const [k, v] of Object.entries(itemProps)) {\n const vv = v as { type?: string; schema?: { type?: string } } | undefined;\n if (vv?.type === \"string\" || vv?.schema?.type === \"string\") return k;\n }\n return \"id\";\n}\n\nexport function getRequiredPropNames(contract?: DataContract): string[] {\n const propsField = contract?.propsSpec as\n | { properties?: Record<string, PropShape> }\n | undefined;\n const properties = propsField?.properties ?? {};\n return Object.entries(properties)\n .filter(([, p]) => p && typeof p === \"object\" && p.required === true)\n .map(([name]) => name);\n}\n\nexport function getActionNames(contract?: DataContract): string[] {\n return Object.keys(contract?.actionSpec ?? {});\n}\n\nexport function getStreamEventNames(contract?: DataContract): string[] {\n return Object.keys(contract?.streamSpec ?? {});\n}\n\n/**\n * Returns the local BINDING names the boilerplate emits for every\n * HOOK gadget the contract declares — `useGeolocation` → `geolocation`\n * (strip the `use` prefix, lowercase the first char). The wire\n * `clientCapabilities.gadgets` is package-keyed and carries only the\n * export NAME, not a separate binding name, so the binding is derived\n * here exactly as the boilerplate generator derives it.\n *\n * Component gadgets are excluded — they are rendered as JSX, not bound\n * to a `const`, so the `const <name> = …()` axis checks don't apply.\n *\n * The agentCapabilities.tools catalog has no parallel helper —\n * agent-side tools aren't component-side, so the axis checks don't\n * scan source for agent-tool bindings.\n */\nexport function getGadgetNames(contract?: DataContract): string[] {\n if (!contract) return [];\n return listContractGadgets(contract)\n .filter((use) => HOOK_NAME_RE.test(use.name))\n .map((use) =>\n use.name.length > 3\n ? use.name.charAt(3).toLowerCase() + use.name.slice(4)\n : use.name,\n );\n}\n\n/**\n * Like {@link getGadgetNames} but restricted to the first-party\n * `@ggui-ai/gadgets` stdlib package — the built-in browser capabilities\n * (`useGeolocation`, `useCamera`, …) that carry the `idle → prompting →\n * active` lifecycle and therefore need a `.start()` invocation.\n *\n * Registered third-party gadgets (e.g. `useBoardState` from\n * `@example/gadget-board`) are plain data hooks: the runtime resolves\n * them without a user gesture, so the `.start()` axis check must NOT\n * fire on them.\n */\nexport function getStdlibGadgetNames(contract?: DataContract): string[] {\n if (!contract) return [];\n return listContractGadgets(contract)\n .filter(\n (use) =>\n use.package === STDLIB_GADGETS_PACKAGE && HOOK_NAME_RE.test(use.name),\n )\n .map((use) =>\n use.name.length > 3\n ? use.name.charAt(3).toLowerCase() + use.name.slice(4)\n : use.name,\n );\n}\n\nexport function getEntityCollections(contract?: DataContract): EntityCollection[] {\n const propsField = contract?.propsSpec as\n | { properties?: Record<string, unknown> }\n | undefined;\n const properties = propsField?.properties ?? {};\n const entities: EntityCollection[] = [];\n for (const [name, p] of Object.entries(properties)) {\n if (!p || typeof p !== \"object\") continue;\n const pp = p as PropShape;\n const type = pp.type ?? pp.schema?.type;\n const items = pp.items ?? pp.schema?.items;\n if (type === \"array\" && items?.type === \"object\") {\n entities.push({ name, idField: inferIdField(getItemsProperties(pp)) });\n }\n }\n return entities;\n}\n\nfunction singularize(name: string): string {\n if (name.endsWith(\"ies\")) return name.slice(0, -3) + \"y\";\n if (name.endsWith(\"ses\")) return name.slice(0, -2);\n if (name.endsWith(\"s\") && !name.endsWith(\"ss\")) return name.slice(0, -1);\n return name;\n}\n\n/**\n * Entity collections that are actually mutated (referenced by a stream\n * event or by an action payload's entity-id key). Static reference lists\n * (e.g., kanban's `columns`) are excluded so they don't trigger\n * \"must be in useState\" false positives.\n */\nexport function getMutatedEntityCollections(\n contract: DataContract | undefined,\n allEntities: EntityCollection[],\n): EntityCollection[] {\n if (!contract) return allEntities;\n\n const actionSpec = contract.actionSpec ?? {};\n const streamSpec = contract.streamSpec ?? {};\n\n const hasStreams = Object.keys(streamSpec).length > 0;\n\n const referencedIdKeys = new Set<string>();\n for (const action of Object.values(actionSpec) as ActionEntry[]) {\n const ex = action.example;\n if (!ex || typeof ex !== \"object\" || Array.isArray(ex)) continue;\n for (const key of Object.keys(ex as JsonObject)) {\n if (key === \"id\" || key === \"key\" || key === \"index\") {\n referencedIdKeys.add(\"id\");\n referencedIdKeys.add(\"key\");\n referencedIdKeys.add(\"index\");\n } else if (/Id$/.test(key)) {\n referencedIdKeys.add(key.slice(0, -2).toLowerCase());\n }\n }\n }\n\n const mutated = allEntities.filter((e) =>\n referencedIdKeys.has(singularize(e.name).toLowerCase()),\n );\n\n if (mutated.length === 0 && hasStreams && allEntities.length > 0) {\n return [allEntities[0]];\n }\n return mutated.length > 0 ? mutated : allEntities;\n}\n\nfunction countScalarKeys(example: unknown): string[] {\n if (!example || typeof example !== \"object\" || Array.isArray(example)) return [];\n const keys: string[] = [];\n for (const [k, v] of Object.entries(example as Record<string, unknown>)) {\n const t = typeof v;\n if (t === \"string\" || t === \"number\" || t === \"boolean\") keys.push(k);\n }\n return keys;\n}\n\nexport function getSubmitActions(contract?: DataContract): SubmitAction[] {\n const actionSpec = contract?.actionSpec ?? {};\n const result: SubmitAction[] = [];\n for (const [name, action] of Object.entries(actionSpec) as Array<[string, ActionEntry]>) {\n const ex: JsonValue | undefined = action.example;\n const scalarKeys = countScalarKeys(ex);\n if (scalarKeys.length < 3) continue;\n const allKeys = ex && typeof ex === \"object\" && !Array.isArray(ex)\n ? Object.keys(ex as JsonObject)\n : scalarKeys;\n result.push({ name, payloadKeys: allKeys });\n }\n return result;\n}\n\nexport function getArrStrProps(contract?: DataContract): string[] {\n const propsField = contract?.propsSpec as\n | { properties?: Record<string, unknown> }\n | undefined;\n const properties = propsField?.properties ?? {};\n const names: string[] = [];\n for (const [name, p] of Object.entries(properties)) {\n if (!p || typeof p !== \"object\") continue;\n const pp = p as PropShape;\n const type = pp.type ?? pp.schema?.type;\n const items = pp.items ?? pp.schema?.items;\n if (type === \"array\" && items?.type === \"string\") names.push(name);\n }\n return names;\n}\n\nexport function getInitialValuePropNames(contract?: DataContract): string[] {\n const propsField = contract?.propsSpec as\n | { properties?: Record<string, unknown> }\n | undefined;\n const properties = propsField?.properties ?? {};\n const names: string[] = [];\n for (const [name, p] of Object.entries(properties)) {\n if (!p || typeof p !== \"object\") continue;\n const pp = p as PropShape;\n const type = pp.type ?? pp.schema?.type;\n if (type === \"object\" && /^initial/i.test(name)) names.push(name);\n }\n return names;\n}\n\n// =============================================================================\n// Source scanning helpers\n// =============================================================================\n\n/**\n * Collect all key names that appear as state slots — either keys inside a\n * `useState({ ... })` object literal, or standalone state variables.\n */\nexport function collectStateKeys(src: string): Set<string> {\n const keys = new Set<string>();\n const varRe = /const\\s*\\[\\s*(\\w+)\\s*,\\s*(\\w+)\\s*\\]\\s*=\\s*useState/g;\n for (const m of src.matchAll(varRe)) keys.add(m[1]);\n const objRe = /useState(?:<[^>]*>)?\\s*\\(\\s*\\{([\\s\\S]*?)\\}\\s*\\)/g;\n for (const m of src.matchAll(objRe)) {\n const keyRe = /(?:^|,)\\s*(\\w+)\\s*:/g;\n for (const km of m[1].matchAll(keyRe)) keys.add(km[1]);\n }\n const defaultObjRe = /useState(?:<[^>]*>)?\\s*\\([^)]*\\|\\|\\s*\\{([^}]*)\\}/g;\n for (const m of src.matchAll(defaultObjRe)) {\n const keyRe = /(?:^|,)\\s*(\\w+)\\s*:/g;\n for (const km of m[1].matchAll(keyRe)) keys.add(km[1]);\n }\n return keys;\n}\n\nexport function isMultiStepPrompt(prompt: string): boolean {\n if (!prompt) return false;\n const p = prompt.toLowerCase();\n return (\n /\\bstep\\s*[1-9]\\b/.test(p) ||\n /\\b[1-9][- ]step\\b/.test(p) ||\n /\\bmulti[- ]step\\b/.test(p) ||\n /\\bwizard\\b/.test(p) ||\n /\\bsteps?:\\s*\\n?/.test(p)\n );\n}\n\n// =============================================================================\n// Issue factory\n// =============================================================================\n\nexport function mkIssue(\n subcategory: string,\n description: string,\n fix: string,\n result: \"fail\" | \"warn\" = \"fail\",\n): EvalIssue {\n // mode-category issues are structural (missing hook wiring, bad merge-by-id,\n // hardcoded entity literals) — always P0. See ALIGNMENT.md R1.\n return { tier: 0, result, category: \"mode\", priority: \"P0\", subcategory, description, fix };\n}\n\nexport function cap(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n","// packages/ui-gen/src/evaluation/axis-checks/checks/universal.ts\n//\n// Checks that run regardless of axis value — they apply to any generated\n// component. Dispatched via a \"universal\" gate that matches every render\n// value.\n\nimport type { EvalIssue } from \"../../types-public.js\";\nimport type { AxisCheck, AxisCheckInput } from \"../types.js\";\nimport {\n getRequiredPropNames,\n mkIssue,\n} from \"../helpers.js\";\n\nconst ALL_RENDER_VALUES = [\n \"static\", \"list\", \"grid\", \"spatial\", \"timeline\", \"chart\", \"master-detail\",\n] as const;\n\nfunction runPropCoverage(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const requiredProps = getRequiredPropNames(input.contract);\n const issues: EvalIssue[] = [];\n for (const name of requiredProps) {\n const dotAccess = new RegExp(`\\\\bprops\\\\.${name}\\\\b`);\n const bracketAccess = new RegExp(`\\\\bprops\\\\[['\"\\`]${name}['\"\\`]\\\\]`);\n const destructured = new RegExp(\n `props[^;]{0,200}\\\\{[^}]*\\\\b${name}\\\\b[^}]*\\\\}|\\\\{[^}]*\\\\b${name}\\\\b[^}]*\\\\}[^;]{0,10}=\\\\s*props`,\n );\n if (dotAccess.test(src) || bracketAccess.test(src) || destructured.test(src))\n continue;\n issues.push(\n mkIssue(\n \"universal.prop_coverage\",\n `Required prop \"${name}\" is not referenced anywhere in the component.`,\n `Render props.${name} — the data contract marks it required.`,\n ),\n );\n }\n return issues;\n}\n\nfunction runNoPropMirror(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const issues: EvalIssue[] = [];\n const re =\n /const\\s*\\[\\s*(\\w+)\\s*,\\s*(\\w+)\\s*\\]\\s*=\\s*useState(?:<[^>]*>)?\\s*\\(\\s*props\\??\\.(\\w+)/g;\n for (const m of src.matchAll(re)) {\n const [full, stateVar, setter, propName] = m;\n const idx = m.index ?? 0;\n const after = src.slice(idx + full.length);\n if (new RegExp(`\\\\b${setter}\\\\s*\\\\(`).test(after)) continue;\n issues.push(\n mkIssue(\n \"universal.no_prop_mirror\",\n `useState(props.${propName}) for \"${stateVar}\" has no \"${setter}\" call — this mirrors a prop without mutation.`,\n `Read props.${propName} directly in the render; remove the useState for ${stateVar}.`,\n \"warn\",\n ),\n );\n }\n return issues;\n}\n\nfunction runNoPhantomUseState(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const issues: EvalIssue[] = [];\n const re = /const\\s*\\[\\s*(\\w+)\\s*,\\s*(\\w+)\\s*\\]\\s*=\\s*useState/g;\n for (const m of src.matchAll(re)) {\n const [full, stateVar, setter] = m;\n const idx = m.index ?? 0;\n const after = src.slice(idx + full.length);\n const stateUsed = new RegExp(`\\\\b${stateVar}\\\\b`).test(after);\n const setterUsed = new RegExp(`\\\\b${setter}\\\\b`).test(after);\n if (stateUsed || setterUsed) continue;\n issues.push(\n mkIssue(\n \"universal.no_phantom_useState\",\n `useState for \"${stateVar}\" is declared but neither \"${stateVar}\" nor \"${setter}\" is referenced.`,\n `Remove the useState for ${stateVar} — it is dead state.`,\n \"warn\",\n ),\n );\n }\n return issues;\n}\n\nexport const UNIVERSAL_CHECKS: readonly AxisCheck[] = [\n {\n id: \"universal.prop_coverage\",\n axis: \"render\",\n values: ALL_RENDER_VALUES,\n run: runPropCoverage,\n },\n {\n id: \"universal.no_prop_mirror\",\n axis: \"render\",\n values: ALL_RENDER_VALUES,\n run: runNoPropMirror,\n },\n {\n id: \"universal.no_phantom_useState\",\n axis: \"render\",\n values: ALL_RENDER_VALUES,\n run: runNoPhantomUseState,\n },\n];\n","// packages/ui-gen/src/evaluation/axis-checks/checks/state-merge.ts\n//\n// Checks gated on state=merge: the component owns a live entity list\n// reconciled from stream/action updates. Ported from\n// mode-checks/collection.ts (§5a state-seeded, no-hardcoded-entities,\n// derived-view-memoized).\n\nimport type { EvalIssue } from \"../../types-public.js\";\nimport type { AxisCheck, AxisCheckInput } from \"../types.js\";\nimport {\n cap,\n getEntityCollections,\n getMutatedEntityCollections,\n mkIssue,\n} from \"../helpers.js\";\n\nfunction runStateSeededFromProps(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const all = getEntityCollections(input.contract);\n const entities = getMutatedEntityCollections(input.contract, all);\n const issues: EvalIssue[] = [];\n for (const e of entities) {\n const re = new RegExp(\n `useState(?:<[^>]*>)?\\\\s*\\\\([\\\\s\\\\S]{0,400}?props\\\\.${e.name}\\\\b`,\n );\n if (re.test(src)) continue;\n issues.push(\n mkIssue(\n \"state.merge.seeded_from_props\",\n `Entity collection \"${e.name}\" is not seeded from props — no useState initializer reads props.${e.name}.`,\n `Add \\`const [${e.name}, set${cap(e.name)}] = useState(props.${e.name});\\` so stream/action updates can merge into live state.`,\n ),\n );\n }\n return issues;\n}\n\nfunction runNoHardcodedEntities(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const all = getEntityCollections(input.contract);\n const entities = getMutatedEntityCollections(input.contract, all);\n if (entities.length === 0) return [];\n const uncommented = src\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/\\/\\/[^\\n]*/g, \"\");\n const issues: EvalIssue[] = [];\n const idFields = [...new Set(entities.map((e) => e.idField))];\n for (const idField of idFields) {\n const re = new RegExp(\n `\\\\[\\\\s*\\\\{[^}]*\\\\b${idField}\\\\s*:[^}]*\\\\}\\\\s*,\\\\s*\\\\{[^}]*\\\\b${idField}\\\\s*:`,\n \"g\",\n );\n if (!re.test(uncommented)) continue;\n issues.push(\n mkIssue(\n \"state.merge.no_hardcoded_entities\",\n `Hardcoded entity array literal (multiple objects with \"${idField}\") in the component — entity data should come from state/props.`,\n `Remove the literal array. Seed state from props.{entityProp} and merge updates via stream.`,\n ),\n );\n }\n return issues;\n}\n\nfunction runDerivedViewMemoized(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const all = getEntityCollections(input.contract);\n const entities = getMutatedEntityCollections(input.contract, all);\n if (entities.length === 0) return [];\n const returnIdx = src.indexOf(\"return (\");\n if (returnIdx < 0) return [];\n const renderBody = src.slice(returnIdx);\n const issues: EvalIssue[] = [];\n for (const e of entities) {\n const re = new RegExp(`\\\\b${e.name}\\\\s*\\\\.(filter|reduce|sort)\\\\s*\\\\(`);\n if (re.test(renderBody)) {\n issues.push(\n mkIssue(\n \"state.merge.derived_view_memoized\",\n `Derived view (${e.name}.filter/reduce/sort) computed inside the render body — should be wrapped in useMemo.`,\n `Extract to \\`const ${e.name}Filtered = useMemo(() => ${e.name}.filter(...), [${e.name}, ...]);\\` before the return.`,\n \"warn\",\n ),\n );\n }\n }\n return issues;\n}\n\n/**\n * `.map()` keyed by index → reorders and merges break React reconciliation.\n * Gated on any render that iterates (list/grid/timeline/master-detail) OR\n * state=merge (mutating list).\n */\nfunction runMapKeyIsId(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const INDEX_NAMES = new Set([\"index\", \"idx\", \"i\", \"j\", \"k\", \"n\", \"ix\"]);\n const re = /key\\s*=\\s*\\{\\s*(\\w+)\\s*\\}/g;\n const issues: EvalIssue[] = [];\n for (const m of src.matchAll(re)) {\n const key = m[1];\n if (!INDEX_NAMES.has(key)) continue;\n issues.push(\n mkIssue(\n \"render.map_key_is_id\",\n `Array key uses index variable \"${key}\" — reorders and stream merges will break React reconciliation.`,\n `Replace key={${key}} with key={item.id} (or item.symbol / whatever the entity id field is).`,\n ),\n );\n }\n return issues;\n}\n\nexport const STATE_MERGE_CHECKS: readonly AxisCheck[] = [\n {\n id: \"state.merge.seeded_from_props\",\n axis: \"state\",\n values: [\"merge\"],\n run: runStateSeededFromProps,\n },\n {\n id: \"state.merge.no_hardcoded_entities\",\n axis: \"state\",\n values: [\"merge\"],\n run: runNoHardcodedEntities,\n },\n {\n id: \"state.merge.derived_view_memoized\",\n axis: \"state\",\n values: [\"merge\"],\n run: runDerivedViewMemoized,\n },\n // Map-key check: gated on any iterating render. state=merge always\n // implies iteration, so the render gate already covers it.\n {\n id: \"render.map_key_is_id\",\n axis: \"render\",\n values: [\"list\", \"grid\", \"timeline\", \"master-detail\"],\n run: runMapKeyIsId,\n },\n];\n","// packages/ui-gen/src/evaluation/axis-checks/checks/realtime.ts\n//\n// Checks gated on realtime != none. Ported from mode-checks/collection.ts\n// (stream-handler-per-event, stream-merges-by-id).\n\nimport type { EvalIssue } from \"../../types-public.js\";\nimport type { AxisCheck, AxisCheckInput } from \"../types.js\";\nimport {\n getEntityCollections,\n getMutatedEntityCollections,\n getStreamEventNames,\n mkIssue,\n} from \"../helpers.js\";\n\nconst REALTIME_ACTIVE = [\"merge\", \"append\", \"status\", \"presence\", \"mixed\"] as const;\n\nfunction runStreamHandlerPerEvent(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const eventNames = getStreamEventNames(input.contract);\n const issues: EvalIssue[] = [];\n for (const name of eventNames) {\n const re = new RegExp(`useStream(?:<[^>]*>)?\\\\s*\\\\(\\\\s*['\"\\`]${name}['\"\\`]`);\n if (re.test(src)) continue;\n issues.push(\n mkIssue(\n \"realtime.stream_handler_per_event\",\n `Stream event \"${name}\" declared in the contract has no useStream('${name}') call.`,\n `Add \\`const ${name} = useStream<...>('${name}');\\` and handle ${name}.latest in a useEffect.`,\n ),\n );\n }\n return issues;\n}\n\nfunction runStreamMergesById(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const eventNames = getStreamEventNames(input.contract);\n const all = getEntityCollections(input.contract);\n const entities = getMutatedEntityCollections(input.contract, all);\n if (eventNames.length === 0 || entities.length === 0) return [];\n const issues: EvalIssue[] = [];\n const idFields = new Set(entities.map((e) => e.idField));\n for (const idField of idFields) {\n const re = new RegExp(`\\\\.${idField}\\\\b`);\n if (re.test(src)) continue;\n issues.push(\n mkIssue(\n \"realtime.merge.stream_merges_by_id\",\n `Entity id field \"${idField}\" is never referenced in the source — stream merge likely does not key by id.`,\n `In the stream handler, merge by id: setItems(prev => prev.map(x => x.${idField} === update.${idField} ? {...x, ...update} : x)).`,\n \"warn\",\n ),\n );\n }\n return issues;\n}\n\nexport const REALTIME_CHECKS: readonly AxisCheck[] = [\n {\n id: \"realtime.stream_handler_per_event\",\n axis: \"realtime\",\n values: REALTIME_ACTIVE,\n run: runStreamHandlerPerEvent,\n },\n {\n id: \"realtime.merge.stream_merges_by_id\",\n axis: \"realtime\",\n values: [\"merge\", \"mixed\"],\n run: runStreamMergesById,\n },\n];\n","// packages/ui-gen/src/evaluation/axis-checks/checks/writes.ts\n//\n// Checks gated on writes != none. Ported from display.ts (action-hook,\n// action-handler) + form.ts (submit-hook, submit-handler, submit-disabled)\n// + collection.ts (per-item action variants).\n\nimport type { EvalIssue } from \"../../types-public.js\";\nimport type { AxisCheck, AxisCheckInput } from \"../types.js\";\nimport {\n getActionNames,\n getSubmitActions,\n mkIssue,\n} from \"../helpers.js\";\n\nconst ACTIVE_WRITES = [\n \"commit\", \"multi-commit\", \"per-item\", \"submit\", \"compose\",\n] as const;\n\nfunction runActionHookWired(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const actionNames = getActionNames(input.contract);\n const issues: EvalIssue[] = [];\n for (const name of actionNames) {\n const re = new RegExp(`useAction(?:<[^>]*>)?\\\\s*\\\\(\\\\s*['\"\\`]${name}['\"\\`]`);\n if (re.test(src)) continue;\n issues.push(\n mkIssue(\n \"writes.action_hook_wired\",\n `Contract action \"${name}\" has no useAction('${name}') call.`,\n `Add \\`const ${name} = useAction<...>('${name}');\\` and wire it to the relevant control.`,\n ),\n );\n }\n return issues;\n}\n\nfunction runActionHandlerAttached(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const actionNames = getActionNames(input.contract);\n const issues: EvalIssue[] = [];\n for (const name of actionNames) {\n const declRe = new RegExp(\n `const\\\\s+(\\\\w+)\\\\s*=\\\\s*useAction(?:<[^>]*>)?\\\\s*\\\\(\\\\s*['\"\\`]${name}['\"\\`]`,\n );\n const m = src.match(declRe);\n if (!m) continue;\n const constName = m[1];\n const rest = src.replace(m[0], \"\");\n if (new RegExp(`\\\\b${constName}\\\\s*\\\\(`).test(rest)) continue;\n issues.push(\n mkIssue(\n \"writes.action_handler_attached\",\n `useAction result \"${constName}\" (for action \"${name}\") is declared but never invoked.`,\n `Call ${constName}({...}) from an interactive element (e.g., <Button onClick={() => ${constName}(payload)}>).`,\n ),\n );\n }\n return issues;\n}\n\nfunction runSubmitDisabledPath(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const submits = getSubmitActions(input.contract);\n if (submits.length === 0) return [];\n if (/disabled\\s*=\\s*\\{/.test(src)) return [];\n return [\n mkIssue(\n \"writes.submit.disabled_path\",\n `Form has no \\`disabled={...}\\` expression anywhere — submit is likely unconditional.`,\n `Gate submit on validation: e.g. \\`<Button disabled={!isValid} onClick={handleSubmit}>\\`.`,\n \"warn\",\n ),\n ];\n}\n\nexport const WRITES_CHECKS: readonly AxisCheck[] = [\n {\n id: \"writes.action_hook_wired\",\n axis: \"writes\",\n values: ACTIVE_WRITES,\n run: runActionHookWired,\n },\n {\n id: \"writes.action_handler_attached\",\n axis: \"writes\",\n values: ACTIVE_WRITES,\n run: runActionHandlerAttached,\n },\n {\n id: \"writes.submit.disabled_path\",\n axis: \"writes\",\n values: [\"submit\"],\n run: runSubmitDisabledPath,\n },\n];\n","// packages/ui-gen/src/evaluation/axis-checks/checks/state-payload.ts\n//\n// Checks gated on state=payload or writes=submit. Ported from\n// mode-checks/form.ts (submit-hook, submit-handler, state-covers-payload,\n// initial-values-seeded, option-lists-consumed, no-orphan-payload-key).\n\nimport type { EvalIssue } from \"../../types-public.js\";\nimport type { AxisCheck, AxisCheckInput } from \"../types.js\";\nimport {\n collectStateKeys,\n getArrStrProps,\n getInitialValuePropNames,\n getSubmitActions,\n mkIssue,\n} from \"../helpers.js\";\n\nfunction runSubmitHookPresent(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const submits = getSubmitActions(input.contract);\n const issues: EvalIssue[] = [];\n for (const s of submits) {\n const re = new RegExp(`useAction(?:<[^>]*>)?\\\\s*\\\\(\\\\s*['\"\\`]${s.name}['\"\\`]`);\n if (re.test(src)) continue;\n issues.push(\n mkIssue(\n \"writes.submit.hook_present\",\n `Submit action \"${s.name}\" has no useAction('${s.name}') call.`,\n `Add \\`const ${s.name} = useAction<...>('${s.name}');\\` and invoke it from the submit button.`,\n ),\n );\n }\n return issues;\n}\n\nfunction runSubmitHandlerAttached(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const submits = getSubmitActions(input.contract);\n const issues: EvalIssue[] = [];\n for (const s of submits) {\n const declRe = new RegExp(\n `const\\\\s+(\\\\w+)\\\\s*=\\\\s*useAction(?:<[^>]*>)?\\\\s*\\\\(\\\\s*['\"\\`]${s.name}['\"\\`]`,\n );\n const m = src.match(declRe);\n if (!m) continue;\n const constName = m[1];\n const rest = src.replace(m[0], \"\");\n if (new RegExp(`\\\\b${constName}\\\\s*\\\\(`).test(rest)) continue;\n issues.push(\n mkIssue(\n \"writes.submit.handler_attached\",\n `useAction result \"${constName}\" (for submit \"${s.name}\") is declared but never invoked.`,\n `Call ${constName}(payload) from the submit button's onClick handler, after validation.`,\n ),\n );\n }\n return issues;\n}\n\nfunction runStateCoversPayload(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const submits = getSubmitActions(input.contract);\n if (submits.length === 0) return [];\n const stateKeys = collectStateKeys(src);\n const issues: EvalIssue[] = [];\n for (const s of submits) {\n const missing = s.payloadKeys.filter((k) => !stateKeys.has(k));\n if (missing.length === 0) continue;\n issues.push(\n mkIssue(\n \"state.payload.covers_submit\",\n `Submit action \"${s.name}\" expects payload keys [${s.payloadKeys.join(\", \")}] but state does not cover: ${missing.join(\", \")}.`,\n `Add a state slot for each missing key so the final payload can be assembled.`,\n ),\n );\n }\n return issues;\n}\n\nfunction runInitialValuesSeeded(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const initialProps = getInitialValuePropNames(input.contract);\n const issues: EvalIssue[] = [];\n for (const name of initialProps) {\n const re = new RegExp(\n `useState(?:<[^>]*>)?\\\\s*\\\\([\\\\s\\\\S]{0,400}?props\\\\.${name}\\\\b`,\n );\n if (re.test(src)) continue;\n issues.push(\n mkIssue(\n \"state.payload.initial_values_seeded\",\n `Prop \"${name}\" (pre-filled initial values) is never read in a useState initializer.`,\n `Seed form state from props.${name} so edit mode pre-fills.`,\n ),\n );\n }\n return issues;\n}\n\nfunction runOptionListsConsumed(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const arrStrNames = getArrStrProps(input.contract);\n const hasAnyMap = /\\.map\\s*\\(/.test(src);\n const issues: EvalIssue[] = [];\n for (const name of arrStrNames) {\n const referenced = new RegExp(`\\\\bprops\\\\.${name}\\\\b`).test(src);\n if (referenced && hasAnyMap) continue;\n const reason = !referenced\n ? `Option list prop \"${name}\" (arr<str>) is never referenced — users cannot see the options.`\n : `Option list prop \"${name}\" (arr<str>) is referenced but the component has no .map() — options are not rendered as choices.`;\n issues.push(\n mkIssue(\n \"state.payload.option_lists_consumed\",\n reason,\n `Render options with \\`props.${name}.map(option => <RadioOption value={option} ... />)\\`.`,\n ),\n );\n }\n return issues;\n}\n\nfunction runNoOrphanPayloadKey(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const submits = getSubmitActions(input.contract);\n if (submits.length === 0) return [];\n const body = src\n .replace(/interface\\s+Action\\w+[\\s\\S]*?\\n}/g, \"\")\n .replace(/type\\s+Action\\w+[\\s\\S]*?\\n;/g, \"\");\n const issues: EvalIssue[] = [];\n for (const s of submits) {\n const orphans: string[] = [];\n for (const key of s.payloadKeys) {\n const re = new RegExp(`\\\\b${key}\\\\b`);\n if (!re.test(body)) orphans.push(key);\n }\n if (orphans.length === 0) continue;\n issues.push(\n mkIssue(\n \"state.payload.no_orphan_key\",\n `Submit payload keys [${orphans.join(\", \")}] never appear in the component body — missing from the submitted payload.`,\n `Add UI and state for these keys, or remove them from the ActionEntry if not needed.`,\n \"warn\",\n ),\n );\n }\n return issues;\n}\n\nexport const STATE_PAYLOAD_CHECKS: readonly AxisCheck[] = [\n {\n id: \"writes.submit.hook_present\",\n axis: \"writes\",\n values: [\"submit\"],\n run: runSubmitHookPresent,\n },\n {\n id: \"writes.submit.handler_attached\",\n axis: \"writes\",\n values: [\"submit\"],\n run: runSubmitHandlerAttached,\n },\n {\n id: \"state.payload.covers_submit\",\n axis: \"state\",\n values: [\"payload\"],\n run: runStateCoversPayload,\n },\n {\n id: \"state.payload.initial_values_seeded\",\n axis: \"state\",\n values: [\"payload\", \"draft\"],\n run: runInitialValuesSeeded,\n },\n {\n id: \"state.payload.option_lists_consumed\",\n axis: \"state\",\n values: [\"payload\"],\n run: runOptionListsConsumed,\n },\n {\n id: \"state.payload.no_orphan_key\",\n axis: \"state\",\n values: [\"payload\"],\n run: runNoOrphanPayloadKey,\n },\n];\n","// packages/ui-gen/src/evaluation/axis-checks/checks/tooling.ts\n//\n// Checks gated on the tooling axis. Two surfaces:\n//\n// - `tooling.clientCapability.hook_called` — verifies every declared\n// `clientCapabilities.gadgets[name]` has a matching\n// `const <name> = …()` binding in source.\n// - `tooling.clientCapability.start_called` — verifies a bound\n// gadget hook also has a `.start(...)` invocation; without it\n// the capability stays in `idle` and never fires.\n// - `realtime.stream_source.no_direct_call` — the LLM must NOT\n// directly invoke a tool named on `streamSpec[*].source.tool`;\n// subscribe via `useStream(...)` instead.\n// - `universal.no_retired_identifiers` — fires on every contract.\n// The LLM's training data predates the current wire shape and\n// reaches for retired identifiers (component-side tool hooks,\n// dispatch.kind, intendedTool, broadcast field, retired catalog\n// names, retired package imports, retired wire-input fields).\n// The grep gate emits one issue per detected identifier so the\n// LLM rewrites toward the current shape before evaluation\n// completes.\n\nimport type { DataContract, StreamChannelEntry } from \"@ggui-ai/protocol\";\nimport type { EvalIssue } from \"../../types-public.js\";\nimport type { AxisCheck, AxisCheckInput } from \"../types.js\";\nimport { getGadgetNames, getStdlibGadgetNames, mkIssue } from \"../helpers.js\";\n\nconst CLIENT_PRESENT = [\"client\", \"both\"] as const;\nconst ALL_TOOLING_VALUES = [\"none\", \"wired\", \"client\", \"both\"] as const;\nconst REALTIME_ACTIVE = [\n \"merge\",\n \"append\",\n \"status\",\n \"presence\",\n \"mixed\",\n] as const;\n\n// ── clientCapabilities ──────────────────────────────────────────────\n\nfunction runGadgetHookCalled(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const names = getGadgetNames(input.contract);\n const issues: EvalIssue[] = [];\n for (const name of names) {\n // The boilerplate emits `const <name> = <hook>();` — match the const\n // binding to detect omission. We don't pin the hook identifier here\n // because the contract carries it via `entry.hook` and the LLM may\n // legitimately alias on import.\n const re = new RegExp(`const\\\\s+${name}\\\\s*=`);\n if (re.test(src)) continue;\n issues.push(\n mkIssue(\n \"tooling.clientCapability.hook_called\",\n `Contract clientCapability \"${name}\" has no \\`const ${name} = …()\\` hook call.`,\n `Import the declared hook (default package: @ggui-ai/gadgets) and bind its return value to \\`const ${name}\\` at the top of the component; surface \\`.value\\` / \\`.status\\` in JSX.`,\n ),\n );\n }\n return issues;\n}\n\nfunction runClientCapabilityStartCalled(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n // Only the first-party `@ggui-ai/gadgets` browser capabilities have\n // the `idle → prompting → active` lifecycle that `.start()` drives.\n // Registered third-party gadget hooks (e.g. `useBoardState`) are\n // plain data hooks the runtime resolves on its own — exclude them.\n const names = getStdlibGadgetNames(input.contract);\n const issues: EvalIssue[] = [];\n for (const name of names) {\n // Skip when the binding doesn't exist — the `hook_called` check\n // covers that case; we don't double-issue.\n const bindingRe = new RegExp(`const\\\\s+${name}\\\\s*=`);\n if (!bindingRe.test(src)) continue;\n\n // The capability lifecycle requires `.start()` invocation to\n // transition from `idle` → `prompting`. Without it the hook's\n // `.value` / `.status` stay frozen at the initial state and the\n // UI feature never fires. Match `<name>.start(`, allowing chained\n // member access or method aliasing.\n const startRe = new RegExp(`\\\\b${name}\\\\s*\\\\.\\\\s*start\\\\s*\\\\(`);\n if (startRe.test(src)) continue;\n issues.push(\n mkIssue(\n \"tooling.clientCapability.start_called\",\n `clientCapability \"${name}\" is bound but \\`${name}.start(…)\\` is never invoked — the capability stays in 'idle' and the feature won't fire.`,\n `Wire \\`${name}.start({...})\\` to a UI control (Button onClick, effect, etc.). Read \\`.status\\` to gate the UI between 'idle' / 'prompting' / 'active' / 'completed' / 'denied' / 'error'.`,\n ),\n );\n }\n return issues;\n}\n\n// ── streamSpec sources ──────────────────────────────────────────────\n\nfunction collectStreamSourceTools(\n contract: DataContract | undefined,\n): Map<string, string> {\n // Map<channelName, sourceToolName> for every channel that declares\n // a source. Excludes channels without `source` (agent-written).\n const result = new Map<string, string>();\n const streamSpec = contract?.streamSpec;\n if (!streamSpec || typeof streamSpec !== \"object\") return result;\n for (const [channelName, entryRaw] of Object.entries(streamSpec)) {\n const entry = entryRaw as StreamChannelEntry | undefined;\n if (!entry || typeof entry !== \"object\") continue;\n const tool = entry.source?.tool;\n if (typeof tool !== \"string\" || tool.length === 0) continue;\n result.set(channelName, tool);\n }\n return result;\n}\n\nfunction runStreamSourceNoDirectCall(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const map = collectStreamSourceTools(input.contract);\n if (map.size === 0) return [];\n\n const issues: EvalIssue[] = [];\n for (const [channelName, toolName] of map) {\n // Detect a direct call to the source tool. Matches identifier\n // followed by `(` — covers `foo()`, `foo(args)`, `foo.bar()`\n // (the dotted form indirectly catches `someObject.foo()` which\n // the contract doesn't expect to see, since the source tool is\n // an agent-side MCP tool, not a local function).\n const callRe = new RegExp(`\\\\b${toolName}\\\\s*\\\\(`);\n if (!callRe.test(src)) continue;\n\n // Don't false-fire when `toolName` happens to be the channel name\n // bound to useStream (e.g., `const messages = useStream(...)` then\n // `messages(...)` would be weird but we're matching the TOOL name,\n // not the binding). If toolName === channelName then the\n // `<channel>(` call would be the useStream binding being called\n // as a function — which is itself wrong, so still emit.\n issues.push(\n mkIssue(\n \"realtime.stream_source.no_direct_call\",\n `Source code calls \\`${toolName}(...)\\` directly but the contract declares it as the source tool for streamSpec.${channelName}. Source tools are agent-side / runtime-polled; the component MUST NOT invoke them.`,\n `Subscribe to the channel via \\`const ${channelName} = useStream('${channelName}');\\` and read \\`${channelName}.latest\\` / \\`${channelName}.all\\` — the runtime polls or subscribes to '${toolName}' on the component's behalf.`,\n ),\n );\n }\n return issues;\n}\n\n// ── Anti-pattern grep — retired identifiers a model may emit from\n// stale training data ──\n\ninterface RetiredIdentifier {\n /** Regex matching the retired surface in source. */\n readonly pattern: RegExp;\n /** Stable subcategory used for the EvalIssue. */\n readonly id: string;\n /** Human-readable description for the issue message. */\n readonly label: string;\n /** Replacement guidance for the fix message. */\n readonly replacement: string;\n}\n\nconst RETIRED_IDENTIFIERS: readonly RetiredIdentifier[] = [\n {\n pattern: /\\buseWiredTool\\b/,\n id: \"useWiredTool\",\n label: \"`useWiredTool(...)` hook\",\n replacement:\n \"Use `useAction(name)` for user gestures the agent should react to. `agentCapabilities.tools` entries are agent-side catalog declarations — the component never calls them directly.\",\n },\n {\n pattern: /\\buseAgentTool\\b/,\n id: \"useAgentTool\",\n label: \"`useAgentTool(...)` hook\",\n replacement:\n \"Agent-side tools are NEVER imported as component hooks. The contract declares them under `agentCapabilities.tools` for cross-ref (actionSpec.nextStep / streamSpec.source.tool); the component reacts via `useAction` / `useStream`.\",\n },\n {\n pattern: /\\bcallWiredTool\\b/,\n id: \"callWiredTool\",\n label: \"`callWiredTool(...)` call\",\n replacement:\n \"Component-side direct invocation of agent-side tools is retired. Fire a UI gesture via `useAction(name)`; the agent reacts on its next turn (`nextStep` hint optional).\",\n },\n {\n pattern: /\\buseClientTool\\b/,\n id: \"useClientTool\",\n label: \"`useClientTool(name, handler)` hook\",\n replacement:\n \"Use a gadget hook from `@ggui-ai/gadgets` (e.g., `useGeolocation`, `useClipboardWrite`) and thread the result into a contextSpec slot or actionSpec payload.\",\n },\n {\n pattern: /\\bdispatch\\s*:\\s*\\{\\s*kind\\s*:/,\n id: \"dispatch.kind\",\n label: \"`dispatch: { kind: '...' }` discriminated union\",\n replacement:\n \"ActionEntry.dispatch is retired. Use the flat `nextStep?: '<tool>'` field on the action entry instead.\",\n },\n {\n pattern: /\\bintendedTool\\b/,\n id: \"intendedTool\",\n label: \"`intendedTool` field\",\n replacement:\n \"Use the flat `nextStep` field — the hint surface is one optional advisory string, not a nested discriminator.\",\n },\n {\n pattern: /\\bmode\\s*:\\s*['\"`]host-routed['\"`]/,\n id: \"mode.host-routed\",\n label: \"`mode: 'host-routed'`\",\n replacement:\n \"The `mode` field on action entries is retired. All actions are agent-routed; use `nextStep` for the optional tool hint.\",\n },\n {\n pattern: /\\bbroadcast\\s*:\\s*\\{/,\n id: \"broadcast\",\n label: \"`broadcast: { … }` contract field\",\n replacement:\n \"Move the channel source declaration to `streamSpec[channel].source = { tool, args? }`.\",\n },\n {\n // Match `agentTools` only as a contract-shaped object key or\n // property access — not as a local variable name in unrelated\n // code. `\\bagentTools\\s*[:.]` catches `{ agentTools: {...} }` /\n // `contract.agentTools` while ignoring `const agentTools = ...`.\n pattern: /\\bagentTools\\s*[:.]/,\n id: \"contract.agentTools\",\n label: \"`agentTools` top-level contract field\",\n replacement:\n \"The top-level `agentTools` field is retired. Declare agent-side tools under `agentCapabilities.tools` (catalog nested under a capabilities parent for symmetry with `clientCapabilities`).\",\n },\n {\n pattern: /\\bclientCapabilities\\s*\\.\\s*capabilities\\b/,\n id: \"clientCapabilities.capabilities\",\n label: \"`clientCapabilities.capabilities` inner key\",\n replacement:\n \"The inner `capabilities` key is retired. Use `clientCapabilities.gadgets` — entries are library-hook declarations, not RPC capabilities.\",\n },\n {\n pattern: /['\"`]@ggui-ai\\/client-tools['\"`]/,\n id: \"package.@ggui-ai/client-tools\",\n label: \"`@ggui-ai/client-tools` package import\",\n replacement:\n \"The package was renamed to `@ggui-ai/gadgets`. Update the import string.\",\n },\n {\n pattern: /\\bPushStory\\b/,\n id: \"PushStory\",\n label: \"`PushStory` type / `pushStorySchema` schema\",\n replacement:\n \"`PushStory` was retired when the handshake input was flattened. The current wire is `ggui_handshake({intent, blueprintDraft: {contract, variance?, generator?}})` + `ggui_render({handshakeId, props, override?: {contract?, variance?}})` (omit `override` to accept the proposal as-is).\",\n },\n {\n pattern: /\\bpushStorySchema\\b/,\n id: \"pushStorySchema\",\n label: \"`pushStorySchema` zod schema\",\n replacement:\n \"`pushStorySchema` was retired alongside `PushStory`. Current schemas: `handshakeInputSchema` + `renderInputSchema` (with the optional `override` re-aim) in `@ggui-ai/protocol`.\",\n },\n {\n pattern: /\\bstory\\s*\\.\\s*adapters\\b/,\n id: \"story.adapters\",\n label: \"`story.adapters` field access\",\n replacement:\n \"The story.adapters gate was retired alongside `PushStory`. Per-app permission gates flow through `clientCapabilities.gadgets[*].permission` (Permissions-Policy derivation).\",\n },\n {\n pattern: /\\bdeclaredAdapters\\b/,\n id: \"declaredAdapters\",\n label: \"`declaredAdapters` field / runtime gate\",\n replacement:\n \"App-level `declaredAdapters` was retired. Per-app permission gates derive from `clientCapabilities.gadgets[*].permission` instead.\",\n },\n {\n pattern: /\\bassertAdaptersDeclared\\b/,\n id: \"assertAdaptersDeclared\",\n label: \"`assertAdaptersDeclared(...)` runtime call\",\n replacement:\n \"The runtime adapter-gate function is retired. Permissions-Policy is derived per-contract at render commit time and threaded through the bootstrap projection.\",\n },\n {\n pattern: /\\bHandshakeStoredStory\\b/,\n id: \"HandshakeStoredStory\",\n label: \"`HandshakeStoredStory` storage type\",\n replacement:\n \"The OSS handler's stored type is now `HandshakeStoredInput` with the MVB-5 `{intent, blueprintDraft, forceCreate?}` shape.\",\n },\n {\n pattern: /\\brecord\\s*\\.\\s*story\\b/,\n id: \"record.story\",\n label: \"`record.story.*` access on handshake storage\",\n replacement:\n \"Handshake storage was flattened. Read `record.input.*` (intent / blueprintDraft) — the nested `story` wrapper is gone. MVB-5 also adds `record.suggestion` + `record.effectiveContract`.\",\n },\n];\n\nfunction runNoRetiredIdentifiers(input: AxisCheckInput): EvalIssue[] {\n // Source-only scan; compiled code irrelevant for identifier detection.\n // Run even without compiled code so we surface early in the loop.\n const src = input.sourceCode;\n const issues: EvalIssue[] = [];\n for (const rule of RETIRED_IDENTIFIERS) {\n if (!rule.pattern.test(src)) continue;\n issues.push(\n mkIssue(\n `universal.no_retired_identifiers.${rule.id}`,\n `Source contains ${rule.label} — retired from the contract surface.`,\n rule.replacement,\n ),\n );\n }\n return issues;\n}\n\nexport const TOOLING_CHECKS: readonly AxisCheck[] = [\n {\n id: \"tooling.clientCapability.hook_called\",\n axis: \"tooling\",\n values: CLIENT_PRESENT,\n run: runGadgetHookCalled,\n },\n {\n id: \"tooling.clientCapability.start_called\",\n axis: \"tooling\",\n values: CLIENT_PRESENT,\n run: runClientCapabilityStartCalled,\n },\n {\n // Stream-source direct-call check. Gated on realtime axis (rather\n // than tooling) since stream sources are a realtime concern — but\n // logically lives in tooling.ts alongside the other tool-reference\n // checks since the issue class is about referenced agentTools.\n id: \"realtime.stream_source.no_direct_call\",\n axis: \"realtime\",\n values: REALTIME_ACTIVE,\n run: runStreamSourceNoDirectCall,\n },\n {\n // Universal — fires on every tooling-axis value. The check itself\n // is contract-agnostic; the axis gate is \"every contract\" via the\n // full ALL_TOOLING_VALUES list (rather than the universal-check\n // module's \"render\" gate convention) so the anti-pattern stays\n // co-located with the other tooling-related rules.\n id: \"universal.no_retired_identifiers\",\n axis: \"tooling\",\n values: ALL_TOOLING_VALUES,\n run: runNoRetiredIdentifiers,\n },\n];\n","// packages/ui-gen/src/evaluation/axis-checks/extras.ts\n//\n// Axis-specific checks that had no legacy home. These fire on axis values\n// the old 3-mode dispatch didn't route (drag, swipe, compose, multi-step,\n// mixed streams). Intentionally narrow — each catches a specific failure\n// mode the fragments' prompt text tells the LLM to avoid.\n\nimport type { AxisCheck, AxisCheckInput } from \"./types.js\";\nimport type { EvalIssue } from \"../types-public.js\";\n\nfunction mkIssue(\n subcategory: string,\n description: string,\n fix: string,\n result: \"fail\" | \"warn\" = \"warn\",\n): EvalIssue {\n return { tier: 0, result, category: \"mode\", subcategory, description, fix };\n}\n\n/**\n * writeTrigger=drag → must attach onDragStart + onDrop (or onDragOver)\n * somewhere. Otherwise the drag handler is decorative.\n */\nconst dragTriggerWired: AxisCheck = {\n id: \"writeTrigger.drag.handlers_wired\",\n axis: \"writeTrigger\",\n values: [\"drag\"],\n run(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const hasStart = /onDragStart\\s*=/.test(src);\n const hasDrop = /onDrop\\s*=/.test(src);\n if (hasStart && hasDrop) return [];\n return [\n mkIssue(\n \"writeTrigger.drag.handlers_wired\",\n `Classified as writeTrigger=drag but component lacks ${!hasStart ? \"onDragStart\" : \"\"}${!hasStart && !hasDrop ? \" + \" : \"\"}${!hasDrop ? \"onDrop\" : \"\"} handlers.`,\n \"Attach onDragStart to draggable items and onDrop (with onDragOver preventDefault) to drop zones.\",\n \"fail\",\n ),\n ];\n },\n};\n\n/**\n * writeTrigger=swipe → must wire onTouchStart + onTouchEnd. Also emit\n * a warn if no fallback click handlers exist (desktop users).\n */\nconst swipeTriggerWired: AxisCheck = {\n id: \"writeTrigger.swipe.handlers_wired\",\n axis: \"writeTrigger\",\n values: [\"swipe\"],\n run(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const hasTouch = /onTouchStart\\s*=/.test(src) && /onTouchEnd\\s*=/.test(src);\n if (!hasTouch) {\n return [\n mkIssue(\n \"writeTrigger.swipe.handlers_wired\",\n \"Classified as writeTrigger=swipe but component lacks onTouchStart + onTouchEnd handlers.\",\n \"Wire onTouchStart to record the start X/Y, onTouchEnd to classify direction and fire the action.\",\n \"fail\",\n ),\n ];\n }\n return [];\n },\n};\n\n/**\n * writes=compose → exactly one action should be called with ids sourced\n * from two different state slots. Heuristic: at least two useState or\n * props.id references should appear in the action invocation's argument\n * region.\n *\n * Light check: warn if only one id-bearing field appears near the useAction\n * invocation (hard to get false-positive free without AST).\n */\nconst composeCrossEntity: AxisCheck = {\n id: \"writes.compose.cross_entity_ids\",\n axis: \"writes\",\n values: [\"compose\"],\n run(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n // Look for an action invocation passing an object literal with >= 2\n // `*Id` or `id` keys. That's the compose signature.\n const re = /\\{\\s*[^}]*?\\b(\\w*Id|id)\\b[^}]*?,\\s*[^}]*?\\b(\\w*Id|id)\\b[^}]*?\\}/s;\n if (re.test(src)) return [];\n return [\n mkIssue(\n \"writes.compose.cross_entity_ids\",\n \"Classified as writes=compose but no action invocation passes two id-bearing keys together.\",\n \"The compose action must receive both entity ids in one payload, e.g. `schedule({ eventId, calendarId })`.\",\n \"warn\",\n ),\n ];\n },\n};\n\n/**\n * layout=multi-step → integer step state + a step-guard on Next. Re-uses\n * the form check's multi-step signal, but fires even when writes != submit\n * (e.g., multi-step wizards that never submit, like onboarding).\n */\nconst multiStepHasState: AxisCheck = {\n id: \"layout.multi_step.state_present\",\n axis: \"layout\",\n values: [\"multi-step\"],\n run(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const hasIntStep = /useState(?:<number>)?\\s*\\(\\s*[0-9]+\\s*\\)/.test(src);\n if (hasIntStep) return [];\n return [\n mkIssue(\n \"layout.multi_step.state_present\",\n \"Classified as layout=multi-step but no integer-typed useState tracks the current step.\",\n \"Add `const [step, setStep] = useState(0);` and branch rendering on it.\",\n \"fail\",\n ),\n ];\n },\n};\n\n/**\n * layout=multi-step → the design system's Stepper composite must be\n * ADOPTED (rendered). D8 (Exp 47) measured adoption at 17/18 from\n * fragment + JSDoc alone; this check gives the CHECK leg ownership of\n * the mandate so a regression surfaces as a fix turn instead of\n * silently shipping a wizard with no step affordance.\n *\n * Replaces the always-on `stepper-display-only` pitfall (deleted in the\n * same slice): with adoption carried by the WHAT leg, a 6th always-on\n * prompt rule was pure attention-dilution cost (the exp66 count-\n * sensitivity class, ~+9s blended), while this check prices at zero\n * outside multi-step cells. The pitfall's display-only guidance lives\n * on in the fix string below — delivered only when a cell actually\n * needs it.\n */\nconst stepperAdopted: AxisCheck = {\n id: \"layout.multi_step.stepper_adopted\",\n axis: \"layout\",\n values: [\"multi-step\"],\n run(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n if (/<Stepper[\\s/>]/.test(input.sourceCode)) return [];\n return [\n mkIssue(\n \"layout.multi_step.stepper_adopted\",\n \"Classified as layout=multi-step but the design system's Stepper composite is never rendered.\",\n \"Render <Stepper steps={STEPS} current={step} /> above the step body — STEPS is a top-level const array of step labels and `step` is your own useState index. Stepper is display-only: it never stores or advances the step itself.\",\n \"fail\",\n ),\n ];\n },\n};\n\n/**\n * realtime=mixed → the contract declares multiple events of different\n * kinds. Each must have its own useStream call. We approximate by\n * requiring ≥ 2 useStream calls when the vector is mixed.\n */\nconst mixedStreamsHaveHandlers: AxisCheck = {\n id: \"realtime.mixed.handlers_per_event\",\n axis: \"realtime\",\n values: [\"mixed\"],\n run(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n // Accept both `useStream('x')` and `useStream<T>('x')` (generic type arg).\n // The boilerplate pre-emits typed calls, so the `(` -only regex was a\n // 100%-false-positive on chat-interface + stock-ticker (Experiment 34).\n const matches = src.match(/useStream\\s*(?:<[^>]*>)?\\s*\\(/g);\n const count = matches?.length ?? 0;\n if (count >= 2) return [];\n return [\n mkIssue(\n \"realtime.mixed.handlers_per_event\",\n `Classified as realtime=mixed but only ${count} useStream call(s) found — mixed streams need one handler per event.`,\n \"Add a separate `useStream('eventName')` for each event in the contract.\",\n \"fail\",\n ),\n ];\n },\n};\n\nexport const EXTRA_CHECKS: readonly AxisCheck[] = [\n dragTriggerWired,\n swipeTriggerWired,\n composeCrossEntity,\n multiStepHasState,\n stepperAdopted,\n mixedStreamsHaveHandlers,\n];\n","// packages/ui-gen/src/evaluation/axis-checks/registry.ts\n//\n// Flat list of all axis-gated checks. The dispatcher iterates this and\n// runs every entry whose gate matches the classification's axis vector.\n\nimport type { AxisCheck } from \"./types.js\";\nimport { UNIVERSAL_CHECKS } from \"./checks/universal.js\";\nimport { STATE_MERGE_CHECKS } from \"./checks/state-merge.js\";\nimport { REALTIME_CHECKS } from \"./checks/realtime.js\";\nimport { WRITES_CHECKS } from \"./checks/writes.js\";\nimport { STATE_PAYLOAD_CHECKS } from \"./checks/state-payload.js\";\nimport { TOOLING_CHECKS } from \"./checks/tooling.js\";\nimport { EXTRA_CHECKS } from \"./extras.js\";\n\nexport const REGISTRY: readonly AxisCheck[] = [\n ...UNIVERSAL_CHECKS,\n ...STATE_MERGE_CHECKS,\n ...REALTIME_CHECKS,\n ...WRITES_CHECKS,\n ...STATE_PAYLOAD_CHECKS,\n ...TOOLING_CHECKS,\n ...EXTRA_CHECKS,\n];\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/evaluation/axis-checks/helpers.ts","../../../src/evaluation/axis-checks/checks/universal.ts","../../../src/evaluation/axis-checks/checks/state-merge.ts","../../../src/evaluation/axis-checks/checks/realtime.ts","../../../src/evaluation/axis-checks/checks/writes.ts","../../../src/evaluation/axis-checks/checks/state-payload.ts","../../../src/evaluation/axis-checks/checks/tooling.ts","../../../src/evaluation/axis-checks/extras.ts","../../../src/evaluation/axis-checks/registry.ts"],"names":["REALTIME_ACTIVE","mkIssue"],"mappings":"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","file":"registry.js","sourcesContent":["// packages/ui-gen/src/evaluation/axis-checks/helpers.ts\n//\n// Shared contract inspection + source-scan helpers used by axis checks.\n// Ported from the retired mode-checks/ modules.\n\nimport type { ActionEntry, DataContract, JsonObject, JsonValue } from \"@ggui-ai/protocol\";\nimport {\n HOOK_NAME_RE,\n listContractGadgets,\n STDLIB_GADGETS_PACKAGE,\n} from \"@ggui-ai/protocol\";\nimport type { EvalIssue } from \"../types-public.js\";\n\n// =============================================================================\n// Contract shape helpers\n// =============================================================================\n\nexport interface PropShape {\n type?: string;\n required?: boolean;\n items?: { type?: string; properties?: Record<string, unknown> };\n schema?: {\n type?: string;\n items?: { type?: string; properties?: Record<string, unknown> };\n };\n}\n\nexport interface EntityCollection {\n name: string;\n idField: string;\n}\n\nexport interface SubmitAction {\n name: string;\n payloadKeys: string[];\n}\n\nconst ID_FIELD_CANDIDATES = [\"id\", \"uuid\", \"symbol\", \"key\", \"slug\", \"code\"];\n\nfunction getItemsProperties(p: PropShape): Record<string, unknown> | undefined {\n return p.items?.properties ?? p.schema?.items?.properties;\n}\n\nfunction inferIdField(itemProps: Record<string, unknown> | undefined): string {\n if (!itemProps) return \"id\";\n for (const cand of ID_FIELD_CANDIDATES) {\n if (cand in itemProps) return cand;\n }\n for (const [k, v] of Object.entries(itemProps)) {\n const vv = v as { type?: string; schema?: { type?: string } } | undefined;\n if (vv?.type === \"string\" || vv?.schema?.type === \"string\") return k;\n }\n return \"id\";\n}\n\nexport function getRequiredPropNames(contract?: DataContract): string[] {\n const propsField = contract?.propsSpec as\n | { properties?: Record<string, PropShape> }\n | undefined;\n const properties = propsField?.properties ?? {};\n return Object.entries(properties)\n .filter(([, p]) => p && typeof p === \"object\" && p.required === true)\n .map(([name]) => name);\n}\n\nexport function getActionNames(contract?: DataContract): string[] {\n return Object.keys(contract?.actionSpec ?? {});\n}\n\nexport function getStreamEventNames(contract?: DataContract): string[] {\n return Object.keys(contract?.streamSpec ?? {});\n}\n\n/**\n * Returns the local BINDING names the boilerplate emits for every\n * HOOK gadget the contract declares — `useGeolocation` → `geolocation`\n * (strip the `use` prefix, lowercase the first char). The wire\n * `clientCapabilities.gadgets` is package-keyed and carries only the\n * export NAME, not a separate binding name, so the binding is derived\n * here exactly as the boilerplate generator derives it.\n *\n * Component gadgets are excluded — they are rendered as JSX, not bound\n * to a `const`, so the `const <name> = …()` axis checks don't apply.\n *\n * The agentCapabilities.tools catalog has no parallel helper —\n * agent-side tools aren't component-side, so the axis checks don't\n * scan source for agent-tool bindings.\n */\nexport function getGadgetNames(contract?: DataContract): string[] {\n if (!contract) return [];\n return listContractGadgets(contract)\n .filter((use) => HOOK_NAME_RE.test(use.name))\n .map((use) =>\n use.name.length > 3\n ? use.name.charAt(3).toLowerCase() + use.name.slice(4)\n : use.name,\n );\n}\n\n/**\n * Like {@link getGadgetNames} but restricted to the first-party\n * `@ggui-ai/gadgets` stdlib package — the built-in browser capabilities\n * (`useGeolocation`, `useCamera`, …) that carry the `idle → prompting →\n * active` lifecycle and therefore need a `.start()` invocation.\n *\n * Registered third-party gadgets (e.g. `useBoardState` from\n * `@example/gadget-board`) are plain data hooks: the runtime resolves\n * them without a user gesture, so the `.start()` axis check must NOT\n * fire on them.\n */\nexport function getStdlibGadgetNames(contract?: DataContract): string[] {\n if (!contract) return [];\n return listContractGadgets(contract)\n .filter(\n (use) =>\n use.package === STDLIB_GADGETS_PACKAGE && HOOK_NAME_RE.test(use.name),\n )\n .map((use) =>\n use.name.length > 3\n ? use.name.charAt(3).toLowerCase() + use.name.slice(4)\n : use.name,\n );\n}\n\nexport function getEntityCollections(contract?: DataContract): EntityCollection[] {\n const propsField = contract?.propsSpec as\n | { properties?: Record<string, unknown> }\n | undefined;\n const properties = propsField?.properties ?? {};\n const entities: EntityCollection[] = [];\n for (const [name, p] of Object.entries(properties)) {\n if (!p || typeof p !== \"object\") continue;\n const pp = p as PropShape;\n const type = pp.type ?? pp.schema?.type;\n const items = pp.items ?? pp.schema?.items;\n if (type === \"array\" && items?.type === \"object\") {\n entities.push({ name, idField: inferIdField(getItemsProperties(pp)) });\n }\n }\n return entities;\n}\n\nfunction singularize(name: string): string {\n if (name.endsWith(\"ies\")) return name.slice(0, -3) + \"y\";\n if (name.endsWith(\"ses\")) return name.slice(0, -2);\n if (name.endsWith(\"s\") && !name.endsWith(\"ss\")) return name.slice(0, -1);\n return name;\n}\n\n/**\n * Entity collections that are actually mutated (referenced by a stream\n * event or by an action payload's entity-id key). Static reference lists\n * (e.g., kanban's `columns`) are excluded so they don't trigger\n * \"must be in useState\" false positives.\n */\nexport function getMutatedEntityCollections(\n contract: DataContract | undefined,\n allEntities: EntityCollection[],\n): EntityCollection[] {\n if (!contract) return allEntities;\n\n const actionSpec = contract.actionSpec ?? {};\n const streamSpec = contract.streamSpec ?? {};\n\n const hasStreams = Object.keys(streamSpec).length > 0;\n\n const referencedIdKeys = new Set<string>();\n for (const action of Object.values(actionSpec) as ActionEntry[]) {\n const ex = action.example;\n if (!ex || typeof ex !== \"object\" || Array.isArray(ex)) continue;\n for (const key of Object.keys(ex as JsonObject)) {\n if (key === \"id\" || key === \"key\" || key === \"index\") {\n referencedIdKeys.add(\"id\");\n referencedIdKeys.add(\"key\");\n referencedIdKeys.add(\"index\");\n } else if (/Id$/.test(key)) {\n referencedIdKeys.add(key.slice(0, -2).toLowerCase());\n }\n }\n }\n\n const mutated = allEntities.filter((e) =>\n referencedIdKeys.has(singularize(e.name).toLowerCase()),\n );\n\n if (mutated.length === 0 && hasStreams && allEntities.length > 0) {\n return [allEntities[0]];\n }\n return mutated.length > 0 ? mutated : allEntities;\n}\n\nfunction countScalarKeys(example: unknown): string[] {\n if (!example || typeof example !== \"object\" || Array.isArray(example)) return [];\n const keys: string[] = [];\n for (const [k, v] of Object.entries(example as Record<string, unknown>)) {\n const t = typeof v;\n if (t === \"string\" || t === \"number\" || t === \"boolean\") keys.push(k);\n }\n return keys;\n}\n\nexport function getSubmitActions(contract?: DataContract): SubmitAction[] {\n const actionSpec = contract?.actionSpec ?? {};\n const result: SubmitAction[] = [];\n for (const [name, action] of Object.entries(actionSpec) as Array<[string, ActionEntry]>) {\n const ex: JsonValue | undefined = action.example;\n const scalarKeys = countScalarKeys(ex);\n if (scalarKeys.length < 3) continue;\n const allKeys = ex && typeof ex === \"object\" && !Array.isArray(ex)\n ? Object.keys(ex as JsonObject)\n : scalarKeys;\n result.push({ name, payloadKeys: allKeys });\n }\n return result;\n}\n\nexport function getArrStrProps(contract?: DataContract): string[] {\n const propsField = contract?.propsSpec as\n | { properties?: Record<string, unknown> }\n | undefined;\n const properties = propsField?.properties ?? {};\n const names: string[] = [];\n for (const [name, p] of Object.entries(properties)) {\n if (!p || typeof p !== \"object\") continue;\n const pp = p as PropShape;\n const type = pp.type ?? pp.schema?.type;\n const items = pp.items ?? pp.schema?.items;\n if (type === \"array\" && items?.type === \"string\") names.push(name);\n }\n return names;\n}\n\nexport function getInitialValuePropNames(contract?: DataContract): string[] {\n const propsField = contract?.propsSpec as\n | { properties?: Record<string, unknown> }\n | undefined;\n const properties = propsField?.properties ?? {};\n const names: string[] = [];\n for (const [name, p] of Object.entries(properties)) {\n if (!p || typeof p !== \"object\") continue;\n const pp = p as PropShape;\n const type = pp.type ?? pp.schema?.type;\n if (type === \"object\" && /^initial/i.test(name)) names.push(name);\n }\n return names;\n}\n\n// =============================================================================\n// Source scanning helpers\n// =============================================================================\n\n/**\n * Collect all key names that appear as state slots — either keys inside a\n * `useState({ ... })` object literal, or standalone state variables.\n */\nexport function collectStateKeys(src: string): Set<string> {\n const keys = new Set<string>();\n const varRe = /const\\s*\\[\\s*(\\w+)\\s*,\\s*(\\w+)\\s*\\]\\s*=\\s*useState/g;\n for (const m of src.matchAll(varRe)) keys.add(m[1]);\n const objRe = /useState(?:<[^>]*>)?\\s*\\(\\s*\\{([\\s\\S]*?)\\}\\s*\\)/g;\n for (const m of src.matchAll(objRe)) {\n const keyRe = /(?:^|,)\\s*(\\w+)\\s*:/g;\n for (const km of m[1].matchAll(keyRe)) keys.add(km[1]);\n }\n const defaultObjRe = /useState(?:<[^>]*>)?\\s*\\([^)]*\\|\\|\\s*\\{([^}]*)\\}/g;\n for (const m of src.matchAll(defaultObjRe)) {\n const keyRe = /(?:^|,)\\s*(\\w+)\\s*:/g;\n for (const km of m[1].matchAll(keyRe)) keys.add(km[1]);\n }\n return keys;\n}\n\nexport function isMultiStepPrompt(prompt: string): boolean {\n if (!prompt) return false;\n const p = prompt.toLowerCase();\n return (\n /\\bstep\\s*[1-9]\\b/.test(p) ||\n /\\b[1-9][- ]step\\b/.test(p) ||\n /\\bmulti[- ]step\\b/.test(p) ||\n /\\bwizard\\b/.test(p) ||\n /\\bsteps?:\\s*\\n?/.test(p)\n );\n}\n\n// =============================================================================\n// Issue factory\n// =============================================================================\n\nexport function mkIssue(\n subcategory: string,\n description: string,\n fix: string,\n result: \"fail\" | \"warn\" = \"fail\",\n): EvalIssue {\n // mode-category issues are structural (missing hook wiring, bad merge-by-id,\n // hardcoded entity literals) — always P0. See ALIGNMENT.md R1.\n return { tier: 0, result, category: \"mode\", priority: \"P0\", subcategory, description, fix };\n}\n\nexport function cap(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n","// packages/ui-gen/src/evaluation/axis-checks/checks/universal.ts\n//\n// Checks that run regardless of axis value — they apply to any generated\n// component. Dispatched via a \"universal\" gate that matches every render\n// value.\n\nimport type { EvalIssue } from \"../../types-public.js\";\nimport type { AxisCheck, AxisCheckInput } from \"../types.js\";\nimport {\n getRequiredPropNames,\n mkIssue,\n} from \"../helpers.js\";\n\nconst ALL_RENDER_VALUES = [\n \"static\", \"list\", \"grid\", \"spatial\", \"timeline\", \"chart\", \"master-detail\",\n] as const;\n\nfunction runPropCoverage(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const requiredProps = getRequiredPropNames(input.contract);\n const issues: EvalIssue[] = [];\n for (const name of requiredProps) {\n const dotAccess = new RegExp(`\\\\bprops\\\\.${name}\\\\b`);\n const bracketAccess = new RegExp(`\\\\bprops\\\\[['\"\\`]${name}['\"\\`]\\\\]`);\n const destructured = new RegExp(\n `props[^;]{0,200}\\\\{[^}]*\\\\b${name}\\\\b[^}]*\\\\}|\\\\{[^}]*\\\\b${name}\\\\b[^}]*\\\\}[^;]{0,10}=\\\\s*props`,\n );\n if (dotAccess.test(src) || bracketAccess.test(src) || destructured.test(src))\n continue;\n issues.push(\n mkIssue(\n \"universal.prop_coverage\",\n `Required prop \"${name}\" is not referenced anywhere in the component.`,\n `Render props.${name} — the data contract marks it required.`,\n ),\n );\n }\n return issues;\n}\n\nfunction runNoPropMirror(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const issues: EvalIssue[] = [];\n const re =\n /const\\s*\\[\\s*(\\w+)\\s*,\\s*(\\w+)\\s*\\]\\s*=\\s*useState(?:<[^>]*>)?\\s*\\(\\s*props\\??\\.(\\w+)/g;\n for (const m of src.matchAll(re)) {\n const [full, stateVar, setter, propName] = m;\n const idx = m.index ?? 0;\n const after = src.slice(idx + full.length);\n if (new RegExp(`\\\\b${setter}\\\\s*\\\\(`).test(after)) continue;\n issues.push(\n mkIssue(\n \"universal.no_prop_mirror\",\n `useState(props.${propName}) for \"${stateVar}\" has no \"${setter}\" call — this mirrors a prop without mutation.`,\n `Read props.${propName} directly in the render; remove the useState for ${stateVar}.`,\n \"warn\",\n ),\n );\n }\n return issues;\n}\n\nfunction runNoPhantomUseState(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const issues: EvalIssue[] = [];\n const re = /const\\s*\\[\\s*(\\w+)\\s*,\\s*(\\w+)\\s*\\]\\s*=\\s*useState/g;\n for (const m of src.matchAll(re)) {\n const [full, stateVar, setter] = m;\n const idx = m.index ?? 0;\n const after = src.slice(idx + full.length);\n const stateUsed = new RegExp(`\\\\b${stateVar}\\\\b`).test(after);\n const setterUsed = new RegExp(`\\\\b${setter}\\\\b`).test(after);\n if (stateUsed || setterUsed) continue;\n issues.push(\n mkIssue(\n \"universal.no_phantom_useState\",\n `useState for \"${stateVar}\" is declared but neither \"${stateVar}\" nor \"${setter}\" is referenced.`,\n `Remove the useState for ${stateVar} — it is dead state.`,\n \"warn\",\n ),\n );\n }\n return issues;\n}\n\nfunction runPropSeedNoResync(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const issues: EvalIssue[] = [];\n const re =\n /const\\s*\\[\\s*(\\w+)\\s*,\\s*(\\w+)\\s*\\]\\s*=\\s*useState(?:<[^>]*>)?\\s*\\(\\s*props\\??\\.(\\w+)/g;\n for (const m of src.matchAll(re)) {\n const [full, stateVar, setter, propName] = m;\n const idx = m.index ?? 0;\n const after = src.slice(idx + full.length);\n // Never-called setter is `no_prop_mirror`'s case — this check is\n // its #480 complement: the setter IS used (real optimistic state)\n // but nothing re-seeds when the agent repaints the prop.\n if (!new RegExp(`\\\\b${setter}\\\\s*\\\\(`).test(after)) continue;\n // A re-seed effect names the prop in a dependency array. Bracket\n // shape is the pragmatic signal (same looseness as the sibling\n // checks): any `[... props.X ...]` array in the source counts.\n const resync = new RegExp(\n `\\\\[[^\\\\[\\\\]]*props\\\\??\\\\.${propName}\\\\b[^\\\\[\\\\]]*\\\\]`,\n );\n if (resync.test(src)) continue;\n issues.push(\n mkIssue(\n \"universal.prop_seed_no_resync\",\n `useState(props.${propName}) seeds \"${stateVar}\" and mutates it, but no effect depends on [props.${propName}] — a ggui_amend repaint pushes new props that never reach this display (#480).`,\n `Add \\`useEffect(() => ${setter}(props.${propName}), [props.${propName}]);\\` so agent repaints re-seed the state, or derive the display directly from props.${propName}.`,\n \"warn\",\n ),\n );\n }\n return issues;\n}\n\nexport const UNIVERSAL_CHECKS: readonly AxisCheck[] = [\n {\n id: \"universal.prop_coverage\",\n axis: \"render\",\n values: ALL_RENDER_VALUES,\n run: runPropCoverage,\n },\n {\n id: \"universal.no_prop_mirror\",\n axis: \"render\",\n values: ALL_RENDER_VALUES,\n run: runNoPropMirror,\n },\n {\n id: \"universal.no_phantom_useState\",\n axis: \"render\",\n values: ALL_RENDER_VALUES,\n run: runNoPhantomUseState,\n },\n {\n id: \"universal.prop_seed_no_resync\",\n axis: \"render\",\n values: ALL_RENDER_VALUES,\n run: runPropSeedNoResync,\n },\n];\n","// packages/ui-gen/src/evaluation/axis-checks/checks/state-merge.ts\n//\n// Checks gated on state=merge: the component owns a live entity list\n// reconciled from stream/action updates. Ported from\n// mode-checks/collection.ts (§5a state-seeded, no-hardcoded-entities,\n// derived-view-memoized).\n\nimport type { EvalIssue } from \"../../types-public.js\";\nimport type { AxisCheck, AxisCheckInput } from \"../types.js\";\nimport {\n cap,\n getEntityCollections,\n getMutatedEntityCollections,\n mkIssue,\n} from \"../helpers.js\";\n\nfunction runStateSeededFromProps(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const all = getEntityCollections(input.contract);\n const entities = getMutatedEntityCollections(input.contract, all);\n const issues: EvalIssue[] = [];\n for (const e of entities) {\n const re = new RegExp(\n `useState(?:<[^>]*>)?\\\\s*\\\\([\\\\s\\\\S]{0,400}?props\\\\.${e.name}\\\\b`,\n );\n if (re.test(src)) continue;\n issues.push(\n mkIssue(\n \"state.merge.seeded_from_props\",\n `Entity collection \"${e.name}\" is not seeded from props — no useState initializer reads props.${e.name}.`,\n `Add \\`const [${e.name}, set${cap(e.name)}] = useState(props.${e.name});\\` paired with \\`useEffect(() => set${cap(e.name)}(props.${e.name}), [props.${e.name}]);\\` so stream/action updates merge into live state AND agent repaints (ggui_amend) re-seed it (#480).`,\n ),\n );\n }\n return issues;\n}\n\nfunction runNoHardcodedEntities(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const all = getEntityCollections(input.contract);\n const entities = getMutatedEntityCollections(input.contract, all);\n if (entities.length === 0) return [];\n const uncommented = src\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/\\/\\/[^\\n]*/g, \"\");\n const issues: EvalIssue[] = [];\n const idFields = [...new Set(entities.map((e) => e.idField))];\n for (const idField of idFields) {\n const re = new RegExp(\n `\\\\[\\\\s*\\\\{[^}]*\\\\b${idField}\\\\s*:[^}]*\\\\}\\\\s*,\\\\s*\\\\{[^}]*\\\\b${idField}\\\\s*:`,\n \"g\",\n );\n if (!re.test(uncommented)) continue;\n issues.push(\n mkIssue(\n \"state.merge.no_hardcoded_entities\",\n `Hardcoded entity array literal (multiple objects with \"${idField}\") in the component — entity data should come from state/props.`,\n `Remove the literal array. Seed state from props.{entityProp} and merge updates via stream.`,\n ),\n );\n }\n return issues;\n}\n\nfunction runDerivedViewMemoized(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const all = getEntityCollections(input.contract);\n const entities = getMutatedEntityCollections(input.contract, all);\n if (entities.length === 0) return [];\n const returnIdx = src.indexOf(\"return (\");\n if (returnIdx < 0) return [];\n const renderBody = src.slice(returnIdx);\n const issues: EvalIssue[] = [];\n for (const e of entities) {\n const re = new RegExp(`\\\\b${e.name}\\\\s*\\\\.(filter|reduce|sort)\\\\s*\\\\(`);\n if (re.test(renderBody)) {\n issues.push(\n mkIssue(\n \"state.merge.derived_view_memoized\",\n `Derived view (${e.name}.filter/reduce/sort) computed inside the render body — should be wrapped in useMemo.`,\n `Extract to \\`const ${e.name}Filtered = useMemo(() => ${e.name}.filter(...), [${e.name}, ...]);\\` before the return.`,\n \"warn\",\n ),\n );\n }\n }\n return issues;\n}\n\n/**\n * `.map()` keyed by index → reorders and merges break React reconciliation.\n * Gated on any render that iterates (list/grid/timeline/master-detail) OR\n * state=merge (mutating list).\n */\nfunction runMapKeyIsId(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const INDEX_NAMES = new Set([\"index\", \"idx\", \"i\", \"j\", \"k\", \"n\", \"ix\"]);\n const re = /key\\s*=\\s*\\{\\s*(\\w+)\\s*\\}/g;\n const issues: EvalIssue[] = [];\n for (const m of src.matchAll(re)) {\n const key = m[1];\n if (!INDEX_NAMES.has(key)) continue;\n issues.push(\n mkIssue(\n \"render.map_key_is_id\",\n `Array key uses index variable \"${key}\" — reorders and stream merges will break React reconciliation.`,\n `Replace key={${key}} with key={item.id} (or item.symbol / whatever the entity id field is).`,\n ),\n );\n }\n return issues;\n}\n\nexport const STATE_MERGE_CHECKS: readonly AxisCheck[] = [\n {\n id: \"state.merge.seeded_from_props\",\n axis: \"state\",\n values: [\"merge\"],\n run: runStateSeededFromProps,\n },\n {\n id: \"state.merge.no_hardcoded_entities\",\n axis: \"state\",\n values: [\"merge\"],\n run: runNoHardcodedEntities,\n },\n {\n id: \"state.merge.derived_view_memoized\",\n axis: \"state\",\n values: [\"merge\"],\n run: runDerivedViewMemoized,\n },\n // Map-key check: gated on any iterating render. state=merge always\n // implies iteration, so the render gate already covers it.\n {\n id: \"render.map_key_is_id\",\n axis: \"render\",\n values: [\"list\", \"grid\", \"timeline\", \"master-detail\"],\n run: runMapKeyIsId,\n },\n];\n","// packages/ui-gen/src/evaluation/axis-checks/checks/realtime.ts\n//\n// Checks gated on realtime != none. Ported from mode-checks/collection.ts\n// (stream-handler-per-event, stream-merges-by-id).\n\nimport type { EvalIssue } from \"../../types-public.js\";\nimport type { AxisCheck, AxisCheckInput } from \"../types.js\";\nimport {\n getEntityCollections,\n getMutatedEntityCollections,\n getStreamEventNames,\n mkIssue,\n} from \"../helpers.js\";\n\nconst REALTIME_ACTIVE = [\"merge\", \"append\", \"status\", \"presence\", \"mixed\"] as const;\n\nfunction runStreamHandlerPerEvent(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const eventNames = getStreamEventNames(input.contract);\n const issues: EvalIssue[] = [];\n for (const name of eventNames) {\n const re = new RegExp(`useStream(?:<[^>]*>)?\\\\s*\\\\(\\\\s*['\"\\`]${name}['\"\\`]`);\n if (re.test(src)) continue;\n issues.push(\n mkIssue(\n \"realtime.stream_handler_per_event\",\n `Stream event \"${name}\" declared in the contract has no useStream('${name}') call.`,\n `Add \\`const ${name} = useStream<...>('${name}');\\` and handle ${name}.latest in a useEffect.`,\n ),\n );\n }\n return issues;\n}\n\nfunction runStreamMergesById(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const eventNames = getStreamEventNames(input.contract);\n const all = getEntityCollections(input.contract);\n const entities = getMutatedEntityCollections(input.contract, all);\n if (eventNames.length === 0 || entities.length === 0) return [];\n const issues: EvalIssue[] = [];\n const idFields = new Set(entities.map((e) => e.idField));\n for (const idField of idFields) {\n const re = new RegExp(`\\\\.${idField}\\\\b`);\n if (re.test(src)) continue;\n issues.push(\n mkIssue(\n \"realtime.merge.stream_merges_by_id\",\n `Entity id field \"${idField}\" is never referenced in the source — stream merge likely does not key by id.`,\n `In the stream handler, merge by id: setItems(prev => prev.map(x => x.${idField} === update.${idField} ? {...x, ...update} : x)).`,\n \"warn\",\n ),\n );\n }\n return issues;\n}\n\nexport const REALTIME_CHECKS: readonly AxisCheck[] = [\n {\n id: \"realtime.stream_handler_per_event\",\n axis: \"realtime\",\n values: REALTIME_ACTIVE,\n run: runStreamHandlerPerEvent,\n },\n {\n id: \"realtime.merge.stream_merges_by_id\",\n axis: \"realtime\",\n values: [\"merge\", \"mixed\"],\n run: runStreamMergesById,\n },\n];\n","// packages/ui-gen/src/evaluation/axis-checks/checks/writes.ts\n//\n// Checks gated on writes != none. Ported from display.ts (action-hook,\n// action-handler) + form.ts (submit-hook, submit-handler, submit-disabled)\n// + collection.ts (per-item action variants).\n\nimport type { EvalIssue } from \"../../types-public.js\";\nimport type { AxisCheck, AxisCheckInput } from \"../types.js\";\nimport {\n getActionNames,\n getSubmitActions,\n mkIssue,\n} from \"../helpers.js\";\n\nconst ACTIVE_WRITES = [\n \"commit\", \"multi-commit\", \"per-item\", \"submit\", \"compose\",\n] as const;\n\nfunction runActionHookWired(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const actionNames = getActionNames(input.contract);\n const issues: EvalIssue[] = [];\n for (const name of actionNames) {\n const re = new RegExp(`useAction(?:<[^>]*>)?\\\\s*\\\\(\\\\s*['\"\\`]${name}['\"\\`]`);\n if (re.test(src)) continue;\n issues.push(\n mkIssue(\n \"writes.action_hook_wired\",\n `Contract action \"${name}\" has no useAction('${name}') call.`,\n `Add \\`const ${name} = useAction<...>('${name}');\\` and wire it to the relevant control.`,\n ),\n );\n }\n return issues;\n}\n\nfunction runActionHandlerAttached(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const actionNames = getActionNames(input.contract);\n const issues: EvalIssue[] = [];\n for (const name of actionNames) {\n const declRe = new RegExp(\n `const\\\\s+(\\\\w+)\\\\s*=\\\\s*useAction(?:<[^>]*>)?\\\\s*\\\\(\\\\s*['\"\\`]${name}['\"\\`]`,\n );\n const m = src.match(declRe);\n if (!m) continue;\n const constName = m[1];\n const rest = src.replace(m[0], \"\");\n if (new RegExp(`\\\\b${constName}\\\\s*\\\\(`).test(rest)) continue;\n issues.push(\n mkIssue(\n \"writes.action_handler_attached\",\n `useAction result \"${constName}\" (for action \"${name}\") is declared but never invoked.`,\n `Call ${constName}({...}) from an interactive element (e.g., <Button onClick={() => ${constName}(payload)}>).`,\n ),\n );\n }\n return issues;\n}\n\nfunction runSubmitDisabledPath(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const submits = getSubmitActions(input.contract);\n if (submits.length === 0) return [];\n if (/disabled\\s*=\\s*\\{/.test(src)) return [];\n return [\n mkIssue(\n \"writes.submit.disabled_path\",\n `Form has no \\`disabled={...}\\` expression anywhere — submit is likely unconditional.`,\n `Gate submit on validation: e.g. \\`<Button disabled={!isValid} onClick={handleSubmit}>\\`.`,\n \"warn\",\n ),\n ];\n}\n\nexport const WRITES_CHECKS: readonly AxisCheck[] = [\n {\n id: \"writes.action_hook_wired\",\n axis: \"writes\",\n values: ACTIVE_WRITES,\n run: runActionHookWired,\n },\n {\n id: \"writes.action_handler_attached\",\n axis: \"writes\",\n values: ACTIVE_WRITES,\n run: runActionHandlerAttached,\n },\n {\n id: \"writes.submit.disabled_path\",\n axis: \"writes\",\n values: [\"submit\"],\n run: runSubmitDisabledPath,\n },\n];\n","// packages/ui-gen/src/evaluation/axis-checks/checks/state-payload.ts\n//\n// Checks gated on state=payload or writes=submit. Ported from\n// mode-checks/form.ts (submit-hook, submit-handler, state-covers-payload,\n// initial-values-seeded, option-lists-consumed, no-orphan-payload-key).\n\nimport type { EvalIssue } from \"../../types-public.js\";\nimport type { AxisCheck, AxisCheckInput } from \"../types.js\";\nimport {\n collectStateKeys,\n getArrStrProps,\n getInitialValuePropNames,\n getSubmitActions,\n mkIssue,\n} from \"../helpers.js\";\n\nfunction runSubmitHookPresent(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const submits = getSubmitActions(input.contract);\n const issues: EvalIssue[] = [];\n for (const s of submits) {\n const re = new RegExp(`useAction(?:<[^>]*>)?\\\\s*\\\\(\\\\s*['\"\\`]${s.name}['\"\\`]`);\n if (re.test(src)) continue;\n issues.push(\n mkIssue(\n \"writes.submit.hook_present\",\n `Submit action \"${s.name}\" has no useAction('${s.name}') call.`,\n `Add \\`const ${s.name} = useAction<...>('${s.name}');\\` and invoke it from the submit button.`,\n ),\n );\n }\n return issues;\n}\n\nfunction runSubmitHandlerAttached(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const submits = getSubmitActions(input.contract);\n const issues: EvalIssue[] = [];\n for (const s of submits) {\n const declRe = new RegExp(\n `const\\\\s+(\\\\w+)\\\\s*=\\\\s*useAction(?:<[^>]*>)?\\\\s*\\\\(\\\\s*['\"\\`]${s.name}['\"\\`]`,\n );\n const m = src.match(declRe);\n if (!m) continue;\n const constName = m[1];\n const rest = src.replace(m[0], \"\");\n if (new RegExp(`\\\\b${constName}\\\\s*\\\\(`).test(rest)) continue;\n issues.push(\n mkIssue(\n \"writes.submit.handler_attached\",\n `useAction result \"${constName}\" (for submit \"${s.name}\") is declared but never invoked.`,\n `Call ${constName}(payload) from the submit button's onClick handler, after validation.`,\n ),\n );\n }\n return issues;\n}\n\nfunction runStateCoversPayload(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const submits = getSubmitActions(input.contract);\n if (submits.length === 0) return [];\n const stateKeys = collectStateKeys(src);\n const issues: EvalIssue[] = [];\n for (const s of submits) {\n const missing = s.payloadKeys.filter((k) => !stateKeys.has(k));\n if (missing.length === 0) continue;\n issues.push(\n mkIssue(\n \"state.payload.covers_submit\",\n `Submit action \"${s.name}\" expects payload keys [${s.payloadKeys.join(\", \")}] but state does not cover: ${missing.join(\", \")}.`,\n `Add a state slot for each missing key so the final payload can be assembled.`,\n ),\n );\n }\n return issues;\n}\n\nfunction runInitialValuesSeeded(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const initialProps = getInitialValuePropNames(input.contract);\n const issues: EvalIssue[] = [];\n for (const name of initialProps) {\n const re = new RegExp(\n `useState(?:<[^>]*>)?\\\\s*\\\\([\\\\s\\\\S]{0,400}?props\\\\.${name}\\\\b`,\n );\n if (re.test(src)) continue;\n issues.push(\n mkIssue(\n \"state.payload.initial_values_seeded\",\n `Prop \"${name}\" (pre-filled initial values) is never read in a useState initializer.`,\n `Seed form state from props.${name} so edit mode pre-fills.`,\n ),\n );\n }\n return issues;\n}\n\nfunction runOptionListsConsumed(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const arrStrNames = getArrStrProps(input.contract);\n const hasAnyMap = /\\.map\\s*\\(/.test(src);\n const issues: EvalIssue[] = [];\n for (const name of arrStrNames) {\n const referenced = new RegExp(`\\\\bprops\\\\.${name}\\\\b`).test(src);\n if (referenced && hasAnyMap) continue;\n const reason = !referenced\n ? `Option list prop \"${name}\" (arr<str>) is never referenced — users cannot see the options.`\n : `Option list prop \"${name}\" (arr<str>) is referenced but the component has no .map() — options are not rendered as choices.`;\n issues.push(\n mkIssue(\n \"state.payload.option_lists_consumed\",\n reason,\n `Render options with \\`props.${name}.map(option => <RadioOption value={option} ... />)\\`.`,\n ),\n );\n }\n return issues;\n}\n\nfunction runNoOrphanPayloadKey(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const submits = getSubmitActions(input.contract);\n if (submits.length === 0) return [];\n const body = src\n .replace(/interface\\s+Action\\w+[\\s\\S]*?\\n}/g, \"\")\n .replace(/type\\s+Action\\w+[\\s\\S]*?\\n;/g, \"\");\n const issues: EvalIssue[] = [];\n for (const s of submits) {\n const orphans: string[] = [];\n for (const key of s.payloadKeys) {\n const re = new RegExp(`\\\\b${key}\\\\b`);\n if (!re.test(body)) orphans.push(key);\n }\n if (orphans.length === 0) continue;\n issues.push(\n mkIssue(\n \"state.payload.no_orphan_key\",\n `Submit payload keys [${orphans.join(\", \")}] never appear in the component body — missing from the submitted payload.`,\n `Add UI and state for these keys, or remove them from the ActionEntry if not needed.`,\n \"warn\",\n ),\n );\n }\n return issues;\n}\n\nexport const STATE_PAYLOAD_CHECKS: readonly AxisCheck[] = [\n {\n id: \"writes.submit.hook_present\",\n axis: \"writes\",\n values: [\"submit\"],\n run: runSubmitHookPresent,\n },\n {\n id: \"writes.submit.handler_attached\",\n axis: \"writes\",\n values: [\"submit\"],\n run: runSubmitHandlerAttached,\n },\n {\n id: \"state.payload.covers_submit\",\n axis: \"state\",\n values: [\"payload\"],\n run: runStateCoversPayload,\n },\n {\n id: \"state.payload.initial_values_seeded\",\n axis: \"state\",\n values: [\"payload\", \"draft\"],\n run: runInitialValuesSeeded,\n },\n {\n id: \"state.payload.option_lists_consumed\",\n axis: \"state\",\n values: [\"payload\"],\n run: runOptionListsConsumed,\n },\n {\n id: \"state.payload.no_orphan_key\",\n axis: \"state\",\n values: [\"payload\"],\n run: runNoOrphanPayloadKey,\n },\n];\n","// packages/ui-gen/src/evaluation/axis-checks/checks/tooling.ts\n//\n// Checks gated on the tooling axis. Two surfaces:\n//\n// - `tooling.clientCapability.hook_called` — verifies every declared\n// `clientCapabilities.gadgets[name]` has a matching\n// `const <name> = …()` binding in source.\n// - `tooling.clientCapability.start_called` — verifies a bound\n// gadget hook also has a `.start(...)` invocation; without it\n// the capability stays in `idle` and never fires.\n// - `realtime.stream_source.no_direct_call` — the LLM must NOT\n// directly invoke a tool named on `streamSpec[*].source.tool`;\n// subscribe via `useStream(...)` instead.\n// - `universal.no_retired_identifiers` — fires on every contract.\n// The LLM's training data predates the current wire shape and\n// reaches for retired identifiers (component-side tool hooks,\n// dispatch.kind, intendedTool, broadcast field, retired catalog\n// names, retired package imports, retired wire-input fields).\n// The grep gate emits one issue per detected identifier so the\n// LLM rewrites toward the current shape before evaluation\n// completes.\n\nimport type { DataContract, StreamChannelEntry } from \"@ggui-ai/protocol\";\nimport type { EvalIssue } from \"../../types-public.js\";\nimport type { AxisCheck, AxisCheckInput } from \"../types.js\";\nimport { getGadgetNames, getStdlibGadgetNames, mkIssue } from \"../helpers.js\";\n\nconst CLIENT_PRESENT = [\"client\", \"both\"] as const;\nconst ALL_TOOLING_VALUES = [\"none\", \"wired\", \"client\", \"both\"] as const;\nconst REALTIME_ACTIVE = [\n \"merge\",\n \"append\",\n \"status\",\n \"presence\",\n \"mixed\",\n] as const;\n\n// ── clientCapabilities ──────────────────────────────────────────────\n\nfunction runGadgetHookCalled(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const names = getGadgetNames(input.contract);\n const issues: EvalIssue[] = [];\n for (const name of names) {\n // The boilerplate emits `const <name> = <hook>();` — match the const\n // binding to detect omission. We don't pin the hook identifier here\n // because the contract carries it via `entry.hook` and the LLM may\n // legitimately alias on import.\n const re = new RegExp(`const\\\\s+${name}\\\\s*=`);\n if (re.test(src)) continue;\n issues.push(\n mkIssue(\n \"tooling.clientCapability.hook_called\",\n `Contract clientCapability \"${name}\" has no \\`const ${name} = …()\\` hook call.`,\n `Import the declared hook (default package: @ggui-ai/gadgets) and bind its return value to \\`const ${name}\\` at the top of the component; surface \\`.value\\` / \\`.status\\` in JSX.`,\n ),\n );\n }\n return issues;\n}\n\nfunction runClientCapabilityStartCalled(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n // Only the first-party `@ggui-ai/gadgets` browser capabilities have\n // the `idle → prompting → active` lifecycle that `.start()` drives.\n // Registered third-party gadget hooks (e.g. `useBoardState`) are\n // plain data hooks the runtime resolves on its own — exclude them.\n const names = getStdlibGadgetNames(input.contract);\n const issues: EvalIssue[] = [];\n for (const name of names) {\n // Skip when the binding doesn't exist — the `hook_called` check\n // covers that case; we don't double-issue.\n const bindingRe = new RegExp(`const\\\\s+${name}\\\\s*=`);\n if (!bindingRe.test(src)) continue;\n\n // The capability lifecycle requires `.start()` invocation to\n // transition from `idle` → `prompting`. Without it the hook's\n // `.value` / `.status` stay frozen at the initial state and the\n // UI feature never fires. Match `<name>.start(`, allowing chained\n // member access or method aliasing.\n const startRe = new RegExp(`\\\\b${name}\\\\s*\\\\.\\\\s*start\\\\s*\\\\(`);\n if (startRe.test(src)) continue;\n issues.push(\n mkIssue(\n \"tooling.clientCapability.start_called\",\n `clientCapability \"${name}\" is bound but \\`${name}.start(…)\\` is never invoked — the capability stays in 'idle' and the feature won't fire.`,\n `Wire \\`${name}.start({...})\\` to a UI control (Button onClick, effect, etc.). Read \\`.status\\` to gate the UI between 'idle' / 'prompting' / 'active' / 'completed' / 'denied' / 'error'.`,\n ),\n );\n }\n return issues;\n}\n\n// ── streamSpec sources ──────────────────────────────────────────────\n\nfunction collectStreamSourceTools(\n contract: DataContract | undefined,\n): Map<string, string> {\n // Map<channelName, sourceToolName> for every channel that declares\n // a source. Excludes channels without `source` (agent-written).\n const result = new Map<string, string>();\n const streamSpec = contract?.streamSpec;\n if (!streamSpec || typeof streamSpec !== \"object\") return result;\n for (const [channelName, entryRaw] of Object.entries(streamSpec)) {\n const entry = entryRaw as StreamChannelEntry | undefined;\n if (!entry || typeof entry !== \"object\") continue;\n const tool = entry.source?.tool;\n if (typeof tool !== \"string\" || tool.length === 0) continue;\n result.set(channelName, tool);\n }\n return result;\n}\n\nfunction runStreamSourceNoDirectCall(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const map = collectStreamSourceTools(input.contract);\n if (map.size === 0) return [];\n\n const issues: EvalIssue[] = [];\n for (const [channelName, toolName] of map) {\n // Detect a direct call to the source tool. Matches identifier\n // followed by `(` — covers `foo()`, `foo(args)`, `foo.bar()`\n // (the dotted form indirectly catches `someObject.foo()` which\n // the contract doesn't expect to see, since the source tool is\n // an agent-side MCP tool, not a local function).\n const callRe = new RegExp(`\\\\b${toolName}\\\\s*\\\\(`);\n if (!callRe.test(src)) continue;\n\n // Don't false-fire when `toolName` happens to be the channel name\n // bound to useStream (e.g., `const messages = useStream(...)` then\n // `messages(...)` would be weird but we're matching the TOOL name,\n // not the binding). If toolName === channelName then the\n // `<channel>(` call would be the useStream binding being called\n // as a function — which is itself wrong, so still emit.\n issues.push(\n mkIssue(\n \"realtime.stream_source.no_direct_call\",\n `Source code calls \\`${toolName}(...)\\` directly but the contract declares it as the source tool for streamSpec.${channelName}. Source tools are agent-side / runtime-polled; the component MUST NOT invoke them.`,\n `Subscribe to the channel via \\`const ${channelName} = useStream('${channelName}');\\` and read \\`${channelName}.latest\\` / \\`${channelName}.all\\` — the runtime polls or subscribes to '${toolName}' on the component's behalf.`,\n ),\n );\n }\n return issues;\n}\n\n// ── Anti-pattern grep — retired identifiers a model may emit from\n// stale training data ──\n\ninterface RetiredIdentifier {\n /** Regex matching the retired surface in source. */\n readonly pattern: RegExp;\n /** Stable subcategory used for the EvalIssue. */\n readonly id: string;\n /** Human-readable description for the issue message. */\n readonly label: string;\n /** Replacement guidance for the fix message. */\n readonly replacement: string;\n}\n\nconst RETIRED_IDENTIFIERS: readonly RetiredIdentifier[] = [\n {\n pattern: /\\buseWiredTool\\b/,\n id: \"useWiredTool\",\n label: \"`useWiredTool(...)` hook\",\n replacement:\n \"Use `useAction(name)` for user gestures the agent should react to. `agentCapabilities.tools` entries are agent-side catalog declarations — the component never calls them directly.\",\n },\n {\n pattern: /\\buseAgentTool\\b/,\n id: \"useAgentTool\",\n label: \"`useAgentTool(...)` hook\",\n replacement:\n \"Agent-side tools are NEVER imported as component hooks. The contract declares them under `agentCapabilities.tools` for cross-ref (actionSpec.nextStep / streamSpec.source.tool); the component reacts via `useAction` / `useStream`.\",\n },\n {\n pattern: /\\bcallWiredTool\\b/,\n id: \"callWiredTool\",\n label: \"`callWiredTool(...)` call\",\n replacement:\n \"Component-side direct invocation of agent-side tools is retired. Fire a UI gesture via `useAction(name)`; the agent reacts on its next turn (`nextStep` hint optional).\",\n },\n {\n pattern: /\\buseClientTool\\b/,\n id: \"useClientTool\",\n label: \"`useClientTool(name, handler)` hook\",\n replacement:\n \"Use a gadget hook from `@ggui-ai/gadgets` (e.g., `useGeolocation`, `useClipboardWrite`) and thread the result into a contextSpec slot or actionSpec payload.\",\n },\n {\n pattern: /\\bdispatch\\s*:\\s*\\{\\s*kind\\s*:/,\n id: \"dispatch.kind\",\n label: \"`dispatch: { kind: '...' }` discriminated union\",\n replacement:\n \"ActionEntry.dispatch is retired. Use the flat `nextStep?: '<tool>'` field on the action entry instead.\",\n },\n {\n pattern: /\\bintendedTool\\b/,\n id: \"intendedTool\",\n label: \"`intendedTool` field\",\n replacement:\n \"Use the flat `nextStep` field — the hint surface is one optional advisory string, not a nested discriminator.\",\n },\n {\n pattern: /\\bmode\\s*:\\s*['\"`]host-routed['\"`]/,\n id: \"mode.host-routed\",\n label: \"`mode: 'host-routed'`\",\n replacement:\n \"The `mode` field on action entries is retired. All actions are agent-routed; use `nextStep` for the optional tool hint.\",\n },\n {\n pattern: /\\bbroadcast\\s*:\\s*\\{/,\n id: \"broadcast\",\n label: \"`broadcast: { … }` contract field\",\n replacement:\n \"Move the channel source declaration to `streamSpec[channel].source = { tool, args? }`.\",\n },\n {\n // Match `agentTools` only as a contract-shaped object key or\n // property access — not as a local variable name in unrelated\n // code. `\\bagentTools\\s*[:.]` catches `{ agentTools: {...} }` /\n // `contract.agentTools` while ignoring `const agentTools = ...`.\n pattern: /\\bagentTools\\s*[:.]/,\n id: \"contract.agentTools\",\n label: \"`agentTools` top-level contract field\",\n replacement:\n \"The top-level `agentTools` field is retired. Declare agent-side tools under `agentCapabilities.tools` (catalog nested under a capabilities parent for symmetry with `clientCapabilities`).\",\n },\n {\n pattern: /\\bclientCapabilities\\s*\\.\\s*capabilities\\b/,\n id: \"clientCapabilities.capabilities\",\n label: \"`clientCapabilities.capabilities` inner key\",\n replacement:\n \"The inner `capabilities` key is retired. Use `clientCapabilities.gadgets` — entries are library-hook declarations, not RPC capabilities.\",\n },\n {\n pattern: /['\"`]@ggui-ai\\/client-tools['\"`]/,\n id: \"package.@ggui-ai/client-tools\",\n label: \"`@ggui-ai/client-tools` package import\",\n replacement:\n \"The package was renamed to `@ggui-ai/gadgets`. Update the import string.\",\n },\n {\n pattern: /\\bPushStory\\b/,\n id: \"PushStory\",\n label: \"`PushStory` type / `pushStorySchema` schema\",\n replacement:\n \"`PushStory` was retired when the handshake input was flattened. The current wire is `ggui_handshake({intent, blueprintDraft: {contract, variance?, generator?}})` + `ggui_render({handshakeId, props, override?: {contract?, variance?}})` (omit `override` to accept the proposal as-is).\",\n },\n {\n pattern: /\\bpushStorySchema\\b/,\n id: \"pushStorySchema\",\n label: \"`pushStorySchema` zod schema\",\n replacement:\n \"`pushStorySchema` was retired alongside `PushStory`. Current schemas: `handshakeInputSchema` + `renderInputSchema` (with the optional `override` re-aim) in `@ggui-ai/protocol`.\",\n },\n {\n pattern: /\\bstory\\s*\\.\\s*adapters\\b/,\n id: \"story.adapters\",\n label: \"`story.adapters` field access\",\n replacement:\n \"The story.adapters gate was retired alongside `PushStory`. Per-app permission gates flow through `clientCapabilities.gadgets[*].permission` (Permissions-Policy derivation).\",\n },\n {\n pattern: /\\bdeclaredAdapters\\b/,\n id: \"declaredAdapters\",\n label: \"`declaredAdapters` field / runtime gate\",\n replacement:\n \"App-level `declaredAdapters` was retired. Per-app permission gates derive from `clientCapabilities.gadgets[*].permission` instead.\",\n },\n {\n pattern: /\\bassertAdaptersDeclared\\b/,\n id: \"assertAdaptersDeclared\",\n label: \"`assertAdaptersDeclared(...)` runtime call\",\n replacement:\n \"The runtime adapter-gate function is retired. Permissions-Policy is derived per-contract at render commit time and threaded through the bootstrap projection.\",\n },\n {\n pattern: /\\bHandshakeStoredStory\\b/,\n id: \"HandshakeStoredStory\",\n label: \"`HandshakeStoredStory` storage type\",\n replacement:\n \"The OSS handler's stored type is now `HandshakeStoredInput` with the MVB-5 `{intent, blueprintDraft, forceCreate?}` shape.\",\n },\n {\n pattern: /\\brecord\\s*\\.\\s*story\\b/,\n id: \"record.story\",\n label: \"`record.story.*` access on handshake storage\",\n replacement:\n \"Handshake storage was flattened. Read `record.input.*` (intent / blueprintDraft) — the nested `story` wrapper is gone. MVB-5 also adds `record.suggestion` + `record.effectiveContract`.\",\n },\n];\n\nfunction runNoRetiredIdentifiers(input: AxisCheckInput): EvalIssue[] {\n // Source-only scan; compiled code irrelevant for identifier detection.\n // Run even without compiled code so we surface early in the loop.\n const src = input.sourceCode;\n const issues: EvalIssue[] = [];\n for (const rule of RETIRED_IDENTIFIERS) {\n if (!rule.pattern.test(src)) continue;\n issues.push(\n mkIssue(\n `universal.no_retired_identifiers.${rule.id}`,\n `Source contains ${rule.label} — retired from the contract surface.`,\n rule.replacement,\n ),\n );\n }\n return issues;\n}\n\nexport const TOOLING_CHECKS: readonly AxisCheck[] = [\n {\n id: \"tooling.clientCapability.hook_called\",\n axis: \"tooling\",\n values: CLIENT_PRESENT,\n run: runGadgetHookCalled,\n },\n {\n id: \"tooling.clientCapability.start_called\",\n axis: \"tooling\",\n values: CLIENT_PRESENT,\n run: runClientCapabilityStartCalled,\n },\n {\n // Stream-source direct-call check. Gated on realtime axis (rather\n // than tooling) since stream sources are a realtime concern — but\n // logically lives in tooling.ts alongside the other tool-reference\n // checks since the issue class is about referenced agentTools.\n id: \"realtime.stream_source.no_direct_call\",\n axis: \"realtime\",\n values: REALTIME_ACTIVE,\n run: runStreamSourceNoDirectCall,\n },\n {\n // Universal — fires on every tooling-axis value. The check itself\n // is contract-agnostic; the axis gate is \"every contract\" via the\n // full ALL_TOOLING_VALUES list (rather than the universal-check\n // module's \"render\" gate convention) so the anti-pattern stays\n // co-located with the other tooling-related rules.\n id: \"universal.no_retired_identifiers\",\n axis: \"tooling\",\n values: ALL_TOOLING_VALUES,\n run: runNoRetiredIdentifiers,\n },\n];\n","// packages/ui-gen/src/evaluation/axis-checks/extras.ts\n//\n// Axis-specific checks that had no legacy home. These fire on axis values\n// the old 3-mode dispatch didn't route (drag, swipe, compose, multi-step,\n// mixed streams). Intentionally narrow — each catches a specific failure\n// mode the fragments' prompt text tells the LLM to avoid.\n\nimport type { AxisCheck, AxisCheckInput } from \"./types.js\";\nimport type { EvalIssue } from \"../types-public.js\";\n\nfunction mkIssue(\n subcategory: string,\n description: string,\n fix: string,\n result: \"fail\" | \"warn\" = \"warn\",\n): EvalIssue {\n return { tier: 0, result, category: \"mode\", subcategory, description, fix };\n}\n\n/**\n * writeTrigger=drag → must attach onDragStart + onDrop (or onDragOver)\n * somewhere. Otherwise the drag handler is decorative.\n */\nconst dragTriggerWired: AxisCheck = {\n id: \"writeTrigger.drag.handlers_wired\",\n axis: \"writeTrigger\",\n values: [\"drag\"],\n run(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const hasStart = /onDragStart\\s*=/.test(src);\n const hasDrop = /onDrop\\s*=/.test(src);\n if (hasStart && hasDrop) return [];\n return [\n mkIssue(\n \"writeTrigger.drag.handlers_wired\",\n `Classified as writeTrigger=drag but component lacks ${!hasStart ? \"onDragStart\" : \"\"}${!hasStart && !hasDrop ? \" + \" : \"\"}${!hasDrop ? \"onDrop\" : \"\"} handlers.`,\n \"Attach onDragStart to draggable items and onDrop (with onDragOver preventDefault) to drop zones.\",\n \"fail\",\n ),\n ];\n },\n};\n\n/**\n * writeTrigger=swipe → must wire onTouchStart + onTouchEnd. Also emit\n * a warn if no fallback click handlers exist (desktop users).\n */\nconst swipeTriggerWired: AxisCheck = {\n id: \"writeTrigger.swipe.handlers_wired\",\n axis: \"writeTrigger\",\n values: [\"swipe\"],\n run(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const hasTouch = /onTouchStart\\s*=/.test(src) && /onTouchEnd\\s*=/.test(src);\n if (!hasTouch) {\n return [\n mkIssue(\n \"writeTrigger.swipe.handlers_wired\",\n \"Classified as writeTrigger=swipe but component lacks onTouchStart + onTouchEnd handlers.\",\n \"Wire onTouchStart to record the start X/Y, onTouchEnd to classify direction and fire the action.\",\n \"fail\",\n ),\n ];\n }\n return [];\n },\n};\n\n/**\n * writes=compose → exactly one action should be called with ids sourced\n * from two different state slots. Heuristic: at least two useState or\n * props.id references should appear in the action invocation's argument\n * region.\n *\n * Light check: warn if only one id-bearing field appears near the useAction\n * invocation (hard to get false-positive free without AST).\n */\nconst composeCrossEntity: AxisCheck = {\n id: \"writes.compose.cross_entity_ids\",\n axis: \"writes\",\n values: [\"compose\"],\n run(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n // Look for an action invocation passing an object literal with >= 2\n // `*Id` or `id` keys. That's the compose signature.\n const re = /\\{\\s*[^}]*?\\b(\\w*Id|id)\\b[^}]*?,\\s*[^}]*?\\b(\\w*Id|id)\\b[^}]*?\\}/s;\n if (re.test(src)) return [];\n return [\n mkIssue(\n \"writes.compose.cross_entity_ids\",\n \"Classified as writes=compose but no action invocation passes two id-bearing keys together.\",\n \"The compose action must receive both entity ids in one payload, e.g. `schedule({ eventId, calendarId })`.\",\n \"warn\",\n ),\n ];\n },\n};\n\n/**\n * layout=multi-step → integer step state + a step-guard on Next. Re-uses\n * the form check's multi-step signal, but fires even when writes != submit\n * (e.g., multi-step wizards that never submit, like onboarding).\n */\nconst multiStepHasState: AxisCheck = {\n id: \"layout.multi_step.state_present\",\n axis: \"layout\",\n values: [\"multi-step\"],\n run(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n const hasIntStep = /useState(?:<number>)?\\s*\\(\\s*[0-9]+\\s*\\)/.test(src);\n if (hasIntStep) return [];\n return [\n mkIssue(\n \"layout.multi_step.state_present\",\n \"Classified as layout=multi-step but no integer-typed useState tracks the current step.\",\n \"Add `const [step, setStep] = useState(0);` and branch rendering on it.\",\n \"fail\",\n ),\n ];\n },\n};\n\n/**\n * layout=multi-step → the design system's Stepper composite must be\n * ADOPTED (rendered). D8 (Exp 47) measured adoption at 17/18 from\n * fragment + JSDoc alone; this check gives the CHECK leg ownership of\n * the mandate so a regression surfaces as a fix turn instead of\n * silently shipping a wizard with no step affordance.\n *\n * Replaces the always-on `stepper-display-only` pitfall (deleted in the\n * same slice): with adoption carried by the WHAT leg, a 6th always-on\n * prompt rule was pure attention-dilution cost (the exp66 count-\n * sensitivity class, ~+9s blended), while this check prices at zero\n * outside multi-step cells. The pitfall's display-only guidance lives\n * on in the fix string below — delivered only when a cell actually\n * needs it.\n */\nconst stepperAdopted: AxisCheck = {\n id: \"layout.multi_step.stepper_adopted\",\n axis: \"layout\",\n values: [\"multi-step\"],\n run(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n if (/<Stepper[\\s/>]/.test(input.sourceCode)) return [];\n return [\n mkIssue(\n \"layout.multi_step.stepper_adopted\",\n \"Classified as layout=multi-step but the design system's Stepper composite is never rendered.\",\n \"Render <Stepper steps={STEPS} current={step} /> above the step body — STEPS is a top-level const array of step labels and `step` is your own useState index. Stepper is display-only: it never stores or advances the step itself.\",\n \"fail\",\n ),\n ];\n },\n};\n\n/**\n * realtime=mixed → the contract declares multiple events of different\n * kinds. Each must have its own useStream call. We approximate by\n * requiring ≥ 2 useStream calls when the vector is mixed.\n */\nconst mixedStreamsHaveHandlers: AxisCheck = {\n id: \"realtime.mixed.handlers_per_event\",\n axis: \"realtime\",\n values: [\"mixed\"],\n run(input: AxisCheckInput): EvalIssue[] {\n if (input.compiledCode === null) return [];\n const src = input.sourceCode;\n // Accept both `useStream('x')` and `useStream<T>('x')` (generic type arg).\n // The boilerplate pre-emits typed calls, so the `(` -only regex was a\n // 100%-false-positive on chat-interface + stock-ticker (Experiment 34).\n const matches = src.match(/useStream\\s*(?:<[^>]*>)?\\s*\\(/g);\n const count = matches?.length ?? 0;\n if (count >= 2) return [];\n return [\n mkIssue(\n \"realtime.mixed.handlers_per_event\",\n `Classified as realtime=mixed but only ${count} useStream call(s) found — mixed streams need one handler per event.`,\n \"Add a separate `useStream('eventName')` for each event in the contract.\",\n \"fail\",\n ),\n ];\n },\n};\n\nexport const EXTRA_CHECKS: readonly AxisCheck[] = [\n dragTriggerWired,\n swipeTriggerWired,\n composeCrossEntity,\n multiStepHasState,\n stepperAdopted,\n mixedStreamsHaveHandlers,\n];\n","// packages/ui-gen/src/evaluation/axis-checks/registry.ts\n//\n// Flat list of all axis-gated checks. The dispatcher iterates this and\n// runs every entry whose gate matches the classification's axis vector.\n\nimport type { AxisCheck } from \"./types.js\";\nimport { UNIVERSAL_CHECKS } from \"./checks/universal.js\";\nimport { STATE_MERGE_CHECKS } from \"./checks/state-merge.js\";\nimport { REALTIME_CHECKS } from \"./checks/realtime.js\";\nimport { WRITES_CHECKS } from \"./checks/writes.js\";\nimport { STATE_PAYLOAD_CHECKS } from \"./checks/state-payload.js\";\nimport { TOOLING_CHECKS } from \"./checks/tooling.js\";\nimport { EXTRA_CHECKS } from \"./extras.js\";\n\nexport const REGISTRY: readonly AxisCheck[] = [\n ...UNIVERSAL_CHECKS,\n ...STATE_MERGE_CHECKS,\n ...REALTIME_CHECKS,\n ...WRITES_CHECKS,\n ...STATE_PAYLOAD_CHECKS,\n ...TOOLING_CHECKS,\n ...EXTRA_CHECKS,\n];\n"]}
|