@jsonstudio/llms 0.4.2 → 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 (417) 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/conversion/shared/responses-id-utils.js +18 -5
  20. package/dist/sse/sse-to-json/builders/response-builder.js +2 -1
  21. package/dist/sse/sse-to-json/chat-sse-to-json-converter.js +37 -23
  22. package/dist/sse/sse-to-json/parsers/sse-parser.js +20 -12
  23. package/dist/sse/sse-to-json/responses-sse-to-json-converter.d.ts +1 -0
  24. package/dist/sse/sse-to-json/responses-sse-to-json-converter.js +10 -8
  25. package/dist/sse/types/chat-types.d.ts +9 -6
  26. package/dist/sse/types/conversion-context.d.ts +14 -11
  27. package/dist/sse/types/core-interfaces.d.ts +6 -2
  28. package/dist/sse/types/index.d.ts +1 -1
  29. package/dist/sse/types/responses-types.d.ts +20 -20
  30. package/dist/sse/types/sse-events.d.ts +4 -3
  31. package/dist/sse/types/stream-state.d.ts +34 -39
  32. package/dist/sse/types/utility-types.d.ts +47 -43
  33. package/dist/sse/types/utility-types.js +10 -13
  34. package/dist/tools/tool-registry.js +156 -98
  35. package/package.json +6 -6
  36. package/dist/api/index.d.ts +0 -10
  37. package/dist/api/index.js +0 -11
  38. package/dist/api/llmswitch-config.d.ts +0 -15
  39. package/dist/api/llmswitch-config.js +0 -415
  40. package/dist/api/llmswitch-types.d.ts +0 -412
  41. package/dist/api/llmswitch-types.js +0 -60
  42. package/dist/bridge/routecodex-adapter.d.ts +0 -74
  43. package/dist/config/index.d.ts +0 -3
  44. package/dist/config/index.js +0 -5
  45. package/dist/config-unified/enhanced-path-resolver.d.ts +0 -5
  46. package/dist/config-unified/unified-config.d.ts +0 -26
  47. package/dist/conversion/codec-registry.d.ts +0 -10
  48. package/dist/conversion/codecs/anthropic-openai-codec.d.ts +0 -23
  49. package/dist/conversion/codecs/gemini-openai-codec.d.ts +0 -16
  50. package/dist/conversion/codecs/openai-openai-codec.d.ts +0 -12
  51. package/dist/conversion/codecs/responses-openai-codec.d.ts +0 -12
  52. package/dist/conversion/config/config-manager.d.ts +0 -212
  53. package/dist/conversion/conversion-v3/adapters/index.d.ts +0 -2
  54. package/dist/conversion/conversion-v3/adapters/index.js +0 -1
  55. package/dist/conversion/conversion-v3/adapters/v3-to-standard-adapter.d.ts +0 -38
  56. package/dist/conversion/conversion-v3/adapters/v3-to-standard-adapter.js +0 -55
  57. package/dist/conversion/conversion-v3/compatibility/compatibility-profiles.d.ts +0 -22
  58. package/dist/conversion/conversion-v3/compatibility/compatibility-profiles.js +0 -84
  59. package/dist/conversion/conversion-v3/compatibility/compatibility-stages.d.ts +0 -4
  60. package/dist/conversion/conversion-v3/compatibility/compatibility-stages.js +0 -285
  61. package/dist/conversion/conversion-v3/compatibility/index.d.ts +0 -3
  62. package/dist/conversion/conversion-v3/compatibility/index.js +0 -2
  63. package/dist/conversion/conversion-v3/config/default-configs.d.ts +0 -48
  64. package/dist/conversion/conversion-v3/config/default-configs.js +0 -1083
  65. package/dist/conversion/conversion-v3/config/index.d.ts +0 -5
  66. package/dist/conversion/conversion-v3/config/index.js +0 -5
  67. package/dist/conversion/conversion-v3/config/pipeline-config-manager.d.ts +0 -49
  68. package/dist/conversion/conversion-v3/config/pipeline-config-manager.js +0 -65
  69. package/dist/conversion/conversion-v3/index.d.ts +0 -11
  70. package/dist/conversion/conversion-v3/index.js +0 -17
  71. package/dist/conversion/conversion-v3/nodes/index.d.ts +0 -56
  72. package/dist/conversion/conversion-v3/nodes/index.js +0 -149
  73. package/dist/conversion/conversion-v3/nodes/input/anthropic-input-node.d.ts +0 -25
  74. package/dist/conversion/conversion-v3/nodes/input/anthropic-input-node.js +0 -56
  75. package/dist/conversion/conversion-v3/nodes/input/base-input-node.d.ts +0 -75
  76. package/dist/conversion/conversion-v3/nodes/input/base-input-node.js +0 -237
  77. package/dist/conversion/conversion-v3/nodes/input/chat-input-node.d.ts +0 -25
  78. package/dist/conversion/conversion-v3/nodes/input/chat-input-node.js +0 -56
  79. package/dist/conversion/conversion-v3/nodes/input/chat-shape-helpers.d.ts +0 -4
  80. package/dist/conversion/conversion-v3/nodes/input/chat-shape-helpers.js +0 -197
  81. package/dist/conversion/conversion-v3/nodes/input/gemini-input-node.d.ts +0 -16
  82. package/dist/conversion/conversion-v3/nodes/input/gemini-input-node.js +0 -125
  83. package/dist/conversion/conversion-v3/nodes/input/index.d.ts +0 -8
  84. package/dist/conversion/conversion-v3/nodes/input/index.js +0 -8
  85. package/dist/conversion/conversion-v3/nodes/input/input-decision.d.ts +0 -46
  86. package/dist/conversion/conversion-v3/nodes/input/input-decision.js +0 -125
  87. package/dist/conversion/conversion-v3/nodes/input/responses-input-node.d.ts +0 -20
  88. package/dist/conversion/conversion-v3/nodes/input/responses-input-node.js +0 -51
  89. package/dist/conversion/conversion-v3/nodes/output/anthropic-output-node.d.ts +0 -71
  90. package/dist/conversion/conversion-v3/nodes/output/anthropic-output-node.js +0 -320
  91. package/dist/conversion/conversion-v3/nodes/output/base-output-node.d.ts +0 -116
  92. package/dist/conversion/conversion-v3/nodes/output/base-output-node.js +0 -512
  93. package/dist/conversion/conversion-v3/nodes/output/index.d.ts +0 -7
  94. package/dist/conversion/conversion-v3/nodes/output/index.js +0 -7
  95. package/dist/conversion/conversion-v3/nodes/output/openai-output-node.d.ts +0 -71
  96. package/dist/conversion/conversion-v3/nodes/output/openai-output-node.js +0 -293
  97. package/dist/conversion/conversion-v3/nodes/output/output-decision.d.ts +0 -68
  98. package/dist/conversion/conversion-v3/nodes/output/output-decision.js +0 -161
  99. package/dist/conversion/conversion-v3/nodes/output/responses-output-node.d.ts +0 -64
  100. package/dist/conversion/conversion-v3/nodes/output/responses-output-node.js +0 -323
  101. package/dist/conversion/conversion-v3/nodes/process/base-process-node.d.ts +0 -72
  102. package/dist/conversion/conversion-v3/nodes/process/base-process-node.js +0 -246
  103. package/dist/conversion/conversion-v3/nodes/process/chat-process-node.d.ts +0 -135
  104. package/dist/conversion/conversion-v3/nodes/process/chat-process-node.js +0 -854
  105. package/dist/conversion/conversion-v3/nodes/process/compatibility-process-node.d.ts +0 -29
  106. package/dist/conversion/conversion-v3/nodes/process/compatibility-process-node.js +0 -181
  107. package/dist/conversion/conversion-v3/nodes/process/index.d.ts +0 -10
  108. package/dist/conversion/conversion-v3/nodes/process/index.js +0 -10
  109. package/dist/conversion/conversion-v3/nodes/process/passthrough-process-node.d.ts +0 -59
  110. package/dist/conversion/conversion-v3/nodes/process/passthrough-process-node.js +0 -243
  111. package/dist/conversion/conversion-v3/nodes/process/response-process-node.d.ts +0 -17
  112. package/dist/conversion/conversion-v3/nodes/process/response-process-node.js +0 -213
  113. package/dist/conversion/conversion-v3/nodes/process/tool-process-node.d.ts +0 -26
  114. package/dist/conversion/conversion-v3/nodes/process/tool-process-node.js +0 -299
  115. package/dist/conversion/conversion-v3/nodes/process/virtual-router-process-node.d.ts +0 -40
  116. package/dist/conversion/conversion-v3/nodes/process/virtual-router-process-node.js +0 -430
  117. package/dist/conversion/conversion-v3/nodes/response/anthropic-response-input-node.d.ts +0 -12
  118. package/dist/conversion/conversion-v3/nodes/response/anthropic-response-input-node.js +0 -129
  119. package/dist/conversion/conversion-v3/nodes/response/chat-to-responses-response-node.d.ts +0 -15
  120. package/dist/conversion/conversion-v3/nodes/response/chat-to-responses-response-node.js +0 -57
  121. package/dist/conversion/conversion-v3/nodes/response/index.d.ts +0 -4
  122. package/dist/conversion/conversion-v3/nodes/response/index.js +0 -4
  123. package/dist/conversion/conversion-v3/nodes/response/openai-response-input-node.d.ts +0 -15
  124. package/dist/conversion/conversion-v3/nodes/response/openai-response-input-node.js +0 -87
  125. package/dist/conversion/conversion-v3/nodes/response/response-utils.d.ts +0 -1
  126. package/dist/conversion/conversion-v3/nodes/response/response-utils.js +0 -1
  127. package/dist/conversion/conversion-v3/nodes/response/responses-response-input-node.d.ts +0 -12
  128. package/dist/conversion/conversion-v3/nodes/response/responses-response-input-node.js +0 -67
  129. package/dist/conversion/conversion-v3/nodes/sse/index.d.ts +0 -3
  130. package/dist/conversion/conversion-v3/nodes/sse/index.js +0 -3
  131. package/dist/conversion/conversion-v3/nodes/sse/sse-input-node.d.ts +0 -27
  132. package/dist/conversion/conversion-v3/nodes/sse/sse-input-node.js +0 -165
  133. package/dist/conversion/conversion-v3/nodes/sse/sse-output-node.d.ts +0 -19
  134. package/dist/conversion/conversion-v3/nodes/sse/sse-output-node.js +0 -267
  135. package/dist/conversion/conversion-v3/nodes/sse/sse-passthrough-node.d.ts +0 -18
  136. package/dist/conversion/conversion-v3/nodes/sse/sse-passthrough-node.js +0 -48
  137. package/dist/conversion/conversion-v3/pipelines/index.d.ts +0 -6
  138. package/dist/conversion/conversion-v3/pipelines/index.js +0 -6
  139. package/dist/conversion/conversion-v3/pipelines/super-pipeline.d.ts +0 -112
  140. package/dist/conversion/conversion-v3/pipelines/super-pipeline.js +0 -566
  141. package/dist/conversion/conversion-v3/response/provider-response-converter.d.ts +0 -28
  142. package/dist/conversion/conversion-v3/response/provider-response-converter.js +0 -249
  143. package/dist/conversion/conversion-v3/sse/index.d.ts +0 -140
  144. package/dist/conversion/conversion-v3/sse/index.js +0 -115
  145. package/dist/conversion/conversion-v3/sse/json-to-sse/anthropic-json-to-sse-converter.d.ts +0 -11
  146. package/dist/conversion/conversion-v3/sse/json-to-sse/anthropic-json-to-sse-converter.js +0 -79
  147. package/dist/conversion/conversion-v3/sse/json-to-sse/chat-json-to-sse-converter.d.ts +0 -79
  148. package/dist/conversion/conversion-v3/sse/json-to-sse/chat-json-to-sse-converter.js +0 -296
  149. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/chat.d.ts +0 -55
  150. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/chat.js +0 -233
  151. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/responses.d.ts +0 -99
  152. package/dist/conversion/conversion-v3/sse/json-to-sse/event-generators/responses.js +0 -599
  153. package/dist/conversion/conversion-v3/sse/json-to-sse/index.d.ts +0 -6
  154. package/dist/conversion/conversion-v3/sse/json-to-sse/index.js +0 -7
  155. package/dist/conversion/conversion-v3/sse/json-to-sse/responses-json-to-sse-converter.d.ts +0 -79
  156. package/dist/conversion/conversion-v3/sse/json-to-sse/responses-json-to-sse-converter.js +0 -322
  157. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/chat-sequencer.d.ts +0 -37
  158. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/chat-sequencer.js +0 -218
  159. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/responses-sequencer.d.ts +0 -40
  160. package/dist/conversion/conversion-v3/sse/json-to-sse/sequencers/responses-sequencer.js +0 -263
  161. package/dist/conversion/conversion-v3/sse/registry/sse-codec-registry.d.ts +0 -32
  162. package/dist/conversion/conversion-v3/sse/registry/sse-codec-registry.js +0 -106
  163. package/dist/conversion/conversion-v3/sse/shared/chat-serializer.d.ts +0 -4
  164. package/dist/conversion/conversion-v3/sse/shared/chat-serializer.js +0 -40
  165. package/dist/conversion/conversion-v3/sse/shared/constants.d.ts +0 -272
  166. package/dist/conversion/conversion-v3/sse/shared/constants.js +0 -321
  167. package/dist/conversion/conversion-v3/sse/shared/serializers/base-serializer.d.ts +0 -158
  168. package/dist/conversion/conversion-v3/sse/shared/serializers/base-serializer.js +0 -210
  169. package/dist/conversion/conversion-v3/sse/shared/serializers/chat-event-serializer.d.ts +0 -82
  170. package/dist/conversion/conversion-v3/sse/shared/serializers/chat-event-serializer.js +0 -275
  171. package/dist/conversion/conversion-v3/sse/shared/serializers/index.d.ts +0 -39
  172. package/dist/conversion/conversion-v3/sse/shared/serializers/index.js +0 -54
  173. package/dist/conversion/conversion-v3/sse/shared/serializers/responses-event-serializer.d.ts +0 -123
  174. package/dist/conversion/conversion-v3/sse/shared/serializers/responses-event-serializer.js +0 -356
  175. package/dist/conversion/conversion-v3/sse/shared/serializers/types.d.ts +0 -51
  176. package/dist/conversion/conversion-v3/sse/shared/serializers/types.js +0 -4
  177. package/dist/conversion/conversion-v3/sse/shared/utils.d.ts +0 -254
  178. package/dist/conversion/conversion-v3/sse/shared/utils.js +0 -543
  179. package/dist/conversion/conversion-v3/sse/shared/writer.d.ts +0 -111
  180. package/dist/conversion/conversion-v3/sse/shared/writer.js +0 -268
  181. package/dist/conversion/conversion-v3/sse/sse-to-json/anthropic-sse-to-json-converter.d.ts +0 -13
  182. package/dist/conversion/conversion-v3/sse/sse-to-json/anthropic-sse-to-json-converter.js +0 -139
  183. package/dist/conversion/conversion-v3/sse/sse-to-json/builders/response-builder.d.ts +0 -165
  184. package/dist/conversion/conversion-v3/sse/sse-to-json/builders/response-builder.js +0 -776
  185. package/dist/conversion/conversion-v3/sse/sse-to-json/chat-sse-to-json-converter.d.ts +0 -106
  186. package/dist/conversion/conversion-v3/sse/sse-to-json/chat-sse-to-json-converter.js +0 -540
  187. package/dist/conversion/conversion-v3/sse/sse-to-json/index.d.ts +0 -6
  188. package/dist/conversion/conversion-v3/sse/sse-to-json/index.js +0 -7
  189. package/dist/conversion/conversion-v3/sse/sse-to-json/parsers/sse-parser.d.ts +0 -73
  190. package/dist/conversion/conversion-v3/sse/sse-to-json/parsers/sse-parser.js +0 -332
  191. package/dist/conversion/conversion-v3/sse/sse-to-json/responses-sse-to-json-converter.d.ts +0 -59
  192. package/dist/conversion/conversion-v3/sse/sse-to-json/responses-sse-to-json-converter.js +0 -270
  193. package/dist/conversion/conversion-v3/sse/types/anthropic-types.d.ts +0 -87
  194. package/dist/conversion/conversion-v3/sse/types/anthropic-types.js +0 -5
  195. package/dist/conversion/conversion-v3/sse/types/chat-types.d.ts +0 -308
  196. package/dist/conversion/conversion-v3/sse/types/chat-types.js +0 -32
  197. package/dist/conversion/conversion-v3/sse/types/conversion-context.d.ts +0 -211
  198. package/dist/conversion/conversion-v3/sse/types/conversion-context.js +0 -20
  199. package/dist/conversion/conversion-v3/sse/types/core-interfaces.d.ts +0 -90
  200. package/dist/conversion/conversion-v3/sse/types/core-interfaces.js +0 -5
  201. package/dist/conversion/conversion-v3/sse/types/index.d.ts +0 -14
  202. package/dist/conversion/conversion-v3/sse/types/index.js +0 -7
  203. package/dist/conversion/conversion-v3/sse/types/responses-types.d.ts +0 -328
  204. package/dist/conversion/conversion-v3/sse/types/responses-types.js +0 -38
  205. package/dist/conversion/conversion-v3/sse/types/sse-events.d.ts +0 -180
  206. package/dist/conversion/conversion-v3/sse/types/sse-events.js +0 -150
  207. package/dist/conversion/conversion-v3/sse/types/stream-state.d.ts +0 -204
  208. package/dist/conversion/conversion-v3/sse/types/stream-state.js +0 -44
  209. package/dist/conversion/conversion-v3/sse/types/utility-types.d.ts +0 -230
  210. package/dist/conversion/conversion-v3/sse/types/utility-types.js +0 -49
  211. package/dist/conversion/conversion-v3/standards/context-adapter.d.ts +0 -146
  212. package/dist/conversion/conversion-v3/standards/context-adapter.js +0 -438
  213. package/dist/conversion/conversion-v3/standards/errors.d.ts +0 -38
  214. package/dist/conversion/conversion-v3/standards/errors.js +0 -27
  215. package/dist/conversion/conversion-v3/standards/index.d.ts +0 -15
  216. package/dist/conversion/conversion-v3/standards/index.js +0 -11
  217. package/dist/conversion/conversion-v3/standards/node-capabilities.d.ts +0 -123
  218. package/dist/conversion/conversion-v3/standards/node-capabilities.js +0 -330
  219. package/dist/conversion/conversion-v3/standards/pipeline-context.d.ts +0 -237
  220. package/dist/conversion/conversion-v3/standards/pipeline-context.js +0 -84
  221. package/dist/conversion/conversion-v3/standards/pipeline-node.d.ts +0 -196
  222. package/dist/conversion/conversion-v3/standards/pipeline-node.js +0 -316
  223. package/dist/conversion/conversion-v3/standards/snapshot-handles.d.ts +0 -24
  224. package/dist/conversion/conversion-v3/standards/snapshot-handles.js +0 -49
  225. package/dist/conversion/conversion-v3/types/config-types.d.ts +0 -242
  226. package/dist/conversion/conversion-v3/types/config-types.js +0 -13
  227. package/dist/conversion/conversion-v3/types/index.d.ts +0 -8
  228. package/dist/conversion/conversion-v3/types/index.js +0 -11
  229. package/dist/conversion/conversion-v3/types/node-types.d.ts +0 -211
  230. package/dist/conversion/conversion-v3/types/node-types.js +0 -20
  231. package/dist/conversion/conversion-v3/types/pipeline-types.d.ts +0 -246
  232. package/dist/conversion/conversion-v3/types/pipeline-types.js +0 -26
  233. package/dist/conversion/conversion-v3/types/request-types.d.ts +0 -293
  234. package/dist/conversion/conversion-v3/types/request-types.js +0 -26
  235. package/dist/conversion/conversion-v3/utils/provider-payload-sanitizer.d.ts +0 -10
  236. package/dist/conversion/conversion-v3/utils/provider-payload-sanitizer.js +0 -103
  237. package/dist/conversion/conversion-v3/validations/index.d.ts +0 -8
  238. package/dist/conversion/conversion-v3/validations/index.js +0 -7
  239. package/dist/conversion/conversion-v3/validations/node-graph-validator.d.ts +0 -116
  240. package/dist/conversion/conversion-v3/validations/node-graph-validator.js +0 -505
  241. package/dist/conversion/conversion-v3/validations/tool-governance-enforcer.d.ts +0 -139
  242. package/dist/conversion/conversion-v3/validations/tool-governance-enforcer.js +0 -338
  243. package/dist/conversion/hub/config/types.d.ts +0 -26
  244. package/dist/conversion/hub/core/detour-registry.d.ts +0 -9
  245. package/dist/conversion/hub/core/hub-context.d.ts +0 -21
  246. package/dist/conversion/hub/core/index.d.ts +0 -3
  247. package/dist/conversion/hub/core/stage-driver.d.ts +0 -30
  248. package/dist/conversion/hub/format-adapters/anthropic-format-adapter.d.ts +0 -16
  249. package/dist/conversion/hub/format-adapters/chat-format-adapter.d.ts +0 -17
  250. package/dist/conversion/hub/format-adapters/gemini-format-adapter.d.ts +0 -16
  251. package/dist/conversion/hub/format-adapters/index.d.ts +0 -21
  252. package/dist/conversion/hub/format-adapters/responses-format-adapter.d.ts +0 -17
  253. package/dist/conversion/hub/hub-feature.d.ts +0 -1
  254. package/dist/conversion/hub/node-support.d.ts +0 -19
  255. package/dist/conversion/hub/pipeline/hub-pipeline.d.ts +0 -68
  256. package/dist/conversion/hub/pipelines/inbound.d.ts +0 -22
  257. package/dist/conversion/hub/pipelines/outbound.d.ts +0 -22
  258. package/dist/conversion/hub/process/chat-process.d.ts +0 -13
  259. package/dist/conversion/hub/registry.d.ts +0 -28
  260. package/dist/conversion/hub/response/chat-response-utils.d.ts +0 -6
  261. package/dist/conversion/hub/response/provider-response.d.ts +0 -20
  262. package/dist/conversion/hub/response/response-mappers.d.ts +0 -19
  263. package/dist/conversion/hub/response/response-runtime.d.ts +0 -3
  264. package/dist/conversion/hub/semantic-mappers/anthropic-mapper.d.ts +0 -7
  265. package/dist/conversion/hub/semantic-mappers/chat-mapper.d.ts +0 -7
  266. package/dist/conversion/hub/semantic-mappers/gemini-mapper.d.ts +0 -7
  267. package/dist/conversion/hub/semantic-mappers/index.d.ts +0 -4
  268. package/dist/conversion/hub/semantic-mappers/responses-mapper.d.ts +0 -21
  269. package/dist/conversion/hub/snapshot-recorder.d.ts +0 -12
  270. package/dist/conversion/hub/standardized-bridge.d.ts +0 -12
  271. package/dist/conversion/hub/types/chat-envelope.d.ts +0 -67
  272. package/dist/conversion/hub/types/chat-schema.d.ts +0 -112
  273. package/dist/conversion/hub/types/errors.d.ts +0 -5
  274. package/dist/conversion/hub/types/format-envelope.d.ts +0 -7
  275. package/dist/conversion/hub/types/index.d.ts +0 -6
  276. package/dist/conversion/hub/types/json.d.ts +0 -9
  277. package/dist/conversion/hub/types/node.d.ts +0 -31
  278. package/dist/conversion/hub/types/standardized.d.ts +0 -94
  279. package/dist/conversion/responses/responses-openai-bridge.d.ts +0 -95
  280. package/dist/conversion/schema-validator.d.ts +0 -7
  281. package/dist/conversion/shared/args-mapping.d.ts +0 -18
  282. package/dist/conversion/shared/chat-request-filters.d.ts +0 -9
  283. package/dist/conversion/shared/jsonish.d.ts +0 -3
  284. package/dist/conversion/shared/mcp-injection.d.ts +0 -2
  285. package/dist/conversion/shared/media.d.ts +0 -1
  286. package/dist/conversion/shared/openai-finalizer.d.ts +0 -9
  287. package/dist/conversion/shared/openai-message-normalize.d.ts +0 -1
  288. package/dist/conversion/shared/payload-budget.d.ts +0 -13
  289. package/dist/conversion/shared/reasoning-mapping.d.ts +0 -5
  290. package/dist/conversion/shared/responses-conversation-store.d.ts +0 -41
  291. package/dist/conversion/shared/responses-id-utils.d.ts +0 -7
  292. package/dist/conversion/shared/responses-instructions.d.ts +0 -1
  293. package/dist/conversion/shared/responses-metadata.d.ts +0 -1
  294. package/dist/conversion/shared/responses-request-adapter.d.ts +0 -66
  295. package/dist/conversion/shared/snapshot-hooks.d.ts +0 -12
  296. package/dist/conversion/shared/streaming-text-extractor.d.ts +0 -26
  297. package/dist/conversion/shared/text-markup-normalizer.d.ts +0 -9
  298. package/dist/conversion/shared/tool-canonicalizer.d.ts +0 -2
  299. package/dist/conversion/shared/tool-filter-pipeline.d.ts +0 -17
  300. package/dist/conversion/shared/tool-governor.d.ts +0 -27
  301. package/dist/conversion/shared/tool-harvester.d.ts +0 -31
  302. package/dist/conversion/shared/tool-mapping.d.ts +0 -10
  303. package/dist/conversion/shared/tooling.d.ts +0 -26
  304. package/dist/conversion/types.d.ts +0 -33
  305. package/dist/core/index.d.ts +0 -6
  306. package/dist/core/index.js +0 -9
  307. package/dist/core/llmswitch-engine-v2.d.ts +0 -132
  308. package/dist/core/llmswitch-engine-v2.js +0 -649
  309. package/dist/core/llmswitch-factory-v2.d.ts +0 -123
  310. package/dist/core/llmswitch-factory-v2.js +0 -521
  311. package/dist/endpoints/base-endpoint-handler.d.ts +0 -128
  312. package/dist/endpoints/base-endpoint-handler.js +0 -545
  313. package/dist/endpoints/chat-endpoint-handler.d.ts +0 -115
  314. package/dist/endpoints/chat-endpoint-handler.js +0 -218
  315. package/dist/endpoints/endpoint-router.d.ts +0 -127
  316. package/dist/endpoints/endpoint-router.js +0 -438
  317. package/dist/endpoints/index.d.ts +0 -13
  318. package/dist/endpoints/index.js +0 -11
  319. package/dist/endpoints/messages-endpoint-handler.d.ts +0 -171
  320. package/dist/endpoints/messages-endpoint-handler.js +0 -238
  321. package/dist/endpoints/responses-endpoint-handler.d.ts +0 -147
  322. package/dist/endpoints/responses-endpoint-handler.js +0 -233
  323. package/dist/filters/builtin/add-fields-filter.d.ts +0 -8
  324. package/dist/filters/builtin/blacklist-filter.d.ts +0 -8
  325. package/dist/filters/builtin/whitelist-filter.d.ts +0 -8
  326. package/dist/filters/engine.d.ts +0 -16
  327. package/dist/filters/index.d.ts +0 -19
  328. package/dist/filters/special/request-streaming-to-nonstreaming.d.ts +0 -12
  329. package/dist/filters/special/request-tool-choice-policy.d.ts +0 -11
  330. package/dist/filters/special/request-tool-list-filter.d.ts +0 -11
  331. package/dist/filters/special/request-toolcalls-stringify.d.ts +0 -10
  332. package/dist/filters/special/request-tools-normalize.d.ts +0 -12
  333. package/dist/filters/special/response-finish-invariants.d.ts +0 -11
  334. package/dist/filters/special/response-openai-to-responses-bridge.d.ts +0 -13
  335. package/dist/filters/special/response-tool-arguments-blacklist.d.ts +0 -12
  336. package/dist/filters/special/response-tool-arguments-schema-converge.d.ts +0 -13
  337. package/dist/filters/special/response-tool-arguments-stringify.d.ts +0 -9
  338. package/dist/filters/special/response-tool-arguments-toon-decode.d.ts +0 -10
  339. package/dist/filters/special/response-tool-arguments-whitelist.d.ts +0 -11
  340. package/dist/filters/special/response-tool-text-canonicalize.d.ts +0 -10
  341. package/dist/filters/special/tool-filter-hooks.d.ts +0 -19
  342. package/dist/filters/special/tool-post-constraints.d.ts +0 -31
  343. package/dist/filters/types.d.ts +0 -68
  344. package/dist/filters/utils/fieldmap-loader.d.ts +0 -2
  345. package/dist/filters/utils/snapshot-writer.d.ts +0 -10
  346. package/dist/guidance/index.d.ts +0 -3
  347. package/dist/hooks/hooks-integration.d.ts +0 -161
  348. package/dist/hooks/hooks-integration.js +0 -519
  349. package/dist/hooks/index.d.ts +0 -10
  350. package/dist/hooks/index.js +0 -13
  351. package/dist/html-to-markdown.d.ts +0 -5
  352. package/dist/html-to-markdown.js +0 -66
  353. package/dist/http/sse-response.d.ts +0 -22
  354. package/dist/router/virtual-router/bootstrap.d.ts +0 -6
  355. package/dist/router/virtual-router/classifier.d.ts +0 -10
  356. package/dist/router/virtual-router/engine.d.ts +0 -35
  357. package/dist/router/virtual-router/error-center.d.ts +0 -10
  358. package/dist/router/virtual-router/features.d.ts +0 -3
  359. package/dist/router/virtual-router/health-manager.d.ts +0 -18
  360. package/dist/router/virtual-router/load-balancer.d.ts +0 -18
  361. package/dist/router/virtual-router/provider-registry.d.ts +0 -11
  362. package/dist/router/virtual-router/types.d.ts +0 -206
  363. package/dist/sse/json-to-sse/anthropic-json-to-sse-converter.d.ts +0 -11
  364. package/dist/sse/json-to-sse/chat-json-to-sse-converter.d.ts +0 -79
  365. package/dist/sse/json-to-sse/event-generators/chat.d.ts +0 -55
  366. package/dist/sse/json-to-sse/event-generators/responses.d.ts +0 -99
  367. package/dist/sse/json-to-sse/index.d.ts +0 -6
  368. package/dist/sse/json-to-sse/responses-json-to-sse-converter.d.ts +0 -79
  369. package/dist/sse/json-to-sse/sequencers/chat-sequencer.d.ts +0 -37
  370. package/dist/sse/json-to-sse/sequencers/responses-sequencer.d.ts +0 -40
  371. package/dist/sse/registry/sse-codec-registry.d.ts +0 -32
  372. package/dist/sse/shared/chat-serializer.d.ts +0 -4
  373. package/dist/sse/shared/constants.d.ts +0 -272
  374. package/dist/sse/shared/serializers/base-serializer.d.ts +0 -158
  375. package/dist/sse/shared/serializers/chat-event-serializer.d.ts +0 -82
  376. package/dist/sse/shared/serializers/index.d.ts +0 -39
  377. package/dist/sse/shared/serializers/responses-event-serializer.d.ts +0 -123
  378. package/dist/sse/shared/serializers/types.d.ts +0 -51
  379. package/dist/sse/shared/utils.d.ts +0 -254
  380. package/dist/sse/shared/writer.d.ts +0 -111
  381. package/dist/sse/sse-to-json/anthropic-sse-to-json-converter.d.ts +0 -13
  382. package/dist/sse/sse-to-json/builders/response-builder.d.ts +0 -165
  383. package/dist/sse/sse-to-json/chat-sse-to-json-converter.d.ts +0 -106
  384. package/dist/sse/sse-to-json/index.d.ts +0 -6
  385. package/dist/sse/sse-to-json/parsers/sse-parser.d.ts +0 -73
  386. package/dist/sse/types/anthropic-types.d.ts +0 -87
  387. package/dist/tools/proxy/anthropic-tool-proxy.d.ts +0 -19
  388. package/dist/tools/proxy/anthropic-tool-proxy.js +0 -57
  389. package/dist/tools/proxy/executors/web-fetch.d.ts +0 -6
  390. package/dist/tools/proxy/executors/web-fetch.js +0 -39
  391. package/dist/tools/proxy/registry.d.ts +0 -8
  392. package/dist/tools/proxy/registry.js +0 -14
  393. package/dist/tools/proxy/types.d.ts +0 -29
  394. package/dist/tools/tool-registry.d.ts +0 -8
  395. package/dist/tools/web-fetch-html.d.ts +0 -15
  396. package/dist/tools/web-fetch-html.js +0 -83
  397. package/dist/utils/conversion-adapter.d.ts +0 -65
  398. package/dist/utils/conversion-adapter.js +0 -183
  399. package/dist/utils/error-factory.d.ts +0 -88
  400. package/dist/utils/error-factory.js +0 -138
  401. package/dist/utils/error-utils.d.ts +0 -334
  402. package/dist/utils/error-utils.js +0 -782
  403. package/dist/utils/index.d.ts +0 -8
  404. package/dist/utils/index.js +0 -13
  405. package/dist/utils/performance-utils.d.ts +0 -205
  406. package/dist/utils/performance-utils.js +0 -440
  407. package/dist/utils/profile-mapper.d.ts +0 -32
  408. package/dist/utils/profile-mapper.js +0 -269
  409. package/dist/utils/request-processor.d.ts +0 -52
  410. package/dist/utils/request-processor.js +0 -210
  411. package/dist/utils/request-utils.d.ts +0 -117
  412. package/dist/utils/request-utils.js +0 -333
  413. package/dist/utils/response-utils.d.ts +0 -127
  414. package/dist/utils/response-utils.js +0 -516
  415. package/dist/utils/token-counter.d.ts +0 -89
  416. package/dist/utils/token-counter.js +0 -541
  417. /package/dist/{tools/proxy → conversion/hub/tool-governance}/types.js +0 -0
