@ggui-ai/ui-gen 0.19.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/adapters/base.d.ts +7 -0
  2. package/dist/adapters/base.js +1 -0
  3. package/dist/adapters/base.js.map +1 -1
  4. package/dist/adapters/generation-dispatch.d.ts +17 -3
  5. package/dist/adapters/generation-dispatch.js +992 -3468
  6. package/dist/adapters/generation-dispatch.js.map +1 -1
  7. package/dist/adapters/index.js +70 -13
  8. package/dist/adapters/index.js.map +1 -1
  9. package/dist/adapters/types.d.ts +1 -1
  10. package/dist/adapters/types.js.map +1 -1
  11. package/dist/advanced/index.d.ts +4 -4
  12. package/dist/advanced/index.js +1060 -3520
  13. package/dist/advanced/index.js.map +1 -1
  14. package/dist/blueprint-validator.js +13 -3
  15. package/dist/blueprint-validator.js.map +1 -1
  16. package/dist/boilerplate.js +2 -2
  17. package/dist/boilerplate.js.map +1 -1
  18. package/dist/check/index.d.ts +1 -1
  19. package/dist/check/index.js.map +1 -1
  20. package/dist/{create-ui-generator-CxPvudbs.d.ts → create-ui-generator-D7kOXNjJ.d.ts} +2 -2
  21. package/dist/{dispatch-N8wdNOX-.d.ts → dispatch-DGvhmARp.d.ts} +1 -1
  22. package/dist/evaluation/axis-checks/index.d.ts +3 -3
  23. package/dist/evaluation/axis-checks/index.js +46 -0
  24. package/dist/evaluation/axis-checks/index.js.map +1 -1
  25. package/dist/evaluation/axis-checks/registry.d.ts +1 -1
  26. package/dist/evaluation/axis-checks/registry.js +46 -0
  27. package/dist/evaluation/axis-checks/registry.js.map +1 -1
  28. package/dist/evaluation/index.d.ts +38 -6
  29. package/dist/evaluation/index.js +682 -3357
  30. package/dist/evaluation/index.js.map +1 -1
  31. package/dist/harness/check/runtime-render/index.d.ts +2 -2
  32. package/dist/harness/check/runtime-render/index.js +13 -3
  33. package/dist/harness/check/runtime-render/index.js.map +1 -1
  34. package/dist/harness/check/runtime-render/render-check-worker.js +8 -3
  35. package/dist/harness/check/runtime-render/render-check-worker.js.map +1 -1
  36. package/dist/harness/index.d.ts +2 -2
  37. package/dist/harness/index.js +562 -30
  38. package/dist/harness/index.js.map +1 -1
  39. package/dist/harness/llm-trace-sink.d.ts +7 -1
  40. package/dist/harness/llm-trace-sink.js.map +1 -1
  41. package/dist/harness/result-types.d.ts +1 -1
  42. package/dist/harness/runtime.d.ts +11 -2
  43. package/dist/harness/runtime.js +3 -3
  44. package/dist/harness/runtime.js.map +1 -1
  45. package/dist/harness/types-public.d.ts +1 -1
  46. package/dist/harness/types-public.js +2 -2
  47. package/dist/harness/types-public.js.map +1 -1
  48. package/dist/harness/validator-trace-sink.d.ts +1 -1
  49. package/dist/index.d.ts +3 -3
  50. package/dist/index.js +1060 -3520
  51. package/dist/index.js.map +1 -1
  52. package/dist/{llm-router-D7fjBhtr.d.ts → llm-router-DwwUK1bz.d.ts} +16 -3
  53. package/dist/patch.d.ts +1 -1
  54. package/dist/providers/index.js +5 -4
  55. package/dist/providers/index.js.map +1 -1
  56. package/dist/{render-check-WfOVO9kU.d.ts → render-check-C0CqVceF.d.ts} +17 -0
  57. package/dist/{types-public-DKR_h70H.d.ts → types-public-CzYqZclY.d.ts} +44 -1
  58. package/dist/validation/index.d.ts +1 -1
  59. package/dist/validation/index.js +1 -1
  60. package/dist/validation/index.js.map +1 -1
  61. package/dist/workflows.d.ts +1 -1
  62. package/package.json +16 -12
  63. package/src/adapters/base.ts +8 -0
  64. package/src/adapters/claude/claude-code-login.ts +73 -0
  65. package/src/adapters/claude/sdk.ts +8 -1
  66. package/src/adapters/generation-dispatch.ts +19 -2
  67. package/src/adapters/openai/raw.ts +11 -5
  68. package/src/adapters/openai/sdk.ts +8 -5
  69. package/src/adapters/openai/tokens.ts +67 -0
  70. package/src/adapters/provider-router.ts +28 -0
  71. package/src/adapters/types.ts +1 -1
  72. package/src/boilerplate/generate.ts +19 -4
  73. package/src/boilerplate/hard-sections.ts +1 -1
  74. package/src/create-ui-generator.ts +19 -10
  75. package/src/evaluation/axis-checks/checks/universal.ts +92 -0
  76. package/src/evaluation/design-identity.ts +16 -5
  77. package/src/evaluation/types-public.ts +42 -0
  78. package/src/evaluation/visual-evaluator.ts +231 -24
  79. package/src/harness/check/runtime-render/adapter.ts +9 -0
  80. package/src/harness/check/runtime-render/render-check.ts +37 -1
  81. package/src/harness/claude-code-login-query.ts +528 -0
  82. package/src/harness/coding/assemble-result.ts +10 -1
  83. package/src/harness/coding/run-eval-round.ts +179 -34
  84. package/src/harness/enforced-coding.ts +20 -0
  85. package/src/harness/llm-router.ts +390 -55
  86. package/src/harness/llm-trace-sink.ts +7 -1
  87. package/src/harness/runtime.ts +6 -0
  88. package/src/providers/openai.ts +31 -19
  89. package/src/validation/primitives.ts +1 -1
