@jsonstudio/llms 0.4.2

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 (538) hide show
  1. package/README.md +265 -0
  2. package/dist/api/index.d.ts +10 -0
  3. package/dist/api/index.js +11 -0
  4. package/dist/api/llmswitch-config.d.ts +15 -0
  5. package/dist/api/llmswitch-config.js +415 -0
  6. package/dist/api/llmswitch-types.d.ts +412 -0
  7. package/dist/api/llmswitch-types.js +60 -0
  8. package/dist/bridge/routecodex-adapter.d.ts +74 -0
  9. package/dist/bridge/routecodex-adapter.js +226 -0
  10. package/dist/config/index.d.ts +3 -0
  11. package/dist/config/index.js +5 -0
  12. package/dist/config-unified/enhanced-path-resolver.d.ts +5 -0
  13. package/dist/config-unified/enhanced-path-resolver.js +38 -0
  14. package/dist/config-unified/unified-config.d.ts +26 -0
  15. package/dist/config-unified/unified-config.js +187 -0
  16. package/dist/conversion/codec-registry.d.ts +10 -0
  17. package/dist/conversion/codec-registry.js +25 -0
  18. package/dist/conversion/codecs/anthropic-openai-codec.d.ts +23 -0
  19. package/dist/conversion/codecs/anthropic-openai-codec.js +546 -0
  20. package/dist/conversion/codecs/gemini-openai-codec.d.ts +16 -0
  21. package/dist/conversion/codecs/gemini-openai-codec.js +437 -0
  22. package/dist/conversion/codecs/openai-openai-codec.d.ts +12 -0
  23. package/dist/conversion/codecs/openai-openai-codec.js +125 -0
  24. package/dist/conversion/codecs/responses-openai-codec.d.ts +12 -0
  25. package/dist/conversion/codecs/responses-openai-codec.js +154 -0
  26. package/dist/conversion/config/config-manager.d.ts +212 -0
  27. package/dist/conversion/config/config-manager.js +310 -0
  28. package/dist/conversion/conversion-v3/adapters/index.d.ts +2 -0
  29. package/dist/conversion/conversion-v3/adapters/index.js +1 -0
  30. package/dist/conversion/conversion-v3/adapters/v3-to-standard-adapter.d.ts +38 -0
  31. package/dist/conversion/conversion-v3/adapters/v3-to-standard-adapter.js +55 -0
  32. package/dist/conversion/conversion-v3/compatibility/compatibility-profiles.d.ts +22 -0
  33. package/dist/conversion/conversion-v3/compatibility/compatibility-profiles.js +84 -0
  34. package/dist/conversion/conversion-v3/compatibility/compatibility-stages.d.ts +4 -0
  35. package/dist/conversion/conversion-v3/compatibility/compatibility-stages.js +285 -0
  36. package/dist/conversion/conversion-v3/compatibility/index.d.ts +3 -0
  37. package/dist/conversion/conversion-v3/compatibility/index.js +2 -0
  38. package/dist/conversion/conversion-v3/config/default-configs.d.ts +48 -0
  39. package/dist/conversion/conversion-v3/config/default-configs.js +1083 -0
  40. package/dist/conversion/conversion-v3/config/index.d.ts +5 -0
  41. package/dist/conversion/conversion-v3/config/index.js +5 -0
  42. package/dist/conversion/conversion-v3/config/pipeline-config-manager.d.ts +49 -0
  43. package/dist/conversion/conversion-v3/config/pipeline-config-manager.js +65 -0
  44. package/dist/conversion/conversion-v3/index.d.ts +11 -0
  45. package/dist/conversion/conversion-v3/index.js +17 -0
  46. package/dist/conversion/conversion-v3/nodes/index.d.ts +56 -0
  47. package/dist/conversion/conversion-v3/nodes/index.js +149 -0
  48. package/dist/conversion/conversion-v3/nodes/input/anthropic-input-node.d.ts +25 -0
  49. package/dist/conversion/conversion-v3/nodes/input/anthropic-input-node.js +56 -0
  50. package/dist/conversion/conversion-v3/nodes/input/base-input-node.d.ts +75 -0
  51. package/dist/conversion/conversion-v3/nodes/input/base-input-node.js +237 -0
  52. package/dist/conversion/conversion-v3/nodes/input/chat-input-node.d.ts +25 -0
  53. package/dist/conversion/conversion-v3/nodes/input/chat-input-node.js +56 -0
  54. package/dist/conversion/conversion-v3/nodes/input/chat-shape-helpers.d.ts +4 -0
  55. package/dist/conversion/conversion-v3/nodes/input/chat-shape-helpers.js +197 -0
  56. package/dist/conversion/conversion-v3/nodes/input/gemini-input-node.d.ts +16 -0
  57. package/dist/conversion/conversion-v3/nodes/input/gemini-input-node.js +125 -0
  58. package/dist/conversion/conversion-v3/nodes/input/index.d.ts +8 -0
  59. package/dist/conversion/conversion-v3/nodes/input/index.js +8 -0
  60. package/dist/conversion/conversion-v3/nodes/input/input-decision.d.ts +46 -0
  61. package/dist/conversion/conversion-v3/nodes/input/input-decision.js +125 -0
  62. package/dist/conversion/conversion-v3/nodes/input/responses-input-node.d.ts +20 -0
  63. package/dist/conversion/conversion-v3/nodes/input/responses-input-node.js +51 -0
  64. package/dist/conversion/conversion-v3/nodes/output/anthropic-output-node.d.ts +71 -0
  65. package/dist/conversion/conversion-v3/nodes/output/anthropic-output-node.js +320 -0
  66. package/dist/conversion/conversion-v3/nodes/output/base-output-node.d.ts +116 -0
  67. package/dist/conversion/conversion-v3/nodes/output/base-output-node.js +512 -0
  68. package/dist/conversion/conversion-v3/nodes/output/index.d.ts +7 -0
  69. package/dist/conversion/conversion-v3/nodes/output/index.js +7 -0
  70. package/dist/conversion/conversion-v3/nodes/output/openai-output-node.d.ts +71 -0
  71. package/dist/conversion/conversion-v3/nodes/output/openai-output-node.js +293 -0
  72. package/dist/conversion/conversion-v3/nodes/output/output-decision.d.ts +68 -0
  73. package/dist/conversion/conversion-v3/nodes/output/output-decision.js +161 -0
  74. package/dist/conversion/conversion-v3/nodes/output/responses-output-node.d.ts +64 -0
  75. package/dist/conversion/conversion-v3/nodes/output/responses-output-node.js +323 -0
  76. package/dist/conversion/conversion-v3/nodes/process/base-process-node.d.ts +72 -0
  77. package/dist/conversion/conversion-v3/nodes/process/base-process-node.js +246 -0
  78. package/dist/conversion/conversion-v3/nodes/process/chat-process-node.d.ts +135 -0
  79. package/dist/conversion/conversion-v3/nodes/process/chat-process-node.js +854 -0
  80. package/dist/conversion/conversion-v3/nodes/process/compatibility-process-node.d.ts +29 -0
  81. package/dist/conversion/conversion-v3/nodes/process/compatibility-process-node.js +181 -0
  82. package/dist/conversion/conversion-v3/nodes/process/index.d.ts +10 -0
  83. package/dist/conversion/conversion-v3/nodes/process/index.js +10 -0
  84. package/dist/conversion/conversion-v3/nodes/process/passthrough-process-node.d.ts +59 -0
  85. package/dist/conversion/conversion-v3/nodes/process/passthrough-process-node.js +243 -0
  86. package/dist/conversion/conversion-v3/nodes/process/response-process-node.d.ts +17 -0
  87. package/dist/conversion/conversion-v3/nodes/process/response-process-node.js +213 -0
  88. package/dist/conversion/conversion-v3/nodes/process/tool-process-node.d.ts +26 -0
  89. package/dist/conversion/conversion-v3/nodes/process/tool-process-node.js +299 -0
  90. package/dist/conversion/conversion-v3/nodes/process/virtual-router-process-node.d.ts +40 -0
  91. package/dist/conversion/conversion-v3/nodes/process/virtual-router-process-node.js +430 -0
  92. package/dist/conversion/conversion-v3/nodes/response/anthropic-response-input-node.d.ts +12 -0
  93. package/dist/conversion/conversion-v3/nodes/response/anthropic-response-input-node.js +129 -0
  94. package/dist/conversion/conversion-v3/nodes/response/chat-to-responses-response-node.d.ts +15 -0
  95. package/dist/conversion/conversion-v3/nodes/response/chat-to-responses-response-node.js +57 -0
  96. package/dist/conversion/conversion-v3/nodes/response/index.d.ts +4 -0
  97. package/dist/conversion/conversion-v3/nodes/response/index.js +4 -0
  98. package/dist/conversion/conversion-v3/nodes/response/openai-response-input-node.d.ts +15 -0
  99. package/dist/conversion/conversion-v3/nodes/response/openai-response-input-node.js +87 -0
  100. package/dist/conversion/conversion-v3/nodes/response/response-utils.d.ts +1 -0
  101. package/dist/conversion/conversion-v3/nodes/response/response-utils.js +1 -0
  102. package/dist/conversion/conversion-v3/nodes/response/responses-response-input-node.d.ts +12 -0
  103. package/dist/conversion/conversion-v3/nodes/response/responses-response-input-node.js +67 -0
  104. package/dist/conversion/conversion-v3/nodes/sse/index.d.ts +3 -0
  105. package/dist/conversion/conversion-v3/nodes/sse/index.js +3 -0
  106. package/dist/conversion/conversion-v3/nodes/sse/sse-input-node.d.ts +27 -0
  107. package/dist/conversion/conversion-v3/nodes/sse/sse-input-node.js +165 -0
  108. package/dist/conversion/conversion-v3/nodes/sse/sse-output-node.d.ts +19 -0
  109. package/dist/conversion/conversion-v3/nodes/sse/sse-output-node.js +267 -0
  110. package/dist/conversion/conversion-v3/nodes/sse/sse-passthrough-node.d.ts +18 -0
  111. package/dist/conversion/conversion-v3/nodes/sse/sse-passthrough-node.js +48 -0
  112. package/dist/conversion/conversion-v3/pipelines/index.d.ts +6 -0
  113. package/dist/conversion/conversion-v3/pipelines/index.js +6 -0
  114. package/dist/conversion/conversion-v3/pipelines/super-pipeline.d.ts +112 -0
  115. package/dist/conversion/conversion-v3/pipelines/super-pipeline.js +566 -0
  116. package/dist/conversion/conversion-v3/response/provider-response-converter.d.ts +28 -0
  117. package/dist/conversion/conversion-v3/response/provider-response-converter.js +249 -0
  118. package/dist/conversion/conversion-v3/sse/index.d.ts +140 -0
  119. package/dist/conversion/conversion-v3/sse/index.js +115 -0
  120. package/dist/conversion/conversion-v3/sse/json-to-sse/anthropic-json-to-sse-converter.d.ts +11 -0
  121. package/dist/conversion/conversion-v3/sse/json-to-sse/anthropic-json-to-sse-converter.js +79 -0
  122. package/dist/conversion/conversion-v3/sse/json-to-sse/chat-json-to-sse-converter.d.ts +79 -0
  123. package/dist/conversion/conversion-v3/sse/json-to-sse/chat-json-to-sse-converter.js +296 -0
  124. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/chat.d.ts +55 -0
  125. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/chat.js +233 -0
  126. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/responses.d.ts +99 -0
  127. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/responses.js +599 -0
  128. package/dist/conversion/conversion-v3/sse/json-to-sse/index.d.ts +6 -0
  129. package/dist/conversion/conversion-v3/sse/json-to-sse/index.js +7 -0
  130. package/dist/conversion/conversion-v3/sse/json-to-sse/responses-json-to-sse-converter.d.ts +79 -0
  131. package/dist/conversion/conversion-v3/sse/json-to-sse/responses-json-to-sse-converter.js +322 -0
  132. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/chat-sequencer.d.ts +37 -0
  133. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/chat-sequencer.js +218 -0
  134. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/responses-sequencer.d.ts +40 -0
  135. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/responses-sequencer.js +263 -0
  136. package/dist/conversion/conversion-v3/sse/registry/sse-codec-registry.d.ts +32 -0
  137. package/dist/conversion/conversion-v3/sse/registry/sse-codec-registry.js +106 -0
  138. package/dist/conversion/conversion-v3/sse/shared/chat-serializer.d.ts +4 -0
  139. package/dist/conversion/conversion-v3/sse/shared/chat-serializer.js +40 -0
  140. package/dist/conversion/conversion-v3/sse/shared/constants.d.ts +272 -0
  141. package/dist/conversion/conversion-v3/sse/shared/constants.js +321 -0
  142. package/dist/conversion/conversion-v3/sse/shared/serializers/base-serializer.d.ts +158 -0
  143. package/dist/conversion/conversion-v3/sse/shared/serializers/base-serializer.js +210 -0
  144. package/dist/conversion/conversion-v3/sse/shared/serializers/chat-event-serializer.d.ts +82 -0
  145. package/dist/conversion/conversion-v3/sse/shared/serializers/chat-event-serializer.js +275 -0
  146. package/dist/conversion/conversion-v3/sse/shared/serializers/index.d.ts +39 -0
  147. package/dist/conversion/conversion-v3/sse/shared/serializers/index.js +54 -0
  148. package/dist/conversion/conversion-v3/sse/shared/serializers/responses-event-serializer.d.ts +123 -0
  149. package/dist/conversion/conversion-v3/sse/shared/serializers/responses-event-serializer.js +356 -0
  150. package/dist/conversion/conversion-v3/sse/shared/serializers/types.d.ts +51 -0
  151. package/dist/conversion/conversion-v3/sse/shared/serializers/types.js +4 -0
  152. package/dist/conversion/conversion-v3/sse/shared/utils.d.ts +254 -0
  153. package/dist/conversion/conversion-v3/sse/shared/utils.js +543 -0
  154. package/dist/conversion/conversion-v3/sse/shared/writer.d.ts +111 -0
  155. package/dist/conversion/conversion-v3/sse/shared/writer.js +268 -0
  156. package/dist/conversion/conversion-v3/sse/sse-to-json/anthropic-sse-to-json-converter.d.ts +13 -0
  157. package/dist/conversion/conversion-v3/sse/sse-to-json/anthropic-sse-to-json-converter.js +139 -0
  158. package/dist/conversion/conversion-v3/sse/sse-to-json/builders/response-builder.d.ts +165 -0
  159. package/dist/conversion/conversion-v3/sse/sse-to-json/builders/response-builder.js +776 -0
  160. package/dist/conversion/conversion-v3/sse/sse-to-json/chat-sse-to-json-converter.d.ts +106 -0
  161. package/dist/conversion/conversion-v3/sse/sse-to-json/chat-sse-to-json-converter.js +540 -0
  162. package/dist/conversion/conversion-v3/sse/sse-to-json/index.d.ts +6 -0
  163. package/dist/conversion/conversion-v3/sse/sse-to-json/index.js +7 -0
  164. package/dist/conversion/conversion-v3/sse/sse-to-json/parsers/sse-parser.d.ts +73 -0
  165. package/dist/conversion/conversion-v3/sse/sse-to-json/parsers/sse-parser.js +332 -0
  166. package/dist/conversion/conversion-v3/sse/sse-to-json/responses-sse-to-json-converter.d.ts +59 -0
  167. package/dist/conversion/conversion-v3/sse/sse-to-json/responses-sse-to-json-converter.js +270 -0
  168. package/dist/conversion/conversion-v3/sse/types/anthropic-types.d.ts +87 -0
  169. package/dist/conversion/conversion-v3/sse/types/anthropic-types.js +5 -0
  170. package/dist/conversion/conversion-v3/sse/types/chat-types.d.ts +308 -0
  171. package/dist/conversion/conversion-v3/sse/types/chat-types.js +32 -0
  172. package/dist/conversion/conversion-v3/sse/types/conversion-context.d.ts +211 -0
  173. package/dist/conversion/conversion-v3/sse/types/conversion-context.js +20 -0
  174. package/dist/conversion/conversion-v3/sse/types/core-interfaces.d.ts +90 -0
  175. package/dist/conversion/conversion-v3/sse/types/core-interfaces.js +5 -0
  176. package/dist/conversion/conversion-v3/sse/types/index.d.ts +14 -0
  177. package/dist/conversion/conversion-v3/sse/types/index.js +7 -0
  178. package/dist/conversion/conversion-v3/sse/types/responses-types.d.ts +328 -0
  179. package/dist/conversion/conversion-v3/sse/types/responses-types.js +38 -0
  180. package/dist/conversion/conversion-v3/sse/types/sse-events.d.ts +180 -0
  181. package/dist/conversion/conversion-v3/sse/types/sse-events.js +150 -0
  182. package/dist/conversion/conversion-v3/sse/types/stream-state.d.ts +204 -0
  183. package/dist/conversion/conversion-v3/sse/types/stream-state.js +44 -0
  184. package/dist/conversion/conversion-v3/sse/types/utility-types.d.ts +230 -0
  185. package/dist/conversion/conversion-v3/sse/types/utility-types.js +49 -0
  186. package/dist/conversion/conversion-v3/standards/context-adapter.d.ts +146 -0
  187. package/dist/conversion/conversion-v3/standards/context-adapter.js +438 -0
  188. package/dist/conversion/conversion-v3/standards/errors.d.ts +38 -0
  189. package/dist/conversion/conversion-v3/standards/errors.js +27 -0
  190. package/dist/conversion/conversion-v3/standards/index.d.ts +15 -0
  191. package/dist/conversion/conversion-v3/standards/index.js +11 -0
  192. package/dist/conversion/conversion-v3/standards/node-capabilities.d.ts +123 -0
  193. package/dist/conversion/conversion-v3/standards/node-capabilities.js +330 -0
  194. package/dist/conversion/conversion-v3/standards/pipeline-context.d.ts +237 -0
  195. package/dist/conversion/conversion-v3/standards/pipeline-context.js +84 -0
  196. package/dist/conversion/conversion-v3/standards/pipeline-node.d.ts +196 -0
  197. package/dist/conversion/conversion-v3/standards/pipeline-node.js +316 -0
  198. package/dist/conversion/conversion-v3/standards/snapshot-handles.d.ts +24 -0
  199. package/dist/conversion/conversion-v3/standards/snapshot-handles.js +49 -0
  200. package/dist/conversion/conversion-v3/types/config-types.d.ts +242 -0
  201. package/dist/conversion/conversion-v3/types/config-types.js +13 -0
  202. package/dist/conversion/conversion-v3/types/index.d.ts +8 -0
  203. package/dist/conversion/conversion-v3/types/index.js +11 -0
  204. package/dist/conversion/conversion-v3/types/node-types.d.ts +211 -0
  205. package/dist/conversion/conversion-v3/types/node-types.js +20 -0
  206. package/dist/conversion/conversion-v3/types/pipeline-types.d.ts +246 -0
  207. package/dist/conversion/conversion-v3/types/pipeline-types.js +26 -0
  208. package/dist/conversion/conversion-v3/types/request-types.d.ts +293 -0
  209. package/dist/conversion/conversion-v3/types/request-types.js +26 -0
  210. package/dist/conversion/conversion-v3/utils/provider-payload-sanitizer.d.ts +10 -0
  211. package/dist/conversion/conversion-v3/utils/provider-payload-sanitizer.js +103 -0
  212. package/dist/conversion/conversion-v3/validations/index.d.ts +8 -0
  213. package/dist/conversion/conversion-v3/validations/index.js +7 -0
  214. package/dist/conversion/conversion-v3/validations/node-graph-validator.d.ts +116 -0
  215. package/dist/conversion/conversion-v3/validations/node-graph-validator.js +505 -0
  216. package/dist/conversion/conversion-v3/validations/tool-governance-enforcer.d.ts +139 -0
  217. package/dist/conversion/conversion-v3/validations/tool-governance-enforcer.js +338 -0
  218. package/dist/conversion/hub/config/types.d.ts +26 -0
  219. package/dist/conversion/hub/config/types.js +1 -0
  220. package/dist/conversion/hub/core/detour-registry.d.ts +9 -0
  221. package/dist/conversion/hub/core/detour-registry.js +23 -0
  222. package/dist/conversion/hub/core/hub-context.d.ts +21 -0
  223. package/dist/conversion/hub/core/hub-context.js +1 -0
  224. package/dist/conversion/hub/core/index.d.ts +3 -0
  225. package/dist/conversion/hub/core/index.js +3 -0
  226. package/dist/conversion/hub/core/stage-driver.d.ts +30 -0
  227. package/dist/conversion/hub/core/stage-driver.js +31 -0
  228. package/dist/conversion/hub/format-adapters/anthropic-format-adapter.d.ts +16 -0
  229. package/dist/conversion/hub/format-adapters/anthropic-format-adapter.js +23 -0
  230. package/dist/conversion/hub/format-adapters/chat-format-adapter.d.ts +17 -0
  231. package/dist/conversion/hub/format-adapters/chat-format-adapter.js +23 -0
  232. package/dist/conversion/hub/format-adapters/gemini-format-adapter.d.ts +16 -0
  233. package/dist/conversion/hub/format-adapters/gemini-format-adapter.js +23 -0
  234. package/dist/conversion/hub/format-adapters/index.d.ts +21 -0
  235. package/dist/conversion/hub/format-adapters/index.js +4 -0
  236. package/dist/conversion/hub/format-adapters/responses-format-adapter.d.ts +17 -0
  237. package/dist/conversion/hub/format-adapters/responses-format-adapter.js +23 -0
  238. package/dist/conversion/hub/hub-feature.d.ts +1 -0
  239. package/dist/conversion/hub/hub-feature.js +25 -0
  240. package/dist/conversion/hub/node-support.d.ts +19 -0
  241. package/dist/conversion/hub/node-support.js +115 -0
  242. package/dist/conversion/hub/pipeline/hub-pipeline.d.ts +68 -0
  243. package/dist/conversion/hub/pipeline/hub-pipeline.js +421 -0
  244. package/dist/conversion/hub/pipelines/inbound.d.ts +22 -0
  245. package/dist/conversion/hub/pipelines/inbound.js +64 -0
  246. package/dist/conversion/hub/pipelines/outbound.d.ts +22 -0
  247. package/dist/conversion/hub/pipelines/outbound.js +57 -0
  248. package/dist/conversion/hub/process/chat-process.d.ts +13 -0
  249. package/dist/conversion/hub/process/chat-process.js +50 -0
  250. package/dist/conversion/hub/registry.d.ts +28 -0
  251. package/dist/conversion/hub/registry.js +98 -0
  252. package/dist/conversion/hub/response/chat-response-utils.d.ts +6 -0
  253. package/dist/conversion/hub/response/chat-response-utils.js +89 -0
  254. package/dist/conversion/hub/response/provider-response.d.ts +20 -0
  255. package/dist/conversion/hub/response/provider-response.js +196 -0
  256. package/dist/conversion/hub/response/response-mappers.d.ts +19 -0
  257. package/dist/conversion/hub/response/response-mappers.js +23 -0
  258. package/dist/conversion/hub/response/response-runtime.d.ts +3 -0
  259. package/dist/conversion/hub/response/response-runtime.js +206 -0
  260. package/dist/conversion/hub/semantic-mappers/anthropic-mapper.d.ts +7 -0
  261. package/dist/conversion/hub/semantic-mappers/anthropic-mapper.js +308 -0
  262. package/dist/conversion/hub/semantic-mappers/chat-mapper.d.ts +7 -0
  263. package/dist/conversion/hub/semantic-mappers/chat-mapper.js +304 -0
  264. package/dist/conversion/hub/semantic-mappers/gemini-mapper.d.ts +7 -0
  265. package/dist/conversion/hub/semantic-mappers/gemini-mapper.js +477 -0
  266. package/dist/conversion/hub/semantic-mappers/index.d.ts +4 -0
  267. package/dist/conversion/hub/semantic-mappers/index.js +4 -0
  268. package/dist/conversion/hub/semantic-mappers/responses-mapper.d.ts +21 -0
  269. package/dist/conversion/hub/semantic-mappers/responses-mapper.js +379 -0
  270. package/dist/conversion/hub/snapshot-recorder.d.ts +12 -0
  271. package/dist/conversion/hub/snapshot-recorder.js +69 -0
  272. package/dist/conversion/hub/standardized-bridge.d.ts +12 -0
  273. package/dist/conversion/hub/standardized-bridge.js +248 -0
  274. package/dist/conversion/hub/types/chat-envelope.d.ts +67 -0
  275. package/dist/conversion/hub/types/chat-envelope.js +1 -0
  276. package/dist/conversion/hub/types/chat-schema.d.ts +112 -0
  277. package/dist/conversion/hub/types/chat-schema.js +1 -0
  278. package/dist/conversion/hub/types/errors.d.ts +5 -0
  279. package/dist/conversion/hub/types/errors.js +13 -0
  280. package/dist/conversion/hub/types/format-envelope.d.ts +7 -0
  281. package/dist/conversion/hub/types/format-envelope.js +1 -0
  282. package/dist/conversion/hub/types/index.d.ts +6 -0
  283. package/dist/conversion/hub/types/index.js +6 -0
  284. package/dist/conversion/hub/types/json.d.ts +9 -0
  285. package/dist/conversion/hub/types/json.js +9 -0
  286. package/dist/conversion/hub/types/node.d.ts +31 -0
  287. package/dist/conversion/hub/types/node.js +1 -0
  288. package/dist/conversion/hub/types/standardized.d.ts +94 -0
  289. package/dist/conversion/hub/types/standardized.js +1 -0
  290. package/dist/conversion/index.d.ts +28 -0
  291. package/dist/conversion/index.js +28 -0
  292. package/dist/conversion/responses/responses-openai-bridge.d.ts +95 -0
  293. package/dist/conversion/responses/responses-openai-bridge.js +1330 -0
  294. package/dist/conversion/schema-validator.d.ts +7 -0
  295. package/dist/conversion/schema-validator.js +67 -0
  296. package/dist/conversion/shared/args-mapping.d.ts +18 -0
  297. package/dist/conversion/shared/args-mapping.js +213 -0
  298. package/dist/conversion/shared/chat-request-filters.d.ts +9 -0
  299. package/dist/conversion/shared/chat-request-filters.js +74 -0
  300. package/dist/conversion/shared/jsonish.d.ts +3 -0
  301. package/dist/conversion/shared/jsonish.js +177 -0
  302. package/dist/conversion/shared/mcp-injection.d.ts +2 -0
  303. package/dist/conversion/shared/mcp-injection.js +89 -0
  304. package/dist/conversion/shared/media.d.ts +1 -0
  305. package/dist/conversion/shared/media.js +9 -0
  306. package/dist/conversion/shared/openai-finalizer.d.ts +9 -0
  307. package/dist/conversion/shared/openai-finalizer.js +104 -0
  308. package/dist/conversion/shared/openai-message-normalize.d.ts +1 -0
  309. package/dist/conversion/shared/openai-message-normalize.js +442 -0
  310. package/dist/conversion/shared/payload-budget.d.ts +13 -0
  311. package/dist/conversion/shared/payload-budget.js +248 -0
  312. package/dist/conversion/shared/reasoning-mapping.d.ts +5 -0
  313. package/dist/conversion/shared/reasoning-mapping.js +8 -0
  314. package/dist/conversion/shared/responses-conversation-store.d.ts +41 -0
  315. package/dist/conversion/shared/responses-conversation-store.js +285 -0
  316. package/dist/conversion/shared/responses-id-utils.d.ts +7 -0
  317. package/dist/conversion/shared/responses-id-utils.js +29 -0
  318. package/dist/conversion/shared/responses-instructions.d.ts +1 -0
  319. package/dist/conversion/shared/responses-instructions.js +113 -0
  320. package/dist/conversion/shared/responses-metadata.d.ts +1 -0
  321. package/dist/conversion/shared/responses-metadata.js +1 -0
  322. package/dist/conversion/shared/responses-request-adapter.d.ts +66 -0
  323. package/dist/conversion/shared/responses-request-adapter.js +461 -0
  324. package/dist/conversion/shared/snapshot-hooks.d.ts +12 -0
  325. package/dist/conversion/shared/snapshot-hooks.js +7 -0
  326. package/dist/conversion/shared/streaming-text-extractor.d.ts +26 -0
  327. package/dist/conversion/shared/streaming-text-extractor.js +145 -0
  328. package/dist/conversion/shared/text-markup-normalizer.d.ts +9 -0
  329. package/dist/conversion/shared/text-markup-normalizer.js +319 -0
  330. package/dist/conversion/shared/tool-canonicalizer.d.ts +2 -0
  331. package/dist/conversion/shared/tool-canonicalizer.js +50 -0
  332. package/dist/conversion/shared/tool-filter-pipeline.d.ts +17 -0
  333. package/dist/conversion/shared/tool-filter-pipeline.js +79 -0
  334. package/dist/conversion/shared/tool-governor.d.ts +27 -0
  335. package/dist/conversion/shared/tool-governor.js +269 -0
  336. package/dist/conversion/shared/tool-harvester.d.ts +31 -0
  337. package/dist/conversion/shared/tool-harvester.js +321 -0
  338. package/dist/conversion/shared/tool-mapping.d.ts +10 -0
  339. package/dist/conversion/shared/tool-mapping.js +10 -0
  340. package/dist/conversion/shared/tooling.d.ts +26 -0
  341. package/dist/conversion/shared/tooling.js +143 -0
  342. package/dist/conversion/types.d.ts +33 -0
  343. package/dist/conversion/types.js +1 -0
  344. package/dist/core/index.d.ts +6 -0
  345. package/dist/core/index.js +9 -0
  346. package/dist/core/llmswitch-engine-v2.d.ts +132 -0
  347. package/dist/core/llmswitch-engine-v2.js +649 -0
  348. package/dist/core/llmswitch-factory-v2.d.ts +123 -0
  349. package/dist/core/llmswitch-factory-v2.js +521 -0
  350. package/dist/endpoints/base-endpoint-handler.d.ts +128 -0
  351. package/dist/endpoints/base-endpoint-handler.js +545 -0
  352. package/dist/endpoints/chat-endpoint-handler.d.ts +115 -0
  353. package/dist/endpoints/chat-endpoint-handler.js +218 -0
  354. package/dist/endpoints/endpoint-router.d.ts +127 -0
  355. package/dist/endpoints/endpoint-router.js +438 -0
  356. package/dist/endpoints/index.d.ts +13 -0
  357. package/dist/endpoints/index.js +11 -0
  358. package/dist/endpoints/messages-endpoint-handler.d.ts +171 -0
  359. package/dist/endpoints/messages-endpoint-handler.js +238 -0
  360. package/dist/endpoints/responses-endpoint-handler.d.ts +147 -0
  361. package/dist/endpoints/responses-endpoint-handler.js +233 -0
  362. package/dist/filters/builtin/add-fields-filter.d.ts +8 -0
  363. package/dist/filters/builtin/add-fields-filter.js +16 -0
  364. package/dist/filters/builtin/blacklist-filter.d.ts +8 -0
  365. package/dist/filters/builtin/blacklist-filter.js +19 -0
  366. package/dist/filters/builtin/whitelist-filter.d.ts +8 -0
  367. package/dist/filters/builtin/whitelist-filter.js +19 -0
  368. package/dist/filters/engine.d.ts +16 -0
  369. package/dist/filters/engine.js +167 -0
  370. package/dist/filters/index.d.ts +19 -0
  371. package/dist/filters/index.js +24 -0
  372. package/dist/filters/special/request-streaming-to-nonstreaming.d.ts +12 -0
  373. package/dist/filters/special/request-streaming-to-nonstreaming.js +27 -0
  374. package/dist/filters/special/request-tool-choice-policy.d.ts +11 -0
  375. package/dist/filters/special/request-tool-choice-policy.js +27 -0
  376. package/dist/filters/special/request-tool-list-filter.d.ts +11 -0
  377. package/dist/filters/special/request-tool-list-filter.js +167 -0
  378. package/dist/filters/special/request-toolcalls-stringify.d.ts +10 -0
  379. package/dist/filters/special/request-toolcalls-stringify.js +44 -0
  380. package/dist/filters/special/request-tools-normalize.d.ts +12 -0
  381. package/dist/filters/special/request-tools-normalize.js +140 -0
  382. package/dist/filters/special/response-finish-invariants.d.ts +11 -0
  383. package/dist/filters/special/response-finish-invariants.js +30 -0
  384. package/dist/filters/special/response-openai-to-responses-bridge.d.ts +13 -0
  385. package/dist/filters/special/response-openai-to-responses-bridge.js +24 -0
  386. package/dist/filters/special/response-tool-arguments-blacklist.d.ts +12 -0
  387. package/dist/filters/special/response-tool-arguments-blacklist.js +63 -0
  388. package/dist/filters/special/response-tool-arguments-schema-converge.d.ts +13 -0
  389. package/dist/filters/special/response-tool-arguments-schema-converge.js +63 -0
  390. package/dist/filters/special/response-tool-arguments-stringify.d.ts +9 -0
  391. package/dist/filters/special/response-tool-arguments-stringify.js +134 -0
  392. package/dist/filters/special/response-tool-arguments-toon-decode.d.ts +10 -0
  393. package/dist/filters/special/response-tool-arguments-toon-decode.js +94 -0
  394. package/dist/filters/special/response-tool-arguments-whitelist.d.ts +11 -0
  395. package/dist/filters/special/response-tool-arguments-whitelist.js +56 -0
  396. package/dist/filters/special/response-tool-text-canonicalize.d.ts +10 -0
  397. package/dist/filters/special/response-tool-text-canonicalize.js +20 -0
  398. package/dist/filters/special/tool-filter-hooks.d.ts +19 -0
  399. package/dist/filters/special/tool-filter-hooks.js +341 -0
  400. package/dist/filters/special/tool-post-constraints.d.ts +31 -0
  401. package/dist/filters/special/tool-post-constraints.js +120 -0
  402. package/dist/filters/types.d.ts +68 -0
  403. package/dist/filters/types.js +3 -0
  404. package/dist/filters/utils/fieldmap-loader.d.ts +2 -0
  405. package/dist/filters/utils/fieldmap-loader.js +16 -0
  406. package/dist/filters/utils/snapshot-writer.d.ts +10 -0
  407. package/dist/filters/utils/snapshot-writer.js +47 -0
  408. package/dist/guidance/index.d.ts +3 -0
  409. package/dist/guidance/index.js +228 -0
  410. package/dist/hooks/hooks-integration.d.ts +161 -0
  411. package/dist/hooks/hooks-integration.js +519 -0
  412. package/dist/hooks/index.d.ts +10 -0
  413. package/dist/hooks/index.js +13 -0
  414. package/dist/html-to-markdown.d.ts +5 -0
  415. package/dist/html-to-markdown.js +66 -0
  416. package/dist/http/sse-response.d.ts +22 -0
  417. package/dist/http/sse-response.js +103 -0
  418. package/dist/index.d.ts +10 -0
  419. package/dist/index.js +10 -0
  420. package/dist/router/virtual-router/bootstrap.d.ts +6 -0
  421. package/dist/router/virtual-router/bootstrap.js +620 -0
  422. package/dist/router/virtual-router/classifier.d.ts +10 -0
  423. package/dist/router/virtual-router/classifier.js +99 -0
  424. package/dist/router/virtual-router/engine.d.ts +35 -0
  425. package/dist/router/virtual-router/engine.js +260 -0
  426. package/dist/router/virtual-router/error-center.d.ts +10 -0
  427. package/dist/router/virtual-router/error-center.js +39 -0
  428. package/dist/router/virtual-router/features.d.ts +3 -0
  429. package/dist/router/virtual-router/features.js +162 -0
  430. package/dist/router/virtual-router/health-manager.d.ts +18 -0
  431. package/dist/router/virtual-router/health-manager.js +98 -0
  432. package/dist/router/virtual-router/load-balancer.d.ts +18 -0
  433. package/dist/router/virtual-router/load-balancer.js +67 -0
  434. package/dist/router/virtual-router/provider-registry.d.ts +11 -0
  435. package/dist/router/virtual-router/provider-registry.js +74 -0
  436. package/dist/router/virtual-router/types.d.ts +206 -0
  437. package/dist/router/virtual-router/types.js +31 -0
  438. package/dist/sse/index.d.ts +140 -0
  439. package/dist/sse/index.js +115 -0
  440. package/dist/sse/json-to-sse/anthropic-json-to-sse-converter.d.ts +11 -0
  441. package/dist/sse/json-to-sse/anthropic-json-to-sse-converter.js +79 -0
  442. package/dist/sse/json-to-sse/chat-json-to-sse-converter.d.ts +79 -0
  443. package/dist/sse/json-to-sse/chat-json-to-sse-converter.js +296 -0
  444. package/dist/sse/json-to-sse/event-generators/chat.d.ts +55 -0
  445. package/dist/sse/json-to-sse/event-generators/chat.js +233 -0
  446. package/dist/sse/json-to-sse/event-generators/responses.d.ts +99 -0
  447. package/dist/sse/json-to-sse/event-generators/responses.js +599 -0
  448. package/dist/sse/json-to-sse/index.d.ts +6 -0
  449. package/dist/sse/json-to-sse/index.js +7 -0
  450. package/dist/sse/json-to-sse/responses-json-to-sse-converter.d.ts +79 -0
  451. package/dist/sse/json-to-sse/responses-json-to-sse-converter.js +322 -0
  452. package/dist/sse/json-to-sse/sequencers/chat-sequencer.d.ts +37 -0
  453. package/dist/sse/json-to-sse/sequencers/chat-sequencer.js +218 -0
  454. package/dist/sse/json-to-sse/sequencers/responses-sequencer.d.ts +40 -0
  455. package/dist/sse/json-to-sse/sequencers/responses-sequencer.js +263 -0
  456. package/dist/sse/registry/sse-codec-registry.d.ts +32 -0
  457. package/dist/sse/registry/sse-codec-registry.js +106 -0
  458. package/dist/sse/shared/chat-serializer.d.ts +4 -0
  459. package/dist/sse/shared/chat-serializer.js +40 -0
  460. package/dist/sse/shared/constants.d.ts +272 -0
  461. package/dist/sse/shared/constants.js +321 -0
  462. package/dist/sse/shared/serializers/base-serializer.d.ts +158 -0
  463. package/dist/sse/shared/serializers/base-serializer.js +210 -0
  464. package/dist/sse/shared/serializers/chat-event-serializer.d.ts +82 -0
  465. package/dist/sse/shared/serializers/chat-event-serializer.js +275 -0
  466. package/dist/sse/shared/serializers/index.d.ts +39 -0
  467. package/dist/sse/shared/serializers/index.js +54 -0
  468. package/dist/sse/shared/serializers/responses-event-serializer.d.ts +123 -0
  469. package/dist/sse/shared/serializers/responses-event-serializer.js +356 -0
  470. package/dist/sse/shared/serializers/types.d.ts +51 -0
  471. package/dist/sse/shared/serializers/types.js +4 -0
  472. package/dist/sse/shared/utils.d.ts +254 -0
  473. package/dist/sse/shared/utils.js +543 -0
  474. package/dist/sse/shared/writer.d.ts +111 -0
  475. package/dist/sse/shared/writer.js +268 -0
  476. package/dist/sse/sse-to-json/anthropic-sse-to-json-converter.d.ts +13 -0
  477. package/dist/sse/sse-to-json/anthropic-sse-to-json-converter.js +139 -0
  478. package/dist/sse/sse-to-json/builders/response-builder.d.ts +165 -0
  479. package/dist/sse/sse-to-json/builders/response-builder.js +776 -0
  480. package/dist/sse/sse-to-json/chat-sse-to-json-converter.d.ts +106 -0
  481. package/dist/sse/sse-to-json/chat-sse-to-json-converter.js +540 -0
  482. package/dist/sse/sse-to-json/index.d.ts +6 -0
  483. package/dist/sse/sse-to-json/index.js +7 -0
  484. package/dist/sse/sse-to-json/parsers/sse-parser.d.ts +73 -0
  485. package/dist/sse/sse-to-json/parsers/sse-parser.js +340 -0
  486. package/dist/sse/sse-to-json/responses-sse-to-json-converter.d.ts +59 -0
  487. package/dist/sse/sse-to-json/responses-sse-to-json-converter.js +270 -0
  488. package/dist/sse/types/anthropic-types.d.ts +87 -0
  489. package/dist/sse/types/anthropic-types.js +5 -0
  490. package/dist/sse/types/chat-types.d.ts +308 -0
  491. package/dist/sse/types/chat-types.js +32 -0
  492. package/dist/sse/types/conversion-context.d.ts +211 -0
  493. package/dist/sse/types/conversion-context.js +20 -0
  494. package/dist/sse/types/core-interfaces.d.ts +90 -0
  495. package/dist/sse/types/core-interfaces.js +5 -0
  496. package/dist/sse/types/index.d.ts +14 -0
  497. package/dist/sse/types/index.js +7 -0
  498. package/dist/sse/types/responses-types.d.ts +328 -0
  499. package/dist/sse/types/responses-types.js +38 -0
  500. package/dist/sse/types/sse-events.d.ts +180 -0
  501. package/dist/sse/types/sse-events.js +150 -0
  502. package/dist/sse/types/stream-state.d.ts +204 -0
  503. package/dist/sse/types/stream-state.js +44 -0
  504. package/dist/sse/types/utility-types.d.ts +230 -0
  505. package/dist/sse/types/utility-types.js +49 -0
  506. package/dist/tools/proxy/anthropic-tool-proxy.d.ts +19 -0
  507. package/dist/tools/proxy/anthropic-tool-proxy.js +57 -0
  508. package/dist/tools/proxy/executors/web-fetch.d.ts +6 -0
  509. package/dist/tools/proxy/executors/web-fetch.js +39 -0
  510. package/dist/tools/proxy/registry.d.ts +8 -0
  511. package/dist/tools/proxy/registry.js +14 -0
  512. package/dist/tools/proxy/types.d.ts +29 -0
  513. package/dist/tools/proxy/types.js +1 -0
  514. package/dist/tools/tool-registry.d.ts +8 -0
  515. package/dist/tools/tool-registry.js +154 -0
  516. package/dist/tools/web-fetch-html.d.ts +15 -0
  517. package/dist/tools/web-fetch-html.js +83 -0
  518. package/dist/utils/conversion-adapter.d.ts +65 -0
  519. package/dist/utils/conversion-adapter.js +183 -0
  520. package/dist/utils/error-factory.d.ts +88 -0
  521. package/dist/utils/error-factory.js +138 -0
  522. package/dist/utils/error-utils.d.ts +334 -0
  523. package/dist/utils/error-utils.js +782 -0
  524. package/dist/utils/index.d.ts +8 -0
  525. package/dist/utils/index.js +13 -0
  526. package/dist/utils/performance-utils.d.ts +205 -0
  527. package/dist/utils/performance-utils.js +440 -0
  528. package/dist/utils/profile-mapper.d.ts +32 -0
  529. package/dist/utils/profile-mapper.js +269 -0
  530. package/dist/utils/request-processor.d.ts +52 -0
  531. package/dist/utils/request-processor.js +210 -0
  532. package/dist/utils/request-utils.d.ts +117 -0
  533. package/dist/utils/request-utils.js +333 -0
  534. package/dist/utils/response-utils.d.ts +127 -0
  535. package/dist/utils/response-utils.js +516 -0
  536. package/dist/utils/token-counter.d.ts +89 -0
  537. package/dist/utils/token-counter.js +541 -0
  538. package/package.json +65 -0