package/README.md CHANGED
@@ -1,4 +1,6 @@
1
- # rcc-llmswitch-core(RouteCodex LLM Switch 核心)
1
+ # @jsonstudio/llms(RouteCodex LLM Switch 核心)
2
+
3
+ > 自 0.4.3 起,原 `rcc-llmswitch-core` npm 包已迁移并更名为 `@jsonstudio/llms`。开发 / 发布流程保持不变,仅需更新 package 依赖与文档引用。
2
4
 
3
5
  本包是 RouteCodex V2 的“工具治理唯一入口 + 协议转换核心”,实现严格的“前半段/后半段”双向流水线,并通过 `defaultSseCodecRegistry` 统一治理所有 SSE ↔ JSON 转换。核心事实:
4
6
 
@@ -19,12 +19,15 @@ function normalizeEndpoint(candidate) {
19
19
  }
20
20
  function inferProviderType(protocol) {
21
21
  const value = (protocol ?? '').toLowerCase();
22
- if (value.includes('anthropic'))
22
+ if (value.includes('anthropic')) {
23
23
  return 'anthropic';
24
- if (value.includes('responses'))
24
+ }
25
+ if (value.includes('responses')) {
25
26
  return 'responses';
26
- if (value.includes('gemini'))
27
+ }
28
+ if (value.includes('gemini')) {
27
29
  return 'gemini';
30
+ }
28
31
  return 'openai';
29
32
  }
