@theokit/sdk 4.23.0 → 4.25.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 (374) hide show
  1. package/dist/a2a/index.cjs +10 -171
  2. package/dist/a2a/index.cjs.map +1 -1
  3. package/dist/a2a/index.js +3 -170
  4. package/dist/a2a/index.js.map +1 -1
  5. package/dist/agent-factory-registry-UU46BUMU.cjs +16 -0
  6. package/dist/agent-factory-registry-UU46BUMU.cjs.map +1 -0
  7. package/dist/agent-factory-registry-ZVTABLEY.js +3 -0
  8. package/dist/agent-factory-registry-ZVTABLEY.js.map +1 -0
  9. package/dist/auth/index.cjs +63 -343
  10. package/dist/auth/index.cjs.map +1 -1
  11. package/dist/auth/index.js +6 -318
  12. package/dist/auth/index.js.map +1 -1
  13. package/dist/batch-2FSD2UNL.cjs +244 -0
  14. package/dist/batch-2FSD2UNL.cjs.map +1 -0
  15. package/dist/batch-MR2HKYMS.js +241 -0
  16. package/dist/batch-MR2HKYMS.js.map +1 -0
  17. package/dist/chunk-2HRYBRD7.cjs +31 -0
  18. package/dist/chunk-2HRYBRD7.cjs.map +1 -0
  19. package/dist/chunk-2MF3IE2D.cjs +2863 -0
  20. package/dist/chunk-2MF3IE2D.cjs.map +1 -0
  21. package/dist/chunk-2ONFGMBV.js +6 -0
  22. package/dist/chunk-2ONFGMBV.js.map +1 -0
  23. package/dist/chunk-2SFBB54R.js +23 -0
  24. package/dist/chunk-2SFBB54R.js.map +1 -0
  25. package/dist/chunk-2XLKLVVR.js +18 -0
  26. package/dist/chunk-2XLKLVVR.js.map +1 -0
  27. package/dist/chunk-4HKMQEPX.js +458 -0
  28. package/dist/chunk-4HKMQEPX.js.map +1 -0
  29. package/dist/chunk-4SXHEZIV.cjs +240 -0
  30. package/dist/chunk-4SXHEZIV.cjs.map +1 -0
  31. package/dist/chunk-4VPXM6UU.js +10 -0
  32. package/dist/chunk-4VPXM6UU.js.map +1 -0
  33. package/dist/chunk-4WL52CXU.cjs +148 -0
  34. package/dist/chunk-4WL52CXU.cjs.map +1 -0
  35. package/dist/chunk-5NBUH3NO.js +39 -0
  36. package/dist/chunk-5NBUH3NO.js.map +1 -0
  37. package/dist/chunk-5PZMMF4H.js +43 -0
  38. package/dist/chunk-5PZMMF4H.js.map +1 -0
  39. package/dist/chunk-6CLRANZA.js +289 -0
  40. package/dist/chunk-6CLRANZA.js.map +1 -0
  41. package/dist/chunk-6JSIEDKL.cjs +121 -0
  42. package/dist/chunk-6JSIEDKL.cjs.map +1 -0
  43. package/dist/chunk-6M4ODB2V.cjs +145 -0
  44. package/dist/chunk-6M4ODB2V.cjs.map +1 -0
  45. package/dist/chunk-6X6ID4MO.js +20 -0
  46. package/dist/chunk-6X6ID4MO.js.map +1 -0
  47. package/dist/chunk-77FOZCOT.js +165 -0
  48. package/dist/chunk-77FOZCOT.js.map +1 -0
  49. package/dist/chunk-7AD3ZTZL.js +25 -0
  50. package/dist/chunk-7AD3ZTZL.js.map +1 -0
  51. package/dist/chunk-7GFX45DD.js +57 -0
  52. package/dist/chunk-7GFX45DD.js.map +1 -0
  53. package/dist/chunk-7RMWOMDB.cjs +460 -0
  54. package/dist/chunk-7RMWOMDB.cjs.map +1 -0
  55. package/dist/chunk-7S7KKUO6.cjs +45 -0
  56. package/dist/chunk-7S7KKUO6.cjs.map +1 -0
  57. package/dist/chunk-7W7ZWMLQ.js +99 -0
  58. package/dist/chunk-7W7ZWMLQ.js.map +1 -0
  59. package/dist/chunk-A44COQJJ.cjs +353 -0
  60. package/dist/chunk-A44COQJJ.cjs.map +1 -0
  61. package/dist/chunk-AKSBP7OO.js +185 -0
  62. package/dist/chunk-AKSBP7OO.js.map +1 -0
  63. package/dist/chunk-ANIZEWTU.cjs +196 -0
  64. package/dist/chunk-ANIZEWTU.cjs.map +1 -0
  65. package/dist/chunk-BEURCLDV.cjs +139 -0
  66. package/dist/chunk-BEURCLDV.cjs.map +1 -0
  67. package/dist/chunk-BFWPZMG7.js +379 -0
  68. package/dist/chunk-BFWPZMG7.js.map +1 -0
  69. package/dist/chunk-BUUUWQMB.cjs +34 -0
  70. package/dist/chunk-BUUUWQMB.cjs.map +1 -0
  71. package/dist/chunk-BV2MWEMV.cjs +26 -0
  72. package/dist/chunk-BV2MWEMV.cjs.map +1 -0
  73. package/dist/chunk-BWT67BI4.cjs +268 -0
  74. package/dist/chunk-BWT67BI4.cjs.map +1 -0
  75. package/dist/chunk-BXV2QUIC.js +191 -0
  76. package/dist/chunk-BXV2QUIC.js.map +1 -0
  77. package/dist/chunk-C6Y6CWYD.cjs +44 -0
  78. package/dist/chunk-C6Y6CWYD.cjs.map +1 -0
  79. package/dist/chunk-C7PICHRF.cjs +68 -0
  80. package/dist/chunk-C7PICHRF.cjs.map +1 -0
  81. package/dist/chunk-CAH3G4IS.js +13 -0
  82. package/dist/chunk-CAH3G4IS.js.map +1 -0
  83. package/dist/chunk-CJ6YJ2L3.cjs +10590 -0
  84. package/dist/chunk-CJ6YJ2L3.cjs.map +1 -0
  85. package/dist/chunk-D42XHI4O.cjs +565 -0
  86. package/dist/chunk-D42XHI4O.cjs.map +1 -0
  87. package/dist/chunk-DGRZNMTU.js +104 -0
  88. package/dist/chunk-DGRZNMTU.js.map +1 -0
  89. package/dist/chunk-DUK5WMKJ.js +71 -0
  90. package/dist/chunk-DUK5WMKJ.js.map +1 -0
  91. package/dist/chunk-EEZ7CFMM.js +14 -0
  92. package/dist/chunk-EEZ7CFMM.js.map +1 -0
  93. package/dist/chunk-EPYZOCOL.cjs +82 -0
  94. package/dist/chunk-EPYZOCOL.cjs.map +1 -0
  95. package/dist/chunk-EVADEGM7.cjs +168 -0
  96. package/dist/chunk-EVADEGM7.cjs.map +1 -0
  97. package/dist/chunk-F3XVLFLM.js +10573 -0
  98. package/dist/chunk-F3XVLFLM.js.map +1 -0
  99. package/dist/chunk-FD2UT76F.js +3 -0
  100. package/dist/chunk-FD2UT76F.js.map +1 -0
  101. package/dist/chunk-FV3YEMQ7.js +179 -0
  102. package/dist/chunk-FV3YEMQ7.js.map +1 -0
  103. package/dist/chunk-G2F67XUR.cjs +184 -0
  104. package/dist/chunk-G2F67XUR.cjs.map +1 -0
  105. package/dist/chunk-G6GO6BXD.js +994 -0
  106. package/dist/chunk-G6GO6BXD.js.map +1 -0
  107. package/dist/chunk-GIW4L6HY.cjs +27 -0
  108. package/dist/chunk-GIW4L6HY.cjs.map +1 -0
  109. package/dist/chunk-GJAGKFTR.js +74 -0
  110. package/dist/chunk-GJAGKFTR.js.map +1 -0
  111. package/dist/chunk-HFPGOTVF.cjs +324 -0
  112. package/dist/chunk-HFPGOTVF.cjs.map +1 -0
  113. package/dist/chunk-HRA3CPGG.js +486 -0
  114. package/dist/chunk-HRA3CPGG.js.map +1 -0
  115. package/dist/chunk-HZQEDNF6.js +66 -0
  116. package/dist/chunk-HZQEDNF6.js.map +1 -0
  117. package/dist/chunk-IT3PWBW4.cjs +19 -0
  118. package/dist/chunk-IT3PWBW4.cjs.map +1 -0
  119. package/dist/chunk-JD74LN7R.cjs +171 -0
  120. package/dist/chunk-JD74LN7R.cjs.map +1 -0
  121. package/dist/chunk-JTFYYKDT.js +135 -0
  122. package/dist/chunk-JTFYYKDT.js.map +1 -0
  123. package/dist/chunk-K2BQQ445.js +30 -0
  124. package/dist/chunk-K2BQQ445.js.map +1 -0
  125. package/dist/chunk-KAP4GJHO.js +546 -0
  126. package/dist/chunk-KAP4GJHO.js.map +1 -0
  127. package/dist/chunk-KIO7QFIV.cjs +223 -0
  128. package/dist/chunk-KIO7QFIV.cjs.map +1 -0
  129. package/dist/chunk-KSKU6JY6.cjs +71 -0
  130. package/dist/chunk-KSKU6JY6.cjs.map +1 -0
  131. package/dist/chunk-LSLPF6OI.cjs +192 -0
  132. package/dist/chunk-LSLPF6OI.cjs.map +1 -0
  133. package/dist/chunk-LU7VALW5.js +312 -0
  134. package/dist/chunk-LU7VALW5.js.map +1 -0
  135. package/dist/chunk-LUSXDZPV.cjs +296 -0
  136. package/dist/chunk-LUSXDZPV.cjs.map +1 -0
  137. package/dist/chunk-M72RJVPC.js +69 -0
  138. package/dist/chunk-M72RJVPC.js.map +1 -0
  139. package/dist/chunk-MQLCZ4HJ.cjs +1010 -0
  140. package/dist/chunk-MQLCZ4HJ.cjs.map +1 -0
  141. package/dist/chunk-MUUQ2WFJ.cjs +4 -0
  142. package/dist/chunk-MUUQ2WFJ.cjs.map +1 -0
  143. package/dist/chunk-MZ5ZRORA.cjs +496 -0
  144. package/dist/chunk-MZ5ZRORA.cjs.map +1 -0
  145. package/dist/chunk-N24XBYNX.cjs +140 -0
  146. package/dist/chunk-N24XBYNX.cjs.map +1 -0
  147. package/dist/chunk-NINIJCHU.cjs +23 -0
  148. package/dist/chunk-NINIJCHU.cjs.map +1 -0
  149. package/dist/chunk-NRSH7RJY.js +2841 -0
  150. package/dist/chunk-NRSH7RJY.js.map +1 -0
  151. package/dist/chunk-OIYQBUW4.cjs +111 -0
  152. package/dist/chunk-OIYQBUW4.cjs.map +1 -0
  153. package/dist/chunk-PNVDQL5Y.cjs +15 -0
  154. package/dist/chunk-PNVDQL5Y.cjs.map +1 -0
  155. package/dist/chunk-POQT2OIF.js +214 -0
  156. package/dist/chunk-POQT2OIF.js.map +1 -0
  157. package/dist/chunk-QUTUJ6P6.cjs +76 -0
  158. package/dist/chunk-QUTUJ6P6.cjs.map +1 -0
  159. package/dist/chunk-S2BBRVQX.js +68 -0
  160. package/dist/chunk-S2BBRVQX.js.map +1 -0
  161. package/dist/chunk-S5RCBTSF.js +145 -0
  162. package/dist/chunk-S5RCBTSF.js.map +1 -0
  163. package/dist/chunk-S7OEXQMI.cjs +136 -0
  164. package/dist/chunk-S7OEXQMI.cjs.map +1 -0
  165. package/dist/chunk-SKWVAQAY.js +129 -0
  166. package/dist/chunk-SKWVAQAY.js.map +1 -0
  167. package/dist/chunk-SQLZ7ONU.js +152 -0
  168. package/dist/chunk-SQLZ7ONU.js.map +1 -0
  169. package/dist/chunk-TIZ4TS5V.cjs +72 -0
  170. package/dist/chunk-TIZ4TS5V.cjs.map +1 -0
  171. package/dist/chunk-TQKCU7CL.js +142 -0
  172. package/dist/chunk-TQKCU7CL.js.map +1 -0
  173. package/dist/chunk-U54XCYG3.js +116 -0
  174. package/dist/chunk-U54XCYG3.js.map +1 -0
  175. package/dist/chunk-U6QGZHPN.js +29 -0
  176. package/dist/chunk-U6QGZHPN.js.map +1 -0
  177. package/dist/chunk-UCFONJBG.js +79 -0
  178. package/dist/chunk-UCFONJBG.js.map +1 -0
  179. package/dist/chunk-UJ7IQJAG.js +141 -0
  180. package/dist/chunk-UJ7IQJAG.js.map +1 -0
  181. package/dist/chunk-UVNG67DG.js +253 -0
  182. package/dist/chunk-UVNG67DG.js.map +1 -0
  183. package/dist/chunk-V4XRLPEF.js +25 -0
  184. package/dist/chunk-V4XRLPEF.js.map +1 -0
  185. package/dist/chunk-VJ26EKGJ.cjs +28 -0
  186. package/dist/chunk-VJ26EKGJ.cjs.map +1 -0
  187. package/dist/chunk-VK7MAV65.cjs +90 -0
  188. package/dist/chunk-VK7MAV65.cjs.map +1 -0
  189. package/dist/chunk-VYCKUKPA.cjs +106 -0
  190. package/dist/chunk-VYCKUKPA.cjs.map +1 -0
  191. package/dist/chunk-VYHJZVL5.cjs +29 -0
  192. package/dist/chunk-VYHJZVL5.cjs.map +1 -0
  193. package/dist/chunk-WA3FO4R7.js +155 -0
  194. package/dist/chunk-WA3FO4R7.js.map +1 -0
  195. package/dist/chunk-WJVHMTKB.cjs +12 -0
  196. package/dist/chunk-WJVHMTKB.cjs.map +1 -0
  197. package/dist/chunk-WLKFWQSJ.js +333 -0
  198. package/dist/chunk-WLKFWQSJ.js.map +1 -0
  199. package/dist/chunk-WPZTYOUX.cjs +59 -0
  200. package/dist/chunk-WPZTYOUX.cjs.map +1 -0
  201. package/dist/chunk-X2FR4OIT.js +27 -0
  202. package/dist/chunk-X2FR4OIT.js.map +1 -0
  203. package/dist/chunk-XIG2IE3L.js +134 -0
  204. package/dist/chunk-XIG2IE3L.js.map +1 -0
  205. package/dist/chunk-YLQQX5W2.cjs +20 -0
  206. package/dist/chunk-YLQQX5W2.cjs.map +1 -0
  207. package/dist/chunk-YPEPCZHF.cjs +147 -0
  208. package/dist/chunk-YPEPCZHF.cjs.map +1 -0
  209. package/dist/chunk-YPQF26X7.cjs +8 -0
  210. package/dist/chunk-YPQF26X7.cjs.map +1 -0
  211. package/dist/chunk-YU6KON2I.cjs +160 -0
  212. package/dist/chunk-YU6KON2I.cjs.map +1 -0
  213. package/dist/chunk-Z2OC3UIW.cjs +388 -0
  214. package/dist/chunk-Z2OC3UIW.cjs.map +1 -0
  215. package/dist/chunk-ZZWTY3RX.js +230 -0
  216. package/dist/chunk-ZZWTY3RX.js.map +1 -0
  217. package/dist/compact-session-OO2GD76G.js +17 -0
  218. package/dist/compact-session-OO2GD76G.js.map +1 -0
  219. package/dist/compact-session-OO7NVWPB.cjs +54 -0
  220. package/dist/compact-session-OO7NVWPB.cjs.map +1 -0
  221. package/dist/compaction.cjs +54 -303
  222. package/dist/compaction.cjs.map +1 -1
  223. package/dist/compaction.js +3 -292
  224. package/dist/compaction.js.map +1 -1
  225. package/dist/concurrency.cjs +9 -81
  226. package/dist/concurrency.cjs.map +1 -1
  227. package/dist/concurrency.js +5 -80
  228. package/dist/concurrency.js.map +1 -1
  229. package/dist/context-GWANQLX4.js +5 -0
  230. package/dist/context-GWANQLX4.js.map +1 -0
  231. package/dist/context-KNWVTZSY.cjs +22 -0
  232. package/dist/context-KNWVTZSY.cjs.map +1 -0
  233. package/dist/cron.cjs +44 -20675
  234. package/dist/cron.cjs.map +1 -1
  235. package/dist/cron.js +38 -20675
  236. package/dist/cron.js.map +1 -1
  237. package/dist/errors.cjs +78 -470
  238. package/dist/errors.cjs.map +1 -1
  239. package/dist/errors.js +2 -455
  240. package/dist/errors.js.map +1 -1
  241. package/dist/eval.cjs +72 -20410
  242. package/dist/eval.cjs.map +1 -1
  243. package/dist/eval.js +59 -20401
  244. package/dist/eval.js.map +1 -1
  245. package/dist/executor-ORJS5GV2.js +981 -0
  246. package/dist/executor-ORJS5GV2.js.map +1 -0
  247. package/dist/executor-Y4MKPIUD.cjs +985 -0
  248. package/dist/executor-Y4MKPIUD.cjs.map +1 -0
  249. package/dist/filesystem/index.cjs +7 -112
  250. package/dist/filesystem/index.cjs.map +1 -1
  251. package/dist/filesystem/index.js +4 -109
  252. package/dist/filesystem/index.js.map +1 -1
  253. package/dist/fork-agent-RSV4E3EA.js +61 -0
  254. package/dist/fork-agent-RSV4E3EA.js.map +1 -0
  255. package/dist/fork-agent-Y2IK2RYU.cjs +64 -0
  256. package/dist/fork-agent-Y2IK2RYU.cjs.map +1 -0
  257. package/dist/fs-session-store-KAUQYSGI.cjs +17 -0
  258. package/dist/fs-session-store-KAUQYSGI.cjs.map +1 -0
  259. package/dist/fs-session-store-ZKB5NN37.js +8 -0
  260. package/dist/fs-session-store-ZKB5NN37.js.map +1 -0
  261. package/dist/generate-object-H3RNAM6S.cjs +20 -0
  262. package/dist/generate-object-H3RNAM6S.cjs.map +1 -0
  263. package/dist/generate-object-YJPDV5BS.js +7 -0
  264. package/dist/generate-object-YJPDV5BS.js.map +1 -0
  265. package/dist/index-manager-CB6I7XFQ.cjs +19 -0
  266. package/dist/index-manager-CB6I7XFQ.cjs.map +1 -0
  267. package/dist/index-manager-L27Q3QAC.js +10 -0
  268. package/dist/index-manager-L27Q3QAC.js.map +1 -0
  269. package/dist/index.cjs +371 -22887
  270. package/dist/index.cjs.map +1 -1
  271. package/dist/index.js +92 -22712
  272. package/dist/index.js.map +1 -1
  273. package/dist/inject-session-6MJUSGZP.cjs +27 -0
  274. package/dist/inject-session-6MJUSGZP.cjs.map +1 -0
  275. package/dist/inject-session-KOFHS5K3.js +25 -0
  276. package/dist/inject-session-KOFHS5K3.js.map +1 -0
  277. package/dist/internal/auth/credential-store.d.ts +20 -3
  278. package/dist/internal/persistence/index.cjs +93 -508
  279. package/dist/internal/persistence/index.cjs.map +1 -1
  280. package/dist/internal/persistence/index.js +11 -489
  281. package/dist/internal/persistence/index.js.map +1 -1
  282. package/dist/internal/security/index.cjs +44 -361
  283. package/dist/internal/security/index.cjs.map +1 -1
  284. package/dist/internal/security/index.js +4 -355
  285. package/dist/internal/security/index.js.map +1 -1
  286. package/dist/judge-call-7CF7D334.cjs +95 -0
  287. package/dist/judge-call-7CF7D334.cjs.map +1 -0
  288. package/dist/judge-call-VIMNK5TA.js +92 -0
  289. package/dist/judge-call-VIMNK5TA.js.map +1 -0
  290. package/dist/models.cjs +24 -913
  291. package/dist/models.cjs.map +1 -1
  292. package/dist/models.js +11 -901
  293. package/dist/models.js.map +1 -1
  294. package/dist/oauth-transaction-store-7CKHPQRN.cjs +32 -0
  295. package/dist/oauth-transaction-store-7CKHPQRN.cjs.map +1 -0
  296. package/dist/oauth-transaction-store-W74I6EFD.js +3 -0
  297. package/dist/oauth-transaction-store-W74I6EFD.js.map +1 -0
  298. package/dist/path-safety.cjs +31 -200
  299. package/dist/path-safety.cjs.map +1 -1
  300. package/dist/path-safety.js +3 -197
  301. package/dist/path-safety.js.map +1 -1
  302. package/dist/persistence.cjs +73 -393
  303. package/dist/persistence.cjs.map +1 -1
  304. package/dist/persistence.js +9 -381
  305. package/dist/persistence.js.map +1 -1
  306. package/dist/project.cjs +8 -112
  307. package/dist/project.cjs.map +1 -1
  308. package/dist/project.js +6 -110
  309. package/dist/project.js.map +1 -1
  310. package/dist/registry-34IWWDQQ.js +9 -0
  311. package/dist/registry-34IWWDQQ.js.map +1 -0
  312. package/dist/registry-APYDISL6.cjs +46 -0
  313. package/dist/registry-APYDISL6.cjs.map +1 -0
  314. package/dist/retry.cjs +7 -87
  315. package/dist/retry.cjs.map +1 -1
  316. package/dist/retry.js +3 -90
  317. package/dist/retry.js.map +1 -1
  318. package/dist/run-to-completion-J73I6IY4.cjs +48 -0
  319. package/dist/run-to-completion-J73I6IY4.cjs.map +1 -0
  320. package/dist/run-to-completion-JDPIUKSH.js +3 -0
  321. package/dist/run-to-completion-JDPIUKSH.js.map +1 -0
  322. package/dist/run-until-2PX4QBHZ.js +168 -0
  323. package/dist/run-until-2PX4QBHZ.js.map +1 -0
  324. package/dist/run-until-DB3LVGZS.cjs +171 -0
  325. package/dist/run-until-DB3LVGZS.cjs.map +1 -0
  326. package/dist/sandbox/index.cjs +35 -337
  327. package/dist/sandbox/index.cjs.map +1 -1
  328. package/dist/sandbox/index.js +7 -323
  329. package/dist/sandbox/index.js.map +1 -1
  330. package/dist/sanitize/index.cjs +5 -112
  331. package/dist/sanitize/index.cjs.map +1 -1
  332. package/dist/sanitize/index.js +1 -114
  333. package/dist/sanitize/index.js.map +1 -1
  334. package/dist/server/auth/index.cjs +35 -175
  335. package/dist/server/auth/index.cjs.map +1 -1
  336. package/dist/server/auth/index.js +7 -161
  337. package/dist/server/auth/index.js.map +1 -1
  338. package/dist/server/errors-envelope.cjs +17 -328
  339. package/dist/server/errors-envelope.cjs.map +1 -1
  340. package/dist/server/errors-envelope.js +4 -317
  341. package/dist/server/errors-envelope.js.map +1 -1
  342. package/dist/session-transcript-LPNZR3YS.cjs +46 -0
  343. package/dist/session-transcript-LPNZR3YS.cjs.map +1 -0
  344. package/dist/session-transcript-T7LGJUGW.js +5 -0
  345. package/dist/session-transcript-T7LGJUGW.js.map +1 -0
  346. package/dist/skills.cjs +12 -280
  347. package/dist/skills.cjs.map +1 -1
  348. package/dist/skills.js +4 -282
  349. package/dist/skills.js.map +1 -1
  350. package/dist/stream-object-QEQJJDTI.cjs +20 -0
  351. package/dist/stream-object-QEQJJDTI.cjs.map +1 -0
  352. package/dist/stream-object-WUQSSRY2.js +7 -0
  353. package/dist/stream-object-WUQSSRY2.js.map +1 -0
  354. package/dist/stream-to-completion-DFJ5T3BK.js +30 -0
  355. package/dist/stream-to-completion-DFJ5T3BK.js.map +1 -0
  356. package/dist/stream-to-completion-H2MHISSK.cjs +32 -0
  357. package/dist/stream-to-completion-H2MHISSK.cjs.map +1 -0
  358. package/dist/subagents.cjs +2 -8
  359. package/dist/subagents.cjs.map +1 -1
  360. package/dist/subagents.js +1 -7
  361. package/dist/subagents.js.map +1 -1
  362. package/dist/subscription/index.cjs +4 -17
  363. package/dist/subscription/index.cjs.map +1 -1
  364. package/dist/subscription/index.js +3 -16
  365. package/dist/subscription/index.js.map +1 -1
  366. package/dist/task-store.cjs +16 -258
  367. package/dist/task-store.cjs.map +1 -1
  368. package/dist/task-store.js +4 -259
  369. package/dist/task-store.js.map +1 -1
  370. package/dist/workflow.cjs +71 -2797
  371. package/dist/workflow.cjs.map +1 -1
  372. package/dist/workflow.js +8 -2812
  373. package/dist/workflow.js.map +1 -1
  374. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/providers/discovery.ts","../src/internal/error-mappers/shared.ts","../src/internal/error-mappers/anthropic.ts","../src/internal/llm/finish.ts","../src/internal/llm/tool-result-content.ts","../src/internal/llm/anthropic-shared.ts","../src/internal/llm/sse.ts","../src/internal/llm/anthropic.ts","../src/internal/error-mappers/bedrock.ts","../src/internal/llm/bedrock-token-cache.ts","../src/internal/llm/bedrock-anthropic.ts","../src/internal/error-mappers/openai-compatible.ts","../src/internal/llm/fault-injection.ts","../src/internal/error-mappers/ollama.ts","../src/internal/llm/ollama-native.ts","../src/internal/llm/hermes-tool-extract.ts","../src/internal/llm/openai-messages.ts","../src/internal/llm/openai.ts","../src/internal/resilience/circuit-breaker.ts","../src/internal/llm/stream-relay.ts","../src/internal/llm/pool-aware-client.ts","../src/internal/llm/responses.ts","../src/internal/error-mappers/vertex.ts","../src/internal/llm/vertex-auth.ts","../src/internal/llm/vertex-anthropic.ts","../src/internal/llm/vertex-gemini.ts","../src/internal/llm/vertex-router.ts","../src/internal/llm/router.ts","../src/internal/local-agent/real-local-run-provider.ts","../src/internal/runtime/compression/compression-model-registry.ts","../src/internal/runtime/compression/compression-summarizer.ts","../src/internal/session/compact-session.ts"],"names":["globalSingleton","join","homedir","existsSync","readFileSync","readdir","pathToFileURL","registerProvider","redactSecrets","AuthenticationError","RateLimitError","ConfigurationError","NetworkError","UnknownAgentError","tryJson","isPlainObject","body","createRequire","inferRegionFromModelId","stripBedrockPrefix","resolveBedrockBaseUrl","formatMessage","sanitizeToolInput","flush","joinTextParts","buildClient","CredentialPoolExhaustedError","computeBackoffMs","sleepWithAbort","text","parseBody","resolveVertexBaseUrl","stripVertexPrefix","inferModelDialect","inner","registerBuiltins","getProviderProfile","currentCredentialPool","newPooledCredential","CredentialPool","apiKey","reconstructMessages","estimateTokens","SessionTranscript","invalidateSessionCache"],"mappings":"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","file":"chunk-2MF3IE2D.cjs","sourcesContent":["/**\n * Lazy provider discovery (T3.4, ADR D107).\n *\n * Scans `~/.theokit/plugins/model-providers/<name>/index.{js,mjs}` and\n * imports each as a Plugin. Plugins with `kind: \"model-provider\"` register\n * their profile. Errors per plugin are logged + skipped. Idempotent per\n * process.\n *\n * EC-9: dynamic `import()` in Node 22 needs `file://` URL for absolute\n * paths in ESM contexts. `pathToFileURL` handles both.\n *\n * @internal\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport { globalSingleton } from \"../global-singleton.js\";\nimport { registerProvider } from \"./registry.js\";\n\n// M47 review F3 — the idempotence flag lives on `globalThis` via `Symbol.for`, mirroring registry.ts's\n// M44 B1 pattern: tsup bundles each entry (`dist/index.js`, `dist/cron.js`, …) with its OWN module copy,\n// so a module-local `let discovered` would re-run discovery once per entry (duplicate I/O + spurious\n// \"Provider overridden\" WARNs). Every bundle copy shares THIS state.\nconst discoveryState = globalSingleton(\"theokit-sdk.providers.discovered\", () => ({\n done: false,\n}));\n\nfunction pluginsRoot(): string {\n return join(homedir(), \".theokit\", \"plugins\", \"model-providers\");\n}\n\n/** The explicit trust allowlist the human edits (M47). Fail-closed: missing/malformed ⇒ empty. */\nfunction trustFilePath(): string {\n return join(homedir(), \".theokit\", \"plugins\", \"trusted-providers.json\");\n}\n\n/**\n * M47 — the trust gate for the dynamic-import surface. A plugin's `index.{js,mjs}` executes arbitrary code\n * at import time, so NOTHING is imported unless the human explicitly trusted the plugin name: either in\n * `~/.theokit/plugins/trusted-providers.json` (a JSON string array — the auditable primary, mirroring the\n * approved-hooks posture) or the additive `THEOKIT_TRUSTED_PROVIDERS` env (comma-separated convenience).\n * Fail-closed: a missing or malformed trust file trusts NOTHING (a malformed file WARNs).\n */\n// Divida PRE-EXISTENTE, exposta quando o M75 consertou a config Biome que abortava antes\n// de varrer estes arquivos (raiz aninhada em refactor/). Nao e codigo novo e nao foi tocado\n// pelo M75; refatorar internals do SDK sem revisao trocaria um problema visivel por um diff\n// arriscado. Rastreado em usetheodev/theokit-sdk#151.\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: ver a razao logo acima\nfunction loadTrustedNames(): Set<string> {\n const trusted = new Set<string>();\n const path = trustFilePath();\n if (existsSync(path)) {\n try {\n const parsed: unknown = JSON.parse(readFileSync(path, \"utf-8\"));\n if (Array.isArray(parsed)) {\n let discarded = 0;\n for (const name of parsed) {\n if (typeof name === \"string\" && name.length > 0) trusted.add(name);\n else discarded += 1;\n }\n // M47 review F5 — fail-closed AND fail-clear: a valid array with wrong-shaped entries\n // (numbers, objects) silently trusting nothing would leave the user with only the generic\n // per-plugin WARN and no clue the FILE shape is wrong.\n if (discarded > 0) {\n process.stderr.write(\n `[theokit-sdk] WARN: ${path} contains ${discarded} non-string entr${discarded === 1 ? \"y\" : \"ies\"} — discarded (entries must be plugin-name strings)\\n`,\n );\n }\n } else {\n process.stderr.write(\n `[theokit-sdk] WARN: ${path} is not a JSON array — trusting NO provider plugins (fail-closed)\\n`,\n );\n }\n } catch {\n process.stderr.write(\n `[theokit-sdk] WARN: ${path} is not valid JSON — trusting NO provider plugins (fail-closed)\\n`,\n );\n }\n }\n for (const name of (process.env.THEOKIT_TRUSTED_PROVIDERS ?? \"\").split(\",\")) {\n const trimmed = name.trim();\n if (trimmed.length > 0) trusted.add(trimmed);\n }\n return trusted;\n}\n\nexport async function discoverProviderPlugins(): Promise<void> {\n if (discoveryState.done) return;\n discoveryState.done = true;\n\n const root = pluginsRoot();\n if (!existsSync(root)) return;\n\n let entries: string[];\n try {\n entries = await readdir(root);\n } catch {\n return;\n }\n\n const trusted = loadTrustedNames();\n for (const entry of entries) {\n // M47 — the gate fires BEFORE any import(): untrusted code is never evaluated (import-time side effects\n // ARE the attack; a post-import check would be theater).\n if (!trusted.has(entry)) {\n // M47 review F4/F7 — the remedy must be complete: discovery is once-per-process (the latch above),\n // so editing the trust file only takes effect after a restart; and the env format is comma-separated.\n process.stderr.write(\n `[theokit-sdk] WARN: provider plugin \"${entry}\" is present but NOT trusted — skipped. ` +\n `To trust it, add \"${entry}\" to ${trustFilePath()} (JSON array of names) or ` +\n `THEOKIT_TRUSTED_PROVIDERS (comma-separated), then restart the process.\\n`,\n );\n continue;\n }\n await loadOne(join(root, entry), entry);\n }\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: 2-extension loader (mjs / js) + plugin shape detection (default / named / direct) — inlining is clearer than 5 helper fns.\nasync function loadOne(dir: string, entryName: string): Promise<void> {\n for (const ext of [\"index.mjs\", \"index.js\"]) {\n const indexPath = join(dir, ext);\n if (!existsSync(indexPath)) continue;\n try {\n const mod = await import(pathToFileURL(indexPath).href);\n const plugin = mod.default ?? mod[entryName] ?? mod;\n if (\n plugin !== null &&\n typeof plugin === \"object\" &&\n (plugin as { kind?: unknown }).kind === \"model-provider\"\n ) {\n const profile = (plugin as { profile?: unknown }).profile;\n if (profile !== undefined && typeof profile === \"object\") {\n registerProvider(profile as Parameters<typeof registerProvider>[0]);\n }\n }\n return;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n process.stderr.write(`[theokit-sdk] failed to load provider plugin \"${entryName}\": ${msg}\\n`);\n return;\n }\n }\n}\n\n/** Test-only reset. @internal */\nexport function _resetDiscovery(): void {\n discoveryState.done = false;\n}\n","/**\n * Helpers shared between provider HTTP error mappers (ADR D67).\n *\n * Extracted to dedupe identical logic in `anthropic.ts` and\n * `openai-compatible.ts` — retry-after parsing, raw-body truncation,\n * and metadata assembly are dialect-agnostic.\n *\n * @internal\n */\n\nimport type { ErrorCode, ErrorMetadata } from \"../../errors.js\";\nimport { redactSecrets } from \"../security/index.js\";\n\nconst RAW_MAX_BYTES = 2048;\n\n/**\n * Parse the `Retry-After` header (RFC 7231) into seconds. Both forms are\n * supported: numeric-seconds (`Retry-After: 30`) and HTTP-date\n * (`Retry-After: Wed, 21 Oct 2025 07:28:00 GMT` → seconds until that instant,\n * clamped at 0 for a past date). Garbage / missing header → `undefined`.\n *\n * @internal\n */\nexport function parseRetryAfter(headers: Headers | undefined): number | undefined {\n if (headers === undefined) return undefined;\n const raw = headers.get(\"retry-after\");\n if (raw === null) return undefined;\n const n = Number(raw);\n if (Number.isFinite(n) && n >= 0) return Math.ceil(n);\n // HTTP-date form — seconds until the given instant (0 if already elapsed).\n const dateMs = Date.parse(raw);\n if (Number.isFinite(dateMs)) return Math.max(0, Math.ceil((dateMs - Date.now()) / 1000));\n return undefined;\n}\n\n/**\n * Truncate raw response body to ~2KB and redact known credential\n * patterns so it can ride inside `ErrorMetadata.raw` without\n * ballooning logs OR leaking tokens. Returns `undefined` for\n * null/undefined input.\n *\n * Post T1.1 (secret-redaction-discipline, ADR D68): every error metadata\n * goes through `redactSecrets` before exposure. Note the shape change —\n * pre-T1.1 the function preserved the original `body` shape when ≤2KB;\n * now it always returns a (possibly redacted) string, because redaction\n * coerces non-strings to JSON. Consumers who used to do `err.metadata.raw.foo`\n * must now `JSON.parse(err.metadata.raw)` first — but a workspace-wide\n * grep at T1.1 land time confirmed zero such callers.\n *\n * @internal\n */\nexport function truncateRaw(body: unknown): unknown {\n if (body === null || body === undefined) return undefined;\n const s = typeof body === \"string\" ? body : JSON.stringify(body);\n const truncated = s.length <= RAW_MAX_BYTES ? s : `${s.slice(0, RAW_MAX_BYTES)}…`;\n return redactSecrets(truncated);\n}\n\n/**\n * Build an `ErrorMetadata` object with all optional fields included\n * conditionally (no `undefined` keys in the output). Caller passes\n * dialect-specific fields (`provider`, `endpoint`, `code`); shared\n * fields (`statusCode`, `retryAfter`, `raw`) are derived here.\n *\n * @internal\n */\nexport function buildErrorMetadata(args: {\n provider: string;\n endpoint: string;\n code: ErrorCode;\n status: number;\n headers: Headers | undefined;\n body: unknown;\n}): ErrorMetadata {\n const retryAfter = parseRetryAfter(args.headers);\n const raw = truncateRaw(args.body);\n return {\n provider: args.provider,\n endpoint: args.endpoint,\n code: args.code,\n statusCode: args.status,\n ...(retryAfter !== undefined ? { retryAfter } : {}),\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n/**\n * D314: extract the provider's request id (`x-request-id` is OpenAI/most;\n * `request-id` is Anthropic). Returns `undefined` when neither is present.\n *\n * @internal\n */\nexport function parseRequestId(headers: Headers | undefined): string | undefined {\n if (headers === undefined) return undefined;\n return headers.get(\"x-request-id\") ?? headers.get(\"request-id\") ?? undefined;\n}\n","/**\n * Anthropic HTTP error mapper (ADR D67).\n *\n * Translates an Anthropic API error response into a typed\n * `TheokitAgentError` subclass with full `ErrorMetadata`. Mapping rules:\n *\n * 401/403 → `AuthenticationError` (`code: \"auth_failed\"`)\n * 429 → `RateLimitError` (`code: \"rate_limit\"`)\n * 400 → `ConfigurationError` (`code: \"context_too_long\"` if body\n * mentions context length, else\n * `\"invalid_request\"`; or\n * `\"content_filtered\"` for policy.)\n * 408 → `NetworkError` (`code: \"timeout\"`)\n * 5xx → `NetworkError` (`code: \"server_error\"` — covers 529\n * overloaded_error common em horário\n * de pico)\n * other → `UnknownAgentError` (`code: \"unknown\"`)\n *\n * Never throws — caller is already in an error path.\n *\n * @internal\n */\n\nimport {\n AuthenticationError,\n ConfigurationError,\n type ErrorCode,\n NetworkError,\n RateLimitError,\n type TheokitAgentError,\n UnknownAgentError,\n} from \"../../errors.js\";\nimport { buildErrorMetadata } from \"./shared.js\";\n\ninterface MapAnthropicErrorArgs {\n status: number;\n body: unknown;\n headers: Headers | undefined;\n endpoint: string;\n}\n\nexport function mapAnthropicError(args: MapAnthropicErrorArgs): TheokitAgentError {\n const { status, body, headers, endpoint } = args;\n const code = mapAnthropicStatusToCode(status, body);\n const message = formatMessage(status, code);\n const metadata = buildErrorMetadata({\n provider: \"anthropic\",\n endpoint,\n code,\n status,\n headers,\n body,\n });\n\n if (status === 401 || status === 403) {\n return new AuthenticationError(message, { code: \"anthropic_auth_failed\", metadata });\n }\n if (status === 429) {\n return new RateLimitError(message, { code: \"anthropic_rate_limit\", metadata });\n }\n if (status === 400) {\n return new ConfigurationError(message, {\n code: `anthropic_${code}`,\n metadata,\n });\n }\n if (status === 408) {\n return new NetworkError(message, { code: \"anthropic_timeout\", metadata });\n }\n if (status >= 500 && status < 600) {\n return new NetworkError(message, { code: \"anthropic_server_error\", metadata });\n }\n return new UnknownAgentError(message, { code: \"anthropic_unknown\", metadata });\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: explicit branch table is clearer than splitting\nfunction mapAnthropicStatusToCode(status: number, body: unknown): ErrorCode {\n if (status === 401 || status === 403) return \"auth_failed\";\n if (status === 429) return \"rate_limit\";\n if (status === 408) return \"timeout\";\n if (status === 400) {\n const text = JSON.stringify(body ?? \"\").toLowerCase();\n if (\n text.includes(\"context\") &&\n (text.includes(\"too long\") || text.includes(\"too_long\") || text.includes(\"length\"))\n ) {\n return \"context_too_long\";\n }\n if (\n text.includes(\"filtered\") ||\n text.includes(\"content policy\") ||\n text.includes(\"content_policy\")\n ) {\n return \"content_filtered\";\n }\n return \"invalid_request\";\n }\n if (status >= 500 && status < 600) return \"server_error\";\n return \"unknown\";\n}\n\nfunction formatMessage(status: number, code: ErrorCode): string {\n return `Anthropic API error: ${code} (HTTP ${status})`;\n}\n","import { isPlainObject, tryJson } from \"../../sanitize/coerce.js\";\nimport type { LlmFinish, LlmRequest, LlmStopReason, LlmToolCallPart } from \"./types.js\";\n\n/**\n * Collapse the wider `LlmRequest.system` shape (undefined | string | block[])\n * into a single string. Providers that don't support per-block prompt caching\n * join blocks with a blank-line separator.\n *\n * Shared between Ollama native and OpenAI-compatible clients.\n *\n * @internal\n */\nexport function collapseSystemText(system: LlmRequest[\"system\"]): string {\n if (system === undefined) return \"\";\n if (typeof system === \"string\") return system;\n return system.map((b) => b.text).join(\"\\n\\n\");\n}\n\n/**\n * Decode a buffered JSON-arguments string into an object. Falls back to a\n * `{ raw }` envelope so we never crash on malformed provider output.\n *\n * @internal\n */\nexport function parseToolArguments(buffered: string | undefined): Record<string, unknown> {\n if (buffered === undefined || buffered.length === 0) return {};\n try {\n return JSON.parse(buffered) as Record<string, unknown>;\n } catch {\n // M2 #61 — attempt jsonrepair (reusing the sanitize coerce helper, Rule 9)\n // before giving up, so a slightly-malformed native tool call (trailing\n // comma, unquoted key — the Kimi/K2 class) parses instead of landing in\n // `{ raw }` and bouncing to the model as an invalid_request round-trip.\n const repaired = tryJson(buffered, true);\n if (isPlainObject(repaired)) return repaired;\n return { raw: buffered };\n }\n}\n\n/**\n * Map an OpenAI-compatible `finish_reason` to the provider-agnostic stop reason.\n * Shared by the OpenAI stream accumulator. Unknown reasons fall back to `end_turn`.\n *\n * @internal\n */\nexport function mapOpenAIFinish(reason: string): LlmStopReason {\n switch (reason) {\n case \"tool_calls\":\n return \"tool_use\";\n case \"length\":\n return \"max_tokens\";\n default:\n return \"end_turn\";\n }\n}\n\n/**\n * Build the provider-agnostic `LlmFinish` shape from accumulator state.\n * Shared between the Anthropic and OpenAI stream parsers so the two\n * implementations don't drift on token-usage fields.\n *\n * @internal\n */\nexport function makeLlmFinish(state: {\n stopReason: LlmStopReason;\n text: string;\n toolCalls: LlmToolCallPart[];\n inputTokens?: number;\n outputTokens?: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n reasoningTokens?: number;\n}): LlmFinish {\n const finish: LlmFinish = {\n stopReason: state.stopReason,\n text: state.text,\n toolCalls: state.toolCalls,\n };\n if (state.inputTokens !== undefined) finish.inputTokens = state.inputTokens;\n if (state.outputTokens !== undefined) finish.outputTokens = state.outputTokens;\n if (state.cacheReadTokens !== undefined) finish.cacheReadTokens = state.cacheReadTokens;\n if (state.cacheWriteTokens !== undefined) finish.cacheWriteTokens = state.cacheWriteTokens;\n if (state.reasoningTokens !== undefined) finish.reasoningTokens = state.reasoningTokens;\n return finish;\n}\n","/**\n * SE7 — provider-agnostic helpers for structured tool-result content\n * ({@link ToolResultContentBlock}). Named by CAPABILITY, not by provider:\n *\n * - `toBlockToolResultContent` — for a wire that ACCEPTS content blocks.\n * - `toStringToolResultContent` — for a string-only wire (fail-fast on an image).\n * - `renderToolResultContentText` — map the text parts through a fn (for the guard).\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport type { ToolResultContentBlock } from \"../../types/content-blocks.js\";\n\n/**\n * For a block-capable provider wire: pass a string through unchanged, or forward\n * the structured blocks as-is (text + image).\n *\n * This is an INTENTIONAL identity: `ToolResultContentBlock` is defined to be\n * exactly the on-wire content-block shape that block-capable providers accept\n * for a tool result — `{ type: \"text\", text }` and\n * `{ type: \"image\", source: { type: \"base64\", media_type, data } }`. Because the\n * SDK type already IS the wire shape, no transformation is needed; this function\n * names that contract at the call site (and is the single seam to add a mapping\n * later, if a block-capable wire ever diverges from this shape). Do NOT add\n * SDK-internal fields to `ToolResultContentBlock` without updating this seam —\n * they would otherwise be forwarded verbatim onto the wire.\n */\nexport function toBlockToolResultContent(\n content: string | ToolResultContentBlock[],\n): string | ToolResultContentBlock[] {\n return content;\n}\n\n/**\n * For a string-only provider wire: pass a string through; flatten text-only\n * blocks to a newline-joined string; **fail fast** with a typed\n * {@link ConfigurationError} when an image block is present — that provider\n * cannot carry an image in a tool result, and silently dropping it would hand\n * the model a lie (per error-handling policy).\n */\nexport function toStringToolResultContent(\n content: string | ToolResultContentBlock[],\n providerName: string,\n): string {\n if (typeof content === \"string\") return content;\n if (content.some((block) => block.type === \"image\")) {\n throw new ConfigurationError(\n `provider \"${providerName}\" does not support image content in tool results`,\n );\n }\n return content\n .filter(\n (block): block is Extract<ToolResultContentBlock, { type: \"text\" }> => block.type === \"text\",\n )\n .map((block) => block.text)\n .join(\"\\n\");\n}\n\n/**\n * Apply `fn` to the text of a tool-result content (both the string form and the\n * text blocks of the structured form); image blocks pass through untouched.\n * Used by the tool-result guard so redaction/delimiting still covers text.\n */\nexport function renderToolResultContentText(\n content: string | ToolResultContentBlock[],\n fn: (text: string) => string,\n): string | ToolResultContentBlock[] {\n if (typeof content === \"string\") return fn(content);\n return content.map((block) =>\n block.type === \"text\" ? { type: \"text\" as const, text: fn(block.text) } : block,\n );\n}\n","/**\n * Shared helpers for Anthropic Messages wire format across direct API\n * (anthropic.ts), Vertex (vertex-anthropic.ts), and Bedrock (bedrock-anthropic.ts)\n * clients. Extracted to remove cross-module clones flagged by jscpd.\n *\n * @internal\n */\n\nimport { parseToolArguments } from \"./finish.js\";\nimport { toBlockToolResultContent } from \"./tool-result-content.js\";\nimport type {\n LlmMessage,\n LlmRequest,\n LlmStopReason,\n LlmSystemBlock,\n LlmToolCallPart,\n} from \"./types.js\";\n\nexport interface AnthropicResponseLike {\n content?: Array<\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> }\n >;\n stop_reason?: string | null;\n usage?: { input_tokens?: number; output_tokens?: number };\n}\n\nexport function extractAnthropicText(response: AnthropicResponseLike): string {\n return (response.content ?? [])\n .filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\");\n}\n\nexport function extractAnthropicToolCalls(response: AnthropicResponseLike): LlmToolCallPart[] {\n return (response.content ?? [])\n .filter(\n (c): c is { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> } =>\n c.type === \"tool_use\",\n )\n .map((c) => ({\n type: \"tool_use\" as const,\n id: c.id,\n name: c.name,\n input: parseToolArguments(JSON.stringify(c.input)),\n }));\n}\n\nexport function mapAnthropicStopReason(reason: string | null): LlmStopReason {\n switch (reason) {\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"max_tokens\";\n case \"stop_sequence\":\n return \"stop_sequence\";\n case \"end_turn\":\n case null:\n return \"end_turn\";\n default:\n return \"end_turn\";\n }\n}\n\n/**\n * Convert an SDK `LlmMessage` to the Anthropic Messages wire shape.\n * Identical across the three Anthropic-compatible clients (D289/D292).\n */\nexport function toAnthropicWireMessage(message: LlmMessage): Record<string, unknown> {\n const role = message.role === \"system\" ? \"user\" : message.role;\n const content = message.content.map((part) => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n if (part.type === \"tool_use\") {\n return { type: \"tool_use\", id: part.id, name: part.name, input: part.input };\n }\n // M35 — Anthropic native image block: base64 source, unchanged shape.\n if (part.type === \"image\") {\n return { type: \"image\", source: part.source };\n }\n return {\n type: \"tool_result\",\n tool_use_id: part.toolUseId,\n // SE7 — this wire is block-capable: strings pass through, structured\n // text/image blocks are forwarded natively.\n content: toBlockToolResultContent(part.content),\n ...(part.isError === true ? { is_error: true } : {}),\n };\n });\n return { role, content };\n}\n\n/**\n * Build the common body shape for Anthropic Messages requests. Caller\n * is responsible for adding wire-specific fields (`anthropic_version`,\n * `model`, `stream`, etc.).\n */\n/**\n * Issue a POST to an Anthropic-compatible Messages endpoint with the\n * standard auth + content-type headers. Caller maps non-2xx via its own\n * dialect-specific error mapper.\n */\nexport function postAnthropicRequest(args: {\n fetchImpl: typeof fetch;\n url: string;\n token: string;\n body: Record<string, unknown>;\n signal: AbortSignal;\n}): Promise<Response> {\n return args.fetchImpl(args.url, {\n method: \"POST\",\n signal: args.signal,\n headers: {\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n authorization: `Bearer ${args.token}`,\n },\n body: JSON.stringify(args.body),\n });\n}\n\n/**\n * Map non-2xx response to a typed error via the dialect mapper; consume\n * 2xx body into the Anthropic-shape result. Shared by Bedrock + Vertex\n * Anthropic clients to remove the ~15-line clone (jscpd).\n */\nexport async function handleAnthropicResponse(args: {\n response: Response;\n endpoint: string;\n errorMapper: (info: {\n status: number;\n body: unknown;\n headers: Headers;\n endpoint: string;\n }) => Error;\n}): Promise<{\n text: string;\n toolCalls: LlmToolCallPart[];\n stopReason: LlmStopReason;\n inputTokens?: number;\n outputTokens?: number;\n}> {\n if (!args.response.ok) {\n throw args.errorMapper({\n status: args.response.status,\n body: await parseHttpErrorBody(args.response),\n headers: args.response.headers,\n endpoint: args.endpoint,\n });\n }\n return consumeAnthropicResponse(args.response);\n}\n\nexport async function consumeAnthropicResponse(response: Response): Promise<{\n text: string;\n toolCalls: LlmToolCallPart[];\n stopReason: LlmStopReason;\n inputTokens?: number;\n outputTokens?: number;\n}> {\n const data = (await response.json()) as AnthropicResponseLike;\n return {\n text: extractAnthropicText(data),\n toolCalls: extractAnthropicToolCalls(data),\n stopReason: mapAnthropicStopReason(data.stop_reason ?? null),\n inputTokens: data.usage?.input_tokens,\n outputTokens: data.usage?.output_tokens,\n };\n}\n\nexport async function parseHttpErrorBody(response: Response): Promise<unknown> {\n const text = await response.text().catch(() => \"\");\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nexport interface AnthropicTextBlock {\n type: \"text\";\n text: string;\n cache_control?: { type: \"ephemeral\" };\n}\n\nexport function buildAnthropicCommonBody(request: LlmRequest): {\n max_tokens: number;\n messages: Array<Record<string, unknown>>;\n system?: string | AnthropicTextBlock[];\n temperature?: number;\n tools?: Array<{ name: string; description: string; input_schema: unknown }>;\n} {\n const body: ReturnType<typeof buildAnthropicCommonBody> = {\n max_tokens: request.maxTokens ?? 4096,\n messages: request.messages.map(toAnthropicWireMessage),\n };\n const wireSystem = encodeAnthropicSystem(request.system);\n if (wireSystem !== undefined) body.system = wireSystem;\n if (request.temperature !== undefined) body.temperature = request.temperature;\n if (request.tools !== undefined && request.tools.length > 0) {\n body.tools = request.tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema,\n }));\n }\n return body;\n}\n\n/**\n * T3.5 — translate `LlmRequest.system` to the Anthropic wire shape.\n *\n * - `undefined` → omit (`undefined`).\n * - `string` → forward verbatim (back-compat, no caching).\n * - `LlmSystemBlock[]` → array of `{type:\"text\", text, cache_control?}`.\n * `cacheable: true` → emit `cache_control:{type:\"ephemeral\"}`.\n * Empty array short-circuits to `undefined`.\n *\n * @internal\n */\nfunction encodeAnthropicSystem(\n system: string | LlmSystemBlock[] | undefined,\n): string | AnthropicTextBlock[] | undefined {\n if (system === undefined) return undefined;\n if (typeof system === \"string\") return system;\n if (system.length === 0) return undefined;\n return system.map((block) => {\n const wire: AnthropicTextBlock = { type: \"text\", text: block.text };\n if (block.cacheable === true) wire.cache_control = { type: \"ephemeral\" };\n return wire;\n });\n}\n","/**\n * Minimal Server-Sent-Events parser. Consumes a fetch `Response` body\n * stream and yields `{ event, data }` records as they arrive. Used by\n * both the Anthropic and OpenAI streaming clients — neither vendor sends\n * binary SSE so a simple text decoder is enough.\n *\n * @internal\n */\n\nimport { NetworkError } from \"../../errors.js\";\n\nexport interface SseRecord {\n event: string;\n data: string;\n}\n\n/**\n * M2 #61 — default idle timeout (ms) between SSE reads. \"Idle\" means *no bytes\n * at all* arrive within the window — distinct from a slow-but-alive stream that\n * keeps trickling chunks. A stalled upstream that handshakes then goes silent no\n * longer hangs the AsyncGenerator forever; it rejects a typed NetworkError so\n * FallbackLlmClient / retry can route it. Pass `0` to disable.\n */\nexport const DEFAULT_SSE_IDLE_MS = 60_000;\n\ninterface ParserState {\n buffer: string;\n event: string;\n data: string;\n}\n\nexport async function* parseSseStream(\n body: ReadableStream<Uint8Array> | null,\n signal: AbortSignal,\n idleTimeoutMs: number = DEFAULT_SSE_IDLE_MS,\n): AsyncGenerator<SseRecord, void, void> {\n if (body === null) return;\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n const state: ParserState = { buffer: \"\", event: \"message\", data: \"\" };\n try {\n for await (const chunk of readChunks(reader, signal, idleTimeoutMs)) {\n state.buffer += decoder.decode(chunk, { stream: true });\n for (const record of drainCompleteRecords(state)) yield record;\n }\n if (state.data.length > 0) yield { event: state.event, data: state.data };\n } finally {\n // T3.2 + T3.3 — cancel the underlying body stream on EVERY exit path\n // (abort, normal close, consumer break, consumer throw). Without this\n // the upstream HTTP TCP socket stays in CLOSE_WAIT until the OS times\n // it out. cancel() on a finished stream is a no-op so always-cancel\n // is safe.\n await cancelReaderQuietly(reader);\n releaseReader(reader);\n }\n}\n\n/**\n * T3.2 — yield each chunk from `reader` until `done` OR `signal.aborted`.\n * Extracted from `parseSseStream` so its complexity stays under budget.\n *\n * @internal\n */\nasync function* readChunks(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n signal: AbortSignal,\n idleTimeoutMs: number,\n): AsyncGenerator<Uint8Array, void, void> {\n while (true) {\n if (signal.aborted) return;\n const { value, done } = await readWithIdleTimeout(reader, idleTimeoutMs);\n if (done) return;\n if (value !== undefined) yield value;\n }\n}\n\n/**\n * M2 #61 — race a single `reader.read()` against an idle timer. The timer is\n * cleared the moment the read settles (success OR error), so a healthy stream\n * never leaves a dangling timeout. When the timer wins, reject a typed\n * `NetworkError` (`code: \"stream_idle_timeout\"`); the caller's `finally` cancels\n * the body socket. `idleTimeoutMs <= 0` disables the bound (legacy behavior).\n *\n * @internal\n */\nfunction readWithIdleTimeout(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n idleTimeoutMs: number,\n): Promise<Awaited<ReturnType<ReadableStreamDefaultReader<Uint8Array>[\"read\"]>>> {\n if (idleTimeoutMs <= 0) return reader.read();\n return new Promise<Awaited<ReturnType<ReadableStreamDefaultReader<Uint8Array>[\"read\"]>>>(\n (resolve, reject) => {\n const timer = setTimeout(() => {\n reject(\n new NetworkError(`SSE stream idle for ${idleTimeoutMs}ms — upstream stalled`, {\n code: \"stream_idle_timeout\",\n }),\n );\n }, idleTimeoutMs);\n reader.read().then(\n (result) => {\n clearTimeout(timer);\n resolve(result);\n },\n (err: unknown) => {\n clearTimeout(timer);\n reject(err);\n },\n );\n },\n );\n}\n\n/**\n * T3.2 + T3.3 — cancel the underlying body stream on every exit path.\n * Swallows any cancel-time error per ADR D34's safe-exporter contract\n * (cancel-time errors never propagate to caller).\n *\n * Calling cancel on a stream that already completed naturally is a no-op\n * per the WHATWG streams spec, so unconditional cancel is safe.\n *\n * @internal\n */\nasync function cancelReaderQuietly(reader: ReadableStreamDefaultReader<Uint8Array>): Promise<void> {\n try {\n await reader.cancel();\n } catch {\n // best-effort — already cancelled OR upstream closed\n }\n}\n\nfunction drainCompleteRecords(state: ParserState): SseRecord[] {\n const out: SseRecord[] = [];\n let newlineIndex = state.buffer.indexOf(\"\\n\");\n while (newlineIndex !== -1) {\n const line = state.buffer.slice(0, newlineIndex).replace(/\\r$/, \"\");\n state.buffer = state.buffer.slice(newlineIndex + 1);\n const finished = applyLine(state, line);\n if (finished !== undefined) out.push(finished);\n newlineIndex = state.buffer.indexOf(\"\\n\");\n }\n return out;\n}\n\nfunction applyLine(state: ParserState, line: string): SseRecord | undefined {\n if (line === \"\") {\n if (state.data.length === 0) {\n state.event = \"message\";\n return undefined;\n }\n const record: SseRecord = { event: state.event, data: state.data };\n state.event = \"message\";\n state.data = \"\";\n return record;\n }\n if (line.startsWith(\":\")) return undefined;\n if (line.startsWith(\"event:\")) {\n // T3.1 — HTML Living Standard § 9.2.6: strip exactly ONE leading\n // U+0020 SPACE from the value; preserve other whitespace verbatim.\n state.event = stripOneLeadingSpace(line.slice(6));\n return undefined;\n }\n if (line.startsWith(\"data:\")) {\n const piece = stripOneLeadingSpace(line.slice(5));\n state.data = state.data.length === 0 ? piece : `${state.data}\\n${piece}`;\n }\n return undefined;\n}\n\n/**\n * T3.1 — HTML Living Standard § 9.2.6 step 5 of \"Process the field\":\n * \"If the value of field starts with a U+0020 SPACE character, remove\n * it from value.\"\n *\n * Pre-T3.1 the parser called `.trim()` which destroyed legitimate trailing\n * whitespace (and any extra leading whitespace beyond the first space).\n * This helper strips at most one leading space and leaves everything else.\n *\n * @internal\n */\nfunction stripOneLeadingSpace(value: string): string {\n return value.startsWith(\" \") ? value.slice(1) : value;\n}\n\nfunction releaseReader(reader: ReadableStreamDefaultReader<Uint8Array>): void {\n try {\n reader.releaseLock();\n } catch {\n // already released\n }\n}\n","import { NetworkError } from \"../../errors.js\";\nimport { mapAnthropicError } from \"../error-mappers/anthropic.js\";\nimport { buildAnthropicCommonBody, mapAnthropicStopReason } from \"./anthropic-shared.js\";\nimport { makeLlmFinish, parseToolArguments } from \"./finish.js\";\nimport { parseSseStream } from \"./sse.js\";\nimport type {\n LlmClient,\n LlmEvent,\n LlmFinish,\n LlmRequest,\n LlmStopReason,\n LlmToolCallPart,\n} from \"./types.js\";\n\n/**\n * Real Anthropic Messages client. Streams `/v1/messages` and translates the\n * vendor SSE events (`content_block_delta`, `content_block_start`,\n * `message_delta`, `message_stop`) into our provider-agnostic `LlmEvent`s.\n *\n * Uses native `fetch` only — no `@anthropic-ai/sdk` dependency.\n *\n * @internal\n */\n\nexport interface AnthropicClientOptions {\n apiKey: string;\n baseUrl?: string;\n version?: string;\n fetch?: typeof fetch;\n /**\n * M45 — extra HTTP headers merged into the request (the profile's static `extraHeaders` + a provider\n * `transform.headers(ctx)`). Assigned AFTER the base headers (mirror of the M41 OpenAIClient wiring), so\n * a provider that owns its auth CAN override them by design.\n */\n extraHeaders?: Record<string, string>;\n}\n\ninterface AnthropicTextDelta {\n type: \"content_block_delta\";\n delta: { type: \"text_delta\"; text: string };\n}\n\ninterface AnthropicToolStart {\n type: \"content_block_start\";\n index: number;\n content_block: { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> };\n}\n\ninterface AnthropicToolDelta {\n type: \"content_block_delta\";\n index: number;\n delta: { type: \"input_json_delta\"; partial_json: string };\n}\n\ninterface AnthropicMessageDelta {\n type: \"message_delta\";\n delta: { stop_reason: string | null };\n /**\n * T3.8 — Anthropic native usage shape carries the 5-bucket cache counters\n * when the request annotated system blocks with `cache_control:\n * {type:\"ephemeral\"}` (shipped in T3.5). `cache_creation_input_tokens`\n * surfaces as `LlmFinish.cacheWriteTokens` (the 1.25x billing tier);\n * `cache_read_input_tokens` surfaces as `LlmFinish.cacheReadTokens` (the\n * 0.1x billing tier). Pre-T3.8 the SDK dropped both fields silently.\n */\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n };\n}\n\ntype AnthropicEvent =\n | AnthropicTextDelta\n | AnthropicToolStart\n | AnthropicToolDelta\n | AnthropicMessageDelta\n | { type: \"message_stop\" }\n | { type: string };\n\nexport class AnthropicClient implements LlmClient {\n readonly name = \"anthropic\";\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly options: AnthropicClientOptions) {\n this.baseUrl = options.baseUrl ?? \"https://api.anthropic.com\";\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: HTTP+SSE handshake + accumulator is intentionally one block\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n const body = buildAnthropicBody(request);\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n \"x-api-key\": this.options.apiKey,\n \"anthropic-version\": this.options.version ?? \"2023-06-01\",\n };\n // M45 — merge extra/dynamic headers (assign LAST — same override semantics as the chat_completions client).\n if (this.options.extraHeaders !== undefined) Object.assign(headers, this.options.extraHeaders);\n const response = await this.fetchImpl(`${this.baseUrl}/v1/messages`, {\n method: \"POST\",\n signal,\n headers,\n body: JSON.stringify(body),\n });\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n // Parse body as JSON when possible — gives the mapper access to\n // `error.code` / `error.type` fields. Leave as string otherwise.\n let body: unknown = text;\n try {\n body = JSON.parse(text);\n } catch {\n // not JSON — keep as string\n }\n throw mapAnthropicError({\n status: response.status,\n body,\n headers: response.headers,\n endpoint: \"/v1/messages\",\n });\n }\n\n const accumulator = new AnthropicStreamAccumulator();\n for await (const record of parseSseStream(response.body, signal)) {\n if (record.event === \"ping\" || record.event === \"message_start\") continue;\n let parsed: AnthropicEvent;\n try {\n parsed = JSON.parse(record.data) as AnthropicEvent;\n } catch {\n continue;\n }\n const events = accumulator.consume(parsed);\n for (const event of events) yield event;\n }\n // M2 #61 — a stream that ended without a terminal `message_delta`\n // (stop_reason) was truncated (dropped connection / proxy hiccup); throw a\n // typed error rather than commit the partial turn as a clean `end_turn`\n // (parity with the OpenAI client's truncation guard).\n if (!accumulator.finishReasonSeen) {\n throw new NetworkError(\"Anthropic SSE stream truncated (no stop_reason)\", {\n code: \"stream_truncated\",\n });\n }\n return accumulator.finish();\n }\n}\n\nclass AnthropicStreamAccumulator {\n private text = \"\";\n private stopReason: LlmStopReason = \"end_turn\";\n /**\n * M2 #61 — whether a `message_delta` carrying a real `stop_reason` was seen.\n * A stream that closes before it is a truncation (server FIN / proxy hiccup),\n * not a clean `end_turn` — the caller throws `stream_truncated` on `false`.\n */\n private sawStopReason = false;\n private inputTokens?: number;\n private outputTokens?: number;\n private cacheReadTokens?: number;\n private cacheWriteTokens?: number;\n private readonly toolCalls = new Map<number, LlmToolCallPart>();\n private readonly toolBuffers = new Map<number, string>();\n\n consume(event: AnthropicEvent): LlmEvent[] {\n if (event.type === \"content_block_start\") {\n this.handleToolStart(event as AnthropicToolStart);\n return [];\n }\n if (event.type === \"content_block_delta\") {\n return this.handleContentDelta(event as AnthropicTextDelta | AnthropicToolDelta);\n }\n if (event.type === \"message_delta\") {\n this.handleMessageDelta(event as AnthropicMessageDelta);\n }\n return [];\n }\n\n private handleToolStart(start: AnthropicToolStart): void {\n if (start.content_block.type !== \"tool_use\") return;\n this.toolCalls.set(start.index, {\n type: \"tool_use\",\n id: start.content_block.id,\n name: start.content_block.name,\n input: { ...start.content_block.input },\n });\n this.toolBuffers.set(start.index, \"\");\n }\n\n private handleContentDelta(delta: AnthropicTextDelta | AnthropicToolDelta): LlmEvent[] {\n if (delta.delta.type === \"text_delta\") {\n const text = (delta as AnthropicTextDelta).delta.text;\n this.text += text;\n return [{ type: \"text_delta\", text }];\n }\n const idx = (delta as AnthropicToolDelta).index;\n const existing = this.toolBuffers.get(idx) ?? \"\";\n this.toolBuffers.set(idx, existing + (delta as AnthropicToolDelta).delta.partial_json);\n return [];\n }\n\n /**\n * T3.8 — extract token counters from Anthropic's `message_delta` usage.\n * Public on the class so the test seam can drive it directly without\n * spinning the SSE parser.\n */\n handleMessageDelta(md: AnthropicMessageDelta): void {\n if (md.delta.stop_reason !== undefined && md.delta.stop_reason !== null) {\n this.sawStopReason = true;\n }\n this.stopReason = mapAnthropicStopReason(md.delta.stop_reason);\n if (md.usage?.input_tokens !== undefined) this.inputTokens = md.usage.input_tokens;\n if (md.usage?.output_tokens !== undefined) this.outputTokens = md.usage.output_tokens;\n // T3.8 — treat 0 as \"no cache activity\" and leave the bucket\n // unreported (mirrors usage-accumulator's filter where zero-value\n // entries are stripped from the emitted TokenUsage).\n if (\n md.usage?.cache_creation_input_tokens !== undefined &&\n md.usage.cache_creation_input_tokens > 0\n ) {\n this.cacheWriteTokens = md.usage.cache_creation_input_tokens;\n }\n if (md.usage?.cache_read_input_tokens !== undefined && md.usage.cache_read_input_tokens > 0) {\n this.cacheReadTokens = md.usage.cache_read_input_tokens;\n }\n }\n\n /** M2 #61 — whether the terminal `message_delta` (stop_reason) was seen. */\n get finishReasonSeen(): boolean {\n return this.sawStopReason;\n }\n\n finish(): LlmFinish {\n const toolCalls: LlmToolCallPart[] = [];\n for (const [index, tool] of this.toolCalls.entries()) {\n const buffered = this.toolBuffers.get(index);\n const parsed = parseToolArguments(buffered);\n if (Object.keys(parsed).length > 0) tool.input = parsed;\n toolCalls.push(tool);\n }\n return makeLlmFinish({\n stopReason: this.stopReason,\n text: this.text,\n toolCalls,\n inputTokens: this.inputTokens,\n outputTokens: this.outputTokens,\n // T3.8 — surface Anthropic native cache-token counters when the\n // request used `cache_control: {type:\"ephemeral\"}` on system blocks.\n cacheReadTokens: this.cacheReadTokens,\n cacheWriteTokens: this.cacheWriteTokens,\n });\n }\n}\n\n/**\n * T3.8 — test seam: exposes the AnthropicStreamAccumulator directly so\n * unit tests can drive the message_delta path without spinning the SSE\n * parser. `@internal` — not part of the public surface.\n */\nexport const __testing__AnthropicAccumulator = AnthropicStreamAccumulator;\n\nfunction buildAnthropicBody(request: LlmRequest): Record<string, unknown> {\n return {\n model: request.model,\n stream: true,\n ...buildAnthropicCommonBody(request),\n };\n}\n","/**\n * AWS Bedrock HTTP error mapper (ADRs D67, D300).\n *\n * Bedrock returns either AWS-style `{ message, __type: \"ThrottlingException\" }`\n * or sometimes `{ Message }` (capitalized) depending on the model dialect.\n * We accept both shapes and map to canonical `TheokitAgentError` subclasses.\n *\n * @internal\n */\n\nimport {\n AuthenticationError,\n ConfigurationError,\n NetworkError,\n RateLimitError,\n type TheokitAgentError,\n UnknownAgentError,\n} from \"../../errors.js\";\nimport { buildErrorMetadata } from \"./shared.js\";\n\ninterface BedrockErrorBody {\n __type?: string;\n message?: string;\n Message?: string;\n}\n\nexport interface MapBedrockErrorArgs {\n status: number;\n body: unknown;\n headers: Headers | undefined;\n endpoint: string;\n}\n\ntype BedrockCode =\n | \"rate_limit\"\n | \"auth_failed\"\n | \"invalid_request\"\n | \"timeout\"\n | \"server_error\"\n | \"unknown\";\n\nfunction classifyBedrockError(\n args: MapBedrockErrorArgs,\n awsType: string,\n message: string,\n): BedrockCode {\n if (\n args.status === 429 ||\n awsType.includes(\"Throttling\") ||\n awsType.includes(\"TooManyRequests\")\n ) {\n return \"rate_limit\";\n }\n if (\n args.status === 401 ||\n args.status === 403 ||\n awsType.includes(\"AccessDenied\") ||\n awsType.includes(\"UnauthorizedOperation\")\n ) {\n return \"auth_failed\";\n }\n if (\n args.status === 400 ||\n args.status === 404 ||\n awsType.includes(\"ValidationException\") ||\n awsType.includes(\"ResourceNotFound\") ||\n message.includes(\"use case details\")\n ) {\n return \"invalid_request\";\n }\n if (args.status === 408 || awsType.includes(\"Timeout\")) return \"timeout\";\n if (args.status >= 500) return \"server_error\";\n return \"unknown\";\n}\n\nfunction buildBedrockMetadata(args: MapBedrockErrorArgs, code: BedrockCode) {\n return buildErrorMetadata({\n provider: \"bedrock\",\n endpoint: args.endpoint,\n code,\n status: args.status,\n headers: args.headers,\n body: args.body,\n });\n}\n\nexport function mapBedrockError(args: MapBedrockErrorArgs): TheokitAgentError {\n const parsed = parseBody(args.body);\n const awsType = parsed.__type ?? \"\";\n const message = parsed.message ?? parsed.Message ?? \"Bedrock request failed\";\n const code = classifyBedrockError(args, awsType, message);\n const metadata = buildBedrockMetadata(args, code);\n\n switch (code) {\n case \"rate_limit\":\n return new RateLimitError(`Bedrock throttled: ${message}`, { metadata });\n case \"auth_failed\":\n return new AuthenticationError(`Bedrock auth: ${message}`, { metadata });\n case \"invalid_request\": {\n const friendly = message.includes(\"use case details\")\n ? `Bedrock account setup required: ${message} (AWS Console → Bedrock → Model access → Anthropic → Submit use case form, then retry in 15 min.)`\n : `Bedrock validation: ${message}`;\n return new ConfigurationError(friendly, { metadata });\n }\n case \"timeout\":\n return new NetworkError(`Bedrock timeout: ${message}`, { metadata });\n case \"server_error\":\n return new NetworkError(`Bedrock server error: ${message}`, { metadata });\n default:\n return new UnknownAgentError(`Bedrock unknown: ${message}`, { metadata });\n }\n}\n\nfunction parseBody(body: unknown): BedrockErrorBody {\n if (body !== null && typeof body === \"object\") return body as BedrockErrorBody;\n if (typeof body === \"string\") {\n try {\n return JSON.parse(body) as BedrockErrorBody;\n } catch {\n return {};\n }\n }\n return {};\n}\n","/**\n * Bedrock Bearer token resolution + cache (ADRs D287, D295).\n *\n * Two paths:\n * 1. Explicit env (`AWS_BEARER_TOKEN_BEDROCK`) wins; no refresh.\n * 2. Optional peer dep `@aws/bedrock-token-generator` (D287) auto-generates\n * short-term tokens from the standard AWS credential chain\n * (`@aws-sdk/credential-providers`). Cached for 1.5h.\n *\n * `resolveBedrockToken` returns `undefined` only when BOTH paths produce no\n * token. Caller (router) is responsible for throwing a helpful error\n * (D279/EC-6) — this module is auth-resolution only.\n *\n * @internal\n */\n\nimport { createRequire } from \"node:module\";\n\ninterface CachedToken {\n value: string;\n expiresAt: number;\n}\n\nlet cachedToken: CachedToken | null = null;\n\ninterface BedrockTokenGeneratorApi {\n getToken: (opts: { credentials: unknown; region: string }) => Promise<string>;\n}\n\ninterface CredentialProvidersApi {\n fromNodeProviderChain: () => () => Promise<unknown>;\n}\n\nconst CACHE_TTL_MS = 90 * 60 * 1000; // 1.5h\n\nexport async function resolveBedrockToken(region: string): Promise<string | undefined> {\n const env = process.env.AWS_BEARER_TOKEN_BEDROCK;\n if (env !== undefined && env.length > 0) return env;\n\n const now = Date.now();\n if (cachedToken !== null && cachedToken.expiresAt > now) {\n return cachedToken.value;\n }\n\n try {\n const r = createRequire(import.meta.url);\n const gen = r(\"@aws/bedrock-token-generator\") as BedrockTokenGeneratorApi;\n if (typeof gen.getToken !== \"function\") return undefined;\n\n const providers = r(\"@aws-sdk/credential-providers\") as CredentialProvidersApi;\n if (typeof providers.fromNodeProviderChain !== \"function\") return undefined;\n\n const credentialProvider = providers.fromNodeProviderChain();\n const token = await gen.getToken({ credentials: credentialProvider, region });\n cachedToken = { value: token, expiresAt: now + CACHE_TTL_MS };\n return token;\n } catch {\n return undefined;\n }\n}\n\n/** Test seam — clear cache between tests. */\nexport function __resetBedrockTokenCache(): void {\n cachedToken = null;\n}\n","/**\n * AWS Bedrock client for Anthropic Messages (Adoption Roadmap #8; ADRs\n * D286-D302).\n *\n * v1: non-streaming only (`POST /model/{id}/invoke`). D302 defers\n * `/invoke-with-response-stream` (AWS Event Stream binary format) to v1.x.\n *\n * Body massage (D289):\n * - inject `anthropic_version: \"bedrock-2023-05-31\"`\n * - strip `model` from body (goes in URL)\n * - strip `stream` from body (D302 — non-streaming only in v1)\n *\n * Uses native `fetch` only — no `@aws-sdk/client-bedrock-runtime`.\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { mapBedrockError } from \"../error-mappers/bedrock.js\";\nimport {\n inferRegionFromModelId,\n resolveBedrockBaseUrl,\n stripBedrockPrefix,\n} from \"../providers/builtin/bedrock.js\";\nimport {\n buildAnthropicCommonBody,\n handleAnthropicResponse,\n postAnthropicRequest,\n} from \"./anthropic-shared.js\";\nimport { resolveBedrockToken } from \"./bedrock-token-cache.js\";\nimport { makeLlmFinish } from \"./finish.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\n\nexport interface BedrockAnthropicClientOptions {\n /**\n * AWS Bearer token. When non-empty, used as-is. When empty/undefined,\n * resolved lazily per request via `resolveBedrockToken(region)` (D287).\n */\n apiKey?: string;\n /** Override the resolved baseUrl (rarely needed; defaults derive from model id). */\n baseUrl?: string;\n /** Injected fetch impl for tests. */\n fetch?: typeof fetch;\n}\n\nexport class BedrockAnthropicClient implements LlmClient {\n readonly name = \"bedrock\";\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly options: BedrockAnthropicClientOptions) {\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n private async resolveTokenOrThrow(region: string): Promise<string> {\n const fromOpts = this.options.apiKey;\n if (fromOpts !== undefined && fromOpts.length > 0) return fromOpts;\n const fromEnv = await resolveBedrockToken(region);\n if (fromEnv !== undefined && fromEnv.length > 0) return fromEnv;\n throw new ConfigurationError(\n \"Bedrock requires AWS_BEARER_TOKEN_BEDROCK env var, or install `@aws/bedrock-token-generator` for auto-refresh, or pass apiKey explicitly.\",\n { code: \"auth_failed\" },\n );\n }\n\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n const region = inferRegionFromModelId(request.model) ?? process.env.AWS_REGION ?? \"us-east-1\";\n const token = await this.resolveTokenOrThrow(region);\n\n const bareModel = stripBedrockPrefix(request.model);\n const baseUrl = this.options.baseUrl ?? resolveBedrockBaseUrl(request.model);\n const endpoint = `/model/${encodeURIComponent(bareModel)}/invoke`;\n const url = `${baseUrl}${endpoint}`;\n\n const response = await postAnthropicRequest({\n fetchImpl: this.fetchImpl,\n url,\n token,\n body: buildBedrockBody(request),\n signal,\n });\n\n const consumed = await handleAnthropicResponse({\n response,\n endpoint,\n errorMapper: mapBedrockError,\n });\n if (consumed.text.length > 0) yield { type: \"text_delta\", text: consumed.text };\n return makeLlmFinish(consumed);\n }\n}\n\nfunction buildBedrockBody(request: LlmRequest): Record<string, unknown> {\n // D289: anthropic_version injected; model + stream stripped.\n return {\n anthropic_version: \"bedrock-2023-05-31\",\n ...buildAnthropicCommonBody(request),\n };\n}\n","/**\n * OpenAI-compatible HTTP error mapper (ADR D67).\n *\n * Translates OpenAI-shaped API error responses (covers OpenAI, OpenRouter,\n * DeepSeek, Together, Mistral, Voyage, DeepInfra, etc.) into typed\n * `TheokitAgentError` subclasses with full `ErrorMetadata`.\n *\n * Body inspection: looks at `body.error.code` / `body.error.type` to detect\n * `context_too_long`, `content_filtered`, `model_unavailable` semantics.\n * Falls back to status-based mapping when body doesn't expose `.error`\n * (e.g., HTML server error page, DeepInfra's `{message: \"...\"}` shape).\n *\n * Never throws — caller is already in an error path.\n *\n * @internal\n */\n\nimport {\n AuthenticationError,\n ConfigurationError,\n type ErrorCode,\n NetworkError,\n RateLimitError,\n type TheokitAgentError,\n UnknownAgentError,\n} from \"../../errors.js\";\nimport { buildErrorMetadata } from \"./shared.js\";\n\ninterface MapOpenAiErrorArgs {\n providerId: string;\n status: number;\n body: unknown;\n headers: Headers | undefined;\n endpoint: string;\n}\n\nexport function mapOpenAICompatibleError(args: MapOpenAiErrorArgs): TheokitAgentError {\n const { providerId, status, body, headers, endpoint } = args;\n const code = mapOpenAiStatusToCode(status, body);\n const message = formatMessage(providerId, status, code);\n const metadata = buildErrorMetadata({\n provider: providerId,\n endpoint,\n code,\n status,\n headers,\n body,\n });\n\n if (status === 401 || status === 403) {\n return new AuthenticationError(message, { code: `${providerId}_auth_failed`, metadata });\n }\n if (status === 429) {\n return new RateLimitError(message, { code: `${providerId}_rate_limit`, metadata });\n }\n if (status === 400) {\n return new ConfigurationError(message, { code: `${providerId}_${code}`, metadata });\n }\n if (status === 408) {\n return new NetworkError(message, { code: `${providerId}_timeout`, metadata });\n }\n if (status >= 500 && status < 600) {\n return new NetworkError(message, { code: `${providerId}_server_error`, metadata });\n }\n return new UnknownAgentError(message, { code: `${providerId}_unknown`, metadata });\n}\n\nfunction extractOpenAiErrorCode(body: unknown): string | undefined {\n if (body === null || typeof body !== \"object\") return undefined;\n const err = (body as { error?: { code?: unknown; type?: unknown } }).error;\n if (err === undefined || err === null) return undefined;\n if (typeof err.code === \"string\") return err.code;\n if (typeof err.type === \"string\") return err.type;\n return undefined;\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: explicit branch table is clearer than splitting\nfunction mapOpenAiStatusToCode(status: number, body: unknown): ErrorCode {\n const rawCode = extractOpenAiErrorCode(body)?.toLowerCase() ?? \"\";\n\n if (\n rawCode.includes(\"context_length\") ||\n rawCode.includes(\"context_window\") ||\n rawCode.includes(\"too_many_tokens\") ||\n rawCode.includes(\"max_tokens\")\n ) {\n return \"context_too_long\";\n }\n if (\n rawCode.includes(\"content_filter\") ||\n rawCode.includes(\"content_policy\") ||\n rawCode.includes(\"safety\")\n ) {\n return \"content_filtered\";\n }\n if (\n rawCode.includes(\"model_not_found\") ||\n rawCode.includes(\"model_unavailable\") ||\n rawCode.includes(\"invalid_model\")\n ) {\n return \"model_unavailable\";\n }\n // T3.7 — OpenAI 402 / OpenRouter \"Insufficient credits\" / `insufficient_quota`\n // body code now flow to canonical `quota_exceeded`. Pre-T3.7 we returned\n // `invalid_request` because the ErrorCode union lacked the bucket; T3.7\n // added it. AgentRunError.code (KnownAgentRunErrorCode, post-T1.1) has\n // always carried this value; this fix closes the metadata.code surface.\n if (\n status === 402 ||\n rawCode.includes(\"insufficient_quota\") ||\n rawCode.includes(\"quota_exceeded\")\n ) {\n return \"quota_exceeded\";\n }\n\n if (status === 401 || status === 403) return \"auth_failed\";\n if (status === 429) return \"rate_limit\";\n if (status === 408) return \"timeout\";\n if (status === 400) return \"invalid_request\";\n if (status >= 500 && status < 600) return \"server_error\";\n return \"unknown\";\n}\n\nfunction formatMessage(providerId: string, status: number, code: ErrorCode): string {\n return `${providerId} API error: ${code} (HTTP ${status})`;\n}\n","/**\n * D14 — Fault injection via `THEOKIT_TEST_RESPONSE_OVERRIDE` env var.\n *\n * Decorator pattern (D127 inspired): wraps any `LlmClient` and short-circuits\n * the network call when:\n *\n * 1. `process.env.NODE_ENV === \"test\"` (fail-safe gate — prevents production\n * footgun), AND\n * 2. `process.env.THEOKIT_TEST_RESPONSE_OVERRIDE` is a non-empty JSON string\n * shaped as `{ \"status\": number, \"body\": object | string }`.\n *\n * On any other condition (different NODE_ENV, missing env, malformed JSON),\n * the wrapper delegates to the real client — graceful degradation.\n *\n * Use cases (FAANG-grade chaos testing):\n *\n * - `{\"status\":429,\"body\":{\"error\":{\"code\":\"rate_limit_exceeded\"}}}` →\n * deterministic RateLimitError without burning real quota\n * - `{\"status\":500,\"body\":{\"error\":{\"code\":\"internal_error\"}}}` →\n * deterministic NetworkError for retry/circuit-breaker tests\n * - `{\"status\":200,\"body\":{\"choices\":[{\"message\":{\"content\":\"fake\"}}]}}` →\n * deterministic happy-path text for snapshot tests\n *\n * Compatible with the dogfood-stranger chaos phases (12-15). Replaces the\n * flaky \"50 parallel requests to force 429\" anti-pattern.\n *\n * Wire format mirrors OpenAI Chat Completions (universal — same shape every\n * provider returns). Error mapping reuses `mapOpenAICompatibleError` so the\n * injected errors are byte-equal to what the real provider would raise.\n *\n * @internal\n */\n\nimport { mapOpenAICompatibleError } from \"../error-mappers/openai-compatible.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\n\nconst ENV_GATE_KEY = \"NODE_ENV\";\nconst ENV_GATE_VALUE = \"test\";\nconst ENV_OVERRIDE_KEY = \"THEOKIT_TEST_RESPONSE_OVERRIDE\";\n\ninterface ParsedOverride {\n status: number;\n body: unknown;\n}\n\n/**\n * Wrap an `LlmClient` with the fault-injection decorator. Returns the\n * original client unchanged when the activation gate is not satisfied\n * (cheap noop — no allocation in the hot path of production runtime).\n */\nexport function maybeWrapWithFaultInjection(client: LlmClient): LlmClient {\n // Cheap gate first — production calls never allocate the wrapper.\n if (!isGateOn()) return client;\n return new FaultInjectingLlmClient(client);\n}\n\nexport class FaultInjectingLlmClient implements LlmClient {\n readonly name: string;\n /**\n * Inner (real) client. Exposed so layered transport assertions (router\n * pool-wiring tests, telemetry inspectors) can walk one level deep —\n * same pattern PoolAwareLlmClient uses for its inner transport.\n */\n readonly inner: LlmClient;\n constructor(inner: LlmClient) {\n this.inner = inner;\n this.name = inner.name;\n }\n\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n // Re-check gate on every call — env vars can change between calls and\n // the cost is negligible relative to a network roundtrip.\n if (!isGateOn()) {\n return yield* this.inner.stream(request, signal);\n }\n const parsed = parseOverrideOrWarnOnce();\n if (parsed === undefined) {\n return yield* this.inner.stream(request, signal);\n }\n // Active: synthesize response without calling the real client.\n if (parsed.status >= 400) {\n throw mapOpenAICompatibleError({\n providerId: this.name,\n status: parsed.status,\n body: parsed.body,\n headers: undefined,\n endpoint: \"/v1/chat/completions\",\n });\n }\n const text = extractText(parsed.body);\n yield { type: \"text_delta\", text };\n yield { type: \"stop\", reason: \"end_turn\" };\n return {\n stopReason: \"end_turn\",\n text,\n toolCalls: [],\n inputTokens: 0,\n outputTokens: 0,\n };\n }\n}\n\nfunction isGateOn(): boolean {\n return process.env[ENV_GATE_KEY] === ENV_GATE_VALUE;\n}\n\nlet warnedInvalidJson = false;\n\nfunction parseOverrideOrWarnOnce(): ParsedOverride | undefined {\n const raw = process.env[ENV_OVERRIDE_KEY];\n if (raw === undefined || raw.length === 0) return undefined;\n let candidate: unknown;\n try {\n candidate = JSON.parse(raw);\n } catch (_err) {\n warnInvalidJsonOnce(raw);\n return undefined;\n }\n if (candidate === null || typeof candidate !== \"object\") {\n warnInvalidJsonOnce(raw);\n return undefined;\n }\n const obj = candidate as { status?: unknown; body?: unknown };\n if (typeof obj.status !== \"number\" || !Number.isFinite(obj.status)) {\n warnInvalidJsonOnce(raw);\n return undefined;\n }\n return { status: obj.status, body: obj.body };\n}\n\nfunction warnInvalidJsonOnce(_raw: string): void {\n if (warnedInvalidJson) return;\n warnedInvalidJson = true;\n process.stderr.write(\n `[theokit-sdk] ${ENV_OVERRIDE_KEY} is set but value is not valid JSON of shape ` +\n `\\`{\"status\": number, \"body\": object | string}\\`. Falling back to real LLM call. ` +\n `This warning is shown once per process.\\n`,\n );\n}\n\n/**\n * Extract textual content from an arbitrary body. Supports:\n * - plain string: returned as-is\n * - OpenAI shape: `body.choices[0].message.content` (most common)\n * - object with `text` field: `body.text`\n * - everything else: empty string (caller can still inspect parsed.body if needed)\n */\nfunction extractText(body: unknown): string {\n if (typeof body === \"string\") return body;\n if (body === null || typeof body !== \"object\") return \"\";\n const fromOpenAi = readOpenAiContent(body);\n if (fromOpenAi !== undefined) return fromOpenAi;\n const obj = body as { text?: unknown };\n if (typeof obj.text === \"string\") return obj.text;\n return \"\";\n}\n\nfunction readOpenAiContent(body: unknown): string | undefined {\n const obj = body as { choices?: unknown };\n if (!Array.isArray(obj.choices) || obj.choices.length === 0) return undefined;\n const first = obj.choices[0] as { message?: { content?: unknown } } | undefined;\n const content = first?.message?.content;\n if (typeof content === \"string\") return content;\n return undefined;\n}\n\n/**\n * Test-only reset for the one-shot stderr warning. Mirrors the D187\n * `_resetNoAuthApiKeyWarnings` pattern.\n *\n * @internal\n */\nexport function _resetFaultInjectionWarnings(): void {\n warnedInvalidJson = false;\n}\n","/**\n * Ollama-specific HTTP/transport error mapper (T1.1, ADR D185).\n *\n * Sits ABOVE the generic OpenAI-compatible mapper for `providerId: \"ollama\"`.\n * Returns `undefined` when the error doesn't match an Ollama-specific\n * pattern — caller (OpenAIClient) then falls back to the generic mapper.\n *\n * Surfaces 3 Ollama-specific failure modes with actionable messages\n * targeted at non-technical users (CLAUDE.md primary persona):\n *\n * 1. **Transport-level `ECONNREFUSED` / `ENOTFOUND`** → \"Run `ollama serve`\"\n * 2. **HTTP 404 with `not found, try pulling`** → \"Run `ollama pull <model>`\"\n * 3. **HTTP 503 with `model is loading`** → retryable (model warming up)\n *\n * @internal\n */\n\nimport { ConfigurationError, NetworkError, type TheokitAgentError } from \"../../errors.js\";\nimport { buildErrorMetadata } from \"./shared.js\";\n\ninterface MapOllamaTransportArgs {\n providerId: string;\n cause: unknown;\n endpoint: string;\n}\n\ninterface MapOllamaHttpArgs {\n providerId: string;\n status: number;\n body: unknown;\n headers: Headers | undefined;\n endpoint: string;\n}\n\n/**\n * Maps fetch-level failures (Node TypeError with `cause.code`). Returns\n * `undefined` for anything that isn't `ECONNREFUSED` / `ENOTFOUND` so\n * the caller can re-throw the original error untouched.\n */\nexport function mapOllamaTransportError(\n args: MapOllamaTransportArgs,\n): TheokitAgentError | undefined {\n if (args.providerId !== \"ollama\") return undefined;\n const causeCode = extractCauseCode(args.cause);\n if (causeCode !== \"ECONNREFUSED\" && causeCode !== \"ENOTFOUND\") return undefined;\n\n const metadata = buildErrorMetadata({\n provider: \"ollama\",\n endpoint: args.endpoint,\n code: \"network\",\n status: 0,\n headers: undefined,\n body: { cause: causeCode },\n });\n return new ConfigurationError(\n \"Ollama is not reachable. Run `ollama serve` to start the local runtime, \" +\n \"or set OLLAMA_HOST to point at a remote Ollama server.\",\n { code: \"ollama_unreachable\", metadata },\n );\n}\n\n/**\n * Maps HTTP-level Ollama failures. Returns `undefined` for status codes\n * that aren't Ollama-specific so the caller falls back to the generic\n * OpenAI-compatible mapper.\n */\nexport function mapOllamaHttpError(args: MapOllamaHttpArgs): TheokitAgentError | undefined {\n if (args.providerId !== \"ollama\") return undefined;\n\n const errString = extractErrorString(args.body).toLowerCase();\n\n // 404 + \"not found, try pulling\" → model not pulled.\n if (args.status === 404 && errString.includes(\"not found\") && errString.includes(\"pull\")) {\n const modelHint = extractModelName(errString);\n const metadata = buildErrorMetadata({\n provider: \"ollama\",\n endpoint: args.endpoint,\n code: \"model_unavailable\",\n status: args.status,\n headers: args.headers,\n body: args.body,\n });\n const pullCmd = modelHint !== undefined ? `ollama pull ${modelHint}` : \"ollama pull <model>\";\n return new ConfigurationError(\n `Ollama model is not pulled. Run \\`${pullCmd}\\` to download it first.`,\n { code: \"ollama_model_not_pulled\", metadata },\n );\n }\n\n // 503 + \"model is loading\" → retryable transient.\n if (args.status === 503 && errString.includes(\"model is loading\")) {\n const metadata = buildErrorMetadata({\n provider: \"ollama\",\n endpoint: args.endpoint,\n code: \"server_error\",\n status: args.status,\n headers: args.headers,\n body: args.body,\n });\n // NetworkError isRetryable: true (default per errors.ts contract).\n return new NetworkError(\n \"Ollama model is loading. Retry in a few seconds — Ollama is warming up the model into memory.\",\n { code: \"ollama_model_loading\", metadata },\n );\n }\n\n return undefined;\n}\n\nfunction extractCauseCode(cause: unknown): string | undefined {\n if (cause === null || typeof cause !== \"object\") return undefined;\n // Native fetch wraps in TypeError(\"fetch failed\") with `cause` chain.\n const directCode = (cause as { code?: unknown }).code;\n if (typeof directCode === \"string\") return directCode;\n const nested = (cause as { cause?: unknown }).cause;\n if (nested !== undefined) return extractCauseCode(nested);\n return undefined;\n}\n\nfunction extractErrorString(body: unknown): string {\n if (typeof body === \"string\") return body;\n if (body === null || typeof body !== \"object\") return \"\";\n const err = (body as { error?: unknown }).error;\n if (typeof err === \"string\") return err;\n return \"\";\n}\n\n/** Pull the model name out of e.g. `model 'llama3.2' not found, try pulling it first`. */\nfunction extractModelName(errString: string): string | undefined {\n const match = errString.match(/'([^']+)'/);\n return match?.[1];\n}\n","/**\n * Ollama native API client (T8.1 follow-up, ADR D191).\n *\n * Targets Ollama's native `/api/chat` endpoint with NDJSON streaming.\n * Critical for **tool calling** — per peer-project upstream warning, the\n * OpenAI-compat `/v1/chat/completions` endpoint BREAKS tool calling in\n * Ollama (models emit raw tool JSON as text instead of structured\n * `tool_calls` blocks). Mirrors peer-project `extensions/ollama/src/stream.ts`.\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { mapOllamaHttpError, mapOllamaTransportError } from \"../error-mappers/ollama.js\";\nimport { collapseSystemText, makeLlmFinish } from \"./finish.js\";\nimport { toStringToolResultContent } from \"./tool-result-content.js\";\nimport type {\n LlmClient,\n LlmEvent,\n LlmFinish,\n LlmMessage,\n LlmRequest,\n LlmStopReason,\n LlmToolCallPart,\n} from \"./types.js\";\n\nexport interface OllamaNativeClientOptions {\n /** Optional API key for Ollama Cloud / reverse-proxy. Local Ollama ignores `Authorization`. */\n apiKey?: string;\n /** Base URL. Default `http://localhost:11434`. `/v1` suffix is stripped automatically. */\n baseUrl?: string;\n fetch?: typeof fetch;\n}\n\ninterface OllamaToolCall {\n function: {\n name: string;\n arguments: Record<string, unknown> | string;\n };\n}\n\ninterface OllamaChatChunk {\n message?: {\n role?: \"assistant\";\n content?: string;\n tool_calls?: OllamaToolCall[];\n };\n done?: boolean;\n done_reason?: string;\n prompt_eval_count?: number;\n eval_count?: number;\n}\n\ninterface OllamaChatMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n tool_calls?: OllamaToolCall[];\n tool_name?: string;\n}\n\ninterface OllamaTool {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n}\n\nexport class OllamaNativeClient implements LlmClient {\n readonly name = \"ollama\";\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly options: OllamaNativeClientOptions) {\n // Strip `/v1` if user mistakenly included it (peer-project guard).\n const raw = (options.baseUrl ?? \"http://localhost:11434\").replace(/\\/+$/, \"\");\n this.baseUrl = raw.replace(/\\/v1$/i, \"\");\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: HTTP+NDJSON handshake + accumulator is intentionally one block (mirrors openai.ts)\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n const headers: Record<string, string> = { \"content-type\": \"application/json\" };\n if (this.options.apiKey !== undefined && this.options.apiKey.length > 0) {\n headers.authorization = `Bearer ${this.options.apiKey}`;\n }\n const body = buildOllamaChatBody(request);\n const url = `${this.baseUrl}/api/chat`;\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, {\n method: \"POST\",\n signal,\n headers,\n body: JSON.stringify(body),\n });\n } catch (fetchErr) {\n const mapped = mapOllamaTransportError({\n providerId: \"ollama\",\n cause: fetchErr,\n endpoint: \"/api/chat\",\n });\n if (mapped !== undefined) throw mapped;\n throw fetchErr;\n }\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let bodyJson: unknown = text;\n try {\n bodyJson = JSON.parse(text);\n } catch {\n /* not JSON */\n }\n const mapped = mapOllamaHttpError({\n providerId: \"ollama\",\n status: response.status,\n body: bodyJson,\n headers: response.headers,\n endpoint: \"/api/chat\",\n });\n if (mapped !== undefined) throw mapped;\n throw new Error(`Ollama /api/chat HTTP ${response.status}: ${text.slice(0, 200)}`);\n }\n\n const accumulator = new OllamaStreamAccumulator();\n if (response.body === null) {\n return accumulator.finish();\n }\n for await (const chunk of parseNdjsonStream(response.body, signal)) {\n const events = accumulator.consume(chunk);\n for (const event of events) yield event;\n if (chunk.done === true) break;\n }\n return accumulator.finish();\n }\n}\n\nclass OllamaStreamAccumulator {\n private text = \"\";\n private stopReason: LlmStopReason = \"end_turn\";\n private inputTokens?: number;\n private outputTokens?: number;\n private readonly toolCalls: LlmToolCallPart[] = [];\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: NDJSON chunk dispatch — text delta + tool_call append + finish-reason mapping is one cohesive accumulator (mirrors openai.ts OpenAIStreamAccumulator.consume).\n consume(chunk: OllamaChatChunk): LlmEvent[] {\n const events: LlmEvent[] = [];\n if (chunk.prompt_eval_count !== undefined) this.inputTokens = chunk.prompt_eval_count;\n if (chunk.eval_count !== undefined) this.outputTokens = chunk.eval_count;\n const msg = chunk.message;\n if (msg?.content !== undefined && msg.content.length > 0) {\n this.text += msg.content;\n events.push({ type: \"text_delta\", text: msg.content });\n }\n if (msg?.tool_calls !== undefined) {\n for (const call of msg.tool_calls) {\n const input =\n typeof call.function.arguments === \"string\"\n ? parseOllamaToolArguments(call.function.arguments)\n : call.function.arguments;\n this.toolCalls.push({\n type: \"tool_use\",\n id: `ollama_call_${this.toolCalls.length + 1}`,\n name: call.function.name,\n input,\n });\n }\n }\n if (chunk.done === true && chunk.done_reason !== undefined) {\n this.stopReason = mapOllamaDoneReason(chunk.done_reason, this.toolCalls.length > 0);\n }\n return events;\n }\n\n finish(): LlmFinish {\n if (this.toolCalls.length > 0 && this.stopReason === \"end_turn\") {\n this.stopReason = \"tool_use\";\n }\n return makeLlmFinish({\n stopReason: this.stopReason,\n text: this.text,\n toolCalls: this.toolCalls,\n inputTokens: this.inputTokens,\n outputTokens: this.outputTokens,\n });\n }\n}\n\nfunction parseOllamaToolArguments(raw: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(raw);\n return typeof parsed === \"object\" && parsed !== null ? (parsed as Record<string, unknown>) : {};\n } catch {\n return {};\n }\n}\n\nfunction mapOllamaDoneReason(reason: string, hasToolCalls: boolean): LlmStopReason {\n if (hasToolCalls) return \"tool_use\";\n if (reason === \"length\") return \"max_tokens\";\n if (reason === \"stop\") return \"end_turn\";\n return \"end_turn\";\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: NDJSON line buffering + JSON.parse-with-skip-malformed + signal abort + trailing-buffer flush is one cohesive parser, mirrors peer-project's parseJsonLineStream.\nasync function* parseNdjsonStream(\n body: ReadableStream<Uint8Array>,\n signal: AbortSignal,\n): AsyncGenerator<OllamaChatChunk, void, void> {\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n try {\n while (true) {\n if (signal.aborted) return;\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length === 0) continue;\n try {\n yield JSON.parse(trimmed) as OllamaChatChunk;\n } catch {\n /* skip malformed NDJSON line */\n }\n }\n }\n const tail = buffer.trim();\n if (tail.length > 0) {\n try {\n yield JSON.parse(tail) as OllamaChatChunk;\n } catch {\n /* ignore */\n }\n }\n } finally {\n // T3.2 + T3.3 — mirror sse.ts: cancel the underlying body stream on\n // every exit path (abort, normal close, consumer break, consumer\n // throw). Without this the upstream Ollama HTTP TCP socket stays in\n // CLOSE_WAIT until the OS times it out. cancel() on a finished stream\n // is a no-op so always-cancel is safe.\n try {\n await reader.cancel();\n } catch {\n // best-effort — already cancelled OR upstream closed\n }\n reader.releaseLock();\n }\n}\n\n/**\n * T3.5 — collapse the wider `LlmRequest.system` shape into the legacy\n * single-string form Ollama expects.\n *\n * @internal\n */\nconst ollamaSystemText = collapseSystemText;\n\nfunction buildOllamaChatBody(request: LlmRequest): Record<string, unknown> {\n const messages: OllamaChatMessage[] = [];\n const systemText = ollamaSystemText(request.system);\n if (systemText.length > 0) {\n messages.push({ role: \"system\", content: systemText });\n }\n for (const message of request.messages) {\n for (const out of toOllamaMessages(message)) messages.push(out);\n }\n const tools = toOllamaTools(request.tools);\n const body: Record<string, unknown> = {\n model: request.model,\n stream: true,\n messages,\n // ADR D192: 24h keep_alive prevents Ollama from evicting the chat model\n // when other models (embeddings, judges) are loaded between turns.\n // Cuts cold-load latency from 20-30s to single-digit ms per turn.\n keep_alive: process.env.OLLAMA_KEEP_ALIVE ?? \"24h\",\n };\n if (tools.length > 0) body.tools = tools;\n const opts: Record<string, unknown> = {};\n if (request.maxTokens !== undefined) opts.num_predict = request.maxTokens;\n if (request.temperature !== undefined) opts.temperature = request.temperature;\n if (Object.keys(opts).length > 0) body.options = opts;\n return body;\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: 3-role transformation (system/user/assistant) with tool_result→tool role demotion + tool_use→tool_calls promotion is one cohesive mapper; splitting hurts readability.\nfunction toOllamaMessages(message: LlmMessage): OllamaChatMessage[] {\n if (message.role === \"system\") {\n return [{ role: \"system\", content: joinTextParts(message) }];\n }\n if (message.role === \"user\") {\n // M35 — the ollama-native wire has no image content channel here. Fail fast rather than silently\n // dropping an attached image (error-handling.md: no silent drop); OpenAI/OpenRouter carries images.\n if (message.content.some((p) => p.type === \"image\")) {\n throw new ConfigurationError(\n \"image input is not supported on the ollama-native provider; use an OpenAI/OpenRouter model for multimodal turns\",\n { code: \"ollama_image_unsupported\" },\n );\n }\n const out: OllamaChatMessage[] = [];\n for (const part of message.content) {\n if (part.type === \"tool_result\") {\n out.push({\n role: \"tool\",\n // SE7 — string-only tool role: text blocks flatten; image fails fast.\n content: toStringToolResultContent(part.content, \"ollama\"),\n tool_name: part.toolUseId,\n });\n }\n }\n const userText = joinTextParts(message);\n if (userText.length > 0) out.push({ role: \"user\", content: userText });\n return out;\n }\n // assistant\n const text = joinTextParts(message);\n const toolCalls: OllamaToolCall[] = [];\n for (const part of message.content) {\n if (part.type === \"tool_use\") {\n toolCalls.push({\n function: { name: part.name, arguments: part.input },\n });\n }\n }\n const msg: OllamaChatMessage = { role: \"assistant\", content: text };\n if (toolCalls.length > 0) msg.tool_calls = toolCalls;\n return [msg];\n}\n\nfunction joinTextParts(message: LlmMessage): string {\n return message.content\n .filter((p) => p.type === \"text\")\n .map((p) => (p as { text: string }).text)\n .join(\"\\n\");\n}\n\nfunction toOllamaTools(tools: LlmRequest[\"tools\"]): OllamaTool[] {\n if (tools === undefined || tools.length === 0) return [];\n return tools.map((tool) => ({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }));\n}\n","/**\n * Hermes tool-call extraction — leaked-dialect safe-parse (theokit#58 follow-up).\n *\n * Some models (qwen3-coder via OpenRouter, OpenAI-compatible API) intermittently emit their\n * Hermes tool-call dialect as assistant TEXT content instead of native `tool_calls`:\n *\n * <function=NAME><parameter=KEY>VALUE</parameter>...</function></tool_call>\n *\n * When that happens the provider sends ZERO native tool_calls, so the agent loop sees an\n * `end_turn` with no tools and the intended call is silently lost. This pure helper recovers\n * those calls from the content so the loop can execute them.\n *\n * OPT-IN only (`ProviderProfile.extractToolCallsFromContent`) and run ONLY when the provider\n * emitted no native tool_calls. A code assistant can legitimately print a literal `<function=` in a\n * fenced code block, so recovery is gated TWICE: the per-route flag is the coarse enable, and the R5\n * request-scoped `allowedToolNames` allowlist below is the precise false-positive guard — a block is\n * promoted only when its name is a real tool in the current request. The size-guard (no native call)\n * prevents double-counting a real native call.\n *\n * Fail-open like `stripThinkBlocks`: a partial/unclosed block (missing the `</tool_call>`\n * marker) is NOT matched — it stays in the residual text and yields no tool call, so a corrupted\n * stream never fabricates a call from junk.\n *\n * Accepted best-effort limit (mirrors the consumer-side stripper EC-5): if a parameter VALUE\n * contains the literal substring `</tool_call>`, the non-greedy block scanner closes at that inner\n * occurrence. This errs toward NOT over-consuming text — same class as `strip-think`'s EC-10.\n *\n * Recovered parameter values are ALWAYS strings: the text dialect carries no per-param type info, so\n * `<parameter=count>5</parameter>` yields `{ count: \"5\" }`, not `{ count: 5 }`. A downstream schema\n * (e.g. Zod) coercing/validating the tool input is the right place to type it — a mismatch there\n * fails clear (typed tool error), never silently. This differs from the native `tool_calls` path,\n * whose `arguments` is JSON and is parsed into typed values.\n *\n * @internal\n */\nimport { sanitizeToolInput } from \"../../sanitize/sanitize-tool-input.js\";\nimport type { LlmToolCallPart } from \"./types.js\";\n\n/** A full leaked block: `<function=NAME> …inner… </tool_call>`. The closing `</tool_call>` is\n * required (fail-open: a partial block at stream end is left as text). Non-greedy inner. */\nconst HERMES_BLOCK = /<function=\\s*([^>\\s]+)\\s*>([\\s\\S]*?)<\\/tool_call>/g;\n/** A single parameter inside a block: `<parameter=KEY>VALUE</parameter>`. Non-greedy value. */\nconst HERMES_PARAM = /<parameter=\\s*([^>\\s]+)\\s*>([\\s\\S]*?)<\\/parameter>/g;\n\nexport interface HermesExtractResult {\n /** Recovered tool calls (empty when none matched). */\n toolCalls: LlmToolCallPart[];\n /** Content with every PROMOTED block removed + trimmed; gated-out and unmatched blocks stay visible. */\n residualText: string;\n /** Names of well-formed leaked blocks that WERE dropped by the request-scoped allowlist (R5) — a\n * block whose name is not a tool in the current request. Empty when no allowlist was applied or\n * nothing was gated out. The caller logs these so a guard firing is observable in production. */\n droppedNames: string[];\n}\n\n/**\n * Recover Hermes-dialect tool calls leaked into assistant text. `makeId` supplies a unique id per\n * recovered call (the provider gave none). Pure — no side effects.\n *\n * @param allowedToolNames R5 request-scoped gate — when provided, only a block whose name is in the\n * set is promoted (exact, case-sensitive); an empty set promotes nothing; `undefined` recovers all\n * (back-compat). Gated-out blocks stay as visible text (they are not tool calls).\n * @internal\n */\nexport function extractHermesToolCalls(\n content: string,\n makeId: () => string,\n allowedToolNames?: ReadonlySet<string>,\n): HermesExtractResult {\n // R5 request-scoped gate: promote a block only when its name is a real tool in the current request\n // (exact, case-sensitive — peer-project payload.ts:190). `undefined` allowlist → recover-all (back-compat\n // for direct callers); an EMPTY set recovers nothing (a request with no tools has nothing legitimate\n // to recover). The name is already trimmed above, so the gate and the emitted call agree (EC-1).\n const isPromoted = (name: string): boolean =>\n name.length > 0 && (allowedToolNames === undefined || allowedToolNames.has(name));\n const toolCalls: LlmToolCallPart[] = [];\n const droppedNames: string[] = [];\n for (const block of content.matchAll(HERMES_BLOCK)) {\n const name = (block[1] ?? \"\").trim();\n if (!isPromoted(name)) {\n // A well-formed leaked block gated out by a defined allowlist — record it for observability.\n if (name.length > 0 && allowedToolNames !== undefined) droppedNames.push(name);\n continue;\n }\n toolCalls.push({\n type: \"tool_use\",\n id: makeId(),\n name,\n input: parseHermesParams(block[2] ?? \"\"),\n });\n }\n // EC-5: strip ONLY promoted blocks — a gated-out block (e.g. a `<function=example>` in a code fence\n // whose name is not a request tool) keeps its text visible instead of being silently deleted.\n const residualText =\n toolCalls.length === 0\n ? content\n : content\n .replace(HERMES_BLOCK, (full, rawName) =>\n isPromoted((rawName ?? \"\").trim()) ? \"\" : full,\n )\n .trim();\n return { toolCalls, residualText, droppedNames };\n}\n\n/** Parse the `<parameter=KEY>VALUE</parameter>` pairs inside a block's inner text into an input map.\n *\n * Value hygiene is DELEGATED to the public `sanitizeToolInput` primitive (`@theokit/sdk/sanitize`,\n * trim-only) so the internal recovery and the public sanitizer share ONE source of truth (DRY) — the\n * P0 bug (`\\n`-wrapped paths → `not_found` → stalled multi-read loops) was born from an ad-hoc,\n * un-shared trim. Keys are trimmed here (the regex already excludes whitespace from the key capture);\n * values stay strings (the doc-comment invariant), trimmed by the shared primitive. */\nfunction parseHermesParams(inner: string): Record<string, unknown> {\n const input: Record<string, unknown> = {};\n for (const param of inner.matchAll(HERMES_PARAM)) {\n const key = param[1];\n const value = param[2];\n if (key === undefined || value === undefined) continue;\n input[key.trim()] = value;\n }\n return sanitizeToolInput(input, { trim: true }).value;\n}\n\nconst STREAM_MARKER = \"<function=\";\nconst DEFAULT_STREAM_BUFFER_CAP = 8192;\n\nconst isStreamWs = (c: string | undefined): boolean =>\n c === \" \" || c === \"\\t\" || c === \"\\n\" || c === \"\\r\";\n\n/**\n * R7 stream-boundary suppression FSM. Classifies a suspicion buffer (accumulated streamed content)\n * as `\"possible\"` — it could still become a `<function=NAME>` tool call for a request tool, so the\n * caller HOLDS it (emits no text_delta) — or `\"impossible\"` — confirmed NOT a tool call, so the\n * caller FLUSHES it as visible text. The marker match is CASE-SENSITIVE, identical to `HERMES_BLOCK`\n * (no `/i`), so the FSM never holds a block `extractHermesToolCalls` would not recover (EC-1). An\n * empty allowlist promotes nothing (`\"impossible\"`); over `cap` while still tool-call-like fails open\n * to `\"impossible\"` (flush) so a never-closing marker cannot grow unbounded. Pure — never throws.\n * @internal\n */\nexport function streamToolCallBufferState(\n held: string,\n allowedToolNames: ReadonlySet<string>,\n cap: number = DEFAULT_STREAM_BUFFER_CAP,\n): \"possible\" | \"impossible\" {\n if (allowedToolNames.size === 0) return \"impossible\";\n const t = held.trimStart();\n if (t.length < STREAM_MARKER.length) {\n // Still building the marker itself (e.g. \"<fun\").\n return STREAM_MARKER.startsWith(t) ? \"possible\" : \"impossible\";\n }\n if (!t.startsWith(STREAM_MARKER)) return \"impossible\";\n const parsed = parseStreamMarkerName(t);\n if (parsed === \"building\") return \"possible\";\n if (parsed === \"invalid\") return \"impossible\";\n const nameOk = parsed.complete\n ? allowedToolNames.has(parsed.name)\n : someToolNameStartsWith(allowedToolNames, parsed.name);\n if (!nameOk) return \"impossible\";\n return held.length > cap ? \"impossible\" : \"possible\";\n}\n\n/** Read the (partial) tool name after a confirmed `<function=` marker (skipping the regex `\\s*`).\n * `\"building\"` = only the marker(+ws) so far; `\"invalid\"` = a `>`/other char with no name. */\nfunction parseStreamMarkerName(\n t: string,\n): { name: string; complete: boolean } | \"building\" | \"invalid\" {\n let cursor = STREAM_MARKER.length;\n while (cursor < t.length && isStreamWs(t[cursor])) cursor += 1;\n const nameStart = cursor;\n while (cursor < t.length && t[cursor] !== \">\" && !isStreamWs(t[cursor])) cursor += 1;\n const name = t.slice(nameStart, cursor);\n if (name.length === 0) return cursor >= t.length ? \"building\" : \"invalid\";\n return { name, complete: cursor < t.length && t[cursor] === \">\" };\n}\n\n/** True when any allowed tool name starts with `prefix` — the streaming partial-name probe (R7 D2). */\nfunction someToolNameStartsWith(allowedToolNames: ReadonlySet<string>, prefix: string): boolean {\n for (const name of allowedToolNames) {\n if (name.startsWith(prefix)) return true;\n }\n return false;\n}\n\n/**\n * R7 mixed-delta split: given a suspicion buffer that is NOT itself a possible tool call as a whole,\n * find the first `<` index whose suffix COULD still become a `<function=NAME>` tool call for a request\n * tool — so the caller flushes the definitely-prose prefix and holds only the suspicious suffix (e.g.\n * a `hello <function=read` delta flushes `hello ` and holds `<function=read`). Returns `-1` when no\n * suffix is suspicious (flush the whole buffer). Bounded: scans only `<` positions. @internal\n */\nexport function firstPossibleMarkerStart(\n held: string,\n allowedToolNames: ReadonlySet<string>,\n): number {\n for (let i = held.indexOf(\"<\"); i !== -1; i = held.indexOf(\"<\", i + 1)) {\n if (streamToolCallBufferState(held.slice(i), allowedToolNames) === \"possible\") return i;\n }\n return -1;\n}\n\n/**\n * R7 stateful stream-suppression buffer. Owns the held-content buffer for one stream: `push` feeds a\n * content delta and returns the text to emit now (or `undefined` to HOLD while it could still be a\n * `<function=NAME>` tool call for a request tool); `drain` finalizes at stream end. Extracted from the\n * OpenAI accumulator so the adapter stays thin (G8). @internal\n */\nexport class StreamSuppressionBuffer {\n #held = \"\";\n constructor(private readonly allowedToolNames: ReadonlySet<string>) {}\n\n /** Feed a content delta; returns the text to emit as a `text_delta` now, or `undefined` to hold. */\n push(content: string): string | undefined {\n this.#held += content;\n if (streamToolCallBufferState(this.#held, this.allowedToolNames) === \"possible\")\n return undefined;\n // Whole buffer is not a tool call, but a marker for a request tool may start mid-buffer (prose +\n // marker in one delta) — flush the prose prefix, hold the suspicious suffix.\n const holdStart = firstPossibleMarkerStart(this.#held, this.allowedToolNames);\n if (holdStart > 0) {\n const flush = this.#held.slice(0, holdStart);\n this.#held = this.#held.slice(holdStart);\n return flush;\n }\n const flush = this.#held;\n this.#held = \"\";\n return flush;\n }\n\n /** Drain the held buffer at stream end. `hasNativeCalls` mirrors `finish()`'s size-guard: when\n * native `tool_calls` exist, `finish()` won't strip the leaked block, so stream the held text WHOLE\n * (keeping `accumulatedText == finish.text`); otherwise strip the recoverable blocks. Idempotent. */\n drain(hasNativeCalls: boolean): string | undefined {\n if (this.#held.length === 0) return undefined;\n const held = this.#held;\n this.#held = \"\";\n if (hasNativeCalls) return held;\n const residual = extractHermesToolCalls(held, () => \"held\", this.allowedToolNames).residualText;\n return residual.length > 0 ? residual : undefined;\n }\n}\n","/**\n * Mapeamento de `LlmMessage` para o formato de mensagem da OpenAI.\n *\n * Extraído de `openai.ts` no M75 porque o gate G8 (≤ 400 LoC) o pegou em 427 — dívida PRE-EXISTENTE,\n * que ficou invisível enquanto o `knip` falhava antes de o gate rodar.\n *\n * A costura não é arbitrária: estas cinco funções formam UMA responsabilidade — traduzir o nosso\n * formato de mensagem para o da wire da OpenAI — e nenhuma delas conhece transporte, streaming ou\n * política de request. O resto de `openai.ts` cuida disso.\n */\nimport { toStringToolResultContent } from \"./tool-result-content.js\";\nimport type { LlmMessage } from \"./types.js\";\n\nexport function toOpenAIMessages(message: LlmMessage): Array<Record<string, unknown>> {\n if (message.role === \"system\") return [systemMessage(message)];\n if (message.role === \"user\") return userOrToolMessages(message);\n return [assistantMessage(message)];\n}\n\nfunction systemMessage(message: LlmMessage): Record<string, unknown> {\n return { role: \"system\", content: joinTextParts(message) };\n}\n\nfunction joinTextParts(message: LlmMessage): string {\n return message.content\n .filter((part) => part.type === \"text\")\n .map((part) => (part as { text: string }).text)\n .join(\"\\n\");\n}\n\n/**\n * Translate a logical `user` turn. If the turn contains tool_result parts\n * they must be emitted as `role: \"tool\"` messages with matching\n * `tool_call_id` — OpenAI rejects tool_calls followed by a user message.\n * Plain text parts (and any other parts) collapse into a single user\n * message that follows the tool messages.\n */\n// Divida PRE-EXISTENTE, exposta quando o M75 consertou a config Biome que abortava antes\n// de varrer estes arquivos (raiz aninhada em refactor/). Nao e codigo novo e nao foi tocado\n// pelo M75; refatorar internals do SDK sem revisao trocaria um problema visivel por um diff\n// arriscado. Rastreado em usetheodev/theokit-sdk#151.\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: ver a razao logo acima\nfunction userOrToolMessages(message: LlmMessage): Array<Record<string, unknown>> {\n const out: Array<Record<string, unknown>> = [];\n for (const part of message.content) {\n if (part.type === \"tool_result\") {\n out.push({\n role: \"tool\",\n tool_call_id: part.toolUseId,\n // SE7 — this wire's tool role is string-only: text blocks flatten; an\n // image block fails fast (ConfigurationError).\n content: toStringToolResultContent(part.content, \"openai\"),\n });\n }\n }\n const userText = joinTextParts(message);\n // M35 — image parts turn the user message into OpenAI/OpenRouter's content-array form\n // (`[{type:\"text\"}, {type:\"image_url\", image_url:{url: data-URL}}]`); text-only stays a plain string.\n const imageParts = message.content.filter(\n (p): p is import(\"./types.js\").LlmImagePart => p.type === \"image\",\n );\n if (imageParts.length > 0) {\n const content: Array<Record<string, unknown>> = [];\n if (userText.length > 0) content.push({ type: \"text\", text: userText });\n for (const img of imageParts) {\n // OpenAI/OpenRouter `image_url` accepts BOTH a data URL (inline base64) and a real https URL.\n const url =\n img.source.type === \"base64\"\n ? `data:${img.source.media_type};base64,${img.source.data}`\n : img.source.url;\n content.push({ type: \"image_url\", image_url: { url } });\n }\n out.push({ role: \"user\", content });\n } else if (userText.length > 0) {\n out.push({ role: \"user\", content: userText });\n }\n return out;\n}\n\nfunction assistantMessage(message: LlmMessage): Record<string, unknown> {\n const text = joinTextParts(message);\n const toolCalls = message.content\n .filter((part) => part.type === \"tool_use\")\n .map((part) => {\n const tc = part as { id: string; name: string; input: Record<string, unknown> };\n return {\n id: tc.id,\n type: \"function\",\n function: { name: tc.name, arguments: JSON.stringify(tc.input) },\n };\n });\n const result: Record<string, unknown> = { role: \"assistant\", content: text };\n if (toolCalls.length > 0) result.tool_calls = toolCalls;\n return result;\n}\n","import { NetworkError } from \"../../errors.js\";\nimport { mapOllamaHttpError, mapOllamaTransportError } from \"../error-mappers/ollama.js\";\nimport { mapOpenAICompatibleError } from \"../error-mappers/openai-compatible.js\";\nimport {\n collapseSystemText,\n makeLlmFinish,\n mapOpenAIFinish,\n parseToolArguments,\n} from \"./finish.js\";\nimport { extractHermesToolCalls, StreamSuppressionBuffer } from \"./hermes-tool-extract.js\";\nimport { toOpenAIMessages } from \"./openai-messages.js\";\nimport { parseSseStream } from \"./sse.js\";\nimport type {\n LlmClient,\n LlmEvent,\n LlmFinish,\n LlmRequest,\n LlmStopReason,\n LlmToolCallPart,\n} from \"./types.js\";\n\n/**\n * Real OpenAI Chat Completions client. Streams `/v1/chat/completions` and\n * translates delta chunks into our provider-agnostic `LlmEvent`s.\n *\n * Uses native `fetch` only — no `openai` SDK dependency.\n *\n * @internal\n */\n\n/**\n * M45 — derive the chat-completions path from the baseUrl: a path already carrying a version segment\n * (`/v1`, `/v1beta`, …) gets `/chat/completions`; host-only (or unparseable) baseUrls keep the legacy\n * `/v1/chat/completions`. Unparseable NEVER throws (H1) — the transport surfaces a typed error at fetch time.\n */\nfunction deriveChatPath(baseUrl: string): string {\n try {\n return /\\/v\\d+[a-z]*(\\/|$)/.test(new URL(baseUrl).pathname)\n ? \"/chat/completions\"\n : \"/v1/chat/completions\";\n } catch {\n return \"/v1/chat/completions\";\n }\n}\n\nexport interface OpenAIClientOptions {\n apiKey: string;\n baseUrl?: string;\n organization?: string;\n fetch?: typeof fetch;\n /**\n * Provider name for error mapping dispatch (T1.1, ADR D185). When set\n * to `\"ollama\"`, transport and HTTP errors go through `mapOllamaTransportError`\n * / `mapOllamaHttpError` for actionable messages before falling back to\n * the generic OpenAI-compatible mapper. Default `\"openai\"`.\n */\n providerName?: string;\n /**\n * Opt-in leaked-dialect safe-parse (theokit#58 follow-up). When `true`, a finish that carries\n * ZERO native `tool_calls` has its assistant text scanned for the Hermes `<function=…></tool_call>`\n * dialect; any recovered calls are surfaced as real `tool_calls` so the loop executes them.\n * Default `false` — a code assistant can legitimately print a literal `<function=` in code text.\n */\n extractToolCallsFromContent?: boolean;\n /**\n * M41 — extra HTTP headers merged into the request (the profile's static `extraHeaders` + a provider\n * `transform.headers(ctx)`). Spread AFTER the base `authorization`/`content-type`, so a provider that owns\n * its auth CAN override them by design (document this on `ProviderTransform.headers`).\n */\n extraHeaders?: Record<string, string>;\n /** M45 — explicit chat-completions path (from `ProviderProfile.chatCompletionsPath`). */\n chatCompletionsPath?: string;\n}\n\ninterface OpenAIDeltaChunk {\n choices?: Array<{\n index: number;\n delta?: {\n content?: string;\n /** OpenRouter unified reasoning delta (issue #47) — streamed separately from `content`. */\n reasoning?: string;\n /**\n * Sibling reasoning field used by some OpenAI-compatible providers (DeepSeek's direct API,\n * many vLLM / LMStudio reasoning parsers). Treated identically to `reasoning` (issue #47,\n * F-domain-2). OpenRouter normalizes to `reasoning`; this is the fallback for non-OpenRouter\n * compat endpoints reached via `baseUrl` override.\n */\n reasoning_content?: string;\n tool_calls?: Array<{\n index: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason?: string | null;\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n /**\n * OpenAI + OpenRouter extended usage (D376). Anthropic prompt caching\n * surfaces as `prompt_tokens_details.cached_tokens` on OpenRouter passthrough;\n * native OpenAI exposes the same field on `chatcmpl-*` responses.\n */\n prompt_tokens_details?: { cached_tokens?: number };\n completion_tokens_details?: { reasoning_tokens?: number };\n /** Anthropic-on-OpenRouter passes cache_creation_tokens top-level (a peer#10266). */\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n };\n /**\n * In-stream provider error. OpenRouter (and some OpenAI-compatible proxies)\n * report auth / quota / rate-limit failures as an HTTP 200 SSE body carrying\n * `data: {\"error\":{\"message\":\"...\",\"code\":401}}` instead of a non-2xx status.\n * Without surfacing this, the round finishes empty and the failure is silent\n * (usetheodev/theocode#31).\n */\n error?: { message?: string; code?: number | string; type?: string };\n}\n\nexport class OpenAIClient implements LlmClient {\n readonly name = \"openai\";\n private readonly baseUrl: string;\n private readonly chatPath: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly options: OpenAIClientOptions) {\n // M45 review M3 — strip trailing slashes so `…/v1/` (the python-openai-popularized form) joins cleanly.\n this.baseUrl = (options.baseUrl ?? \"https://api.openai.com\").replace(/\\/+$/, \"\");\n // M45 — URL-join rule (kills the /v1/v1 doubling): explicit override > version-segment detection >\n // legacy `/v1/chat/completions`. A baseUrl already carrying a version path segment (…/openai/v1,\n // …/v1beta/openai) gets only `/chat/completions`; host-only baseUrls are byte-identical to before.\n // M45 review H1 — the parse NEVER throws from the constructor: a malformed baseUrl (scheme-less host,\n // empty env var) degrades to the LEGACY path (byte-identical to pre-M45 string concat) and fails, typed,\n // at the first fetch — never poisoning the whole provider chain at construction time.\n this.chatPath = options.chatCompletionsPath ?? deriveChatPath(this.baseUrl);\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n /**\n * Whether this client recovers leaked Hermes tool-call dialect from assistant\n * text (theokit#58 follow-up). Observability for the route→client wiring of\n * `extractToolCallsFromContent`. @internal\n */\n get recoversLeakedToolCalls(): boolean {\n return this.options.extractToolCallsFromContent ?? false;\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: HTTP+SSE handshake + accumulator is intentionally one block\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${this.options.apiKey}`,\n };\n if (this.options.organization !== undefined) {\n headers[\"openai-organization\"] = this.options.organization;\n }\n // M41 — merge extra/dynamic headers (spread last: a provider that owns its auth may override base headers).\n if (this.options.extraHeaders !== undefined) Object.assign(headers, this.options.extraHeaders);\n const providerId = this.options.providerName ?? this.name;\n let response: Response;\n try {\n response = await this.fetchImpl(`${this.baseUrl}${this.chatPath}`, {\n method: \"POST\",\n signal,\n headers,\n body: JSON.stringify(buildOpenAIBody(request, providerId)),\n });\n } catch (fetchErr) {\n // T1.1: Ollama-specific transport error mapping (ECONNREFUSED / ENOTFOUND).\n const mapped = mapOllamaTransportError({\n providerId,\n cause: fetchErr,\n endpoint: \"/v1/chat/completions\",\n });\n if (mapped !== undefined) throw mapped;\n throw fetchErr;\n }\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let body: unknown = text;\n try {\n body = JSON.parse(text);\n } catch {\n // not JSON — keep as string for mapper raw field\n }\n // T1.1: try Ollama-specific HTTP mapper first; falls through to generic.\n const ollamaMapped = mapOllamaHttpError({\n providerId,\n status: response.status,\n body,\n headers: response.headers,\n endpoint: \"/v1/chat/completions\",\n });\n if (ollamaMapped !== undefined) throw ollamaMapped;\n // Use the openai-compatible mapper. For OpenAI proper the providerId\n // is \"openai\"; OpenRouter is handled in its own client subclass (see\n // OpenRouterClient if/when added). Providers tagged differently via\n // wrapper clients can pass their own providerId by overriding.\n throw mapOpenAICompatibleError({\n providerId,\n status: response.status,\n body,\n headers: response.headers,\n endpoint: \"/v1/chat/completions\",\n });\n }\n\n const accumulator = new OpenAIStreamAccumulator(\n this.options.extractToolCallsFromContent ?? false,\n providerId,\n // R5: request-scoped allowlist — leaked recovery only promotes a block whose name is a tool the\n // model was actually given. Empty set (no tools) recovers nothing.\n new Set(request.tools?.map((tool) => tool.name) ?? []),\n );\n let sawDone = false;\n for await (const record of parseSseStream(response.body, signal)) {\n if (record.data === \"[DONE]\") {\n sawDone = true;\n break;\n }\n let chunk: OpenAIDeltaChunk;\n try {\n chunk = JSON.parse(record.data) as OpenAIDeltaChunk;\n } catch {\n continue;\n }\n // Fail-loud on an in-stream provider error (OpenRouter HTTP-200 error body).\n // The accumulator only reads `choices`, so an error-only chunk would finish\n // the round empty and swallow the failure (theocode#31). Map it to the same\n // typed error a non-2xx HTTP status would have produced.\n if (chunk.error !== undefined && chunk.error !== null) {\n const status = typeof chunk.error.code === \"number\" ? chunk.error.code : 502;\n throw mapOpenAICompatibleError({\n providerId,\n status,\n body: chunk,\n headers: response.headers,\n endpoint: \"/v1/chat/completions\",\n });\n }\n const events = accumulator.consume(chunk);\n for (const event of events) yield event;\n }\n // M2 #61 — a stream ending with NEITHER `[DONE]` NOR a `finish_reason` was\n // truncated (dropped connection / proxy hiccup); throw a typed error rather\n // than commit the partial turn as a clean `end_turn` (codex prior art).\n if (!sawDone && !accumulator.finishReasonSeen) {\n throw new NetworkError(\"SSE stream truncated (no finish_reason / [DONE])\", {\n code: \"stream_truncated\",\n });\n }\n // R7: drain any held buffer so leaked-dialect text is never silently dropped.\n const drainEvent = accumulator.finalizeHeldText();\n if (drainEvent !== undefined) yield drainEvent;\n return accumulator.finish();\n }\n}\n\nclass OpenAIStreamAccumulator {\n private text = \"\";\n private stopReason: LlmStopReason = \"end_turn\";\n private inputTokens?: number;\n private outputTokens?: number;\n private cacheReadTokens?: number;\n private cacheWriteTokens?: number;\n private reasoningTokens?: number;\n private readonly toolCalls = new Map<number, { id: string; name: string; args: string }>();\n /** R7: present only when recovery is enabled AND the request declares tools — holds suspected\n * leaked-dialect content back from the `text_delta` stream. `undefined` ⇒ stream immediately. */\n private readonly suppress?: StreamSuppressionBuffer;\n\n /**\n * @param extractFromContent opt-in leaked-dialect safe-parse (theokit#58). Default false.\n * @param providerName provider id, used only to label the recovery log line.\n * @param allowedToolNames R5 request-scoped allowlist — built from `request.tools` at `stream()`;\n * leaked recovery in `finish()` only promotes a block whose name is in this set. `undefined`\n * (direct construction) recovers all (back-compat); an empty set recovers nothing.\n */\n constructor(\n private readonly extractFromContent = false,\n private readonly providerName = \"openai\",\n private readonly allowedToolNames?: ReadonlySet<string>,\n ) {\n this.suppress =\n extractFromContent && allowedToolNames !== undefined && allowedToolNames.size > 0\n ? new StreamSuppressionBuffer(allowedToolNames)\n : undefined;\n }\n\n consume(chunk: OpenAIDeltaChunk): LlmEvent[] {\n const events: LlmEvent[] = [];\n this.applyUsage(chunk.usage);\n for (const choice of chunk.choices ?? []) {\n events.push(...this.applyChoice(choice));\n }\n return events;\n }\n\n private applyChoice(choice: NonNullable<OpenAIDeltaChunk[\"choices\"]>[number]): LlmEvent[] {\n const events: LlmEvent[] = [];\n // issue #47: reasoning delta precedes the visible text in arrival order. OpenRouter streams it\n // as `reasoning`; some compat providers use `reasoning_content` (F-domain-2) — accept either.\n const reasoningEvent = this.applyReasoningDelta(\n choice.delta?.reasoning ?? choice.delta?.reasoning_content,\n );\n if (reasoningEvent !== undefined) events.push(reasoningEvent);\n const textEvent = this.applyContentDelta(choice.delta?.content);\n if (textEvent !== undefined) events.push(textEvent);\n this.mergeToolCallDeltas(choice.delta?.tool_calls);\n this.applyFinishReason(choice.finish_reason);\n // R7: at the terminal chunk, flush the held buffer's residual (held minus recoverable blocks)\n // AFTER this chunk's content was appended above — so `accumulatedText == finish.text`.\n if (choice.finish_reason !== undefined && choice.finish_reason !== null) {\n const flushEvent = this.finalizeHeldText();\n if (flushEvent !== undefined) events.push(flushEvent);\n }\n return events;\n }\n\n private applyReasoningDelta(reasoning: string | undefined): LlmEvent | undefined {\n // issue #47: reasoning is NOT accumulated into `this.text` (the visible answer) — it is a\n // separate channel surfaced as `reasoning_delta` (→ thinking events at the loop layer).\n if (typeof reasoning !== \"string\" || reasoning.length === 0) return undefined;\n return { type: \"reasoning_delta\", text: reasoning };\n }\n\n private applyUsage(usage: OpenAIDeltaChunk[\"usage\"]): void {\n if (usage?.prompt_tokens !== undefined) this.inputTokens = usage.prompt_tokens;\n if (usage?.completion_tokens !== undefined) this.outputTokens = usage.completion_tokens;\n // D376: cache + reasoning buckets via OpenRouter passthrough + OpenAI native.\n const cachedDetail = usage?.prompt_tokens_details?.cached_tokens;\n if (cachedDetail !== undefined) this.cacheReadTokens = cachedDetail;\n const reasoningDetail = usage?.completion_tokens_details?.reasoning_tokens;\n if (reasoningDetail !== undefined) this.reasoningTokens = reasoningDetail;\n // a peer#10266 top-level fallback for Anthropic-on-OpenRouter.\n if (usage?.cache_read_input_tokens !== undefined) {\n this.cacheReadTokens = usage.cache_read_input_tokens;\n }\n if (usage?.cache_creation_input_tokens !== undefined) {\n this.cacheWriteTokens = usage.cache_creation_input_tokens;\n }\n }\n\n private applyContentDelta(content: string | undefined): LlmEvent | undefined {\n if (typeof content !== \"string\" || content.length === 0) return undefined;\n this.text += content;\n // R7: when suppression is active, HOLD content that could still be a leaked tool call (the buffer\n // returns the text to emit now, or `undefined` to hold). Otherwise stream immediately.\n if (this.suppress === undefined) return { type: \"text_delta\", text: content };\n const emit = this.suppress.push(content);\n return emit !== undefined ? { type: \"text_delta\", text: emit } : undefined;\n }\n\n /** R7 held-buffer finalizer, called at the `finish_reason` chunk (in `applyChoice`) AND after the\n * SSE loop in `stream()` — so a stream that omits a `finish_reason` terminal never silently drops\n * held text. `toolCalls.size > 0` (native calls present) makes `finish()` skip recovery, so the\n * buffer streams the held text whole. Idempotent once drained. */\n finalizeHeldText(): LlmEvent | undefined {\n const emit = this.suppress?.drain(this.toolCalls.size > 0);\n return emit !== undefined ? { type: \"text_delta\", text: emit } : undefined;\n }\n\n private mergeToolCallDeltas(\n deltas: NonNullable<NonNullable<OpenAIDeltaChunk[\"choices\"]>[number][\"delta\"]>[\"tool_calls\"],\n ): void {\n for (const call of deltas ?? []) {\n const existing = this.toolCalls.get(call.index) ?? { id: \"\", name: \"\", args: \"\" };\n if (call.id !== undefined) existing.id = call.id;\n if (call.function?.name !== undefined) existing.name = call.function.name;\n if (call.function?.arguments !== undefined) existing.args += call.function.arguments;\n this.toolCalls.set(call.index, existing);\n }\n }\n\n /** M2 #61 — true once any chunk carried a non-null `finish_reason` (else a\n * stream ending without `[DONE]` is a truncation, not a clean end). */\n private sawFinishReason = false;\n get finishReasonSeen(): boolean {\n return this.sawFinishReason;\n }\n\n private applyFinishReason(reason: string | null | undefined): void {\n if (reason === undefined || reason === null) return;\n this.sawFinishReason = true;\n this.stopReason = mapOpenAIFinish(reason);\n }\n\n finish(): LlmFinish {\n const toolCalls: LlmToolCallPart[] = [];\n for (const call of this.toolCalls.values()) {\n const input = parseToolArguments(call.args);\n toolCalls.push({ type: \"tool_use\", id: call.id, name: call.name, input });\n }\n let text = this.text;\n let stopReason = this.stopReason;\n // theokit#58 follow-up: leaked-dialect safe-parse. Opt-in, and ONLY when the provider sent no\n // native tool_calls (the size-guard prevents double-counting a real call). Recovered calls flip\n // the stopReason to \"tool_use\" so the agent loop dispatches them; the consumed dialect is stripped\n // from the visible text.\n if (this.extractFromContent && toolCalls.length === 0) {\n const recovered = extractHermesToolCalls(\n this.text,\n () => `hermes-${globalThis.crypto.randomUUID()}`,\n this.allowedToolNames,\n );\n if (recovered.toolCalls.length > 0) {\n toolCalls.push(...recovered.toolCalls);\n text = recovered.residualText;\n stopReason = \"tool_use\";\n // Observability (wiring triad pillar c): recovery is a model-misbehavior workaround, so make\n // it visible — a route that leaks often should be diagnosable without a debugger.\n process.stderr.write(\n `[theokit-sdk] recovered ${recovered.toolCalls.length} leaked tool call(s) from assistant content ` +\n `(provider=\"${this.providerName}\", names=${recovered.toolCalls.map((c) => c.name).join(\",\")})\\n`,\n );\n }\n // R5 observability: a leaked block DROPPED by the request-scoped allowlist is the guard firing —\n // surface it too, so a model emitting `<function=NAME>` for an undeclared tool is diagnosable.\n if (recovered.droppedNames.length > 0) {\n process.stderr.write(\n `[theokit-sdk] dropped ${recovered.droppedNames.length} leaked block(s) whose name is not a ` +\n `tool in the request (provider=\"${this.providerName}\", names=${recovered.droppedNames.join(\",\")})\\n`,\n );\n }\n }\n return makeLlmFinish({\n stopReason,\n text,\n toolCalls,\n inputTokens: this.inputTokens,\n outputTokens: this.outputTokens,\n cacheReadTokens: this.cacheReadTokens,\n cacheWriteTokens: this.cacheWriteTokens,\n reasoningTokens: this.reasoningTokens,\n });\n }\n}\n\n/**\n * issue #47 / F-domain-1: encode the reasoning request in the shape the target provider accepts.\n * Native OpenAI Chat Completions rejects unknown body params and expects the top-level\n * `reasoning_effort` string; OpenRouter (and OpenAI-compatible passthroughs) use the unified\n * `reasoning: { effort }` object. `stream()` always passes the resolved provider id, so a native\n * OpenAI request never 400s on the OpenRouter shape. When `providerName` is unspecified (test seam),\n * the unified object is used — the broader-compatibility default.\n */\nfunction applyReasoningRequest(\n body: Record<string, unknown>,\n effort: string,\n providerName: string | undefined,\n): void {\n if (providerName === \"openai\") {\n body.reasoning_effort = effort;\n return;\n }\n body.reasoning = { effort };\n}\n\n/**\n * Encode the `tools` array + per-request `tool_choice` gate (step-cap force-close). `tool_choice`\n * is meaningful only alongside `tools`, so both are emitted together (or neither). `\"none\"` advertises\n * the tools but forbids calling them — forcing a text answer from an agent whose tools are registered.\n */\nfunction applyToolsRequest(body: Record<string, unknown>, request: LlmRequest): void {\n if (request.tools === undefined || request.tools.length === 0) return;\n body.tools = request.tools.map((tool) => ({\n type: \"function\",\n function: { name: tool.name, description: tool.description, parameters: tool.inputSchema },\n }));\n if (request.toolChoice !== undefined) body.tool_choice = request.toolChoice;\n}\n\nfunction buildOpenAIBody(request: LlmRequest, providerName?: string): Record<string, unknown> {\n const messages: Array<Record<string, unknown>> = [];\n const systemText = openAISystemText(request.system);\n if (systemText.length > 0) {\n messages.push({ role: \"system\", content: systemText });\n }\n for (const message of request.messages) {\n for (const out of toOpenAIMessages(message)) messages.push(out);\n }\n const body: Record<string, unknown> = {\n model: request.model,\n stream: true,\n // D376: opt-in to OpenAI's final-chunk usage record (no-op for providers\n // that don't honor it; OpenRouter / OpenAI both respect it).\n stream_options: { include_usage: true },\n messages,\n };\n if (request.maxTokens !== undefined) body.max_tokens = request.maxTokens;\n if (request.temperature !== undefined) body.temperature = request.temperature;\n // issue #47: reasoning request — only when an effort was requested. Provider-specific wire shape.\n if (request.reasoning?.effort !== undefined)\n applyReasoningRequest(body, request.reasoning.effort, providerName);\n applyToolsRequest(body, request);\n const responseFormat = encodeOpenAIResponseFormat(request.responseFormat);\n if (responseFormat !== undefined) body.response_format = responseFormat;\n return body;\n}\n\n/**\n * T3.5 follow-up — collapse `LlmRequest.system` to the OpenAI wire shape\n * (single string).\n *\n * @internal\n */\nconst openAISystemText = collapseSystemText;\n\n/**\n * T3.6 — encode `LlmResponseFormat` into the OpenAI wire shape. The\n * structured-outputs path defaults `strict` to `true` (provider guarantees\n * the response matches the schema).\n *\n * @internal\n */\nfunction encodeOpenAIResponseFormat(\n rf: LlmRequest[\"responseFormat\"],\n): Record<string, unknown> | undefined {\n if (rf === undefined) return undefined;\n if (rf.type === \"json_object\") return { type: \"json_object\" };\n return {\n type: \"json_schema\",\n json_schema: {\n name: rf.jsonSchema.name,\n schema: rf.jsonSchema.schema,\n strict: rf.jsonSchema.strict ?? true,\n },\n };\n}\n\n/**\n * T3.6 — public test seam for `buildOpenAIBody`. The implementation is\n * file-local; the seam lets unit tests verify the wire shape without\n * exercising the streaming path.\n *\n * @internal\n */\nexport const __testing__buildOpenAIBody = buildOpenAIBody;\n/** issue #47 test seam — exercise reasoning-delta parsing without a live stream. */\nexport const __testing__OpenAIStreamAccumulator = OpenAIStreamAccumulator;\n","/**\n * Consecutive-failure circuit breaker — a cross-cutting resilience primitive.\n *\n * Used by Active Memory recall (timeout-driven) and the LLM credential pool\n * (429/terminal-failure-driven). Domain-neutral: it counts consecutive\n * failure events per key and trips after N, staying open for `cooldownMs`.\n *\n * Mirrors peer-project's `circuitBreakerMaxTimeouts` + `circuitBreakerCooldownMs`\n * config: after N consecutive timeouts the breaker trips and `shouldSkip`\n * returns `true` until `cooldownMs` has elapsed. A successful recall resets\n * the counter immediately.\n *\n * Per-key isolation so two agents in the same process don't share a counter.\n *\n * @internal\n */\n\nexport interface CircuitBreakerOptions {\n maxTimeouts?: number;\n cooldownMs?: number;\n /** Injectable clock for tests. */\n now?: () => number;\n}\n\ninterface KeyState {\n consecutiveTimeouts: number;\n cooldownUntilMs: number;\n}\n\nconst DEFAULT_MAX_TIMEOUTS = 3;\nconst DEFAULT_COOLDOWN_MS = 60_000;\n\nexport class CircuitBreaker {\n private readonly states = new Map<string, KeyState>();\n\n constructor(private readonly opts: CircuitBreakerOptions = {}) {}\n\n /** @returns true when the breaker is open and the call should be skipped. */\n shouldSkip(key: string): boolean {\n const state = this.states.get(key);\n if (state === undefined) return false;\n if (state.cooldownUntilMs === 0) return false;\n if (this.now() < state.cooldownUntilMs) return true;\n // Cooldown elapsed — close the breaker.\n state.cooldownUntilMs = 0;\n state.consecutiveTimeouts = 0;\n return false;\n }\n\n recordSuccess(key: string): void {\n const state = this.states.get(key);\n if (state === undefined) return;\n state.consecutiveTimeouts = 0;\n state.cooldownUntilMs = 0;\n }\n\n recordTimeout(key: string): void {\n const state = this.states.get(key) ?? { consecutiveTimeouts: 0, cooldownUntilMs: 0 };\n state.consecutiveTimeouts += 1;\n if (state.consecutiveTimeouts >= (this.opts.maxTimeouts ?? DEFAULT_MAX_TIMEOUTS)) {\n state.cooldownUntilMs = this.now() + (this.opts.cooldownMs ?? DEFAULT_COOLDOWN_MS);\n }\n this.states.set(key, state);\n }\n\n /** @internal — tests inspect counter state. */\n inspect(key: string): Readonly<KeyState> {\n return this.states.get(key) ?? { consecutiveTimeouts: 0, cooldownUntilMs: 0 };\n }\n\n private now(): number {\n return this.opts.now?.() ?? Date.now();\n }\n}\n","/**\n * Shared streaming helpers for `LlmClient` wrappers\n * (`FallbackLlmClient`, `PoolAwareLlmClient`).\n *\n * `tryFirstEvent` probes the first chunk of a stream to decide\n * whether the handshake succeeded. If it raises an\n * `AuthenticationError`/`RateLimitError`/`NetworkError`, the wrapper\n * captures the typed error for routing (rotate vs fallback) WITHOUT\n * starting the actual yield. Once the first event lands, the stream\n * is committed and partial-output cannot be reverted.\n *\n * `relay` yields the prefetched first chunk and then forwards the\n * remaining generator output verbatim.\n *\n * @internal\n */\n\nimport { AuthenticationError, NetworkError, RateLimitError } from \"../../errors.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\n\n/**\n * Outcome of probing a client's first stream event.\n *\n * @internal\n */\nexport type StreamAttempt =\n | {\n kind: \"ok\";\n generator: AsyncGenerator<LlmEvent, LlmFinish, void>;\n firstResult: IteratorResult<LlmEvent, LlmFinish>;\n }\n | { kind: \"handshake_error\"; error: RateLimitError | AuthenticationError | NetworkError };\n\n/**\n * Try to obtain the FIRST event from `client.stream(...)`. Typed\n * provider failures surface as `kind: \"handshake_error\"`; everything\n * else propagates upward unchanged.\n *\n * Optionally writes a `[theokit-sdk] provider X failed (CODE): falling back`\n * line to stderr when `logFallback` is true — used by `FallbackLlmClient`.\n *\n * @internal\n */\nexport async function tryFirstEvent(\n client: LlmClient,\n request: LlmRequest,\n signal: AbortSignal,\n logFallback = false,\n): Promise<StreamAttempt> {\n const generator = client.stream(request, signal);\n try {\n const firstResult = await generator.next();\n return { kind: \"ok\", generator, firstResult };\n } catch (cause) {\n if (\n cause instanceof NetworkError ||\n cause instanceof RateLimitError ||\n cause instanceof AuthenticationError\n ) {\n if (logFallback) {\n const errCode = cause.metadata?.code ?? cause.code ?? \"unknown\";\n process.stderr.write(\n `[theokit-sdk] provider ${client.name} failed (${errCode}): falling back\\n`,\n );\n }\n return { kind: \"handshake_error\", error: cause };\n }\n throw cause;\n }\n}\n\n/**\n * Yield the prefetched first event, then forward the rest of the\n * generator. Identical to a normal `yield*` but with the lookahead\n * already in hand from `tryFirstEvent`.\n *\n * @internal\n */\nexport async function* relayStream(\n generator: AsyncGenerator<LlmEvent, LlmFinish, void>,\n firstResult: IteratorResult<LlmEvent, LlmFinish>,\n): AsyncGenerator<LlmEvent, LlmFinish, void> {\n if (firstResult.done === true) return firstResult.value;\n yield firstResult.value;\n while (true) {\n const next = await generator.next();\n if (next.done === true) return next.value;\n yield next.value;\n }\n}\n","/**\n * `LlmClient` wrapper that pools multiple API keys for the same\n * provider and rotates on HTTP 429/402/401 (ADRs D123-D133).\n *\n * Composition wrapper (D127) — wraps a builder that produces a real\n * `LlmClient` for a given API key. The wrapper picks a key via the\n * pool, instantiates the real client, attempts the stream, and on a\n * pre-stream error decides retry-vs-rotate per the decision matrix.\n *\n * Once `yield*` starts (first event received), rotation is impossible —\n * partial output would corrupt the stream. Same contract as\n * `FallbackLlmClient` (D2).\n *\n * @internal\n */\n\nimport {\n AuthenticationError,\n CredentialPoolExhaustedError,\n NetworkError,\n RateLimitError,\n} from \"../../errors.js\";\nimport { CircuitBreaker } from \"../resilience/circuit-breaker.js\";\nimport type { CredentialPool } from \"./credential-pool.js\";\nimport { computeBackoffMs, sleepWithAbort } from \"./retry.js\";\nimport { relayStream, tryFirstEvent } from \"./stream-relay.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\n\n/**\n * M2 #60 — optional resilience knobs. `breaker` guards the provider with a\n * consecutive-failure circuit breaker; `backoffBaseMs`/`rng` tune the\n * full-jitter sleep inserted before a same-key 429 retry (tests inject a\n * deterministic `rng` + a small base). All optional — omit for defaults.\n *\n * @internal\n */\nexport interface PoolResilienceOptions {\n breaker?: CircuitBreaker;\n backoffBaseMs?: number;\n rng?: () => number;\n /**\n * SE2 — invoked right before a 429 same-key retry backs off, so the runtime can\n * surface a `rate_limit` RunEvent. `attempt` is 1-based; `retryAfterMs` is the\n * backoff about to be waited. Best-effort observer — must not throw.\n */\n onRateLimit?: (info: { attempt: number; retryAfterMs?: number }) => void;\n}\n\n/** Decision returned by `classifyAndDecide`. */\ntype Decision = \"retry\" | \"rotate\" | \"propagate\";\n\n/**\n * Pool-aware `LlmClient`. Constructs real clients on demand via\n * `buildClient(apiKey)` — kept lazy so the pool can pick AT request\n * time (not at construction) and rotation produces a fresh client\n * each iteration.\n *\n * @internal\n */\nexport class PoolAwareLlmClient implements LlmClient {\n readonly name: string;\n\n constructor(\n private readonly pool: CredentialPool,\n private readonly buildClient: (apiKey: string) => LlmClient,\n /**\n * T3.9 — Optional override for the upper bound on how long\n * `stream()` waits for a cooldown to expire before throwing\n * `CredentialPoolExhaustedError`. Defaults to 30 s. The actual\n * wait inside `pool.waitForAvailable` is jittered (AWS Brooker\n * 2015 full-jitter), so concurrent callers stagger their\n * re-probe of the pool — preventing reconnect storms.\n *\n * Set to `0` to opt out (legacy pre-T3.9 behavior — throw on\n * first `select()`-returns-null).\n *\n * @internal\n */\n private readonly waitForAvailableMs: number = 30_000,\n resilience: PoolResilienceOptions = {},\n ) {\n this.name = `pool-aware:${pool.provider}`;\n this.breaker = resilience.breaker ?? new CircuitBreaker();\n this.backoffBaseMs = resilience.backoffBaseMs;\n this.rng = resilience.rng;\n this.onRateLimit = resilience.onRateLimit;\n }\n\n private readonly onRateLimit?: (info: { attempt: number; retryAfterMs?: number }) => void;\n\n /** M2 #60 — provider-level circuit breaker (consecutive-failure). */\n private readonly breaker: CircuitBreaker;\n private readonly backoffBaseMs: number | undefined;\n private readonly rng: (() => number) | undefined;\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: stream() must serialize pool-select → build client → first-event probe → classify → retry/rotate/propagate. Extracting helpers fragments the linear narrative; the comments above each branch keep it readable.\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n // M2 #60 — fail fast while the provider circuit is open, instead of\n // re-running the whole select→retry→rotate dance against a down provider.\n if (this.breaker.shouldSkip(this.pool.provider)) {\n throw new NetworkError(`${this.pool.provider} circuit open — failing fast`, {\n code: \"circuit_open\",\n });\n }\n let hasRetried429 = false;\n while (true) {\n if (signal.aborted) throw abortError(signal);\n\n let entry = await this.pool.select();\n if (entry === null) {\n // T3.9 — Reconnect storm prevention. Instead of throwing\n // immediately, wait (with jitter) for the earliest cooldown to\n // expire. Concurrent callers each pick a random delay within\n // the window to the earliest reset, so they wake at staggered\n // times and do not all re-hammer the upstream at the same\n // instant. `waitForAvailableMs === 0` opts out for legacy\n // callers and for unit tests that prefer the pre-T3.9\n // throw-fast contract.\n if (this.waitForAvailableMs > 0) {\n const available = await this.pool.waitForAvailable(signal, {\n maxWaitMs: this.waitForAvailableMs,\n });\n if (available) {\n entry = await this.pool.select();\n }\n }\n if (entry === null) {\n // M2 #60 — a whole-attempt terminal failure trips the breaker.\n this.breaker.recordTimeout(this.pool.provider);\n throw new CredentialPoolExhaustedError(\n `All ${this.pool.provider} credentials exhausted; next retry available at ${\n this.nextRetryHint() ?? \"unknown\"\n }`,\n { provider: this.pool.provider, nextRetryAt: this.nextRetryHint() },\n );\n }\n }\n\n // EC-D: a failure inside buildClient (e.g., invalid baseUrl) is\n // a transport-config bug, NOT a credential failure. Propagate\n // without marking the entry exhausted.\n const realClient: LlmClient = this.buildClient(entry.accessToken);\n\n const attempt = await tryFirstEvent(realClient, request, signal);\n if (attempt.kind === \"ok\") {\n // Stream started — rotation is no longer possible. A healthy start\n // closes the circuit breaker (M2 #60).\n this.breaker.recordSuccess(this.pool.provider);\n return yield* relayStream(attempt.generator, attempt.firstResult);\n }\n\n const decision = classifyAndDecide(attempt.error, hasRetried429);\n if (decision === \"retry\") {\n // D126: first 429 retries the same key. Don't mark exhausted yet.\n // M2 #60 — back off with full jitter before re-hitting the SAME key,\n // so a shared-quota thundering herd no longer burns the retry in <1ms\n // (AWS Brooker 2015). We deliberately do NOT sleep the provider's\n // `Retry-After` here: for a multi-key pool the right move on a 429 is to\n // fail this brief retry and ROTATE to a fresh key immediately (waiting\n // would defeat the pool). `Retry-After` IS honored at the pool-selection\n // level — the rotate path below sets the key's `resetAtMs` cooldown, so\n // subsequent selection skips a rate-limited key until its window passes\n // (a single-key pool then fails fast with CredentialPoolExhaustedError).\n const backoffMs = computeBackoffMs({\n attempt: 0,\n ...(this.backoffBaseMs !== undefined ? { baseMs: this.backoffBaseMs } : {}),\n ...(this.rng !== undefined ? { rng: this.rng } : {}),\n });\n // SE2 — surface a `rate_limit` RunEvent for the retry that is about to back off.\n this.onRateLimit?.({ attempt: 1, retryAfterMs: backoffMs });\n await sleepWithAbort(backoffMs, signal);\n hasRetried429 = true;\n continue;\n }\n if (decision === \"rotate\") {\n // EC-A: persistence failures during rotate must NOT abort the\n // stream. Pool state in-memory is the source of truth; disk\n // staleness self-corrects on the next successful save.\n try {\n await this.pool.markExhaustedAndRotate({\n entryId: entry.id,\n statusCode: attempt.error.metadata?.statusCode ?? inferStatusCode(attempt.error),\n ...(parseRetryAfterMs(attempt.error) !== undefined\n ? { resetAtMs: parseRetryAfterMs(attempt.error) }\n : {}),\n });\n } catch (persistErr) {\n process.stderr.write(\n `[theokit-sdk] credential-pool: persist failed during rotate; continuing in-memory: ${\n persistErr instanceof Error ? persistErr.message : String(persistErr)\n }\\n`,\n );\n }\n hasRetried429 = false;\n continue;\n }\n // decision === \"propagate\" — a whole-attempt terminal failure (M2 #60).\n this.breaker.recordTimeout(this.pool.provider);\n throw attempt.error;\n }\n }\n\n /**\n * Earliest epoch ms among entries' `lastErrorResetAt` — best estimate\n * for the caller's `CredentialPoolExhaustedError.nextRetryAt`.\n */\n private nextRetryHint(): number | undefined {\n const resets = this.pool\n .list()\n .map((e) => e.lastErrorResetAt)\n .filter((v): v is number => v !== undefined);\n return resets.length === 0 ? undefined : Math.min(...resets);\n }\n}\n\n/**\n * Decision matrix per ADR D125 + D126. Pure function — testable in isolation.\n *\n * @internal\n */\nexport function classifyAndDecide(\n error: RateLimitError | AuthenticationError | NetworkError,\n hasRetried429: boolean,\n): Decision {\n // 5xx / network errors: pool doesn't help — propagate so cross-provider\n // fallback (FallbackLlmClient) can try a different provider.\n if (error instanceof NetworkError) return \"propagate\";\n\n // 401/403: rotate. No OAuth refresh in v1 (out of scope).\n if (error instanceof AuthenticationError) return \"rotate\";\n\n // RateLimitError covers 429 AND 402 (billing/quota) — distinguish via statusCode.\n const status = error.metadata?.statusCode ?? 429;\n if (status === 402) return \"rotate\"; // immediate, no retry (billing won't recover in ms)\n\n // 429: retry once, rotate on second.\n return hasRetried429 ? \"rotate\" : \"retry\";\n}\n\n/**\n * Convert provider's `retry-after` hint (seconds) into epoch ms.\n * The error mapper (D67) normalizes the header into `metadata.retryAfter`\n * (numeric seconds form only). Older formats land in `metadata.raw`.\n *\n * @internal\n */\nexport function parseRetryAfterMs(\n error: RateLimitError | AuthenticationError | NetworkError,\n): number | undefined {\n const seconds = error.metadata?.retryAfter;\n if (typeof seconds === \"number\" && seconds > 0) {\n return Date.now() + seconds * 1000;\n }\n return undefined;\n}\n\nfunction inferStatusCode(error: RateLimitError | AuthenticationError | NetworkError): number {\n if (error instanceof AuthenticationError) return 401;\n if (error instanceof RateLimitError) return 429;\n return 0;\n}\n\nfunction abortError(signal: AbortSignal): Error {\n if (signal.reason instanceof Error) return signal.reason;\n return new Error(\"AbortError\");\n}\n","/**\n * OpenAI **Responses API** transport (`apiMode: \"responses_api\"`).\n *\n * The SDK's `ApiMode` declared `\"responses_api\"` but shipped NO transport — `selectTransport` threw\n * `transport_unavailable` (whose message even names `@theokit-transport-responses_api`). This IS that\n * transport: an `LlmClient` that POSTs the Responses-API body to `${baseUrl}/responses` and translates the\n * SSE event stream into `LlmEvent`/`LlmFinish`. It powers the ChatGPT Codex backend\n * (`https://chatgpt.com/backend-api/codex/responses`) and any responses-API provider.\n *\n * The request-body shape and the SSE event names/fields are ADAPTED FROM OpenCode (MIT © 2025 opencode —\n * https://github.com/sst/opencode: `packages/llm/src/protocols/openai-responses.ts`). OpenCode's engine is\n * Effect-based with an elaborate lifecycle/tool-stream state machine; this is a faithful port of the PROTOCOL\n * shape (event names, field access, terminal/usage handling) retargeted to theokit's much smaller\n * `LlmClient` contract (`name` + `stream → AsyncGenerator<LlmEvent, LlmFinish>`). MIT permits this with attribution.\n *\n * `extraHeaders` (unused by the chat-completions transport until now) + `baseUrl` are consumed here; a `fetch`\n * override lets a host inject a refresh-aware fetch (dynamic `ChatGPT-Account-Id` / `session-id`, mid-turn\n * token refresh) — mirroring `OpenAIClient`.\n */\nimport { mapOpenAICompatibleError } from \"../error-mappers/openai-compatible.js\";\nimport { collapseSystemText, makeLlmFinish, parseToolArguments } from \"./finish.js\";\nimport { parseSseStream } from \"./sse.js\";\nimport { toStringToolResultContent } from \"./tool-result-content.js\";\nimport type {\n LlmClient,\n LlmEvent,\n LlmFinish,\n LlmMessage,\n LlmRequest,\n LlmStopReason,\n LlmToolCallPart,\n} from \"./types.js\";\n\nexport interface ResponsesApiClientOptions {\n apiKey: string;\n /** e.g. `https://chatgpt.com/backend-api/codex`; the client POSTs `${baseUrl}/responses`. */\n baseUrl?: string;\n /** Static headers the profile declares (e.g. `ChatGPT-Account-Id`, `originator`). */\n extraHeaders?: Record<string, string>;\n /** Injected fetch (refresh-aware / dynamic headers). Defaults to global `fetch`. */\n fetch?: typeof fetch;\n providerName?: string;\n}\n\n/** Translate an `LlmMessage` into the Responses-API `input[]` items it contributes. */\n// Divida PRE-EXISTENTE, exposta quando o M75 consertou a config Biome que abortava antes\n// de varrer estes arquivos (raiz aninhada em refactor/). Nao e codigo novo e nao foi tocado\n// pelo M75; refatorar internals do SDK sem revisao trocaria um problema visivel por um diff\n// arriscado. Rastreado em usetheodev/theokit-sdk#151.\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: ver a razao logo acima\nfunction messageToInputItems(message: LlmMessage): unknown[] {\n const items: unknown[] = [];\n if (message.role === \"user\") {\n const content: unknown[] = [];\n for (const part of message.content) {\n if (part.type === \"text\") {\n content.push({ type: \"input_text\", text: part.text });\n } else if (part.type === \"image\") {\n const url =\n part.source.type === \"base64\"\n ? `data:${part.source.media_type};base64,${part.source.data}`\n : part.source.url;\n content.push({ type: \"input_image\", image_url: url });\n } else if (part.type === \"tool_result\") {\n items.push({\n type: \"function_call_output\",\n call_id: part.toolUseId,\n output: toStringToolResultContent(part.content, \"openai-responses\"),\n });\n }\n }\n if (content.length > 0) items.push({ role: \"user\", content });\n return items;\n }\n if (message.role === \"assistant\") {\n const content: unknown[] = [];\n for (const part of message.content) {\n if (part.type === \"text\") {\n content.push({ type: \"output_text\", text: part.text });\n } else if (part.type === \"tool_use\") {\n items.push({\n type: \"function_call\",\n call_id: part.id,\n name: part.name,\n arguments: JSON.stringify(part.input),\n });\n }\n }\n if (content.length > 0) items.push({ role: \"assistant\", content });\n return items;\n }\n // system role rarely appears here (system travels on `request.system`); fold to text.\n const text = message.content\n .filter((p) => p.type === \"text\")\n .map((p) => (p as { text: string }).text)\n .join(\"\\n\");\n if (text.length > 0) items.push({ role: \"system\", content: text });\n return items;\n}\n\n/** Build the Responses-API request body from an `LlmRequest`. */\nexport function buildResponsesBody(request: LlmRequest): Record<string, unknown> {\n const input: unknown[] = [];\n for (const message of request.messages) {\n for (const item of messageToInputItems(message)) input.push(item);\n }\n // The Responses API wants the BARE model id (`gpt-5.4`), never a `provider/model` id. The router\n // normally strips the provider prefix before the transport; strip here too as defense-in-depth so an\n // unstripped `openai-chatgpt/gpt-5.4` can never reach the backend as a 400 (decoupled from the router's\n // provider-inference heuristics).\n const slash = request.model.lastIndexOf(\"/\");\n const model = slash >= 0 ? request.model.slice(slash + 1) : request.model;\n const body: Record<string, unknown> = { model, input, stream: true, store: false };\n const instructions = collapseSystemText(request.system);\n if (instructions.length > 0) body.instructions = instructions;\n if (request.maxTokens !== undefined) body.max_output_tokens = request.maxTokens;\n if (request.temperature !== undefined) body.temperature = request.temperature;\n const tools = (request.tools ?? []).map((tool) => ({\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n strict: false,\n }));\n if (tools.length > 0) body.tools = tools;\n if (request.reasoning !== undefined) body.reasoning = { effort: request.reasoning.effort };\n return body;\n}\n\ninterface ResponsesEvent {\n type?: string;\n delta?: string;\n item_id?: string;\n item?: {\n type?: string;\n id?: string;\n call_id?: string;\n name?: string;\n arguments?: string;\n };\n response?: {\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n output_tokens_details?: { reasoning_tokens?: number };\n };\n error?: { message?: string };\n };\n message?: string;\n}\n\nexport class ResponsesApiClient implements LlmClient {\n readonly name: string;\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly options: ResponsesApiClientOptions) {\n this.name = options.providerName ?? \"openai-responses\";\n this.baseUrl = (options.baseUrl ?? \"https://api.openai.com/v1\").replace(/\\/+$/, \"\");\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: the SSE dispatch (text / reasoning / tool-call add+delta+done / terminal+usage / error) is one cohesive state machine, mirroring OpenAIStreamAccumulator.consume.\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n const providerId = this.options.providerName ?? \"openai\";\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n accept: \"text/event-stream\",\n authorization: `Bearer ${this.options.apiKey}`,\n ...(this.options.extraHeaders ?? {}),\n };\n const url = `${this.baseUrl}/responses`;\n\n const response = await this.fetchImpl(url, {\n method: \"POST\",\n signal,\n headers,\n body: JSON.stringify(buildResponsesBody(request)),\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let body: unknown = text;\n try {\n body = JSON.parse(text);\n } catch {\n /* not JSON */\n }\n throw mapOpenAICompatibleError({\n providerId,\n status: response.status,\n body,\n headers: response.headers,\n endpoint: \"/responses\",\n });\n }\n\n let text = \"\";\n const toolCalls: LlmToolCallPart[] = [];\n let stopReason: LlmStopReason = \"end_turn\";\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let reasoningTokens: number | undefined;\n // function-call accumulation keyed by the streamed output-item id.\n const pending: Record<string, { callId: string; name: string; args: string }> = {};\n\n if (response.body !== null) {\n for await (const record of parseSseStream(response.body, signal)) {\n if (record.data === \"[DONE]\") break;\n let event: ResponsesEvent;\n try {\n event = JSON.parse(record.data) as ResponsesEvent;\n } catch {\n continue;\n }\n const t = event.type;\n if (t === \"response.output_text.delta\") {\n const d = event.delta ?? \"\";\n if (d.length > 0) {\n text += d;\n yield { type: \"text_delta\", text: d };\n }\n } else if (\n t === \"response.reasoning_summary_text.delta\" ||\n t === \"response.reasoning_text.delta\"\n ) {\n const d = event.delta ?? \"\";\n if (d.length > 0) yield { type: \"reasoning_delta\", text: d };\n } else if (t === \"response.output_item.added\" && event.item?.type === \"function_call\") {\n const id = event.item.id ?? event.item.call_id ?? \"call-0\";\n pending[id] = {\n callId: event.item.call_id ?? id,\n name: event.item.name ?? \"\",\n args: event.item.arguments ?? \"\",\n };\n } else if (t === \"response.function_call_arguments.delta\") {\n const c = event.item_id !== undefined ? pending[event.item_id] : undefined;\n if (c !== undefined) c.args += event.delta ?? \"\";\n } else if (t === \"response.output_item.done\" && event.item?.type === \"function_call\") {\n const id = event.item.id ?? event.item.call_id ?? \"call-0\";\n const c = pending[id] ?? {\n callId: event.item.call_id ?? id,\n name: event.item.name ?? \"\",\n args: event.item.arguments ?? \"\",\n };\n const rawArgs = event.item.arguments ?? c.args;\n const call: LlmToolCallPart = {\n type: \"tool_use\",\n id: c.callId,\n name: c.name.length > 0 ? c.name : (event.item.name ?? \"\"),\n input: parseToolArguments(rawArgs),\n };\n toolCalls.push(call);\n delete pending[id];\n yield { type: \"tool_use\", id: call.id, name: call.name, input: call.input };\n } else if (t === \"response.completed\" || t === \"response.incomplete\") {\n const usage = event.response?.usage;\n if (usage !== undefined) {\n inputTokens = usage.input_tokens;\n outputTokens = usage.output_tokens;\n reasoningTokens = usage.output_tokens_details?.reasoning_tokens;\n }\n stopReason = t === \"response.incomplete\" ? \"max_tokens\" : \"end_turn\";\n } else if (t === \"response.failed\" || t === \"error\") {\n // Never echo a raw provider body — report the message only. Map to a typed provider error.\n const msg = event.response?.error?.message ?? event.message ?? \"responses stream failed\";\n yield { type: \"error\", message: msg };\n throw mapOpenAICompatibleError({\n providerId,\n status: 502,\n body: { error: { message: msg } },\n headers: response.headers,\n endpoint: \"/responses\",\n });\n }\n }\n }\n\n if (toolCalls.length > 0 && stopReason === \"end_turn\") stopReason = \"tool_use\";\n yield { type: \"stop\", reason: stopReason };\n return makeLlmFinish({\n stopReason,\n text,\n toolCalls,\n inputTokens,\n outputTokens,\n reasoningTokens,\n });\n }\n}\n","/**\n * GCP Vertex AI HTTP error mapper (ADRs D67, D300).\n *\n * Vertex returns `{ error: { code, status, message, details } }` (Google\n * AIP-193 standard error shape).\n *\n * @internal\n */\n\nimport {\n AuthenticationError,\n ConfigurationError,\n NetworkError,\n RateLimitError,\n type TheokitAgentError,\n UnknownAgentError,\n} from \"../../errors.js\";\nimport { buildErrorMetadata } from \"./shared.js\";\n\ninterface VertexErrorBody {\n error?: {\n code?: number;\n status?: string;\n message?: string;\n details?: unknown;\n };\n}\n\nexport interface MapVertexErrorArgs {\n status: number;\n body: unknown;\n headers: Headers | undefined;\n endpoint: string;\n}\n\ntype VertexCode =\n | \"rate_limit\"\n | \"auth_unauthenticated\"\n | \"auth_permission\"\n | \"invalid_request\"\n | \"timeout\"\n | \"server_error\"\n | \"unknown\";\n\nconst VERTEX_RULES: ReadonlyArray<{ test: (s: number, e: string) => boolean; code: VertexCode }> = [\n { test: (s, e) => s === 429 || e === \"RESOURCE_EXHAUSTED\", code: \"rate_limit\" },\n { test: (s, e) => s === 401 || e === \"UNAUTHENTICATED\", code: \"auth_unauthenticated\" },\n { test: (s, e) => s === 403 || e === \"PERMISSION_DENIED\", code: \"auth_permission\" },\n {\n test: (s, e) =>\n s === 400 || e === \"INVALID_ARGUMENT\" || e === \"FAILED_PRECONDITION\" || e === \"NOT_FOUND\",\n code: \"invalid_request\",\n },\n { test: (s, e) => s === 408 || e === \"DEADLINE_EXCEEDED\", code: \"timeout\" },\n { test: (s) => s >= 500, code: \"server_error\" },\n];\n\nfunction classifyVertexError(args: MapVertexErrorArgs, errStatus: string): VertexCode {\n for (const rule of VERTEX_RULES) {\n if (rule.test(args.status, errStatus)) return rule.code;\n }\n return \"unknown\";\n}\n\nfunction vertexMetadata(args: MapVertexErrorArgs, code: string) {\n return buildErrorMetadata({\n provider: \"vertex\",\n endpoint: args.endpoint,\n code: code as Parameters<typeof buildErrorMetadata>[0][\"code\"],\n status: args.status,\n headers: args.headers,\n body: args.body,\n });\n}\n\nconst VERTEX_ERROR_BUILDERS: Record<\n VertexCode,\n (args: MapVertexErrorArgs, msg: string) => TheokitAgentError\n> = {\n rate_limit: (args, msg) =>\n new RateLimitError(`Vertex quota exhausted: ${msg}`, {\n metadata: vertexMetadata(args, \"rate_limit\"),\n }),\n auth_unauthenticated: (args, msg) =>\n new AuthenticationError(`Vertex unauthenticated: ${msg}`, {\n metadata: vertexMetadata(args, \"auth_failed\"),\n }),\n auth_permission: (args, msg) =>\n new AuthenticationError(`Vertex permission denied: ${msg}`, {\n metadata: vertexMetadata(args, \"auth_failed\"),\n }),\n invalid_request: (args, msg) =>\n new ConfigurationError(`Vertex validation: ${msg}`, {\n metadata: vertexMetadata(args, \"invalid_request\"),\n }),\n timeout: (args, msg) =>\n new NetworkError(`Vertex timeout: ${msg}`, { metadata: vertexMetadata(args, \"timeout\") }),\n server_error: (args, msg) =>\n new NetworkError(`Vertex server error: ${msg}`, {\n metadata: vertexMetadata(args, \"server_error\"),\n }),\n unknown: (args, msg) =>\n new UnknownAgentError(`Vertex unknown: ${msg}`, { metadata: vertexMetadata(args, \"unknown\") }),\n};\n\nexport function mapVertexError(args: MapVertexErrorArgs): TheokitAgentError {\n const parsed = parseBody(args.body);\n const errStatus = parsed.error?.status ?? \"\";\n const message = parsed.error?.message ?? \"Vertex request failed\";\n const code = classifyVertexError(args, errStatus);\n return VERTEX_ERROR_BUILDERS[code](args, message);\n}\n\nfunction parseBody(body: unknown): VertexErrorBody {\n if (body !== null && typeof body === \"object\") return body as VertexErrorBody;\n if (typeof body === \"string\") {\n try {\n return JSON.parse(body) as VertexErrorBody;\n } catch {\n return {};\n }\n }\n return {};\n}\n","/**\n * Vertex AI access token + config resolution (ADRs D288, D295).\n *\n * Uses `google-auth-library` (required peer dep) for ADC discovery:\n * 1. `GOOGLE_APPLICATION_CREDENTIALS` env (path to Service Account JSON)\n * 2. `gcloud auth application-default login` cached credentials\n * 3. Metadata server (GCE/GKE/Cloud Run/Cloud Functions)\n * 4. Workload Identity Federation (WIF; configured via Service Account JSON)\n *\n * EC-3 absorbed: differentiate \"peer dep missing\" (throws ConfigurationError\n * with install hint) from \"no credentials in ADC chain\" (returns undefined\n * so caller can throw a clearer downstream error).\n *\n * @internal\n */\n\nimport { createRequire } from \"node:module\";\n\nimport { ConfigurationError } from \"../../errors.js\";\n\ninterface GoogleAuthClient {\n getAccessToken: () => Promise<{ token: string | null }>;\n}\n\ninterface GoogleAuthLib {\n GoogleAuth: new (opts: {\n scopes: string[];\n }) => {\n getClient: () => Promise<GoogleAuthClient>;\n };\n}\n\nlet cachedAuthClient: GoogleAuthClient | undefined;\n\nconst SCOPE_CLOUD_PLATFORM = \"https://www.googleapis.com/auth/cloud-platform\";\n\nexport async function resolveVertexAccessToken(): Promise<string | undefined> {\n if (cachedAuthClient === undefined) {\n cachedAuthClient = await getAuthClientOrThrow();\n }\n try {\n const result = await cachedAuthClient.getAccessToken();\n return result.token ?? undefined;\n } catch {\n // ADC chain exhausted — caller (router) emits the helpful error.\n return undefined;\n }\n}\n\nasync function getAuthClientOrThrow(): Promise<GoogleAuthClient> {\n let mod: GoogleAuthLib;\n try {\n const r = createRequire(import.meta.url);\n mod = r(\"google-auth-library\") as GoogleAuthLib;\n } catch (err) {\n // EC-3: differentiate module-not-found from runtime ADC failure.\n const isModuleMissing =\n err instanceof Error &&\n (err.message.includes(\"Cannot find module\") ||\n (err as { code?: string }).code === \"MODULE_NOT_FOUND\");\n if (isModuleMissing) {\n throw new ConfigurationError(\n \"Vertex provider requires `google-auth-library`. Install: `pnpm add google-auth-library`.\",\n { code: \"auth_failed\", cause: err },\n );\n }\n throw err;\n }\n try {\n const auth = new mod.GoogleAuth({ scopes: [SCOPE_CLOUD_PLATFORM] });\n return await auth.getClient();\n } catch (err) {\n // ADC chain exhausted at client construction time — return a stub that\n // forces resolveVertexAccessToken to return undefined.\n process.stderr.write(\n `[theokit-sdk] Vertex ADC initialization failed: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n return { getAccessToken: async () => ({ token: null }) };\n }\n}\n\n/** Resolve project id via env vars (env-only in v1). */\nexport function resolveVertexProjectId(): string | undefined {\n return (\n process.env.GOOGLE_CLOUD_PROJECT ??\n process.env.GOOGLE_CLOUD_PROJECT_ID ??\n process.env.GCLOUD_PROJECT\n );\n}\n\n/** Resolve Vertex location (region) from env; defaults to `us-central1`. */\nexport function resolveVertexLocation(): string {\n return process.env.GOOGLE_CLOUD_LOCATION ?? process.env.CLOUD_ML_REGION ?? \"us-central1\";\n}\n\n/** Test seam — reset cached auth client. */\nexport function __resetVertexAuth(): void {\n cachedAuthClient = undefined;\n}\n\n/** Test seam — inject a custom client for unit tests. */\nexport function __setVertexAuthClientForTests(client: GoogleAuthClient | undefined): void {\n cachedAuthClient = client;\n}\n","/**\n * GCP Vertex AI client for Anthropic Messages (Adoption Roadmap #8; ADRs\n * D292, D293).\n *\n * v1 uses `:rawPredict` (non-streaming). Streaming via `:streamRawPredict`\n * with SSE follows the same shape but is gated behind a future iteration —\n * v1 returns the full response as a single delta to keep the streaming\n * interface contract.\n *\n * Body massage (D292):\n * - inject `anthropic_version: \"vertex-2023-10-16\"`\n * - strip `model` from body (goes in URL)\n * - strip `stream` from body\n *\n * Uses native `fetch` only — no `@anthropic-ai/vertex-sdk` (D294).\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { mapVertexError } from \"../error-mappers/vertex.js\";\nimport { resolveVertexBaseUrl, stripVertexPrefix } from \"../providers/builtin/vertex.js\";\nimport {\n buildAnthropicCommonBody,\n handleAnthropicResponse,\n postAnthropicRequest,\n} from \"./anthropic-shared.js\";\nimport { makeLlmFinish } from \"./finish.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\nimport {\n resolveVertexAccessToken,\n resolveVertexLocation,\n resolveVertexProjectId,\n} from \"./vertex-auth.js\";\n\nexport interface VertexAnthropicClientOptions {\n /** When undefined, resolved lazily via `resolveVertexProjectId()`. */\n projectId?: string;\n /** When undefined, resolved lazily via `resolveVertexLocation()`. */\n location?: string;\n /**\n * OAuth access token. When provided, used as-is. When empty/undefined,\n * resolved lazily per request via `resolveVertexAccessToken()` (D288).\n */\n apiKey?: string;\n fetch?: typeof fetch;\n}\n\nexport class VertexAnthropicClient implements LlmClient {\n readonly name = \"vertex_anthropic\";\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly options: VertexAnthropicClientOptions) {\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n private resolveProjectOrThrow(): string {\n const projectId = this.options.projectId ?? resolveVertexProjectId();\n if (projectId !== undefined) return projectId;\n throw new ConfigurationError(\n \"Vertex requires a project id. Set GOOGLE_CLOUD_PROJECT env var or run `gcloud config set project <id>`.\",\n { code: \"auth_failed\" },\n );\n }\n\n private async resolveTokenOrThrow(): Promise<string> {\n const fromOpts = this.options.apiKey;\n if (fromOpts !== undefined && fromOpts.length > 0) return fromOpts;\n const fromAdc = await resolveVertexAccessToken();\n if (fromAdc !== undefined && fromAdc.length > 0) return fromAdc;\n throw new ConfigurationError(\n \"Vertex could not resolve an access token. Run `gcloud auth application-default login` or set GOOGLE_APPLICATION_CREDENTIALS to a service-account JSON path.\",\n { code: \"auth_failed\" },\n );\n }\n\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n const projectId = this.resolveProjectOrThrow();\n const location = this.options.location ?? resolveVertexLocation();\n const accessToken = await this.resolveTokenOrThrow();\n const baseUrl = resolveVertexBaseUrl({ projectId, location, modelDialect: \"anthropic\" });\n const bareModel = stripVertexPrefix(request.model);\n const endpoint = `/models/${encodeURIComponent(bareModel)}:rawPredict`;\n const url = `${baseUrl}${endpoint}`;\n\n const response = await postAnthropicRequest({\n fetchImpl: this.fetchImpl,\n url,\n token: accessToken,\n body: buildVertexAnthropicBody(request),\n signal,\n });\n\n const consumed = await handleAnthropicResponse({\n response,\n endpoint,\n errorMapper: mapVertexError,\n });\n if (consumed.text.length > 0) yield { type: \"text_delta\", text: consumed.text };\n return makeLlmFinish(consumed);\n }\n}\n\nfunction buildVertexAnthropicBody(request: LlmRequest): Record<string, unknown> {\n // D292: anthropic_version is REQUIRED in body (not header) and `model` is stripped.\n return {\n anthropic_version: \"vertex-2023-10-16\",\n ...buildAnthropicCommonBody(request),\n };\n}\n","/**\n * GCP Vertex AI Gemini client (Adoption Roadmap #8; ADR D291).\n *\n * Uses the **OpenAI-compat** endpoint:\n * POST https://{LOCATION}-aiplatform.googleapis.com/v1/projects/{P}/locations/{L}/endpoints/openapi/chat/completions\n *\n * Wraps `OpenAIClient` with the Vertex baseUrl + lazy OAuth token from\n * `google-auth-library` (D288). Limitation: Vertex silently drops\n * unsupported OpenAI params (D264-style trade-off).\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { resolveVertexBaseUrl } from \"../providers/builtin/vertex.js\";\nimport { OpenAIClient } from \"./openai.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\nimport {\n resolveVertexAccessToken,\n resolveVertexLocation,\n resolveVertexProjectId,\n} from \"./vertex-auth.js\";\n\nexport interface VertexGeminiClientOptions {\n /** When undefined, resolved lazily via `resolveVertexProjectId()`. */\n projectId?: string;\n /** When undefined, resolved lazily via `resolveVertexLocation()`. */\n location?: string;\n /** When non-empty, used as-is. Otherwise resolved lazily via ADC. */\n apiKey?: string;\n fetch?: typeof fetch;\n}\n\nexport class VertexGeminiClient implements LlmClient {\n readonly name = \"vertex_gemini\";\n\n constructor(private readonly options: VertexGeminiClientOptions) {}\n\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n // EC-1 absorbed: helpful errors when projectId / token missing.\n const projectId = this.options.projectId ?? resolveVertexProjectId();\n if (projectId === undefined) {\n throw new ConfigurationError(\n \"Vertex requires a project id. Set GOOGLE_CLOUD_PROJECT env var or run \" +\n \"`gcloud config set project <id>`.\",\n { code: \"auth_failed\" },\n );\n }\n const location = this.options.location ?? resolveVertexLocation();\n const accessToken =\n this.options.apiKey !== undefined && this.options.apiKey.length > 0\n ? this.options.apiKey\n : await resolveVertexAccessToken();\n if (accessToken === undefined || accessToken.length === 0) {\n throw new ConfigurationError(\n \"Vertex could not resolve an access token. Run \" +\n \"`gcloud auth application-default login` or set \" +\n \"GOOGLE_APPLICATION_CREDENTIALS to a service-account JSON path.\",\n { code: \"auth_failed\" },\n );\n }\n\n // Vertex OpenAI-compat URL: baseUrl includes `.../endpoints/openapi`.\n // OpenAIClient appends `/v1/chat/completions` which gives the wrong path —\n // so we strip the `/v1/` suffix from our baseUrl construction by using\n // the parent URL and letting OpenAIClient add the suffix back.\n //\n // Resolved baseUrl (target):\n // .../endpoints/openapi/chat/completions\n // OpenAIClient builds:\n // {baseUrl}/v1/chat/completions\n // So we need baseUrl = `.../endpoints/openapi-no-suffix` such that\n // `{baseUrl}/v1/chat/completions` = `.../endpoints/openapi/chat/completions`.\n // That's not achievable via simple concat; the cleanest path is to\n // delegate directly using a custom URL — but to keep the existing\n // OpenAIClient code-path, we set baseUrl so that the suffix is correct\n // by mounting \"openapi\" as the leaf and letting `/v1/chat/completions`\n // append. Vertex's documented path is exactly:\n // .../endpoints/openapi/chat/completions (NO /v1)\n // We achieve this by providing a base ending in `/endpoints` and\n // re-mapping `/v1/chat/completions` → `/openapi/chat/completions`\n // via a custom URL builder client.\n //\n // For v1 we ship a minimal own client that targets the exact endpoint.\n const baseUrl = resolveVertexBaseUrl({ projectId, location, modelDialect: \"gemini\" });\n const url = `${baseUrl}/chat/completions`;\n\n // Reuse OpenAIClient by injecting a baseUrl that matches its `/v1/chat/completions` suffix.\n // To avoid that suffix mismatch, we bypass OpenAIClient.stream() entirely and\n // do a direct fetch — but Gemini's response shape IS OpenAI shape, so we\n // borrow OpenAIClient's accumulator via composition: pre-build the body,\n // then hand off to OpenAIClient with a synthetic baseUrl whose `/v1/chat/completions`\n // suffix lands on our actual endpoint.\n //\n // Simplest: create a wrapper fetch that rewrites the URL before delegating.\n const innerFetch = this.options.fetch ?? fetch;\n const rewriteFetch: typeof fetch = (input, init) => {\n // OpenAIClient calls `${baseUrl}/v1/chat/completions`. We rewrite that to\n // the actual Vertex URL.\n const requested =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.toString()\n : (input as Request).url;\n const targetUrl = requested.endsWith(\"/v1/chat/completions\") ? url : requested;\n return innerFetch(targetUrl, init);\n };\n\n // Delegate to OpenAIClient with auth + rewrite.\n const inner = new OpenAIClient({\n apiKey: accessToken,\n baseUrl: \"https://_vertex_placeholder\",\n providerName: \"vertex\",\n fetch: rewriteFetch,\n });\n return yield* inner.stream(request, signal);\n }\n}\n","/**\n * Vertex AI dispatcher (Adoption Roadmap #8; ADRs D291, D292, D301).\n *\n * `selectTransport` doesn't see the model id (the credential resolution\n * happens before request dispatch). This client inspects `request.model`\n * at stream time and delegates to either `VertexGeminiClient` (OpenAI-compat\n * for Gemini) or `VertexAnthropicClient` (`:rawPredict` for Claude).\n *\n * @internal\n */\n\nimport { inferModelDialect } from \"../providers/builtin/vertex.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\nimport { VertexAnthropicClient } from \"./vertex-anthropic.js\";\nimport { VertexGeminiClient } from \"./vertex-gemini.js\";\n\nexport interface VertexRouterClientOptions {\n apiKey?: string;\n fetch?: typeof fetch;\n}\n\nexport class VertexRouterClient implements LlmClient {\n readonly name = \"vertex\";\n\n constructor(private readonly options: VertexRouterClientOptions) {}\n\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n const dialect = inferModelDialect(request.model);\n if (dialect === \"anthropic\") {\n const inner = new VertexAnthropicClient(this.options);\n return yield* inner.stream(request, signal);\n }\n const inner = new VertexGeminiClient(this.options);\n return yield* inner.stream(request, signal);\n }\n}\n","import { ConfigurationError } from \"../../errors.js\";\nimport { getProviderProfile, type ProviderProfile, registerBuiltins } from \"../providers/index.js\";\nimport { AnthropicClient } from \"./anthropic.js\";\nimport { BedrockAnthropicClient } from \"./bedrock-anthropic.js\";\nimport { CredentialPool, newPooledCredential } from \"./credential-pool.js\";\nimport { currentCredentialPool } from \"./credential-pool-context.js\";\nimport type { CredentialPoolStrategy } from \"./credential-pool-types.js\";\nimport { maybeWrapWithFaultInjection } from \"./fault-injection.js\";\nimport { OllamaNativeClient } from \"./ollama-native.js\";\nimport { OpenAIClient } from \"./openai.js\";\nimport { PoolAwareLlmClient } from \"./pool-aware-client.js\";\nimport { ResponsesApiClient } from \"./responses.js\";\nimport type { LlmClient } from \"./types.js\";\nimport { VertexRouterClient } from \"./vertex-router.js\";\n\n/**\n * Provider router (T4.3, ADRs D105-D107).\n *\n * Resolves an `LlmClient` from a `ProviderProfile`. The profile is the\n * data; the transport is selected by `apiMode`. Builtins are eagerly\n * registered on first call; user plugins in `~/.theokit/plugins/\n * model-providers/` are lazy-loaded.\n *\n * @internal\n */\n\nexport type ProviderName = \"anthropic\" | \"openai\" | \"openrouter\" | (string & {});\n\nexport interface ProviderRouterOptions {\n primary: ProviderName;\n fallback?: ProviderName[];\n /** Credential pools per provider (ADRs D123-D133). Optional. */\n apiKeys?: Record<string, string[]>;\n /** Pool rotation strategy per provider. Optional; default `\"fill_first\"`. */\n credentialPoolStrategy?: Record<string, CredentialPoolStrategy>;\n /**\n * Per-run opt-in leaked-dialect safe-parse derived from the chat route\n * (theokit#58 follow-up). When `true`, the resolved profile is cloned with\n * `extractToolCallsFromContent: true` so the OpenAI-compatible transport\n * recovers Hermes `<function=…></tool_call>` dialect leaked as text. Applied\n * to the resolved chain; fail-open, so a non-leaking provider is unaffected.\n */\n extractToolCallsFromContent?: boolean;\n /**\n * SE2 — forwarded into the pool-aware client so a 429 retry surfaces a\n * `rate_limit` RunEvent. Wired from `SendOptions.onRunEvent` at the run boundary.\n */\n onRateLimit?: (info: { attempt: number; retryAfterMs?: number }) => void;\n}\n\n/**\n * Resolves the provider chain synchronously. Builtins are eagerly registered.\n * Provider plugin discovery is expected to have run upfront (e.g., via\n * Agent.create initialization) before this is called.\n */\nexport function resolveProviderChain(options: ProviderRouterOptions): LlmClient[] {\n registerBuiltins();\n return buildChain(options);\n}\n\nfunction buildChain(options: ProviderRouterOptions): LlmClient[] {\n // EC-B: warn (once) on apiKeys entries for providers we don't recognize.\n warnUnknownProvidersInApiKeys(options.apiKeys);\n\n const seen = new Set<string>();\n const clients: LlmClient[] = [];\n const addClient = (name: ProviderName): void => {\n const lowered = name.toLowerCase();\n if (seen.has(lowered)) return;\n seen.add(lowered);\n const client = buildClient(lowered, options);\n // D14: wrap every resolved client with the fault-injection decorator.\n // The wrapper is a cheap noop unless `NODE_ENV=test` AND\n // `THEOKIT_TEST_RESPONSE_OVERRIDE` are both set — production is unaffected.\n if (client !== undefined) clients.push(maybeWrapWithFaultInjection(client));\n };\n addClient(options.primary);\n for (const fallback of options.fallback ?? []) addClient(fallback);\n if (clients.length === 0) {\n throw new ConfigurationError(\n `No provider client could be resolved (primary=${options.primary}). ` +\n `Set ANTHROPIC_API_KEY or OPENAI_API_KEY / OPENROUTER_API_KEY.`,\n { code: \"provider_unresolved\" },\n );\n }\n return clients;\n}\n\nfunction buildClient(name: string, routerOptions: ProviderRouterOptions): LlmClient | undefined {\n const baseProfile = getProviderProfile(name);\n if (baseProfile === undefined) return undefined;\n // theokit#58 follow-up: per-run route opt-in clones the resolved profile with\n // the leaked-dialect recovery flag so the OpenAI-compatible transport surfaces\n // Hermes `<function=…></tool_call>` calls leaked as text. Built-in profiles\n // ship the flag off; this is the per-run enablement path.\n const profile =\n routerOptions.extractToolCallsFromContent === true &&\n baseProfile.extractToolCallsFromContent !== true\n ? { ...baseProfile, extractToolCallsFromContent: true }\n : baseProfile;\n const resilience =\n routerOptions.onRateLimit !== undefined ? { onRateLimit: routerOptions.onRateLimit } : {};\n const ambient = currentCredentialPool(name);\n if (ambient !== undefined) {\n return new PoolAwareLlmClient(\n ambient,\n (apiKey) => selectTransport(profile, apiKey),\n undefined,\n resilience,\n );\n }\n const poolKeys = filterPoolKeys(routerOptions.apiKeys?.[name]);\n const noAuthOverride = maybeBuildNoAuthTransport(profile, poolKeys);\n if (noAuthOverride !== undefined) return noAuthOverride;\n return buildPoolOrSingle({ name, profile, poolKeys, routerOptions });\n}\n\n/**\n * EC-C MUST FIX (ADR D187): `authType: \"none\"` providers ignore apiKeys.\n * Building a CredentialPool against a runtime without auth is semantically\n * meaningless; emit one-shot warn and route to the sentinel transport.\n */\nfunction maybeBuildNoAuthTransport(\n profile: ProviderProfile,\n poolKeys: string[] | undefined,\n): LlmClient | undefined {\n if (profile.authType !== \"none\" || poolKeys === undefined || poolKeys.length === 0) {\n return undefined;\n }\n warnNoAuthApiKeysIgnoredOnce(profile.name);\n const sentinel = sentinelForNoAuth(profile);\n if (sentinel === undefined) return undefined;\n return selectTransport(profile, sentinel);\n}\n\n/** Pool path for ≥2 keys; single-key fast path otherwise; sentinel fallback. */\nfunction buildPoolOrSingle(args: {\n name: string;\n profile: ProviderProfile;\n poolKeys: string[] | undefined;\n routerOptions: ProviderRouterOptions;\n}): LlmClient | undefined {\n const { name, profile, poolKeys, routerOptions } = args;\n if (poolKeys !== undefined && poolKeys.length >= 2) {\n const strategy = routerOptions.credentialPoolStrategy?.[name] ?? \"fill_first\";\n const entries = poolKeys.map((accessToken, priority) =>\n newPooledCredential({ provider: name, accessToken, priority, source: \"manual\" }),\n );\n const pool = new CredentialPool(name, entries, strategy);\n const resilience =\n routerOptions.onRateLimit !== undefined ? { onRateLimit: routerOptions.onRateLimit } : {};\n return new PoolAwareLlmClient(\n pool,\n (apiKey) => selectTransport(profile, apiKey),\n undefined,\n resilience,\n );\n }\n // 1-entry pool / single-key fast path: prefer explicit apiKeys[name] over env.\n // D182: `authType: \"none\"` providers fall back to a sentinel placeholder\n // when no key is set — transports that ignore the Authorization header still work.\n // D286/D288: `aws_bearer` / `gcp_oauth` profiles use a lazy sentinel so the\n // client can resolve real credentials at stream time (helpful error if missing).\n const apiKey =\n poolKeys?.[0] ??\n resolveApiKey(profile.envVars) ??\n sentinelForNoAuth(profile) ??\n sentinelForLazyAuth(profile);\n if (apiKey === undefined) return undefined;\n return selectTransport(profile, apiKey);\n}\n\nfunction resolveBaseUrlEnvOverride(providerName: string): string | undefined {\n switch (providerName) {\n case \"openai\":\n return process.env.OPENAI_API_BASE_URL;\n case \"openrouter\":\n return process.env.OPENROUTER_API_BASE_URL;\n case \"ollama\":\n return process.env.OLLAMA_HOST;\n case \"lmstudio\":\n return process.env.LMSTUDIO_HOST;\n case \"llamacpp\":\n return process.env.LLAMACPP_HOST;\n default:\n return undefined;\n }\n}\n\n// EC-C: one-shot warn keyed by provider name.\nconst warnedNoAuthApiKeys = new Set<string>();\nfunction warnNoAuthApiKeysIgnoredOnce(provider: string): void {\n if (warnedNoAuthApiKeys.has(provider)) return;\n warnedNoAuthApiKeys.add(provider);\n process.stderr.write(\n `[theokit-sdk] provider \"${provider}\" has authType: \"none\" — apiKeys ignored (no auth required for local runtime).\\n`,\n );\n}\n\n/** Test-only reset. @internal */\nexport function _resetNoAuthApiKeyWarnings(): void {\n warnedNoAuthApiKeys.clear();\n}\n\n/**\n * D182: providers declaring `authType: \"none\"` use a placeholder credential\n * so the OpenAI-compat transport keeps working. The placeholder value is\n * never sensitive — local runtimes ignore the Authorization header.\n */\nfunction sentinelForNoAuth(profile: ProviderProfile): string | undefined {\n return profile.authType === \"none\" ? profile.name : undefined;\n}\n\n/**\n * D286 / D288: providers with lazy-resolved auth (Bedrock Bearer via\n * `@aws/bedrock-token-generator`, Vertex via `google-auth-library`) may not\n * have credentials available at construction time — the client resolves\n * them per-request and throws helpful `ConfigurationError` if missing\n * (EC-1, EC-6 absorbed). Use a placeholder so the router still builds\n * the client; the user sees the helpful error on the first `agent.send`.\n */\nfunction sentinelForLazyAuth(profile: ProviderProfile): string | undefined {\n if (profile.authType === \"aws_bearer\") return \"__bedrock_lazy_token__\";\n if (profile.authType === \"gcp_oauth\") return \"__vertex_lazy_token__\";\n // M42: an oauth provider carries no static key — build the client with a lazy placeholder so its M41\n // `transform.fetch(ctx)` (which calls `resolveCredential` to obtain a freshly-refreshed bearer) owns\n // the real Authorization at stream time. Plain (api_key/none) profiles are unaffected.\n if (profile.authType === \"oauth_device_code\" || profile.authType === \"oauth_external\") {\n return \"__oauth_lazy_token__\";\n }\n return undefined;\n}\n\nfunction filterPoolKeys(keys: string[] | undefined): string[] | undefined {\n if (keys === undefined) return undefined;\n const cleaned = keys.filter((k) => typeof k === \"string\" && k.length > 0);\n return cleaned.length === 0 ? undefined : cleaned;\n}\n\nconst warnedProviders = new Set<string>();\nfunction warnUnknownProvidersInApiKeys(apiKeys: Record<string, string[]> | undefined): void {\n if (apiKeys === undefined) return;\n for (const name of Object.keys(apiKeys)) {\n if (warnedProviders.has(name)) continue;\n const profile = getProviderProfile(name);\n if (profile === undefined) {\n warnedProviders.add(name);\n process.stderr.write(\n `[theokit-sdk] credential-pool: unknown provider \"${name}\" in apiKeys (no profile registered)\\n`,\n );\n }\n }\n}\n\n/** Test-only reset. @internal */\nexport function _resetCredentialPoolWarnings(): void {\n warnedProviders.clear();\n}\n\n/**\n * EC-10: resolve API key from ordered envVars list; first non-empty wins.\n */\nfunction resolveApiKey(envVars: ReadonlyArray<string>): string | undefined {\n for (const v of envVars) {\n const value = process.env[v];\n if (value !== undefined && value.length > 0) return value;\n }\n return undefined;\n}\n\n/**\n * EC-3 fix: exhaustive switch with actionable error on unsupported apiMode.\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: 4-mode transport ladder (chat_completions / anthropic_messages / responses_api / bedrock) + Ollama native dispatch (D191) + per-provider envOverride is one cohesive switch — splitting hurts readability and obscures the dispatch contract.\nfunction selectTransport(profile: ProviderProfile, apiKey: string): LlmClient {\n // M41 — the optional provider `transform` seam (refresh-aware `fetch` + dynamic `headers` from the resolved\n // bearer). Invoked LAZILY, per-branch, ONLY by the transports that consume it (chat_completions +\n // responses_api) — so a transform's side effects (e.g. a token refresh) never fire for a transport that\n // ignores it (bedrock / ollama). Absent ⇒ each branch takes its byte-for-byte static path.\n const applyTransform = (): { fetch?: typeof fetch; headers?: Record<string, string> } => {\n if (profile.transform === undefined) return {};\n const ctx = { apiKey };\n return { fetch: profile.transform.fetch?.(ctx), headers: profile.transform.headers?.(ctx) };\n };\n\n /**\n * Aplica o transform do provider sobre `opts` e devolve o cliente construído.\n *\n * Os ramos `chat_completions` e `anthropic_messages` faziam isto de forma IDÊNTICA, diferindo só no\n * construtor final. É duplicação de CONHECIMENTO: \"aplique o transform, exija que o OAuth esteja\n * resolvido, e mescle os headers dinâmicos POR CIMA dos estáticos do profile\" é a mesma regra para\n * qualquer provider — corrigi-la num ramo e esquecer o outro deixaria um provider com transporte\n * refresh-aware e o outro sem, silenciosamente.\n *\n * Genérica sobre `O` porque cada ramo declara seu próprio `opts` com o tipo do construtor dele\n * (`ConstructorParameters<typeof OpenAIClient>[0]` vs o do Anthropic) — foi por isso que uma\n * primeira tentativa com helper não-genérico, declarado antes dos `if`, não compilou.\n */\n const comTransform = <\n O extends { fetch?: typeof fetch; extraHeaders?: Record<string, string> },\n C,\n >(\n opts: O,\n criar: (o: O) => C,\n ): C => {\n const t = applyTransform();\n assertOAuthResolved(t);\n if (t.fetch !== undefined) opts.fetch = t.fetch;\n const merged =\n profile.extraHeaders !== undefined || t.headers !== undefined\n ? { ...profile.extraHeaders, ...t.headers }\n : undefined;\n if (merged !== undefined) opts.extraHeaders = merged;\n return criar(opts);\n };\n\n // M42 review MEDIUM-1 — mirror OpenCode's auth model (packages/llm/src/route/auth.ts): a provider's auth\n // resolves to real headers at request time or FAILS with `MissingCredentialError` — it NEVER puts a\n // placeholder on the wire. theokit builds an oauth provider's client with the `__oauth_lazy_token__`\n // placeholder (so the sync router can construct it), then the provider's `transform` (the theokit analog of\n // OpenCode's `Auth.apply`) supplies the real bearer via fetch or an authorization header. If it supplies\n // neither, fail fast here with the MissingCredentialError analog instead of POSTing the placeholder upstream.\n const assertOAuthResolved = (t: {\n fetch?: typeof fetch;\n headers?: Record<string, string>;\n }): void => {\n if (apiKey !== \"__oauth_lazy_token__\") return;\n const auth = t.headers?.authorization ?? t.headers?.Authorization;\n if (t.fetch === undefined && auth === undefined) {\n throw new ConfigurationError(\n `provider \"${profile.name}\" uses OAuth (authType: ${profile.authType}) but no credential was ` +\n `resolved. Register a ProviderProfile.transform whose fetch (or headers.authorization) supplies ` +\n `the bearer — typically via resolveCredential() from \"@theokit/sdk/auth\".`,\n );\n }\n };\n\n if (profile.apiMode === \"chat_completions\") {\n // ADR D191 (T8.1 dogfood fix): Ollama tool calling REQUIRES the native\n // `/api/chat` endpoint. OpenAI-compat `/v1/chat/completions` causes\n // models to emit raw tool JSON as plain text — confirmed via peer-project\n // upstream warning and our own dogfood of telegram-pro.\n if (profile.name === \"ollama\") {\n const ollamaBase = process.env.OLLAMA_HOST ?? profile.baseUrl;\n return new OllamaNativeClient({ apiKey, baseUrl: ollamaBase });\n }\n const opts: ConstructorParameters<typeof OpenAIClient>[0] = { apiKey };\n opts.baseUrl = profile.baseUrl;\n // T1.1 (ADR D185): forward provider name so OpenAIClient can dispatch\n // Ollama-specific error mapping for ECONNREFUSED / 404-not-pulled / 503-loading.\n opts.providerName = profile.name;\n // theokit#58 follow-up: opt-in leaked-dialect safe-parse, declared per-profile (default off).\n if (profile.extractToolCallsFromContent === true) {\n opts.extractToolCallsFromContent = true;\n }\n // M45 — explicit chat-completions path override (data-only escape for unversioned shapes).\n if (profile.chatCompletionsPath !== undefined) {\n opts.chatCompletionsPath = profile.chatCompletionsPath;\n }\n if (profile.name === \"openai\" && process.env.OPENAI_ORGANIZATION !== undefined) {\n opts.organization = process.env.OPENAI_ORGANIZATION;\n }\n // Honor explicit base URL overrides for cloud providers + the local\n // `authType: \"none\"` family (D182, D188, D189). All four `_HOST` /\n // `_API_BASE_URL` vars are intentionally separate so users can mix\n // remote-box pointing without disturbing the others.\n const envOverride = resolveBaseUrlEnvOverride(profile.name);\n if (envOverride !== undefined) opts.baseUrl = envOverride;\n // M41 — feed the provider transform: `fetch` (refresh-aware transport) + `headers` merged over the\n // profile's static `extraHeaders`. OpenAIClient now honors `extraHeaders` (was ignored) — additive-safe:\n // no builtin sets it on chat_completions.\n return comTransform(opts, (o) => new OpenAIClient(o));\n }\n if (profile.apiMode === \"anthropic_messages\") {\n // Vertex sub-dispatch (D301): when profile.name === \"vertex\", route to\n // VertexRouterClient which picks Gemini vs Anthropic at stream time.\n // apiKey is either a real Bearer token (rare — caller passed it\n // explicitly) or the lazy sentinel `__vertex_lazy_token__` — strip\n // the latter so the client falls through to ADC discovery (D288).\n if (profile.name === \"vertex\") {\n const realKey = apiKey === \"__vertex_lazy_token__\" ? undefined : apiKey;\n return new VertexRouterClient(realKey !== undefined ? { apiKey: realKey } : {});\n }\n const opts: ConstructorParameters<typeof AnthropicClient>[0] = { apiKey };\n opts.baseUrl = process.env.ANTHROPIC_API_BASE_URL ?? profile.baseUrl;\n // M45 — feed the provider transform + static extraHeaders (mirror of the M41 chat_completions wiring),\n // so anthropic_messages providers can carry headers (anthropic-beta) and refresh-aware fetches (M46).\n return comTransform(opts, (o) => new AnthropicClient(o));\n }\n if (profile.apiMode === \"bedrock_anthropic\") {\n // D301: dedicated Bedrock InvokeModel client. apiKey from env when set;\n // strip the lazy sentinel so client triggers @aws/bedrock-token-generator (D287).\n const realKey = apiKey === \"__bedrock_lazy_token__\" ? undefined : apiKey;\n return new BedrockAnthropicClient(realKey !== undefined ? { apiKey: realKey } : {});\n }\n if (profile.apiMode === \"responses_api\") {\n // M40 — the OpenAI Responses-API transport (ChatGPT Codex backend + any responses provider). Consumes\n // `baseUrl` + `extraHeaders`. M41 — feeds the provider `transform`: `headers` merge over `extraHeaders`\n // (dynamic auth headers like a live `ChatGPT-Account-Id`), and `fetch` becomes the refresh-aware fetch\n // (closes the gap where `ResponsesApiClient` accepted a `fetch?` the router never passed).\n const t = applyTransform();\n assertOAuthResolved(t);\n const mergedHeaders =\n profile.extraHeaders !== undefined || t.headers !== undefined\n ? { ...profile.extraHeaders, ...t.headers }\n : undefined;\n return new ResponsesApiClient({\n apiKey,\n ...(profile.baseUrl !== undefined ? { baseUrl: profile.baseUrl } : {}),\n ...(mergedHeaders !== undefined ? { extraHeaders: mergedHeaders } : {}),\n ...(t.fetch !== undefined ? { fetch: t.fetch } : {}),\n providerName: profile.name,\n });\n }\n throw new ConfigurationError(\n `Provider \"${profile.name}\" requires apiMode \"${profile.apiMode}\" but no transport is registered. ` +\n `Install a third-party transport plugin (@theokit-transport-${profile.apiMode}) ` +\n `or use a provider with apiMode \"chat_completions\" or \"anthropic_messages\".`,\n { code: \"transport_unavailable\" },\n );\n}\n","/**\n * Provider inference helpers for the real local run — extracted from\n * `real-local-run.ts` to keep it within the G8 LoC budget and give the two\n * pure \"which provider?\" heuristics one cohesive home.\n *\n * @internal\n */\n\nimport { getProviderProfile } from \"../providers/index.js\";\n\n/**\n * Infer the provider from an API-key prefix (`sk-or-` → openrouter, `sk-ant-` →\n * anthropic, `sk-` → openai), but only when that provider has a registered\n * profile. Returns `undefined` when no prefix matches a known provider.\n *\n * @internal\n */\nexport function inferProviderFromApiKey(apiKey: string | undefined): string | undefined {\n if (apiKey === undefined || apiKey.length === 0) return undefined;\n const byPrefix: ReadonlyArray<{ provider: string; prefix: string }> = [\n { provider: \"openrouter\", prefix: \"sk-or-\" },\n { provider: \"anthropic\", prefix: \"sk-ant-\" },\n { provider: \"openai\", prefix: \"sk-\" },\n ];\n for (const { provider, prefix } of byPrefix) {\n if (apiKey.startsWith(prefix) && getProviderProfile(provider) !== undefined) {\n return provider;\n }\n }\n return undefined;\n}\n\n/**\n * The default primary provider from the environment: the first of\n * ANTHROPIC / OPENAI / OPENROUTER with a non-empty key, else `openai`.\n *\n * @internal\n */\nexport function detectPrimaryProvider(): string {\n if (process.env.ANTHROPIC_API_KEY !== undefined && process.env.ANTHROPIC_API_KEY.length > 0) {\n return \"anthropic\";\n }\n if (process.env.OPENAI_API_KEY !== undefined && process.env.OPENAI_API_KEY.length > 0) {\n return \"openai\";\n }\n if (process.env.OPENROUTER_API_KEY !== undefined && process.env.OPENROUTER_API_KEY.length > 0) {\n return \"openrouter\";\n }\n return \"openai\";\n}\n","/**\n * T2.2 — Provider-agnostic compression-model registry (ADR D440).\n *\n * Resolves a cheaper-tier summarization model in the SAME vendor family\n * as the agent's main model. Provider-agnostic by design: a consumer\n * running on Anthropic-only / Ollama-only / Bedrock-only never needs\n * to provision a second vendor's key for the compression aux-LLM.\n *\n * Resolution algorithm:\n *\n * 1. Exact match in `EXACT_REGISTRY` → cheaper-tier id (most cases).\n * 2. Wildcard match in `WILDCARD_REGISTRY` (`*` suffix in key) →\n * swap matched suffix (Bedrock region-prefixed variants).\n * 3. Provider in `NO_AUTH_PROVIDERS` (Ollama / LM Studio / llama.cpp)\n * → return SAME model id (local — cost N/A; running the same\n * model for summarization costs only the round-trip latency,\n * acceptable in dev/local mode).\n * 4. No match → throw `CompressionModelUnresolvedError` with the\n * actionable message naming the model + override path + the\n * registry-PR remediation hint.\n *\n * Step 1 of T2.2 (compression-helpers wire). Step 2 wires this into\n * `compression-config.ts`. Step 3 builds the OTel-instrumented aux\n * client. Step 4 wires into `loop.ts` ContextWindowExceededError catch.\n *\n * @internal\n */\n\n/**\n * Exact `agent-model → compression-model` map. Most cases land here.\n * Entries MUST keep cheaper-tier model within the SAME vendor family\n * as the key (Inquebrável Rule 9 — provider-agnostic).\n */\nconst EXACT_REGISTRY: ReadonlyMap<string, string> = new Map([\n // OpenAI family\n [\"openai/gpt-4o\", \"openai/gpt-4o-mini\"],\n [\"openai/gpt-4-turbo\", \"openai/gpt-4o-mini\"],\n [\"openai/gpt-4\", \"openai/gpt-4o-mini\"],\n [\"openai/o1-preview\", \"openai/gpt-4o-mini\"],\n [\"openai/o1\", \"openai/gpt-4o-mini\"],\n [\"openai/o3\", \"openai/gpt-4o-mini\"],\n [\"openai/o3-mini\", \"openai/gpt-4o-mini\"],\n // Anthropic family\n [\"anthropic/claude-opus-4\", \"anthropic/claude-3-5-haiku-latest\"],\n [\"anthropic/claude-sonnet-4\", \"anthropic/claude-3-5-haiku-latest\"],\n [\"anthropic/claude-3-5-sonnet\", \"anthropic/claude-3-5-haiku-latest\"],\n [\"anthropic/claude-3-5-sonnet-latest\", \"anthropic/claude-3-5-haiku-latest\"],\n [\"anthropic/claude-3-opus\", \"anthropic/claude-3-haiku\"],\n [\"anthropic/claude-3-sonnet\", \"anthropic/claude-3-haiku\"],\n // Vertex (Gemini + Anthropic-on-Vertex)\n [\"vertex/gemini-1.5-pro\", \"vertex/gemini-1.5-flash\"],\n [\"vertex/gemini-2.0-pro\", \"vertex/gemini-1.5-flash\"],\n [\"vertex/claude-3-5-sonnet\", \"vertex/claude-3-5-haiku\"],\n [\"vertex/claude-3-opus\", \"vertex/claude-3-haiku\"],\n // OpenRouter (preserve openrouter prefix, swap tier within same vendor)\n [\"openrouter/openai/gpt-4o\", \"openrouter/openai/gpt-4o-mini\"],\n [\"openrouter/openai/gpt-4-turbo\", \"openrouter/openai/gpt-4o-mini\"],\n [\"openrouter/anthropic/claude-3-5-sonnet\", \"openrouter/anthropic/claude-3-5-haiku\"],\n [\"openrouter/anthropic/claude-opus-4\", \"openrouter/anthropic/claude-3-5-haiku\"],\n]);\n\n/**\n * Wildcard `agent-model-prefix* → compression-model-prefix*` map.\n * Used for region-prefixed Bedrock variants where the registry can't\n * enumerate every region literal. Matching algorithm: the registry\n * key MUST end with `*`; the input MUST match the prefix; the input's\n * suffix after the prefix is appended to the resolved value (also\n * ending with `*` to mark the swap point).\n */\nconst WILDCARD_REGISTRY: ReadonlyArray<readonly [string, string]> = [\n // Bedrock Anthropic: us.anthropic.claude-sonnet-* → us.anthropic.claude-3-haiku-*\n [\"bedrock/anthropic.claude-sonnet*\", \"bedrock/anthropic.claude-3-haiku*\"],\n [\"bedrock/anthropic.claude-opus*\", \"bedrock/anthropic.claude-3-haiku*\"],\n [\"bedrock/anthropic.claude-3-5-sonnet*\", \"bedrock/anthropic.claude-3-5-haiku*\"],\n];\n\n/**\n * Providers declaring `authType: \"none\"` in their profile (D182, D188,\n * D189). For these, return the SAME model — local runtime has no\n * \"cheaper tier\" semantics, latency penalty of summarizing twice is\n * acceptable in dev/local mode. Keys are the provider prefix BEFORE\n * the slash.\n */\nconst NO_AUTH_PROVIDERS: ReadonlySet<string> = new Set([\"ollama\", \"lmstudio\", \"llamacpp\"]);\n\n/**\n * T2.2 — Typed error thrown when `resolveCompressionModel` cannot\n * find a same-family-cheaper-tier mapping for `agentModel`. Surfaces\n * the offending model id so operators can either (a) provide\n * `Agent.create({compression: {model: ...}})` explicitly or (b) open\n * a registry-PR adding the missing entry.\n *\n * @public\n */\nexport class CompressionModelUnresolvedError extends Error {\n override readonly name = \"CompressionModelUnresolvedError\";\n readonly agentModel: string;\n constructor(agentModel: string) {\n super(\n `Could not resolve a same-family-cheaper-tier compression model for \"${agentModel}\". ` +\n `Provide Agent.create({compression: {model: \"<your-cheaper-model>\"}}) ` +\n `OR add \"${agentModel}\" to the compression-model-registry (see ADR D440).`,\n );\n this.agentModel = agentModel;\n }\n}\n\n/**\n * T2.2 — Resolve a cheaper-tier compression model from the agent's\n * main model id. Pure function — no I/O, no mutation, deterministic.\n *\n * @throws `CompressionModelUnresolvedError` when no rule matches.\n *\n * @internal\n */\nexport function resolveCompressionModel(agentModel: string): string {\n const exact = EXACT_REGISTRY.get(agentModel);\n if (exact !== undefined) return exact;\n const wildcard = matchWildcard(agentModel);\n if (wildcard !== null) return wildcard;\n if (isNoAuthProvider(agentModel)) return agentModel;\n throw new CompressionModelUnresolvedError(agentModel);\n}\n\n/** Wildcard suffix match — Bedrock region-prefixed variants. */\nfunction matchWildcard(agentModel: string): string | null {\n for (const [pattern, replacement] of WILDCARD_REGISTRY) {\n const prefix = pattern.endsWith(\"*\") ? pattern.slice(0, -1) : pattern;\n if (!agentModel.startsWith(prefix)) continue;\n const suffix = agentModel.slice(prefix.length);\n const replPrefix = replacement.endsWith(\"*\") ? replacement.slice(0, -1) : replacement;\n return `${replPrefix}${suffix}`;\n }\n return null;\n}\n\n/** Provider declares `authType: \"none\"` — local runtime, same model. */\nfunction isNoAuthProvider(agentModel: string): boolean {\n const slashIdx = agentModel.indexOf(\"/\");\n if (slashIdx <= 0) return false;\n return NO_AUTH_PROVIDERS.has(agentModel.slice(0, slashIdx));\n}\n","/**\n * T2.2 step 3/N — Compression summarizer (ADR D440).\n *\n * Takes a conversation window (messages to compress) + a resolved\n * compression model + an injected LLM caller, and returns a single\n * system-role summary message that replaces the compressed window.\n *\n * The `callLlm` parameter is dependency-injected so:\n * - Unit tests pass a deterministic fake (no real-LLM cost)\n * - The agent-loop passes a real LLM client bound to the resolved\n * compression config (step 4 wire)\n *\n * Failure mode per ADR D440: if the LLM call fails, throws\n * `CompressionFailedError` — the caller (loop.ts) catches this,\n * logs WARN with redacted metadata, and returns the ORIGINAL\n * conversation unchanged (counter incremented toward cap 3).\n *\n * @internal\n */\n\n// Canonical origin moved to the public `compaction.ts` (leaf type — M42 DTS lesson); re-exported\n// here for the existing internal importers.\nimport type { CompressibleMessage } from \"../../../compaction.js\";\n\nexport type { CompressibleMessage };\n\n/**\n * Typed error thrown when the compression LLM call fails or returns\n * an empty/ineffective summary. The caller catches and handles per\n * ADR D440 failure mode (WARN + original conversation + counter).\n *\n * @public\n */\nexport class CompressionFailedError extends Error {\n override readonly name = \"CompressionFailedError\";\n}\n\n/**\n * Build the summarization prompt from a conversation window.\n * The prompt instructs the LLM to produce a concise summary that\n * preserves all facts, decisions, and context needed for the\n * conversation to continue.\n *\n * @internal\n */\nexport function buildCompressionPrompt(messages: readonly CompressibleMessage[]): string {\n const formatted = messages.map((m) => `[${m.role}]: ${m.content}`).join(\"\\n\\n\");\n\n return (\n `Summarize the following ${messages.length} conversation messages into a concise ` +\n `summary that preserves ALL facts, decisions, user preferences, and context ` +\n `needed for the conversation to continue naturally. The summary will replace ` +\n `these messages in the context window. Be thorough but concise.\\n\\n` +\n `--- CONVERSATION TO SUMMARIZE ---\\n${formatted}\\n--- END ---`\n );\n}\n\nconst COMPRESSION_SYSTEM =\n \"You are a conversation summarizer. Produce a concise factual summary. \" +\n \"Preserve all decisions, preferences, code snippets, and action items. \" +\n \"Do not add commentary or opinions. Output ONLY the summary text.\";\n\n/**\n * Compress a conversation window via an aux-LLM summarization call.\n *\n * @param opts.messages — the messages to compress\n * @param opts.model — resolved compression model id\n * @param opts.callLlm — injected LLM caller `(model, system, user) => Promise<string>`\n * @returns a single system-role message containing the summary\n *\n * @throws `CompressionFailedError` on LLM failure or empty summary.\n *\n * @internal\n */\nexport async function compressConversationWindow(opts: {\n messages: readonly CompressibleMessage[];\n model: string;\n callLlm: (model: string, system: string, user: string) => Promise<string>;\n}): Promise<CompressibleMessage> {\n const userPrompt = buildCompressionPrompt(opts.messages);\n\n let summary: string;\n try {\n summary = await opts.callLlm(opts.model, COMPRESSION_SYSTEM, userPrompt);\n } catch (cause) {\n throw new CompressionFailedError(\n `Compression LLM call failed: ${cause instanceof Error ? cause.message : String(cause)}`,\n { cause: cause instanceof Error ? cause : undefined },\n );\n }\n\n if (!summary || summary.trim().length === 0) {\n throw new CompressionFailedError(\n \"Compression LLM returned empty summary — reduction ineffective.\",\n );\n }\n\n return {\n role: \"system\",\n content: `[Compressed conversation summary]: ${summary.trim()}`,\n };\n}\n","/**\n * M50 (agent-builder) — session-transcript compaction, Codex-faithful.\n *\n * Mirrors the vendored Codex mechanism (`codex-rs/core/src/compact.rs`):\n * - the replacement history = recent USER messages verbatim (newest→oldest under a token budget;\n * prior summaries filtered by marker) + ONE summary message with a textual marker prefix,\n * injected as `role:\"user\"` (`build_compacted_history`, compact.rs:589-663);\n * - persistence is APPEND-ONLY: a `compact_boundary` record becomes the new DAG root and the\n * replacement messages are chained onto it — resume replays boundary→replacement→suffix\n * (equivalent of `CompactedItem.replacement_history`, rollout is never truncated);\n * - a failing summarizer leaves the transcript UNTOUCHED (typed error; no partial state).\n *\n * The summarizer is dependency-injected: tests pass a deterministic fake; the public\n * `Agent.compact` wires the ADR-D440 compression summarizer (its first real caller).\n */\n\nimport { type CompressibleMessage, estimateTokens } from \"../../compaction.js\";\nimport type { SessionStore } from \"../../types/session-store.js\";\nimport { resolveProviderChain } from \"../llm/router.js\";\nimport {\n detectPrimaryProvider,\n inferProviderFromApiKey,\n} from \"../local-agent/real-local-run-provider.js\";\nimport { reconstructMessages, SessionTranscript } from \"../persistence/session-transcript.js\";\nimport { getProviderProfile, registerBuiltins } from \"../providers/index.js\";\nimport { resolveCompressionModel } from \"../runtime/compression/compression-model-registry.js\";\nimport { compressConversationWindow } from \"../runtime/compression/compression-summarizer.js\";\nimport { invalidateSessionCache } from \"./session-cache.js\";\n\n/** Textual marker prefixing every compact summary (Codex `SUMMARY_PREFIX` analog). */\nexport const COMPACT_SUMMARY_MARKER = \"[[theokit:compact-summary]]\";\n\n/** Budget of VERBATIM user messages preserved in the replacement (Codex `COMPACT_USER_MESSAGE_MAX_TOKENS`). */\nexport const COMPACT_USER_MESSAGE_MAX_TOKENS = 20_000;\n\nexport interface CompactLocation {\n cwd: string;\n agentId: string;\n model?: string;\n}\n\nexport interface CompactResult {\n preTokens: number;\n postTokens: number;\n}\n\n/** Is this message a summary produced by a PRIOR compaction? (filtered from verbatim preservation). */\nexport function isCompactSummary(content: string): boolean {\n // M56 — goal-continuation boilerplate is loop plumbing, not user knowledge: preserving N copies of\n // the template verbatim would crowd out real user messages from the preservation budget.\n return (\n content.startsWith(COMPACT_SUMMARY_MARKER) ||\n content.startsWith(\"[[theokit:goal-continuation]]\")\n );\n}\n\n/**\n * Extract the text of an LlmMessage: content is `LlmContentPart[]` — concatenate the `text` parts\n * (tool_call / tool_result / image parts are skipped for compaction purposes).\n */\nfunction plainText(content: unknown): string | undefined {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return undefined;\n const texts = content\n .filter(\n (p): p is { type: string; text: string } =>\n p !== null &&\n typeof p === \"object\" &&\n (p as { type?: unknown }).type === \"text\" &&\n typeof (p as { text?: unknown }).text === \"string\",\n )\n .map((p) => p.text);\n return texts.length > 0 ? texts.join(\"\\n\") : undefined;\n}\n\n/**\n * Compact one session transcript: summarize the reconstructed history, then append (append-only)\n * a `compact_boundary` + the replacement chain (recent user messages verbatim + marker'd summary).\n *\n * @throws whatever `summarize` throws — with the transcript guaranteed untouched.\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: pre-existing (M50) — flagged only because this file was touched by an unrelated one-line M56 change; refactor tracked separately.\nexport async function compactSessionTranscript(opts: {\n store: SessionStore;\n loc: CompactLocation;\n sessionId: string;\n trigger: \"manual\" | \"auto\";\n summarize: (messages: readonly CompressibleMessage[]) => Promise<string>;\n}): Promise<CompactResult> {\n const prior = await opts.store.readRecords(opts.loc.agentId);\n const history = reconstructMessages(prior);\n\n const compressible: CompressibleMessage[] = [];\n for (const m of history) {\n const text = plainText(m.content);\n if (\n text !== undefined &&\n (m.role === \"user\" || m.role === \"assistant\" || m.role === \"system\")\n ) {\n compressible.push({ role: m.role, content: text });\n }\n }\n const preTokens = estimateTokens(compressible.map((m) => m.content).join(\"\\n\"));\n\n // Summarize FIRST — a throwing summarizer must leave the transcript untouched (fail-safe).\n const summaryBody = await opts.summarize(compressible);\n\n // Recent user messages verbatim: newest→oldest under the budget, prior summaries filtered.\n const preserved: string[] = [];\n let budget = 0;\n for (let i = compressible.length - 1; i >= 0; i--) {\n const m = compressible[i];\n if (m === undefined || m.role !== \"user\" || isCompactSummary(m.content)) continue;\n const cost = estimateTokens(m.content);\n if (budget + cost > COMPACT_USER_MESSAGE_MAX_TOKENS) {\n // M50 review F8 — Codex TRUNCATES the overflowing message and keeps the piece\n // (compact.rs:620-629); dropping it entirely loses the most-recent context verbatim.\n const remaining = COMPACT_USER_MESSAGE_MAX_TOKENS - budget;\n if (remaining > 50) {\n preserved.unshift(`${m.content.slice(0, remaining * 4)}\\n[...truncated for compaction...]`);\n }\n break;\n }\n budget += cost;\n preserved.unshift(m.content); // chronological order in the replacement\n }\n\n const summary = `${COMPACT_SUMMARY_MARKER}\\n${summaryBody}`;\n\n // Append-only write: boundary (new root) + replacement chained onto it.\n const transcript = SessionTranscript.fromRecords(prior, {\n cwd: opts.loc.cwd,\n sessionId: opts.sessionId,\n model: opts.loc.model ?? \"unknown\",\n });\n transcript.appendCompactBoundary({ preTokens, trigger: opts.trigger });\n for (const text of preserved) transcript.appendUserTurn(text);\n transcript.appendUserTurn(summary);\n const delta = transcript.records().slice(prior.length);\n await opts.store.appendRecords(opts.loc.agentId, delta);\n\n // M50 review F1 — the live process must FEEL the compaction: drop the in-memory session cache so\n // the next send re-hydrates from disk (replacement + later turns) instead of replaying the full\n // pre-compact history until a restart.\n invalidateSessionCache(opts.loc.cwd, opts.loc.agentId);\n\n const postTokens = estimateTokens([...preserved, summary].join(\"\\n\"));\n return { preTokens, postTokens };\n}\n\n/**\n * M50 review F6 (corrigido no probe) — the summarizer's provider route, PURE and unit-tested.\n * Precedence mirrors the run's M4 rule exactly:\n * 1. an EXPLICIT credential's provider wins (an sk-or- key + `openai/…` model must summarize via\n * OpenRouter — the key is the ground truth of which endpoint gets called);\n * 2. else a model prefix with a REGISTERED profile (the oauth `openai-chatgpt` builtin owns its\n * auth; the M45 fleet resolves its own env vars) routes through that profile;\n * 3. else the ENV-detected provider (fresh process, aggregator credential in env).\n * `fullSlug` marks aggregator routes (provider ≠ prefix): the agent's slug passes unstripped.\n */\nexport function resolveSummarizerRoute(opts: {\n keyProvider: string | undefined;\n modelPrefix: string | undefined;\n prefixHasProfile: boolean;\n envProvider: string;\n}): { provider: string; fullSlug: boolean } {\n const provider =\n opts.keyProvider ??\n (opts.prefixHasProfile && opts.modelPrefix !== undefined ? opts.modelPrefix : opts.envProvider);\n return { provider, fullSlug: provider !== opts.modelPrefix };\n}\n\n// ─── Default summarizer (the ADR-D440 subsystem's first real caller) ─────────────────────────────\n\n/**\n * Build the default summarizer for `Agent.compact`: the D440 `compressConversationWindow`\n * (aux-LLM summarization with typed failure) driven by a router-resolved LLM client. The\n * compression model resolves via the D440 registry with the agent's own model as fallback.\n */\nexport function buildDefaultSummarizer(opts: {\n agentModel: string;\n apiKey?: string;\n}): (messages: readonly CompressibleMessage[]) => Promise<string> {\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: pre-existing (M50) — flagged only because this file was touched by an unrelated one-line M56 change; refactor tracked separately.\n return async (messages) => {\n // Provider resolution mirrors the RUN's own (M4 rule: the explicit API key outranks the model\n // prefix — an sk-or- key + openai/gpt model must summarize via OpenRouter too). Using anything\n // else 401s in real setups (proven live in the M50 probe).\n registerBuiltins();\n const modelPrefix = opts.agentModel.includes(\"/\")\n ? opts.agentModel.slice(0, opts.agentModel.indexOf(\"/\"))\n : undefined;\n const prefixProfile = modelPrefix !== undefined ? getProviderProfile(modelPrefix) : undefined;\n // A prefix profile is only USABLE when its credentials are actually resolvable here: oauth/none\n // profiles own their auth; api_key profiles need one of their env vars set. A profile without a\n // usable credential (e.g. `openai` builtin with only OPENROUTER_API_KEY in env) must NOT win.\n const prefixUsable =\n prefixProfile !== undefined &&\n (prefixProfile.authType !== \"api_key\" ||\n prefixProfile.envVars.some((v) => (process.env[v] ?? \"\").length > 0));\n const route = resolveSummarizerRoute({\n keyProvider: inferProviderFromApiKey(opts.apiKey),\n modelPrefix,\n prefixHasProfile: prefixUsable,\n envProvider: detectPrimaryProvider(),\n });\n const provider = route.provider;\n\n let model: string;\n if (route.fullSlug) {\n // Aggregator route (e.g. OpenRouter): pass the agent's full slug through unstripped.\n model = opts.agentModel;\n } else {\n try {\n model = resolveCompressionModel(opts.agentModel);\n } catch {\n model = opts.agentModel; // registry miss — summarize with the agent's own model\n }\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: pre-existing (M50) — flagged only because this file was touched by an unrelated one-line M56 change; refactor tracked separately.\n const callLlm = async (m: string, system: string, user: string): Promise<string> => {\n const chain = resolveProviderChain({\n primary: provider,\n ...(opts.apiKey !== undefined ? { apiKeys: { [provider]: [opts.apiKey] } } : {}),\n });\n const client = chain[0];\n if (client === undefined) throw new Error(`no LLM client for provider \"${provider}\"`);\n const controller = new AbortController();\n let text = \"\";\n const stream = client.stream(\n { model: m, system, messages: [{ role: \"user\", content: [{ type: \"text\", text: user }] }] },\n controller.signal,\n );\n for (;;) {\n const step = await stream.next();\n if (step.done === true) break;\n if (step.value.type === \"text_delta\") text += step.value.text;\n if (step.value.type === \"error\") throw new Error(step.value.message);\n }\n return text;\n };\n\n const summary = await compressConversationWindow({ messages: [...messages], model, callLlm });\n return summary.content;\n };\n}\n\n// ─── Auto-compaction (Codex formula: fire at usage_real >= (cw*9)/10) ────────────────────────────\n\n/**\n * Should auto-compaction fire? Codex parity: `token_limit_reached` when real usage crosses 90% of\n * the model's context window (`context_window.rs:74-79`; limit default `(cw*9)/10`,\n * `openai_models.rs:459-469`). Missing inputs (no usage reported / model absent from the catalog)\n * NEVER fire — fail-safe toward \"do nothing\".\n */\nexport function shouldAutoCompact(opts: {\n usageTotal?: number | undefined;\n contextWindow?: number | undefined;\n}): boolean {\n if (opts.usageTotal === undefined || opts.contextWindow === undefined) return false;\n if (opts.usageTotal <= 0 || opts.contextWindow <= 0) return false;\n return opts.usageTotal >= Math.floor((opts.contextWindow * 9) / 10);\n}\n\n/** Anti-cascade bookkeeping: last turn we ATTEMPTED an auto-compact, per agent (globalThis — M44 B1). */\nconst autoCompactAttempts = (() => {\n const g = globalThis as unknown as Record<symbol, Map<string, number>>;\n const sym = Symbol.for(\"theokit-sdk.session.auto-compact-attempts\");\n if (g[sym] === undefined) g[sym] = new Map<string, number>();\n return g[sym];\n})();\n\n/**\n * Fire auto-compaction when the threshold is crossed — at most ONE attempt per turn per agent\n * (anti-cascade: a failing summarizer or a non-reducing summary must not loop). Returns whether a\n * compaction actually happened. Failures WARN and leave the transcript untouched.\n */\nexport async function autoCompactIfNeeded(opts: {\n store: SessionStore;\n loc: CompactLocation;\n sessionId: string;\n usageTotal?: number | undefined;\n contextWindow?: number | undefined;\n turnCount: number;\n summarize: (messages: readonly CompressibleMessage[]) => Promise<string>;\n}): Promise<boolean> {\n if (!shouldAutoCompact(opts)) return false;\n const key = `${opts.loc.cwd}::${opts.loc.agentId}`;\n if (autoCompactAttempts.get(key) === opts.turnCount) return false; // already attempted this turn\n autoCompactAttempts.set(key, opts.turnCount);\n try {\n await compactSessionTranscript({\n store: opts.store,\n loc: opts.loc,\n sessionId: opts.sessionId,\n trigger: \"auto\",\n summarize: opts.summarize,\n });\n return true;\n } catch (cause) {\n const msg = cause instanceof Error ? cause.message : String(cause);\n process.stderr.write(\n `[theokit-sdk] auto-compaction failed (left transcript untouched): ${msg}\\n`,\n );\n return false;\n }\n}\n"]}