@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 @@
1
+ {"version":3,"sources":["../src/adapters/provider-router.ts","../src/harness/claude-code-login-query.ts","../src/harness/llm-router.ts"],"names":[],"mappings":"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","file":"chunk-O2YC6XDC.js","sourcesContent":["// packages/ui-gen/src/adapters/provider-router.ts\n//\n// Provider router for multi-provider BYOK support. Determines how to\n// route LLM requests based on the typed `LlmRoute` discriminator and\n// API-key availability.\n//\n// The previous `getUpstreamModelId` strip + `UPSTREAM_MAP` are gone:\n// the typed `LlmRoute` (slice #43) guarantees `route.model` is\n// wire-canonical at construction time, so there is no LiteLLM prefix\n// to strip at this boundary. `getBedrockModelId` stays — the\n// \"anthropic route + bedrock IAM\" mixed-mode escape hatch (a hosted deployment's\n// legacy) still needs the wire-canonical anthropic id → cross-region\n// profile id upcast.\n\nimport { CLAUDE_CODE_LOGIN_CREDENTIAL, PROVIDER_KEY_ENV_NAMES } from './claude/claude-code-login';\nimport type { LlmRoute } from '@ggui-ai/protocol';\n\n/**\n * Map a wire-canonical Anthropic model id (or already-bedrock id) to\n * the AWS Bedrock cross-region inference profile id. Used by the\n * mixed-mode `anthropic` route + bedrock-IAM fallback path in\n * {@link resolveRoute} (a hosted deployment's legacy) and the analogous branch in\n * `harness/llm-router.ts::AnthropicAgent.resolveModel`.\n *\n * Operators picking the bedrock route explicitly (slice #43 Phase 4)\n * pass the cross-region id directly — this helper is purely the\n * fallback escape hatch.\n */\nexport function getBedrockModelId(model: string): string {\n const BEDROCK_MAP: Record<string, string> = {\n 'anthropic/claude-haiku-4-5': 'us.anthropic.claude-haiku-4-5-20251001-v1:0',\n 'anthropic/claude-haiku-5-5': 'us.anthropic.claude-haiku-5-5', // listed ACTIVE in us-east-1 (ggui#1743)\n 'anthropic/claude-sonnet-4-6': 'us.anthropic.claude-sonnet-4-6',\n 'anthropic/claude-opus-4-6': 'us.anthropic.claude-opus-4-6-v1:0',\n // Claude 5-family (ggui#706, strings verified 2026-09-02 against\n // platform.claude.com; Bedrock base form `anthropic.<id>`, upcast to\n // the cross-region profile). Explicit so the ids are pinned by test,\n // not merely reachable through the generic fallback below.\n 'anthropic/claude-fable-5-1': 'us.anthropic.claude-fable-5-1',\n 'anthropic/claude-opus-5': 'us.anthropic.claude-opus-5',\n 'anthropic/claude-sonnet-5': 'us.anthropic.claude-sonnet-5',\n // Legacy (still available; registry state `legacy`, not deprecated).\n 'anthropic/claude-fable-5': 'us.anthropic.claude-fable-5',\n };\n // Normalize the Bedrock dot-form opt-in (e.g. `anthropic.claude-haiku-4-5`,\n // produced when a route resolver strips a `bedrock/` opt-in\n // prefix) to the Anthropic slash form. Both spellings should resolve to\n // the same cross-region inference profile id — without this, the dot\n // form would skip the BEDROCK_MAP hit, fall through the `^anthropic\\/`\n // strip (which is a no-op for the dot form), and re-prepend\n // `us.anthropic.` to produce a double-`anthropic.` id that Bedrock\n // rejects with 400 (regression seen live on 2026-05-25).\n const normalized = model.replace(/^anthropic\\./, 'anthropic/');\n if (BEDROCK_MAP[normalized]) return BEDROCK_MAP[normalized];\n if (normalized.startsWith('us.anthropic.') || normalized.startsWith('arn:')) {\n return normalized;\n }\n const stripped = normalized.replace(/^anthropic\\//, '');\n return `us.anthropic.${stripped}`;\n}\n\nexport interface RoutingDecision {\n /**\n * Named only for the Claude Code login path (ggui#1185): the caller passed\n * {@link CLAUDE_CODE_LOGIN_CREDENTIAL} as the key, every provider key is\n * cleared from the env below, and the adapter pins the SDK options that keep\n * the run tool-less, config-less and non-bare. Absent ⇒ key-based auth.\n */\n readonly auth?: 'claude-code-login';\n /**\n * Upstream model id the dispatch adapter will pass to the provider\n * SDK. For most routes this is `route.model` verbatim — the typed\n * `LlmRoute` (slice #43) carries the wire-canonical id, so no\n * transformation is needed. The exception is the mixed-mode\n * \"anthropic route + bedrock IAM fallback\" branch, which upcasts\n * the wire-canonical Anthropic id to the corresponding Bedrock\n * cross-region inference profile id via {@link getBedrockModelId}.\n */\n readonly model: string;\n /**\n * Env-var mutations the caller MUST apply to `process.env` before\n * invoking the dispatch adapter. `undefined` values are deletions\n * (the wrong provider's stale key must be cleared so the dispatch\n * doesn't accidentally fire against it). See {@link applyRouteToEnv}.\n */\n readonly env: Record<string, string | undefined>;\n}\n\nexport interface RoutingInput {\n /** Typed `(provider, model)` route — model is wire-canonical. */\n readonly route: LlmRoute;\n /** API key for byok-capable providers; ignored for `bedrock`. */\n readonly apiKey?: string;\n /** Current env snapshot — feeds the anthropic mixed-mode branch. */\n readonly env: Record<string, string | undefined>;\n}\n\n/**\n * Sibling-provider env vars that MUST be cleared for every non-self\n * route. Centralized so the per-provider branches below stay\n * symmetric — a single missing entry would let a stale key leak into\n * the next render (e.g. an OpenRouter route inheriting a previous\n * call's `OPENAI_API_KEY` and firing the wrong adapter).\n */\nconst SIBLING_ENV_KEYS = [\n 'ANTHROPIC_API_KEY',\n 'ANTHROPIC_BASE_URL',\n 'CLAUDE_CODE_USE_BEDROCK',\n 'OPENAI_API_KEY',\n 'GEMINI_API_KEY',\n 'GOOGLE_API_KEY',\n 'OPENROUTER_API_KEY',\n] as const;\n\nfunction clearSiblings(\n keep: ReadonlySet<(typeof SIBLING_ENV_KEYS)[number]>,\n): Record<string, undefined> {\n const out: Record<string, undefined> = {};\n for (const k of SIBLING_ENV_KEYS) {\n if (!keep.has(k)) out[k] = undefined;\n }\n return out;\n}\n\n/**\n * Determine the routing strategy for a generation request. Pure\n * function over `(route, apiKey, env)` — returns the upstream model\n * id (usually `route.model` verbatim) and the env-var mutations the\n * caller must apply before dispatch.\n *\n * Dispatch is on `route.provider`:\n *\n * - `openai` — direct OpenAI API (sets `OPENAI_API_KEY`).\n * - `google` — direct Gemini API (sets `GEMINI_API_KEY` + `GOOGLE_API_KEY`).\n * - `openrouter` — direct OpenRouter API (sets `OPENROUTER_API_KEY`).\n * - `bedrock` — AWS Bedrock via host IAM (sets `CLAUDE_CODE_USE_BEDROCK=1`,\n * no API key in flight; model passes verbatim).\n * - `anthropic` — three-way fallback chain:\n * 1. With `apiKey` → direct Anthropic API.\n * 2. Without `apiKey` AND explicit `env.CLAUDE_CODE_USE_BEDROCK === '1'`\n * (or no `env.ANTHROPIC_API_KEY`) → mixed-mode bedrock fallback\n * (model upcast to cross-region profile via `getBedrockModelId`).\n * A hosted deployment's legacy escape hatch; the Phase 4 strict-fail\n * prevents end-users from reaching this branch implicitly.\n * 3. Otherwise → direct Anthropic API with whatever\n * `ANTHROPIC_API_KEY` is already in `env`.\n *\n * For non-Anthropic non-Bedrock providers, an `apiKey` is REQUIRED —\n * there's no IAM-style fallback. Callers that don't have a key MUST\n * surface a \"no API key\" envelope to their agent before reaching the\n * dispatch path; throwing here is defense in depth.\n */\nexport function resolveRoute(input: RoutingInput): RoutingDecision {\n const { route, apiKey, env } = input;\n if (apiKey === CLAUDE_CODE_LOGIN_CREDENTIAL && route.provider !== 'anthropic') {\n throw new Error(\n `${route.provider}:${route.model} cannot use the claude-code-login credential — ` +\n `the machine's Claude Code login authenticates the Claude Code binary only; ` +\n `pick an anthropic route or supply a ${route.provider} API key.`,\n );\n }\n\n switch (route.provider) {\n case 'openai': {\n if (!apiKey) {\n throw new Error(\n `openai:${route.model} requires an API key. ` +\n `Set 'apiKey' on the RoutingInput (BYOK) or supply your key ` +\n `via your dispatch layer.`,\n );\n }\n return {\n model: route.model,\n env: {\n OPENAI_API_KEY: apiKey,\n ...clearSiblings(new Set(['OPENAI_API_KEY'])),\n },\n };\n }\n\n case 'google': {\n if (!apiKey) {\n throw new Error(\n `google:${route.model} requires an API key. ` +\n `Set 'apiKey' on the RoutingInput (BYOK) or supply your key ` +\n `via your dispatch layer.`,\n );\n }\n return {\n model: route.model,\n env: {\n // `harness/llm-router.ts`'s GoogleAgent reads `GEMINI_API_KEY\n // || GOOGLE_API_KEY`. Set both so either slot wins;\n // unsetting one would leave a stale value behind.\n GEMINI_API_KEY: apiKey,\n GOOGLE_API_KEY: apiKey,\n ...clearSiblings(new Set(['GEMINI_API_KEY', 'GOOGLE_API_KEY'])),\n },\n };\n }\n\n case 'openrouter': {\n if (!apiKey) {\n throw new Error(\n `openrouter:${route.model} requires an API key. ` +\n `Set 'apiKey' on the RoutingInput (BYOK) or supply your key ` +\n `via your dispatch layer.`,\n );\n }\n return {\n model: route.model,\n env: {\n OPENROUTER_API_KEY: apiKey,\n ...clearSiblings(new Set(['OPENROUTER_API_KEY'])),\n },\n };\n }\n\n case 'bedrock': {\n // IAM auth — no apiKey in flight. The model is already a\n // cross-region profile id (e.g.\n // `us.anthropic.claude-haiku-4-5-20251001-v1:0`); pass it\n // verbatim.\n return {\n model: route.model,\n env: {\n CLAUDE_CODE_USE_BEDROCK: '1',\n ...clearSiblings(new Set(['CLAUDE_CODE_USE_BEDROCK'])),\n },\n };\n }\n\n case 'anthropic': {\n if (apiKey === CLAUDE_CODE_LOGIN_CREDENTIAL) {\n // ggui#1185: no key reaches the spawned binary — it authenticates with\n // the machine's own Claude Code login. Every provider key AND every\n // sibling is cleared, because the binary prefers an env key over its\n // login and a stale one would silently take the run off this path.\n const cleared: Record<string, undefined> = {};\n for (const k of PROVIDER_KEY_ENV_NAMES) cleared[k] = undefined;\n return {\n model: route.model,\n env: { ...cleared, ...clearSiblings(new Set()) },\n auth: 'claude-code-login',\n };\n }\n if (apiKey) {\n return {\n model: route.model,\n env: {\n ANTHROPIC_API_KEY: apiKey,\n ...clearSiblings(new Set(['ANTHROPIC_API_KEY'])),\n },\n };\n }\n // Mixed-mode legacy: anthropic route + bedrock IAM fallback.\n // Escape hatch for a production deployment that authenticates via Bedrock\n // IAM and never sets `ANTHROPIC_API_KEY`.\n const explicitBedrock = env.CLAUDE_CODE_USE_BEDROCK === '1';\n const noApiKey = !env.ANTHROPIC_API_KEY;\n if (explicitBedrock || noApiKey) {\n return {\n model: getBedrockModelId(route.model),\n env: {\n CLAUDE_CODE_USE_BEDROCK: '1',\n ...clearSiblings(new Set(['CLAUDE_CODE_USE_BEDROCK'])),\n },\n };\n }\n // Anthropic via process.env.ANTHROPIC_API_KEY (no in-call key).\n return {\n model: route.model,\n env: clearSiblings(new Set(['ANTHROPIC_API_KEY'])),\n };\n }\n }\n}\n\n/**\n * Apply routing decision to an environment object.\n */\nexport function applyRouteToEnv(\n baseEnv: Record<string, string>,\n route: RoutingDecision,\n): Record<string, string> {\n const result = { ...baseEnv };\n for (const [key, value] of Object.entries(route.env)) {\n if (value === undefined) {\n delete result[key];\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n","/**\n * ggui#1185 (B) — the pure pieces of the Claude Code LOGIN client.\n *\n * `ClaudeCodeLoginAgent` (in `./llm-router.ts`, beside the raw Anthropic\n * client) turns every router call into ONE Agent SDK `query()` against\n * the machine's own Claude Code login. Everything here is the part that\n * needs no router state: how the options are assembled (the carve-out as\n * behaviour), how the router's JSON-Schema tools are offered to the\n * binary, how the stream is read back into the router's shape, and which\n * endings are success, which are \"the model chose not to call\", and\n * which are errors. It imports nothing from the router, so the router can\n * import it without an ESM cycle.\n *\n * Every behaviour pinned here was MEASURED on Agent SDK 0.3.229 before it\n * was written (design slice `docs/plans/2026-09-21-1185-b-login-client.md`):\n * - `system:init.apiKeySource` reads the literal `\"none\"` on the login\n * path — a value the SDK's `ApiKeySource` union does not name.\n * - allow-listed MCP tools bypass `canUseTool` and EXECUTE; un-listed\n * ones are asked, and a `deny` means the handler never runs.\n * - `result.usage` is the ONLY usage source; per-message usage is\n * chunk-level.\n * - `maxTurns: 1` ends the one-shot as `result:error_max_turns` after the\n * captured tool call, and the SDK then throws to re-surface the error\n * result — the result decides, the throw is redundant.\n * - a `user` message with an `image` content block reaches the model\n * intact when delivered through an `AsyncIterable<SDKUserMessage>`\n * prompt.\n */\nimport type {\n ApiKeySource,\n CanUseTool,\n McpSdkServerConfigWithInstance,\n Options,\n SDKMessage,\n SDKResultError,\n SDKResultMessage,\n SDKSystemMessage,\n SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type { MessageParam } from \"@anthropic-ai/sdk/resources\";\nimport { isRecord, type JsonObject, type JsonValue } from \"@ggui-ai/protocol\";\nimport * as z from \"zod\";\nimport type { LLMToolDef } from \"../llm.js\";\nimport {\n claudeCodeLoginQueryOptions,\n loginChildEnv,\n} from \"../adapters/claude/claude-code-login.js\";\nimport { MCP_SERVER_NAME } from \"../adapters/claude/tool-bridge.js\";\nimport { toolArgsToJsonObject } from \"../adapters/tool-bridge.js\";\n\n/** The SDK surface the login client uses — resolved once via a dynamic import. */\nexport type LoginSdk = Pick<\n typeof import(\"@anthropic-ai/claude-agent-sdk\"),\n \"query\" | \"tool\" | \"createSdkMcpServer\"\n>;\n\n/** The binary names an MCP tool `mcp__<server>__<tool>`; the router names it `<tool>`. */\nexport const MCP_TOOL_PREFIX = `mcp__${MCP_SERVER_NAME}__`;\n\nexport function stripMcpToolPrefix(name: string): string {\n return name.startsWith(MCP_TOOL_PREFIX) ? name.slice(MCP_TOOL_PREFIX.length) : name;\n}\n\n/**\n * `system:init` as the binary emits it on the login path. The SDK's\n * `ApiKeySource` union omits `\"none\"`, which is exactly the value that\n * says \"no key — the login\"; this is that type widened by that one value.\n */\nexport type MeasuredInitMessage = Omit<SDKSystemMessage, \"apiKeySource\"> & {\n readonly apiKeySource: ApiKeySource | \"none\";\n};\n\n/** The `apiKeySource` a run on the login reports. Anything else is a key. */\nexport const LOGIN_API_KEY_SOURCE = \"none\";\n\n/**\n * The binary authenticated from a KEY, not from its login: a provider key\n * reached the spawned process despite the env strip (a helper in\n * `~/.claude` settings, say). Such a run is off the login path — it is\n * stopped at `system:init`, before it spends a turn.\n */\nexport class ClaudeCodeLoginAuthError extends Error {\n readonly apiKeySource: string;\n constructor(apiKeySource: string) {\n super(\n `claude-code-login: the Claude Code binary authenticated from apiKeySource=${apiKeySource}, ` +\n `not from its login — a provider key reached the spawned process; the run was stopped before it spent a turn`\n );\n this.name = \"ClaudeCodeLoginAuthError\";\n this.apiKeySource = apiKeySource;\n }\n}\n\n/**\n * `query()` ended with a result the one-shot cannot treat as a turn:\n * an error class other than `error_max_turns`, or a `success`-shaped\n * result flagged `is_error` (an API error the binary relayed — its HTTP\n * status, when present, rides on `status`, so the router's `apiCall()`\n * retries a 429 exactly as it does for the raw client).\n */\nexport class ClaudeCodeLoginResultError extends Error {\n readonly subtype: SDKResultMessage[\"subtype\"];\n readonly errors: readonly string[];\n readonly status: number | undefined;\n constructor(\n subtype: SDKResultMessage[\"subtype\"],\n errors: readonly string[],\n status: number | undefined\n ) {\n super(\n `claude-code-login: query() ended with ${subtype}` +\n (status !== undefined ? ` (api status ${status})` : \"\") +\n `: ${errors.length > 0 ? errors.join(\"; \") : \"no detail from the binary\"}`\n );\n this.name = \"ClaudeCodeLoginResultError\";\n this.subtype = subtype;\n this.errors = errors;\n this.status = status;\n }\n}\n\n/** A tool call the binary PROPOSED (the router's shape; the harness executes it). */\nexport interface LoginToolCall {\n readonly id: string;\n readonly name: string;\n readonly input: JsonObject;\n}\n\n/**\n * What `canUseTool` saw — recorded to cross-check against the stream's\n * blocks. The input is typed as the SDK hands it to the intercept.\n */\nexport interface InterceptedToolCall {\n readonly name: string;\n readonly input: Parameters<CanUseTool>[1];\n}\n\n/**\n * The intercept: record what the binary wants to run and DENY it, so the\n * handler never runs and the harness executes the call. Never allow-list\n * a ggui tool — an allow-listed MCP tool executes without asking.\n */\nexport function createDenyingIntercept(intercepted: InterceptedToolCall[]): CanUseTool {\n return async (toolName, input) => {\n intercepted.push({ name: toolName, input });\n return {\n behavior: \"deny\",\n message: \"ggui executes tools in its harness; the binary only proposes them.\",\n };\n };\n}\n\n/** The image the visual judge sends. Mirrors the router's `VisionImageInput`. */\nexport interface LoginImageInput {\n readonly mediaType: \"image/png\" | \"image/jpeg\" | \"image/webp\";\n readonly base64: string;\n}\n\n/**\n * One `user` message carrying an image block and the text, delivered as\n * the streamed prompt shape `query()` accepts — the only way to send\n * anything but a string. Measured: a 176-byte solid-orange PNG sent this\n * way was answered \"Orange\".\n */\nexport async function* imageUserMessage(\n text: string,\n image: LoginImageInput\n): AsyncGenerator<SDKUserMessage> {\n const message: MessageParam = {\n role: \"user\",\n content: [\n {\n type: \"image\",\n source: { type: \"base64\", media_type: image.mediaType, data: image.base64 },\n },\n { type: \"text\", text },\n ],\n };\n yield { type: \"user\", message, parent_tool_use_id: null };\n}\n\n/**\n * The `query()` options of one login turn — the carve-out as behaviour:\n * the system prompt REPLACES the CLI's default (measured by sentinel);\n * `maxTurns: 1` makes it a one-shot; thinking is asked off through the\n * SDK's typed `thinking` option (the probe spelled it `thinkingConfig`,\n * untyped, and saw a thinking block anyway — whether the typed spelling\n * is honoured is Exp 009's to measure; it reports thinking tokens as\n * their own column either way); the binary inherits an allowlisted env\n * (`loginChildEnv`: no provider key, nothing else the parent merely holds,\n * ggui#1278); Layer 1's pins keep it tool-less (the CLI's\n * own tools), config-less (`~/.claude` never loads) and non-bare (the\n * login store IS read). Tools, when offered, come as ggui's in-process\n * MCP server with NO allow-list and the denying intercept.\n */\nexport function buildLoginQueryOptions(params: {\n readonly model: string;\n readonly systemPrompt: string;\n readonly env?: NodeJS.ProcessEnv;\n readonly tools?: {\n readonly server: McpSdkServerConfigWithInstance;\n readonly canUseTool: CanUseTool;\n };\n}): Options {\n return {\n model: params.model,\n systemPrompt: params.systemPrompt,\n maxTurns: 1,\n thinking: { type: \"disabled\" },\n env: loginChildEnv(params.env ?? process.env),\n ...claudeCodeLoginQueryOptions(),\n ...(params.tools !== undefined\n ? {\n mcpServers: { [MCP_SERVER_NAME]: params.tools.server },\n canUseTool: params.tools.canUseTool,\n }\n : {}),\n };\n}\n\n// ── JSON Schema → the SDK's tool() (which speaks Zod) ───────────────────\n\nconst JSON_SCHEMA_TYPES = [\n \"object\",\n \"array\",\n \"string\",\n \"number\",\n \"boolean\",\n \"null\",\n \"integer\",\n] as const;\ntype JsonSchemaType = (typeof JSON_SCHEMA_TYPES)[number];\n\nfunction isJsonSchemaType(value: JsonValue | undefined): value is JsonSchemaType {\n return typeof value === \"string\" && (JSON_SCHEMA_TYPES as readonly string[]).includes(value);\n}\n\nfunction isJsonObject(value: JsonValue): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\ntype ZodJsonSchema = z.core.JSONSchema.JSONSchema;\n\nfunction schemaAt(value: JsonValue, path: string): ZodJsonSchema | boolean {\n if (typeof value === \"boolean\") return value;\n if (!isJsonObject(value)) {\n throw new Error(\n `claude-code-login: ${path} must be a JSON-Schema object or boolean, got ${JSON.stringify(value)}`\n );\n }\n return toZodJsonSchema(value, path);\n}\n\n/**\n * The router's tools carry JSON Schema as data (`LLMToolDef.parameters`);\n * the SDK's `tool()` wants Zod. Zod 4 converts JSON Schema itself\n * (`z.fromJSONSchema`) but its input type is structured, so this is the\n * validating projection from `JsonObject` onto it: the keywords whose\n * shape matters are checked and recursed, every other keyword passes\n * through. A malformed schema is a programming error in the tool\n * definition and throws, naming the path.\n */\nexport function toZodJsonSchema(parameters: JsonObject, path = \"parameters\"): ZodJsonSchema {\n const out: ZodJsonSchema = {};\n for (const [key, value] of Object.entries(parameters)) {\n if (value === undefined) continue;\n switch (key) {\n case \"type\": {\n if (!isJsonSchemaType(value)) {\n throw new Error(\n `claude-code-login: ${path}.type must be one of ${JSON_SCHEMA_TYPES.join(\"|\")}, got ${JSON.stringify(value)}`\n );\n }\n out.type = value;\n break;\n }\n case \"properties\":\n case \"patternProperties\":\n case \"$defs\": {\n if (!isJsonObject(value))\n throw new Error(`claude-code-login: ${path}.${key} must be an object`);\n const record: Record<string, ZodJsonSchema | boolean> = {};\n for (const [name, sub] of Object.entries(value)) {\n if (sub === undefined) continue;\n record[name] = schemaAt(sub, `${path}.${key}.${name}`);\n }\n if (key === \"$defs\") {\n const defs: Record<string, ZodJsonSchema> = {};\n for (const [name, sub] of Object.entries(record)) {\n if (typeof sub === \"boolean\")\n throw new Error(`claude-code-login: ${path}.$defs.${name} must be an object`);\n defs[name] = sub;\n }\n out.$defs = defs;\n } else {\n out[key] = record;\n }\n break;\n }\n case \"items\": {\n out.items = Array.isArray(value)\n ? value.map((sub, i) => schemaAt(sub, `${path}.items[${i}]`))\n : schemaAt(value, `${path}.items`);\n break;\n }\n case \"additionalProperties\":\n case \"not\": {\n out[key] = schemaAt(value, `${path}.${key}`);\n break;\n }\n case \"anyOf\":\n case \"oneOf\":\n case \"allOf\": {\n if (!Array.isArray(value))\n throw new Error(`claude-code-login: ${path}.${key} must be an array`);\n out[key] = value.map((sub, i) => {\n const s = schemaAt(sub, `${path}.${key}[${i}]`);\n if (typeof s === \"boolean\")\n throw new Error(`claude-code-login: ${path}.${key}[${i}] must be an object`);\n return s;\n });\n break;\n }\n case \"required\": {\n if (!Array.isArray(value) || !value.every((v): v is string => typeof v === \"string\")) {\n throw new Error(`claude-code-login: ${path}.required must be an array of strings`);\n }\n out.required = value;\n break;\n }\n case \"enum\": {\n if (\n !Array.isArray(value) ||\n !value.every(\n (v): v is string | number | boolean | null =>\n v === null || typeof v === \"string\" || typeof v === \"number\" || typeof v === \"boolean\"\n )\n ) {\n throw new Error(`claude-code-login: ${path}.enum must be an array of primitives`);\n }\n out.enum = value;\n break;\n }\n default:\n // description, default, examples, minimum, … — the index signature\n // takes them as written.\n out[key] = value;\n }\n }\n return out;\n}\n\n/**\n * ggui's tools as an in-process MCP server the binary can LIST. The\n * handlers never run — `createDenyingIntercept` denies every call and the\n * harness executes it — so a handler that does run is a violated\n * invariant and says so loudly.\n */\nexport function createLoginToolServer(\n sdk: LoginSdk,\n tools: readonly LLMToolDef[]\n): McpSdkServerConfigWithInstance {\n const sdkTools = tools.map((def) => {\n const schema = z.fromJSONSchema(toZodJsonSchema(def.parameters, `${def.name}.parameters`));\n if (!(schema instanceof z.ZodObject)) {\n throw new Error(\n `claude-code-login: tool ${def.name}'s parameters must be a JSON-Schema object`\n );\n }\n return sdk.tool(def.name, def.description, schema.shape, async () => {\n throw new Error(\n `claude-code-login: the binary tried to execute ${def.name} — ggui's tools are proposed to the harness and never run in the binary (the intercept denies every call)`\n );\n });\n });\n return sdk.createSdkMcpServer({ name: MCP_SERVER_NAME, version: \"1.0.0\", tools: sdkTools });\n}\n\n// ── reading the stream back into the router's shape ─────────────────────\n\nexport interface CollectedLoginTurn {\n readonly init: MeasuredInitMessage | undefined;\n readonly toolCalls: readonly LoginToolCall[];\n /** Text blocks joined; thinking blocks excluded. */\n readonly text: string;\n readonly result: SDKResultMessage;\n}\n\n/**\n * The login client's implementation of the router's `toolChoice:\n * 'required'` (ggui#1273). The raw client sends `tool_choice: any`, which\n * the API enforces in context (the model cannot emit text before the\n * call); the Agent SDK has no such parameter, and without it the model\n * wrote a preamble before the tool call on the login arm (Exp 009b:\n * ~76% of the arm's excess output). So under `'required'` — and ONLY\n * then — the client appends this to the call's USER prompt; the system\n * prompt, the generation triad's text, is never touched. It is an\n * instruction, not enforcement: `appliedToolChoice` stays `'auto'` and the\n * usage line reads `choice=required:instructed`.\n *\n * Wording ruled by ggui-team-rnd, verbatim (120 bytes, sha256\n * dceccb2ff9dc87a0c3cb0f34b0b1253ce5417e81408b79c0f8a6882981fd6e3e, pinned\n * in the test). It is measured ONCE under Exp 009's bars: a different\n * wording is a new pre-registered experiment, never a re-run.\n */\nexport const LOGIN_REQUIRED_TOOL_INSTRUCTION =\n \"Respond only with tool calls: do not write any text before, between or after them. Text outside a tool call is not read.\";\n\nexport interface CollectLoginTurnOptions {\n /**\n * How the caller's tool choice reached the model, named on the usage\n * line: `required:instructed` (the instruction above was appended),\n * `auto`, or `none` for calls that offer no tools.\n */\n readonly choice: \"required:instructed\" | \"auto\" | \"none\";\n /** Which router call this turn serves — named on the per-call usage line. */\n readonly kind: \"callText\" | \"callTools\" | \"callVision\";\n /** What the intercept saw, to cross-check against the stream's blocks. */\n readonly intercepted: readonly InterceptedToolCall[];\n readonly log: (line: string) => void;\n readonly warn: (line: string) => void;\n}\n\nfunction describeCalls(\n calls: ReadonlyArray<{ readonly name: string; readonly input: unknown }>\n): string {\n return JSON.stringify(calls.map((c) => ({ name: stripMcpToolPrefix(c.name), input: c.input })));\n}\n\n/**\n * Consume one `query()` and decide what the turn was.\n *\n * - `system:init` is the auth receipt: `apiKeySource` is printed, and a\n * value other than `\"none\"` stops the run at once.\n * - `assistant` blocks: `tool_use` → a proposed call (prefix stripped,\n * id carried, input intact); `text` → the reply; `thinking` ignored.\n * - `result` decides. `success` and `error_max_turns` are the one-shot's\n * ends (with or without a call — the raw arm's zero-call return is the\n * same shape). A `success` flagged `is_error` or any other error class\n * throws `ClaudeCodeLoginResultError`.\n * - A throw AFTER the result is the SDK re-surfacing an error result as an\n * exception; the result already decided, so it is logged, not obeyed.\n * A throw BEFORE any result is a real failure and is rethrown as-is.\n */\nexport async function collectLoginTurn(\n stream: AsyncIterable<SDKMessage>,\n opts: CollectLoginTurnOptions\n): Promise<CollectedLoginTurn> {\n let init: MeasuredInitMessage | undefined;\n const toolCalls: LoginToolCall[] = [];\n let text = \"\";\n let thinkingBlocks = 0;\n let result: SDKResultMessage | undefined;\n try {\n for await (const msg of stream) {\n if (msg.type === \"system\" && msg.subtype === \"init\") {\n const measured: MeasuredInitMessage = msg;\n init = measured;\n opts.log(\n `[claude-code-login] apiKeySource=${measured.apiKeySource} claude_code_version=${measured.claude_code_version} model=${measured.model}`\n );\n if (measured.apiKeySource !== LOGIN_API_KEY_SOURCE) {\n throw new ClaudeCodeLoginAuthError(measured.apiKeySource);\n }\n } else if (msg.type === \"assistant\") {\n for (const block of msg.message.content) {\n if (block.type === \"tool_use\") {\n toolCalls.push({\n id: block.id,\n name: stripMcpToolPrefix(block.name),\n input: isRecord(block.input) ? toolArgsToJsonObject(block.input) : {},\n });\n } else if (block.type === \"text\") {\n text += block.text;\n } else if (block.type === \"thinking\" || block.type === \"redacted_thinking\") {\n thinkingBlocks += 1;\n }\n }\n } else if (msg.type === \"result\") {\n result = msg;\n }\n }\n } catch (e) {\n if (result === undefined) throw e;\n opts.log(\n `[claude-code-login] query() threw after its result message — the result decides (${e instanceof Error ? e.message : String(e)})`\n );\n }\n if (result === undefined) {\n throw new Error(\"claude-code-login: query() ended without a result message\");\n }\n\n // ggui#1273 — ONE usage line per call, on every ending (a failed call\n // spent tokens too). Exp 009 needs output netted of thinking, and the\n // text written OUTSIDE the tool call separates the two candidate causes\n // of the login arm's longer output: unrequested thinking vs a preamble\n // under `tool_choice: auto`. `output_tokens_details` is typed non-null\n // by the SDK but can be absent on the wire; absent reads as 0.\n const usage = result.usage;\n const thinkingTokens = usage.output_tokens_details?.thinking_tokens ?? 0;\n opts.log(\n `[claude-code-login] usage kind=${opts.kind} input=${usage.input_tokens} output=${usage.output_tokens} ` +\n `cacheRead=${usage.cache_read_input_tokens} cacheCreated=${usage.cache_creation_input_tokens} ` +\n `thinking=${thinkingTokens} thinkingBlocks=${thinkingBlocks} textChars=${text.length} ` +\n `toolCalls=${toolCalls.length} stop=${result.stop_reason ?? \"none\"} choice=${opts.choice}`\n );\n\n const streamSaw = describeCalls(toolCalls);\n const interceptSaw = describeCalls(opts.intercepted);\n if (streamSaw !== interceptSaw) {\n opts.warn(\n `[claude-code-login] intercept/stream disagreement — the stream's blocks win. intercepted=${interceptSaw} stream=${streamSaw}`\n );\n }\n\n if (result.subtype === \"success\") {\n if (result.is_error) {\n throw new ClaudeCodeLoginResultError(\n \"success\",\n [result.result],\n result.api_error_status ?? undefined\n );\n }\n } else if (result.subtype !== \"error_max_turns\") {\n const failed: SDKResultError = result;\n throw new ClaudeCodeLoginResultError(failed.subtype, failed.errors, undefined);\n }\n return { init, toolCalls, text, result };\n}\n","// packages/ui-gen/src/harness/llm-router.ts\n//\n// Provider-agnostic LLM routing via LLMAgent class hierarchy.\n// Each provider implements its own SDK interface with proper types.\n//\n// Key methods:\n// callText() — plain text response\n// callStructured() — JSON structured output (for coding agent)\n// callWithTools() — multi-turn agentic loop\n\nimport type Anthropic from '@anthropic-ai/sdk';\nimport type {\n ImageBlockParam,\n TextBlock,\n TextBlockParam,\n ToolUseBlock,\n} from '@anthropic-ai/sdk/resources/messages';\nimport type OpenAI from 'openai';\nimport type {\n Response as OpenAIResponse,\n ResponseFunctionToolCall,\n} from 'openai/resources/responses/responses';\nimport type {\n GoogleGenAI,\n Interactions,\n} from '@google/genai';\nimport {\n anthropicRejectsForcedToolChoice,\n anthropicRejectsSamplingParams,\n normalizeAnthropicModelId,\n type JsonObject,\n} from '@ggui-ai/protocol';\nimport type { LLMToolDef } from '../llm.js';\nimport type { AnthropicBedrock } from '@anthropic-ai/bedrock-sdk';\nimport { createAnthropicClient } from '../adapters/claude/client.js';\nimport { getBedrockModelId } from '../adapters/provider-router.js';\nimport { toolArgsToJsonObject } from '../adapters/tool-bridge.js';\nimport { splitCacheInclusiveUsage, splitOpenAiUsage } from '../adapters/openai/tokens.js';\nimport { loadClaudeAgentSdk } from './claude-agent-sdk-loader.js';\nimport {\n emitLlmTraceEvent,\n newLlmTraceId,\n summarizeTools,\n} from './llm-trace-sink.js';\nimport {\n buildLoginQueryOptions,\n collectLoginTurn,\n createDenyingIntercept,\n createLoginToolServer,\n imageUserMessage,\n LOGIN_REQUIRED_TOOL_INSTRUCTION,\n type InterceptedToolCall,\n type LoginSdk,\n} from './claude-code-login-query.js';\n\n// `LLMToolDef` lives in `@ggui-ai/ui-gen/llm`. This file re-exports it\n// so `../harness/llm-router.js` importers (evaluator.ts,\n// llm-evaluator.ts, run-coding-turn.ts) can reach it here.\nexport type { LLMToolDef };\n\n// =============================================================================\n// Shared Types\n// =============================================================================\n\nexport interface AgentConfig {\n provider: 'anthropic' | 'openai' | 'google' | 'openrouter';\n model: string;\n /**\n * Sampling temperature. When defined it is threaded into the provider\n * request; when undefined the provider default is used (unchanged\n * behavior for all existing callers).\n *\n * Capability is the ROUTER's: Anthropic Opus 4.7+ and the 5-family\n * (`claude-opus-4-7*`, `claude-fable-5*`, `claude-opus-5*`,\n * `claude-sonnet-5*`, incl. Bedrock ids) return HTTP 400 on a\n * non-default `temperature`/`top_p`/`top_k`, so the Anthropic adapter\n * STRIPS the value for those ids (one log line naming model + param)\n * and reports the effective sampling on `LLMResponse.sampling`. Callers\n * keep expressing intent; disclosure reads the applied value.\n */\n temperature?: number;\n /**\n * Explicit per-call credentials/routing, bypassing `process.env`\n * entirely when supplied. Absent (default) preserves today's\n * behavior — each agent falls back to reading its provider's env\n * var(s) directly, so existing callers (including self-hosters who\n * set env vars once at process start) are unaffected. Use this to\n * run concurrent generations safely in one process: two simultaneous\n * calls with different `routeOverride`s never race on shared\n * `process.env` state.\n */\n routeOverride?: {\n readonly apiKey?: string;\n /** Anthropic-only: force the Bedrock-IAM client instead of the direct API client. */\n readonly useBedrock?: boolean;\n /**\n * Anthropic-only (ggui#1185): run on the machine's own Claude Code\n * LOGIN instead of a key — the route decision `auth: 'claude-code-login'`\n * lands here, and `createAgent` / `createVisionAgent` select\n * `ClaudeCodeLoginAgent` (one `query()` per call) instead of the raw\n * API client. Every agent the harness builds — coding, evaluation,\n * visual judge — takes the same decision. Off unless set; a real key\n * never coexists with it (the router refuses a non-anthropic route).\n */\n readonly claudeCodeLogin?: boolean;\n };\n /**\n * Observer invoked once per retried attempt when `apiCall()` (#489)\n * retries a rate-limited (HTTP 429) provider call. Fires AFTER the\n * retry decision is made and BEFORE the delay is awaited — never on\n * the terminal failure/success of the whole call. Purely an\n * observability hook: it never influences whether or how long\n * `apiCall()` retries. If the observer itself throws, `apiCall()`\n * catches it, logs a `console.warn`, and proceeds to the retry\n * delay unaffected — a broken observer cannot turn a recoverable\n * 429 into an unrelated hard failure. Absent (default) is a no-op;\n * `apiCall()` still logs every retry via `console.warn` regardless.\n */\n onRetry?: (info: ProviderRetryInfo) => void;\n}\n\n/** One retried attempt's context — passed to `AgentConfig.onRetry`. */\nexport interface ProviderRetryInfo {\n readonly provider: AgentConfig['provider'];\n /** 1-based index of this retry (1 = first retry, 2 = second, …). */\n readonly attempt: number;\n /** Total retries `apiCall()` will attempt before giving up. */\n readonly maxAttempts: number;\n /** HTTP status of the failed call, when the caught error carries one. */\n readonly status: number | undefined;\n /** Provider-supplied `Retry-After` value in seconds, when present and within the cap. */\n readonly retryAfterSec: number | undefined;\n /** Delay actually awaited before the next attempt. */\n readonly delayMs: number;\n /** One-line error summary (same shape as the existing `console.error` line). */\n readonly message: string;\n}\n\n/**\n * What sampling the provider ACTUALLY received for a text call — so a\n * caller that asked for `temperature: 0` (a disclosed reproducibility\n * property, e.g. the benchmark judge panel) can record the effective\n * value instead of the requested one. `'provider-default'` means no\n * temperature reached the provider: either the caller passed none, or\n * the adapter stripped it because the model rejects sampling params\n * (Anthropic Opus 4.7+ / 5-family → HTTP 400 on non-default\n * `temperature`/`top_p`/`top_k`); `strippedReason` names the second case.\n */\nexport interface AppliedSampling {\n readonly temperature: number | 'provider-default';\n readonly strippedReason?: string;\n}\n\nexport interface LLMResponse {\n text: string;\n inputTokens: number;\n outputTokens: number;\n /**\n * Effective sampling for this call (see {@link AppliedSampling}).\n * Every provider's `callText` sets it; absent only on paths that\n * predate the field — treat absence as unknown, never as \"as\n * requested\".\n */\n sampling?: AppliedSampling;\n /**\n * Why the provider stopped, normalized (ggui#1127): `length` = it hit the output cap, `stop` = it ended its\n * answer, `content-filter` = a safety stop, `other` = anything else it reported. Set by the vision calls of\n * providers that report one (Anthropic `stop_reason`, Google `finishReason`); absent when the provider or route\n * said nothing — read absence as unknown, never as `stop`.\n */\n finishReason?: VisionFinishReason;\n /**\n * The model that answered, in the provider's own words (ggui#1687): Anthropic's `model`, Google's `modelVersion`.\n * The request names an alias or a resolved id; this is what the provider says served it. Absent when it said\n * nothing — read absence as unknown, never as the requested model.\n */\n servedModel?: string;\n}\n\n/** The `servedModel` field to spread into an {@link LLMResponse}: present only when the provider named one. */\nexport function servedModelOf(name: string | null | undefined): { servedModel?: string } {\n return typeof name === 'string' && name.length > 0 ? { servedModel: name } : {};\n}\n\n/** The normalized stop reason a vision call reports (ggui#1127). */\nexport type VisionFinishReason = 'stop' | 'length' | 'content-filter' | 'other';\n\n/** Anthropic's `stop_reason`, normalized; absent stays absent. */\nexport function anthropicFinishReason(stopReason: string | null | undefined): VisionFinishReason | undefined {\n if (stopReason === null || stopReason === undefined) return undefined;\n if (stopReason === 'end_turn' || stopReason === 'stop_sequence') return 'stop';\n if (stopReason === 'max_tokens') return 'length';\n if (stopReason === 'refusal') return 'content-filter';\n return 'other';\n}\n\n/** Gemini's `finishReason`, normalized; absent stays absent. */\nexport function googleFinishReason(finishReason: string | null | undefined): VisionFinishReason | undefined {\n if (finishReason === null || finishReason === undefined) return undefined;\n if (finishReason === 'STOP') return 'stop';\n if (finishReason === 'MAX_TOKENS') return 'length';\n if (['SAFETY', 'RECITATION', 'BLOCKLIST', 'PROHIBITED_CONTENT', 'SPII', 'IMAGE_SAFETY'].includes(finishReason)) return 'content-filter';\n return 'other';\n}\n\n/** The `finishReason` field to spread into an {@link LLMResponse}: present only when the provider said. */\nfunction visionFinish(finishReason: VisionFinishReason | undefined): { finishReason?: VisionFinishReason } {\n return finishReason !== undefined ? { finishReason } : {};\n}\n\n/**\n * Image payload for {@link VisionAgent.callVision}. Base64-encoded\n * bytes plus their media type — the two fields every vision-capable\n * provider SDK needs to reconstruct the image part.\n */\nexport interface VisionImageInput {\n mediaType: 'image/png' | 'image/jpeg' | 'image/webp';\n base64: string;\n}\n\n/**\n * The multimodal (image + text) call surface. Implemented by the\n * providers whose SDK path supports vision input (Anthropic, Google);\n * construct one via {@link createVisionAgent} so the call runs inside\n * the same `apiCall()` retry/observability choke point as every text\n * call — provider 429s retry with `Retry-After` honoring, `onRetry`\n * reaches the caller's structured log, and `routeOverride` governs\n * credentials and model routing instead of `process.env`.\n */\nexport interface VisionAgent {\n callVision(\n model: string,\n systemPrompt: string,\n userPrompt: string,\n image: VisionImageInput,\n maxTokens?: number,\n ): Promise<LLMResponse>;\n}\n\nexport interface LLMTool {\n name: string;\n description: string;\n parameters: JsonObject;\n handler: (\n args: JsonObject,\n ) => Promise<{ content: Array<{ text: string }>; isError?: boolean }>;\n}\n\nexport interface LLMWithToolsResponse {\n text: string;\n inputTokens: number;\n outputTokens: number;\n turnsUsed: number;\n /** Prompt-cache reads summed over the loop's turns, when the provider reports them (absent = unreported, never zero). */\n cacheReadTokens?: number;\n /** ggui#1957 — prompt-cache writes summed over the loop's turns, when the provider reports them (absent = unreported). */\n cacheCreationTokens?: number;\n}\n\nexport interface LLMToolCall {\n /** Provider-specific call ID (for sendToolResult) */\n id?: string;\n name: string;\n input: JsonObject;\n}\n\nexport interface LLMToolCallResponse {\n toolCalls: LLMToolCall[];\n inputTokens: number;\n outputTokens: number;\n /**\n * The tool-choice mode the provider ACTUALLY received. Callers ask\n * for `'required'` (Anthropic `tool_choice: any`); Claude Fable 5.1 and\n * Opus 5.5 reject forced tool choice with HTTP 400, so the Anthropic\n * and OpenRouter adapters downgrade to `'auto'` for those families and\n * report it here. A\n * downgraded call may legitimately return zero tool calls — the\n * evaluator's `criteriaCoverage` records that as `skipped`, never as\n * a pass. Absent = predates the field (treat as unknown).\n */\n appliedToolChoice?: 'required' | 'auto';\n /**\n * Tokens read from / written to the prompt cache, when the provider\n * reports them. Optional because not every provider exposes\n * prompt-cache accounting — absent means \"unreported\", never zero.\n */\n cacheReadTokens?: number;\n cacheCreationTokens?: number;\n}\n\n// Backward compat alias\nexport type LLMSingleTurnResponse = LLMToolCallResponse;\n\n/** Result of executing a tool — passed to sendToolResult to close the API contract. */\nexport interface LLMToolResult {\n /** Tool call ID from the response (for providers that need it) */\n callId?: string;\n /** Tool name */\n name: string;\n /** Text result of executing the tool */\n result: string;\n /** Whether the tool execution failed */\n isError?: boolean;\n}\n\n// =============================================================================\n// Schema helpers\n// =============================================================================\n\n/**\n * Add `additionalProperties: false` to all object schemas and ensure all\n * properties are in `required`. Required by OpenAI strict mode.\n * Recursively processes nested objects and array items.\n */\nfunction addStrictSchemaConstraints(schema: JsonObject): JsonObject {\n const result = { ...schema };\n\n if (result.type === 'object' && result.properties) {\n result.additionalProperties = false;\n // All properties must be required for strict mode\n const propKeys = Object.keys(result.properties as JsonObject);\n if (!result.required || (result.required as string[]).length < propKeys.length) {\n result.required = propKeys;\n }\n // Recurse into nested properties\n const props = { ...(result.properties as JsonObject) };\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === 'object' && value !== null) {\n props[key] = addStrictSchemaConstraints(value as JsonObject);\n }\n }\n result.properties = props;\n }\n\n // Recurse into array items\n if (result.type === 'array' && result.items && typeof result.items === 'object') {\n result.items = addStrictSchemaConstraints(result.items as JsonObject);\n }\n\n return result;\n}\n\n// =============================================================================\n// Error helpers\n// =============================================================================\n\n/** One-line error summary for logging — includes HTTP status, error code, and response body excerpt. */\nfunction errorSummary(e: unknown): string {\n if (!(e instanceof Error)) return String(e);\n const status = 'status' in e ? ` (${(e as { status: number }).status})` : '';\n const code = 'code' in e ? ` [${(e as { code: string }).code}]` : '';\n // Extract error body if available (Google/OpenAI SDKs attach it)\n let body = '';\n if ('error' in e && typeof (e as { error: unknown }).error === 'object') {\n const errObj = (e as { error: { message?: string } }).error;\n if (errObj?.message) body = ` body=\"${errObj.message.slice(0, 200)}\"`;\n }\n return `${e.constructor.name}${status}${code}: ${e.message.slice(0, 120)}${body}`;\n}\n\n/** True when the caught value looks like an HTTP 429 from any provider SDK. */\nfunction isRateLimited(e: unknown): boolean {\n if (!(e instanceof Error) || !('status' in e)) return false;\n return (e as { status: unknown }).status === 429;\n}\n\n/** HTTP status of the caught error, when the SDK attached one. Duck-typed — matches `errorSummary`'s existing precedent. */\nfunction extractStatus(e: unknown): number | undefined {\n if (!(e instanceof Error) || !('status' in e)) return undefined;\n const status = (e as { status: unknown }).status;\n return typeof status === 'number' ? status : undefined;\n}\n\n/**\n * Duck-typed `Retry-After` extraction. Both `@anthropic-ai/sdk`'s and\n * `openai`'s `APIError` attach a `Headers`-like `.headers` (with\n * `.get()`) to the thrown error at construction time — this is the\n * ONLY point in the call chain where that header is still reachable\n * (confirmed by reading both SDKs' error constructors). Handles the\n * delta-seconds form only (a plain integer/float string) — the rarer\n * HTTP-date form parses to `NaN` and correctly falls through to\n * `undefined` rather than fabricating a value. Google's `ApiError` has\n * no `.headers` at all, so this always returns `undefined` for Google\n * — expected, not a gap.\n */\nfunction extractRetryAfterSec(e: unknown): number | undefined {\n if (!(e instanceof Error) || !('headers' in e)) return undefined;\n const headers = (e as { headers?: unknown }).headers;\n if (\n headers === null ||\n typeof headers !== 'object' ||\n !('get' in headers) ||\n typeof (headers as { get?: unknown }).get !== 'function'\n ) {\n return undefined;\n }\n const raw = (headers as { get(name: string): string | null }).get('retry-after');\n if (raw === null) return undefined;\n const parsed = Number(raw);\n return Number.isFinite(parsed) && parsed >= 0 ? Math.floor(parsed) : undefined;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/** Retry budget for `apiCall()` — see the docstring on `apiCall()` itself for the full policy. */\nconst MAX_RETRY_ATTEMPTS = 2;\nconst RETRY_AFTER_CAP_SEC = 15;\nconst DEFAULT_BACKOFF_BASE_MS = 1000;\nconst DEFAULT_BACKOFF_MAX_MS = 8000;\nconst MAX_TOTAL_RETRY_DELAY_MS = 20000;\n\n// =============================================================================\n// LLMAgent — abstract base\n// =============================================================================\n\nexport abstract class LLMAgent {\n abstract readonly provider: AgentConfig['provider'];\n private client: unknown = null;\n\n // ── Session state for server-side chaining ──────────────\n // Google: previous_interaction_id, OpenAI: previous_response_id\n // Enables turn 2+ to skip re-sending system prompt + history.\n // Call resetSession() between independent generation runs.\n protected lastSessionId: string | undefined;\n\n /**\n * Explicit per-call routing override — see `AgentConfig.routeOverride`.\n * Absent when constructed via the bare `new XAgent()` form (every\n * existing call site), so `createClient()`/`resolveModel()` fall\n * back to `process.env` exactly as before.\n */\n protected readonly routeOverride: AgentConfig['routeOverride'];\n\n /** See `AgentConfig.onRetry` (#489). Absent is a no-op. */\n protected readonly onRetry: AgentConfig['onRetry'];\n\n constructor(routeOverride?: AgentConfig['routeOverride'], onRetry?: AgentConfig['onRetry']) {\n this.routeOverride = routeOverride;\n this.onRetry = onRetry;\n }\n\n protected abstract resolveModel(model: string): string;\n protected abstract createClient(): Promise<unknown>;\n\n protected async getClient<T>(): Promise<T> {\n if (!this.client) {\n this.client = await this.createClient();\n }\n return this.client as T;\n }\n\n /** Text-only call — no tools */\n abstract callText(\n model: string,\n systemPrompt: string,\n userPrompt: string,\n maxTokens?: number,\n temperature?: number,\n ): Promise<LLMResponse>;\n\n /**\n * Single-turn function calling — returns tool calls without executing them.\n * Each provider uses its native function/tool calling:\n * - Anthropic: tool_use blocks\n * - OpenAI: function_call output items\n * - Google: functionCall parts\n * SDK handles JSON escaping — safe for code, diffs, and other content.\n */\n abstract callTools(\n model: string,\n systemPrompt: string,\n userPrompt: string,\n tools: LLMToolDef[],\n toolChoice?: 'required' | 'auto',\n /**\n * Optional scoped fallback tools. If the primary tools fail with a\n * transport-class error (e.g. `malformed_tool_call` on Gemini after\n * retry exhaustion), the provider may retry once with these narrower\n * tools before throwing. Universal signal — not provider-gated.\n */\n scopedTools?: LLMToolDef[],\n ): Promise<LLMToolCallResponse>;\n\n /** Multi-turn agentic loop — executes tools internally */\n abstract callWithTools(\n model: string,\n systemPrompt: string,\n userPrompt: string,\n tools: LLMTool[],\n maxTurns: number,\n ): Promise<LLMWithToolsResponse>;\n\n /**\n * Pre-warm cache for repeated callTools() calls with the same system prompt + tools.\n * Override in providers that support server-side context caching (e.g., Google).\n * No-op by default (Anthropic/OpenAI handle caching automatically per-request).\n */\n async warmCache(\n _model: string,\n _systemPrompt: string,\n _tools: LLMToolDef[],\n _toolChoice?: 'required' | 'auto',\n ): Promise<void> {}\n\n /** Cleanup any cached resources. Call after generation completes. No-op by default. */\n async cleanup(): Promise<void> {}\n\n /** Reset session state between independent generation runs. */\n resetSession(): void {\n this.lastSessionId = undefined;\n }\n\n /**\n * Send tool execution results back to the provider to close the API contract.\n * Call this after executing tools from callTools() and before the next callTools().\n *\n * For providers with server-side state (Google, OpenAI), this sends the\n * function results so the next callTools() can chain properly.\n * For stateless providers (Anthropic), this is a no-op.\n *\n * Override in providers that need it.\n */\n async sendToolResult(_results: LLMToolResult[]): Promise<void> {\n // No-op by default — Anthropic doesn't need this (stateless + auto prompt cache)\n }\n\n /**\n * Execute an API call, retrying once or twice on HTTP 429\n * (rate-limited) before giving up (#489).\n *\n * Policy: on a 429, honor the provider's `Retry-After` header when\n * present (capped at `RETRY_AFTER_CAP_SEC` — a provider asking for a\n * longer wait is treated as \"don't retry\", not \"wait longer\": making\n * the caller sit through 15+ more seconds on a single failed call is\n * a bad experience regardless of what's driving the request);\n * otherwise fall back to exponential backoff with jitter, capped at\n * `DEFAULT_BACKOFF_MAX_MS` per attempt. Stops after\n * `MAX_RETRY_ATTEMPTS` retries OR once the cumulative delay would\n * exceed `MAX_TOTAL_RETRY_DELAY_MS`, whichever comes first. Any\n * non-429 error, or a 429 with no attempts left, is logged and\n * re-thrown immediately — unchanged from the pre-#489 behavior.\n *\n * **Budget scope (final-review correction):** `MAX_TOTAL_RETRY_DELAY_MS`\n * bounds a single `apiCall()` invocation, not a whole generation. A\n * generation issues many sequential `apiCall()` calls (coding turns,\n * tool-result round-trips, eval rounds); under sustained throttling\n * each one can independently add up to `MAX_TOTAL_RETRY_DELAY_MS`, so\n * a generation with k rate-limited calls can add up to roughly `k *\n * MAX_TOTAL_RETRY_DELAY_MS` to how long it holds its caller's\n * resources (e.g. the caller's concurrency slot) — not a flat 20s\n * ceiling. No shared per-generation budget is threaded here by\n * design (accepted ruling, not an oversight): the caller's own\n * queue/admission backstop is what bounds how long other\n * queued work waits, independent of any one generation's retry\n * total.\n */\n protected async apiCall<T>(fn: () => Promise<T>): Promise<T> {\n const start = Date.now();\n let totalDelayMs = 0;\n for (let attempt = 0; ; attempt++) {\n try {\n return await fn();\n } catch (e: unknown) {\n const ms = Date.now() - start;\n if (attempt >= MAX_RETRY_ATTEMPTS || !isRateLimited(e)) {\n console.error(`[${this.provider}] API error after ${ms}ms: ${errorSummary(e)}`);\n throw e;\n }\n const retryAfterSec = extractRetryAfterSec(e);\n if (retryAfterSec !== undefined && retryAfterSec > RETRY_AFTER_CAP_SEC) {\n console.error(\n `[${this.provider}] API error after ${ms}ms (retry-after ${retryAfterSec}s exceeds ${RETRY_AFTER_CAP_SEC}s cap, not retrying): ${errorSummary(e)}`,\n );\n throw e;\n }\n const delayMs =\n retryAfterSec !== undefined\n ? retryAfterSec * 1000\n : Math.min(DEFAULT_BACKOFF_BASE_MS * 2 ** attempt, DEFAULT_BACKOFF_MAX_MS) +\n Math.floor(Math.random() * 250);\n if (totalDelayMs + delayMs > MAX_TOTAL_RETRY_DELAY_MS) {\n console.error(\n `[${this.provider}] API error after ${ms}ms (retry budget exhausted, not retrying): ${errorSummary(e)}`,\n );\n throw e;\n }\n totalDelayMs += delayMs;\n const info: ProviderRetryInfo = {\n provider: this.provider,\n attempt: attempt + 1,\n maxAttempts: MAX_RETRY_ATTEMPTS,\n status: extractStatus(e),\n retryAfterSec,\n delayMs,\n message: errorSummary(e),\n };\n console.warn(\n `[${this.provider}] rate-limited (attempt ${info.attempt}/${info.maxAttempts}), retrying in ${delayMs}ms`,\n );\n try {\n this.onRetry?.(info);\n } catch (observerError) {\n // Guard, not propagate — the docstring on AgentConfig.onRetry\n // promises this is \"purely an observability hook: it never\n // influences whether or how long apiCall() retries\". A\n // caller-supplied observer that throws must not turn a\n // recoverable 429 into an unrelated hard failure.\n console.warn(\n `[${this.provider}] onRetry observer threw (ignored, retry proceeds): ${errorSummary(observerError)}`,\n );\n }\n await sleep(delayMs);\n }\n }\n }\n\n}\n\n// =============================================================================\n// AnthropicAgent\n// =============================================================================\n\n/**\n * Decide what sampling reaches Anthropic for `model` given the caller's\n * `temperature`: pass it through on models that accept it, strip it on\n * the 4.7+/5-family and say so. Pure — the caller logs and spreads.\n */\nexport function resolveAnthropicSampling(\n model: string,\n temperature: number | undefined,\n): { readonly request: { temperature?: number }; readonly applied: AppliedSampling } {\n if (temperature === undefined) {\n return { request: {}, applied: { temperature: 'provider-default' } };\n }\n if (anthropicRejectsSamplingParams(model)) {\n return {\n request: {},\n applied: {\n temperature: 'provider-default',\n strippedReason:\n `${normalizeAnthropicModelId(model)} rejects non-default sampling params (HTTP 400 on Opus 4.7+/5-family); ` +\n `caller's temperature=${temperature} was not sent`,\n },\n };\n }\n return { request: { temperature }, applied: { temperature } };\n}\n\nexport class AnthropicAgent extends LLMAgent {\n readonly provider = 'anthropic' as const;\n\n protected resolveModel(model: string): string {\n // Bedrock IAM path — the upstream model id must be the cross-region\n // inference-profile form (`us.anthropic.*`), not the bare API id.\n const useBedrock =\n this.routeOverride?.useBedrock ?? process.env.CLAUDE_CODE_USE_BEDROCK === '1';\n if (useBedrock) {\n return getBedrockModelId(model);\n }\n return model.startsWith('anthropic/')\n ? model.slice('anthropic/'.length)\n : model;\n }\n\n protected async createClient(): Promise<Anthropic | AnthropicBedrock> {\n // Bedrock IAM path: when CLAUDE_CODE_USE_BEDROCK=1 (set by the\n // deployment's provider routing), auth comes from the ambient AWS\n // credential chain (instance role, env credentials, etc.) — no API\n // key. `AnthropicBedrock` is wire-compatible with `Anthropic` for\n // the `.messages` API this agent uses.\n const useBedrock =\n this.routeOverride?.useBedrock ?? process.env.CLAUDE_CODE_USE_BEDROCK === '1';\n if (useBedrock) {\n const { AnthropicBedrock } = await import('@anthropic-ai/bedrock-sdk');\n return new AnthropicBedrock({\n awsRegion:\n process.env.AWS_REGION ??\n process.env.AWS_DEFAULT_REGION ??\n 'us-east-1',\n });\n }\n // SDK construction lives in `adapters/claude/client.ts`. The BYOK\n // resolver writes the raw key into `process.env.ANTHROPIC_API_KEY`\n // before this runs (see `applyRouteToEnv` in provider-router) —\n // `routeOverride.apiKey`, when supplied, skips that env round-trip\n // entirely.\n return createAnthropicClient(this.routeOverride?.apiKey ?? process.env.ANTHROPIC_API_KEY);\n }\n\n async callText(\n model: string,\n systemPrompt: string,\n userPrompt: string,\n maxTokens?: number,\n temperature?: number,\n ): Promise<LLMResponse> {\n const client = await this.getClient<Anthropic>();\n const traceId = newLlmTraceId();\n const startedAt = Date.now();\n const resolvedModel = this.resolveModel(model);\n\n // Use prompt caching beta API (90% discount on cached reads)\n const system: TextBlockParam[] = [\n {\n type: 'text',\n text: systemPrompt,\n cache_control: { type: 'ephemeral' },\n },\n ];\n\n // Capability is the router's: the 4.7+/5-family rejects sampling\n // params with 400, so strip (and disclose) rather than fail the call\n // or make callers stop expressing intent (ggui#710 / #706).\n const sampling = resolveAnthropicSampling(resolvedModel, temperature);\n if (sampling.applied.strippedReason !== undefined) {\n console.warn(`[anthropic] callText: ${sampling.applied.strippedReason}`);\n }\n\n try {\n const response = await this.apiCall(() =>\n client.messages.create({\n model: resolvedModel,\n max_tokens: maxTokens ?? 4096,\n system,\n messages: [{ role: 'user', content: userPrompt }],\n ...sampling.request,\n }),\n );\n\n const usage = response.usage as typeof response.usage & {\n cache_creation_input_tokens?: number | null;\n cache_read_input_tokens?: number | null;\n };\n const cacheCreated = usage.cache_creation_input_tokens ?? 0;\n const cacheRead = usage.cache_read_input_tokens ?? 0;\n if (cacheCreated || cacheRead) {\n console.log(`[anthropic] callText cache: created=${cacheCreated} read=${cacheRead} input=${usage.input_tokens} output=${usage.output_tokens}`);\n }\n\n const text = response.content\n .filter((block): block is TextBlock => block.type === 'text')\n .map((block) => block.text)\n .join('');\n\n const endedAt = Date.now();\n emitLlmTraceEvent({\n id: traceId,\n at: startedAt,\n endedAt,\n durationMs: endedAt - startedAt,\n provider: 'anthropic',\n model: resolvedModel,\n kind: 'callText',\n systemPrompt,\n userPrompt,\n result: {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n cacheCreated,\n cacheRead,\n text,\n },\n });\n\n return {\n text,\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n sampling: sampling.applied,\n };\n } catch (e) {\n const endedAt = Date.now();\n emitLlmTraceEvent({\n id: traceId,\n at: startedAt,\n endedAt,\n durationMs: endedAt - startedAt,\n provider: 'anthropic',\n model: resolvedModel,\n kind: 'callText',\n systemPrompt,\n userPrompt,\n error: { message: e instanceof Error ? e.message : String(e) },\n });\n throw e;\n }\n }\n\n async callVision(\n model: string,\n systemPrompt: string,\n userPrompt: string,\n image: VisionImageInput,\n maxTokens?: number,\n ): Promise<LLMResponse> {\n const client = await this.getClient<Anthropic>();\n const traceId = newLlmTraceId();\n const startedAt = Date.now();\n const resolvedModel = this.resolveModel(model);\n\n const imageBlock: ImageBlockParam = {\n type: 'image',\n source: {\n type: 'base64',\n media_type: image.mediaType,\n data: image.base64,\n },\n };\n\n try {\n const response = await this.apiCall(() =>\n client.messages.create({\n model: resolvedModel,\n max_tokens: maxTokens ?? 1500,\n system: systemPrompt,\n messages: [\n {\n role: 'user',\n content: [imageBlock, { type: 'text', text: userPrompt }],\n },\n ],\n }),\n );\n\n const text = response.content\n .filter((block): block is TextBlock => block.type === 'text')\n .map((block) => block.text)\n .join('');\n\n const endedAt = Date.now();\n // The image bytes stay OUT of the trace — a base64 screenshot\n // would balloon every event; the prompts identify the call.\n emitLlmTraceEvent({\n id: traceId,\n at: startedAt,\n endedAt,\n durationMs: endedAt - startedAt,\n provider: 'anthropic',\n model: resolvedModel,\n kind: 'callVision',\n systemPrompt,\n userPrompt,\n result: {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n text,\n },\n });\n\n return {\n text,\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n ...visionFinish(anthropicFinishReason(response.stop_reason)),\n ...servedModelOf(response.model),\n };\n } catch (e) {\n const endedAt = Date.now();\n emitLlmTraceEvent({\n id: traceId,\n at: startedAt,\n endedAt,\n durationMs: endedAt - startedAt,\n provider: 'anthropic',\n model: resolvedModel,\n kind: 'callVision',\n systemPrompt,\n userPrompt,\n error: { message: e instanceof Error ? e.message : String(e) },\n });\n throw e;\n }\n }\n\n async callTools(\n model: string,\n systemPrompt: string,\n userPrompt: string,\n tools: LLMToolDef[],\n toolChoice: 'required' | 'auto' = 'required',\n _scopedTools?: LLMToolDef[],\n ): Promise<LLMToolCallResponse> {\n const client = await this.getClient<Anthropic>();\n const traceId = newLlmTraceId();\n const startedAt = Date.now();\n const resolvedModel = this.resolveModel(model);\n\n // Cache system prompt + tools via prompt caching beta (90% discount)\n const system: TextBlockParam[] = [\n {\n type: 'text',\n text: systemPrompt,\n cache_control: { type: 'ephemeral' },\n },\n ];\n\n const cachedTools: Anthropic.Tool[] = tools.map((t, i) => ({\n name: t.name,\n description: t.description,\n input_schema: t.parameters as Anthropic.Tool.InputSchema,\n // Mark last tool to cache the entire tool list\n ...(i === tools.length - 1\n ? { cache_control: { type: 'ephemeral' as const } }\n : {}),\n }));\n\n try {\n // `max_tokens >= 21_334` mandates streaming on the\n // @anthropic-ai/sdk >=0.40 path (the API rejects non-streamed\n // long-form generation with `Streaming is required for\n // operations that may take longer than 10 minutes`). We still\n // want the final-message shape downstream, so use the stream\n // helper's `finalMessage()` which folds the events back to the\n // same `Message` Type the non-streaming path returned.\n // Fable 5.1 and Opus 5.5 reject a forced tool choice (400);\n // downgrade to `auto` for those families and disclose it on the\n // response so a resulting zero-tool-call reply is never mistaken\n // for a verdict (ggui#710 / #706 / #1254).\n const appliedToolChoice: 'required' | 'auto' =\n toolChoice === 'required' && anthropicRejectsForcedToolChoice(resolvedModel)\n ? 'auto'\n : toolChoice;\n if (appliedToolChoice !== toolChoice) {\n console.warn(\n `[anthropic] callTools: ${normalizeAnthropicModelId(resolvedModel)} would reject a forced tool_choice (the API answers 400); ` +\n `caller's 'required' downgraded to 'auto' before sending`,\n );\n }\n const response = await this.apiCall(() =>\n client.messages\n .stream({\n model: resolvedModel,\n max_tokens: 32768,\n system,\n messages: [{ role: 'user', content: userPrompt }],\n tools: cachedTools,\n tool_choice: { type: appliedToolChoice === 'required' ? 'any' : 'auto' },\n })\n .finalMessage(),\n );\n\n const usage = response.usage as typeof response.usage & {\n cache_creation_input_tokens?: number | null;\n cache_read_input_tokens?: number | null;\n };\n const cacheCreated = usage.cache_creation_input_tokens ?? 0;\n const cacheRead = usage.cache_read_input_tokens ?? 0;\n if (cacheCreated || cacheRead) {\n console.log(`[anthropic] callTools cache: created=${cacheCreated} read=${cacheRead} input=${usage.input_tokens} output=${usage.output_tokens}`);\n }\n\n const toolUses = response.content.filter(\n (block): block is ToolUseBlock => block.type === 'tool_use',\n );\n\n const toolCalls = toolUses.map((tu) => ({\n id: tu.id,\n name: tu.name,\n input: (tu.input ?? {}) as JsonObject,\n }));\n\n const endedAt = Date.now();\n emitLlmTraceEvent({\n id: traceId,\n at: startedAt,\n endedAt,\n durationMs: endedAt - startedAt,\n provider: 'anthropic',\n model: resolvedModel,\n kind: 'callTools',\n systemPrompt,\n userPrompt,\n tools: summarizeTools(tools),\n result: {\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n cacheCreated,\n cacheRead,\n toolCalls: toolCalls.map((c) => ({ name: c.name, input: c.input })),\n },\n });\n\n return {\n toolCalls,\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n cacheReadTokens: cacheRead,\n cacheCreationTokens: cacheCreated,\n appliedToolChoice,\n };\n } catch (e) {\n const endedAt = Date.now();\n emitLlmTraceEvent({\n id: traceId,\n at: startedAt,\n endedAt,\n durationMs: endedAt - startedAt,\n provider: 'anthropic',\n model: resolvedModel,\n kind: 'callTools',\n systemPrompt,\n userPrompt,\n tools: summarizeTools(tools),\n error: { message: e instanceof Error ? e.message : String(e) },\n });\n throw e;\n }\n }\n\n async callWithTools(\n model: string,\n systemPrompt: string,\n userPrompt: string,\n tools: LLMTool[],\n maxTurns: number,\n ): Promise<LLMWithToolsResponse> {\n const client = await this.getClient<Anthropic>();\n const resolvedModel = this.resolveModel(model);\n const traceId = newLlmTraceId();\n const startedAt = Date.now();\n\n const anthropicTools: Anthropic.Tool[] = tools.map((t) => ({\n name: t.name,\n description: t.description,\n input_schema: t.parameters as Anthropic.Tool.InputSchema,\n }));\n\n const messages: Anthropic.MessageParam[] = [\n { role: 'user', content: userPrompt },\n ];\n let totalIn = 0;\n let totalOut = 0;\n let allText = '';\n\n try {\n for (let turn = 0; turn < maxTurns; turn++) {\n // Same streaming requirement as callTools — see comment there.\n const response = await this.apiCall(() =>\n client.messages\n .stream({\n model: resolvedModel,\n max_tokens: 32768,\n system: systemPrompt,\n messages,\n tools: anthropicTools,\n })\n .finalMessage(),\n );\n totalIn += response.usage.input_tokens;\n totalOut += response.usage.output_tokens;\n\n for (const block of response.content) {\n if (block.type === 'text') allText += block.text;\n }\n\n const toolUses = response.content.filter(\n (b): b is ToolUseBlock => b.type === 'tool_use',\n );\n if (toolUses.length === 0) break;\n\n messages.push({ role: 'assistant', content: response.content });\n\n const toolResults: Anthropic.ToolResultBlockParam[] = [];\n for (const tu of toolUses) {\n const tool = tools.find((t) => t.name === tu.name);\n if (!tool) {\n toolResults.push({\n type: 'tool_result',\n tool_use_id: tu.id,\n content: `Tool '${tu.name}' not found`,\n });\n continue;\n }\n const result = await tool.handler(\n (tu.input ?? {}) as JsonObject,\n );\n toolResults.push({\n type: 'tool_result',\n tool_use_id: tu.id,\n content: result.content[0]?.text ?? '',\n });\n }\n messages.push({ role: 'user', content: toolResults });\n }\n\n const endedAt = Date.now();\n emitLlmTraceEvent({\n id: traceId,\n at: startedAt,\n endedAt,\n durationMs: endedAt - startedAt,\n provider: 'anthropic',\n model: resolvedModel,\n kind: 'callWithTools',\n systemPrompt,\n userPrompt,\n tools: tools.map((t) => ({ name: t.name, description: t.description })),\n result: {\n inputTokens: totalIn,\n outputTokens: totalOut,\n text: allText,\n turnsUsed: messages.length,\n },\n });\n\n return {\n text: allText,\n inputTokens: totalIn,\n outputTokens: totalOut,\n turnsUsed: messages.length,\n };\n } catch (e) {\n const endedAt = Date.now();\n emitLlmTraceEvent({\n id: traceId,\n at: startedAt,\n endedAt,\n durationMs: endedAt - startedAt,\n provider: 'anthropic',\n model: resolvedModel,\n kind: 'callWithTools',\n systemPrompt,\n userPrompt,\n tools: tools.map((t) => ({ name: t.name, description: t.description })),\n error: { message: e instanceof Error ? e.message : String(e) },\n });\n throw e;\n }\n }\n}\n\n// =============================================================================\n// OpenAIAgent\n// =============================================================================\n\n/**\n * ggui#1185 (B) — the Anthropic model reached through the machine's own\n * Claude Code LOGIN, for the one path that has no key: every router call\n * is ONE Agent SDK `query()` (`maxTurns: 1`), the binary PROPOSES tool\n * calls and ggui's harness executes them — the same one-shot contract as\n * `AnthropicAgent.callTools`, so everything above the router (the coding\n * loop, `apply_changes`, the axis checks, the evaluation legs) is\n * untouched. Selected only when the route decision carries\n * `routeOverride.claudeCodeLogin`; never by default.\n *\n * What it refuses, as behaviour (the carve-out): it writes no key\n * anywhere (the env the binary inherits is stripped of every provider key\n * name and `system:init.apiKeySource` must read `\"none\"` or the run stops\n * before its first turn); it never runs `--bare`, never loads `~/.claude`,\n * and never allow-lists a tool (an allow-listed MCP tool executes without\n * asking). The pure pieces — options, the JSON-Schema→Zod tool bridge, the\n * stream reader and its error classes — live in\n * `./claude-code-login-query.ts`; the measurements behind each are cited\n * there. Rate limits are the plan's: a 429 the binary relays rides the\n * same `apiCall()` retry seam as the raw client.\n *\n * Honest asymmetries, reported rather than hidden: the SDK has no\n * `tool_choice`, so `appliedToolChoice` is always `'auto'`; the binary\n * emitted a thinking block despite `thinkingConfig: { type: 'disabled' }`\n * in the probe (Exp 009 reports thinking tokens as their own column);\n * `warmCache` is a no-op (a warm-up turn would spend the plan for\n * nothing); `callWithTools` (an in-client agentic loop) is not offered —\n * the harness runs the loop.\n */\nexport class ClaudeCodeLoginAgent extends LLMAgent implements VisionAgent {\n readonly provider = 'anthropic' as const;\n\n protected resolveModel(model: string): string {\n return model.startsWith('anthropic/') ? model.slice('anthropic/'.length) : model;\n }\n\n protected async createClient(): Promise<LoginSdk> {\n const { query, tool, createSdkMcpServer } = await loadClaudeAgentSdk();\n return { query, tool, createSdkMcpServer };\n }\n\n async callText(\n model: string,\n systemPrompt: string,\n userPrompt: string,\n _maxTokens?: number,\n _temperature?: number,\n ): Promise<LLMResponse> {\n const sdk = await this.getClient<LoginSdk>();\n const traceId = newLlmTraceId();\n const startedAt = Date.now();\n const resolvedModel = this.resolveModel(model);\n try {\n const turn = await this.apiCall(() =>\n collectLoginTurn(\n sdk.query({\n prompt: userPrompt,\n options: buildLoginQueryOptions({ model: resolvedModel, systemPrompt }),\n }),\n { intercepted: [], kind: \"callText\", choice: \"none\", log: console.log, warn: console.warn },\n ),\n );\n const usage = turn.result.usage;\n const endedAt = Date.now();\n emitLlmTraceEvent({\n id: traceId,\n at: startedAt,\n endedAt,\n durationMs: endedAt - startedAt,\n provider: 'claude-code-login',\n model: resolvedModel,\n kind: 'callText',\n systemPrompt,\n userPrompt,\n result: {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n cacheCreated: usage.cache_creation_input_tokens,\n cacheRead: usage.cache_read_input_tokens,\n text: turn.text,\n },\n });\n return { text: turn.text, inputTokens: usage.input_tokens, outputTokens: usage.output_tokens };\n } catch (e) {\n const endedAt = Date.now();\n emitLlmTraceEvent({\n id: traceId,\n at: startedAt,\n endedAt,\n durationMs: endedAt - startedAt,\n provider: 'claude-code-login',\n model: resolvedModel,\n kind: 'callText',\n systemPrompt,\n userPrompt,\n error: { message: e instanceof Error ? e.message : String(e) },\n });\n throw e;\n }\n }\n\n async callVision(\n model: string,\n systemPrompt: string,\n userPrompt: string,\n image: VisionImageInput,\n _maxTokens?: number,\n ): Promise<LLMResponse> {\n const sdk = await this.getClient<LoginSdk>();\n const traceId = newLlmTraceId();\n const startedAt = Date.now();\n const resolvedModel = this.resolveModel(model);\n try {\n const turn = await this.apiCall(() =>\n collectLoginTurn(\n sdk.query({\n prompt: imageUserMessage(userPrompt, image),\n options: buildLoginQueryOptions({ model: resolvedModel, systemPrompt }),\n }),\n { intercepted: [], kind: \"callVision\", choice: \"none\", log: console.log, warn: console.warn },\n ),\n );\n const usage = turn.result.usage;\n const endedAt = Date.now();\n emitLlmTraceEvent({\n id: traceId,\n at: startedAt,\n endedAt,\n durationMs: endedAt - startedAt,\n provider: 'claude-code-login',\n model: resolvedModel,\n kind: 'callVision',\n systemPrompt,\n userPrompt,\n result: { inputTokens: usage.input_tokens, outputTokens: usage.output_tokens, text: turn.text },\n });\n return { text: turn.text, inputTokens: usage.input_tokens, outputTokens: usage.output_tokens };\n } catch (e) {\n const endedAt = Date.now();\n emitLlmTraceEvent({\n id: traceId,\n at: startedAt,\n endedAt,\n durationMs: endedAt - startedAt,\n provider: 'claude-code-login',\n model: resolvedModel,\n kind: 'callVision',\n systemPrompt,\n userPrompt,\n error: { message: e instanceof Error ? e.message : String(e) },\n });\n throw e;\n }\n }\n\n async callTools(\n model: string,\n systemPrompt: string,\n userPrompt: string,\n tools: LLMToolDef[],\n toolChoice: 'required' | 'auto' = 'required',\n _scopedTools?: LLMToolDef[],\n ): Promise<LLMToolCallResponse> {\n const sdk = await this.getClient<LoginSdk>();\n const traceId = newLlmTraceId();\n const startedAt = Date.now();\n const resolvedModel = this.resolveModel(model);\n // ggui#1273 — the Agent SDK has no tool_choice; 'required' is implemented\n // as rnd's instruction on the USER prompt (never the system prompt) and\n // disclosed as instructed-not-enforced: appliedToolChoice stays 'auto'.\n const sentUserPrompt =\n toolChoice === 'required' ? `${userPrompt}\\n\\n${LOGIN_REQUIRED_TOOL_INSTRUCTION}` : userPrompt;\n try {\n const turn = await this.apiCall(() => {\n // Fresh per attempt: the SDK connects the server instance per query().\n const intercepted: InterceptedToolCall[] = [];\n const server = createLoginToolServer(sdk, tools);\n return collectLoginTurn(\n sdk.query({\n prompt: sentUserPrompt,\n options: buildLoginQueryOptions({\n model: resolvedModel,\n systemPrompt,\n tools: { server, canUseTool: createDenyingIntercept(intercepted) },\n }),\n }),\n { intercepted, kind: \"callTools\", choice: toolChoice === 'required' ? \"required:instructed\" : \"auto\", log: console.log, warn: console.warn },\n );\n });\n const usage = turn.result.usage;\n const cacheCreated = usage.cache_creation_input_tokens;\n const cacheRead = usage.cache_read_input_tokens;\n if (cacheCreated || cacheRead) {\n console.log(\n `[claude-code-login] callTools cache: created=${cacheCreated} read=${cacheRead} input=${usage.input_tokens} output=${usage.output_tokens}`,\n );\n }\n const toolCalls: LLMToolCall[] = turn.toolCalls.map((c) => ({ id: c.id, name: c.name, input: c.input }));\n const endedAt = Date.now();\n emitLlmTraceEvent({\n id: traceId,\n at: startedAt,\n endedAt,\n durationMs: endedAt - startedAt,\n provider: 'claude-code-login',\n model: resolvedModel,\n kind: 'callTools',\n systemPrompt,\n userPrompt: sentUserPrompt,\n tools: summarizeTools(tools),\n result: {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n cacheCreated,\n cacheRead,\n toolCalls: toolCalls.map((c) => ({ name: c.name, input: c.input })),\n },\n });\n return {\n toolCalls,\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n cacheReadTokens: cacheRead,\n cacheCreationTokens: cacheCreated,\n appliedToolChoice: 'auto',\n };\n } catch (e) {\n const endedAt = Date.now();\n emitLlmTraceEvent({\n id: traceId,\n at: startedAt,\n endedAt,\n durationMs: endedAt - startedAt,\n provider: 'claude-code-login',\n model: resolvedModel,\n kind: 'callTools',\n systemPrompt,\n userPrompt: sentUserPrompt,\n tools: summarizeTools(tools),\n error: { message: e instanceof Error ? e.message : String(e) },\n });\n throw e;\n }\n }\n\n async callWithTools(): Promise<LLMWithToolsResponse> {\n throw new Error(\n \"claude-code-login: callWithTools (an in-client agentic loop) is not part of the login client — ggui's harness runs the loop through callTools\",\n );\n }\n}\n\nexport class OpenAIAgent extends LLMAgent {\n readonly provider = 'openai' as const;\n\n protected resolveModel(model: string): string {\n return model.startsWith('openai/')\n ? model.slice('openai/'.length)\n : model;\n }\n\n protected async createClient(): Promise<OpenAI> {\n const { default: OpenAISDK } = await import('openai');\n return new OpenAISDK({ apiKey: this.routeOverride?.apiKey ?? process.env.OPENAI_API_KEY });\n }\n\n async callText(\n model: string,\n systemPrompt: string,\n userPrompt: string,\n maxTokens?: number,\n temperature?: number,\n ): Promise<LLMResponse> {\n const client = await this.getClient<OpenAI>();\n const response: OpenAIResponse = await this.apiCall(() =>\n client.responses.create({\n model: this.resolveModel(model),\n instructions: systemPrompt,\n input: [{ role: 'user', content: userPrompt }],\n ...(maxTokens && { max_output_tokens: maxTokens }),\n ...(temperature !== undefined && { temperature }),\n }),\n );\n\n let text = '';\n for (const item of response.output) {\n if (item.type === 'message') {\n for (const part of item.content) {\n if (part.type === 'output_text') text += part.text;\n }\n }\n }\n\n // ggui#1186 (second site): `input_tokens` INCLUDES the cached prefix on the\n // Responses API — report the NON-cached input like every other provider.\n // The text response carries no cache field, so the cached count is\n // dropped here rather than double-counted. Cache writes (ggui#1957) stay\n // inside `inputTokens` on this path for the same reason: with no\n // cache-write term to carry them, subtracting them would drop them.\n const textUsage = splitOpenAiUsage(\n response.usage?.input_tokens ?? 0,\n response.usage?.output_tokens ?? 0,\n response.usage?.input_tokens_details?.cached_tokens ?? 0,\n 0,\n );\n return {\n text,\n inputTokens: textUsage.tokens.input,\n outputTokens: textUsage.tokens.output,\n sampling: { temperature: temperature ?? 'provider-default' },\n };\n }\n\n async callTools(\n model: string,\n systemPrompt: string,\n userPrompt: string,\n tools: LLMToolDef[],\n toolChoice: 'required' | 'auto' = 'required',\n _scopedTools?: LLMToolDef[],\n ): Promise<LLMToolCallResponse> {\n const client = await this.getClient<OpenAI>();\n // strict: true enables constrained decoding — guarantees valid JSON matching the schema.\n // Requires additionalProperties: false on all objects and all fields in required.\n const openaiTools = tools.map((t) => ({\n type: 'function' as const,\n name: t.name,\n description: t.description,\n parameters: addStrictSchemaConstraints(t.parameters),\n strict: true,\n }));\n\n // Consume pending tool results — prepend to input for proper contract\n const pending = this.pendingToolResults;\n this.pendingToolResults = [];\n const input = pending.length > 0\n ? [...pending, { role: 'user' as const, content: userPrompt }]\n : [{ role: 'user' as const, content: userPrompt }];\n\n const response: OpenAIResponse = await this.apiCall(() =>\n client.responses.create({\n model: this.resolveModel(model),\n instructions: systemPrompt,\n input,\n tools: openaiTools,\n tool_choice: toolChoice,\n store: true, // Enable response storage + server-side chaining\n ...(this.lastSessionId && { previous_response_id: this.lastSessionId }),\n }),\n );\n\n // Save session ID for chaining subsequent calls\n this.lastSessionId = response.id;\n\n // Log cache utilization\n const usage = response.usage;\n if (usage) {\n // Typed in the SDK as required, but widened to optional here —\n // tolerate responses that omit the breakdown at runtime.\n const cached: { cached_tokens?: number } | undefined =\n usage.input_tokens_details;\n if (cached?.cached_tokens) {\n console.log(`[openai] session ${this.lastSessionId ? 'chained' : 'new'}: ${cached.cached_tokens} cached of ${usage.input_tokens} input`);\n }\n }\n\n const functionCalls = response.output.filter(\n (o): o is ResponseFunctionToolCall => o.type === 'function_call',\n );\n\n // ggui#1186 (second site): the harness coding loop reads THIS per-turn\n // usage (`run-coding-turn` → `generate-task-runner` telemetry), not the\n // adapters' results — so the split lives here too: `inputTokens` is the\n // NON-cached input and `cacheReadTokens` the cached subset, reported (0\n // when the breakdown says none), so a generation's metadata — and whatever\n // prices or aggregates it downstream — sees OpenAI cache reads at all.\n const toolsUsage = splitOpenAiUsage(\n response.usage?.input_tokens ?? 0,\n response.usage?.output_tokens ?? 0,\n response.usage?.input_tokens_details?.cached_tokens ?? 0,\n response.usage?.input_tokens_details?.cache_write_tokens ?? 0,\n );\n return {\n toolCalls: functionCalls.map((fc) => ({\n id: fc.call_id,\n name: fc.name,\n input: JSON.parse(fc.arguments ?? '{}') as JsonObject,\n })),\n inputTokens: toolsUsage.tokens.input,\n outputTokens: toolsUsage.tokens.output,\n cacheReadTokens: toolsUsage.cacheReadTokens,\n cacheCreationTokens: toolsUsage.cacheCreationTokens,\n };\n }\n\n // Pending tool results — stored by sendToolResult, consumed by next callTools\n private pendingToolResults: OpenAI.Responses.ResponseInputItem[] = [];\n\n override async sendToolResult(results: LLMToolResult[]): Promise<void> {\n // Store results locally — they'll be prepended to the next callTools input.\n // No API call here! Saves a round-trip.\n this.pendingToolResults = results.map((r) => ({\n type: 'function_call_output',\n call_id: r.callId ?? '',\n output: r.result,\n }));\n }\n\n async callWithTools(\n model: string,\n systemPrompt: string,\n userPrompt: string,\n tools: LLMTool[],\n maxTurns: number,\n ): Promise<LLMWithToolsResponse> {\n const client = await this.getClient<OpenAI>();\n const resolvedModel = this.resolveModel(model);\n const openaiTools = tools.map((t) => ({\n type: 'function' as const,\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n strict: false,\n }));\n\n let input: OpenAI.Responses.ResponseInputItem[] = [\n { role: 'user', content: userPrompt },\n ];\n let totalIn = 0;\n let totalOut = 0;\n let totalCacheRead = 0;\n let totalCacheWrite = 0;\n let allText = '';\n\n for (let turn = 0; turn < maxTurns; turn++) {\n const response: OpenAIResponse = await this.apiCall(() =>\n client.responses.create({\n model: resolvedModel,\n instructions: systemPrompt,\n input,\n tools: openaiTools,\n }),\n );\n // ggui#1186 (second site): non-cached input + cached subset, per turn.\n const turnUsage = splitOpenAiUsage(\n response.usage?.input_tokens ?? 0,\n response.usage?.output_tokens ?? 0,\n response.usage?.input_tokens_details?.cached_tokens ?? 0,\n response.usage?.input_tokens_details?.cache_write_tokens ?? 0,\n );\n totalIn += turnUsage.tokens.input;\n totalOut += turnUsage.tokens.output;\n totalCacheRead += turnUsage.cacheReadTokens;\n totalCacheWrite += turnUsage.cacheCreationTokens;\n\n const functionCalls = response.output.filter(\n (o): o is ResponseFunctionToolCall => o.type === 'function_call',\n );\n for (const item of response.output) {\n if (item.type === 'message') {\n for (const part of item.content) {\n if (part.type === 'output_text') allText += part.text;\n }\n }\n }\n\n if (functionCalls.length === 0) break;\n\n input = [\n ...(response.output as OpenAI.Responses.ResponseInputItem[]),\n ];\n for (const fc of functionCalls) {\n const tool = tools.find((t) => t.name === fc.name);\n const result = tool\n ? await tool.handler(\n JSON.parse(fc.arguments ?? '{}') as JsonObject,\n )\n : { content: [{ text: `Tool '${fc.name}' not found` }] };\n input.push({\n type: 'function_call_output',\n call_id: fc.call_id,\n output: result.content[0]?.text ?? '',\n });\n }\n }\n\n return {\n text: allText,\n inputTokens: totalIn,\n outputTokens: totalOut,\n cacheReadTokens: totalCacheRead,\n cacheCreationTokens: totalCacheWrite,\n turnsUsed: input.length,\n };\n }\n}\n\n// =============================================================================\n/**\n * `Interactions.GenerationConfig` as the Interactions API accepts it (ggui#1579). The SDK's type (@google/genai 2.15.0)\n * omits `temperature`, but the API takes `generation_config.temperature` and forwards it to the request's own: it\n * range-checks the value (2.5 is refused with \"GenerateContentRequest.generation_config.temperature: temperature must be\n * in the range [0.0, 2.0]\", 0 is accepted), while a key the API does not know is refused as \"Unknown parameter\". The\n * field is declared here so the call is built against a type that carries it, not left to a spread of an undeclared key.\n */\ntype InteractionsGenerationConfig = Interactions.GenerationConfig & { readonly temperature?: number };\n\n// GoogleAgent — uses Interactions API (server-side state, automatic caching)\n// =============================================================================\n\n/**\n * Concatenate text across all `model_output` steps of an interaction\n * (@google/genai >= 2.0.0 'steps' schema). Steps form a discriminated\n * union — even at thinking_level 'minimal' a `thought` step is present,\n * so iterate by discriminant and skip step types we don't consume.\n */\nfunction interactionText(interaction: Interactions.Interaction): string {\n let text = '';\n for (const step of interaction.steps ?? []) {\n if (step.type === 'model_output') {\n for (const content of step.content ?? []) {\n if (content.type === 'text') {\n text += content.text;\n }\n }\n }\n }\n return text;\n}\n\n/** Collect the function-call steps of an interaction. */\nfunction functionCallSteps(\n interaction: Interactions.Interaction,\n): Interactions.FunctionCallStep[] {\n return (interaction.steps ?? []).filter(\n (s): s is Interactions.FunctionCallStep => s.type === 'function_call',\n );\n}\n\n/**\n * Wrap a user prompt as a `user_input` step. In the 2.x request union a\n * mixed input array is `Array<Step>` — bare `{type:'text'}` content is\n * not a Step, so prompts sent alongside function_result steps must be\n * wrapped.\n */\nfunction toUserInputStep(text: string): Interactions.UserInputStep {\n return { type: 'user_input', content: [{ type: 'text', text }] };\n}\n\n/**\n * ggui#1186 (third site) — an Interactions `usage` split into the shared\n * convention: `total_input_tokens` includes the cached part of the prompt\n * (`total_cached_tokens`, per the SDK's own words), so the non-cached prompt\n * is the input and the cached subset is reported separately.\n */\nfunction googleInteractionUsage(\n usage: { total_input_tokens?: number; total_output_tokens?: number; total_cached_tokens?: number } | undefined,\n): { inputTokens: number; outputTokens: number; cacheReadTokens: number } {\n const split = splitCacheInclusiveUsage(usage?.total_input_tokens ?? 0, usage?.total_output_tokens ?? 0, usage?.total_cached_tokens ?? 0);\n return { inputTokens: split.tokens.input, outputTokens: split.tokens.output, cacheReadTokens: split.cacheReadTokens };\n}\n\nexport class GoogleAgent extends LLMAgent {\n readonly provider = 'google' as const;\n\n protected resolveModel(model: string): string {\n // Strip the LiteLLM transport prefix `gemini/` (Google AI Studio\n // route) so the GenAI SDK receives the bare model id it expects.\n // Pre-slice-#43 close-out this stripped `google/` instead — which\n // (a) doesn't match LiteLLM's `gemini/` convention and (b) silently\n // no-op'd against canonical `gemini/...` strings, then passed\n // them to the GenAI SDK which 4xx's on the prefixed form. Fixed\n // as part of the slice #43 audit. Bare ids pass through verbatim\n // (typed `LlmRoute` already guarantees wire-canonical at every\n // OSS call site).\n return model.startsWith('gemini/')\n ? model.slice('gemini/'.length)\n : model;\n }\n\n protected async createClient(): Promise<GoogleGenAI> {\n const { GoogleGenAI: GoogleGenAISDK } = await import('@google/genai');\n return new GoogleGenAISDK({\n apiKey:\n this.routeOverride?.apiKey ?? (process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY),\n httpOptions: { timeout: 300_000 }, // 5 min — Pro models can be slow\n });\n }\n\n async callText(\n model: string,\n systemPrompt: string,\n userPrompt: string,\n maxTokens?: number,\n temperature?: number,\n ): Promise<LLMResponse> {\n const client = await this.getClient<GoogleGenAI>();\n\n const generationConfig: InteractionsGenerationConfig = {\n ...(maxTokens ? { max_output_tokens: maxTokens } : {}),\n ...(temperature !== undefined ? { temperature } : {}),\n };\n\n const interaction = await this.apiCall(() =>\n client.interactions.create({\n model: this.resolveModel(model),\n system_instruction: systemPrompt,\n input: userPrompt,\n generation_config:\n Object.keys(generationConfig).length > 0 ? generationConfig : undefined,\n }),\n );\n\n return {\n text: interactionText(interaction),\n // ggui#1186 (third site): `total_input_tokens` INCLUDES the cached part of the prompt — report the non-cached input.\n inputTokens: googleInteractionUsage(interaction.usage).inputTokens,\n outputTokens: googleInteractionUsage(interaction.usage).outputTokens,\n sampling: { temperature: temperature ?? 'provider-default' },\n };\n }\n\n async callVision(\n model: string,\n systemPrompt: string,\n userPrompt: string,\n image: VisionImageInput,\n maxTokens?: number,\n ): Promise<LLMResponse> {\n const client = await this.getClient<GoogleGenAI>();\n const traceId = newLlmTraceId();\n const startedAt = Date.now();\n const resolvedModel = this.resolveModel(model);\n\n try {\n const response = await this.apiCall(() =>\n client.models.generateContent({\n model: resolvedModel,\n contents: [\n {\n role: 'user',\n parts: [\n { inlineData: { mimeType: image.mediaType, data: image.base64 } },\n { text: userPrompt },\n ],\n },\n ],\n config: {\n systemInstruction: systemPrompt,\n ...(maxTokens ? { maxOutputTokens: maxTokens } : {}),\n },\n }),\n );\n\n const text =\n response.candidates?.[0]?.content?.parts?.map((p) => p.text || '').join('') || '';\n const usage = response.usageMetadata;\n const result: LLMResponse = {\n text,\n // ggui#1186 (third site): `promptTokenCount` includes `cachedContentTokenCount` — report the non-cached input.\n inputTokens: splitCacheInclusiveUsage(usage?.promptTokenCount ?? 0, usage?.candidatesTokenCount ?? 0, usage?.cachedContentTokenCount ?? 0).tokens.input,\n outputTokens: usage?.candidatesTokenCount ?? 0,\n ...visionFinish(googleFinishReason(response.candidates?.[0]?.finishReason)),\n ...servedModelOf(response.modelVersion),\n };\n\n const endedAt = Date.now();\n // The image bytes stay OUT of the trace — a base64 screenshot\n // would balloon every event; the prompts identify the call.\n emitLlmTraceEvent({\n id: traceId,\n at: startedAt,\n endedAt,\n durationMs: endedAt - startedAt,\n provider: 'google',\n model: resolvedModel,\n kind: 'callVision',\n systemPrompt,\n userPrompt,\n result: {\n inputTokens: result.inputTokens,\n outputTokens: result.outputTokens,\n text,\n },\n });\n\n return result;\n } catch (e) {\n const endedAt = Date.now();\n emitLlmTraceEvent({\n id: traceId,\n at: startedAt,\n endedAt,\n durationMs: endedAt - startedAt,\n provider: 'google',\n model: resolvedModel,\n kind: 'callVision',\n systemPrompt,\n userPrompt,\n error: { message: e instanceof Error ? e.message : String(e) },\n });\n throw e;\n }\n }\n\n async callTools(\n model: string,\n systemPrompt: string,\n userPrompt: string,\n tools: LLMToolDef[],\n _toolChoice: 'required' | 'auto' = 'required',\n scopedTools?: LLMToolDef[],\n ): Promise<LLMToolCallResponse> {\n const client = await this.getClient<GoogleGenAI>();\n\n\n const interactionTools: Interactions.Function[] = tools.map((t) => ({\n type: 'function' as const,\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n }));\n const scopedInteractionTools: Interactions.Function[] | undefined = scopedTools?.map((t) => ({\n type: 'function' as const,\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n }));\n\n // Chain off previous interaction if available — server has system prompt + tools\n const resolvedModel = this.resolveModel(model);\n\n // Consume pending tool results — prepend them to the input so the API\n // sees function_result + the new prompt (as a user_input step) in one\n // call (saves a round-trip)\n const pending = this.pendingToolResults;\n this.pendingToolResults = [];\n const input: string | Interactions.Step[] = pending.length > 0\n ? [...pending, toUserInputStep(userPrompt)]\n : userPrompt;\n\n const createInteraction = () =>\n this.lastSessionId\n ? client.interactions.create({\n model: resolvedModel,\n previous_interaction_id: this.lastSessionId,\n input,\n tools: interactionTools,\n generation_config: { max_output_tokens: 16384 },\n })\n : client.interactions.create({\n model: resolvedModel,\n system_instruction: systemPrompt,\n tools: interactionTools,\n input: userPrompt,\n generation_config: { max_output_tokens: 16384 },\n });\n\n // Retry up to 3 attempts for malformed_tool_call (model generates invalid JSON).\n // If all 3 fail AND scopedTools were provided, one final attempt with the\n // narrower scoped tool schema. Universal runtime-signal fallback — the\n // signal is the transport error, not the provider identity.\n let interaction!: Interactions.Interaction;\n const MAX_MALFORMED_RETRIES = 3;\n let succeeded = false;\n for (let attempt = 0; attempt < MAX_MALFORMED_RETRIES; attempt++) {\n try {\n if (attempt === 0) {\n interaction = await this.apiCall(createInteraction);\n } else {\n const jsonHint = '\\n\\nIMPORTANT: Your previous response had invalid JSON. Produce valid JSON in your tool call arguments.';\n const retryPrompt = userPrompt + jsonHint;\n interaction = await this.apiCall(() =>\n this.lastSessionId\n ? client.interactions.create({\n model: resolvedModel,\n previous_interaction_id: this.lastSessionId,\n input: pending.length > 0\n ? [...pending, toUserInputStep(retryPrompt)]\n : retryPrompt,\n tools: interactionTools,\n generation_config: { max_output_tokens: 16384 },\n })\n : client.interactions.create({\n model: resolvedModel,\n system_instruction: systemPrompt,\n tools: interactionTools,\n input: retryPrompt,\n generation_config: { max_output_tokens: 16384 },\n }),\n );\n }\n succeeded = true;\n break;\n } catch (e: unknown) {\n const msg = e instanceof Error ? e.message : String(e);\n if (msg.includes('malformed_tool_call') && attempt < MAX_MALFORMED_RETRIES - 1) {\n console.warn(`[google] malformed_tool_call (attempt ${attempt + 1}/${MAX_MALFORMED_RETRIES}) — retrying`);\n continue;\n }\n if (msg.includes('malformed_tool_call') && scopedInteractionTools) {\n // Exhausted primary retries — try once more with the scoped\n // tool schema. The narrower tool forces a smaller payload\n // that's less likely to trip JSON emission.\n console.warn('[google] malformed_tool_call exhausted — retrying with scoped tool schema');\n const scopedHint = '\\n\\nYour previous response exceeded the tool-call payload budget. Produce a SINGLE small change (≤20 lines) using the narrowed tool schema.';\n const scopedPrompt = userPrompt + scopedHint;\n try {\n interaction = await this.apiCall(() =>\n this.lastSessionId\n ? client.interactions.create({\n model: resolvedModel,\n previous_interaction_id: this.lastSessionId,\n input: pending.length > 0\n ? [...pending, toUserInputStep(scopedPrompt)]\n : scopedPrompt,\n tools: scopedInteractionTools,\n generation_config: { max_output_tokens: 16384 },\n })\n : client.interactions.create({\n model: resolvedModel,\n system_instruction: systemPrompt,\n tools: scopedInteractionTools,\n input: scopedPrompt,\n generation_config: { max_output_tokens: 16384 },\n }),\n );\n succeeded = true;\n break;\n } catch (e2: unknown) {\n const msg2 = e2 instanceof Error ? e2.message : String(e2);\n console.error(`[google] scoped retry FAILED: ${msg2.slice(0, 300)}`);\n throw e2;\n }\n }\n console.error(`[google] callTools FAILED: ${msg.slice(0, 300)}`);\n throw e;\n }\n }\n if (!succeeded) throw new Error('[google] callTools: exhausted retries without success');\n\n // Save session ID for chaining subsequent calls\n this.lastSessionId = interaction.id;\n\n const toolCalls = functionCallSteps(interaction).map((fc) => ({\n id: fc.id,\n name: fc.name,\n input: toolArgsToJsonObject(fc.arguments),\n }));\n\n return {\n toolCalls,\n // ggui#1186 (third site): the coding loop reads this per-turn usage — the non-cached prompt as input, the cached subset reported.\n ...googleInteractionUsage(interaction.usage),\n };\n }\n\n // Pending tool results — stored by sendToolResult, consumed by next callTools\n private pendingToolResults: Interactions.FunctionResultStep[] = [];\n\n override async sendToolResult(results: LLMToolResult[]): Promise<void> {\n // Store results locally — they'll be prepended to the next callTools input.\n // No API call here! Saves ~5.8s per turn.\n this.pendingToolResults = results.map((r) => ({\n type: 'function_result' as const,\n call_id: r.callId ?? '',\n name: r.name,\n result: r.result,\n is_error: r.isError,\n }));\n }\n\n async callWithTools(\n model: string,\n systemPrompt: string,\n userPrompt: string,\n tools: LLMTool[],\n maxTurns: number,\n ): Promise<LLMWithToolsResponse> {\n const client = await this.getClient<GoogleGenAI>();\n\n\n const interactionTools: Interactions.Function[] = tools.map((t) => ({\n type: 'function' as const,\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n }));\n\n let totalIn = 0;\n let totalOut = 0;\n let totalCacheRead = 0;\n let allText = '';\n let turnsUsed = 0;\n\n // Turn 1: system instruction + tools + user prompt\n let interaction = await this.apiCall(() =>\n client.interactions.create({\n model: this.resolveModel(model),\n system_instruction: systemPrompt,\n tools: interactionTools,\n input: userPrompt,\n }),\n );\n\n for (let turn = 0; turn < maxTurns; turn++) {\n turnsUsed = turn + 1;\n\n if (interaction.usage) {\n // ggui#1186 (third site): non-cached input + cached subset, per turn.\n const turnUsage = googleInteractionUsage(interaction.usage);\n totalIn += turnUsage.inputTokens;\n totalOut += turnUsage.outputTokens;\n totalCacheRead += turnUsage.cacheReadTokens;\n }\n\n // Collect text\n allText += interactionText(interaction);\n\n // Collect function calls\n const fnCalls = functionCallSteps(interaction);\n\n if (fnCalls.length === 0) break;\n\n // Execute tools and build function_result inputs\n const results: Interactions.FunctionResultStep[] = [];\n for (const fc of fnCalls) {\n const tool = tools.find((t) => t.name === fc.name);\n if (!tool) {\n results.push({\n type: 'function_result',\n call_id: fc.id,\n name: fc.name,\n result: JSON.stringify({ error: `Tool '${fc.name}' not found` }),\n is_error: true,\n });\n continue;\n }\n const result = await tool.handler(toolArgsToJsonObject(fc.arguments));\n results.push({\n type: 'function_result',\n call_id: fc.id,\n name: fc.name,\n result: result.content.map((c) => c.text).join('\\n'),\n });\n }\n\n // Next turn: only send function results — server has the history\n interaction = await this.apiCall(() =>\n client.interactions.create({\n model: this.resolveModel(model),\n previous_interaction_id: interaction.id,\n input: results,\n }),\n );\n }\n\n return {\n text: allText,\n inputTokens: totalIn,\n outputTokens: totalOut,\n cacheReadTokens: totalCacheRead,\n turnsUsed,\n };\n }\n}\n\n// =============================================================================\n// OpenRouterAgent\n// =============================================================================\n\nexport class OpenRouterAgent extends LLMAgent {\n readonly provider = 'openrouter' as const;\n\n // Client-side session history — system prompt sent once, subsequent\n // callTools() calls append to the conversation without re-sending it.\n private sessionMessages: import('../adapters/openrouter/types').OpenRouterMessage[] = [];\n\n protected resolveModel(model: string): string {\n // Strip 'openrouter/' prefix — OpenRouter API expects 'provider/model'\n // e.g., 'openrouter/anthropic/claude-3.5-sonnet' → 'anthropic/claude-3.5-sonnet'\n return model.startsWith('openrouter/')\n ? model.slice('openrouter/'.length)\n : model;\n }\n\n override resetSession(): void {\n super.resetSession();\n this.sessionMessages = [];\n }\n\n protected async createClient(): Promise<unknown> {\n const { OpenRouterClient } = await import('../adapters/openrouter/client');\n return new OpenRouterClient({\n apiKey: this.routeOverride?.apiKey ?? process.env.OPENROUTER_API_KEY!,\n });\n }\n\n async callText(\n model: string,\n systemPrompt: string,\n userPrompt: string,\n maxTokens?: number,\n temperature?: number,\n ): Promise<LLMResponse> {\n type Client = import('../adapters/openrouter/client').OpenRouterClient;\n const client = await this.getClient<Client>();\n const resolved = this.resolveModel(model);\n\n const response = await this.apiCall(() =>\n client.chatCompletion({\n model: resolved,\n messages: [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userPrompt },\n ],\n max_tokens: maxTokens ?? 4096,\n ...(temperature !== undefined && { temperature }),\n }),\n );\n\n const text = response.choices[0]?.message.content ?? '';\n return {\n text,\n inputTokens: response.usage.prompt_tokens,\n outputTokens: response.usage.completion_tokens,\n sampling: { temperature: temperature ?? 'provider-default' },\n };\n }\n\n async callTools(\n model: string,\n systemPrompt: string,\n userPrompt: string,\n tools: LLMToolDef[],\n toolChoice?: 'required' | 'auto',\n _scopedTools?: LLMToolDef[],\n ): Promise<LLMToolCallResponse> {\n type Client = import('../adapters/openrouter/client').OpenRouterClient;\n const client = await this.getClient<Client>();\n const resolved = this.resolveModel(model);\n\n const orTools = tools.map((t) => ({\n type: 'function' as const,\n function: { name: t.name, description: t.description, parameters: t.parameters },\n }));\n\n // Build messages — first call sends system prompt, subsequent calls reuse session\n if (this.sessionMessages.length === 0) {\n this.sessionMessages.push({ role: 'system', content: systemPrompt });\n }\n this.sessionMessages.push({ role: 'user', content: userPrompt });\n\n // ggui#1254 — OpenRouter forwards the tool choice to the upstream, so an\n // Anthropic family that refuses a forced tool choice (Fable 5.1, Opus 5.5;\n // OpenRouter spells them `anthropic/claude-opus-5.5`) 400s here exactly as\n // it does direct. Same guard, same disclosure as the Anthropic adapter.\n const requested = toolChoice ?? 'auto';\n const appliedToolChoice: 'required' | 'auto' =\n requested === 'required' && anthropicRejectsForcedToolChoice(resolved) ? 'auto' : requested;\n if (appliedToolChoice !== requested) {\n console.warn(\n `[openrouter] callTools: ${resolved} would reject a forced tool_choice (the API answers 400); caller's 'required' downgraded to 'auto' before sending`,\n );\n }\n\n const response = await this.apiCall(() =>\n client.chatCompletion({\n model: resolved,\n messages: this.sessionMessages,\n tools: orTools,\n tool_choice: appliedToolChoice,\n }),\n );\n\n // Append assistant response to session history\n const choice = response.choices[0];\n if (choice?.message) {\n this.sessionMessages.push({\n role: 'assistant',\n content: choice.message.content,\n tool_calls: choice.message.tool_calls,\n });\n }\n\n const toolCalls = (choice?.message.tool_calls ?? []).map((tc) => ({\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments || '{}') as JsonObject,\n }));\n\n return {\n toolCalls,\n inputTokens: response.usage.prompt_tokens,\n outputTokens: response.usage.completion_tokens,\n appliedToolChoice,\n };\n }\n\n override async sendToolResult(results: LLMToolResult[]): Promise<void> {\n // Append tool results to session history — proper chat contract\n for (const r of results) {\n this.sessionMessages.push({\n role: 'tool',\n tool_call_id: r.callId,\n content: r.result,\n });\n }\n }\n\n async callWithTools(\n model: string,\n systemPrompt: string,\n userPrompt: string,\n tools: LLMTool[],\n maxTurns: number,\n ): Promise<LLMWithToolsResponse> {\n type Client = import('../adapters/openrouter/client').OpenRouterClient;\n const client = await this.getClient<Client>();\n const resolved = this.resolveModel(model);\n\n const orTools = tools.map((t) => ({\n type: 'function' as const,\n function: { name: t.name, description: t.description, parameters: t.parameters },\n }));\n\n type ORMessage = import('../adapters/openrouter/types').OpenRouterMessage;\n const messages: ORMessage[] = [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userPrompt },\n ];\n\n let totalInput = 0;\n let totalOutput = 0;\n let turnsUsed = 0;\n let finalText = '';\n\n for (let turn = 0; turn < maxTurns; turn++) {\n turnsUsed = turn + 1;\n\n const response = await this.apiCall(() =>\n client.chatCompletion({\n model: resolved,\n messages: messages as import('../adapters/openrouter/types').OpenRouterMessage[],\n tools: orTools,\n tool_choice: 'auto',\n }),\n );\n\n totalInput += response.usage.prompt_tokens;\n totalOutput += response.usage.completion_tokens;\n\n const choice = response.choices[0];\n if (!choice) break;\n\n if (choice.message.content) {\n finalText = choice.message.content;\n }\n\n const toolCalls = choice.message.tool_calls;\n if (!toolCalls || toolCalls.length === 0) break;\n\n messages.push({\n role: 'assistant',\n content: choice.message.content,\n tool_calls: toolCalls,\n });\n\n for (const tc of toolCalls) {\n const toolDef = tools.find((t) => t.name === tc.function.name);\n let resultText: string;\n if (!toolDef) {\n resultText = JSON.stringify({ error: `Tool '${tc.function.name}' not found` });\n } else {\n const args = JSON.parse(tc.function.arguments || '{}') as JsonObject;\n const result = await toolDef.handler(args);\n resultText = result.content.map((c) => c.text).join('\\n');\n }\n messages.push({ role: 'tool', tool_call_id: tc.id, content: resultText });\n }\n }\n\n return { text: finalText, inputTokens: totalInput, outputTokens: totalOutput, turnsUsed };\n }\n}\n\n// =============================================================================\n// Agent Registry\n// =============================================================================\n\n/**\n * Create a fresh agent instance for the given provider.\n * Each call returns a new instance — no shared state between callers.\n *\n * Accepts either a bare provider string (every pre-existing call\n * site — the agent falls back to reading its provider's env var(s)\n * directly) or a full {@link AgentConfig}, whose `routeOverride`\n * (when present) is threaded into the constructed agent so it never\n * touches `process.env`.\n */\nexport function createAgent(provider: AgentConfig['provider']): LLMAgent;\nexport function createAgent(config: AgentConfig): LLMAgent;\nexport function createAgent(providerOrConfig: AgentConfig['provider'] | AgentConfig): LLMAgent {\n const provider =\n typeof providerOrConfig === 'string' ? providerOrConfig : providerOrConfig.provider;\n const routeOverride =\n typeof providerOrConfig === 'string' ? undefined : providerOrConfig.routeOverride;\n const onRetry = typeof providerOrConfig === 'string' ? undefined : providerOrConfig.onRetry;\n if (routeOverride?.claudeCodeLogin === true) {\n if (provider !== 'anthropic') {\n throw new Error(\n `${provider}: the claude-code-login credential authenticates the Claude Code binary only — pick an anthropic route or supply a ${provider} API key`,\n );\n }\n return new ClaudeCodeLoginAgent(routeOverride, onRetry);\n }\n switch (provider) {\n case 'anthropic':\n return new AnthropicAgent(routeOverride, onRetry);\n case 'openai':\n return new OpenAIAgent(routeOverride, onRetry);\n case 'google':\n return new GoogleAgent(routeOverride, onRetry);\n case 'openrouter':\n return new OpenRouterAgent(routeOverride, onRetry);\n }\n}\n\n/** Providers whose agent implements {@link VisionAgent}. */\nexport type VisionProvider = 'anthropic' | 'google';\n\n/**\n * Construct an agent for a multimodal (image + text) call. Same\n * threading contract as {@link createAgent} — `routeOverride` and\n * `onRetry` from the config reach the constructed agent — with the\n * provider narrowed to the ones whose SDK path supports vision input,\n * so the returned type carries `callVision` statically instead of\n * every caller re-proving it.\n */\nexport function createVisionAgent(\n config: AgentConfig & { provider: VisionProvider },\n): LLMAgent & VisionAgent {\n if (config.routeOverride?.claudeCodeLogin === true) {\n if (config.provider !== 'anthropic') {\n throw new Error(\n `${config.provider}: the claude-code-login credential authenticates the Claude Code binary only — pick an anthropic route or supply a ${config.provider} API key`,\n );\n }\n return new ClaudeCodeLoginAgent(config.routeOverride, config.onRetry);\n }\n switch (config.provider) {\n case 'anthropic':\n return new AnthropicAgent(config.routeOverride, config.onRetry);\n case 'google':\n return new GoogleAgent(config.routeOverride, config.onRetry);\n default: {\n // ggui#1248 — refused by NAME, never answered with `undefined`: a caller that\n // asserted its way past the type got back an agent it could not call, and the\n // throw surfaced three frames later as \"reading 'callVision'\".\n const unreachable: never = config.provider;\n throw new Error(`createVisionAgent: provider '${String(unreachable)}' has no vision path (anthropic, google)`);\n }\n }\n}\n\n// =============================================================================\n// Backward-compatible free functions\n// =============================================================================\n\nexport async function callLLM(\n config: AgentConfig,\n systemPrompt: string,\n userPrompt: string,\n maxTokens?: number,\n): Promise<LLMResponse> {\n const start = Date.now();\n const agent = createAgent(config);\n const result = await agent.callText(\n config.model,\n systemPrompt,\n userPrompt,\n maxTokens,\n config.temperature,\n );\n console.log(\n `[llm-router] ${config.provider}/${config.model} | ${Date.now() - start}ms | in=${result.inputTokens} out=${result.outputTokens}`,\n );\n return result;\n}\n\nexport async function callLLMWithTools(\n config: AgentConfig,\n systemPrompt: string,\n userPrompt: string,\n tools: LLMTool[],\n maxTurns: number = 10,\n): Promise<LLMWithToolsResponse> {\n const start = Date.now();\n const agent = createAgent(config);\n const result = await agent.callWithTools(\n config.model,\n systemPrompt,\n userPrompt,\n tools,\n maxTurns,\n );\n console.log(\n `[llm-router] agentic ${config.provider}/${config.model} | ${Date.now() - start}ms | turns=${result.turnsUsed} | in=${result.inputTokens} out=${result.outputTokens}`,\n );\n return result;\n}\n\n\n/** What {@link preloadProviderSdks} loaded, and what it could not, by specifier. */\nexport interface ProviderSdkPreload {\n readonly ms: number;\n readonly loaded: readonly string[];\n readonly missing: ReadonlyArray<{ readonly specifier: string; readonly reason: string }>;\n}\n\n/**\n * ggui#1769 — load the provider SDKs this router imports lazily, once, before a long-lived host takes traffic.\n *\n * Each agent imports its SDK on first use. Cold, `@anthropic-ai/claude-agent-sdk` alone compiles for ~0.9 s\n * synchronously, so a host's first generation stalls the event loop for that long mid-request. A host awaits\n * this at boot instead; afterwards every `import()` below resolves from the module cache.\n *\n * Never rejects: an SDK that is not installed (an optional provider a deployment does not use) is reported in\n * `missing` with its reason, and its agent fails on first use exactly as it would without the preload.\n */\nexport async function preloadProviderSdks(): Promise<ProviderSdkPreload> {\n const start = Date.now();\n const attempts: ReadonlyArray<readonly [string, () => Promise<object>]> = [\n ['@anthropic-ai/claude-agent-sdk', () => import('@anthropic-ai/claude-agent-sdk')],\n ['openai', () => import('openai')],\n ['@google/genai', () => import('@google/genai')],\n ['@anthropic-ai/bedrock-sdk', () => import('@anthropic-ai/bedrock-sdk')],\n ];\n const settled = await Promise.allSettled(attempts.map(([, load]) => load()));\n const loaded: string[] = [];\n const missing: { specifier: string; reason: string }[] = [];\n settled.forEach((r, i) => {\n const specifier = attempts[i]?.[0] ?? '';\n if (r.status === 'fulfilled') loaded.push(specifier);\n else missing.push({ specifier, reason: r.reason instanceof Error ? r.reason.message : String(r.reason) });\n });\n return { ms: Date.now() - start, loaded, missing };\n}\n"]}
@@ -0,0 +1,29 @@
1
+ // src/adapters/openai/tokens.ts
2
+ function splitOpenAiUsage(inputTokensInclCached, outputTokens, cachedTokens, cacheWriteTokens) {
3
+ const split = splitCacheInclusiveUsage(inputTokensInclCached, outputTokens, cachedTokens);
4
+ const cacheCreation = Math.min(Math.max(cacheWriteTokens, 0), split.tokens.input);
5
+ return {
6
+ tokens: { input: split.tokens.input - cacheCreation, output: split.tokens.output, total: split.tokens.total },
7
+ cacheReadTokens: split.cacheReadTokens,
8
+ cacheCreationTokens: cacheCreation
9
+ };
10
+ }
11
+ function splitCacheInclusiveUsage(inputTokensInclCached, outputTokens, cachedTokens) {
12
+ const cacheRead = Math.min(
13
+ Math.max(cachedTokens, 0),
14
+ Math.max(inputTokensInclCached, 0)
15
+ );
16
+ const nonCachedInput = Math.max(inputTokensInclCached, 0) - cacheRead;
17
+ return {
18
+ tokens: {
19
+ input: nonCachedInput,
20
+ output: outputTokens,
21
+ total: nonCachedInput + cacheRead + outputTokens
22
+ },
23
+ cacheReadTokens: cacheRead
24
+ };
25
+ }
26
+
27
+ export { splitCacheInclusiveUsage, splitOpenAiUsage };
28
+ //# sourceMappingURL=chunk-OVLH5ICV.js.map
29
+ //# sourceMappingURL=chunk-OVLH5ICV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/openai/tokens.ts"],"names":[],"mappings":";AAmCO,SAAS,gBAAA,CACd,qBAAA,EACA,YAAA,EACA,YAAA,EACA,gBAAA,EAC2F;AAC3F,EAAA,MAAM,KAAA,GAAQ,wBAAA,CAAyB,qBAAA,EAAuB,YAAA,EAAc,YAAY,CAAA;AAExF,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,kBAAkB,CAAC,CAAA,EAAG,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAChF,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,EAAE,KAAA,EAAO,KAAA,CAAM,OAAO,KAAA,GAAQ,aAAA,EAAe,MAAA,EAAQ,KAAA,CAAM,MAAA,CAAO,MAAA,EAAQ,KAAA,EAAO,KAAA,CAAM,OAAO,KAAA,EAAM;AAAA,IAC5G,iBAAiB,KAAA,CAAM,eAAA;AAAA,IACvB,mBAAA,EAAqB;AAAA,GACvB;AACF;AAYO,SAAS,wBAAA,CACd,qBAAA,EACA,YAAA,EACA,YAAA,EAC8D;AAE9D,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA;AAAA,IACrB,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,CAAC,CAAA;AAAA,IACxB,IAAA,CAAK,GAAA,CAAI,qBAAA,EAAuB,CAAC;AAAA,GACnC;AACA,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,qBAAA,EAAuB,CAAC,CAAA,GAAI,SAAA;AAC5D,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,cAAA;AAAA,MACP,MAAA,EAAQ,YAAA;AAAA,MACR,KAAA,EAAO,iBAAiB,SAAA,GAAY;AAAA,KACtC;AAAA,IACA,eAAA,EAAiB;AAAA,GACnB;AACF","file":"chunk-OVLH5ICV.js","sourcesContent":["import type { AdapterResult } from '../types';\n\n/**\n * Split an OpenAI usage report into the shared cross-adapter token\n * convention (ggui#1186).\n *\n * OpenAI reports the cached prompt tokens as a SUBSET already counted\n * inside its input token total (`usage.input_tokens` on the Responses\n * API, `usage.inputTokens` on the Agents SDK, both INCLUDING cached\n * tokens). Anthropic (and OpenRouter's Anthropic passthrough) instead\n * report `input_tokens` EXCLUDING cache reads, with cache reads as a\n * separate field.\n *\n * The whole fleet reads one convention: **`tokens.input` is the\n * NON-cached input; `cacheReadTokens` is the cache-hit subset.** Cost\n * and observability consumers price/aggregate `input` at the full input\n * rate and `cacheReadTokens` at the cache-read rate, so the cached\n * portion must appear in exactly one of the two — never both. Reporting\n * OpenAI's cache-inclusive `input_tokens` as `tokens.input` while also\n * populating `cacheReadTokens` would double-count the cached tokens (it\n * inflates `$/gen` and breaks `render_cache_metric`'s `cacheReadPct`\n * denominator). So the OpenAI adapters subtract the cached subset here.\n *\n * Cache WRITES are the same kind of subset (ggui#1957): OpenAI bills them on\n * GPT-5.6 and later (1.25× input) and reports them as\n * `input_tokens_details.cache_write_tokens`, \"the number of input tokens\n * that were written to the cache\", inside the same input total. They are\n * subtracted from `input` as the reads are and reported as\n * `cacheCreationTokens`, so a consumer prices them at the cache-write rate,\n * exactly once.\n *\n * `total` is the full processed footprint (non-cached input + cache reads +\n * cache writes + output = `inputTokensInclCached + outputTokens`), matching\n * the Claude adapter's `total` (input + cacheCreation + cacheRead + output).\n */\nexport function splitOpenAiUsage(\n inputTokensInclCached: number,\n outputTokens: number,\n cachedTokens: number,\n cacheWriteTokens: number,\n): { tokens: AdapterResult['tokens']; cacheReadTokens: number; cacheCreationTokens: number } {\n const split = splitCacheInclusiveUsage(inputTokensInclCached, outputTokens, cachedTokens);\n // Never let a malformed usage report drive input negative: the writes are at most what remains after the reads.\n const cacheCreation = Math.min(Math.max(cacheWriteTokens, 0), split.tokens.input);\n return {\n tokens: { input: split.tokens.input - cacheCreation, output: split.tokens.output, total: split.tokens.total },\n cacheReadTokens: split.cacheReadTokens,\n cacheCreationTokens: cacheCreation,\n };\n}\n\n/**\n * The provider-neutral form of the split above (ggui#1186, third site): any\n * provider whose reported input token count INCLUDES the cached part of the\n * prompt — OpenAI's `input_tokens` + `input_tokens_details.cached_tokens`,\n * Gemini's `total_input_tokens` + `total_cached_tokens` and\n * `promptTokenCount` + `cachedContentTokenCount` (\"the cached part of the\n * prompt\", per the SDK) — is split the same way into the non-cached input and\n * the cached subset, so `input` is never double-counted and `total` stays the\n * full footprint.\n */\nexport function splitCacheInclusiveUsage(\n inputTokensInclCached: number,\n outputTokens: number,\n cachedTokens: number,\n): { tokens: AdapterResult['tokens']; cacheReadTokens: number } {\n // Never let a malformed usage report drive input negative.\n const cacheRead = Math.min(\n Math.max(cachedTokens, 0),\n Math.max(inputTokensInclCached, 0),\n );\n const nonCachedInput = Math.max(inputTokensInclCached, 0) - cacheRead;\n return {\n tokens: {\n input: nonCachedInput,\n output: outputTokens,\n total: nonCachedInput + cacheRead + outputTokens,\n },\n cacheReadTokens: cacheRead,\n };\n}\n"]}
@@ -0,0 +1,106 @@
1
+ import { createCapture, captureSourceCode, captureCompiledCode, captureMarkers } from './chunk-YJZTUY7B.js';
2
+ import { GeneratorAdapter, hasCredentials } from './chunk-XRBCRKA2.js';
3
+
4
+ // src/adapters/google/sdk.ts
5
+ var GoogleSdkAdapter = class extends GeneratorAdapter {
6
+ provider = "google";
7
+ mode = "sdk";
8
+ displayName = "Google Gemini (ADK)";
9
+ constructor(config = {}) {
10
+ super(config);
11
+ }
12
+ isAvailable() {
13
+ return hasCredentials(this.config, "GEMINI_API_KEY", "GOOGLE_API_KEY");
14
+ }
15
+ async generate(params) {
16
+ const apiKey = this.config.apiKey || process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY;
17
+ return runAdkLoop({
18
+ systemPrompt: params.systemPrompt,
19
+ userPrompt: params.userPrompt,
20
+ model: params.model,
21
+ tools: params.tools,
22
+ apiKey
23
+ });
24
+ }
25
+ };
26
+ async function runAdkLoop(params) {
27
+ const startTime = Date.now();
28
+ const { FunctionTool, Gemini, LlmAgent, InMemoryRunner, isFinalResponse } = await import('@google/adk');
29
+ const capture = createCapture();
30
+ const adkTools = params.tools.map(
31
+ (def) => new FunctionTool({
32
+ name: def.name,
33
+ description: def.description,
34
+ // Pass Zod schema directly — ADK accepts ZodObject natively
35
+ parameters: def.inputSchema,
36
+ execute: async (args) => {
37
+ const typedArgs = args ?? {};
38
+ captureSourceCode(capture, def.name, typedArgs);
39
+ const result = await def.handler(typedArgs);
40
+ captureCompiledCode(capture, def.name, result);
41
+ return result.content[0]?.text ?? "";
42
+ }
43
+ })
44
+ );
45
+ const model = params.apiKey ? new Gemini({ model: params.model, apiKey: params.apiKey }) : params.model;
46
+ const agent = new LlmAgent({
47
+ name: "ui_generator",
48
+ model,
49
+ instruction: params.systemPrompt,
50
+ tools: adkTools
51
+ });
52
+ const runner = new InMemoryRunner({ agent, appName: "ggui_generator" });
53
+ const session = await runner.sessionService.createSession({
54
+ appName: "ggui_generator",
55
+ userId: "benchmark"
56
+ });
57
+ const userMessage = {
58
+ role: "user",
59
+ parts: [{ text: params.userPrompt }]
60
+ };
61
+ let finalText = "";
62
+ let turnCount = 0;
63
+ let totalInputTokens = 0;
64
+ let totalOutputTokens = 0;
65
+ for await (const event of runner.runAsync({
66
+ userId: "benchmark",
67
+ sessionId: session.id,
68
+ newMessage: userMessage
69
+ })) {
70
+ turnCount++;
71
+ const usage = event.usageMetadata;
72
+ if (usage) {
73
+ totalInputTokens += usage.promptTokenCount ?? 0;
74
+ totalOutputTokens += usage.candidatesTokenCount ?? 0;
75
+ }
76
+ if (event.content?.parts) {
77
+ const text = event.content.parts.map((p) => p.text ?? "").join("");
78
+ if (text) captureMarkers(capture, text);
79
+ }
80
+ if (isFinalResponse(event)) {
81
+ const parts = event.content?.parts;
82
+ finalText = parts?.map((p) => p.text ?? "").join("") ?? "";
83
+ }
84
+ }
85
+ if (finalText) captureMarkers(capture, finalText);
86
+ if (!capture.compiledCode) {
87
+ throw new Error("Google ADK adapter: no compiled code produced after all turns");
88
+ }
89
+ return {
90
+ compiledCode: capture.compiledCode,
91
+ sourceCode: capture.sourceCode,
92
+ stream: capture.stream,
93
+ generatorMeta: capture.generatorMeta,
94
+ tokens: {
95
+ input: totalInputTokens,
96
+ output: totalOutputTokens,
97
+ total: totalInputTokens + totalOutputTokens
98
+ },
99
+ generationTimeMs: Date.now() - startTime,
100
+ turnsUsed: turnCount
101
+ };
102
+ }
103
+
104
+ export { GoogleSdkAdapter, runAdkLoop };
105
+ //# sourceMappingURL=chunk-PBOYHGSD.js.map
106
+ //# sourceMappingURL=chunk-PBOYHGSD.js.map