30
33
  function buildContext(input) {
@@ -10,28 +10,36 @@ export function resolveHostPaths() {
10
10
  try {
11
11
  const cwd = process.cwd();
12
12
  const cfg = path.join(cwd, 'config');
13
- if (fs.existsSync(cfg))
13
+ if (fs.existsSync(cfg)) {
14
14
  return { hostRoot: cwd, configDir: cfg };
15
+ }
16
+ }
17
+ catch {
18
+ /* ignore */
15
19
  }
16
- catch { /* ignore */ }
17
20
  // Attempt 2: scan upward from this file
18
21
  try {
19
22
  let cur = path.dirname(new URL(import.meta.url).pathname);
20
23
  const visited = new Set();
21
24
  for (let i = 0; i < 10; i++) {
22
- if (visited.has(cur))
25
+ if (visited.has(cur)) {
23
26
  break;
27
+ }
24
28
  visited.add(cur);
25
29
  const cfg = path.join(cur, 'config');
26
- if (fs.existsSync(cfg))
30
+ if (fs.existsSync(cfg)) {
27
31
  return { hostRoot: cur, configDir: cfg };
32
+ }
28
33
  const parent = path.dirname(cur);
29
- if (parent === cur)
34
+ if (parent === cur) {
30
35
  break;
36
+ }
31
37
  cur = parent;
32
38
  }
33
39
  }
34
- catch { /* ignore */ }
40
+ catch {
41
+ /* ignore */
42
+ }
35
43
  // Fallback to relative 'config'
36
44
  const fallbackRoot = process.cwd();
37
45
  return { hostRoot: fallbackRoot, configDir: path.join(fallbackRoot, 'config') };
@@ -2,20 +2,22 @@
2
2
  import fs from 'fs';
3
3
  import path from 'path';
4
4
  import { resolveHostPaths } from './enhanced-path-resolver.js';
5
- const isObj = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
6
- function readJsonSync(file) {
5
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
6
+ const hasProviders = (value) => isRecord(value) && typeof value.providers === 'object' && value.providers !== null;
7
+ const readJsonSync = (file) => {
7
8
  try {
8
9
  return JSON.parse(fs.readFileSync(file, 'utf-8'));
9
10
  }
10
11
  catch {
11
12
  return null;
12
13
  }
13
- }
14
- function listMergedConfigs(configDir) {
14
+ };
15
+ const listMergedConfigs = (configDir) => {
15
16
  try {
16
- const files = fs.readdirSync(configDir)
17
- .filter(n => /merged-config.*\.json$/i.test(n))
18
- .map(n => path.join(configDir, n));
17
+ const files = fs
18
+ .readdirSync(configDir)
19
+ .filter((name) => /merged-config.*\.json$/i.test(name))
20
+ .map((name) => path.join(configDir, name));
19
21
  files.sort((a, b) => {
20
22
  try {
21
23
  const sa = fs.statSync(a);
@@ -31,39 +33,70 @@ function listMergedConfigs(configDir) {
31
33
  catch {
32
34
  return [];
33
35
  }
34
- }
36
+ };
37
+ const toNumber = (value) => {
38
+ const parsed = Number(value);
39
+ return Number.isFinite(parsed) ? parsed : null;
40
+ };
41
+ const extractProviders = (cfg) => {
42
+ if (!isRecord(cfg.virtualrouter) || !hasProviders(cfg.virtualrouter)) {
43
+ return null;
44
+ }
45
+ return cfg.virtualrouter.providers ?? null;
46
+ };
47
+ const extractModulesConfig = (modulesRoot) => {
48
+ if (!isRecord(modulesRoot.modules)) {
49
+ return null;
50
+ }
51
+ const virtualRouterModule = modulesRoot.modules.virtualrouter;
52
+ if (!isRecord(virtualRouterModule)) {
53
+ return null;
54
+ }
55
+ const config = virtualRouterModule.config;
56
+ return isRecord(config) ? config : null;
57
+ };
58
+ const readContextBudgetNode = (configNode) => {
59
+ if (!configNode) {
60
+ return { defaultBytes: null, safetyRatio: null };
61
+ }
62
+ const contextBudgetNode = configNode.contextBudget;
63
+ if (!isRecord(contextBudgetNode)) {
64
+ return { defaultBytes: null, safetyRatio: null };
65
+ }
66
+ const defaultBytes = toNumber(contextBudgetNode.defaultMaxContextBytes ?? contextBudgetNode.defaultMaxContext);
67
+ const safetyRatio = toNumber(contextBudgetNode.safetyRatio);
68
+ return { defaultBytes, safetyRatio };
69
+ };
35
70
  function findMaxContextInConfig(cfg, modelId) {
36
- try {
37
- const vr = cfg.virtualrouter;
38
- if (!isObj(vr))
39
- return null;
40
- const providers = vr.providers;
41
- if (!isObj(providers))
42
- return null;
43
- for (const p of Object.keys(providers)) {
44
- const prov = providers[p];
45
- if (!isObj(prov))
46
- continue;
47
- const models = prov.models;
48
- if (!isObj(models))
49
- continue;
50
- if (Object.prototype.hasOwnProperty.call(models, modelId)) {
51
- const item = models[modelId];
52
- const v = isObj(item) ? item.maxContext : undefined;
53
- const n = Number(v);
54
- if (Number.isFinite(n) && n > 0)
55
- return n;
56
- }
71
+ const providers = extractProviders(cfg);
72
+ if (!providers) {
73
+ return null;
74
+ }
75
+ for (const provider of Object.values(providers)) {
76
+ if (!isRecord(provider.models)) {
77
+ continue;
78
+ }
79
+ const models = provider.models;
80
+ if (!Object.prototype.hasOwnProperty.call(models, modelId)) {
81
+ continue;
82
+ }
83
+ const target = models[modelId];
84
+ if (!target) {
85
+ continue;
86
+ }
87
+ const maxContext = toNumber(target.maxContext);
88
+ if (maxContext && maxContext > 0) {
89
+ return maxContext;
57
90
  }
58
91
  }
59
- catch { /* ignore */ }
60
92
  return null;
61
93
  }
62
94
  export class UnifiedConfigFacade {
63
95
  static _instance = null;
64
96
  static getInstance() {
65
- if (!this._instance)
97
+ if (!this._instance) {
66
98
  this._instance = new UnifiedConfigFacade();
99
+ }
67
100
  return this._instance;
68
101
  }
69
102
  watchers = [];
@@ -83,16 +116,14 @@ export class UnifiedConfigFacade {
83
116
  let modulesSafety = null;
84
117
  try {
85
118
  const modules = readJsonSync(path.join(configDir, 'modules.json'));
86
- if (modules && isObj(modules.modules) && isObj(modules.modules.virtualrouter) && isObj(modules.modules.virtualrouter.config)) {
87
- const vr = modules.modules.virtualrouter.config;
88
- if (isObj(vr.contextBudget)) {
89
- const ctx = vr.contextBudget;
90
- const d = Number(ctx.defaultMaxContextBytes);
91
- if (Number.isFinite(d) && d > 0)
92
- modulesDefault = d;
93
- const s = Number(ctx.safetyRatio);
94
- if (Number.isFinite(s) && s >= 0 && s < 1)
95
- modulesSafety = s;
119
+ if (modules) {
120
+ const modulesConfig = extractModulesConfig(modules);
121
+ const { defaultBytes, safetyRatio } = readContextBudgetNode(modulesConfig);
122
+ if (defaultBytes && defaultBytes > 0) {
123
+ modulesDefault = defaultBytes;
124
+ }
125
+ if (typeof safetyRatio === 'number' && safetyRatio >= 0 && safetyRatio < 1) {
126
+ modulesSafety = safetyRatio;
96
127
  }
97
128
  }
98
129
  }
@@ -102,8 +133,9 @@ export class UnifiedConfigFacade {
102
133
  const merged = listMergedConfigs(configDir);
103
134
  for (const f of merged) {
104
135
  const cfg = readJsonSync(f);
105
- if (!cfg)
136
+ if (!cfg) {
106
137
  continue;
138
+ }
107
139
  const v = findMaxContextInConfig(cfg, modelId);
108
140
  if (v && v > 0) {
109
141
  const safety = Number.isFinite(safetyFromEnv) ? safetyFromEnv : (modulesSafety ?? 0.1);
@@ -111,7 +143,9 @@ export class UnifiedConfigFacade {
111
143
  }
112
144
  }
113
145
  }
114
- catch { /* ignore */ }
146
+ catch {
147
+ /* ignore */
148
+ }
115
149
  // config.json
116
150
  try {
117
151
  const cfg = readJsonSync(path.join(configDir, 'config.json'));
@@ -135,51 +169,61 @@ export class UnifiedConfigFacade {
135
169
  try {
136
170
  const { configDir } = resolveHostPaths();
137
171
  const modules = readJsonSync(path.join(configDir, 'modules.json'));
138
- if (modules && isObj(modules.modules) && isObj(modules.modules.virtualrouter) && isObj(modules.modules.virtualrouter.config)) {
139
- const vr = modules.modules.virtualrouter.config;
140
- if (isObj(vr.contextBudget)) {
141
- const ctx = vr.contextBudget;
142
- const d = Number(ctx.defaultMaxContextBytes);
143
- const s = Number(ctx.safetyRatio);
144
- if (!(Number.isFinite(d) && d > 0))
172
+ if (modules) {
173
+ const modulesConfig = extractModulesConfig(modules);
174
+ if (modulesConfig && isRecord(modulesConfig.contextBudget)) {
175
+ const contextBudget = modulesConfig.contextBudget;
176
+ const defaultBytes = toNumber(contextBudget.defaultMaxContextBytes ?? contextBudget.defaultMaxContext);
177
+ const safetyRatio = toNumber(contextBudget.safetyRatio);
178
+ if (!(defaultBytes && defaultBytes > 0)) {
145
179
  issues.push('contextBudget.defaultMaxContextBytes must be positive number');
146
- if (!(Number.isFinite(s) && s >= 0 && s < 1))
180
+ }
181
+ if (!(typeof safetyRatio === 'number' && safetyRatio >= 0 && safetyRatio < 1)) {
147
182
  issues.push('contextBudget.safetyRatio must be in [0,1)');
183
+ }
148
184
  }
149
185
  }
150
186
  }
151
- catch (e) {
152
- issues.push(`validateConfig error: ${e?.message || String(e)}`);
187
+ catch (error) {
188
+ const err = error;
189
+ issues.push(`validateConfig error: ${err?.message ?? String(error)}`);
153
190
  }
154
191
  return { ok: issues.length === 0, issues };
155
192
  }
156
193
  watchConfig(cb) {
157
194
  this.watchers.push(cb);
158
- if (this.fsWatcher)
195
+ if (this.fsWatcher) {
159
196
  return;
197
+ }
160
198
  try {
161
199
  const { configDir } = resolveHostPaths();
162
200
  this.fsWatcher = fs.watch(configDir, { persistent: false }, (event, file) => {
163
201
  try {
164
- this.watchers.forEach(fn => fn({ file: file || '', event }));
202
+ this.watchers.forEach((fn) => fn({ file: file || '', event }));
203
+ }
204
+ catch {
205
+ /* ignore */
165
206
  }
166
- catch { /* ignore */ }
167
207
  });
168
208
  }
169
- catch { /* ignore */ }
209
+ catch {
210
+ /* ignore */
211
+ }
170
212
  }
171
213
  unwatchConfig(cb) {
172
214
  if (!cb) {
173
215
  this.watchers = [];
174
216
  }
175
217
  else {
176
- this.watchers = this.watchers.filter(fn => fn !== cb);
218
+ this.watchers = this.watchers.filter((fn) => fn !== cb);
177
219
  }
178
220
  if (this.watchers.length === 0 && this.fsWatcher) {
179
221
  try {
180
222
  this.fsWatcher.close();
181
223
  }
182
- catch { /* ignore */ }
224
+ catch {
225
+ /* ignore */
226
+ }
183
227
  this.fsWatcher = null;
184
228
  }
185
229
  }
@@ -6,11 +6,13 @@ export class CodecRegistry {
6
6
  this.factories.set(id, factory);
7
7
  }
8
8
  async resolve(id) {
9
- if (this.instances.has(id))
9
+ if (this.instances.has(id)) {
10
10
  return this.instances.get(id);
11
+ }
11
12
  const factory = this.factories.get(id);
12
- if (!factory)
13
+ if (!factory) {
13
14
  throw new Error(`Unknown conversion codec: ${id}`);
15
+ }
14
16
  const instance = await factory();
15
17
  await instance.initialize();
16
18
  this.instances.set(id, instance);
@@ -85,7 +85,7 @@ export class HubPipeline {
85
85
  });
86
86
  return {
87
87
  processedRequest: processResult.processedRequest,
88
- nodeResult: this.convertV3NodeResult('hub-chat-process', processResult.nodeResult)
88
+ nodeResult: this.convertProcessNodeResult('hub-chat-process', processResult.nodeResult)
89
89
  };
90
90
  }
91
91
  routeRequest(request, normalized) {
@@ -299,17 +299,16 @@ export class HubPipeline {
299
299
  error: result.error
300
300
  };
301
301
  }
302
- convertV3NodeResult(id, result) {
302
+ convertProcessNodeResult(id, result) {
303
303
  return {
304
304
  id,
305
305
  success: result.success,
306
306
  metadata: result.metadata,
307
307
  error: result.error
308
308
  ? {
309
- code: result.error.code,
309
+ code: result.error.code ?? 'hub_chat_process_error',
310
310
  message: result.error.message,
311
- details: result.error.details,
312
- cause: result.error.cause
311
+ details: result.error.details
313
312
  }
314
313
  : undefined
315
314
  };
@@ -1,50 +1,267 @@
1
- import { ChatProcessNode } from '../../conversion-v3/nodes/process/chat-process-node.js';
2
- import { NodeType } from '../../conversion-v3/types/index.js';
3
- const CHAT_PROCESS_CONFIG = {
4
- id: 'hub-chat-process',
5
- type: NodeType.PROCESS,
6
- name: 'Hub Chat Process Node',
7
- inputFormat: 'standardized-request',
8
- outputFormat: 'processed-request',
9
- rules: [],
10
- validation: {
11
- strict: false,
12
- required: [],
13
- optional: []
14
- },
15
- timeout: 30_000,
16
- options: {}
17
- };
18
- const chatProcessNode = new ChatProcessNode(CHAT_PROCESS_CONFIG);
1
+ import { runChatRequestToolFilters } from '../../shared/tool-filter-pipeline.js';
2
+ import { ToolGovernanceEngine } from '../tool-governance/index.js';
3
+ const toolGovernanceEngine = new ToolGovernanceEngine();
19
4
  export async function runHubChatProcess(options) {
20
- const nodeContext = buildProcessNodeContext(options);
21
- const result = await chatProcessNode.execute(nodeContext);
5
+ const startTime = Date.now();
6
+ try {
7
+ const governed = await applyRequestToolGovernance(options.request, {
8
+ entryEndpoint: options.entryEndpoint,
9
+ requestId: options.requestId,
10
+ metadata: options.metadata
11
+ });
12
+ const processedRequest = buildProcessedRequest(governed);
13
+ return {
14
+ processedRequest,
15
+ nodeResult: buildSuccessResult(startTime, processedRequest)
16
+ };
17
+ }
18
+ catch (error) {
19
+ return {
20
+ nodeResult: buildErrorResult(startTime, error)
21
+ };
22
+ }
23
+ }
24
+ async function applyRequestToolGovernance(request, context) {
25
+ const entryEndpoint = context.entryEndpoint && context.entryEndpoint.trim()
26
+ ? context.entryEndpoint
27
+ : '/v1/chat/completions';
28
+ const metadata = normalizeRecord(context.metadata);
29
+ const providerProtocol = readString(metadata.providerProtocol) ?? readString(metadata.provider) ?? 'openai-chat';
30
+ const metadataToolHints = metadata.toolFilterHints;
31
+ const metadataStreamFlag = metadata.stream;
32
+ const metadataStream = typeof metadataStreamFlag === 'boolean' ? metadataStreamFlag : request.parameters?.stream === true;
33
+ const shaped = {
34
+ model: request.model,
35
+ messages: deepClone(request.messages),
36
+ tools: request.tools ? deepClone(request.tools) : undefined,
37
+ tool_choice: request.parameters?.tool_choice,
38
+ stream: request.parameters?.stream === true,
39
+ parameters: { ...request.parameters }
40
+ };
41
+ const governedPayload = await runChatRequestToolFilters(shaped, {
42
+ entryEndpoint,
43
+ requestId: context.requestId,
44
+ model: request.model,
45
+ profile: providerProtocol,
46
+ stream: metadataStream,
47
+ toolFilterHints: metadataToolHints
48
+ });
49
+ const governed = normalizeRecord(governedPayload);
50
+ const merged = {
51
+ ...request,
52
+ messages: Array.isArray(governed.messages)
53
+ ? governed.messages
54
+ : request.messages,
55
+ tools: governed.tools !== undefined ? castGovernedTools(governed.tools) : request.tools,
56
+ parameters: {
57
+ ...request.parameters,
58
+ ...(isRecord(governed.parameters) ? governed.parameters : {})
59
+ },
60
+ metadata: {
61
+ ...request.metadata,
62
+ toolChoice: readToolChoice(governed.tool_choice),
63
+ originalStream: request.parameters?.stream === true,
64
+ stream: typeof governed.stream === 'boolean'
65
+ ? governed.stream
66
+ : request.parameters?.stream,
67
+ governedTools: governed.tools !== undefined,
68
+ governanceTimestamp: Date.now()
69
+ }
70
+ };
71
+ if (typeof governed.stream === 'boolean') {
72
+ merged.parameters = {
73
+ ...merged.parameters,
74
+ stream: governed.stream
75
+ };
76
+ }
77
+ if (governed.tool_choice !== undefined) {
78
+ merged.parameters = {
79
+ ...merged.parameters,
80
+ tool_choice: governed.tool_choice
81
+ };
82
+ }
83
+ if (typeof governed.model === 'string' && governed.model.trim()) {
84
+ merged.model = governed.model.trim();
85
+ }
86
+ const { request: sanitized, summary } = toolGovernanceEngine.governRequest(merged, providerProtocol);
87
+ if (summary.applied) {
88
+ sanitized.metadata = {
89
+ ...sanitized.metadata,
90
+ toolGovernance: {
91
+ ...sanitized.metadata?.toolGovernance,
92
+ request: summary
93
+ }
94
+ };
95
+ }
96
+ return sanitized;
97
+ }
98
+ function buildProcessedRequest(request) {
99
+ const timestamp = Date.now();
100
+ const streamingEnabled = request.parameters?.stream === true;
22
101
  return {
23
- processedRequest: result.success ? result.data?.processedRequest : undefined,
24
- nodeResult: result
102
+ ...request,
103
+ processed: {
104
+ timestamp,
105
+ appliedRules: ['tool-governance'],
106
+ status: 'success'
107
+ },
108
+ processingMetadata: {
109
+ streaming: {
110
+ enabled: streamingEnabled,
111
+ chunkCount: 0
112
+ },
113
+ context: buildContextMetadata(request.metadata)
114
+ }
25
115
  };
26
116
  }
27
- function buildProcessNodeContext(options) {
117
+ function buildContextMetadata(metadata) {
118
+ if (!metadata?.capturedContext || typeof metadata.capturedContext !== 'object') {
119
+ return undefined;
120
+ }
121
+ return { ...metadata.capturedContext };
122
+ }
123
+ function buildSuccessResult(startTime, processedRequest) {
124
+ const endTime = Date.now();
28
125
  return {
29
- request: {
30
- id: options.requestId,
31
- timestamp: Date.now(),
32
- endpoint: options.entryEndpoint,
33
- payload: options.rawPayload,
34
- context: {
35
- metadata: options.metadata
126
+ success: true,
127
+ metadata: {
128
+ node: 'hub-chat-process',
129
+ executionTime: endTime - startTime,
130
+ startTime,
131
+ endTime,
132
+ dataProcessed: {
133
+ messages: processedRequest.messages.length,
134
+ tools: processedRequest.tools?.length ?? 0
36
135
  }
136
+ }
137
+ };
138
+ }
139
+ function buildErrorResult(startTime, error) {
140
+ const endTime = Date.now();
141
+ return {
142
+ success: false,
143
+ metadata: {
144
+ node: 'hub-chat-process',
145
+ executionTime: endTime - startTime,
146
+ startTime,
147
+ endTime
37
148
  },
38
- data: {
39
- standardizedRequest: options.request
40
- },
41
- pipeline: {
42
- currentNode: CHAT_PROCESS_CONFIG.id,
43
- previousResults: [],
44
- isPassthrough: false,
45
- startTime: Date.now()
46
- },
47
- nodeConfig: CHAT_PROCESS_CONFIG,
48
- callbacks: null
149
+ error: {
150
+ message: error instanceof Error ? error.message : String(error)
151
+ }
152
+ };
153
+ }
154
+ function castGovernedTools(tools) {
155
+ if (!Array.isArray(tools)) {
156
+ return undefined;
157
+ }
158
+ const normalized = [];
159
+ for (const tool of tools) {
160
+ const converted = castSingleTool(tool) ?? castCustomTool(tool);
161
+ if (converted) {
162
+ normalized.push(converted);
163
+ }
164
+ }
165
+ return normalized.length ? normalized : [];
166
+ }
167
+ function castSingleTool(tool) {
168
+ if (!isRecord(tool)) {
169
+ return null;
170
+ }
171
+ const fn = tool.function;
172
+ if (!isRecord(fn) || typeof fn.name !== 'string') {
173
+ return null;
174
+ }
175
+ const parameters = castToolParameters(fn.parameters);
176
+ const description = typeof fn.description === 'string' ? fn.description : undefined;
177
+ const strictFlag = fn.strict === true || tool.strict === true;
178
+ return {
179
+ type: 'function',
180
+ function: {
181
+ name: fn.name,
182
+ description,
183
+ parameters,
184
+ strict: strictFlag ? true : undefined
185
+ }
186
+ };
187
+ }
188
+ function castCustomTool(tool) {
189
+ if (!isRecord(tool)) {
190
+ return null;
191
+ }
192
+ const type = typeof tool.type === 'string' ? tool.type.toLowerCase() : '';
193
+ const name = typeof tool.name === 'string' ? tool.name : '';
194
+ if (type !== 'custom' || !name) {
195
+ return null;
196
+ }
197
+ if (name.trim() !== 'apply_patch') {
198
+ return null;
199
+ }
200
+ const description = typeof tool.description === 'string' ? tool.description : undefined;
201
+ return {
202
+ type: 'function',
203
+ function: {
204
+ name: 'apply_patch',
205
+ description,
206
+ parameters: {
207
+ type: 'object',
208
+ properties: {
209
+ patch: {
210
+ type: 'string',
211
+ description: 'Unified diff patch content (FREEFORM, not JSON)'
212
+ }
213
+ },
214
+ required: ['patch'],
215
+ additionalProperties: false
216
+ },
217
+ strict: true
218
+ }
219
+ };
220
+ }
221
+ function castToolParameters(value) {
222
+ if (isRecord(value)) {
223
+ const properties = value.properties && typeof value.properties === 'object'
224
+ ? value.properties
225
+ : {};
226
+ const required = Array.isArray(value.required) ? value.required : undefined;
227
+ const additionalProperties = typeof value.additionalProperties === 'boolean' ? value.additionalProperties : undefined;
228
+ return {
229
+ type: 'object',
230
+ properties,
231
+ required,
232
+ additionalProperties
233
+ };
234
+ }
235
+ return {
236
+ type: 'object',
237
+ properties: {},
238
+ additionalProperties: true
49
239
  };
50
240
  }
241
+ function normalizeRecord(value) {
242
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
243
+ return value;
244
+ }
245
+ return {};
246
+ }
247
+ function deepClone(value) {
248
+ return JSON.parse(JSON.stringify(value));
249
+ }
250
+ function readString(value) {
251
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined;
252
+ }
253
+ function readToolChoice(value) {
254
+ if (!value) {
255
+ return undefined;
256
+ }
257
+ if (typeof value === 'string') {
258
+ return value;
259
+ }
260
+ if (typeof value === 'object') {
261
+ return value;
262
+ }
263
+ return undefined;
264
+ }
265
+ function isRecord(value) {
266
+ return !!value && typeof value === 'object' && !Array.isArray(value);
267
+ }