@ggui-ai/ui-gen 0.28.0 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/dist/{adapter-h4_V69LI.d.ts → adapter-DLQ-5COm.d.ts} +1 -1
  2. package/dist/adapters/base.js +2 -27
  3. package/dist/adapters/base.js.map +1 -1
  4. package/dist/adapters/generation-dispatch.d.ts +14 -6
  5. package/dist/adapters/generation-dispatch.js +40 -19260
  6. package/dist/adapters/generation-dispatch.js.map +1 -1
  7. package/dist/adapters/index.d.ts +1 -1
  8. package/dist/adapters/index.js +25 -3561
  9. package/dist/adapters/index.js.map +1 -1
  10. package/dist/adapters/types.js +2 -9
  11. package/dist/adapters/types.js.map +1 -1
  12. package/dist/advanced/index.d.ts +13 -12
  13. package/dist/advanced/index.js +63 -21954
  14. package/dist/advanced/index.js.map +1 -1
  15. package/dist/{bank-Ctdp3FUA.d.ts → bank-LWaiAtaA.d.ts} +1 -1
  16. package/dist/blueprint-validator.js +6 -2301
  17. package/dist/blueprint-validator.js.map +1 -1
  18. package/dist/boilerplate.d.ts +3 -2
  19. package/dist/boilerplate.js +6 -1867
  20. package/dist/boilerplate.js.map +1 -1
  21. package/dist/check/index.d.ts +3 -2
  22. package/dist/check/index.js +6 -1923
  23. package/dist/check/index.js.map +1 -1
  24. package/dist/chunk-33B3BAWS.js +24 -0
  25. package/dist/chunk-33B3BAWS.js.map +1 -0
  26. package/dist/chunk-3HSGA6NI.js +591 -0
  27. package/dist/chunk-3HSGA6NI.js.map +1 -0
  28. package/dist/chunk-3NNNGNTO.js +1707 -0
  29. package/dist/chunk-3NNNGNTO.js.map +1 -0
  30. package/dist/chunk-3T2HMTON.js +79 -0
  31. package/dist/chunk-3T2HMTON.js.map +1 -0
  32. package/dist/chunk-3ZSSDV3L.js +123 -0
  33. package/dist/chunk-3ZSSDV3L.js.map +1 -0
  34. package/dist/chunk-4MBR5GA3.js +99 -0
  35. package/dist/chunk-4MBR5GA3.js.map +1 -0
  36. package/dist/chunk-56NJFD55.js +337 -0
  37. package/dist/chunk-56NJFD55.js.map +1 -0
  38. package/dist/chunk-5AGTY555.js +26 -0
  39. package/dist/chunk-5AGTY555.js.map +1 -0
  40. package/dist/chunk-5EJM7EGY.js +115 -0
  41. package/dist/chunk-5EJM7EGY.js.map +1 -0
  42. package/dist/chunk-5KXCQLLR.js +529 -0
  43. package/dist/chunk-5KXCQLLR.js.map +1 -0
  44. package/dist/chunk-5VBXHVEH.js +171 -0
  45. package/dist/chunk-5VBXHVEH.js.map +1 -0
  46. package/dist/chunk-6KDDEING.js +515 -0
  47. package/dist/chunk-6KDDEING.js.map +1 -0
  48. package/dist/chunk-6VDRWAP6.js +123 -0
  49. package/dist/chunk-6VDRWAP6.js.map +1 -0
  50. package/dist/chunk-732IBFEJ.js +2400 -0
  51. package/dist/chunk-732IBFEJ.js.map +1 -0
  52. package/dist/chunk-73AURS3I.js +46 -0
  53. package/dist/chunk-73AURS3I.js.map +1 -0
  54. package/dist/chunk-77H5SKLX.js +8 -0
  55. package/dist/chunk-77H5SKLX.js.map +1 -0
  56. package/dist/chunk-7QE3AHLE.js +35 -0
  57. package/dist/chunk-7QE3AHLE.js.map +1 -0
  58. package/dist/chunk-A375NNWN.js +11 -0
  59. package/dist/chunk-A375NNWN.js.map +1 -0
  60. package/dist/chunk-AOU33EFS.js +140 -0
  61. package/dist/chunk-AOU33EFS.js.map +1 -0
  62. package/dist/chunk-BA4QYA6E.js +461 -0
  63. package/dist/chunk-BA4QYA6E.js.map +1 -0
  64. package/dist/chunk-DBP764GL.js +3 -0
  65. package/dist/chunk-DBP764GL.js.map +1 -0
  66. package/dist/chunk-DUU3ZJDQ.js +41 -0
  67. package/dist/chunk-DUU3ZJDQ.js.map +1 -0
  68. package/dist/chunk-DXKRBXNU.js +30 -0
  69. package/dist/chunk-DXKRBXNU.js.map +1 -0
  70. package/dist/chunk-FB7OEEAH.js +1467 -0
  71. package/dist/chunk-FB7OEEAH.js.map +1 -0
  72. package/dist/chunk-FLRNMZV2.js +18 -0
  73. package/dist/chunk-FLRNMZV2.js.map +1 -0
  74. package/dist/chunk-FWJIMKFZ.js +2032 -0
  75. package/dist/chunk-FWJIMKFZ.js.map +1 -0
  76. package/dist/chunk-FXRHWYIQ.js +163 -0
  77. package/dist/chunk-FXRHWYIQ.js.map +1 -0
  78. package/dist/chunk-G3PMV62Z.js +33 -0
  79. package/dist/chunk-G3PMV62Z.js.map +1 -0
  80. package/dist/chunk-GAJI7Y3P.js +13 -0
  81. package/dist/chunk-GAJI7Y3P.js.map +1 -0
  82. package/dist/chunk-GYINWMPR.js +2052 -0
  83. package/dist/chunk-GYINWMPR.js.map +1 -0
  84. package/dist/chunk-HD6ABIK7.js +484 -0
  85. package/dist/chunk-HD6ABIK7.js.map +1 -0
  86. package/dist/chunk-HDQVHYO6.js +100 -0
  87. package/dist/chunk-HDQVHYO6.js.map +1 -0
  88. package/dist/chunk-IHUT3SIW.js +7 -0
  89. package/dist/chunk-IHUT3SIW.js.map +1 -0
  90. package/dist/chunk-JDH5EGNZ.js +126 -0
  91. package/dist/chunk-JDH5EGNZ.js.map +1 -0
  92. package/dist/chunk-JMD4RGSV.js +37 -0
  93. package/dist/chunk-JMD4RGSV.js.map +1 -0
  94. package/dist/chunk-KJWGZL5B.js +33 -0
  95. package/dist/chunk-KJWGZL5B.js.map +1 -0
  96. package/dist/chunk-MKMDQFZ7.js +86 -0
  97. package/dist/chunk-MKMDQFZ7.js.map +1 -0
  98. package/dist/chunk-NF6JUZWF.js +85 -0
  99. package/dist/chunk-NF6JUZWF.js.map +1 -0
  100. package/dist/chunk-O2YC6XDC.js +1933 -0
  101. package/dist/chunk-O2YC6XDC.js.map +1 -0
  102. package/dist/chunk-OVLH5ICV.js +29 -0
  103. package/dist/chunk-OVLH5ICV.js.map +1 -0
  104. package/dist/chunk-PBOYHGSD.js +106 -0
  105. package/dist/chunk-PBOYHGSD.js.map +1 -0
  106. package/dist/chunk-PJFH7QWA.js +81 -0
  107. package/dist/chunk-PJFH7QWA.js.map +1 -0
  108. package/dist/chunk-PUH4CXGZ.js +284 -0
  109. package/dist/chunk-PUH4CXGZ.js.map +1 -0
  110. package/dist/chunk-QLXXPGTV.js +18 -0
  111. package/dist/chunk-QLXXPGTV.js.map +1 -0
  112. package/dist/chunk-R5GIGPW2.js +2845 -0
  113. package/dist/chunk-R5GIGPW2.js.map +1 -0
  114. package/dist/chunk-RH4IUSTO.js +83 -0
  115. package/dist/chunk-RH4IUSTO.js.map +1 -0
  116. package/dist/chunk-S2GVXKKY.js +153 -0
  117. package/dist/chunk-S2GVXKKY.js.map +1 -0
  118. package/dist/chunk-TVHGKFJS.js +58 -0
  119. package/dist/chunk-TVHGKFJS.js.map +1 -0
  120. package/dist/chunk-U7GALWLG.js +66 -0
  121. package/dist/chunk-U7GALWLG.js.map +1 -0
  122. package/dist/chunk-VTC263LT.js +256 -0
  123. package/dist/chunk-VTC263LT.js.map +1 -0
  124. package/dist/chunk-WEOXFEVE.js +739 -0
  125. package/dist/chunk-WEOXFEVE.js.map +1 -0
  126. package/dist/chunk-WYHP46LT.js +28 -0
  127. package/dist/chunk-WYHP46LT.js.map +1 -0
  128. package/dist/chunk-XGLO5LGG.js +274 -0
  129. package/dist/chunk-XGLO5LGG.js.map +1 -0
  130. package/dist/chunk-XRBCRKA2.js +29 -0
  131. package/dist/chunk-XRBCRKA2.js.map +1 -0
  132. package/dist/chunk-XW7ADFFV.js +340 -0
  133. package/dist/chunk-XW7ADFFV.js.map +1 -0
  134. package/dist/chunk-YIQ42IUX.js +34 -0
  135. package/dist/chunk-YIQ42IUX.js.map +1 -0
  136. package/dist/chunk-YJZTUY7B.js +101 -0
  137. package/dist/chunk-YJZTUY7B.js.map +1 -0
  138. package/dist/chunk-Z3CXME3K.js +107 -0
  139. package/dist/chunk-Z3CXME3K.js.map +1 -0
  140. package/dist/classifier/index.js +2 -527
  141. package/dist/classifier/index.js.map +1 -1
  142. package/dist/client-JBPCXU7W.js +4 -0
  143. package/dist/client-JBPCXU7W.js.map +1 -0
  144. package/dist/compose.js +3 -367
  145. package/dist/compose.js.map +1 -1
  146. package/dist/cost-tracker-HHGQ4FTW.js +67 -0
  147. package/dist/cost-tracker-HHGQ4FTW.js.map +1 -0
  148. package/dist/{create-ui-generator-BrZHF0cf.d.ts → create-ui-generator-BY-WeaPi.d.ts} +3 -3
  149. package/dist/{design-mode-DGWN_Gkm.d.ts → design-mode-XyOQmzE0.d.ts} +4 -3
  150. package/dist/{dispatch-B07TI30d.d.ts → dispatch-8LzTddKw.d.ts} +3 -2
  151. package/dist/dist-UALN6ZVB.js +543 -0
  152. package/dist/dist-UALN6ZVB.js.map +1 -0
  153. package/dist/dupe-break-X6K7QFIS.js +4 -0
  154. package/dist/dupe-break-X6K7QFIS.js.map +1 -0
  155. package/dist/evaluation/axis-checks/index.d.ts +5 -4
  156. package/dist/evaluation/axis-checks/index.js +6 -1914
  157. package/dist/evaluation/axis-checks/index.js.map +1 -1
  158. package/dist/evaluation/axis-checks/registry.d.ts +3 -2
  159. package/dist/evaluation/axis-checks/registry.js +3 -1844
  160. package/dist/evaluation/axis-checks/registry.js.map +1 -1
  161. package/dist/evaluation/index.d.ts +49 -132
  162. package/dist/evaluation/index.js +302 -6466
  163. package/dist/evaluation/index.js.map +1 -1
  164. package/dist/evaluation/types.d.ts +3 -2
  165. package/dist/evaluation/types.js +2 -5
  166. package/dist/evaluation/types.js.map +1 -1
  167. package/dist/fragments/index.js +2 -338
  168. package/dist/fragments/index.js.map +1 -1
  169. package/dist/{generate-tSO_shQ0.d.ts → generate-DQ4ci90s.d.ts} +1 -1
  170. package/dist/harness/check/runtime-render/index.d.ts +35 -15
  171. package/dist/harness/check/runtime-render/index.js +6 -2390
  172. package/dist/harness/check/runtime-render/index.js.map +1 -1
  173. package/dist/harness/check/runtime-render/render-check-worker.js +4 -1739
  174. package/dist/harness/check/runtime-render/render-check-worker.js.map +1 -1
  175. package/dist/harness/index.d.ts +3 -2
  176. package/dist/harness/index.js +23 -5126
  177. package/dist/harness/index.js.map +1 -1
  178. package/dist/harness/llm-trace-sink.js +2 -24
  179. package/dist/harness/llm-trace-sink.js.map +1 -1
  180. package/dist/harness/prompts.d.ts +2 -2
  181. package/dist/harness/prompts.js +8 -324
  182. package/dist/harness/prompts.js.map +1 -1
  183. package/dist/harness/result-types.d.ts +6 -5
  184. package/dist/harness/result-types.js +2 -0
  185. package/dist/harness/result-types.js.map +1 -1
  186. package/dist/harness/runtime.d.ts +22 -5
  187. package/dist/harness/runtime.js +10 -2313
  188. package/dist/harness/runtime.js.map +1 -1
  189. package/dist/harness/types-public.d.ts +3 -2
  190. package/dist/harness/types-public.js +16 -2954
  191. package/dist/harness/types-public.js.map +1 -1
  192. package/dist/harness/validator-trace-sink.d.ts +3 -2
  193. package/dist/harness/validator-trace-sink.js +2 -26
  194. package/dist/harness/validator-trace-sink.js.map +1 -1
  195. package/dist/hash.js +2 -39
  196. package/dist/hash.js.map +1 -1
  197. package/dist/hashline-5OKREIRM.js +4 -0
  198. package/dist/hashline-5OKREIRM.js.map +1 -0
  199. package/dist/index.d.ts +50 -11
  200. package/dist/index.js +57 -22015
  201. package/dist/index.js.map +1 -1
  202. package/dist/llm-evaluator-PN3WFCS4.js +653 -0
  203. package/dist/llm-evaluator-PN3WFCS4.js.map +1 -0
  204. package/dist/magic-string.es-2NZTC4GZ.js +1307 -0
  205. package/dist/magic-string.es-2NZTC4GZ.js.map +1 -0
  206. package/dist/patch.d.ts +3 -2
  207. package/dist/patch.js +2 -56
  208. package/dist/patch.js.map +1 -1
  209. package/dist/policy-VCYKGSAC.js +5 -0
  210. package/dist/policy-VCYKGSAC.js.map +1 -0
  211. package/dist/policy.js +2 -35
  212. package/dist/policy.js.map +1 -1
  213. package/dist/primitive-index-2OF6F4TZ.js +131 -0
  214. package/dist/primitive-index-2OF6F4TZ.js.map +1 -0
  215. package/dist/primitive-slice-WTMBLYFJ.js +235 -0
  216. package/dist/primitive-slice-WTMBLYFJ.js.map +1 -0
  217. package/dist/{prompts-BhNUuRoZ.d.ts → prompts-CLZGywMP.d.ts} +1 -1
  218. package/dist/provider-adapter-contract.js +10407 -14204
  219. package/dist/provider-adapter-contract.js.map +1 -1
  220. package/dist/provider-adapter.js +2 -44
  221. package/dist/provider-adapter.js.map +1 -1
  222. package/dist/providers/index.d.ts +89 -1
  223. package/dist/providers/index.js +115 -44
  224. package/dist/providers/index.js.map +1 -1
  225. package/dist/raw-C6KBH5I3.js +141 -0
  226. package/dist/raw-C6KBH5I3.js.map +1 -0
  227. package/dist/raw-FXSBXQTZ.js +7 -0
  228. package/dist/raw-FXSBXQTZ.js.map +1 -0
  229. package/dist/raw-MURDUPGK.js +8 -0
  230. package/dist/raw-MURDUPGK.js.map +1 -0
  231. package/dist/raw-T3GW3UVX.js +8 -0
  232. package/dist/raw-T3GW3UVX.js.map +1 -0
  233. package/dist/render-check-host-ZNIS6BJ5.js +5 -0
  234. package/dist/render-check-host-ZNIS6BJ5.js.map +1 -0
  235. package/dist/sdk-4JNSDNSR.js +6 -0
  236. package/dist/sdk-4JNSDNSR.js.map +1 -0
  237. package/dist/sdk-DIVJMHCX.js +7 -0
  238. package/dist/sdk-DIVJMHCX.js.map +1 -0
  239. package/dist/sdk-QRJOCRTS.js +7 -0
  240. package/dist/sdk-QRJOCRTS.js.map +1 -0
  241. package/dist/tag-balance-CTHCTRJ7.js +123 -0
  242. package/dist/tag-balance-CTHCTRJ7.js.map +1 -0
  243. package/dist/tools/get-primitives-ts.d.ts +1 -1
  244. package/dist/tools/get-primitives-ts.js +3 -1
  245. package/dist/tools/get-primitives-ts.js.map +1 -1
  246. package/dist/tools/render-check-worker.js +3 -40
  247. package/dist/tools/render-check-worker.js.map +1 -1
  248. package/dist/{types-public-h8IMnYuh.d.ts → types-public-hYlrerZh.d.ts} +35 -2
  249. package/dist/validation/index.d.ts +2 -2
  250. package/dist/validation/index.js +3 -498
  251. package/dist/validation/index.js.map +1 -1
  252. package/dist/{visual-evaluator-C2strxqD.d.ts → visual-evaluator-KskajxD5.d.ts} +14 -4
  253. package/dist/visual-evaluator-TGEXYQTP.js +12 -0
  254. package/dist/visual-evaluator-TGEXYQTP.js.map +1 -0
  255. package/dist/workflows.d.ts +3 -2
  256. package/dist/workflows.js +2 -151
  257. package/dist/workflows.js.map +1 -1
  258. package/package.json +20 -16
  259. package/src/adapters/claude/sdk.ts +4 -2
  260. package/src/adapters/claude/tool-bridge.ts +2 -1
  261. package/src/adapters/generation-dispatch.ts +9 -0
  262. package/src/adapters/openai/raw.ts +4 -0
  263. package/src/adapters/openai/sdk.ts +6 -1
  264. package/src/adapters/openai/tokens.ts +21 -7
  265. package/src/adapters/tool-bridge.ts +1 -1
  266. package/src/adapters/tools.ts +1 -1
  267. package/src/advanced/feedback.ts +1 -2
  268. package/src/advanced/generator.ts +4 -3
  269. package/src/boilerplate/free-design-prompt.ts +7 -0
  270. package/src/boilerplate/generate.ts +18 -5
  271. package/src/boilerplate/hard-sections.ts +8 -3
  272. package/src/boilerplate/react-hooks.ts +56 -0
  273. package/src/boilerplate/system-prompt.ts +12 -3
  274. package/src/check/run-tier0.ts +233 -8
  275. package/src/check/type-checker.ts +128 -16
  276. package/src/coding-agent/tools.ts +26 -3
  277. package/src/design-mode.ts +4 -9
  278. package/src/evaluation/axis-checks/checks/state-merge.ts +2 -4
  279. package/src/evaluation/axis-checks/checks/state-payload.ts +1 -28
  280. package/src/evaluation/axis-checks/checks/tint.ts +197 -0
  281. package/src/evaluation/axis-checks/helpers.ts +121 -0
  282. package/src/evaluation/axis-checks/registry.ts +2 -0
  283. package/src/evaluation/criteria/__fixtures__/edge-v2-draw2.json +4629 -0
  284. package/src/evaluation/criteria/bank.ts +1 -1
  285. package/src/evaluation/criteria/edge-instruments.ts +14 -0
  286. package/src/evaluation/criteria/edge-probe-v2.ts +352 -0
  287. package/src/evaluation/criteria/edge-v2.ts +242 -0
  288. package/src/evaluation/criteria/resolve.ts +24 -5
  289. package/src/evaluation/index.ts +3 -5
  290. package/src/evaluation/mcp-server.ts +0 -50
  291. package/src/evaluation/types-public.ts +6 -1
  292. package/src/evaluation/visual-evaluator.ts +161 -30
  293. package/src/harness/check/runtime-render/index.ts +28 -4
  294. package/src/harness/check/runtime-render/render-check.ts +20 -21
  295. package/src/harness/claude-agent-sdk-loader.ts +93 -0
  296. package/src/harness/claude-code-login-query.ts +1 -1
  297. package/src/harness/coding/generate-task-runner.ts +1 -0
  298. package/src/harness/coding/run-coding-turn.ts +3 -0
  299. package/src/harness/coding/run-eval-round.ts +9 -0
  300. package/src/harness/llm-router.ts +50 -2
  301. package/src/harness/runtime.ts +17 -0
  302. package/src/index.ts +9 -0
  303. package/src/providers/anthropic-tool-call.ts +263 -0
  304. package/src/providers/index.ts +13 -0
  305. package/src/tools/get-primitives-ts.ts +1 -1
  306. package/src/tools/render-check.ts +4 -4
  307. package/src/validation/primitives.ts +2 -1
  308. package/src/evaluation/loop.ts +0 -218
