@ggui-ai/ui-gen 0.27.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 (315) 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 -19095
  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 -21789
  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 -1818
  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 -1748
  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 -6368
  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 -5124
  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 +18 -6
  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 +51 -12
  200. package/dist/index.js +57 -21850
  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 +21 -17
  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/provider-router.ts +1 -0
  266. package/src/adapters/tool-bridge.ts +1 -1
  267. package/src/adapters/tools.ts +1 -1
  268. package/src/advanced/feedback.ts +1 -2
  269. package/src/advanced/generator.ts +4 -3
  270. package/src/boilerplate/free-design-prompt.ts +7 -0
  271. package/src/boilerplate/generate.ts +18 -5
  272. package/src/boilerplate/hard-sections.ts +8 -3
  273. package/src/boilerplate/react-hooks.ts +56 -0
  274. package/src/boilerplate/system-prompt.ts +12 -3
  275. package/src/check/run-tier0.ts +233 -8
  276. package/src/check/type-checker.ts +128 -16
  277. package/src/coding-agent/tools.ts +26 -3
  278. package/src/create-ui-generator.ts +4 -2
  279. package/src/design-mode.ts +4 -9
  280. package/src/evaluation/axis-checks/checks/state-merge.ts +3 -5
  281. package/src/evaluation/axis-checks/checks/state-payload.ts +1 -28
  282. package/src/evaluation/axis-checks/checks/tint.ts +197 -0
  283. package/src/evaluation/axis-checks/helpers.ts +246 -0
  284. package/src/evaluation/axis-checks/registry.ts +2 -0
  285. package/src/evaluation/criteria/__fixtures__/edge-v2-draw2.json +4629 -0
  286. package/src/evaluation/criteria/bank.ts +1 -1
  287. package/src/evaluation/criteria/edge-instruments.ts +14 -0
  288. package/src/evaluation/criteria/edge-probe-v2.ts +352 -0
  289. package/src/evaluation/criteria/edge-v2.ts +242 -0
  290. package/src/evaluation/criteria/resolve.ts +24 -5
  291. package/src/evaluation/evaluator.ts +2 -2
  292. package/src/evaluation/index.ts +3 -5
  293. package/src/evaluation/llm-evaluator.ts +2 -2
  294. package/src/evaluation/mcp-server.ts +0 -50
  295. package/src/evaluation/types-public.ts +6 -1
  296. package/src/evaluation/visual-evaluator.ts +162 -31
  297. package/src/harness/check/runtime-render/index.ts +28 -4
  298. package/src/harness/check/runtime-render/render-check.ts +20 -21
  299. package/src/harness/claude-agent-sdk-loader.ts +93 -0
  300. package/src/harness/claude-code-login-query.ts +1 -1
  301. package/src/harness/coding/assemble-result.ts +1 -0
  302. package/src/harness/coding/dupe-break.ts +70 -0
  303. package/src/harness/coding/generate-task-runner.ts +6 -1
  304. package/src/harness/coding/run-coding-turn.ts +59 -1
  305. package/src/harness/coding/run-eval-round.ts +9 -0
  306. package/src/harness/llm-router.ts +50 -2
  307. package/src/harness/result-types.ts +12 -0
  308. package/src/harness/runtime.ts +17 -0
  309. package/src/index.ts +10 -1
  310. package/src/providers/anthropic-tool-call.ts +263 -0
  311. package/src/providers/index.ts +13 -0
  312. package/src/tools/get-primitives-ts.ts +1 -1
  313. package/src/tools/render-check.ts +4 -4
  314. package/src/validation/primitives.ts +2 -1
  315. package/src/evaluation/loop.ts +0 -218
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/openrouter/raw.ts"],"names":[],"mappings":"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","file":"raw-C6KBH5I3.js","sourcesContent":["// packages/ui-gen/src/adapters/openrouter/raw.ts\n//\n// OpenRouter adapter using direct fetch() — no OpenAI SDK dependency.\n// Uses OpenAI-compatible chat completions API with OpenRouter extensions\n// for caching and extended thinking.\n\nimport { GeneratorAdapter, hasCredentials } from '../base';\nimport type { AdapterConfig, GenerateParams } from '../base';\nimport type { AdapterResult, ToolDefinition, ProviderName, AdapterMode } from '../types';\nimport { zodToJsonSchema } from '../tool-bridge';\nimport {\n createCapture,\n captureSourceCode,\n captureCompiledCode,\n captureMarkers,\n extractCodeFromText,\n compileLastResort,\n} from '../extract-code';\nimport type { JsonObject } from '@ggui-ai/protocol';\nimport { OpenRouterClient } from './client';\nimport type { OpenRouterMessage, OpenRouterTool, OpenRouterChatResponse } from './types';\n\nexport class OpenRouterRawAdapter extends GeneratorAdapter {\n readonly provider: ProviderName = 'openrouter';\n readonly mode: AdapterMode = 'raw';\n readonly displayName = 'OpenRouter (Raw API)';\n\n private client: OpenRouterClient | null = null;\n\n constructor(config: AdapterConfig = {}) {\n super(config);\n }\n\n isAvailable(): boolean {\n return hasCredentials(this.config, 'OPENROUTER_API_KEY');\n }\n\n async generate(params: GenerateParams): Promise<AdapterResult> {\n const startTime = Date.now();\n\n if (!this.client) {\n this.client = new OpenRouterClient({\n apiKey: this.config.apiKey || process.env.OPENROUTER_API_KEY!,\n });\n }\n\n const tools = params.tools.map(toOpenRouterTool);\n const capture = createCapture();\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let cacheCreationTokens: number | undefined;\n let cacheReadTokens: number | undefined;\n let turnsUsed = 0;\n let allTextOutput = '';\n\n // Detect model capabilities for cache/thinking support\n const modelId = params.model;\n const isAnthropicModel = modelId.includes('anthropic/') || modelId.includes('claude');\n\n // Build initial messages with optional cache_control\n const systemMessage: OpenRouterMessage = isAnthropicModel\n ? {\n role: 'system',\n content: [{ type: 'text', text: params.systemPrompt, cache_control: { type: 'ephemeral' } }],\n }\n : { role: 'system', content: params.systemPrompt };\n\n const messages: OpenRouterMessage[] = [\n systemMessage,\n { role: 'user', content: params.userPrompt },\n ];\n\n // Agentic loop\n for (let turn = 0; turn < params.maxTurns; turn++) {\n turnsUsed = turn + 1;\n\n const response: OpenRouterChatResponse = await this.client.chatCompletion({\n model: modelId,\n messages,\n tools: tools.length > 0 ? tools : undefined,\n tool_choice: tools.length > 0 ? 'auto' : undefined,\n max_tokens: 16384,\n });\n\n // Track tokens\n if (response.usage) {\n totalInputTokens += response.usage.prompt_tokens;\n totalOutputTokens += response.usage.completion_tokens;\n if (response.usage.cache_creation_input_tokens) {\n cacheCreationTokens = (cacheCreationTokens ?? 0) + response.usage.cache_creation_input_tokens;\n }\n if (response.usage.cache_read_input_tokens) {\n cacheReadTokens = (cacheReadTokens ?? 0) + response.usage.cache_read_input_tokens;\n }\n }\n\n const choice = response.choices[0];\n if (!choice) break;\n\n // Collect text output\n if (choice.message.content) {\n allTextOutput += choice.message.content + '\\n';\n captureMarkers(capture, choice.message.content);\n }\n\n const toolCalls = choice.message.tool_calls;\n if (!toolCalls || toolCalls.length === 0) break;\n\n // Add assistant message with tool_calls to conversation\n messages.push({\n role: 'assistant',\n content: choice.message.content,\n tool_calls: toolCalls,\n });\n\n // Execute tools and add results\n for (const tc of toolCalls) {\n const toolDef = params.tools.find((t) => t.name === tc.function.name);\n if (!toolDef) {\n messages.push({\n role: 'tool',\n tool_call_id: tc.id,\n content: JSON.stringify({ error: `Tool '${tc.function.name}' not found` }),\n });\n continue;\n }\n\n let args: JsonObject = {};\n try { args = JSON.parse(tc.function.arguments || '{}') as JsonObject; } catch { /* empty */ }\n\n captureSourceCode(capture, tc.function.name, args);\n\n const result = await toolDef.handler(args);\n captureCompiledCode(capture, tc.function.name, result);\n\n messages.push({\n role: 'tool',\n tool_call_id: tc.id,\n content: result.content[0]?.text ?? '',\n });\n }\n }\n\n // Fallback: extract code from text output\n if (!capture.compiledCode && allTextOutput) {\n captureMarkers(capture, allTextOutput);\n await extractCodeFromText(allTextOutput, params.tools, capture);\n }\n\n // Last resort: compile sourceCode directly\n if (!capture.compiledCode) {\n await compileLastResort(capture, allTextOutput);\n }\n\n if (!capture.compiledCode) {\n throw new Error('OpenRouter raw adapter: no compiled code produced after all turns');\n }\n\n return {\n compiledCode: capture.compiledCode,\n sourceCode: capture.sourceCode,\n stream: capture.stream,\n generatorMeta: capture.generatorMeta,\n tokens: {\n input: totalInputTokens,\n output: totalOutputTokens,\n total: totalInputTokens + totalOutputTokens,\n },\n generationTimeMs: Date.now() - startTime,\n turnsUsed,\n cacheCreationTokens,\n cacheReadTokens,\n };\n }\n}\n\n/** Convert ToolDefinition to OpenRouter tool format (OpenAI-compatible). */\nfunction toOpenRouterTool(def: ToolDefinition): OpenRouterTool {\n return {\n type: 'function',\n function: {\n name: def.name,\n description: def.description,\n parameters: zodToJsonSchema(def.inputSchema) as JsonObject,\n },\n };\n}\n"]}
@@ -0,0 +1,7 @@
1
+ export { GoogleRawAdapter } from './chunk-6VDRWAP6.js';
2
+ import './chunk-YJZTUY7B.js';
3
+ import './chunk-XRBCRKA2.js';
4
+ import './chunk-7QE3AHLE.js';
5
+ import './chunk-G3PMV62Z.js';
6
+ //# sourceMappingURL=raw-FXSBXQTZ.js.map
7
+ //# sourceMappingURL=raw-FXSBXQTZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"raw-FXSBXQTZ.js"}
@@ -0,0 +1,8 @@
1
+ export { ClaudeRawAdapter } from './chunk-3ZSSDV3L.js';
2
+ import './chunk-YJZTUY7B.js';
3
+ import './chunk-XRBCRKA2.js';
4
+ import './chunk-QLXXPGTV.js';
5
+ import './chunk-7QE3AHLE.js';
6
+ import './chunk-G3PMV62Z.js';
7
+ //# sourceMappingURL=raw-MURDUPGK.js.map
8
+ //# sourceMappingURL=raw-MURDUPGK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"raw-MURDUPGK.js"}
@@ -0,0 +1,8 @@
1
+ export { OpenAiRawAdapter } from './chunk-AOU33EFS.js';
2
+ import './chunk-YJZTUY7B.js';
3
+ import './chunk-XRBCRKA2.js';
4
+ import './chunk-OVLH5ICV.js';
5
+ import './chunk-7QE3AHLE.js';
6
+ import './chunk-G3PMV62Z.js';
7
+ //# sourceMappingURL=raw-T3GW3UVX.js.map
8
+ //# sourceMappingURL=raw-T3GW3UVX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"raw-T3GW3UVX.js"}
@@ -0,0 +1,5 @@
1
+ export { DEFAULT_RENDER_CHECK_HOST_BOUNDS, mapSandboxResultToCheckResult, resolveRenderCheckHostBounds, resolveWorkerSpawn, runRenderCheckViaWorker } from './chunk-FXRHWYIQ.js';
2
+ import './chunk-FLRNMZV2.js';
3
+ import './chunk-G3PMV62Z.js';
4
+ //# sourceMappingURL=render-check-host-ZNIS6BJ5.js.map
5
+ //# sourceMappingURL=render-check-host-ZNIS6BJ5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"render-check-host-ZNIS6BJ5.js"}
@@ -0,0 +1,6 @@
1
+ export { GoogleSdkAdapter, runAdkLoop } from './chunk-PBOYHGSD.js';
2
+ import './chunk-YJZTUY7B.js';
3
+ import './chunk-XRBCRKA2.js';
4
+ import './chunk-G3PMV62Z.js';
5
+ //# sourceMappingURL=sdk-4JNSDNSR.js.map
6
+ //# sourceMappingURL=sdk-4JNSDNSR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"sdk-4JNSDNSR.js"}
@@ -0,0 +1,7 @@
1
+ export { OpenAiSdkAdapter } from './chunk-PJFH7QWA.js';
2
+ import './chunk-YJZTUY7B.js';
3
+ import './chunk-XRBCRKA2.js';
4
+ import './chunk-OVLH5ICV.js';
5
+ import './chunk-G3PMV62Z.js';
6
+ //# sourceMappingURL=sdk-DIVJMHCX.js.map
7
+ //# sourceMappingURL=sdk-DIVJMHCX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"sdk-DIVJMHCX.js"}
@@ -0,0 +1,7 @@
1
+ export { ClaudeSdkAdapter } from './chunk-XGLO5LGG.js';
2
+ import './chunk-XRBCRKA2.js';
3
+ import './chunk-GAJI7Y3P.js';
4
+ import './chunk-JDH5EGNZ.js';
5
+ import './chunk-G3PMV62Z.js';
6
+ //# sourceMappingURL=sdk-QRJOCRTS.js.map
7
+ //# sourceMappingURL=sdk-QRJOCRTS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"sdk-QRJOCRTS.js"}
@@ -0,0 +1,123 @@
1
+ import './chunk-G3PMV62Z.js';
2
+
3
+ // src/coding-agent/tag-balance.ts
4
+ function countTagBalance(code) {
5
+ const counts = /* @__PURE__ */ new Map();
6
+ const bump = (name, key) => {
7
+ const cur = counts.get(name) ?? { opens: 0, closes: 0, selfCloses: 0 };
8
+ cur[key]++;
9
+ counts.set(name, cur);
10
+ };
11
+ const selfCloseRegex = /<([A-Z]\w*)\b[^>]*?\/>/g;
12
+ const selfCloseSpans = [];
13
+ let m;
14
+ while ((m = selfCloseRegex.exec(code)) !== null) {
15
+ bump(m[1], "selfCloses");
16
+ selfCloseSpans.push([m.index, m.index + m[0].length]);
17
+ }
18
+ const inSelfClose = (idx) => selfCloseSpans.some(([a, b]) => idx >= a && idx < b);
19
+ const openRegex = /<([A-Z]\w*)(?=[\s>/])/g;
20
+ while ((m = openRegex.exec(code)) !== null) {
21
+ if (inSelfClose(m.index)) continue;
22
+ const prevChar = code[m.index - 1];
23
+ if (prevChar === "/") continue;
24
+ if (prevChar !== void 0 && /\w/.test(prevChar)) continue;
25
+ bump(m[1], "opens");
26
+ }
27
+ const closeRegex = /<\/([A-Z]\w*)\s*>/g;
28
+ while ((m = closeRegex.exec(code)) !== null) {
29
+ bump(m[1], "closes");
30
+ }
31
+ return counts;
32
+ }
33
+ function computeTagDeltas(original, replacement) {
34
+ const origCounts = countTagBalance(original);
35
+ const replCounts = countTagBalance(replacement);
36
+ const tags = /* @__PURE__ */ new Set([...origCounts.keys(), ...replCounts.keys()]);
37
+ const deltas = [];
38
+ for (const tag of tags) {
39
+ const o = origCounts.get(tag) ?? { opens: 0, closes: 0};
40
+ const r = replCounts.get(tag) ?? { opens: 0, closes: 0};
41
+ const opensDelta = r.opens - o.opens;
42
+ const closesDelta = r.closes - o.closes;
43
+ const netDelta = opensDelta - closesDelta;
44
+ if (netDelta !== 0) {
45
+ deltas.push({ tag, opensDelta, closesDelta, netDelta });
46
+ }
47
+ }
48
+ return deltas;
49
+ }
50
+ function checkPatchTagBalance(sourceBefore, changes) {
51
+ const sourceLines = sourceBefore.split("\n");
52
+ const totalDeltas = /* @__PURE__ */ new Map();
53
+ const perChange = [];
54
+ for (const change of changes) {
55
+ const origLines = sourceLines.slice(
56
+ Math.max(0, change.startLine - 1),
57
+ change.endLine
58
+ );
59
+ const original = origLines.join("\n");
60
+ const replacement = change.code.join("\n");
61
+ const deltas = computeTagDeltas(original, replacement);
62
+ if (deltas.length > 0) {
63
+ perChange.push({
64
+ range: `${change.startLine}-${change.endLine}`,
65
+ deltas
66
+ });
67
+ }
68
+ for (const d of deltas) {
69
+ const cur = totalDeltas.get(d.tag) ?? { opensDelta: 0, closesDelta: 0 };
70
+ cur.opensDelta += d.opensDelta;
71
+ cur.closesDelta += d.closesDelta;
72
+ totalDeltas.set(d.tag, cur);
73
+ }
74
+ }
75
+ const totals = [];
76
+ for (const [tag, { opensDelta, closesDelta }] of totalDeltas) {
77
+ const netDelta = opensDelta - closesDelta;
78
+ if (netDelta !== 0) {
79
+ totals.push({ tag, opensDelta, closesDelta, netDelta });
80
+ }
81
+ }
82
+ return {
83
+ imbalanced: totals.length > 0,
84
+ totals,
85
+ perChange
86
+ };
87
+ }
88
+ function formatImbalanceMessage(report) {
89
+ const lines = [];
90
+ lines.push(
91
+ "PATCH_INVALID: patch leaves file structurally unbalanced (tag open/close counts don't match)."
92
+ );
93
+ lines.push("");
94
+ lines.push("Net imbalance across your patch (totals across all changes):");
95
+ for (const d of report.totals) {
96
+ if (d.netDelta > 0) {
97
+ lines.push(
98
+ ` \u2022 ${d.netDelta} extra <${d.tag}> open(s) \u2014 you opened ${d.opensDelta >= 0 ? "+" : ""}${d.opensDelta} and closed ${d.closesDelta >= 0 ? "+" : ""}${d.closesDelta}. Add ${d.netDelta} </${d.tag}> at the matching nesting level.`
99
+ );
100
+ } else {
101
+ lines.push(
102
+ ` \u2022 ${-d.netDelta} extra </${d.tag}> close(s) \u2014 you opened ${d.opensDelta >= 0 ? "+" : ""}${d.opensDelta} and closed ${d.closesDelta >= 0 ? "+" : ""}${d.closesDelta}. Remove ${-d.netDelta} </${d.tag}> or add ${-d.netDelta} <${d.tag}> at the matching nesting level.`
103
+ );
104
+ }
105
+ }
106
+ if (report.perChange.length > 1) {
107
+ lines.push("");
108
+ lines.push("Per-change breakdown (to pinpoint which change is off):");
109
+ for (const { range, deltas } of report.perChange) {
110
+ const summary = deltas.map((d) => `${d.tag} net=${d.netDelta >= 0 ? "+" : ""}${d.netDelta}`).join(", ");
111
+ lines.push(` lines ${range}: ${summary}`);
112
+ }
113
+ }
114
+ lines.push("");
115
+ lines.push(
116
+ "Re-read the current file around these ranges and submit a corrected patch that preserves tag balance."
117
+ );
118
+ return lines.join("\n");
119
+ }
120
+
121
+ export { checkPatchTagBalance, computeTagDeltas, countTagBalance, formatImbalanceMessage };
122
+ //# sourceMappingURL=tag-balance-CTHCTRJ7.js.map
123
+ //# sourceMappingURL=tag-balance-CTHCTRJ7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/coding-agent/tag-balance.ts"],"names":[],"mappings":"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","file":"tag-balance-CTHCTRJ7.js","sourcesContent":["// packages/ui-gen/src/coding-agent/tag-balance.ts\n//\n// Structural-diff preflight for JSX patches. Catches the 90% of tag-mismatch\n// PATCH_INVALIDs where the error manifests OUTSIDE the patched range because\n// the replacement body changed the open/close tag balance.\n//\n// Diagnostic data (2026-04-14 baseline, n=72, 39 tag-mismatch errors):\n// - 4/39 (10%) inside the patch range — LLM wrote a direct mismatch,\n// caught today by esbuild.\n// - 35/39 (90%) outside the patch range — the patch shifted tag counts\n// upstream/downstream, leaving the file structurally broken. esbuild\n// complains about a line the LLM didn't touch; LLM retries targeting\n// that line; pattern repeats across turns (\"chasing a moving target\").\n//\n// This module counts per-tag (opens, closes, self-closes) in the original\n// range vs the replacement body and reports imbalance with an actionable\n// message BEFORE apply: \"Your replacement body has 3 <Stack> opens but 2\n// </Stack> closes — you're leaving 1 <Stack> unclosed.\"\n//\n// Cost: pure regex, sub-ms per patch. Runs before esbuild so we save the\n// esbuild round-trip on the dominant failure class.\n\nexport interface TagBalance {\n readonly opens: number;\n readonly closes: number;\n readonly selfCloses: number;\n}\n\n/** Count open, close, and self-closing tags for each PascalCase JSX element.\n * Only tags that start with an uppercase letter are counted (React convention\n * for components; lowercase `<div>` etc. are HTML and not our concern). */\nexport function countTagBalance(code: string): Map<string, TagBalance> {\n const counts = new Map<string, { opens: number; closes: number; selfCloses: number }>();\n const bump = (name: string, key: \"opens\" | \"closes\" | \"selfCloses\") => {\n const cur = counts.get(name) ?? { opens: 0, closes: 0, selfCloses: 0 };\n cur[key]++;\n counts.set(name, cur);\n };\n\n // Self-closing first so we can exclude their ranges from the open-tag pass.\n // Pattern: `<Tag ... />` — greedy-match attributes up to the `/>`.\n // JSX attributes can contain `>` inside strings; we don't worry about that\n // here because the regex is conservative (bails on `>` that isn't `/>`).\n const selfCloseRegex = /<([A-Z]\\w*)\\b[^>]*?\\/>/g;\n const selfCloseSpans: Array<[number, number]> = [];\n let m: RegExpExecArray | null;\n while ((m = selfCloseRegex.exec(code)) !== null) {\n bump(m[1]!, \"selfCloses\");\n selfCloseSpans.push([m.index, m.index + m[0].length]);\n }\n\n const inSelfClose = (idx: number): boolean =>\n selfCloseSpans.some(([a, b]) => idx >= a && idx < b);\n\n // Open tags: `<Tag` followed by space, `>`, or newline; NOT `<Tag/>`\n // (self-close, already counted) and NOT `</Tag` (close). We also need to\n // EXCLUDE TypeScript generics like `Promise<Foo>`, `useState<Foo>()`,\n // `Array<Bar>` — those look identical to JSX opens by regex but aren't.\n //\n // Heuristic: JSX opens are preceded by an expression-context char\n // (whitespace, `(`, `{`, `>`, `,`, `:`, `?`, `&&`, `||`, `=`, `return`, start-of-string).\n // TS generics are preceded by an identifier char (alphanumeric or `_`).\n // This catches `Promise<Foo>` (preceded by `e`) and `useState<T>`\n // (preceded by `e`) without false-positive-ing JSX inside expressions.\n const openRegex = /<([A-Z]\\w*)(?=[\\s>/])/g;\n while ((m = openRegex.exec(code)) !== null) {\n if (inSelfClose(m.index)) continue; // already counted\n const prevChar = code[m.index - 1];\n if (prevChar === \"/\") continue; // closing tag `</`\n // TS generic guard: if the char before `<` is a word char (alnum/_),\n // this is a type parameter list, not JSX.\n if (prevChar !== undefined && /\\w/.test(prevChar)) continue;\n bump(m[1]!, \"opens\");\n }\n\n // Close tags: `</Tag>`. Same generic guard — skip `Promise</Foo>` style\n // (doesn't exist in practice but be defensive): `</` preceded by a word\n // char is essentially impossible in valid TS (would be `<</`), but we\n // still check for safety.\n const closeRegex = /<\\/([A-Z]\\w*)\\s*>/g;\n while ((m = closeRegex.exec(code)) !== null) {\n bump(m[1]!, \"closes\");\n }\n\n return counts;\n}\n\nexport interface TagDelta {\n readonly tag: string;\n readonly opensDelta: number;\n readonly closesDelta: number;\n /** opensDelta - closesDelta. Non-zero = structural imbalance. */\n readonly netDelta: number;\n}\n\n/** Compute per-tag delta between replacement and original range.\n * `netDelta > 0` → replacement adds N unclosed opens.\n * `netDelta < 0` → replacement adds N stray closes. */\nexport function computeTagDeltas(\n original: string,\n replacement: string,\n): TagDelta[] {\n const origCounts = countTagBalance(original);\n const replCounts = countTagBalance(replacement);\n const tags = new Set([...origCounts.keys(), ...replCounts.keys()]);\n const deltas: TagDelta[] = [];\n for (const tag of tags) {\n const o = origCounts.get(tag) ?? { opens: 0, closes: 0, selfCloses: 0 };\n const r = replCounts.get(tag) ?? { opens: 0, closes: 0, selfCloses: 0 };\n const opensDelta = r.opens - o.opens;\n const closesDelta = r.closes - o.closes;\n const netDelta = opensDelta - closesDelta;\n if (netDelta !== 0) {\n deltas.push({ tag, opensDelta, closesDelta, netDelta });\n }\n }\n return deltas;\n}\n\nexport interface ChangeForBalance {\n readonly startLine: number;\n readonly endLine: number;\n readonly code: readonly string[];\n}\n\nexport interface ImbalanceReport {\n readonly imbalanced: boolean;\n /** Per-tag net imbalance summed across ALL changes in the patch. */\n readonly totals: TagDelta[];\n /** Per-change per-tag deltas — for pinpointing which change is off. */\n readonly perChange: Array<{ readonly range: string; readonly deltas: TagDelta[] }>;\n}\n\n/** Compute tag-balance deltas across a multi-change patch. Returns an\n * imbalance report if the net balance for any tag is non-zero. */\nexport function checkPatchTagBalance(\n sourceBefore: string,\n changes: readonly ChangeForBalance[],\n): ImbalanceReport {\n const sourceLines = sourceBefore.split(\"\\n\");\n const totalDeltas = new Map<string, { opensDelta: number; closesDelta: number }>();\n const perChange: Array<{ range: string; deltas: TagDelta[] }> = [];\n\n for (const change of changes) {\n // 1-indexed, inclusive range — same convention as esbuild error line and\n // the existing patch engine.\n const origLines = sourceLines.slice(\n Math.max(0, change.startLine - 1),\n change.endLine,\n );\n const original = origLines.join(\"\\n\");\n const replacement = change.code.join(\"\\n\");\n const deltas = computeTagDeltas(original, replacement);\n if (deltas.length > 0) {\n perChange.push({\n range: `${change.startLine}-${change.endLine}`,\n deltas,\n });\n }\n for (const d of deltas) {\n const cur = totalDeltas.get(d.tag) ?? { opensDelta: 0, closesDelta: 0 };\n cur.opensDelta += d.opensDelta;\n cur.closesDelta += d.closesDelta;\n totalDeltas.set(d.tag, cur);\n }\n }\n\n const totals: TagDelta[] = [];\n for (const [tag, { opensDelta, closesDelta }] of totalDeltas) {\n const netDelta = opensDelta - closesDelta;\n if (netDelta !== 0) {\n totals.push({ tag, opensDelta, closesDelta, netDelta });\n }\n }\n\n return {\n imbalanced: totals.length > 0,\n totals,\n perChange,\n };\n}\n\n/** Format an ImbalanceReport as an actionable PATCH_INVALID message. */\nexport function formatImbalanceMessage(report: ImbalanceReport): string {\n const lines: string[] = [];\n lines.push(\n \"PATCH_INVALID: patch leaves file structurally unbalanced (tag open/close counts don't match).\",\n );\n lines.push(\"\");\n lines.push(\"Net imbalance across your patch (totals across all changes):\");\n for (const d of report.totals) {\n if (d.netDelta > 0) {\n lines.push(\n ` • ${d.netDelta} extra <${d.tag}> open(s) — you opened ${d.opensDelta >= 0 ? \"+\" : \"\"}${d.opensDelta} and closed ${d.closesDelta >= 0 ? \"+\" : \"\"}${d.closesDelta}. Add ${d.netDelta} </${d.tag}> at the matching nesting level.`,\n );\n } else {\n lines.push(\n ` • ${-d.netDelta} extra </${d.tag}> close(s) — you opened ${d.opensDelta >= 0 ? \"+\" : \"\"}${d.opensDelta} and closed ${d.closesDelta >= 0 ? \"+\" : \"\"}${d.closesDelta}. Remove ${-d.netDelta} </${d.tag}> or add ${-d.netDelta} <${d.tag}> at the matching nesting level.`,\n );\n }\n }\n if (report.perChange.length > 1) {\n lines.push(\"\");\n lines.push(\"Per-change breakdown (to pinpoint which change is off):\");\n for (const { range, deltas } of report.perChange) {\n const summary = deltas\n .map((d) => `${d.tag} net=${d.netDelta >= 0 ? \"+\" : \"\"}${d.netDelta}`)\n .join(\", \");\n lines.push(` lines ${range}: ${summary}`);\n }\n }\n lines.push(\"\");\n lines.push(\n \"Re-read the current file around these ranges and submit a corrected patch that preserves tag balance.\",\n );\n return lines.join(\"\\n\");\n}\n"]}