@copilotkit/aimock 1.45.0 → 1.46.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 (426) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +24 -0
  4. package/README.md +7 -1
  5. package/dist/agui-mock.cjs +25 -25
  6. package/dist/agui-mock.cjs.map +1 -1
  7. package/dist/agui-mock.d.cts.map +1 -1
  8. package/dist/agui-mock.d.ts.map +1 -1
  9. package/dist/agui-mock.js +25 -25
  10. package/dist/agui-mock.js.map +1 -1
  11. package/dist/agui-types.d.ts.map +1 -1
  12. package/dist/aimock-cli.cjs +15 -1
  13. package/dist/aimock-cli.cjs.map +1 -1
  14. package/dist/aimock-cli.d.cts.map +1 -1
  15. package/dist/aimock-cli.d.ts.map +1 -1
  16. package/dist/aimock-cli.js +16 -2
  17. package/dist/aimock-cli.js.map +1 -1
  18. package/dist/api-key-auth.cjs +10 -9
  19. package/dist/api-key-auth.cjs.map +1 -1
  20. package/dist/api-key-auth.d.cts.map +1 -1
  21. package/dist/api-key-auth.d.ts.map +1 -1
  22. package/dist/api-key-auth.js +11 -10
  23. package/dist/api-key-auth.js.map +1 -1
  24. package/dist/batches.cjs +2 -4
  25. package/dist/batches.cjs.map +1 -1
  26. package/dist/batches.d.cts.map +1 -1
  27. package/dist/batches.d.ts.map +1 -1
  28. package/dist/batches.js +2 -4
  29. package/dist/batches.js.map +1 -1
  30. package/dist/bedrock-converse.cjs +61 -80
  31. package/dist/bedrock-converse.cjs.map +1 -1
  32. package/dist/bedrock-converse.d.cts.map +1 -1
  33. package/dist/bedrock-converse.d.ts.map +1 -1
  34. package/dist/bedrock-converse.js +58 -77
  35. package/dist/bedrock-converse.js.map +1 -1
  36. package/dist/bedrock.cjs +65 -97
  37. package/dist/bedrock.cjs.map +1 -1
  38. package/dist/bedrock.d.cts.map +1 -1
  39. package/dist/bedrock.d.ts.map +1 -1
  40. package/dist/bedrock.js +62 -94
  41. package/dist/bedrock.js.map +1 -1
  42. package/dist/byteplus-video.cjs +11 -10
  43. package/dist/byteplus-video.cjs.map +1 -1
  44. package/dist/byteplus-video.d.cts.map +1 -1
  45. package/dist/byteplus-video.d.ts.map +1 -1
  46. package/dist/byteplus-video.js +5 -4
  47. package/dist/byteplus-video.js.map +1 -1
  48. package/dist/chaos.cjs +5 -4
  49. package/dist/chaos.cjs.map +1 -1
  50. package/dist/chaos.d.cts.map +1 -1
  51. package/dist/chaos.d.ts.map +1 -1
  52. package/dist/chaos.js +5 -4
  53. package/dist/chaos.js.map +1 -1
  54. package/dist/cli.cjs +15 -0
  55. package/dist/cli.cjs.map +1 -1
  56. package/dist/cli.js +15 -0
  57. package/dist/cli.js.map +1 -1
  58. package/dist/cohere.cjs +49 -74
  59. package/dist/cohere.cjs.map +1 -1
  60. package/dist/cohere.d.cts.map +1 -1
  61. package/dist/cohere.d.ts.map +1 -1
  62. package/dist/cohere.js +47 -72
  63. package/dist/cohere.js.map +1 -1
  64. package/dist/config-loader.cjs +29 -1
  65. package/dist/config-loader.cjs.map +1 -1
  66. package/dist/config-loader.d.cts +7 -1
  67. package/dist/config-loader.d.cts.map +1 -1
  68. package/dist/config-loader.d.ts +7 -1
  69. package/dist/config-loader.d.ts.map +1 -1
  70. package/dist/config-loader.js +29 -2
  71. package/dist/config-loader.js.map +1 -1
  72. package/dist/count-tokens.cjs +146 -0
  73. package/dist/count-tokens.cjs.map +1 -0
  74. package/dist/count-tokens.js +146 -0
  75. package/dist/count-tokens.js.map +1 -0
  76. package/dist/elevenlabs-audio.cjs +36 -34
  77. package/dist/elevenlabs-audio.cjs.map +1 -1
  78. package/dist/elevenlabs-audio.d.cts.map +1 -1
  79. package/dist/elevenlabs-audio.d.ts.map +1 -1
  80. package/dist/elevenlabs-audio.js +33 -31
  81. package/dist/elevenlabs-audio.js.map +1 -1
  82. package/dist/elevenlabs-voice.cjs +38 -37
  83. package/dist/elevenlabs-voice.cjs.map +1 -1
  84. package/dist/elevenlabs-voice.d.cts.map +1 -1
  85. package/dist/elevenlabs-voice.d.ts.map +1 -1
  86. package/dist/elevenlabs-voice.js +33 -32
  87. package/dist/elevenlabs-voice.js.map +1 -1
  88. package/dist/embedding-request.cjs +16 -0
  89. package/dist/embedding-request.cjs.map +1 -0
  90. package/dist/embedding-request.js +14 -0
  91. package/dist/embedding-request.js.map +1 -0
  92. package/dist/embeddings.cjs +30 -20
  93. package/dist/embeddings.cjs.map +1 -1
  94. package/dist/embeddings.d.cts.map +1 -1
  95. package/dist/embeddings.d.ts.map +1 -1
  96. package/dist/embeddings.js +30 -20
  97. package/dist/embeddings.js.map +1 -1
  98. package/dist/fal-audio.cjs +45 -43
  99. package/dist/fal-audio.cjs.map +1 -1
  100. package/dist/fal-audio.d.cts.map +1 -1
  101. package/dist/fal-audio.d.ts.map +1 -1
  102. package/dist/fal-audio.js +42 -40
  103. package/dist/fal-audio.js.map +1 -1
  104. package/dist/fal.cjs +17 -15
  105. package/dist/fal.cjs.map +1 -1
  106. package/dist/fal.js +16 -14
  107. package/dist/fal.js.map +1 -1
  108. package/dist/files.cjs +2 -4
  109. package/dist/files.cjs.map +1 -1
  110. package/dist/files.d.cts.map +1 -1
  111. package/dist/files.d.ts.map +1 -1
  112. package/dist/files.js +2 -4
  113. package/dist/files.js.map +1 -1
  114. package/dist/fine-tuning.cjs +2 -4
  115. package/dist/fine-tuning.cjs.map +1 -1
  116. package/dist/fine-tuning.d.cts.map +1 -1
  117. package/dist/fine-tuning.d.ts.map +1 -1
  118. package/dist/fine-tuning.js +2 -4
  119. package/dist/fine-tuning.js.map +1 -1
  120. package/dist/fixture-loader.cjs +37 -42
  121. package/dist/fixture-loader.cjs.map +1 -1
  122. package/dist/fixture-loader.d.cts.map +1 -1
  123. package/dist/fixture-loader.d.ts.map +1 -1
  124. package/dist/fixture-loader.js +37 -42
  125. package/dist/fixture-loader.js.map +1 -1
  126. package/dist/gemini-embeddings.cjs +26 -24
  127. package/dist/gemini-embeddings.cjs.map +1 -1
  128. package/dist/gemini-embeddings.js +26 -24
  129. package/dist/gemini-embeddings.js.map +1 -1
  130. package/dist/gemini-interactions.cjs +50 -35
  131. package/dist/gemini-interactions.cjs.map +1 -1
  132. package/dist/gemini-interactions.d.cts +0 -1
  133. package/dist/gemini-interactions.d.cts.map +1 -1
  134. package/dist/gemini-interactions.d.ts +0 -1
  135. package/dist/gemini-interactions.d.ts.map +1 -1
  136. package/dist/gemini-interactions.js +49 -34
  137. package/dist/gemini-interactions.js.map +1 -1
  138. package/dist/gemini.cjs +57 -67
  139. package/dist/gemini.cjs.map +1 -1
  140. package/dist/gemini.d.cts.map +1 -1
  141. package/dist/gemini.d.ts.map +1 -1
  142. package/dist/gemini.js +56 -67
  143. package/dist/gemini.js.map +1 -1
  144. package/dist/grok-video.cjs +14 -12
  145. package/dist/grok-video.cjs.map +1 -1
  146. package/dist/grok-video.d.cts.map +1 -1
  147. package/dist/grok-video.d.ts.map +1 -1
  148. package/dist/grok-video.js +8 -6
  149. package/dist/grok-video.js.map +1 -1
  150. package/dist/helpers.cjs +11 -68
  151. package/dist/helpers.cjs.map +1 -1
  152. package/dist/helpers.d.cts.map +1 -1
  153. package/dist/helpers.d.ts.map +1 -1
  154. package/dist/helpers.js +12 -67
  155. package/dist/helpers.js.map +1 -1
  156. package/dist/images.cjs +30 -28
  157. package/dist/images.cjs.map +1 -1
  158. package/dist/images.d.cts.map +1 -1
  159. package/dist/images.d.ts.map +1 -1
  160. package/dist/images.js +27 -25
  161. package/dist/images.js.map +1 -1
  162. package/dist/index.d.cts +2 -2
  163. package/dist/index.d.ts +2 -2
  164. package/dist/journal.cjs +3 -1
  165. package/dist/journal.cjs.map +1 -1
  166. package/dist/journal.d.cts.map +1 -1
  167. package/dist/journal.d.ts.map +1 -1
  168. package/dist/journal.js +2 -1
  169. package/dist/journal.js.map +1 -1
  170. package/dist/llmock.cjs +3 -0
  171. package/dist/llmock.cjs.map +1 -1
  172. package/dist/llmock.d.cts.map +1 -1
  173. package/dist/llmock.d.ts.map +1 -1
  174. package/dist/llmock.js +3 -0
  175. package/dist/llmock.js.map +1 -1
  176. package/dist/mcp-fakes.d.cts.map +1 -1
  177. package/dist/mcp-handler.cjs +14 -4
  178. package/dist/mcp-handler.cjs.map +1 -1
  179. package/dist/mcp-handler.js +14 -4
  180. package/dist/mcp-handler.js.map +1 -1
  181. package/dist/mcp-recorder.cjs +2 -1
  182. package/dist/mcp-recorder.cjs.map +1 -1
  183. package/dist/mcp-recorder.js +3 -2
  184. package/dist/mcp-recorder.js.map +1 -1
  185. package/dist/messages.cjs +111 -96
  186. package/dist/messages.cjs.map +1 -1
  187. package/dist/messages.d.cts.map +1 -1
  188. package/dist/messages.d.ts.map +1 -1
  189. package/dist/messages.js +109 -95
  190. package/dist/messages.js.map +1 -1
  191. package/dist/metrics.cjs +5 -2
  192. package/dist/metrics.cjs.map +1 -1
  193. package/dist/metrics.d.cts.map +1 -1
  194. package/dist/metrics.d.ts.map +1 -1
  195. package/dist/metrics.js +6 -3
  196. package/dist/metrics.js.map +1 -1
  197. package/dist/model-utils.cjs +1 -0
  198. package/dist/model-utils.cjs.map +1 -1
  199. package/dist/model-utils.js +1 -1
  200. package/dist/model-utils.js.map +1 -1
  201. package/dist/moderation.cjs +15 -12
  202. package/dist/moderation.cjs.map +1 -1
  203. package/dist/moderation.js +14 -11
  204. package/dist/moderation.js.map +1 -1
  205. package/dist/ollama.cjs +128 -68
  206. package/dist/ollama.cjs.map +1 -1
  207. package/dist/ollama.d.cts.map +1 -1
  208. package/dist/ollama.d.ts.map +1 -1
  209. package/dist/ollama.js +124 -64
  210. package/dist/ollama.js.map +1 -1
  211. package/dist/openapi.cjs +323 -3
  212. package/dist/openapi.cjs.map +1 -1
  213. package/dist/openapi.d.cts.map +1 -1
  214. package/dist/openapi.d.ts.map +1 -1
  215. package/dist/openapi.js +324 -4
  216. package/dist/openapi.js.map +1 -1
  217. package/dist/openrouter-chat.cjs +11 -155
  218. package/dist/openrouter-chat.cjs.map +1 -1
  219. package/dist/openrouter-chat.js +11 -155
  220. package/dist/openrouter-chat.js.map +1 -1
  221. package/dist/openrouter-video.cjs +76 -71
  222. package/dist/openrouter-video.cjs.map +1 -1
  223. package/dist/openrouter-video.d.cts.map +1 -1
  224. package/dist/openrouter-video.d.ts.map +1 -1
  225. package/dist/openrouter-video.js +63 -58
  226. package/dist/openrouter-video.js.map +1 -1
  227. package/dist/recorder.cjs +176 -95
  228. package/dist/recorder.cjs.map +1 -1
  229. package/dist/recorder.d.cts.map +1 -1
  230. package/dist/recorder.d.ts.map +1 -1
  231. package/dist/recorder.js +176 -95
  232. package/dist/recorder.js.map +1 -1
  233. package/dist/rerank.cjs +13 -11
  234. package/dist/rerank.cjs.map +1 -1
  235. package/dist/rerank.js +12 -10
  236. package/dist/rerank.js.map +1 -1
  237. package/dist/response/catalog/anthropic-page.cjs +39 -0
  238. package/dist/response/catalog/anthropic-page.cjs.map +1 -0
  239. package/dist/response/catalog/anthropic-page.js +38 -0
  240. package/dist/response/catalog/anthropic-page.js.map +1 -0
  241. package/dist/response/catalog/collect.cjs +61 -0
  242. package/dist/response/catalog/collect.cjs.map +1 -0
  243. package/dist/response/catalog/collect.js +59 -0
  244. package/dist/response/catalog/collect.js.map +1 -0
  245. package/dist/response/catalog/gemini-page.cjs +25 -0
  246. package/dist/response/catalog/gemini-page.cjs.map +1 -0
  247. package/dist/response/catalog/gemini-page.js +24 -0
  248. package/dist/response/catalog/gemini-page.js.map +1 -0
  249. package/dist/response/catalog/render.cjs +182 -0
  250. package/dist/response/catalog/render.cjs.map +1 -0
  251. package/dist/response/catalog/render.js +171 -0
  252. package/dist/response/catalog/render.js.map +1 -0
  253. package/dist/response/errors.cjs +225 -0
  254. package/dist/response/errors.cjs.map +1 -0
  255. package/dist/response/errors.js +224 -0
  256. package/dist/response/errors.js.map +1 -0
  257. package/dist/response/finish.cjs +39 -0
  258. package/dist/response/finish.cjs.map +1 -0
  259. package/dist/response/finish.js +35 -0
  260. package/dist/response/finish.js.map +1 -0
  261. package/dist/response/policy.cjs +126 -0
  262. package/dist/response/policy.cjs.map +1 -0
  263. package/dist/response/policy.js +120 -0
  264. package/dist/response/policy.js.map +1 -0
  265. package/dist/response/profiles.cjs +69 -0
  266. package/dist/response/profiles.cjs.map +1 -0
  267. package/dist/response/profiles.js +65 -0
  268. package/dist/response/profiles.js.map +1 -0
  269. package/dist/response/usage/codecs/anthropic.cjs +52 -0
  270. package/dist/response/usage/codecs/anthropic.cjs.map +1 -0
  271. package/dist/response/usage/codecs/anthropic.js +50 -0
  272. package/dist/response/usage/codecs/anthropic.js.map +1 -0
  273. package/dist/response/usage/codecs/cohere.cjs +36 -0
  274. package/dist/response/usage/codecs/cohere.cjs.map +1 -0
  275. package/dist/response/usage/codecs/cohere.js +35 -0
  276. package/dist/response/usage/codecs/cohere.js.map +1 -0
  277. package/dist/response/usage/codecs/converse.cjs +16 -0
  278. package/dist/response/usage/codecs/converse.cjs.map +1 -0
  279. package/dist/response/usage/codecs/converse.js +15 -0
  280. package/dist/response/usage/codecs/converse.js.map +1 -0
  281. package/dist/response/usage/codecs/gemini.cjs +31 -0
  282. package/dist/response/usage/codecs/gemini.cjs.map +1 -0
  283. package/dist/response/usage/codecs/gemini.js +31 -0
  284. package/dist/response/usage/codecs/gemini.js.map +1 -0
  285. package/dist/response/usage/codecs/interactions.cjs +22 -0
  286. package/dist/response/usage/codecs/interactions.cjs.map +1 -0
  287. package/dist/response/usage/codecs/interactions.js +21 -0
  288. package/dist/response/usage/codecs/interactions.js.map +1 -0
  289. package/dist/response/usage/codecs/ollama.cjs +17 -0
  290. package/dist/response/usage/codecs/ollama.cjs.map +1 -0
  291. package/dist/response/usage/codecs/ollama.js +17 -0
  292. package/dist/response/usage/codecs/ollama.js.map +1 -0
  293. package/dist/response/usage/codecs/openai.cjs +52 -0
  294. package/dist/response/usage/codecs/openai.cjs.map +1 -0
  295. package/dist/response/usage/codecs/openai.js +50 -0
  296. package/dist/response/usage/codecs/openai.js.map +1 -0
  297. package/dist/response/usage/codecs/openrouter.cjs +68 -0
  298. package/dist/response/usage/codecs/openrouter.cjs.map +1 -0
  299. package/dist/response/usage/codecs/openrouter.js +67 -0
  300. package/dist/response/usage/codecs/openrouter.js.map +1 -0
  301. package/dist/response/usage/codecs/realtime.cjs +19 -0
  302. package/dist/response/usage/codecs/realtime.cjs.map +1 -0
  303. package/dist/response/usage/codecs/realtime.js +18 -0
  304. package/dist/response/usage/codecs/realtime.js.map +1 -0
  305. package/dist/response/usage/codecs/responses.cjs +21 -0
  306. package/dist/response/usage/codecs/responses.cjs.map +1 -0
  307. package/dist/response/usage/codecs/responses.js +20 -0
  308. package/dist/response/usage/codecs/responses.js.map +1 -0
  309. package/dist/response/usage/estimate.cjs +23 -0
  310. package/dist/response/usage/estimate.cjs.map +1 -0
  311. package/dist/response/usage/estimate.js +21 -0
  312. package/dist/response/usage/estimate.js.map +1 -0
  313. package/dist/response/usage/fields.cjs +72 -0
  314. package/dist/response/usage/fields.cjs.map +1 -0
  315. package/dist/response/usage/fields.js +70 -0
  316. package/dist/response/usage/fields.js.map +1 -0
  317. package/dist/response/usage/recording.cjs +52 -0
  318. package/dist/response/usage/recording.cjs.map +1 -0
  319. package/dist/response/usage/recording.js +52 -0
  320. package/dist/response/usage/recording.js.map +1 -0
  321. package/dist/responses.cjs +45 -58
  322. package/dist/responses.cjs.map +1 -1
  323. package/dist/responses.d.cts.map +1 -1
  324. package/dist/responses.d.ts.map +1 -1
  325. package/dist/responses.js +44 -57
  326. package/dist/responses.js.map +1 -1
  327. package/dist/route-registry.cjs +45 -0
  328. package/dist/route-registry.cjs.map +1 -1
  329. package/dist/route-registry.d.cts.map +1 -1
  330. package/dist/route-registry.d.ts.map +1 -1
  331. package/dist/route-registry.js +41 -1
  332. package/dist/route-registry.js.map +1 -1
  333. package/dist/router.cjs +4 -0
  334. package/dist/router.cjs.map +1 -1
  335. package/dist/router.d.cts.map +1 -1
  336. package/dist/router.d.ts.map +1 -1
  337. package/dist/router.js +3 -0
  338. package/dist/router.js.map +1 -1
  339. package/dist/search.cjs +13 -11
  340. package/dist/search.cjs.map +1 -1
  341. package/dist/search.js +12 -10
  342. package/dist/search.js.map +1 -1
  343. package/dist/server.cjs +222 -146
  344. package/dist/server.cjs.map +1 -1
  345. package/dist/server.d.cts.map +1 -1
  346. package/dist/server.d.ts.map +1 -1
  347. package/dist/server.js +223 -147
  348. package/dist/server.js.map +1 -1
  349. package/dist/speech.cjs +20 -18
  350. package/dist/speech.cjs.map +1 -1
  351. package/dist/speech.d.cts.map +1 -1
  352. package/dist/speech.d.ts.map +1 -1
  353. package/dist/speech.js +19 -17
  354. package/dist/speech.js.map +1 -1
  355. package/dist/sse-writer.cjs +7 -0
  356. package/dist/sse-writer.cjs.map +1 -1
  357. package/dist/sse-writer.d.cts.map +1 -1
  358. package/dist/sse-writer.d.ts.map +1 -1
  359. package/dist/sse-writer.js +7 -1
  360. package/dist/sse-writer.js.map +1 -1
  361. package/dist/stream-collapse.cjs +118 -11
  362. package/dist/stream-collapse.cjs.map +1 -1
  363. package/dist/stream-collapse.d.cts +10 -9
  364. package/dist/stream-collapse.d.cts.map +1 -1
  365. package/dist/stream-collapse.d.ts +10 -9
  366. package/dist/stream-collapse.d.ts.map +1 -1
  367. package/dist/stream-collapse.js +118 -11
  368. package/dist/stream-collapse.js.map +1 -1
  369. package/dist/transcription.cjs +12 -10
  370. package/dist/transcription.cjs.map +1 -1
  371. package/dist/transcription.d.cts.map +1 -1
  372. package/dist/transcription.d.ts.map +1 -1
  373. package/dist/transcription.js +11 -9
  374. package/dist/transcription.js.map +1 -1
  375. package/dist/types.cjs.map +1 -1
  376. package/dist/types.d.cts +62 -3
  377. package/dist/types.d.cts.map +1 -1
  378. package/dist/types.d.ts +62 -3
  379. package/dist/types.d.ts.map +1 -1
  380. package/dist/types.js.map +1 -1
  381. package/dist/vector-mock.cjs +3 -8
  382. package/dist/vector-mock.cjs.map +1 -1
  383. package/dist/vector-mock.d.cts.map +1 -1
  384. package/dist/vector-mock.d.ts.map +1 -1
  385. package/dist/vector-mock.js +3 -8
  386. package/dist/vector-mock.js.map +1 -1
  387. package/dist/vector-stores.cjs +2 -4
  388. package/dist/vector-stores.cjs.map +1 -1
  389. package/dist/vector-stores.d.cts.map +1 -1
  390. package/dist/vector-stores.d.ts.map +1 -1
  391. package/dist/vector-stores.js +2 -4
  392. package/dist/vector-stores.js.map +1 -1
  393. package/dist/veo-video.cjs +16 -14
  394. package/dist/veo-video.cjs.map +1 -1
  395. package/dist/veo-video.js +10 -8
  396. package/dist/veo-video.js.map +1 -1
  397. package/dist/video.cjs +21 -19
  398. package/dist/video.cjs.map +1 -1
  399. package/dist/video.d.cts.map +1 -1
  400. package/dist/video.d.ts.map +1 -1
  401. package/dist/video.js +20 -18
  402. package/dist/video.js.map +1 -1
  403. package/dist/ws-gemini-live.cjs +11 -3
  404. package/dist/ws-gemini-live.cjs.map +1 -1
  405. package/dist/ws-gemini-live.d.cts +0 -1
  406. package/dist/ws-gemini-live.d.cts.map +1 -1
  407. package/dist/ws-gemini-live.d.ts +0 -1
  408. package/dist/ws-gemini-live.d.ts.map +1 -1
  409. package/dist/ws-gemini-live.js +10 -2
  410. package/dist/ws-gemini-live.js.map +1 -1
  411. package/dist/ws-live.cjs +6 -5
  412. package/dist/ws-live.cjs.map +1 -1
  413. package/dist/ws-live.js +5 -4
  414. package/dist/ws-live.js.map +1 -1
  415. package/dist/ws-realtime.cjs +28 -54
  416. package/dist/ws-realtime.cjs.map +1 -1
  417. package/dist/ws-realtime.d.cts.map +1 -1
  418. package/dist/ws-realtime.d.ts.map +1 -1
  419. package/dist/ws-realtime.js +25 -51
  420. package/dist/ws-realtime.js.map +1 -1
  421. package/dist/ws-responses.cjs +8 -6
  422. package/dist/ws-responses.cjs.map +1 -1
  423. package/dist/ws-responses.js +7 -5
  424. package/dist/ws-responses.js.map +1 -1
  425. package/package.json +4 -1
  426. package/skills/write-fixtures/SKILL.md +25 -16