@@ -34,7 +34,13 @@ import '@ggui-ai/protocol';
34
34
  */
35
35
 
36
36
  /** Provider tag that produced the call. Mirrors {@link AgentConfig.provider}. */
37
- type LlmTraceProvider = 'anthropic' | 'openai' | 'google' | 'openrouter';
37
+ /**
38
+ * `claude-code-login` is the Anthropic model reached through the machine's
39
+ * own Claude Code login (ggui#1185) rather than a key — a trace reader can
40
+ * tell the two apart, which the routing vocabulary (`provider: 'anthropic'`)
41
+ * deliberately does not.
42
+ */
43
+ type LlmTraceProvider = 'anthropic' | 'claude-code-login' | 'openai' | 'google' | 'openrouter';
38
44
  /** Which `LLMAgent` method initiated the call. */
39
45
  type LlmTraceKind = 'callText' | 'callTools' | 'callWithTools' | 'callStructured' | 'callVision';
40
46
  /**
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/harness/llm-trace-sink.ts"],"names":[],"mappings":";AAwGA,IAAI,UAAA,GAAkC,IAAA;AAM/B,SAAS,gBAAgB,IAAA,EAAiC;AAC/D,EAAA,UAAA,GAAa,IAAA;AACf;AAGO,SAAS,eAAA,GAAuC;AACrD,EAAA,OAAO,UAAA;AACT;AAOO,SAAS,kBAAkB,KAAA,EAA4B;AAC5D,EAAA,MAAM,IAAA,GAAO,UAAA;AACb,EAAA,IAAI,CAAC,IAAA,EAAM;AACX,EAAA,IAAI;AACF,IAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,EACjB,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAGO,SAAS,eACd,KAAA,EACwE;AACxE,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,WAAA,EAAa,CAAA,CAAE,WAAA,EAAY,CAAE,CAAA;AACxE;AAMO,SAAS,aAAA,GAAwB;AACtC,EAAA,OACE,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAA,GACtB,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAE1C","file":"llm-trace-sink.js","sourcesContent":["/**\n * Live LLM trace sink — devtools introspection of every LLM call the\n * generation harness makes.\n *\n * **Distinct from {@link TelemetrySink} and {@link AuditSink}.**\n * - **Telemetry** (mcp-server-core) = ops signals (`pair.completed`,\n * `render.duration_ms`). Sink may be lossy and drops on backpressure.\n * Attributes are flat scalars (`string | number | boolean`).\n * - **Audit** (mcp-server-core) = compliance log of privileged\n * mutations. Durable, async, may throw.\n * - **LLM trace** (this) = devtools-only, hostable in-memory ring\n * buffer of every LLM call's full payload (system prompt, user\n * prompt, tool defs, completion, token counts, cache hits, error).\n * Lossy by default. A hosted closed runtime may swap in a durable\n * sink for internal debugging; OSS ships an in-memory sink the\n * `/devtools/llm-trace` page reads.\n *\n * **Why module-level registry instead of constructor injection.** The\n * harness constructs LLM agents on every generation via\n * {@link createAgent}. Threading a sink through every call site\n * (createAgent → run-coding-turn → llm-evaluator → file-agent → …)\n * touches ~5 packages for a devtools-only surface. The OSS ggui server\n * is a single process per CLI invocation — global state has no\n * confusion-cost there. A hosted deployment isolates per request via a\n * process pool, so a global per-pool is also safe. If we ever serve\n * several apps inside one process we'll thread it then.\n *\n * **Default = no sink.** When unset, the router emits nothing and\n * spends no CPU formatting events. Passing `null` removes a previously\n * registered sink.\n */\nimport type { LLMToolDef } from '../llm.js';\n\n/** Provider tag that produced the call. Mirrors {@link AgentConfig.provider}. */\nexport type LlmTraceProvider = 'anthropic' | 'openai' | 'google' | 'openrouter';\n\n/** Which `LLMAgent` method initiated the call. */\nexport type LlmTraceKind =\n | 'callText'\n | 'callTools'\n | 'callWithTools'\n | 'callStructured'\n | 'callVision';\n\n/**\n * One LLM call. Emitted **after** the call completes (success or error)\n * — single event, not start/end split. Devtools UI is timeline-friendly\n * because each event carries `at` (start) + `endedAt` (end).\n */\nexport interface LlmTraceEvent {\n /** Random per-event ID. */\n readonly id: string;\n /** Epoch ms when the call was issued. */\n readonly at: number;\n /** Epoch ms when the call completed (success or error). */\n readonly endedAt: number;\n /** `endedAt - at` — convenience. */\n readonly durationMs: number;\n readonly provider: LlmTraceProvider;\n readonly model: string;\n readonly kind: LlmTraceKind;\n readonly systemPrompt?: string;\n readonly userPrompt?: string;\n /**\n * Tool defs sent on the call (if any). Stripped to `name + description`\n * — full JSON schema would balloon the trace and is rarely useful in\n * the operator UI.\n */\n readonly tools?: ReadonlyArray<{\n readonly name: string;\n readonly description: string;\n }>;\n /** Set on successful completion. */\n readonly result?: {\n readonly inputTokens: number;\n readonly outputTokens: number;\n /** Anthropic only. Bytes counted toward the cache write. */\n readonly cacheCreated?: number;\n /** Anthropic only. Bytes served from cache (90% discounted). */\n readonly cacheRead?: number;\n /** Set when the call returned text content. */\n readonly text?: string;\n /** Set when the call returned tool_use blocks. */\n readonly toolCalls?: ReadonlyArray<{\n readonly name: string;\n readonly input: unknown;\n }>;\n /** Set for `callWithTools` — number of agentic turns consumed. */\n readonly turnsUsed?: number;\n };\n /** Set on failure. `result` is undefined. */\n readonly error?: { readonly message: string };\n}\n\n/**\n * Sink that receives one event per LLM call. Implementations MUST be\n * sync + non-throwing — the harness fires events on the hot path and\n * cannot tolerate backpressure or rejected promises. Buffer + drop or\n * fan out to a queue inside the implementation.\n */\nexport interface LlmTraceSink {\n emit(event: LlmTraceEvent): void;\n}\n\nlet activeSink: LlmTraceSink | null = null;\n\n/**\n * Register the active sink. Pass `null` to remove. Subsequent\n * {@link emitLlmTraceEvent} calls dispatch to this sink.\n */\nexport function setLlmTraceSink(sink: LlmTraceSink | null): void {\n activeSink = sink;\n}\n\n/** Read the active sink. Mostly for tests. */\nexport function getLlmTraceSink(): LlmTraceSink | null {\n return activeSink;\n}\n\n/**\n * Internal — used by `LLMAgent` adapters. No-op when no sink is\n * registered. Swallows sink-thrown errors (a broken devtools sink must\n * not break generation).\n */\nexport function emitLlmTraceEvent(event: LlmTraceEvent): void {\n const sink = activeSink;\n if (!sink) return;\n try {\n sink.emit(event);\n } catch {\n // Devtools sink is allowed to be buggy — generation must not die.\n }\n}\n\n/** Strip `LLMToolDef[]` to the trace-friendly subset. */\nexport function summarizeTools(\n tools: ReadonlyArray<LLMToolDef>,\n): ReadonlyArray<{ readonly name: string; readonly description: string }> {\n return tools.map((t) => ({ name: t.name, description: t.description }));\n}\n\n/**\n * Crockford-style random ID. Crypto.randomUUID() would do, but we want\n * to keep this dep-free for non-Node runtimes the harness might run in.\n */\nexport function newLlmTraceId(): string {\n return (\n Date.now().toString(36) +\n Math.random().toString(36).slice(2, 10)\n );\n}\n"]}
1
+ {"version":3,"sources":["../../src/harness/llm-trace-sink.ts"],"names":[],"mappings":";AA8GA,IAAI,UAAA,GAAkC,IAAA;AAM/B,SAAS,gBAAgB,IAAA,EAAiC;AAC/D,EAAA,UAAA,GAAa,IAAA;AACf;AAGO,SAAS,eAAA,GAAuC;AACrD,EAAA,OAAO,UAAA;AACT;AAOO,SAAS,kBAAkB,KAAA,EAA4B;AAC5D,EAAA,MAAM,IAAA,GAAO,UAAA;AACb,EAAA,IAAI,CAAC,IAAA,EAAM;AACX,EAAA,IAAI;AACF,IAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,EACjB,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAGO,SAAS,eACd,KAAA,EACwE;AACxE,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,WAAA,EAAa,CAAA,CAAE,WAAA,EAAY,CAAE,CAAA;AACxE;AAMO,SAAS,aAAA,GAAwB;AACtC,EAAA,OACE,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAA,GACtB,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAE1C","file":"llm-trace-sink.js","sourcesContent":["/**\n * Live LLM trace sink — devtools introspection of every LLM call the\n * generation harness makes.\n *\n * **Distinct from {@link TelemetrySink} and {@link AuditSink}.**\n * - **Telemetry** (mcp-server-core) = ops signals (`pair.completed`,\n * `render.duration_ms`). Sink may be lossy and drops on backpressure.\n * Attributes are flat scalars (`string | number | boolean`).\n * - **Audit** (mcp-server-core) = compliance log of privileged\n * mutations. Durable, async, may throw.\n * - **LLM trace** (this) = devtools-only, hostable in-memory ring\n * buffer of every LLM call's full payload (system prompt, user\n * prompt, tool defs, completion, token counts, cache hits, error).\n * Lossy by default. A hosted closed runtime may swap in a durable\n * sink for internal debugging; OSS ships an in-memory sink the\n * `/devtools/llm-trace` page reads.\n *\n * **Why module-level registry instead of constructor injection.** The\n * harness constructs LLM agents on every generation via\n * {@link createAgent}. Threading a sink through every call site\n * (createAgent → run-coding-turn → llm-evaluator → file-agent → …)\n * touches ~5 packages for a devtools-only surface. The OSS ggui server\n * is a single process per CLI invocation — global state has no\n * confusion-cost there. A hosted deployment isolates per request via a\n * process pool, so a global per-pool is also safe. If we ever serve\n * several apps inside one process we'll thread it then.\n *\n * **Default = no sink.** When unset, the router emits nothing and\n * spends no CPU formatting events. Passing `null` removes a previously\n * registered sink.\n */\nimport type { LLMToolDef } from '../llm.js';\n\n/** Provider tag that produced the call. Mirrors {@link AgentConfig.provider}. */\n/**\n * `claude-code-login` is the Anthropic model reached through the machine's\n * own Claude Code login (ggui#1185) rather than a key — a trace reader can\n * tell the two apart, which the routing vocabulary (`provider: 'anthropic'`)\n * deliberately does not.\n */\nexport type LlmTraceProvider = 'anthropic' | 'claude-code-login' | 'openai' | 'google' | 'openrouter';\n\n/** Which `LLMAgent` method initiated the call. */\nexport type LlmTraceKind =\n | 'callText'\n | 'callTools'\n | 'callWithTools'\n | 'callStructured'\n | 'callVision';\n\n/**\n * One LLM call. Emitted **after** the call completes (success or error)\n * — single event, not start/end split. Devtools UI is timeline-friendly\n * because each event carries `at` (start) + `endedAt` (end).\n */\nexport interface LlmTraceEvent {\n /** Random per-event ID. */\n readonly id: string;\n /** Epoch ms when the call was issued. */\n readonly at: number;\n /** Epoch ms when the call completed (success or error). */\n readonly endedAt: number;\n /** `endedAt - at` — convenience. */\n readonly durationMs: number;\n readonly provider: LlmTraceProvider;\n readonly model: string;\n readonly kind: LlmTraceKind;\n readonly systemPrompt?: string;\n readonly userPrompt?: string;\n /**\n * Tool defs sent on the call (if any). Stripped to `name + description`\n * — full JSON schema would balloon the trace and is rarely useful in\n * the operator UI.\n */\n readonly tools?: ReadonlyArray<{\n readonly name: string;\n readonly description: string;\n }>;\n /** Set on successful completion. */\n readonly result?: {\n readonly inputTokens: number;\n readonly outputTokens: number;\n /** Anthropic only. Bytes counted toward the cache write. */\n readonly cacheCreated?: number;\n /** Anthropic only. Bytes served from cache (90% discounted). */\n readonly cacheRead?: number;\n /** Set when the call returned text content. */\n readonly text?: string;\n /** Set when the call returned tool_use blocks. */\n readonly toolCalls?: ReadonlyArray<{\n readonly name: string;\n readonly input: unknown;\n }>;\n /** Set for `callWithTools` — number of agentic turns consumed. */\n readonly turnsUsed?: number;\n };\n /** Set on failure. `result` is undefined. */\n readonly error?: { readonly message: string };\n}\n\n/**\n * Sink that receives one event per LLM call. Implementations MUST be\n * sync + non-throwing — the harness fires events on the hot path and\n * cannot tolerate backpressure or rejected promises. Buffer + drop or\n * fan out to a queue inside the implementation.\n */\nexport interface LlmTraceSink {\n emit(event: LlmTraceEvent): void;\n}\n\nlet activeSink: LlmTraceSink | null = null;\n\n/**\n * Register the active sink. Pass `null` to remove. Subsequent\n * {@link emitLlmTraceEvent} calls dispatch to this sink.\n */\nexport function setLlmTraceSink(sink: LlmTraceSink | null): void {\n activeSink = sink;\n}\n\n/** Read the active sink. Mostly for tests. */\nexport function getLlmTraceSink(): LlmTraceSink | null {\n return activeSink;\n}\n\n/**\n * Internal — used by `LLMAgent` adapters. No-op when no sink is\n * registered. Swallows sink-thrown errors (a broken devtools sink must\n * not break generation).\n */\nexport function emitLlmTraceEvent(event: LlmTraceEvent): void {\n const sink = activeSink;\n if (!sink) return;\n try {\n sink.emit(event);\n } catch {\n // Devtools sink is allowed to be buggy — generation must not die.\n }\n}\n\n/** Strip `LLMToolDef[]` to the trace-friendly subset. */\nexport function summarizeTools(\n tools: ReadonlyArray<LLMToolDef>,\n): ReadonlyArray<{ readonly name: string; readonly description: string }> {\n return tools.map((t) => ({ name: t.name, description: t.description }));\n}\n\n/**\n * Crockford-style random ID. Crypto.randomUUID() would do, but we want\n * to keep this dep-free for non-Node runtimes the harness might run in.\n */\nexport function newLlmTraceId(): string {\n return (\n Date.now().toString(36) +\n Math.random().toString(36).slice(2, 10)\n );\n}\n"]}
@@ -2,7 +2,7 @@ import { JsonObject, DataContract } from '@ggui-ai/protocol';
2
2
  export { ActionSpec, DataContract, JsonSchema, PropsSpec, StreamSpec } from '@ggui-ai/protocol';
3
3
  import { AdapterResult } from '../adapters/types.js';
4
4
  import { R as RenderingContext } from '../prompts-YU9piOgs.js';
5
- import { b as EvalResult } from '../types-public-DKR_h70H.js';
5
+ import { b as EvalResult } from '../types-public-CzYqZclY.js';
6
6
  import { D as DesignMode, C as CanvasClass } from '../design-mode-DLufhrNp.js';
7
7
  import 'zod';
8
8
  import '../axes-CzLEMDeB.js';
@@ -1,7 +1,7 @@
1
1
  import { G as GenerationProfileInput } from '../styling-profile-CxfvV48g.js';
2
- import { Q as QualityConfig } from '../types-public-DKR_h70H.js';
2
+ import { Q as QualityConfig } from '../types-public-CzYqZclY.js';
3
3
  import { DataContract, JsonObject, GadgetDescriptor } from '@ggui-ai/protocol';
4
- import { A as AgentConfig } from '../llm-router-D7fjBhtr.js';
4
+ import { A as AgentConfig } from '../llm-router-DwwUK1bz.js';
5
5
  import { C as CanvasClass, D as DesignMode } from '../design-mode-DLufhrNp.js';
6
6
  export { g as generateBoilerplate } from '../generate-9IeNT4ZY.js';
7
7
  import '../axes-CzLEMDeB.js';
@@ -57,6 +57,15 @@ interface SingleComponentParams {
57
57
  * today's single screenshot at `viewport`.
58
58
  */
59
59
  canvases?: readonly CanvasClass[];
60
+ /**
61
+ * ggui#1195 — per-canvas viewport override for the in-loop round: the
62
+ * box the composer targeted (`rendering.viewport`) so the round judges
63
+ * the same box. See `VisualEvalConfig.canvasViewports`.
64
+ */
65
+ canvasViewports?: Partial<Readonly<Record<CanvasClass, {
66
+ width: number;
67
+ height: number;
68
+ }>>>;
60
69
  /**
61
70
  * The stylesheet the in-loop visual round renders under (a caller's
62
71
  * theme composed by `cssTokensForAppTheme`); absent = the design's