@@ -0,0 +1,140 @@
1
+ function isObject(v) {
2
+ return !!v && typeof v === 'object' && !Array.isArray(v);
3
+ }
4
+ /**
5
+ * Normalize OpenAI tools definitions at the final request stage.
6
+ * - Switches shell parameters schema to TOON ({ toon: string }) when enabled and not heredoc.
7
+ * - Otherwise enforces { command: string | string[], workdir?: string } shape.
8
+ * - Best-effort; never throws.
9
+ */
10
+ export class RequestOpenAIToolsNormalizeFilter {
11
+ name = 'request_openai_tools_normalize';
12
+ stage = 'request_finalize';
13
+ async apply(input) {
14
+ try {
15
+ const out = JSON.parse(JSON.stringify(input || {}));
16
+ const messages = Array.isArray(out.messages) ? out.messages : [];
17
+ const lastUser = [...messages].reverse().find((m) => m && m.role === 'user');
18
+ let lastText = '';
19
+ if (typeof lastUser?.content === 'string') {
20
+ lastText = lastUser.content;
21
+ }
22
+ else if (Array.isArray(lastUser?.content)) {
23
+ for (const p of lastUser.content) {
24
+ if (p && typeof p.text === 'string' && p.text.trim()) {
25
+ lastText = p.text;
26
+ break;
27
+ }
28
+ }
29
+ }
30
+ const looksHeredoc = /<<[-']?\w+/.test(lastText);
31
+ const toonEnv = String(process?.env?.RCC_TOON_ENABLE || process?.env?.ROUTECODEX_TOON_ENABLE || '').toLowerCase();
32
+ const toonEnabled = toonEnv ? !(toonEnv === '0' || toonEnv === 'false' || toonEnv === 'off') : true; // default ON
33
+ const tools = Array.isArray(out.tools) ? out.tools : [];
34
+ if (!tools.length) {
35
+ // No tools present: drop tool_choice to avoid provider-side validation errors
36
+ try {
37
+ if ('tool_choice' in out)
38
+ delete out.tool_choice;
39
+ }
40
+ catch { /* ignore */ }
41
+ return { ok: true, data: out };
42
+ }
43
+ let normalizedList = [];
44
+ try {
45
+ const mod = await import('../../conversion/shared/args-mapping.js');
46
+ const normalizeTools = mod?.normalizeTools;
47
+ if (typeof normalizeTools === 'function')
48
+ normalizedList = normalizeTools(tools);
49
+ }
50
+ catch { /* passthrough on failure */ }
51
+ const finalTools = [];
52
+ const max = Math.max(tools.length, normalizedList.length);
53
+ for (let i = 0; i < max; i++) {
54
+ const src = tools[i];
55
+ const dst = normalizedList[i];
56
+ if (dst && isObject(dst) && isObject(dst.function) && typeof dst.function.name === 'string') {
57
+ const fn = dst.function;
58
+ // Ensure type and minimal function shape
59
+ if (typeof dst.type !== 'string' || !String(dst.type).trim()) {
60
+ dst.type = 'function';
61
+ }
62
+ // Ensure parameters object shape exists
63
+ if (!isObject(fn.parameters)) {
64
+ dst.function = { ...fn, parameters: { type: 'object', properties: {}, additionalProperties: true } };
65
+ }
66
+ // Ensure description string exists
67
+ if (typeof fn.description !== 'string') {
68
+ dst.function = { ...dst.function, description: '' };
69
+ }
70
+ // Drop non-standard strict flag to pass strict providers that reject unknown tool fields
71
+ try {
72
+ if ('strict' in dst.function)
73
+ delete dst.function.strict;
74
+ }
75
+ catch { /* ignore */ }
76
+ // Switch schema for 'shell' at unified shaping point
77
+ try {
78
+ const name = String(dst.function.name || '').toLowerCase();
79
+ if (name === 'shell') {
80
+ const wantToon = toonEnabled && !looksHeredoc;
81
+ if (wantToon) {
82
+ dst.function.parameters = {
83
+ type: 'object',
84
+ properties: {
85
+ toon: { type: 'string', description: 'TOON-encoded arguments (multi-line key: value). Example: command: bash -lc "echo ok"\\nworkdir: .' }
86
+ },
87
+ required: ['toon'],
88
+ additionalProperties: false
89
+ };
90
+ dst.function.description = 'Use TOON: put arguments into arguments.toon as multi-line key: value (e.g., command / workdir).';
91
+ }
92
+ else {
93
+ dst.function.parameters = {
94
+ type: 'object',
95
+ properties: {
96
+ command: { oneOf: [{ type: 'string' }, { type: 'array', items: { type: 'string' } }] },
97
+ workdir: { type: 'string' }
98
+ },
99
+ required: ['command'],
100
+ additionalProperties: false
101
+ };
102
+ }
103
+ }
104
+ }
105
+ catch { /* ignore */ }
106
+ finalTools.push(dst);
107
+ }
108
+ else if (src && isObject(src)) {
109
+ // Fallback: minimally enforce required fields on raw src entries
110
+ const item = JSON.parse(JSON.stringify(src));
111
+ if (typeof item.type !== 'string' || !String(item.type).trim())
112
+ item.type = 'function';
113
+ if (!isObject(item.function))
114
+ item.function = {};
115
+ if (typeof item.function.name !== 'string')
116
+ item.function.name = String(item.name || 'tool');
117
+ if (!isObject(item.function.parameters))
118
+ item.function.parameters = { type: 'object', properties: {}, additionalProperties: true };
119
+ try {
120
+ if ('strict' in item.function)
121
+ delete item.function.strict;
122
+ }
123
+ catch { }
124
+ finalTools.push(item);
125
+ }
126
+ }
127
+ out.tools = finalTools;
128
+ // If tools ended up empty, drop tool_choice to avoid upstream validation issues
129
+ try {
130
+ if (Array.isArray(out.tools) && out.tools.length === 0 && 'tool_choice' in out)
131
+ delete out.tool_choice;
132
+ }
133
+ catch { /* ignore */ }
134
+ return { ok: true, data: out };
135
+ }
136
+ catch {
137
+ return { ok: true, data: input };
138
+ }
139
+ }
140
+ }
@@ -0,0 +1,11 @@
1
+ import type { Filter, FilterContext, FilterResult, JsonObject } from '../types.js';
2
+ /**
3
+ * Ensure finish_reason and content invariants on response side:
4
+ * - If tool_calls present, finish_reason defaults to 'tool_calls'
5
+ * - If tool_calls present, message.content=null (Chat path)
6
+ */
7
+ export declare class ResponseFinishInvariantsFilter implements Filter<JsonObject> {
8
+ readonly name = "response_finish_invariants";
9
+ readonly stage: FilterContext['stage'];
10
+ apply(input: JsonObject): FilterResult<JsonObject>;
11
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Ensure finish_reason and content invariants on response side:
3
+ * - If tool_calls present, finish_reason defaults to 'tool_calls'
4
+ * - If tool_calls present, message.content=null (Chat path)
5
+ */
6
+ export class ResponseFinishInvariantsFilter {
7
+ name = 'response_finish_invariants';
8
+ stage = 'response_post';
9
+ apply(input) {
10
+ try {
11
+ const out = JSON.parse(JSON.stringify(input || {}));
12
+ const choices = Array.isArray(out.choices) ? out.choices : [];
13
+ for (const ch of choices) {
14
+ const msg = ch && ch.message ? ch.message : undefined;
15
+ const tcs = msg && Array.isArray(msg.tool_calls) ? msg.tool_calls : [];
16
+ if (tcs.length > 0) {
17
+ if (ch.finish_reason == null)
18
+ ch.finish_reason = 'tool_calls';
19
+ if (msg && typeof msg === 'object')
20
+ msg.content = null;
21
+ }
22
+ }
23
+ out.choices = choices;
24
+ return { ok: true, data: out };
25
+ }
26
+ catch {
27
+ return { ok: true, data: input };
28
+ }
29
+ }
30
+ }
@@ -0,0 +1,13 @@
1
+ import type { Filter, FilterContext, JsonObject, FilterResult } from '../types.js';
2
+ /**
3
+ * ResponseOpenAIToResponsesBridgeFilter
4
+ * - 将 OpenAI Chat 形状的响应桥接为 OpenAI Responses 形状
5
+ * - 与 Anthropic 并行:使用 filter 进行形状/协议转换(而非 endpoint 分支)
6
+ * - 阶段:response_post(在基础规范化之后执行)
7
+ */
8
+ export declare class ResponseOpenAIToResponsesBridgeFilter implements Filter<JsonObject> {
9
+ readonly name = "response_openai_to_responses_bridge";
10
+ readonly stage: FilterContext['stage'];
11
+ apply(input: JsonObject, ctx: FilterContext): Promise<FilterResult<JsonObject>>;
12
+ }
13
+ export default ResponseOpenAIToResponsesBridgeFilter;
@@ -0,0 +1,24 @@
1
+ import { buildResponsesPayloadFromChat } from '../../conversion/responses/responses-openai-bridge.js';
2
+ /**
3
+ * ResponseOpenAIToResponsesBridgeFilter
4
+ * - 将 OpenAI Chat 形状的响应桥接为 OpenAI Responses 形状
5
+ * - 与 Anthropic 并行:使用 filter 进行形状/协议转换(而非 endpoint 分支)
6
+ * - 阶段:response_post(在基础规范化之后执行)
7
+ */
8
+ export class ResponseOpenAIToResponsesBridgeFilter {
9
+ name = 'response_openai_to_responses_bridge';
10
+ stage = 'response_post';
11
+ async apply(input, ctx) {
12
+ try {
13
+ const requestId = ctx.requestId || `resp_${Date.now()}`;
14
+ const context = { requestId, endpoint: '/v1/responses', metadata: {} };
15
+ const bridged = buildResponsesPayloadFromChat(input, context);
16
+ return { ok: true, data: bridged };
17
+ }
18
+ catch {
19
+ // 桥接失败则保持原样(Fail Fast 由上层处理)
20
+ return { ok: true, data: input };
21
+ }
22
+ }
23
+ }
24
+ export default ResponseOpenAIToResponsesBridgeFilter;
@@ -0,0 +1,12 @@
1
+ import type { Filter, FilterContext, FilterResult, JsonObject } from '../types.js';
2
+ /**
3
+ * ResponseToolArgumentsBlacklistFilter
4
+ * - Remove keys listed in ROUTECODEX_TOOLARGS_BLACKLIST from tool_calls[].function.arguments (after decode).
5
+ * - Default: empty blacklist (no-op). Enables incremental hardening without risking valid params.
6
+ * Stage: response_pre
7
+ */
8
+ export declare class ResponseToolArgumentsBlacklistFilter implements Filter<JsonObject> {
9
+ readonly name = "response_tool_arguments_blacklist";
10
+ readonly stage: FilterContext['stage'];
11
+ apply(input: JsonObject): FilterResult<JsonObject>;
12
+ }
@@ -0,0 +1,63 @@
1
+ function isObject(v) { return !!v && typeof v === 'object' && !Array.isArray(v); }
2
+ function parseJson(str) { try {
3
+ return JSON.parse(str);
4
+ }
5
+ catch {
6
+ return null;
7
+ } }
8
+ function getBlacklist() {
9
+ const env = String(process?.env?.ROUTECODEX_TOOLARGS_BLACKLIST || '').trim();
10
+ if (!env)
11
+ return [];
12
+ return env.split(',').map(s => s.trim()).filter(Boolean);
13
+ }
14
+ /**
15
+ * ResponseToolArgumentsBlacklistFilter
16
+ * - Remove keys listed in ROUTECODEX_TOOLARGS_BLACKLIST from tool_calls[].function.arguments (after decode).
17
+ * - Default: empty blacklist (no-op). Enables incremental hardening without risking valid params.
18
+ * Stage: response_pre
19
+ */
20
+ export class ResponseToolArgumentsBlacklistFilter {
21
+ name = 'response_tool_arguments_blacklist';
22
+ stage = 'response_pre';
23
+ apply(input) {
24
+ const blacklist = getBlacklist();
25
+ if (blacklist.length === 0)
26
+ return { ok: true, data: input };
27
+ try {
28
+ const out = JSON.parse(JSON.stringify(input || {}));
29
+ const choices = Array.isArray(out.choices) ? out.choices : [];
30
+ for (const ch of choices) {
31
+ const msg = ch && ch.message ? ch.message : undefined;
32
+ const tcs = msg && Array.isArray(msg.tool_calls) ? msg.tool_calls : [];
33
+ for (const tc of tcs) {
34
+ const fn = tc && tc.function ? tc.function : undefined;
35
+ const argStr = fn && typeof fn.arguments === 'string' ? fn.arguments : undefined;
36
+ if (!argStr)
37
+ continue;
38
+ const parsed = parseJson(argStr);
39
+ if (!isObject(parsed))
40
+ continue;
41
+ let changed = false;
42
+ for (const k of blacklist) {
43
+ if (k in parsed) {
44
+ delete parsed[k];
45
+ changed = true;
46
+ }
47
+ }
48
+ if (changed) {
49
+ try {
50
+ fn.arguments = JSON.stringify(parsed);
51
+ }
52
+ catch { /* keep original */ }
53
+ }
54
+ }
55
+ }
56
+ out.choices = choices;
57
+ return { ok: true, data: out };
58
+ }
59
+ catch {
60
+ return { ok: true, data: input };
61
+ }
62
+ }
63
+ }
@@ -0,0 +1,13 @@
1
+ import type { Filter, FilterContext, FilterResult, JsonObject } from '../types.js';
2
+ /**
3
+ * ResponseToolArgumentsSchemaConvergeFilter
4
+ * - If tool schemas are available on context (context.toolSchemas[name] = JSONSchema),
5
+ * keep only keys defined in schema.properties for each tool call arguments.
6
+ * - Does not validate or coerce types; only converges keys to schema surface.
7
+ * - Stage: response_pre
8
+ */
9
+ export declare class ResponseToolArgumentsSchemaConvergeFilter implements Filter<JsonObject> {
10
+ readonly name = "response_tool_arguments_schema_converge";
11
+ readonly stage: FilterContext['stage'];
12
+ apply(input: JsonObject, context?: FilterContext): FilterResult<JsonObject>;
13
+ }
@@ -0,0 +1,63 @@
1
+ function isObject(v) {
2
+ return !!v && typeof v === 'object' && !Array.isArray(v);
3
+ }
4
+ function parseJson(str) {
5
+ try {
6
+ return JSON.parse(str);
7
+ }
8
+ catch {
9
+ return null;
10
+ }
11
+ }
12
+ /**
13
+ * ResponseToolArgumentsSchemaConvergeFilter
14
+ * - If tool schemas are available on context (context.toolSchemas[name] = JSONSchema),
15
+ * keep only keys defined in schema.properties for each tool call arguments.
16
+ * - Does not validate or coerce types; only converges keys to schema surface.
17
+ * - Stage: response_pre
18
+ */
19
+ export class ResponseToolArgumentsSchemaConvergeFilter {
20
+ name = 'response_tool_arguments_schema_converge';
21
+ stage = 'response_pre';
22
+ apply(input, context) {
23
+ try {
24
+ const schemaMap = context?.toolSchemas;
25
+ if (!schemaMap || typeof schemaMap !== 'object')
26
+ return { ok: true, data: input };
27
+ const out = JSON.parse(JSON.stringify(input || {}));
28
+ const choices = Array.isArray(out.choices) ? out.choices : [];
29
+ for (const ch of choices) {
30
+ const msg = ch && ch.message ? ch.message : undefined;
31
+ const tcs = msg && Array.isArray(msg.tool_calls) ? msg.tool_calls : [];
32
+ for (const tc of tcs) {
33
+ const fn = tc && tc.function ? tc.function : undefined;
34
+ const name = fn && typeof fn.name === 'string' ? String(fn.name) : '';
35
+ if (!name)
36
+ continue;
37
+ const schema = schemaMap[name];
38
+ const props = schema && schema.properties && isObject(schema.properties) ? schema.properties : undefined;
39
+ if (!props || !isObject(fn))
40
+ continue;
41
+ const argStr = typeof fn.arguments === 'string' ? fn.arguments : undefined;
42
+ const parsed = argStr ? parseJson(argStr) : (isObject(fn.arguments) ? fn.arguments : null);
43
+ if (!isObject(parsed))
44
+ continue;
45
+ const whitelisted = {};
46
+ for (const k of Object.keys(props)) {
47
+ if (k in parsed)
48
+ whitelisted[k] = parsed[k];
49
+ }
50
+ try {
51
+ fn.arguments = JSON.stringify(whitelisted);
52
+ }
53
+ catch { /* keep original */ }
54
+ }
55
+ }
56
+ out.choices = choices;
57
+ return { ok: true, data: out };
58
+ }
59
+ catch {
60
+ return { ok: true, data: input };
61
+ }
62
+ }
63
+ }
@@ -0,0 +1,9 @@
1
+ import type { Filter, FilterContext, FilterResult, JsonObject } from '../types.js';
2
+ /**
3
+ * Ensure choices[*].message.tool_calls[].function.arguments is a JSON string.
4
+ */
5
+ export declare class ResponseToolArgumentsStringifyFilter implements Filter<JsonObject> {
6
+ readonly name = "response_tool_arguments_stringify";
7
+ readonly stage: FilterContext['stage'];
8
+ apply(input: JsonObject): FilterResult<JsonObject>;
9
+ }
@@ -0,0 +1,134 @@
1
+ function isObject(v) {
2
+ return !!v && typeof v === 'object' && !Array.isArray(v);
3
+ }
4
+ function repairFindMeta(s) {
5
+ // Minimal, idempotent repairs for common find expressions within a shell:
6
+ // - ensure -exec terminator is escaped exactly once: ; => \\;
7
+ // - collapse multiple backslashes before ; to a single backslash
8
+ // - escape unescaped parentheses used in predicates: ( ) -> \\( \\)
9
+ try {
10
+ const hasFind = /(^|\s)find\s/.test(s);
11
+ if (!hasFind)
12
+ return s;
13
+ let out = s;
14
+ // Only escape semicolon not already escaped (negative lookbehind)
15
+ out = out.replace(/-exec([^;]*?)(?<!\\);/g, (_m, g1) => `-exec${g1} \\;`);
16
+ // Collapse multiple backslashes immediately before ; into a single backslash
17
+ out = out.replace(/-exec([^;]*?)\\+;/g, (_m, g1) => `-exec${g1} \\;`);
18
+ // Escape parentheses only when not already escaped
19
+ out = out.replace(/(?<!\\)\(/g, '\\(').replace(/(?<!\\)\)/g, '\\)');
20
+ return out;
21
+ }
22
+ catch {
23
+ return s;
24
+ }
25
+ }
26
+ function packShellCommand(cmd) {
27
+ // Normalize into ["bash","-lc","<single string>"] to support pipes, parens, -exec, etc.
28
+ const normalizeArray = (argv) => {
29
+ if (argv.length >= 2 && argv[0].toLowerCase() === 'bash' && argv[1] === '-lc') {
30
+ if (argv.length === 3)
31
+ return ['bash', '-lc', repairFindMeta(String(argv[2]))];
32
+ const tail = argv.slice(2).join(' ');
33
+ return ['bash', '-lc', repairFindMeta(tail)];
34
+ }
35
+ const joined = argv.join(' ');
36
+ return ['bash', '-lc', repairFindMeta(joined)];
37
+ };
38
+ try {
39
+ if (Array.isArray(cmd)) {
40
+ return normalizeArray(cmd.map((x) => String(x)));
41
+ }
42
+ if (typeof cmd === 'string') {
43
+ // If the string looks like a JSON array, attempt to parse before normalizing.
44
+ const trimmed = cmd.trim();
45
+ if (trimmed.startsWith('[') && trimmed.endsWith(']')) {
46
+ try {
47
+ const parsed = JSON.parse(trimmed);
48
+ if (Array.isArray(parsed)) {
49
+ return normalizeArray(parsed.map((x) => String(x)));
50
+ }
51
+ }
52
+ catch {
53
+ // fall back to treating as plain string
54
+ }
55
+ }
56
+ return ['bash', '-lc', repairFindMeta(cmd)];
57
+ }
58
+ }
59
+ catch {
60
+ // fall through
61
+ }
62
+ return cmd;
63
+ }
64
+ /**
65
+ * Ensure choices[*].message.tool_calls[].function.arguments is a JSON string.
66
+ */
67
+ export class ResponseToolArgumentsStringifyFilter {
68
+ name = 'response_tool_arguments_stringify';
69
+ stage = 'response_post';
70
+ apply(input) {
71
+ try {
72
+ const out = JSON.parse(JSON.stringify(input || {}));
73
+ const choices = Array.isArray(out.choices) ? out.choices : [];
74
+ for (const ch of choices) {
75
+ const msg = ch && ch.message ? ch.message : undefined;
76
+ const tcs = msg && Array.isArray(msg.tool_calls) ? msg.tool_calls : [];
77
+ for (const tc of tcs) {
78
+ try {
79
+ const fn = tc && tc.function ? tc.function : undefined;
80
+ if (fn && typeof fn === 'object') {
81
+ const name = typeof fn.name === 'string' ? String(fn.name).trim().toLowerCase() : '';
82
+ const argIn = fn.arguments;
83
+ let parsed = undefined;
84
+ if (typeof argIn === 'string') {
85
+ try {
86
+ parsed = JSON.parse(argIn);
87
+ }
88
+ catch {
89
+ parsed = undefined;
90
+ }
91
+ }
92
+ else if (isObject(argIn)) {
93
+ parsed = argIn;
94
+ }
95
+ if (name === 'shell' && isObject(parsed)) {
96
+ const cmd = parsed.command;
97
+ parsed.command = packShellCommand(cmd);
98
+ try {
99
+ fn.arguments = JSON.stringify(parsed ?? {});
100
+ }
101
+ catch {
102
+ fn.arguments = '{}';
103
+ }
104
+ }
105
+ else {
106
+ if (typeof argIn !== 'string') {
107
+ try {
108
+ fn.arguments = JSON.stringify(argIn ?? {});
109
+ }
110
+ catch {
111
+ fn.arguments = '{}';
112
+ }
113
+ }
114
+ }
115
+ // Ensure invariants per tool_call
116
+ if (!tc.id || typeof tc.id !== 'string') {
117
+ const basis = `${name || 'tool'}_${Math.random().toString(36).slice(2, 10)}`;
118
+ tc.id = `call_${basis}`;
119
+ }
120
+ if (!tc.type)
121
+ tc.type = 'function';
122
+ }
123
+ }
124
+ catch { /* ignore */ }
125
+ }
126
+ }
127
+ out.choices = choices;
128
+ return { ok: true, data: out };
129
+ }
130
+ catch {
131
+ return { ok: true, data: input };
132
+ }
133
+ }
134
+ }
@@ -0,0 +1,10 @@
1
+ import type { Filter, FilterContext, FilterResult, JsonObject } from '../types.js';
2
+ /**
3
+ * Decode arguments.toon to standard JSON ({command, workdir?}) and map tool name 'shell_toon' → 'shell'.
4
+ * Stage: response_pre (before arguments stringify and invariants).
5
+ */
6
+ export declare class ResponseToolArgumentsToonDecodeFilter implements Filter<JsonObject> {
7
+ readonly name = "response_tool_arguments_toon_decode";
8
+ readonly stage: FilterContext['stage'];
9
+ apply(input: JsonObject): FilterResult<JsonObject>;
10
+ }
@@ -0,0 +1,94 @@
1
+ function envEnabled() {
2
+ // Default ON. Allow disabling via env RCC_TOON_ENABLE/ROUTECODEX_TOON_ENABLE = 0|false|off
3
+ const v = String(process?.env?.RCC_TOON_ENABLE || process?.env?.ROUTECODEX_TOON_ENABLE || '').toLowerCase();
4
+ if (!v)
5
+ return true;
6
+ return !(v === '0' || v === 'false' || v === 'off');
7
+ }
8
+ function isObject(v) { return !!v && typeof v === 'object' && !Array.isArray(v); }
9
+ function decodeToonPairs(toon) {
10
+ try {
11
+ const out = {};
12
+ const lines = String(toon).split(/\r?\n/);
13
+ for (const raw of lines) {
14
+ const line = raw.trim();
15
+ if (!line)
16
+ continue;
17
+ const m = line.match(/^([A-Za-z0-9_\-]+)\s*:\s*(.*)$/);
18
+ if (!m)
19
+ return null; // fail fast for non key: value
20
+ const key = m[1];
21
+ const val = m[2];
22
+ out[key] = val;
23
+ }
24
+ return out;
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ }
30
+ /**
31
+ * Decode arguments.toon to standard JSON ({command, workdir?}) and map tool name 'shell_toon' → 'shell'.
32
+ * Stage: response_pre (before arguments stringify and invariants).
33
+ */
34
+ export class ResponseToolArgumentsToonDecodeFilter {
35
+ name = 'response_tool_arguments_toon_decode';
36
+ stage = 'response_pre';
37
+ apply(input) {
38
+ if (!envEnabled())
39
+ return { ok: true, data: input };
40
+ try {
41
+ const out = JSON.parse(JSON.stringify(input || {}));
42
+ const choices = Array.isArray(out.choices) ? out.choices : [];
43
+ for (const ch of choices) {
44
+ const msg = ch && ch.message ? ch.message : undefined;
45
+ const tcs = msg && Array.isArray(msg.tool_calls) ? msg.tool_calls : [];
46
+ for (const tc of tcs) {
47
+ try {
48
+ const fn = tc && tc.function ? tc.function : undefined;
49
+ if (!fn || typeof fn !== 'object')
50
+ continue;
51
+ const argStr = fn.arguments;
52
+ if (typeof argStr !== 'string')
53
+ continue;
54
+ let parsed;
55
+ try {
56
+ parsed = JSON.parse(argStr);
57
+ }
58
+ catch {
59
+ continue;
60
+ }
61
+ if (!isObject(parsed))
62
+ continue;
63
+ const toon = parsed.toon;
64
+ if (typeof toon !== 'string' || !toon.trim())
65
+ continue;
66
+ const kv = decodeToonPairs(toon);
67
+ if (!kv)
68
+ continue; // keep original if decode fails
69
+ const command = kv['command'];
70
+ const workdir = kv['workdir'];
71
+ if (typeof command === 'string' && command.trim()) {
72
+ const merged = { command };
73
+ if (typeof workdir === 'string' && workdir.trim())
74
+ merged.workdir = workdir;
75
+ try {
76
+ fn.arguments = JSON.stringify(merged);
77
+ }
78
+ catch { /* keep original */ }
79
+ if (typeof fn.name === 'string' && fn.name === 'shell_toon') {
80
+ fn.name = 'shell';
81
+ }
82
+ }
83
+ }
84
+ catch { /* one tool_call decode failure → ignore */ }
85
+ }
86
+ }
87
+ out.choices = choices;
88
+ return { ok: true, data: out };
89
+ }
90
+ catch {
91
+ return { ok: true, data: input };
92
+ }
93
+ }
94
+ }
@@ -0,0 +1,11 @@
1
+ import type { Filter, FilterContext, FilterResult, JsonObject } from '../types.js';
2
+ /**
3
+ * Whitelist tool function arguments keys after decode to match schema (e.g., keep only 'command'/'workdir').
4
+ * Stage: response_pre. Runs after TOON decode and before stringify.
5
+ */
6
+ export declare class ResponseToolArgumentsWhitelistFilter implements Filter<JsonObject> {
7
+ readonly name = "response_tool_arguments_whitelist";
8
+ readonly stage: FilterContext['stage'];
9
+ private getWhitelist;
10
+ apply(input: JsonObject, context?: FilterContext): FilterResult<JsonObject>;
11
+ }