@jsonstudio/llms 0.4.3 → 0.4.4

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 (416) hide show
  1. package/README.md +3 -1
  2. package/dist/bridge/routecodex-adapter.js +6 -3
  3. package/dist/config-unified/enhanced-path-resolver.js +14 -6
  4. package/dist/config-unified/unified-config.js +103 -59
  5. package/dist/conversion/codec-registry.js +4 -2
  6. package/dist/conversion/hub/pipeline/hub-pipeline.js +4 -5
  7. package/dist/conversion/hub/process/chat-process.js +258 -41
  8. package/dist/conversion/hub/response/provider-response.js +8 -2
  9. package/dist/conversion/hub/tool-governance/engine.d.ts +16 -0
  10. package/dist/conversion/hub/tool-governance/engine.js +266 -0
  11. package/dist/conversion/hub/tool-governance/index.d.ts +3 -0
  12. package/dist/conversion/hub/tool-governance/index.js +2 -0
  13. package/dist/conversion/hub/tool-governance/rules.d.ts +2 -0
  14. package/dist/conversion/hub/tool-governance/rules.js +76 -0
  15. package/dist/conversion/hub/tool-governance/types.d.ts +38 -0
  16. package/dist/conversion/index.d.ts +1 -0
  17. package/dist/conversion/index.js +1 -0
  18. package/dist/conversion/responses/responses-openai-bridge.js +5 -3
  19. package/dist/sse/sse-to-json/builders/response-builder.js +2 -1
  20. package/dist/sse/sse-to-json/chat-sse-to-json-converter.js +37 -23
  21. package/dist/sse/sse-to-json/parsers/sse-parser.js +20 -12
  22. package/dist/sse/sse-to-json/responses-sse-to-json-converter.d.ts +1 -0
  23. package/dist/sse/sse-to-json/responses-sse-to-json-converter.js +10 -8
  24. package/dist/sse/types/chat-types.d.ts +9 -6
  25. package/dist/sse/types/conversion-context.d.ts +14 -11
  26. package/dist/sse/types/core-interfaces.d.ts +6 -2
  27. package/dist/sse/types/index.d.ts +1 -1
  28. package/dist/sse/types/responses-types.d.ts +20 -20
  29. package/dist/sse/types/sse-events.d.ts +4 -3
  30. package/dist/sse/types/stream-state.d.ts +34 -39
  31. package/dist/sse/types/utility-types.d.ts +47 -43
  32. package/dist/sse/types/utility-types.js +10 -13
  33. package/dist/tools/tool-registry.js +156 -98
  34. package/package.json +7 -7
  35. package/dist/api/index.d.ts +0 -10
  36. package/dist/api/index.js +0 -11
  37. package/dist/api/llmswitch-config.d.ts +0 -15
  38. package/dist/api/llmswitch-config.js +0 -415
  39. package/dist/api/llmswitch-types.d.ts +0 -412
  40. package/dist/api/llmswitch-types.js +0 -60
  41. package/dist/bridge/routecodex-adapter.d.ts +0 -74
  42. package/dist/config/index.d.ts +0 -3
  43. package/dist/config/index.js +0 -5
  44. package/dist/config-unified/enhanced-path-resolver.d.ts +0 -5
  45. package/dist/config-unified/unified-config.d.ts +0 -26
  46. package/dist/conversion/codec-registry.d.ts +0 -10
  47. package/dist/conversion/codecs/anthropic-openai-codec.d.ts +0 -23
  48. package/dist/conversion/codecs/gemini-openai-codec.d.ts +0 -16
  49. package/dist/conversion/codecs/openai-openai-codec.d.ts +0 -12
  50. package/dist/conversion/codecs/responses-openai-codec.d.ts +0 -12
  51. package/dist/conversion/config/config-manager.d.ts +0 -212
  52. package/dist/conversion/conversion-v3/adapters/index.d.ts +0 -2
  53. package/dist/conversion/conversion-v3/adapters/index.js +0 -1
  54. package/dist/conversion/conversion-v3/adapters/v3-to-standard-adapter.d.ts +0 -38
  55. package/dist/conversion/conversion-v3/adapters/v3-to-standard-adapter.js +0 -55
  56. package/dist/conversion/conversion-v3/compatibility/compatibility-profiles.d.ts +0 -22
  57. package/dist/conversion/conversion-v3/compatibility/compatibility-profiles.js +0 -84
  58. package/dist/conversion/conversion-v3/compatibility/compatibility-stages.d.ts +0 -4
  59. package/dist/conversion/conversion-v3/compatibility/compatibility-stages.js +0 -285
  60. package/dist/conversion/conversion-v3/compatibility/index.d.ts +0 -3
  61. package/dist/conversion/conversion-v3/compatibility/index.js +0 -2
  62. package/dist/conversion/conversion-v3/config/default-configs.d.ts +0 -48
  63. package/dist/conversion/conversion-v3/config/default-configs.js +0 -1007
  64. package/dist/conversion/conversion-v3/config/index.d.ts +0 -5
  65. package/dist/conversion/conversion-v3/config/index.js +0 -5
  66. package/dist/conversion/conversion-v3/config/pipeline-config-manager.d.ts +0 -49
  67. package/dist/conversion/conversion-v3/config/pipeline-config-manager.js +0 -65
  68. package/dist/conversion/conversion-v3/index.d.ts +0 -11
  69. package/dist/conversion/conversion-v3/index.js +0 -17
  70. package/dist/conversion/conversion-v3/nodes/index.d.ts +0 -56
  71. package/dist/conversion/conversion-v3/nodes/index.js +0 -149
  72. package/dist/conversion/conversion-v3/nodes/input/anthropic-input-node.d.ts +0 -25
  73. package/dist/conversion/conversion-v3/nodes/input/anthropic-input-node.js +0 -56
  74. package/dist/conversion/conversion-v3/nodes/input/base-input-node.d.ts +0 -75
  75. package/dist/conversion/conversion-v3/nodes/input/base-input-node.js +0 -237
  76. package/dist/conversion/conversion-v3/nodes/input/chat-input-node.d.ts +0 -25
  77. package/dist/conversion/conversion-v3/nodes/input/chat-input-node.js +0 -56
  78. package/dist/conversion/conversion-v3/nodes/input/chat-shape-helpers.d.ts +0 -4
  79. package/dist/conversion/conversion-v3/nodes/input/chat-shape-helpers.js +0 -197
  80. package/dist/conversion/conversion-v3/nodes/input/gemini-input-node.d.ts +0 -16
  81. package/dist/conversion/conversion-v3/nodes/input/gemini-input-node.js +0 -125
  82. package/dist/conversion/conversion-v3/nodes/input/index.d.ts +0 -8
  83. package/dist/conversion/conversion-v3/nodes/input/index.js +0 -8
  84. package/dist/conversion/conversion-v3/nodes/input/input-decision.d.ts +0 -46
  85. package/dist/conversion/conversion-v3/nodes/input/input-decision.js +0 -125
  86. package/dist/conversion/conversion-v3/nodes/input/responses-input-node.d.ts +0 -20
  87. package/dist/conversion/conversion-v3/nodes/input/responses-input-node.js +0 -51
  88. package/dist/conversion/conversion-v3/nodes/output/anthropic-output-node.d.ts +0 -71
  89. package/dist/conversion/conversion-v3/nodes/output/anthropic-output-node.js +0 -320
  90. package/dist/conversion/conversion-v3/nodes/output/base-output-node.d.ts +0 -116
  91. package/dist/conversion/conversion-v3/nodes/output/base-output-node.js +0 -512
  92. package/dist/conversion/conversion-v3/nodes/output/index.d.ts +0 -7
  93. package/dist/conversion/conversion-v3/nodes/output/index.js +0 -7
  94. package/dist/conversion/conversion-v3/nodes/output/openai-output-node.d.ts +0 -71
  95. package/dist/conversion/conversion-v3/nodes/output/openai-output-node.js +0 -293
  96. package/dist/conversion/conversion-v3/nodes/output/output-decision.d.ts +0 -68
  97. package/dist/conversion/conversion-v3/nodes/output/output-decision.js +0 -161
  98. package/dist/conversion/conversion-v3/nodes/output/responses-output-node.d.ts +0 -64
  99. package/dist/conversion/conversion-v3/nodes/output/responses-output-node.js +0 -323
  100. package/dist/conversion/conversion-v3/nodes/process/base-process-node.d.ts +0 -72
  101. package/dist/conversion/conversion-v3/nodes/process/base-process-node.js +0 -246
  102. package/dist/conversion/conversion-v3/nodes/process/chat-process-node.d.ts +0 -135
  103. package/dist/conversion/conversion-v3/nodes/process/chat-process-node.js +0 -854
  104. package/dist/conversion/conversion-v3/nodes/process/compatibility-process-node.d.ts +0 -29
  105. package/dist/conversion/conversion-v3/nodes/process/compatibility-process-node.js +0 -181
  106. package/dist/conversion/conversion-v3/nodes/process/index.d.ts +0 -10
  107. package/dist/conversion/conversion-v3/nodes/process/index.js +0 -10
  108. package/dist/conversion/conversion-v3/nodes/process/passthrough-process-node.d.ts +0 -59
  109. package/dist/conversion/conversion-v3/nodes/process/passthrough-process-node.js +0 -243
  110. package/dist/conversion/conversion-v3/nodes/process/response-process-node.d.ts +0 -17
  111. package/dist/conversion/conversion-v3/nodes/process/response-process-node.js +0 -213
  112. package/dist/conversion/conversion-v3/nodes/process/tool-process-node.d.ts +0 -30
  113. package/dist/conversion/conversion-v3/nodes/process/tool-process-node.js +0 -360
  114. package/dist/conversion/conversion-v3/nodes/process/virtual-router-process-node.d.ts +0 -40
  115. package/dist/conversion/conversion-v3/nodes/process/virtual-router-process-node.js +0 -430
  116. package/dist/conversion/conversion-v3/nodes/response/anthropic-response-input-node.d.ts +0 -12
  117. package/dist/conversion/conversion-v3/nodes/response/anthropic-response-input-node.js +0 -129
  118. package/dist/conversion/conversion-v3/nodes/response/chat-to-responses-response-node.d.ts +0 -15
  119. package/dist/conversion/conversion-v3/nodes/response/chat-to-responses-response-node.js +0 -57
  120. package/dist/conversion/conversion-v3/nodes/response/index.d.ts +0 -4
  121. package/dist/conversion/conversion-v3/nodes/response/index.js +0 -4
  122. package/dist/conversion/conversion-v3/nodes/response/openai-response-input-node.d.ts +0 -15
  123. package/dist/conversion/conversion-v3/nodes/response/openai-response-input-node.js +0 -87
  124. package/dist/conversion/conversion-v3/nodes/response/response-utils.d.ts +0 -1
  125. package/dist/conversion/conversion-v3/nodes/response/response-utils.js +0 -1
  126. package/dist/conversion/conversion-v3/nodes/response/responses-response-input-node.d.ts +0 -12
  127. package/dist/conversion/conversion-v3/nodes/response/responses-response-input-node.js +0 -67
  128. package/dist/conversion/conversion-v3/nodes/sse/index.d.ts +0 -3
  129. package/dist/conversion/conversion-v3/nodes/sse/index.js +0 -3
  130. package/dist/conversion/conversion-v3/nodes/sse/sse-input-node.d.ts +0 -27
  131. package/dist/conversion/conversion-v3/nodes/sse/sse-input-node.js +0 -165
  132. package/dist/conversion/conversion-v3/nodes/sse/sse-output-node.d.ts +0 -19
  133. package/dist/conversion/conversion-v3/nodes/sse/sse-output-node.js +0 -267
  134. package/dist/conversion/conversion-v3/nodes/sse/sse-passthrough-node.d.ts +0 -18
  135. package/dist/conversion/conversion-v3/nodes/sse/sse-passthrough-node.js +0 -48
  136. package/dist/conversion/conversion-v3/pipelines/index.d.ts +0 -6
  137. package/dist/conversion/conversion-v3/pipelines/index.js +0 -6
  138. package/dist/conversion/conversion-v3/pipelines/super-pipeline.d.ts +0 -112
  139. package/dist/conversion/conversion-v3/pipelines/super-pipeline.js +0 -566
  140. package/dist/conversion/conversion-v3/response/provider-response-converter.d.ts +0 -28
  141. package/dist/conversion/conversion-v3/response/provider-response-converter.js +0 -249
  142. package/dist/conversion/conversion-v3/sse/index.d.ts +0 -140
  143. package/dist/conversion/conversion-v3/sse/index.js +0 -115
  144. package/dist/conversion/conversion-v3/sse/json-to-sse/anthropic-json-to-sse-converter.d.ts +0 -11
  145. package/dist/conversion/conversion-v3/sse/json-to-sse/anthropic-json-to-sse-converter.js +0 -79
  146. package/dist/conversion/conversion-v3/sse/json-to-sse/chat-json-to-sse-converter.d.ts +0 -79
  147. package/dist/conversion/conversion-v3/sse/json-to-sse/chat-json-to-sse-converter.js +0 -296
  148. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/chat.d.ts +0 -55
  149. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/chat.js +0 -233
  150. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/responses.d.ts +0 -99
  151. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/responses.js +0 -599
  152. package/dist/conversion/conversion-v3/sse/json-to-sse/index.d.ts +0 -6
  153. package/dist/conversion/conversion-v3/sse/json-to-sse/index.js +0 -7
  154. package/dist/conversion/conversion-v3/sse/json-to-sse/responses-json-to-sse-converter.d.ts +0 -79
  155. package/dist/conversion/conversion-v3/sse/json-to-sse/responses-json-to-sse-converter.js +0 -322
  156. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/chat-sequencer.d.ts +0 -37
  157. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/chat-sequencer.js +0 -218
  158. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/responses-sequencer.d.ts +0 -40
  159. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/responses-sequencer.js +0 -263
  160. package/dist/conversion/conversion-v3/sse/registry/sse-codec-registry.d.ts +0 -32
  161. package/dist/conversion/conversion-v3/sse/registry/sse-codec-registry.js +0 -106
  162. package/dist/conversion/conversion-v3/sse/shared/chat-serializer.d.ts +0 -4
  163. package/dist/conversion/conversion-v3/sse/shared/chat-serializer.js +0 -40
  164. package/dist/conversion/conversion-v3/sse/shared/constants.d.ts +0 -272
  165. package/dist/conversion/conversion-v3/sse/shared/constants.js +0 -321
  166. package/dist/conversion/conversion-v3/sse/shared/serializers/base-serializer.d.ts +0 -158
  167. package/dist/conversion/conversion-v3/sse/shared/serializers/base-serializer.js +0 -210
  168. package/dist/conversion/conversion-v3/sse/shared/serializers/chat-event-serializer.d.ts +0 -82
  169. package/dist/conversion/conversion-v3/sse/shared/serializers/chat-event-serializer.js +0 -275
  170. package/dist/conversion/conversion-v3/sse/shared/serializers/index.d.ts +0 -39
  171. package/dist/conversion/conversion-v3/sse/shared/serializers/index.js +0 -54
  172. package/dist/conversion/conversion-v3/sse/shared/serializers/responses-event-serializer.d.ts +0 -123
  173. package/dist/conversion/conversion-v3/sse/shared/serializers/responses-event-serializer.js +0 -356
  174. package/dist/conversion/conversion-v3/sse/shared/serializers/types.d.ts +0 -51
  175. package/dist/conversion/conversion-v3/sse/shared/serializers/types.js +0 -4
  176. package/dist/conversion/conversion-v3/sse/shared/utils.d.ts +0 -254
  177. package/dist/conversion/conversion-v3/sse/shared/utils.js +0 -543
  178. package/dist/conversion/conversion-v3/sse/shared/writer.d.ts +0 -111
  179. package/dist/conversion/conversion-v3/sse/shared/writer.js +0 -268
  180. package/dist/conversion/conversion-v3/sse/sse-to-json/anthropic-sse-to-json-converter.d.ts +0 -13
  181. package/dist/conversion/conversion-v3/sse/sse-to-json/anthropic-sse-to-json-converter.js +0 -139
  182. package/dist/conversion/conversion-v3/sse/sse-to-json/builders/response-builder.d.ts +0 -165
  183. package/dist/conversion/conversion-v3/sse/sse-to-json/builders/response-builder.js +0 -776
  184. package/dist/conversion/conversion-v3/sse/sse-to-json/chat-sse-to-json-converter.d.ts +0 -106
  185. package/dist/conversion/conversion-v3/sse/sse-to-json/chat-sse-to-json-converter.js +0 -540
  186. package/dist/conversion/conversion-v3/sse/sse-to-json/index.d.ts +0 -6
  187. package/dist/conversion/conversion-v3/sse/sse-to-json/index.js +0 -7
  188. package/dist/conversion/conversion-v3/sse/sse-to-json/parsers/sse-parser.d.ts +0 -73
  189. package/dist/conversion/conversion-v3/sse/sse-to-json/parsers/sse-parser.js +0 -332
  190. package/dist/conversion/conversion-v3/sse/sse-to-json/responses-sse-to-json-converter.d.ts +0 -59
  191. package/dist/conversion/conversion-v3/sse/sse-to-json/responses-sse-to-json-converter.js +0 -270
  192. package/dist/conversion/conversion-v3/sse/types/anthropic-types.d.ts +0 -87
  193. package/dist/conversion/conversion-v3/sse/types/anthropic-types.js +0 -5
  194. package/dist/conversion/conversion-v3/sse/types/chat-types.d.ts +0 -308
  195. package/dist/conversion/conversion-v3/sse/types/chat-types.js +0 -32
  196. package/dist/conversion/conversion-v3/sse/types/conversion-context.d.ts +0 -211
  197. package/dist/conversion/conversion-v3/sse/types/conversion-context.js +0 -20
  198. package/dist/conversion/conversion-v3/sse/types/core-interfaces.d.ts +0 -90
  199. package/dist/conversion/conversion-v3/sse/types/core-interfaces.js +0 -5
  200. package/dist/conversion/conversion-v3/sse/types/index.d.ts +0 -14
  201. package/dist/conversion/conversion-v3/sse/types/index.js +0 -7
  202. package/dist/conversion/conversion-v3/sse/types/responses-types.d.ts +0 -328
  203. package/dist/conversion/conversion-v3/sse/types/responses-types.js +0 -38
  204. package/dist/conversion/conversion-v3/sse/types/sse-events.d.ts +0 -180
  205. package/dist/conversion/conversion-v3/sse/types/sse-events.js +0 -150
  206. package/dist/conversion/conversion-v3/sse/types/stream-state.d.ts +0 -204
  207. package/dist/conversion/conversion-v3/sse/types/stream-state.js +0 -44
  208. package/dist/conversion/conversion-v3/sse/types/utility-types.d.ts +0 -230
  209. package/dist/conversion/conversion-v3/sse/types/utility-types.js +0 -49
  210. package/dist/conversion/conversion-v3/standards/context-adapter.d.ts +0 -146
  211. package/dist/conversion/conversion-v3/standards/context-adapter.js +0 -438
  212. package/dist/conversion/conversion-v3/standards/errors.d.ts +0 -38
  213. package/dist/conversion/conversion-v3/standards/errors.js +0 -27
  214. package/dist/conversion/conversion-v3/standards/index.d.ts +0 -15
  215. package/dist/conversion/conversion-v3/standards/index.js +0 -11
  216. package/dist/conversion/conversion-v3/standards/node-capabilities.d.ts +0 -123
  217. package/dist/conversion/conversion-v3/standards/node-capabilities.js +0 -330
  218. package/dist/conversion/conversion-v3/standards/pipeline-context.d.ts +0 -237
  219. package/dist/conversion/conversion-v3/standards/pipeline-context.js +0 -84
  220. package/dist/conversion/conversion-v3/standards/pipeline-node.d.ts +0 -196
  221. package/dist/conversion/conversion-v3/standards/pipeline-node.js +0 -316
  222. package/dist/conversion/conversion-v3/standards/snapshot-handles.d.ts +0 -24
  223. package/dist/conversion/conversion-v3/standards/snapshot-handles.js +0 -49
  224. package/dist/conversion/conversion-v3/types/config-types.d.ts +0 -242
  225. package/dist/conversion/conversion-v3/types/config-types.js +0 -13
  226. package/dist/conversion/conversion-v3/types/index.d.ts +0 -8
  227. package/dist/conversion/conversion-v3/types/index.js +0 -11
  228. package/dist/conversion/conversion-v3/types/node-types.d.ts +0 -211
  229. package/dist/conversion/conversion-v3/types/node-types.js +0 -20
  230. package/dist/conversion/conversion-v3/types/pipeline-types.d.ts +0 -246
  231. package/dist/conversion/conversion-v3/types/pipeline-types.js +0 -26
  232. package/dist/conversion/conversion-v3/types/request-types.d.ts +0 -293
  233. package/dist/conversion/conversion-v3/types/request-types.js +0 -26
  234. package/dist/conversion/conversion-v3/utils/provider-payload-sanitizer.d.ts +0 -10
  235. package/dist/conversion/conversion-v3/utils/provider-payload-sanitizer.js +0 -103
  236. package/dist/conversion/conversion-v3/validations/index.d.ts +0 -8
  237. package/dist/conversion/conversion-v3/validations/index.js +0 -7
  238. package/dist/conversion/conversion-v3/validations/node-graph-validator.d.ts +0 -116
  239. package/dist/conversion/conversion-v3/validations/node-graph-validator.js +0 -505
  240. package/dist/conversion/conversion-v3/validations/tool-governance-enforcer.d.ts +0 -139
  241. package/dist/conversion/conversion-v3/validations/tool-governance-enforcer.js +0 -338
  242. package/dist/conversion/hub/config/types.d.ts +0 -26
  243. package/dist/conversion/hub/core/detour-registry.d.ts +0 -9
  244. package/dist/conversion/hub/core/hub-context.d.ts +0 -21
  245. package/dist/conversion/hub/core/index.d.ts +0 -3
  246. package/dist/conversion/hub/core/stage-driver.d.ts +0 -30
  247. package/dist/conversion/hub/format-adapters/anthropic-format-adapter.d.ts +0 -16
  248. package/dist/conversion/hub/format-adapters/chat-format-adapter.d.ts +0 -17
  249. package/dist/conversion/hub/format-adapters/gemini-format-adapter.d.ts +0 -16
  250. package/dist/conversion/hub/format-adapters/index.d.ts +0 -21
  251. package/dist/conversion/hub/format-adapters/responses-format-adapter.d.ts +0 -17
  252. package/dist/conversion/hub/hub-feature.d.ts +0 -1
  253. package/dist/conversion/hub/node-support.d.ts +0 -19
  254. package/dist/conversion/hub/pipeline/hub-pipeline.d.ts +0 -68
  255. package/dist/conversion/hub/pipelines/inbound.d.ts +0 -22
  256. package/dist/conversion/hub/pipelines/outbound.d.ts +0 -22
  257. package/dist/conversion/hub/process/chat-process.d.ts +0 -13
  258. package/dist/conversion/hub/registry.d.ts +0 -28
  259. package/dist/conversion/hub/response/chat-response-utils.d.ts +0 -6
  260. package/dist/conversion/hub/response/provider-response.d.ts +0 -20
  261. package/dist/conversion/hub/response/response-mappers.d.ts +0 -19
  262. package/dist/conversion/hub/response/response-runtime.d.ts +0 -3
  263. package/dist/conversion/hub/semantic-mappers/anthropic-mapper.d.ts +0 -7
  264. package/dist/conversion/hub/semantic-mappers/chat-mapper.d.ts +0 -7
  265. package/dist/conversion/hub/semantic-mappers/gemini-mapper.d.ts +0 -7
  266. package/dist/conversion/hub/semantic-mappers/index.d.ts +0 -4
  267. package/dist/conversion/hub/semantic-mappers/responses-mapper.d.ts +0 -21
  268. package/dist/conversion/hub/snapshot-recorder.d.ts +0 -12
  269. package/dist/conversion/hub/standardized-bridge.d.ts +0 -12
  270. package/dist/conversion/hub/types/chat-envelope.d.ts +0 -67
  271. package/dist/conversion/hub/types/chat-schema.d.ts +0 -112
  272. package/dist/conversion/hub/types/errors.d.ts +0 -5
  273. package/dist/conversion/hub/types/format-envelope.d.ts +0 -7
  274. package/dist/conversion/hub/types/index.d.ts +0 -6
  275. package/dist/conversion/hub/types/json.d.ts +0 -9
  276. package/dist/conversion/hub/types/node.d.ts +0 -31
  277. package/dist/conversion/hub/types/standardized.d.ts +0 -94
  278. package/dist/conversion/responses/responses-openai-bridge.d.ts +0 -95
  279. package/dist/conversion/schema-validator.d.ts +0 -7
  280. package/dist/conversion/shared/args-mapping.d.ts +0 -18
  281. package/dist/conversion/shared/chat-request-filters.d.ts +0 -9
  282. package/dist/conversion/shared/jsonish.d.ts +0 -3
  283. package/dist/conversion/shared/mcp-injection.d.ts +0 -2
  284. package/dist/conversion/shared/media.d.ts +0 -1
  285. package/dist/conversion/shared/openai-finalizer.d.ts +0 -9
  286. package/dist/conversion/shared/openai-message-normalize.d.ts +0 -1
  287. package/dist/conversion/shared/payload-budget.d.ts +0 -13
  288. package/dist/conversion/shared/reasoning-mapping.d.ts +0 -5
  289. package/dist/conversion/shared/responses-conversation-store.d.ts +0 -41
  290. package/dist/conversion/shared/responses-id-utils.d.ts +0 -7
  291. package/dist/conversion/shared/responses-instructions.d.ts +0 -1
  292. package/dist/conversion/shared/responses-metadata.d.ts +0 -1
  293. package/dist/conversion/shared/responses-request-adapter.d.ts +0 -66
  294. package/dist/conversion/shared/snapshot-hooks.d.ts +0 -12
  295. package/dist/conversion/shared/streaming-text-extractor.d.ts +0 -26
  296. package/dist/conversion/shared/text-markup-normalizer.d.ts +0 -9
  297. package/dist/conversion/shared/tool-canonicalizer.d.ts +0 -2
  298. package/dist/conversion/shared/tool-filter-pipeline.d.ts +0 -17
  299. package/dist/conversion/shared/tool-governor.d.ts +0 -27
  300. package/dist/conversion/shared/tool-harvester.d.ts +0 -31
  301. package/dist/conversion/shared/tool-mapping.d.ts +0 -10
  302. package/dist/conversion/shared/tooling.d.ts +0 -26
  303. package/dist/conversion/types.d.ts +0 -33
  304. package/dist/core/index.d.ts +0 -6
  305. package/dist/core/index.js +0 -9
  306. package/dist/core/llmswitch-engine-v2.d.ts +0 -132
  307. package/dist/core/llmswitch-engine-v2.js +0 -649
  308. package/dist/core/llmswitch-factory-v2.d.ts +0 -123
  309. package/dist/core/llmswitch-factory-v2.js +0 -521
  310. package/dist/endpoints/base-endpoint-handler.d.ts +0 -128
  311. package/dist/endpoints/base-endpoint-handler.js +0 -545
  312. package/dist/endpoints/chat-endpoint-handler.d.ts +0 -115
  313. package/dist/endpoints/chat-endpoint-handler.js +0 -218
  314. package/dist/endpoints/endpoint-router.d.ts +0 -127
  315. package/dist/endpoints/endpoint-router.js +0 -438
  316. package/dist/endpoints/index.d.ts +0 -13
  317. package/dist/endpoints/index.js +0 -11
  318. package/dist/endpoints/messages-endpoint-handler.d.ts +0 -171
  319. package/dist/endpoints/messages-endpoint-handler.js +0 -238
  320. package/dist/endpoints/responses-endpoint-handler.d.ts +0 -147
  321. package/dist/endpoints/responses-endpoint-handler.js +0 -233
  322. package/dist/filters/builtin/add-fields-filter.d.ts +0 -8
  323. package/dist/filters/builtin/blacklist-filter.d.ts +0 -8
  324. package/dist/filters/builtin/whitelist-filter.d.ts +0 -8
  325. package/dist/filters/engine.d.ts +0 -16
  326. package/dist/filters/index.d.ts +0 -19
  327. package/dist/filters/special/request-streaming-to-nonstreaming.d.ts +0 -12
  328. package/dist/filters/special/request-tool-choice-policy.d.ts +0 -11
  329. package/dist/filters/special/request-tool-list-filter.d.ts +0 -11
  330. package/dist/filters/special/request-toolcalls-stringify.d.ts +0 -10
  331. package/dist/filters/special/request-tools-normalize.d.ts +0 -12
  332. package/dist/filters/special/response-finish-invariants.d.ts +0 -11
  333. package/dist/filters/special/response-openai-to-responses-bridge.d.ts +0 -13
  334. package/dist/filters/special/response-tool-arguments-blacklist.d.ts +0 -12
  335. package/dist/filters/special/response-tool-arguments-schema-converge.d.ts +0 -13
  336. package/dist/filters/special/response-tool-arguments-stringify.d.ts +0 -9
  337. package/dist/filters/special/response-tool-arguments-toon-decode.d.ts +0 -10
  338. package/dist/filters/special/response-tool-arguments-whitelist.d.ts +0 -11
  339. package/dist/filters/special/response-tool-text-canonicalize.d.ts +0 -10
  340. package/dist/filters/special/tool-filter-hooks.d.ts +0 -19
  341. package/dist/filters/special/tool-post-constraints.d.ts +0 -31
  342. package/dist/filters/types.d.ts +0 -68
  343. package/dist/filters/utils/fieldmap-loader.d.ts +0 -2
  344. package/dist/filters/utils/snapshot-writer.d.ts +0 -10
  345. package/dist/guidance/index.d.ts +0 -3
  346. package/dist/hooks/hooks-integration.d.ts +0 -161
  347. package/dist/hooks/hooks-integration.js +0 -519
  348. package/dist/hooks/index.d.ts +0 -10
  349. package/dist/hooks/index.js +0 -13
  350. package/dist/html-to-markdown.d.ts +0 -5
  351. package/dist/html-to-markdown.js +0 -66
  352. package/dist/http/sse-response.d.ts +0 -22
  353. package/dist/router/virtual-router/bootstrap.d.ts +0 -6
  354. package/dist/router/virtual-router/classifier.d.ts +0 -10
  355. package/dist/router/virtual-router/engine.d.ts +0 -35
  356. package/dist/router/virtual-router/error-center.d.ts +0 -10
  357. package/dist/router/virtual-router/features.d.ts +0 -3
  358. package/dist/router/virtual-router/health-manager.d.ts +0 -18
  359. package/dist/router/virtual-router/load-balancer.d.ts +0 -18
  360. package/dist/router/virtual-router/provider-registry.d.ts +0 -11
  361. package/dist/router/virtual-router/types.d.ts +0 -206
  362. package/dist/sse/json-to-sse/anthropic-json-to-sse-converter.d.ts +0 -11
  363. package/dist/sse/json-to-sse/chat-json-to-sse-converter.d.ts +0 -79
  364. package/dist/sse/json-to-sse/event-generators/chat.d.ts +0 -55
  365. package/dist/sse/json-to-sse/event-generators/responses.d.ts +0 -99
  366. package/dist/sse/json-to-sse/index.d.ts +0 -6
  367. package/dist/sse/json-to-sse/responses-json-to-sse-converter.d.ts +0 -79
  368. package/dist/sse/json-to-sse/sequencers/chat-sequencer.d.ts +0 -37
  369. package/dist/sse/json-to-sse/sequencers/responses-sequencer.d.ts +0 -40
  370. package/dist/sse/registry/sse-codec-registry.d.ts +0 -32
  371. package/dist/sse/shared/chat-serializer.d.ts +0 -4
  372. package/dist/sse/shared/constants.d.ts +0 -272
  373. package/dist/sse/shared/serializers/base-serializer.d.ts +0 -158
  374. package/dist/sse/shared/serializers/chat-event-serializer.d.ts +0 -82
  375. package/dist/sse/shared/serializers/index.d.ts +0 -39
  376. package/dist/sse/shared/serializers/responses-event-serializer.d.ts +0 -123
  377. package/dist/sse/shared/serializers/types.d.ts +0 -51
  378. package/dist/sse/shared/utils.d.ts +0 -254
  379. package/dist/sse/shared/writer.d.ts +0 -111
  380. package/dist/sse/sse-to-json/anthropic-sse-to-json-converter.d.ts +0 -13
  381. package/dist/sse/sse-to-json/builders/response-builder.d.ts +0 -165
  382. package/dist/sse/sse-to-json/chat-sse-to-json-converter.d.ts +0 -106
  383. package/dist/sse/sse-to-json/index.d.ts +0 -6
  384. package/dist/sse/sse-to-json/parsers/sse-parser.d.ts +0 -73
  385. package/dist/sse/types/anthropic-types.d.ts +0 -87
  386. package/dist/tools/proxy/anthropic-tool-proxy.d.ts +0 -19
  387. package/dist/tools/proxy/anthropic-tool-proxy.js +0 -57
  388. package/dist/tools/proxy/executors/web-fetch.d.ts +0 -6
  389. package/dist/tools/proxy/executors/web-fetch.js +0 -39
  390. package/dist/tools/proxy/registry.d.ts +0 -8
  391. package/dist/tools/proxy/registry.js +0 -14
  392. package/dist/tools/proxy/types.d.ts +0 -29
  393. package/dist/tools/tool-registry.d.ts +0 -8
  394. package/dist/tools/web-fetch-html.d.ts +0 -15
  395. package/dist/tools/web-fetch-html.js +0 -83
  396. package/dist/utils/conversion-adapter.d.ts +0 -65
  397. package/dist/utils/conversion-adapter.js +0 -183
  398. package/dist/utils/error-factory.d.ts +0 -88
  399. package/dist/utils/error-factory.js +0 -138
  400. package/dist/utils/error-utils.d.ts +0 -334
  401. package/dist/utils/error-utils.js +0 -782
  402. package/dist/utils/index.d.ts +0 -8
  403. package/dist/utils/index.js +0 -13
  404. package/dist/utils/performance-utils.d.ts +0 -205
  405. package/dist/utils/performance-utils.js +0 -440
  406. package/dist/utils/profile-mapper.d.ts +0 -32
  407. package/dist/utils/profile-mapper.js +0 -269
  408. package/dist/utils/request-processor.d.ts +0 -52
  409. package/dist/utils/request-processor.js +0 -210
  410. package/dist/utils/request-utils.d.ts +0 -117
  411. package/dist/utils/request-utils.js +0 -333
  412. package/dist/utils/response-utils.d.ts +0 -127
  413. package/dist/utils/response-utils.js +0 -516
  414. package/dist/utils/token-counter.d.ts +0 -89
  415. package/dist/utils/token-counter.js +0 -541
  416. /package/dist/{tools/proxy → conversion/hub/tool-governance}/types.js +0 -0