@@ -0,0 +1,224 @@
1
+ import { errorProfiles } from "./profiles.js";
2
+
3
+ //#region src/response/errors.ts
4
+ function buildOpenAIError(input, details) {
5
+ if (input === "service-validation") {
6
+ if (!details) throw new TypeError("Missing service validation error details");
7
+ return { error: {
8
+ message: details.message,
9
+ type: errorProfiles.openai.validationType
10
+ } };
11
+ }
12
+ if (input === "openrouter-error") {
13
+ if (!details || typeof details.code !== "number") throw new TypeError("Missing OpenRouter numeric error details");
14
+ return { error: {
15
+ code: details.code,
16
+ message: details.message,
17
+ ...details.metadata !== void 0 && { metadata: details.metadata }
18
+ } };
19
+ }
20
+ return {
21
+ message: input.message,
22
+ type: input.type,
23
+ ...input.includeParam === true ? { param: input.param ?? null } : {},
24
+ code: input.code
25
+ };
26
+ }
27
+ /** Native purpose templates preserve field presence and insertion order. No status or I/O. */
28
+ function renderError(wire, purpose, details) {
29
+ if (wire === "ollama-embed") return { body: JSON.stringify({ error: details.message }) };
30
+ const profile = errorProfiles[wire];
31
+ if (wire === "interactions" && (purpose === "validation" || purpose === "strict-miss" || purpose === "fixture-miss" || purpose === "fixture" || purpose === "misbehavior" || purpose === "unknown-response")) return { body: JSON.stringify({ error: {
32
+ code: details.code ?? "INVALID_ARGUMENT",
33
+ message: details.message
34
+ } }) };
35
+ switch (purpose) {
36
+ case "authentication":
37
+ if (wire === "messages") return { body: JSON.stringify({
38
+ type: "error",
39
+ error: {
40
+ type: "authentication_error",
41
+ message: details.message
42
+ }
43
+ }) };
44
+ if (wire === "gemini") return { body: JSON.stringify({ error: {
45
+ code: 401,
46
+ message: details.message,
47
+ status: "UNAUTHENTICATED"
48
+ } }) };
49
+ return renderError(wire, "legacy-auth", details);
50
+ case "legacy-auth": return { body: JSON.stringify({ error: {
51
+ message: details.message,
52
+ type: "authentication_error",
53
+ code: "invalid_api_key"
54
+ } }) };
55
+ case "stream-failure": return { body: JSON.stringify({ error: { message: details.message } }) };
56
+ case "route-failure": return { body: JSON.stringify({ error: {
57
+ message: details.message,
58
+ type: details.type
59
+ } }) };
60
+ case "invalid-misbehavior-header":
61
+ if (wire === "ollama") return { body: JSON.stringify({ error: details.message }) };
62
+ if (wire === "cohere") return { body: JSON.stringify({ message: details.message }) };
63
+ if (wire === "interactions") return { body: JSON.stringify({ error: {
64
+ code: details.code,
65
+ message: details.message
66
+ } }) };
67
+ if (wire === "gemini") return { body: JSON.stringify({ error: {
68
+ code: 400,
69
+ message: details.message,
70
+ status: "INVALID_ARGUMENT"
71
+ } }) };
72
+ if (wire === "messages") return { body: JSON.stringify({
73
+ type: "error",
74
+ error: {
75
+ type: profile.validationType,
76
+ code: details.code,
77
+ message: details.message
78
+ }
79
+ }) };
80
+ if (wire === "bedrock" || wire === "bedrock-converse") return { body: JSON.stringify({
81
+ __type: "ValidationException",
82
+ message: details.message
83
+ }) };
84
+ return { body: JSON.stringify({ error: {
85
+ message: details.message,
86
+ type: profile.validationType,
87
+ code: details.code
88
+ } }) };
89
+ case "validation":
90
+ case "strict-miss":
91
+ case "fixture-miss":
92
+ if (wire === "gemini") return { body: JSON.stringify({ error: {
93
+ message: details.message,
94
+ code: details.bodyCode,
95
+ status: details.status
96
+ } }) };
97
+ if (wire === "openai") return { body: JSON.stringify({ error: buildOpenAIError({
98
+ ...details,
99
+ type: details.type ?? profile.validationType
100
+ }) }) };
101
+ return { body: JSON.stringify({ error: {
102
+ message: details.message,
103
+ type: details.type ?? profile.validationType
104
+ } }) };
105
+ case "thinking": return { body: JSON.stringify({
106
+ type: "error",
107
+ error: {
108
+ type: details.type ?? profile.validationType,
109
+ message: details.message
110
+ },
111
+ ...wire === "messages" && details.requestId !== void 0 ? { request_id: details.requestId } : {}
112
+ }) };
113
+ case "fixture":
114
+ if (wire === "gemini") return { body: JSON.stringify({ error: {
115
+ code: details.bodyCode,
116
+ message: details.message,
117
+ status: details.status
118
+ } }) };
119
+ if (wire === "openai") return { body: JSON.stringify({ error: {
120
+ message: details.message,
121
+ type: details.type ?? profile.fixtureType,
122
+ param: details.param ?? null,
123
+ code: details.code ?? null
124
+ } }) };
125
+ return { body: JSON.stringify({
126
+ type: "error",
127
+ error: {
128
+ type: details.type ?? profile.fixtureType,
129
+ message: details.message
130
+ }
131
+ }) };
132
+ case "tool-argument":
133
+ if (wire === "ollama") return { body: JSON.stringify({
134
+ error: details.message,
135
+ code: details.code
136
+ }) };
137
+ if (wire === "interactions") return { body: JSON.stringify({ error: {
138
+ code: details.code,
139
+ message: details.message
140
+ } }) };
141
+ if (wire === "gemini") return { body: JSON.stringify({ error: {
142
+ code: 500,
143
+ message: details.message,
144
+ status: "INTERNAL",
145
+ details: details.googleDetails
146
+ } }) };
147
+ if (wire === "bedrock" || wire === "bedrock-converse") return { body: JSON.stringify({
148
+ __type: details.type ?? errorProfiles.bedrock.toolArgumentType,
149
+ message: details.message,
150
+ reason: details.code
151
+ }) };
152
+ if (wire === "messages") return { body: JSON.stringify({
153
+ type: "error",
154
+ error: {
155
+ type: details.type ?? profile.fixtureType,
156
+ code: details.code,
157
+ message: details.message
158
+ }
159
+ }) };
160
+ return { body: JSON.stringify({ error: {
161
+ message: details.message,
162
+ type: details.type ?? profile.fixtureType,
163
+ code: details.code
164
+ } }) };
165
+ case "misbehavior":
166
+ if (wire === "openai") return { body: JSON.stringify({ error: buildOpenAIError(details) }) };
167
+ if (wire === "gemini") return { body: JSON.stringify({ error: {
168
+ code: details.bodyCode,
169
+ message: details.message,
170
+ status: details.status
171
+ } }) };
172
+ if (wire === "cohere") return { body: JSON.stringify({
173
+ message: details.message,
174
+ code: details.code
175
+ }) };
176
+ if (wire === "ollama") return { body: JSON.stringify({ error: `${details.code}: ${details.message}` }) };
177
+ if (wire === "bedrock-converse") return {
178
+ body: JSON.stringify({
179
+ __type: details.type,
180
+ message: details.message,
181
+ code: details.code
182
+ }),
183
+ headers: details.type === void 0 || details.type === null ? void 0 : { "x-amzn-errortype": details.type }
184
+ };
185
+ if (wire === "bedrock") return {
186
+ body: JSON.stringify({
187
+ __type: details.type,
188
+ code: details.code,
189
+ message: details.message
190
+ }),
191
+ headers: details.type === void 0 || details.type === null ? void 0 : { "x-amzn-errortype": details.type }
192
+ };
193
+ return { body: JSON.stringify({
194
+ type: "error",
195
+ error: {
196
+ type: details.type,
197
+ code: details.code,
198
+ message: details.message
199
+ }
200
+ }) };
201
+ case "unknown-response":
202
+ if (wire === "gemini") return { body: JSON.stringify({ error: {
203
+ message: details.message,
204
+ code: details.bodyCode,
205
+ status: details.status
206
+ } }) };
207
+ if (wire === "openai") return { body: JSON.stringify({ error: buildOpenAIError({
208
+ ...details,
209
+ type: details.type ?? "server_error"
210
+ }) }) };
211
+ return { body: JSON.stringify({ error: {
212
+ message: details.message,
213
+ type: details.type ?? "server_error"
214
+ } }) };
215
+ case "transport-failure": return { body: JSON.stringify({ error: {
216
+ message: details.message,
217
+ type: details.type ?? "proxy_error"
218
+ } }) };
219
+ }
220
+ }
221
+
222
+ //#endregion
223
+ export { buildOpenAIError, renderError };
224
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","names":[],"sources":["../../src/response/errors.ts"],"sourcesContent":["import { errorProfiles, type ErrorWire } from \"./profiles.js\";\n\nexport type ErrorPurpose =\n | \"validation\"\n | \"strict-miss\"\n | \"fixture-miss\"\n | \"thinking\"\n | \"fixture\"\n | \"tool-argument\"\n | \"misbehavior\"\n | \"unknown-response\"\n | \"transport-failure\"\n | \"route-failure\"\n | \"stream-failure\"\n | \"invalid-misbehavior-header\"\n | \"authentication\"\n | \"legacy-auth\";\n\nexport interface ErrorDetails {\n message: string;\n type?: string | null;\n param?: string | null;\n /** Explicitly retain the native OpenAI param slot; omitted preserves legacy templates. */\n includeParam?: true;\n /** Normalized correlation metadata explicitly supplied by native header-policy rejects. */\n requestId?: string;\n code?: string | null;\n bodyCode?: number;\n status?: string | null;\n googleDetails?: {\n \"@type\": string;\n reason: string;\n domain: string;\n metadata: { code: string };\n }[];\n}\n\ntype OpenAIInnerDetails = Pick<\n ErrorDetails,\n \"message\" | \"type\" | \"param\" | \"code\" | \"includeParam\"\n>;\ntype OpenAIInnerBody = {\n message: string;\n type?: string | null;\n param?: string | null;\n code?: string | null;\n};\ntype ServiceValidationBody = { error: { message: string; type: string } };\ntype OpenRouterErrorBody = {\n error: { code: number; message: string; metadata?: Record<string, unknown> };\n};\n\n/** Common error owner; fixed native forms preserve caller signatures and ordering. */\nexport function buildOpenAIError(details: OpenAIInnerDetails): OpenAIInnerBody;\nexport function buildOpenAIError(\n purpose: \"service-validation\",\n details: { message: string },\n): ServiceValidationBody;\nexport function buildOpenAIError(\n purpose: \"openrouter-error\",\n details: { code: number; message: string; metadata?: Record<string, unknown> },\n): OpenRouterErrorBody;\nexport function buildOpenAIError(\n input: OpenAIInnerDetails | \"service-validation\" | \"openrouter-error\",\n details?: { message: string; code?: number; metadata?: Record<string, unknown> },\n): OpenAIInnerBody | ServiceValidationBody | OpenRouterErrorBody {\n if (input === \"service-validation\") {\n if (!details) throw new TypeError(\"Missing service validation error details\");\n return {\n error: { message: details.message, type: errorProfiles.openai.validationType },\n };\n }\n if (input === \"openrouter-error\") {\n if (!details || typeof details.code !== \"number\")\n throw new TypeError(\"Missing OpenRouter numeric error details\");\n return {\n error: {\n code: details.code,\n message: details.message,\n ...(details.metadata !== undefined && { metadata: details.metadata }),\n },\n };\n }\n return {\n message: input.message,\n type: input.type,\n ...(input.includeParam === true ? { param: input.param ?? null } : {}),\n code: input.code,\n };\n}\n\n/** Native purpose templates preserve field presence and insertion order. No status or I/O. */\nexport function renderError(\n wire: ErrorWire,\n purpose: ErrorPurpose,\n details: ErrorDetails,\n): { body: string; headers?: Record<string, string> } {\n if (wire === \"ollama-embed\") {\n return { body: JSON.stringify({ error: details.message }) };\n }\n const profile = errorProfiles[wire];\n if (\n wire === \"interactions\" &&\n (purpose === \"validation\" ||\n purpose === \"strict-miss\" ||\n purpose === \"fixture-miss\" ||\n purpose === \"fixture\" ||\n purpose === \"misbehavior\" ||\n purpose === \"unknown-response\")\n ) {\n return {\n body: JSON.stringify({\n error: { code: details.code ?? \"INVALID_ARGUMENT\", message: details.message },\n }),\n };\n }\n switch (purpose) {\n case \"authentication\":\n if (wire === \"messages\") {\n return {\n body: JSON.stringify({\n type: \"error\",\n error: { type: \"authentication_error\", message: details.message },\n }),\n };\n }\n if (wire === \"gemini\") {\n return {\n body: JSON.stringify({\n error: { code: 401, message: details.message, status: \"UNAUTHENTICATED\" },\n }),\n };\n }\n return renderError(wire, \"legacy-auth\", details);\n case \"legacy-auth\":\n return {\n body: JSON.stringify({\n error: {\n message: details.message,\n type: \"authentication_error\",\n code: \"invalid_api_key\",\n },\n }),\n };\n case \"stream-failure\":\n return { body: JSON.stringify({ error: { message: details.message } }) };\n case \"route-failure\":\n return {\n body: JSON.stringify({ error: { message: details.message, type: details.type } }),\n };\n case \"invalid-misbehavior-header\":\n if (wire === \"ollama\") return { body: JSON.stringify({ error: details.message }) };\n if (wire === \"cohere\") return { body: JSON.stringify({ message: details.message }) };\n if (wire === \"interactions\") {\n return {\n body: JSON.stringify({ error: { code: details.code, message: details.message } }),\n };\n }\n if (wire === \"gemini\") {\n return {\n body: JSON.stringify({\n error: { code: 400, message: details.message, status: \"INVALID_ARGUMENT\" },\n }),\n };\n }\n if (wire === \"messages\") {\n return {\n body: JSON.stringify({\n type: \"error\",\n error: { type: profile.validationType, code: details.code, message: details.message },\n }),\n };\n }\n if (wire === \"bedrock\" || wire === \"bedrock-converse\") {\n return {\n body: JSON.stringify({ __type: \"ValidationException\", message: details.message }),\n };\n }\n return {\n body: JSON.stringify({\n error: { message: details.message, type: profile.validationType, code: details.code },\n }),\n };\n case \"validation\":\n case \"strict-miss\":\n case \"fixture-miss\":\n if (wire === \"gemini\") {\n return {\n body: JSON.stringify({\n error: { message: details.message, code: details.bodyCode, status: details.status },\n }),\n };\n }\n if (wire === \"openai\") {\n return {\n body: JSON.stringify({\n error: buildOpenAIError({\n ...details,\n type: details.type ?? profile.validationType,\n }),\n }),\n };\n }\n return {\n body: JSON.stringify({\n error: { message: details.message, type: details.type ?? profile.validationType },\n }),\n };\n case \"thinking\":\n return {\n body: JSON.stringify({\n type: \"error\",\n error: { type: details.type ?? profile.validationType, message: details.message },\n ...(wire === \"messages\" && details.requestId !== undefined\n ? { request_id: details.requestId }\n : {}),\n }),\n };\n case \"fixture\":\n if (wire === \"gemini\") {\n return {\n body: JSON.stringify({\n error: { code: details.bodyCode, message: details.message, status: details.status },\n }),\n };\n }\n if (wire === \"openai\") {\n return {\n body: JSON.stringify({\n error: {\n message: details.message,\n type: details.type ?? profile.fixtureType,\n param: details.param ?? null,\n code: details.code ?? null,\n },\n }),\n };\n }\n return {\n body: JSON.stringify({\n type: \"error\",\n error: { type: details.type ?? profile.fixtureType, message: details.message },\n }),\n };\n case \"tool-argument\":\n if (wire === \"ollama\") {\n return { body: JSON.stringify({ error: details.message, code: details.code }) };\n }\n if (wire === \"interactions\") {\n return {\n body: JSON.stringify({ error: { code: details.code, message: details.message } }),\n };\n }\n if (wire === \"gemini\") {\n return {\n body: JSON.stringify({\n error: {\n code: 500,\n message: details.message,\n status: \"INTERNAL\",\n details: details.googleDetails,\n },\n }),\n };\n }\n if (wire === \"bedrock\" || wire === \"bedrock-converse\") {\n return {\n body: JSON.stringify({\n __type: details.type ?? errorProfiles.bedrock.toolArgumentType,\n message: details.message,\n reason: details.code,\n }),\n };\n }\n if (wire === \"messages\") {\n return {\n body: JSON.stringify({\n type: \"error\",\n error: {\n type: details.type ?? profile.fixtureType,\n code: details.code,\n message: details.message,\n },\n }),\n };\n }\n return {\n body: JSON.stringify({\n error: {\n message: details.message,\n type: details.type ?? profile.fixtureType,\n code: details.code,\n },\n }),\n };\n case \"misbehavior\":\n if (wire === \"openai\") {\n return { body: JSON.stringify({ error: buildOpenAIError(details) }) };\n }\n if (wire === \"gemini\") {\n return {\n body: JSON.stringify({\n error: { code: details.bodyCode, message: details.message, status: details.status },\n }),\n };\n }\n if (wire === \"cohere\") {\n return { body: JSON.stringify({ message: details.message, code: details.code }) };\n }\n if (wire === \"ollama\") {\n return { body: JSON.stringify({ error: `${details.code}: ${details.message}` }) };\n }\n if (wire === \"bedrock-converse\") {\n return {\n body: JSON.stringify({\n __type: details.type,\n message: details.message,\n code: details.code,\n }),\n headers:\n details.type === undefined || details.type === null\n ? undefined\n : { \"x-amzn-errortype\": details.type },\n };\n }\n if (wire === \"bedrock\") {\n return {\n body: JSON.stringify({\n __type: details.type,\n code: details.code,\n message: details.message,\n }),\n headers:\n details.type === undefined || details.type === null\n ? undefined\n : { \"x-amzn-errortype\": details.type },\n };\n }\n return {\n body: JSON.stringify({\n type: \"error\",\n error: { type: details.type, code: details.code, message: details.message },\n }),\n };\n case \"unknown-response\":\n if (wire === \"gemini\") {\n return {\n body: JSON.stringify({\n error: { message: details.message, code: details.bodyCode, status: details.status },\n }),\n };\n }\n if (wire === \"openai\") {\n return {\n body: JSON.stringify({\n error: buildOpenAIError({ ...details, type: details.type ?? \"server_error\" }),\n }),\n };\n }\n return {\n body: JSON.stringify({\n error: { message: details.message, type: details.type ?? \"server_error\" },\n }),\n };\n case \"transport-failure\":\n return {\n body: JSON.stringify({\n error: { message: details.message, type: details.type ?? \"proxy_error\" },\n }),\n };\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+
2
+ //#region src/response/finish.ts
3
+ /** Caller defaults stay with the wire; unknown native reasons pass through unchanged. */
4
+ function mapAnthropicFinish(finishReason) {
5
+ if (finishReason === "stop") return "end_turn";
6
+ if (finishReason === "tool_calls") return "tool_use";
7
+ if (finishReason === "length") return "max_tokens";
8
+ return finishReason;
9
+ }
10
+ /** Responses status has its own table; caller defaults remain outside the mapper. */
11
+ function mapResponsesFinish(finishReason) {
12
+ if (finishReason === "stop") return "completed";
13
+ if (finishReason === "tool_calls") return "completed";
14
+ if (finishReason === "length") return "incomplete";
15
+ if (finishReason === "content_filter") return "failed";
16
+ return finishReason;
17
+ }
18
+ /** Gemini and Vertex keep their distinct native finish reasons and caller defaults. */
19
+ function mapGeminiFinish(finishReason) {
20
+ if (finishReason === "stop") return "STOP";
21
+ if (finishReason === "tool_calls") return "FUNCTION_CALL";
22
+ if (finishReason === "length") return "MAX_TOKENS";
23
+ if (finishReason === "content_filter") return "SAFETY";
24
+ return finishReason;
25
+ }
26
+ /** Cohere has its own native finish table; callers retain their falsy defaults. */
27
+ function mapCohereFinish(finishReason) {
28
+ if (finishReason === "stop") return "COMPLETE";
29
+ if (finishReason === "tool_calls") return "TOOL_CALL";
30
+ if (finishReason === "length") return "MAX_TOKENS";
31
+ return finishReason;
32
+ }
33
+
34
+ //#endregion
35
+ exports.mapAnthropicFinish = mapAnthropicFinish;
36
+ exports.mapCohereFinish = mapCohereFinish;
37
+ exports.mapGeminiFinish = mapGeminiFinish;
38
+ exports.mapResponsesFinish = mapResponsesFinish;
39
+ //# sourceMappingURL=finish.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finish.cjs","names":[],"sources":["../../src/response/finish.ts"],"sourcesContent":["/** Caller defaults stay with the wire; unknown native reasons pass through unchanged. */\nexport function mapAnthropicFinish(finishReason: string): string {\n if (finishReason === \"stop\") return \"end_turn\";\n if (finishReason === \"tool_calls\") return \"tool_use\";\n if (finishReason === \"length\") return \"max_tokens\";\n return finishReason;\n}\n\n/** Responses status has its own table; caller defaults remain outside the mapper. */\nexport function mapResponsesFinish(finishReason: string): string {\n if (finishReason === \"stop\") return \"completed\";\n if (finishReason === \"tool_calls\") return \"completed\";\n if (finishReason === \"length\") return \"incomplete\";\n if (finishReason === \"content_filter\") return \"failed\";\n return finishReason;\n}\n\n/** Gemini and Vertex keep their distinct native finish reasons and caller defaults. */\nexport function mapGeminiFinish(finishReason: string): string {\n if (finishReason === \"stop\") return \"STOP\";\n if (finishReason === \"tool_calls\") return \"FUNCTION_CALL\";\n if (finishReason === \"length\") return \"MAX_TOKENS\";\n if (finishReason === \"content_filter\") return \"SAFETY\";\n return finishReason;\n}\n\n/** Cohere has its own native finish table; callers retain their falsy defaults. */\nexport function mapCohereFinish(finishReason: string): string {\n if (finishReason === \"stop\") return \"COMPLETE\";\n if (finishReason === \"tool_calls\") return \"TOOL_CALL\";\n if (finishReason === \"length\") return \"MAX_TOKENS\";\n return finishReason;\n}\n"],"mappings":";;;AACA,SAAgB,mBAAmB,cAA8B;AAC/D,KAAI,iBAAiB,OAAQ,QAAO;AACpC,KAAI,iBAAiB,aAAc,QAAO;AAC1C,KAAI,iBAAiB,SAAU,QAAO;AACtC,QAAO;;;AAIT,SAAgB,mBAAmB,cAA8B;AAC/D,KAAI,iBAAiB,OAAQ,QAAO;AACpC,KAAI,iBAAiB,aAAc,QAAO;AAC1C,KAAI,iBAAiB,SAAU,QAAO;AACtC,KAAI,iBAAiB,iBAAkB,QAAO;AAC9C,QAAO;;;AAIT,SAAgB,gBAAgB,cAA8B;AAC5D,KAAI,iBAAiB,OAAQ,QAAO;AACpC,KAAI,iBAAiB,aAAc,QAAO;AAC1C,KAAI,iBAAiB,SAAU,QAAO;AACtC,KAAI,iBAAiB,iBAAkB,QAAO;AAC9C,QAAO;;;AAIT,SAAgB,gBAAgB,cAA8B;AAC5D,KAAI,iBAAiB,OAAQ,QAAO;AACpC,KAAI,iBAAiB,aAAc,QAAO;AAC1C,KAAI,iBAAiB,SAAU,QAAO;AACtC,QAAO"}
@@ -0,0 +1,35 @@
1
+ //#region src/response/finish.ts
2
+ /** Caller defaults stay with the wire; unknown native reasons pass through unchanged. */
3
+ function mapAnthropicFinish(finishReason) {
4
+ if (finishReason === "stop") return "end_turn";
5
+ if (finishReason === "tool_calls") return "tool_use";
6
+ if (finishReason === "length") return "max_tokens";
7
+ return finishReason;
8
+ }
9
+ /** Responses status has its own table; caller defaults remain outside the mapper. */
10
+ function mapResponsesFinish(finishReason) {
11
+ if (finishReason === "stop") return "completed";
12
+ if (finishReason === "tool_calls") return "completed";
13
+ if (finishReason === "length") return "incomplete";
14
+ if (finishReason === "content_filter") return "failed";
15
+ return finishReason;
16
+ }
17
+ /** Gemini and Vertex keep their distinct native finish reasons and caller defaults. */
18
+ function mapGeminiFinish(finishReason) {
19
+ if (finishReason === "stop") return "STOP";
20
+ if (finishReason === "tool_calls") return "FUNCTION_CALL";
21
+ if (finishReason === "length") return "MAX_TOKENS";
22
+ if (finishReason === "content_filter") return "SAFETY";
23
+ return finishReason;
24
+ }
25
+ /** Cohere has its own native finish table; callers retain their falsy defaults. */
26
+ function mapCohereFinish(finishReason) {
27
+ if (finishReason === "stop") return "COMPLETE";
28
+ if (finishReason === "tool_calls") return "TOOL_CALL";
29
+ if (finishReason === "length") return "MAX_TOKENS";
30
+ return finishReason;
31
+ }
32
+
33
+ //#endregion
34
+ export { mapAnthropicFinish, mapCohereFinish, mapGeminiFinish, mapResponsesFinish };
35
+ //# sourceMappingURL=finish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finish.js","names":[],"sources":["../../src/response/finish.ts"],"sourcesContent":["/** Caller defaults stay with the wire; unknown native reasons pass through unchanged. */\nexport function mapAnthropicFinish(finishReason: string): string {\n if (finishReason === \"stop\") return \"end_turn\";\n if (finishReason === \"tool_calls\") return \"tool_use\";\n if (finishReason === \"length\") return \"max_tokens\";\n return finishReason;\n}\n\n/** Responses status has its own table; caller defaults remain outside the mapper. */\nexport function mapResponsesFinish(finishReason: string): string {\n if (finishReason === \"stop\") return \"completed\";\n if (finishReason === \"tool_calls\") return \"completed\";\n if (finishReason === \"length\") return \"incomplete\";\n if (finishReason === \"content_filter\") return \"failed\";\n return finishReason;\n}\n\n/** Gemini and Vertex keep their distinct native finish reasons and caller defaults. */\nexport function mapGeminiFinish(finishReason: string): string {\n if (finishReason === \"stop\") return \"STOP\";\n if (finishReason === \"tool_calls\") return \"FUNCTION_CALL\";\n if (finishReason === \"length\") return \"MAX_TOKENS\";\n if (finishReason === \"content_filter\") return \"SAFETY\";\n return finishReason;\n}\n\n/** Cohere has its own native finish table; callers retain their falsy defaults. */\nexport function mapCohereFinish(finishReason: string): string {\n if (finishReason === \"stop\") return \"COMPLETE\";\n if (finishReason === \"tool_calls\") return \"TOOL_CALL\";\n if (finishReason === \"length\") return \"MAX_TOKENS\";\n return finishReason;\n}\n"],"mappings":";;AACA,SAAgB,mBAAmB,cAA8B;AAC/D,KAAI,iBAAiB,OAAQ,QAAO;AACpC,KAAI,iBAAiB,aAAc,QAAO;AAC1C,KAAI,iBAAiB,SAAU,QAAO;AACtC,QAAO;;;AAIT,SAAgB,mBAAmB,cAA8B;AAC/D,KAAI,iBAAiB,OAAQ,QAAO;AACpC,KAAI,iBAAiB,aAAc,QAAO;AAC1C,KAAI,iBAAiB,SAAU,QAAO;AACtC,KAAI,iBAAiB,iBAAkB,QAAO;AAC9C,QAAO;;;AAIT,SAAgB,gBAAgB,cAA8B;AAC5D,KAAI,iBAAiB,OAAQ,QAAO;AACpC,KAAI,iBAAiB,aAAc,QAAO;AAC1C,KAAI,iBAAiB,SAAU,QAAO;AACtC,KAAI,iBAAiB,iBAAkB,QAAO;AAC9C,QAAO;;;AAIT,SAAgB,gBAAgB,cAA8B;AAC5D,KAAI,iBAAiB,OAAQ,QAAO;AACpC,KAAI,iBAAiB,aAAc,QAAO;AAC1C,KAAI,iBAAiB,SAAU,QAAO;AACtC,QAAO"}
@@ -0,0 +1,126 @@
1
+
2
+ //#region src/response/policy.ts
3
+ /** Entry points choose whether a failed parse warns or becomes a CLI usage error. */
4
+ function parsePolicyEntry(key, value) {
5
+ if (key === "requiredHeaders") {
6
+ const normalized = typeof value === "string" ? value.toLowerCase() : void 0;
7
+ if (normalized === "off" || normalized === "enforce") return {
8
+ ok: true,
9
+ key,
10
+ value: normalized
11
+ };
12
+ return {
13
+ ok: false,
14
+ reason: "expected \"off\" or \"enforce\"."
15
+ };
16
+ }
17
+ if (key === "authErrors" || key === "modelCatalog") {
18
+ const normalized = typeof value === "string" ? value.toLowerCase() : void 0;
19
+ if (normalized === "legacy" || normalized === "native") return {
20
+ ok: true,
21
+ key,
22
+ value: normalized
23
+ };
24
+ return {
25
+ ok: false,
26
+ reason: "expected \"legacy\" or \"native\"."
27
+ };
28
+ }
29
+ return {
30
+ ok: false,
31
+ reason: "unknown policy key."
32
+ };
33
+ }
34
+ /** Store one parsed entry without widening either key's value type. */
35
+ function assignPolicyEntry(target, entry) {
36
+ if (entry.key === "requiredHeaders") target.requiredHeaders = entry.value;
37
+ else target[entry.key] = entry.value;
38
+ }
39
+ /** Parse each programmatic entry independently without changing the caller's object. */
40
+ function parsePolicy(value, warn) {
41
+ const result = {};
42
+ if (value === void 0) return result;
43
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
44
+ warn("Ignoring policy: expected an object.");
45
+ return result;
46
+ }
47
+ for (const [key, entry] of Object.entries(value)) {
48
+ const parsed = parsePolicyEntry(key, entry);
49
+ if (parsed.ok) assignPolicyEntry(result, parsed);
50
+ else warn(`Ignoring policy.${key}: ${parsed.reason}`);
51
+ }
52
+ return result;
53
+ }
54
+ /** A bad header entry does not erase a prior valid entry or other policy keys. */
55
+ function parsePolicyHeader(rawHeaders, warn) {
56
+ const result = {};
57
+ const header = rawHeaders?.["x-aimock-policy"];
58
+ if (header === void 0) return result;
59
+ const text = Array.isArray(header) ? header.join(",") : header;
60
+ for (const rawEntry of text.split(",")) {
61
+ const entry = rawEntry.trim();
62
+ const separator = entry.indexOf("=");
63
+ if (separator < 0) {
64
+ warn(`Ignoring policy entry ${JSON.stringify(entry)}: expected key=value.`);
65
+ continue;
66
+ }
67
+ const key = entry.slice(0, separator);
68
+ const parsed = parsePolicyEntry(key, entry.slice(separator + 1));
69
+ if (parsed.ok) assignPolicyEntry(result, parsed);
70
+ else warn(`Ignoring policy.${key}: ${parsed.reason}`);
71
+ }
72
+ return result;
73
+ }
74
+ /** Resolve from the direct-handler input, preserving the independent legacy strict bit. */
75
+ function resolvePolicy(defaults, rawHeaders, warn = (message) => defaults.logger.warn(message)) {
76
+ const strict = resolveStrictMode(defaults.strict, rawHeaders);
77
+ const server = parsePolicy(defaults.policy, warn);
78
+ const request = parsePolicyHeader(rawHeaders, warn);
79
+ return Object.freeze({
80
+ strict,
81
+ requiredHeaders: request.requiredHeaders ?? server.requiredHeaders ?? "off",
82
+ authErrors: request.authErrors ?? server.authErrors ?? "legacy",
83
+ modelCatalog: request.modelCatalog ?? server.modelCatalog ?? "legacy"
84
+ });
85
+ }
86
+ /** Preserve the legacy request strict header grammar and server fallback. */
87
+ function resolveStrictMode(serverDefault, rawHeaders) {
88
+ if (rawHeaders) {
89
+ const header = rawHeaders["x-aimock-strict"];
90
+ const rawVal = typeof header === "string" ? header : Array.isArray(header) ? header[0] : void 0;
91
+ if (typeof rawVal === "string") {
92
+ const val = rawVal.trim().toLowerCase();
93
+ if (val === "true" || val === "1") return true;
94
+ if (val === "false" || val === "0") return false;
95
+ }
96
+ }
97
+ return serverDefault ?? false;
98
+ }
99
+ /** Journal fields retain their existing omitted-versus-overridden shape. */
100
+ function strictOverrideField(serverDefault, rawHeaders) {
101
+ const effective = resolveStrictMode(serverDefault, rawHeaders);
102
+ if (effective !== (serverDefault ?? false)) return { strictOverride: effective };
103
+ return {};
104
+ }
105
+ /** Named legacy decisions share one header read at the caller's existing site. */
106
+ function resolveRequestDecisions(serverDefault, rawHeaders) {
107
+ const strict = resolveStrictMode(serverDefault, rawHeaders);
108
+ return Object.freeze({
109
+ strict,
110
+ fixtureMiss: strict,
111
+ upstream: !strict,
112
+ reasoningSuppression: strict,
113
+ thinkingRejection: strict,
114
+ mcpRecordingStrict: strict,
115
+ strictOverride: strict !== (serverDefault ?? false) ? strict : void 0
116
+ });
117
+ }
118
+
119
+ //#endregion
120
+ exports.assignPolicyEntry = assignPolicyEntry;
121
+ exports.parsePolicy = parsePolicy;
122
+ exports.parsePolicyEntry = parsePolicyEntry;
123
+ exports.resolvePolicy = resolvePolicy;
124
+ exports.resolveRequestDecisions = resolveRequestDecisions;
125
+ exports.strictOverrideField = strictOverrideField;
126
+ //# sourceMappingURL=policy.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.cjs","names":[],"sources":["../../src/response/policy.ts"],"sourcesContent":["import type { IncomingHttpHeaders } from \"node:http\";\nimport type { AimockPolicy, HandlerDefaults } from \"../types.js\";\n\n/** Entry points choose whether a failed parse warns or becomes a CLI usage error. */\nexport function parsePolicyEntry(\n key: string,\n value: unknown,\n):\n | { ok: true; key: \"requiredHeaders\"; value: \"off\" | \"enforce\" }\n | { ok: true; key: \"authErrors\" | \"modelCatalog\"; value: \"legacy\" | \"native\" }\n | { ok: false; reason: string } {\n if (key === \"requiredHeaders\") {\n const normalized = typeof value === \"string\" ? value.toLowerCase() : undefined;\n if (normalized === \"off\" || normalized === \"enforce\") {\n return { ok: true, key, value: normalized };\n }\n return { ok: false, reason: 'expected \"off\" or \"enforce\".' };\n }\n if (key === \"authErrors\" || key === \"modelCatalog\") {\n const normalized = typeof value === \"string\" ? value.toLowerCase() : undefined;\n if (normalized === \"legacy\" || normalized === \"native\") {\n return { ok: true, key, value: normalized };\n }\n return { ok: false, reason: 'expected \"legacy\" or \"native\".' };\n }\n return { ok: false, reason: \"unknown policy key.\" };\n}\n\n/** Store one parsed entry without widening either key's value type. */\nexport function assignPolicyEntry(\n target: AimockPolicy,\n entry: Exclude<ReturnType<typeof parsePolicyEntry>, { ok: false }>,\n): void {\n if (entry.key === \"requiredHeaders\") target.requiredHeaders = entry.value;\n else target[entry.key] = entry.value;\n}\n\n/** Parse each programmatic entry independently without changing the caller's object. */\nexport function parsePolicy(value: unknown, warn: (message: string) => void): AimockPolicy {\n const result: AimockPolicy = {};\n if (value === undefined) return result;\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n warn(\"Ignoring policy: expected an object.\");\n return result;\n }\n for (const [key, entry] of Object.entries(value)) {\n const parsed = parsePolicyEntry(key, entry);\n if (parsed.ok) assignPolicyEntry(result, parsed);\n else warn(`Ignoring policy.${key}: ${parsed.reason}`);\n }\n return result;\n}\n\n/** A bad header entry does not erase a prior valid entry or other policy keys. */\nexport function parsePolicyHeader(\n rawHeaders: IncomingHttpHeaders | undefined,\n warn: (message: string) => void,\n): AimockPolicy {\n const result: AimockPolicy = {};\n const header = rawHeaders?.[\"x-aimock-policy\"];\n if (header === undefined) return result;\n const text = Array.isArray(header) ? header.join(\",\") : header;\n for (const rawEntry of text.split(\",\")) {\n const entry = rawEntry.trim();\n const separator = entry.indexOf(\"=\");\n if (separator < 0) {\n warn(`Ignoring policy entry ${JSON.stringify(entry)}: expected key=value.`);\n continue;\n }\n const key = entry.slice(0, separator);\n const parsed = parsePolicyEntry(key, entry.slice(separator + 1));\n if (parsed.ok) assignPolicyEntry(result, parsed);\n else warn(`Ignoring policy.${key}: ${parsed.reason}`);\n }\n return result;\n}\n\n/** Resolve from the direct-handler input, preserving the independent legacy strict bit. */\nexport function resolvePolicy(\n defaults: HandlerDefaults,\n rawHeaders?: IncomingHttpHeaders,\n warn: (message: string) => void = (message) => defaults.logger.warn(message),\n) {\n const strict = resolveStrictMode(defaults.strict, rawHeaders);\n const server = parsePolicy(defaults.policy, warn);\n const request = parsePolicyHeader(rawHeaders, warn);\n return Object.freeze({\n strict,\n requiredHeaders: request.requiredHeaders ?? server.requiredHeaders ?? \"off\",\n authErrors: request.authErrors ?? server.authErrors ?? \"legacy\",\n modelCatalog: request.modelCatalog ?? server.modelCatalog ?? \"legacy\",\n });\n}\n\n/** Preserve the legacy request strict header grammar and server fallback. */\nexport function resolveStrictMode(\n serverDefault: boolean | undefined,\n rawHeaders?: IncomingHttpHeaders,\n): boolean {\n if (rawHeaders) {\n const header = rawHeaders[\"x-aimock-strict\"];\n const rawVal =\n typeof header === \"string\" ? header : Array.isArray(header) ? header[0] : undefined;\n if (typeof rawVal === \"string\") {\n const val = rawVal.trim().toLowerCase();\n if (val === \"true\" || val === \"1\") return true;\n if (val === \"false\" || val === \"0\") return false;\n }\n }\n return serverDefault ?? false;\n}\n\n/** Journal fields retain their existing omitted-versus-overridden shape. */\nexport function strictOverrideField(\n serverDefault: boolean | undefined,\n rawHeaders?: IncomingHttpHeaders,\n): { strictOverride?: boolean } {\n const effective = resolveStrictMode(serverDefault, rawHeaders);\n if (effective !== (serverDefault ?? false)) {\n return { strictOverride: effective };\n }\n return {};\n}\n\n/** Named legacy decisions share one header read at the caller's existing site. */\nexport function resolveRequestDecisions(\n serverDefault: boolean | undefined,\n rawHeaders?: IncomingHttpHeaders,\n) {\n const strict = resolveStrictMode(serverDefault, rawHeaders);\n return Object.freeze({\n strict,\n fixtureMiss: strict,\n upstream: !strict,\n reasoningSuppression: strict,\n thinkingRejection: strict,\n mcpRecordingStrict: strict,\n strictOverride: strict !== (serverDefault ?? false) ? strict : undefined,\n });\n}\n"],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ //#region src/response/policy.ts
2
+ /** Entry points choose whether a failed parse warns or becomes a CLI usage error. */
3
+ function parsePolicyEntry(key, value) {
4
+ if (key === "requiredHeaders") {
5
+ const normalized = typeof value === "string" ? value.toLowerCase() : void 0;
6
+ if (normalized === "off" || normalized === "enforce") return {
7
+ ok: true,
8
+ key,
9
+ value: normalized
10
+ };
11
+ return {
12
+ ok: false,
13
+ reason: "expected \"off\" or \"enforce\"."
14
+ };
15
+ }
16
+ if (key === "authErrors" || key === "modelCatalog") {
17
+ const normalized = typeof value === "string" ? value.toLowerCase() : void 0;
18
+ if (normalized === "legacy" || normalized === "native") return {
19
+ ok: true,
20
+ key,
21
+ value: normalized
22
+ };
23
+ return {
24
+ ok: false,
25
+ reason: "expected \"legacy\" or \"native\"."
26
+ };
27
+ }
28
+ return {
29
+ ok: false,
30
+ reason: "unknown policy key."
31
+ };
32
+ }
33
+ /** Store one parsed entry without widening either key's value type. */
34
+ function assignPolicyEntry(target, entry) {
35
+ if (entry.key === "requiredHeaders") target.requiredHeaders = entry.value;
36
+ else target[entry.key] = entry.value;
37
+ }
38
+ /** Parse each programmatic entry independently without changing the caller's object. */
39
+ function parsePolicy(value, warn) {
40
+ const result = {};
41
+ if (value === void 0) return result;
42
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
43
+ warn("Ignoring policy: expected an object.");
44
+ return result;
45
+ }
46
+ for (const [key, entry] of Object.entries(value)) {
47
+ const parsed = parsePolicyEntry(key, entry);
48
+ if (parsed.ok) assignPolicyEntry(result, parsed);
49
+ else warn(`Ignoring policy.${key}: ${parsed.reason}`);
50
+ }
51
+ return result;
52
+ }
53
+ /** A bad header entry does not erase a prior valid entry or other policy keys. */
54
+ function parsePolicyHeader(rawHeaders, warn) {
55
+ const result = {};
56
+ const header = rawHeaders?.["x-aimock-policy"];
57
+ if (header === void 0) return result;
58
+ const text = Array.isArray(header) ? header.join(",") : header;
59
+ for (const rawEntry of text.split(",")) {
60
+ const entry = rawEntry.trim();
61
+ const separator = entry.indexOf("=");
62
+ if (separator < 0) {
63
+ warn(`Ignoring policy entry ${JSON.stringify(entry)}: expected key=value.`);
64
+ continue;
65
+ }
66
+ const key = entry.slice(0, separator);
67
+ const parsed = parsePolicyEntry(key, entry.slice(separator + 1));
68
+ if (parsed.ok) assignPolicyEntry(result, parsed);
69
+ else warn(`Ignoring policy.${key}: ${parsed.reason}`);
70
+ }
71
+ return result;
72
+ }
73
+ /** Resolve from the direct-handler input, preserving the independent legacy strict bit. */
74
+ function resolvePolicy(defaults, rawHeaders, warn = (message) => defaults.logger.warn(message)) {
75
+ const strict = resolveStrictMode(defaults.strict, rawHeaders);
76
+ const server = parsePolicy(defaults.policy, warn);
77
+ const request = parsePolicyHeader(rawHeaders, warn);
78
+ return Object.freeze({
79
+ strict,
80
+ requiredHeaders: request.requiredHeaders ?? server.requiredHeaders ?? "off",
81
+ authErrors: request.authErrors ?? server.authErrors ?? "legacy",
82
+ modelCatalog: request.modelCatalog ?? server.modelCatalog ?? "legacy"
83
+ });
84
+ }
85
+ /** Preserve the legacy request strict header grammar and server fallback. */
86
+ function resolveStrictMode(serverDefault, rawHeaders) {
87
+ if (rawHeaders) {
88
+ const header = rawHeaders["x-aimock-strict"];
89
+ const rawVal = typeof header === "string" ? header : Array.isArray(header) ? header[0] : void 0;
90
+ if (typeof rawVal === "string") {
91
+ const val = rawVal.trim().toLowerCase();
92
+ if (val === "true" || val === "1") return true;
93
+ if (val === "false" || val === "0") return false;
94
+ }
95
+ }
96
+ return serverDefault ?? false;
97
+ }
98
+ /** Journal fields retain their existing omitted-versus-overridden shape. */
99
+ function strictOverrideField(serverDefault, rawHeaders) {
100
+ const effective = resolveStrictMode(serverDefault, rawHeaders);
101
+ if (effective !== (serverDefault ?? false)) return { strictOverride: effective };
102
+ return {};
103
+ }
104
+ /** Named legacy decisions share one header read at the caller's existing site. */
105
+ function resolveRequestDecisions(serverDefault, rawHeaders) {
106
+ const strict = resolveStrictMode(serverDefault, rawHeaders);
107
+ return Object.freeze({
108
+ strict,
109
+ fixtureMiss: strict,
110
+ upstream: !strict,
111
+ reasoningSuppression: strict,
112
+ thinkingRejection: strict,
113
+ mcpRecordingStrict: strict,
114
+ strictOverride: strict !== (serverDefault ?? false) ? strict : void 0
115
+ });
116
+ }
117
+
118
+ //#endregion
119
+ export { assignPolicyEntry, parsePolicy, parsePolicyEntry, resolvePolicy, resolveRequestDecisions, strictOverrideField };
120
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","names":[],"sources":["../../src/response/policy.ts"],"sourcesContent":["import type { IncomingHttpHeaders } from \"node:http\";\nimport type { AimockPolicy, HandlerDefaults } from \"../types.js\";\n\n/** Entry points choose whether a failed parse warns or becomes a CLI usage error. */\nexport function parsePolicyEntry(\n key: string,\n value: unknown,\n):\n | { ok: true; key: \"requiredHeaders\"; value: \"off\" | \"enforce\" }\n | { ok: true; key: \"authErrors\" | \"modelCatalog\"; value: \"legacy\" | \"native\" }\n | { ok: false; reason: string } {\n if (key === \"requiredHeaders\") {\n const normalized = typeof value === \"string\" ? value.toLowerCase() : undefined;\n if (normalized === \"off\" || normalized === \"enforce\") {\n return { ok: true, key, value: normalized };\n }\n return { ok: false, reason: 'expected \"off\" or \"enforce\".' };\n }\n if (key === \"authErrors\" || key === \"modelCatalog\") {\n const normalized = typeof value === \"string\" ? value.toLowerCase() : undefined;\n if (normalized === \"legacy\" || normalized === \"native\") {\n return { ok: true, key, value: normalized };\n }\n return { ok: false, reason: 'expected \"legacy\" or \"native\".' };\n }\n return { ok: false, reason: \"unknown policy key.\" };\n}\n\n/** Store one parsed entry without widening either key's value type. */\nexport function assignPolicyEntry(\n target: AimockPolicy,\n entry: Exclude<ReturnType<typeof parsePolicyEntry>, { ok: false }>,\n): void {\n if (entry.key === \"requiredHeaders\") target.requiredHeaders = entry.value;\n else target[entry.key] = entry.value;\n}\n\n/** Parse each programmatic entry independently without changing the caller's object. */\nexport function parsePolicy(value: unknown, warn: (message: string) => void): AimockPolicy {\n const result: AimockPolicy = {};\n if (value === undefined) return result;\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n warn(\"Ignoring policy: expected an object.\");\n return result;\n }\n for (const [key, entry] of Object.entries(value)) {\n const parsed = parsePolicyEntry(key, entry);\n if (parsed.ok) assignPolicyEntry(result, parsed);\n else warn(`Ignoring policy.${key}: ${parsed.reason}`);\n }\n return result;\n}\n\n/** A bad header entry does not erase a prior valid entry or other policy keys. */\nexport function parsePolicyHeader(\n rawHeaders: IncomingHttpHeaders | undefined,\n warn: (message: string) => void,\n): AimockPolicy {\n const result: AimockPolicy = {};\n const header = rawHeaders?.[\"x-aimock-policy\"];\n if (header === undefined) return result;\n const text = Array.isArray(header) ? header.join(\",\") : header;\n for (const rawEntry of text.split(\",\")) {\n const entry = rawEntry.trim();\n const separator = entry.indexOf(\"=\");\n if (separator < 0) {\n warn(`Ignoring policy entry ${JSON.stringify(entry)}: expected key=value.`);\n continue;\n }\n const key = entry.slice(0, separator);\n const parsed = parsePolicyEntry(key, entry.slice(separator + 1));\n if (parsed.ok) assignPolicyEntry(result, parsed);\n else warn(`Ignoring policy.${key}: ${parsed.reason}`);\n }\n return result;\n}\n\n/** Resolve from the direct-handler input, preserving the independent legacy strict bit. */\nexport function resolvePolicy(\n defaults: HandlerDefaults,\n rawHeaders?: IncomingHttpHeaders,\n warn: (message: string) => void = (message) => defaults.logger.warn(message),\n) {\n const strict = resolveStrictMode(defaults.strict, rawHeaders);\n const server = parsePolicy(defaults.policy, warn);\n const request = parsePolicyHeader(rawHeaders, warn);\n return Object.freeze({\n strict,\n requiredHeaders: request.requiredHeaders ?? server.requiredHeaders ?? \"off\",\n authErrors: request.authErrors ?? server.authErrors ?? \"legacy\",\n modelCatalog: request.modelCatalog ?? server.modelCatalog ?? \"legacy\",\n });\n}\n\n/** Preserve the legacy request strict header grammar and server fallback. */\nexport function resolveStrictMode(\n serverDefault: boolean | undefined,\n rawHeaders?: IncomingHttpHeaders,\n): boolean {\n if (rawHeaders) {\n const header = rawHeaders[\"x-aimock-strict\"];\n const rawVal =\n typeof header === \"string\" ? header : Array.isArray(header) ? header[0] : undefined;\n if (typeof rawVal === \"string\") {\n const val = rawVal.trim().toLowerCase();\n if (val === \"true\" || val === \"1\") return true;\n if (val === \"false\" || val === \"0\") return false;\n }\n }\n return serverDefault ?? false;\n}\n\n/** Journal fields retain their existing omitted-versus-overridden shape. */\nexport function strictOverrideField(\n serverDefault: boolean | undefined,\n rawHeaders?: IncomingHttpHeaders,\n): { strictOverride?: boolean } {\n const effective = resolveStrictMode(serverDefault, rawHeaders);\n if (effective !== (serverDefault ?? false)) {\n return { strictOverride: effective };\n }\n return {};\n}\n\n/** Named legacy decisions share one header read at the caller's existing site. */\nexport function resolveRequestDecisions(\n serverDefault: boolean | undefined,\n rawHeaders?: IncomingHttpHeaders,\n) {\n const strict = resolveStrictMode(serverDefault, rawHeaders);\n return Object.freeze({\n strict,\n fixtureMiss: strict,\n upstream: !strict,\n reasoningSuppression: strict,\n thinkingRejection: strict,\n mcpRecordingStrict: strict,\n strictOverride: strict !== (serverDefault ?? false) ? strict : undefined,\n });\n}\n"],"mappings":"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"}