@@ -0,0 +1,171 @@
1
+ import { DEFAULT_CONTEXT_POLICY, DEFAULT_HARNESS_POLICY, resolveHarnessPolicy, resolveRunPolicy } from './chunk-JMD4RGSV.js';
2
+
3
+ // src/harness/model-registry.ts
4
+ var MODEL_HARNESS_REGISTRY = Object.freeze({
5
+ // No entries yet. Seed candidates from session 2026-04-16 below are
6
+ // tracked here for context but NOT shipped — they failed gates under
7
+ // current defaults.
8
+ //
9
+ // ─────────────────────────────────────────────────────────────────
10
+ // CANDIDATE (NOT SHIPPED): "gemini-3.1-flash-lite-preview"
11
+ // exp: #53 (hashline-v2) — initial signal −38% ms
12
+ // later: #67 (per-provider-hashline-v1, 2026-04-16) — FALSIFIED
13
+ // reason: #53's win was already subsumed by codeFormat:"flat"
14
+ // shipped as default in #60. Under current defaults the
15
+ // hashline re-application produces no additional win and
16
+ // adds OpenAI stale-rate cost. Override retired.
17
+ //
18
+ // CANDIDATE (NOT SHIPPED): "gpt-5.4-mini"
19
+ // exp: #53 signal (-32% ms, +9 score)
20
+ // later: #67 — FALSIFIED (12% HASHLINE_STALE rate blocked G2)
21
+ // reason: same as above — subsumed by #60 default flat-code schema.
22
+ //
23
+ // Narrow-merge candidate (#48, 2026-04-16) — asymmetric win
24
+ // on hard slice (Google −46% ms, OpenAI −27% ms, Claude flat −3pt
25
+ // score). Per-provider or per-model routing deferred pending
26
+ // universal-bench non-regression gate + decision on whether to
27
+ // fire the scaffold-narrowing axis as a default vs a routed override.
28
+ });
29
+ function resolveModelOverride(modelId) {
30
+ if (!modelId) return void 0;
31
+ return MODEL_HARNESS_REGISTRY[modelId];
32
+ }
33
+
34
+ // src/harness/policy.ts
35
+ function resolveHarnessPolicy2(classification) {
36
+ const profile = typeof process !== "undefined" ? process.env?.GGUI_POLICY_PROFILE : void 0;
37
+ if (profile === "narrow-merge-v1" && classification.vector.state === "merge") {
38
+ return {
39
+ ...DEFAULT_HARNESS_POLICY,
40
+ context: {
41
+ ...DEFAULT_CONTEXT_POLICY,
42
+ primitiveDocSlice: "axis-keyed",
43
+ primitiveDocExcludes: ["Row", "Box", "Spacer"]
44
+ }
45
+ };
46
+ }
47
+ if (profile === "hashline-v2") {
48
+ return {
49
+ ...DEFAULT_HARNESS_POLICY,
50
+ context: {
51
+ ...DEFAULT_CONTEXT_POLICY,
52
+ hashline: "v2"
53
+ }
54
+ };
55
+ }
56
+ if (profile === "tool-driven-primitives-names") {
57
+ return {
58
+ ...DEFAULT_HARNESS_POLICY,
59
+ context: {
60
+ ...DEFAULT_CONTEXT_POLICY,
61
+ primitiveIndex: "names-only"
62
+ }
63
+ };
64
+ }
65
+ if (profile === "tool-driven-primitives-props") {
66
+ return {
67
+ ...DEFAULT_HARNESS_POLICY,
68
+ context: {
69
+ ...DEFAULT_CONTEXT_POLICY,
70
+ primitiveIndex: "with-props"
71
+ }
72
+ };
73
+ }
74
+ if (profile === "tool-driven-primitives-force-fetch") {
75
+ return {
76
+ ...DEFAULT_HARNESS_POLICY,
77
+ context: {
78
+ ...DEFAULT_CONTEXT_POLICY,
79
+ primitiveIndex: "with-props",
80
+ primitiveIndexForceFetch: true
81
+ }
82
+ };
83
+ }
84
+ if (profile === "tool-driven-primitives-fetch-plan") {
85
+ return {
86
+ ...DEFAULT_HARNESS_POLICY,
87
+ context: {
88
+ ...DEFAULT_CONTEXT_POLICY,
89
+ primitiveIndex: "with-props",
90
+ primitiveIndexForceFetch: true,
91
+ primitiveIndexPlanTurn: true
92
+ }
93
+ };
94
+ }
95
+ if (profile === "primitives-ts-format") {
96
+ return {
97
+ ...DEFAULT_HARNESS_POLICY,
98
+ context: {
99
+ ...DEFAULT_CONTEXT_POLICY,
100
+ primitiveDocFormat: "ts"
101
+ }
102
+ };
103
+ }
104
+ if (profile === "tsformat-plan-impl") {
105
+ return {
106
+ ...DEFAULT_HARNESS_POLICY,
107
+ context: {
108
+ ...DEFAULT_CONTEXT_POLICY,
109
+ primitiveDocFormat: "ts",
110
+ planFirstTurn: true
111
+ }
112
+ };
113
+ }
114
+ if (profile === "numberline-flat") {
115
+ return {
116
+ ...DEFAULT_HARNESS_POLICY,
117
+ context: { ...DEFAULT_CONTEXT_POLICY, codeFormat: "flat" }
118
+ };
119
+ }
120
+ if (profile === "legacy-code-array") {
121
+ return {
122
+ ...DEFAULT_HARNESS_POLICY,
123
+ context: { ...DEFAULT_CONTEXT_POLICY, codeFormat: "array" }
124
+ };
125
+ }
126
+ if (profile === "hashline-v2-flat") {
127
+ return {
128
+ ...DEFAULT_HARNESS_POLICY,
129
+ context: {
130
+ ...DEFAULT_CONTEXT_POLICY,
131
+ hashline: "v2",
132
+ codeFormat: "flat"
133
+ }
134
+ };
135
+ }
136
+ return resolveHarnessPolicy(classification);
137
+ }
138
+ function resolveRunPolicy2(harness, runtimeCtx) {
139
+ const base = resolveRunPolicy(harness, runtimeCtx);
140
+ const override = resolveModelOverride(
141
+ runtimeCtx.modelId
142
+ );
143
+ if (!override) return base;
144
+ return {
145
+ ...base,
146
+ context: { ...base.context, ...override }
147
+ };
148
+ }
149
+ function resolveRunPolicyForProfile(profile, harness, runtimeCtx) {
150
+ if (profile === "ctx-slice-primitives-v1") {
151
+ return {
152
+ context: {
153
+ ...harness.policy.context,
154
+ primitiveDocSlice: "axis-keyed"
155
+ }
156
+ };
157
+ }
158
+ if (profile === "ctx-slice-primitives-v2") {
159
+ return {
160
+ context: {
161
+ ...harness.policy.context,
162
+ primitiveDocSlice: "axis-keyed+contract"
163
+ }
164
+ };
165
+ }
166
+ return resolveRunPolicy2(harness, runtimeCtx);
167
+ }
168
+
169
+ export { resolveHarnessPolicy2 as resolveHarnessPolicy, resolveRunPolicy2 as resolveRunPolicy, resolveRunPolicyForProfile };
170
+ //# sourceMappingURL=chunk-5VBXHVEH.js.map
171
+ //# sourceMappingURL=chunk-5VBXHVEH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/harness/model-registry.ts","../src/harness/policy.ts"],"names":["resolveHarnessPolicy","resolveRunPolicy"],"mappings":"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","file":"chunk-5VBXHVEH.js","sourcesContent":["// Per-model harness overrides — a git-committed TS const map.\n//\n// The registry is the source of truth for \"what harness does model X get?\".\n// Unknown models fall through to DEFAULT_CONTEXT_POLICY (no-op, matches the\n// pre-registry behavior byte-for-byte).\n//\n// Why a file and not a database:\n// - Reviewable via PR — every registry change is a code change.\n// - Type-checked — schema drift fails the build.\n// - Versioned with the harness it configures — no runtime/schema skew.\n// - Self-documenting — each entry carries the benchmark data that\n// justifies the override, right next to the override itself.\n//\n// How entries graduate:\n// 1. A scheduled benchmark runs the current corpus against each known\n// model × candidate override.\n// 2. An override must pass every pre-registered quality gate.\n// 3. The benchmark emits a registry patch (a diff against this file).\n// 4. A human reviews + merges the PR. Each merged entry records its\n// metric deltas in the preceding comment block.\n//\n// How entries are retired:\n// - When a subsequent default change subsumes an override (for\n// example, shipping `codeFormat: \"flat\"` as the default absorbed an\n// earlier per-model override), the benchmark flags the override as\n// no longer needed and a removal PR is opened with the\n// revalidation data as the rationale.\n//\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport type { ContextPolicy } from \"./policy.js\";\n\n/**\n * Partial override of the default context policy for a specific model.\n * Missing fields inherit from `DEFAULT_CONTEXT_POLICY`.\n */\nexport type ModelHarnessOverride = Partial<ContextPolicy>;\n\n/**\n * Registry of per-model overrides. Keys are model ids as reported by\n * `RuntimeCtx.modelId` (i.e. the string passed to the provider SDK, not the\n * provider's display name). Unknown ids fall through to default resolution.\n *\n * Empty by design at launch — the scheduled bench populates this as\n * experiments validate. Every entry must cite the experiment that\n * justified it (exp #, date, gate results) in a preceding comment block.\n */\nexport const MODEL_HARNESS_REGISTRY: Readonly<Record<string, ModelHarnessOverride>> =\n Object.freeze({\n // No entries yet. Seed candidates from session 2026-04-16 below are\n // tracked here for context but NOT shipped — they failed gates under\n // current defaults.\n //\n // ─────────────────────────────────────────────────────────────────\n // CANDIDATE (NOT SHIPPED): \"gemini-3.1-flash-lite-preview\"\n // exp: #53 (hashline-v2) — initial signal −38% ms\n // later: #67 (per-provider-hashline-v1, 2026-04-16) — FALSIFIED\n // reason: #53's win was already subsumed by codeFormat:\"flat\"\n // shipped as default in #60. Under current defaults the\n // hashline re-application produces no additional win and\n // adds OpenAI stale-rate cost. Override retired.\n //\n // CANDIDATE (NOT SHIPPED): \"gpt-5.4-mini\"\n // exp: #53 signal (-32% ms, +9 score)\n // later: #67 — FALSIFIED (12% HASHLINE_STALE rate blocked G2)\n // reason: same as above — subsumed by #60 default flat-code schema.\n //\n // Narrow-merge candidate (#48, 2026-04-16) — asymmetric win\n // on hard slice (Google −46% ms, OpenAI −27% ms, Claude flat −3pt\n // score). Per-provider or per-model routing deferred pending\n // universal-bench non-regression gate + decision on whether to\n // fire the scaffold-narrowing axis as a default vs a routed override.\n });\n\n/**\n * Look up a per-model override. Returns `undefined` when the model is\n * unknown — caller should fall through to default resolution.\n *\n * Pure function, no side effects, no I/O — the registry is compiled in.\n */\nexport function resolveModelOverride(\n modelId: string | undefined,\n): ModelHarnessOverride | undefined {\n if (!modelId) return undefined;\n return MODEL_HARNESS_REGISTRY[modelId];\n}\n","// Experiment layer over the base policy module (`../policy.ts`).\n//\n// This file adds opt-in experimental policy on top of the validated\n// shipping defaults. It is where new ideas are exercised before they\n// graduate into the defaults.\n//\n// Experiment material kept here:\n// - `GGUI_POLICY_PROFILE` environment-variable reading.\n// - Named experimental profile branches (narrow-merge-v1, hashline-v2,\n// tool-driven-primitives-*, primitives-ts-format, tsformat-plan-impl,\n// numberline-flat, legacy-code-array, hashline-v2-flat).\n// - `resolveRunPolicyForProfile`.\n// - `MODEL_HARNESS_REGISTRY` consultation via `resolveModelOverride`.\n//\n// Validated material in the base policy module (`../policy.ts`):\n// - Type vocabulary (ContextPolicy, HarnessPolicy, RuntimeCtx,\n// ResolvedRunPolicy, ProcessMode).\n// - Shipping defaults (DEFAULT_CONTEXT_POLICY, DEFAULT_HARNESS_POLICY).\n// - `isDefaultHarnessPolicy` structural-equality check.\n// - Default `resolveHarnessPolicy` + identity `resolveRunPolicy`.\n//\n// A new experimental arm lives here until it is validated; once proven,\n// the field moves into the base module's DEFAULT_CONTEXT_POLICY and the\n// arm's profile branch is removed.\n\nimport type { Classification } from \"../classifier/index.js\";\nimport {\n DEFAULT_CONTEXT_POLICY,\n DEFAULT_HARNESS_POLICY,\n resolveHarnessPolicy as resolveDefaultHarnessPolicy,\n resolveRunPolicy as resolveIdentityRunPolicy,\n type ContextPolicy,\n type HarnessPolicy,\n type ResolvedRunPolicy,\n type RuntimeCtx,\n} from \"../policy.js\";\nimport { resolveModelOverride } from \"./model-registry.js\";\n\n// Re-export the base contract surface so importers\n// (`create-harness.ts`, `coding/init-session.ts`, `model-registry.ts`,\n// tests) can reach it through this module.\nexport {\n DEFAULT_CONTEXT_POLICY,\n DEFAULT_HARNESS_POLICY,\n isDefaultHarnessPolicy,\n type ContextPolicy,\n type HarnessPolicy,\n type ResolvedRunPolicy,\n type RuntimeCtx,\n} from \"../policy.js\";\n\n// `Priority` is sourced from the evaluation subpath where it lives.\nexport type { Priority } from \"../evaluation/types-public.js\";\n\n// ────────────────────────────────────────────────────────────────────────────\n// Funnel: classification-time profile branches\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Static resolver — runs at `createHarness` time. Consults\n * `GGUI_POLICY_PROFILE` and dispatches to named experimental profile\n * branches. On no profile match, falls through to the default\n * `resolveHarnessPolicy` from `@ggui-ai/ui-gen/policy` which returns\n * the shipping default singleton.\n *\n * Every profile here is experimental: opt-in via an environment\n * variable, never on by default in production dispatch. When a profile\n * is validated, its fields graduate into `DEFAULT_CONTEXT_POLICY` (in\n * the base policy module) and the branch below is deleted.\n */\nexport function resolveHarnessPolicy(classification: Classification): HarnessPolicy {\n const profile =\n typeof process !== \"undefined\" ? process.env?.GGUI_POLICY_PROFILE : undefined;\n\n // `narrow-merge-v1`: drop near-synonym layout primitives (Row, Box,\n // Spacer) from the axis-keyed slice on state=merge fixtures, to\n // reduce JSX tag-mismatch patch failures.\n if (profile === \"narrow-merge-v1\" && classification.vector.state === \"merge\") {\n return {\n ...DEFAULT_HARNESS_POLICY,\n context: {\n ...DEFAULT_CONTEXT_POLICY,\n primitiveDocSlice: \"axis-keyed\",\n primitiveDocExcludes: [\"Row\", \"Box\", \"Spacer\"],\n },\n };\n }\n\n // `hashline-v2`: N:hh line refs with content-hash verification on\n // apply_changes.\n if (profile === \"hashline-v2\") {\n return {\n ...DEFAULT_HARNESS_POLICY,\n context: {\n ...DEFAULT_CONTEXT_POLICY,\n hashline: \"v2\",\n },\n };\n }\n\n // Tool-driven primitive docs. Two sub-profiles for A/B comparison.\n if (profile === \"tool-driven-primitives-names\") {\n return {\n ...DEFAULT_HARNESS_POLICY,\n context: {\n ...DEFAULT_CONTEXT_POLICY,\n primitiveIndex: \"names-only\",\n },\n };\n }\n if (profile === \"tool-driven-primitives-props\") {\n return {\n ...DEFAULT_HARNESS_POLICY,\n context: {\n ...DEFAULT_CONTEXT_POLICY,\n primitiveIndex: \"with-props\",\n },\n };\n }\n // Props index + force turn 1 to fetch-only.\n if (profile === \"tool-driven-primitives-force-fetch\") {\n return {\n ...DEFAULT_HARNESS_POLICY,\n context: {\n ...DEFAULT_CONTEXT_POLICY,\n primitiveIndex: \"with-props\",\n primitiveIndexForceFetch: true,\n },\n };\n }\n // fetch → plan → write pipeline.\n if (profile === \"tool-driven-primitives-fetch-plan\") {\n return {\n ...DEFAULT_HARNESS_POLICY,\n context: {\n ...DEFAULT_CONTEXT_POLICY,\n primitiveIndex: \"with-props\",\n primitiveIndexForceFetch: true,\n primitiveIndexPlanTurn: true,\n },\n };\n }\n // TS-interface format. Full doc retained, compacted ~128 KB → ~59 KB.\n // This is the shipped default; the profile remains for A/B regression\n // investigation.\n if (profile === \"primitives-ts-format\") {\n return {\n ...DEFAULT_HARNESS_POLICY,\n context: {\n ...DEFAULT_CONTEXT_POLICY,\n primitiveDocFormat: \"ts\",\n },\n };\n }\n // TS-format + plan→impl pipeline.\n if (profile === \"tsformat-plan-impl\") {\n return {\n ...DEFAULT_HARNESS_POLICY,\n context: {\n ...DEFAULT_CONTEXT_POLICY,\n primitiveDocFormat: \"ts\",\n planFirstTurn: true,\n },\n };\n }\n // Flat `code: string` is the shipped default. `numberline-flat` is\n // kept as an explicit opt-in for A/B benchmarks; `legacy-code-array`\n // reverts to the `string[]` schema for regression investigation.\n if (profile === \"numberline-flat\") {\n return {\n ...DEFAULT_HARNESS_POLICY,\n context: { ...DEFAULT_CONTEXT_POLICY, codeFormat: \"flat\" },\n };\n }\n if (profile === \"legacy-code-array\") {\n return {\n ...DEFAULT_HARNESS_POLICY,\n context: { ...DEFAULT_CONTEXT_POLICY, codeFormat: \"array\" },\n };\n }\n if (profile === \"hashline-v2-flat\") {\n return {\n ...DEFAULT_HARNESS_POLICY,\n context: {\n ...DEFAULT_CONTEXT_POLICY,\n hashline: \"v2\",\n codeFormat: \"flat\",\n },\n };\n }\n\n return resolveDefaultHarnessPolicy(classification);\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Run-time model-registry overlay\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Runtime resolver — runs at dispatch time. Layers the per-model\n * `MODEL_HARNESS_REGISTRY` override on top of the identity\n * `resolveRunPolicy` from `@ggui-ai/ui-gen/policy`. When the registry\n * has no entry for the runtime's `modelId`, returns `harness.policy`\n * unchanged (reference-equal — see the identity in the base module).\n *\n * The registry is empty at launch; entries graduate through a scheduled\n * bench that runs the current corpus against each known model ×\n * candidate override. See `model-registry.ts`.\n */\nexport function resolveRunPolicy(\n harness: { readonly policy: HarnessPolicy },\n runtimeCtx: RuntimeCtx,\n): ResolvedRunPolicy {\n const base = resolveIdentityRunPolicy(harness, runtimeCtx);\n const override: Partial<ContextPolicy> | undefined = resolveModelOverride(\n runtimeCtx.modelId,\n );\n if (!override) return base;\n return {\n ...base,\n context: { ...base.context, ...override },\n };\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Funnel: profile-gated runtime resolver\n// ────────────────────────────────────────────────────────────────────────────\n//\n// Profiles let us bench provider-aware policy overrides without changing\n// the default `resolveRunPolicy` semantics. A profile is opt-in: bench\n// and tests pass it explicitly; production dispatch never sets one.\n\n/**\n * Resolve the runtime policy for a given experimental profile name.\n * When no profile matches, falls through to the identity\n * `resolveRunPolicy` above.\n */\nexport function resolveRunPolicyForProfile(\n profile: string | undefined,\n harness: { readonly policy: HarnessPolicy },\n runtimeCtx: RuntimeCtx,\n): ResolvedRunPolicy {\n // Active profiles:\n // ctx-slice-primitives-v1 (#45) — axis-keyed primitives doc slice\n // in the first-turn system prompt.\n if (profile === \"ctx-slice-primitives-v1\") {\n return {\n context: {\n ...harness.policy.context,\n primitiveDocSlice: \"axis-keyed\",\n },\n };\n }\n\n // ctx-slice-primitives-v2 (ggui#1324) — the #45 slice plus the input\n // primitives the contract's slots and action payloads imply.\n if (profile === \"ctx-slice-primitives-v2\") {\n return {\n context: {\n ...harness.policy.context,\n primitiveDocSlice: \"axis-keyed+contract\",\n },\n };\n }\n\n // Archived experimental profiles:\n //\n // experiment-40-provider-asymmetric — provider-specific tier-0 labels\n // break-dup-patch — dupe-fp → forced WRITE\n // break-dup-patch-scoped — dupe-fp → scoped tool\n // break-dup-patch-diagnostic — focused excerpt + DIAG\n // break-dup-patch-diagnostic-noforce — same, no coercion\n //\n // ─── DUPE-BREAK FAMILY: RETIRED ───\n // Systematic ablations of the dupe-break family did not pass the\n // quality gates on high-risk generations. The detector, diagnostic\n // plumbing, and outcome counters remain as dormant infrastructure,\n // reusable when a different architectural attack surface is on the\n // table.\n return resolveRunPolicy(harness, runtimeCtx);\n}\n"]}