@@ -5,6 +5,7 @@ import { buildProcessedRequestFromChatResponse } from './chat-response-utils.js'
5
5
  import { buildAnthropicResponseFromChat } from './response-runtime.js';
6
6
  import { buildResponsesPayloadFromChat } from '../../responses/responses-openai-bridge.js';
7
7
  import { defaultSseCodecRegistry } from '../../../sse/registry/sse-codec-registry.js';
8
+ import { ToolGovernanceEngine } from '../tool-governance/index.js';
8
9
  import { ChatFormatAdapter } from '../format-adapters/chat-format-adapter.js';
9
10
  import { ResponsesFormatAdapter } from '../format-adapters/responses-format-adapter.js';
10
11
  import { AnthropicFormatAdapter } from '../format-adapters/anthropic-format-adapter.js';
@@ -21,6 +22,7 @@ const STAGES = {
21
22
  ssePre: 'resp_sse_output_pre',
22
23
  ssePost: 'resp_sse_output_post'
23
24
  };
25
+ const toolGovernanceEngine = new ToolGovernanceEngine();
24
26
  const PROVIDER_RESPONSE_REGISTRY = {
25
27
  'openai-chat': {
26
28
  protocol: 'openai-chat',
@@ -155,12 +157,16 @@ export async function convertProviderResponse(options) {
155
157
  recordStage(options.stageRecorder, STAGES.formatParse, formatEnvelope);
156
158
  const chatResponse = await mapper.toChatCompletion(formatEnvelope, options.context);
157
159
  recordStage(options.stageRecorder, STAGES.semanticMap, chatResponse);
158
- const governed = await runChatResponseToolFilters(chatResponse, {
160
+ const filtered = await runChatResponseToolFilters(chatResponse, {
159
161
  entryEndpoint: options.entryEndpoint,
160
162
  requestId: options.context.requestId,
161
163
  profile: 'openai-chat'
162
164
  });
163
- recordStage(options.stageRecorder, STAGES.governance, governed);
165
+ const { payload: governed, summary: responseGovernance } = toolGovernanceEngine.governResponse(filtered, clientProtocol);
166
+ recordStage(options.stageRecorder, STAGES.governance, {
167
+ ...governed,
168
+ __toolGovernanceSummary: responseGovernance
169
+ });
164
170
  const finalized = await finalizeOpenAIChatResponse(governed, {
165
171
  requestId: options.context.requestId,
166
172
  endpoint: options.entryEndpoint,
@@ -0,0 +1,16 @@
1
+ import type { JsonObject } from '../types/json.js';
2
+ import type { StandardizedRequest } from '../types/standardized.js';
3
+ import type { GovernedChatCompletionPayload, GovernedStandardizedRequest, ToolGovernanceProtocol, ToolGovernanceRegistry } from './types.js';
4
+ export declare class ToolGovernanceError extends Error {
5
+ readonly protocol: ToolGovernanceProtocol;
6
+ readonly direction: 'request' | 'response';
7
+ readonly field: string;
8
+ constructor(message: string, protocol: ToolGovernanceProtocol, direction: 'request' | 'response', field: string);
9
+ }
10
+ export declare class ToolGovernanceEngine {
11
+ private readonly registry;
12
+ constructor(registry?: ToolGovernanceRegistry);
13
+ governRequest(request: StandardizedRequest, protocol: ToolGovernanceProtocol): GovernedStandardizedRequest;
14
+ governResponse(payload: JsonObject, protocol: ToolGovernanceProtocol): GovernedChatCompletionPayload;
15
+ private resolveRules;
16
+ }
@@ -0,0 +1,266 @@
1
+ import { DEFAULT_TOOL_GOVERNANCE_RULES } from './rules.js';
2
+ export class ToolGovernanceError extends Error {
3
+ protocol;
4
+ direction;
5
+ field;
6
+ constructor(message, protocol, direction, field) {
7
+ super(message);
8
+ this.protocol = protocol;
9
+ this.direction = direction;
10
+ this.field = field;
11
+ this.name = 'ToolGovernanceError';
12
+ }
13
+ }
14
+ function normalizeProtocol(protocol) {
15
+ if (!protocol)
16
+ return 'openai-chat';
17
+ const normalized = String(protocol).toLowerCase();
18
+ if (normalized === 'anthropic-messages') {
19
+ return 'anthropic';
20
+ }
21
+ if (normalized === 'gemini-chat') {
22
+ return 'gemini';
23
+ }
24
+ if (normalized === 'responses' || normalized === 'openai-responses') {
25
+ return 'openai-responses';
26
+ }
27
+ if (normalized === 'openai-chat') {
28
+ return 'openai-chat';
29
+ }
30
+ return protocol;
31
+ }
32
+ export class ToolGovernanceEngine {
33
+ registry;
34
+ constructor(registry = DEFAULT_TOOL_GOVERNANCE_RULES) {
35
+ this.registry = registry;
36
+ }
37
+ governRequest(request, protocol) {
38
+ const rules = this.resolveRules(protocol, 'request');
39
+ if (!rules) {
40
+ return {
41
+ request,
42
+ summary: buildSummary(protocol, 'request', false)
43
+ };
44
+ }
45
+ const stats = createStats(protocol, 'request');
46
+ const sanitizedMessages = request.messages.map((msg) => sanitizeStandardizedMessage(msg, rules, stats));
47
+ const sanitizedTools = request.tools?.map((tool) => sanitizeStandardizedTool(tool, rules, stats));
48
+ const governed = {
49
+ ...request,
50
+ messages: sanitizedMessages,
51
+ tools: sanitizedTools,
52
+ metadata: {
53
+ ...request.metadata,
54
+ toolGovernance: {
55
+ ...request.metadata?.toolGovernance,
56
+ request: finalizeSummary(stats)
57
+ }
58
+ }
59
+ };
60
+ return {
61
+ request: governed,
62
+ summary: finalizeSummary(stats)
63
+ };
64
+ }
65
+ governResponse(payload, protocol) {
66
+ const rules = this.resolveRules(protocol, 'response');
67
+ if (!rules) {
68
+ return {
69
+ payload,
70
+ summary: buildSummary(protocol, 'response', false)
71
+ };
72
+ }
73
+ const stats = createStats(protocol, 'response');
74
+ const cloned = JSON.parse(JSON.stringify(payload));
75
+ const choices = Array.isArray(cloned?.choices) ? cloned.choices : [];
76
+ for (const choice of choices) {
77
+ sanitizeChatCompletionChoice(choice, rules, stats);
78
+ }
79
+ if (Array.isArray(cloned?.tool_calls)) {
80
+ cloned.tool_calls = cloned.tool_calls.map((tc) => sanitizeChatCompletionToolCall(tc, rules, stats));
81
+ }
82
+ return {
83
+ payload: cloned,
84
+ summary: finalizeSummary(stats)
85
+ };
86
+ }
87
+ resolveRules(protocol, direction) {
88
+ const resolved = normalizeProtocol(protocol);
89
+ const entry = this.registry[resolved] ?? this.registry['openai-chat'];
90
+ return entry?.[direction];
91
+ }
92
+ }
93
+ function sanitizeStandardizedMessage(message, rules, stats) {
94
+ let changed = false;
95
+ const next = { ...message };
96
+ if (Array.isArray(message.tool_calls) && message.tool_calls.length) {
97
+ next.tool_calls = message.tool_calls.map((call) => sanitizeToolCall(call, rules, stats));
98
+ if (next.tool_calls !== message.tool_calls) {
99
+ changed = true;
100
+ }
101
+ }
102
+ if (typeof message.name === 'string' || message.role === 'tool') {
103
+ const sanitizedName = sanitizeName(message.name, rules, stats, 'message.name');
104
+ if (sanitizedName !== message.name) {
105
+ next.name = sanitizedName;
106
+ changed = true;
107
+ }
108
+ }
109
+ return changed ? next : message;
110
+ }
111
+ function sanitizeStandardizedTool(tool, rules, stats) {
112
+ const sanitizedName = sanitizeName(tool.function?.name, rules, stats, 'tool.function.name');
113
+ if (sanitizedName === tool.function?.name) {
114
+ return tool;
115
+ }
116
+ return {
117
+ ...tool,
118
+ function: {
119
+ ...tool.function,
120
+ name: sanitizedName
121
+ }
122
+ };
123
+ }
124
+ function sanitizeToolCall(call, rules, stats) {
125
+ if (!call?.function) {
126
+ return call;
127
+ }
128
+ const sanitizedName = sanitizeName(call.function.name, rules, stats, 'tool_call.function.name');
129
+ if (sanitizedName === call.function.name) {
130
+ return call;
131
+ }
132
+ return {
133
+ ...call,
134
+ function: {
135
+ ...call.function,
136
+ name: sanitizedName
137
+ }
138
+ };
139
+ }
140
+ function sanitizeChatCompletionChoice(choice, rules, stats) {
141
+ const message = choice?.message;
142
+ if (!message || typeof message !== 'object') {
143
+ return;
144
+ }
145
+ const msg = message;
146
+ if (Array.isArray(msg.tool_calls)) {
147
+ msg.tool_calls = msg.tool_calls.map((tc, index) => sanitizeChatCompletionToolCall(tc, rules, stats, `choices[].message.tool_calls[${index}].function.name`));
148
+ }
149
+ if (msg.function_call && typeof msg.function_call === 'object') {
150
+ const orig = msg.function_call.name;
151
+ const sanitizedName = sanitizeName(orig, rules, stats, 'choices[].message.function_call.name');
152
+ msg.function_call.name = sanitizedName;
153
+ }
154
+ if (typeof msg.name === 'string' || msg.role === 'tool') {
155
+ msg.name = sanitizeName(msg.name, rules, stats, 'choices[].message.name');
156
+ }
157
+ }
158
+ function sanitizeChatCompletionToolCall(tc, rules, stats, context = 'choices[].message.tool_calls[].function.name') {
159
+ if (!tc || typeof tc !== 'object') {
160
+ return tc;
161
+ }
162
+ const fn = tc.function;
163
+ if (!fn || typeof fn !== 'object') {
164
+ return tc;
165
+ }
166
+ const sanitizedName = sanitizeName(fn.name, rules, stats, context);
167
+ if (sanitizedName === fn.name) {
168
+ return tc;
169
+ }
170
+ return {
171
+ ...tc,
172
+ function: {
173
+ ...fn,
174
+ name: sanitizedName
175
+ }
176
+ };
177
+ }
178
+ function createStats(protocol, direction) {
179
+ return {
180
+ protocol,
181
+ direction,
182
+ applied: false,
183
+ sanitizedNames: 0,
184
+ truncatedNames: 0,
185
+ defaultedNames: 0
186
+ };
187
+ }
188
+ function sanitizeName(rawName, rules, stats, field) {
189
+ const defaultName = rules.defaultName ?? 'tool';
190
+ let next = typeof rawName === 'string' ? rawName : '';
191
+ let changed = false;
192
+ if (rules.trimWhitespace !== false) {
193
+ next = next.trim();
194
+ }
195
+ if (!next) {
196
+ next = defaultName;
197
+ stats.defaultedNames += 1;
198
+ changed = true;
199
+ }
200
+ if (rules.forceCase === 'lower') {
201
+ const forced = next.toLowerCase();
202
+ if (forced !== next) {
203
+ next = forced;
204
+ changed = true;
205
+ }
206
+ }
207
+ else if (rules.forceCase === 'upper') {
208
+ const forced = next.toUpperCase();
209
+ if (forced !== next) {
210
+ next = forced;
211
+ changed = true;
212
+ }
213
+ }
214
+ if (rules.allowedCharacters) {
215
+ const matcher = new RegExp(rules.allowedCharacters.source);
216
+ const filtered = next
217
+ .split('')
218
+ .filter((ch) => matcher.test(ch))
219
+ .join('');
220
+ matcher.lastIndex = 0;
221
+ if (filtered.length === 0) {
222
+ next = defaultName;
223
+ stats.defaultedNames += 1;
224
+ changed = true;
225
+ }
226
+ else if (filtered !== next) {
227
+ next = filtered;
228
+ changed = true;
229
+ }
230
+ }
231
+ if (rules.maxNameLength && next.length > rules.maxNameLength) {
232
+ if (rules.onViolation === 'reject') {
233
+ throw new ToolGovernanceError(`Tool name exceeds max length of ${rules.maxNameLength}`, stats.protocol, stats.direction, field);
234
+ }
235
+ next = next.slice(0, rules.maxNameLength);
236
+ stats.truncatedNames += 1;
237
+ changed = true;
238
+ }
239
+ if (changed || (typeof rawName === 'string' && rawName !== next)) {
240
+ stats.sanitizedNames += 1;
241
+ }
242
+ stats.applied = true;
243
+ return next || defaultName;
244
+ }
245
+ function finalizeSummary(stats) {
246
+ return {
247
+ protocol: stats.protocol,
248
+ direction: stats.direction,
249
+ applied: stats.applied,
250
+ sanitizedNames: stats.sanitizedNames,
251
+ truncatedNames: stats.truncatedNames,
252
+ defaultedNames: stats.defaultedNames,
253
+ timestamp: Date.now()
254
+ };
255
+ }
256
+ function buildSummary(protocol, direction, applied) {
257
+ return {
258
+ protocol,
259
+ direction,
260
+ applied,
261
+ sanitizedNames: 0,
262
+ truncatedNames: 0,
263
+ defaultedNames: 0,
264
+ timestamp: Date.now()
265
+ };
266
+ }
@@ -0,0 +1,3 @@
1
+ export { ToolGovernanceEngine, ToolGovernanceError } from './engine.js';
2
+ export { DEFAULT_TOOL_GOVERNANCE_RULES } from './rules.js';
3
+ export type { ToolGovernanceProtocol, ToolGovernanceRules, ToolGovernanceRegistry, ToolGovernanceSummary } from './types.js';
@@ -0,0 +1,2 @@
1
+ export { ToolGovernanceEngine, ToolGovernanceError } from './engine.js';
2
+ export { DEFAULT_TOOL_GOVERNANCE_RULES } from './rules.js';
@@ -0,0 +1,2 @@
1
+ import type { ToolGovernanceRegistry } from './types.js';
2
+ export declare const DEFAULT_TOOL_GOVERNANCE_RULES: ToolGovernanceRegistry;
@@ -0,0 +1,76 @@
1
+ const ALPHA_NUMERIC = /[A-Za-z0-9._-]/;
2
+ const LOWER_SNAKE = /[a-z0-9._-]/;
3
+ function clonePattern(pattern) {
4
+ if (!pattern)
5
+ return undefined;
6
+ const flags = pattern.flags.replace(/g/g, '');
7
+ return new RegExp(pattern.source, flags);
8
+ }
9
+ export const DEFAULT_TOOL_GOVERNANCE_RULES = {
10
+ 'openai-chat': {
11
+ request: {
12
+ maxNameLength: 64,
13
+ allowedCharacters: clonePattern(ALPHA_NUMERIC),
14
+ defaultName: 'tool',
15
+ trimWhitespace: true,
16
+ onViolation: 'truncate'
17
+ },
18
+ response: {
19
+ maxNameLength: 64,
20
+ allowedCharacters: clonePattern(ALPHA_NUMERIC),
21
+ defaultName: 'tool',
22
+ trimWhitespace: true,
23
+ onViolation: 'truncate'
24
+ }
25
+ },
26
+ 'openai-responses': {
27
+ request: {
28
+ maxNameLength: 64,
29
+ allowedCharacters: clonePattern(ALPHA_NUMERIC),
30
+ defaultName: 'tool',
31
+ trimWhitespace: true,
32
+ onViolation: 'truncate'
33
+ },
34
+ response: {
35
+ maxNameLength: 64,
36
+ allowedCharacters: clonePattern(ALPHA_NUMERIC),
37
+ defaultName: 'tool',
38
+ trimWhitespace: true,
39
+ onViolation: 'truncate'
40
+ }
41
+ },
42
+ anthropic: {
43
+ request: {
44
+ maxNameLength: 64,
45
+ allowedCharacters: clonePattern(LOWER_SNAKE),
46
+ forceCase: 'lower',
47
+ defaultName: 'tool',
48
+ trimWhitespace: true,
49
+ onViolation: 'truncate'
50
+ },
51
+ response: {
52
+ maxNameLength: 64,
53
+ allowedCharacters: clonePattern(LOWER_SNAKE),
54
+ forceCase: 'lower',
55
+ defaultName: 'tool',
56
+ trimWhitespace: true,
57
+ onViolation: 'truncate'
58
+ }
59
+ },
60
+ gemini: {
61
+ request: {
62
+ maxNameLength: 64,
63
+ allowedCharacters: clonePattern(ALPHA_NUMERIC),
64
+ defaultName: 'tool',
65
+ trimWhitespace: true,
66
+ onViolation: 'truncate'
67
+ },
68
+ response: {
69
+ maxNameLength: 64,
70
+ allowedCharacters: clonePattern(ALPHA_NUMERIC),
71
+ defaultName: 'tool',
72
+ trimWhitespace: true,
73
+ onViolation: 'truncate'
74
+ }
75
+ }
76
+ };
@@ -0,0 +1,38 @@
1
+ import type { JsonObject } from '../types/json.js';
2
+ import type { StandardizedMessage, StandardizedRequest, StandardizedTool } from '../types/standardized.js';
3
+ export type ToolGovernanceProtocol = 'openai-chat' | 'openai-responses' | 'anthropic' | 'gemini' | string;
4
+ export type ToolGovernanceViolationMode = 'truncate' | 'reject';
5
+ export interface ToolGovernanceRules {
6
+ maxNameLength?: number;
7
+ allowedCharacters?: RegExp;
8
+ forceCase?: 'lower' | 'upper';
9
+ defaultName?: string;
10
+ trimWhitespace?: boolean;
11
+ onViolation?: ToolGovernanceViolationMode;
12
+ }
13
+ export interface ToolGovernanceRegistryEntry {
14
+ request?: ToolGovernanceRules;
15
+ response?: ToolGovernanceRules;
16
+ }
17
+ export type ToolGovernanceRegistry = Record<ToolGovernanceProtocol, ToolGovernanceRegistryEntry>;
18
+ export interface ToolGovernanceSummary {
19
+ protocol: ToolGovernanceProtocol;
20
+ direction: 'request' | 'response';
21
+ applied: boolean;
22
+ sanitizedNames: number;
23
+ truncatedNames: number;
24
+ defaultedNames: number;
25
+ timestamp: number;
26
+ }
27
+ export interface GovernedStandardizedRequest {
28
+ request: StandardizedRequest;
29
+ summary: ToolGovernanceSummary;
30
+ }
31
+ export interface GovernedChatCompletionPayload {
32
+ payload: JsonObject;
33
+ summary: ToolGovernanceSummary;
34
+ }
35
+ export type MutableStandardizedMessage = StandardizedMessage & {
36
+ tool_calls?: StandardizedMessage['tool_calls'];
37
+ };
38
+ export type MutableStandardizedTool = StandardizedTool;
@@ -7,6 +7,7 @@ export * from './hub/registry.js';
7
7
  export * from './hub/pipelines/inbound.js';
8
8
  export * from './hub/pipelines/outbound.js';
9
9
  export * from './hub/response/provider-response.js';
10
+ export * from './hub/response/response-runtime.js';
10
11
  export * from './hub/pipeline/hub-pipeline.js';
11
12
  export * from './hub/format-adapters/index.js';
12
13
  export * from './hub/semantic-mappers/index.js';
@@ -7,6 +7,7 @@ export * from './hub/registry.js';
7
7
  export * from './hub/pipelines/inbound.js';
8
8
  export * from './hub/pipelines/outbound.js';
9
9
  export * from './hub/response/provider-response.js';
10
+ export * from './hub/response/response-runtime.js';
10
11
  export * from './hub/pipeline/hub-pipeline.js';
11
12
  export * from './hub/format-adapters/index.js';
12
13
  export * from './hub/semantic-mappers/index.js';
@@ -237,8 +237,8 @@ export function buildResponsesRequestFromChat(payload, ctx) {
237
237
  if (anyT.type === 'function' && anyT.function && typeof anyT.function === 'object') {
238
238
  const fn = anyT.function;
239
239
  const base = { type: 'function' };
240
- if (typeof fn.name === 'string')
241
- base.name = fn.name;
240
+ if (typeof fn.name === 'string' && fn.name.trim())
241
+ base.name = fn.name.trim();
242
242
  if (typeof fn.description === 'string')
243
243
  base.description = fn.description;
244
244
  if (Object.prototype.hasOwnProperty.call(fn, 'parameters'))
@@ -385,7 +385,9 @@ export function buildResponsesRequestFromChat(payload, ctx) {
385
385
  toolCallIdAliases.set(rawId, normalizedCallId);
386
386
  }
387
387
  const fn = tc?.function || {};
388
- const name = typeof fn?.name === 'string' ? String(fn.name) : 'tool';
388
+ const name = typeof fn?.name === 'string' && fn.name.trim()
389
+ ? String(fn.name).trim()
390
+ : 'tool';
389
391
  const argsRaw = fn?.arguments;
390
392
  const args = typeof argsRaw === 'string' ? argsRaw : normalizeArgumentsBySchema(argsRaw, name, out.tools);
391
393
  const entry = {
@@ -594,7 +594,8 @@ export class ResponsesResponseBuilder {
594
594
  * 处理错误事件
595
595
  */
596
596
  handleError(event) {
597
- const msg = event.data?.error?.message;
597
+ const payload = event.data;
598
+ const msg = typeof payload?.error?.message === 'string' ? payload.error.message : undefined;
598
599
  // 容错:若无有效错误消息或当前响应已标记 completed,则将错误降级为非致命告警
599
600
  const status = this.response?.status;
600
601
  if (!msg || status === 'completed' || this.config.enableEventRecovery) {
@@ -201,7 +201,8 @@ export class ChatSseToJsonConverter {
201
201
  */
202
202
  async processChatChunk(event, context) {
203
203
  try {
204
- const chunk = JSON.parse(event.data);
204
+ const payload = typeof event.data === 'string' ? event.data : JSON.stringify(event.data ?? {});
205
+ const chunk = JSON.parse(payload);
205
206
  // 验证chunk格式
206
207
  if (context.options.validateChunks) {
207
208
  this.validateChatChunk(chunk);
@@ -237,8 +238,11 @@ export class ChatSseToJsonConverter {
237
238
  context.choiceIndexMap.set(choiceIndex, choiceBuilder);
238
239
  context.currentResponse.choices?.push({
239
240
  index: choiceIndex,
240
- message: {},
241
- finish_reason: null,
241
+ message: {
242
+ role: 'assistant',
243
+ content: ''
244
+ },
245
+ finish_reason: 'stop',
242
246
  logprobs: choice.logprobs
243
247
  });
244
248
  }
@@ -261,8 +265,8 @@ export class ChatSseToJsonConverter {
261
265
  return {
262
266
  index,
263
267
  delta: {},
264
- finishReason: null,
265
- logprobs: null,
268
+ finishReason: undefined,
269
+ logprobs: undefined,
266
270
  messageBuilder: {
267
271
  role: undefined,
268
272
  content: '',
@@ -280,7 +284,7 @@ export class ChatSseToJsonConverter {
280
284
  /**
281
285
  * 处理delta
282
286
  */
283
- async processDelta(delta, choiceBuilder, context) {
287
+ async processDelta(delta, choiceBuilder, _context) {
284
288
  const messageBuilder = choiceBuilder.messageBuilder;
285
289
  // 处理role
286
290
  if (delta.role) {
@@ -314,7 +318,7 @@ export class ChatSseToJsonConverter {
314
318
  // 处理tool_calls
315
319
  if (delta.tool_calls && Array.isArray(delta.tool_calls)) {
316
320
  for (const toolCallDelta of delta.tool_calls) {
317
- await this.processToolCallDelta(toolCallDelta, choiceBuilder, context);
321
+ await this.processToolCallDelta(toolCallDelta, choiceBuilder);
318
322
  }
319
323
  }
320
324
  // 合并delta到choiceBuilder
@@ -323,7 +327,7 @@ export class ChatSseToJsonConverter {
323
327
  /**
324
328
  * 处理tool_call delta
325
329
  */
326
- async processToolCallDelta(toolCallDelta, choiceBuilder, context) {
330
+ async processToolCallDelta(toolCallDelta, choiceBuilder) {
327
331
  const toolCallIndex = toolCallDelta.index;
328
332
  // 获取或创建tool_call构建器
329
333
  let toolCallBuilder = choiceBuilder.toolCallBuilders.get(toolCallIndex);
@@ -367,8 +371,9 @@ export class ChatSseToJsonConverter {
367
371
  */
368
372
  updateResponseChoice(choiceIndex, choiceBuilder, context) {
369
373
  const responseChoice = context.currentResponse.choices?.[choiceIndex];
370
- if (!responseChoice)
374
+ if (!responseChoice) {
371
375
  return;
376
+ }
372
377
  const messageBuilder = choiceBuilder.messageBuilder;
373
378
  // 构建message
374
379
  const message = {
@@ -382,12 +387,15 @@ export class ChatSseToJsonConverter {
382
387
  }
383
388
  // 构建tool_calls
384
389
  const toolCalls = [];
385
- for (const [_, toolCallBuilder] of choiceBuilder.toolCallBuilders) {
386
- if (toolCallBuilder.id) {
390
+ for (const toolCallBuilder of choiceBuilder.toolCallBuilders.values()) {
391
+ if (toolCallBuilder.id && toolCallBuilder.function) {
387
392
  toolCalls.push({
388
393
  id: toolCallBuilder.id,
389
394
  type: toolCallBuilder.type || 'function',
390
- function: toolCallBuilder.function
395
+ function: {
396
+ name: toolCallBuilder.function.name ?? '',
397
+ arguments: toolCallBuilder.function.arguments ?? ''
398
+ }
391
399
  });
392
400
  }
393
401
  }
@@ -395,7 +403,7 @@ export class ChatSseToJsonConverter {
395
403
  message.tool_calls = toolCalls;
396
404
  }
397
405
  responseChoice.message = message;
398
- responseChoice.finish_reason = choiceBuilder.finishReason;
406
+ responseChoice.finish_reason = choiceBuilder.finishReason ?? responseChoice.finish_reason;
399
407
  context.eventStats.totalToolCalls += toolCalls.length;
400
408
  }
401
409
  /**
@@ -405,9 +413,11 @@ export class ChatSseToJsonConverter {
405
413
  context.isCompleted = true;
406
414
  // 解析done事件数据(如果有的话)
407
415
  try {
408
- const doneData = JSON.parse(event.data);
409
- if (doneData.totalTokens) {
410
- context.eventStats.totalTokens = doneData.totalTokens;
416
+ if (typeof event.data === 'string') {
417
+ const doneData = JSON.parse(event.data);
418
+ if (typeof doneData.totalTokens === 'number') {
419
+ context.eventStats.totalTokens = doneData.totalTokens;
420
+ }
411
421
  }
412
422
  }
413
423
  catch (e) {
@@ -417,12 +427,15 @@ export class ChatSseToJsonConverter {
417
427
  /**
418
428
  * 处理error事件
419
429
  */
420
- async processErrorEvent(event, context) {
430
+ async processErrorEvent(event, _context) {
421
431
  try {
422
- const errorData = JSON.parse(event.data);
423
- const error = new Error(errorData.error || 'Unknown SSE error');
424
- error.code = errorData.code || 'SSE_ERROR';
425
- throw ErrorUtils.createError(error.message, CHAT_CONVERSION_ERROR_CODES.STREAM_ERROR, { errorData, event });
432
+ const rawPayload = typeof event.data === 'string' ? event.data : JSON.stringify(event.data ?? {});
433
+ const errorData = JSON.parse(rawPayload);
434
+ const errorMessage = typeof errorData.error === 'string' ? errorData.error : 'Unknown SSE error';
435
+ const code = typeof errorData.code === 'string' ? errorData.code : 'SSE_ERROR';
436
+ const typedError = new Error(errorMessage);
437
+ typedError.code = code;
438
+ throw ErrorUtils.createError(typedError.message, CHAT_CONVERSION_ERROR_CODES.STREAM_ERROR, { errorData, event });
426
439
  }
427
440
  catch (parseError) {
428
441
  throw ErrorUtils.createError(`SSE error event: ${event.data}`, CHAT_CONVERSION_ERROR_CODES.STREAM_ERROR, { event });
@@ -433,8 +446,9 @@ export class ChatSseToJsonConverter {
433
446
  */
434
447
  buildPartialResponse(context) {
435
448
  const choices = context.currentResponse.choices || [];
436
- if (choices.length === 0)
449
+ if (choices.length === 0) {
437
450
  return null;
451
+ }
438
452
  return {
439
453
  id: context.currentResponse.id || '',
440
454
  object: 'chat.completion',
@@ -475,7 +489,7 @@ export class ChatSseToJsonConverter {
475
489
  /**
476
490
  * 构建使用量信息
477
491
  */
478
- buildUsageInfo(context) {
492
+ buildUsageInfo(_context) {
479
493
  // 这里可以基于token计数来计算usage
480
494
  // 暂时返回null,后续可以实现更精确的token计数
481
495
  return null;