@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
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
+ }