@jsonstudio/rcc 0.89.168 → 0.89.524

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 (431) hide show
  1. package/README.md +18 -15
  2. package/dist/build-info.js +3 -3
  3. package/dist/build-info.js.map +1 -1
  4. package/dist/cli.js +94 -0
  5. package/dist/cli.js.map +1 -1
  6. package/dist/client/gemini-cli/gemini-cli-protocol-client.js +28 -5
  7. package/dist/client/gemini-cli/gemini-cli-protocol-client.js.map +1 -1
  8. package/dist/commands/token-daemon.d.ts +2 -0
  9. package/dist/commands/token-daemon.js +183 -0
  10. package/dist/commands/token-daemon.js.map +1 -0
  11. package/dist/error-handling/quiet-error-handling-center.d.ts +9 -0
  12. package/dist/error-handling/quiet-error-handling-center.js +141 -0
  13. package/dist/error-handling/quiet-error-handling-center.js.map +1 -0
  14. package/dist/error-handling/route-error-hub.js +8 -2
  15. package/dist/error-handling/route-error-hub.js.map +1 -1
  16. package/dist/index.js +4 -3
  17. package/dist/index.js.map +1 -1
  18. package/dist/modules/llmswitch/bridge.d.ts +1 -1
  19. package/dist/modules/llmswitch/bridge.js +3 -2
  20. package/dist/modules/llmswitch/bridge.js.map +1 -1
  21. package/dist/modules/pipeline/utils/colored-logger.d.ts +2 -0
  22. package/dist/modules/pipeline/utils/colored-logger.js +22 -3
  23. package/dist/modules/pipeline/utils/colored-logger.js.map +1 -1
  24. package/dist/providers/auth/antigravity-userinfo-helper.d.ts +10 -0
  25. package/dist/providers/auth/antigravity-userinfo-helper.js +140 -0
  26. package/dist/providers/auth/antigravity-userinfo-helper.js.map +1 -0
  27. package/dist/providers/auth/gemini-cli-userinfo-helper.js +12 -2
  28. package/dist/providers/auth/gemini-cli-userinfo-helper.js.map +1 -1
  29. package/dist/providers/auth/oauth-lifecycle.js +395 -24
  30. package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
  31. package/dist/providers/auth/token-scanner/index.d.ts +32 -0
  32. package/dist/providers/auth/token-scanner/index.js +86 -0
  33. package/dist/providers/auth/token-scanner/index.js.map +1 -0
  34. package/dist/providers/auth/tokenfile-auth.d.ts +17 -0
  35. package/dist/providers/auth/tokenfile-auth.js +27 -5
  36. package/dist/providers/auth/tokenfile-auth.js.map +1 -1
  37. package/dist/providers/core/api/provider-types.d.ts +10 -0
  38. package/dist/providers/core/config/oauth-flows.d.ts +25 -0
  39. package/dist/providers/core/config/oauth-flows.js +92 -5
  40. package/dist/providers/core/config/oauth-flows.js.map +1 -1
  41. package/dist/providers/core/config/provider-oauth-configs.js +93 -2
  42. package/dist/providers/core/config/provider-oauth-configs.js.map +1 -1
  43. package/dist/providers/core/config/service-profiles.js +18 -10
  44. package/dist/providers/core/config/service-profiles.js.map +1 -1
  45. package/dist/providers/core/runtime/base-provider.d.ts +2 -0
  46. package/dist/providers/core/runtime/base-provider.js +135 -15
  47. package/dist/providers/core/runtime/base-provider.js.map +1 -1
  48. package/dist/providers/core/runtime/gemini-cli-http-provider.d.ts +8 -3
  49. package/dist/providers/core/runtime/gemini-cli-http-provider.js +332 -67
  50. package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
  51. package/dist/providers/core/runtime/http-request-executor.d.ts +1 -0
  52. package/dist/providers/core/runtime/http-request-executor.js +41 -1
  53. package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
  54. package/dist/providers/core/runtime/http-transport-provider.d.ts +27 -0
  55. package/dist/providers/core/runtime/http-transport-provider.js +342 -69
  56. package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
  57. package/dist/providers/core/runtime/provider-error-classifier.d.ts +2 -2
  58. package/dist/providers/core/runtime/provider-error-classifier.js +14 -4
  59. package/dist/providers/core/runtime/provider-error-classifier.js.map +1 -1
  60. package/dist/providers/core/runtime/provider-factory.d.ts +1 -0
  61. package/dist/providers/core/runtime/provider-factory.js +37 -8
  62. package/dist/providers/core/runtime/provider-factory.js.map +1 -1
  63. package/dist/providers/core/runtime/responses-provider.d.ts +3 -3
  64. package/dist/providers/core/runtime/responses-provider.js +56 -117
  65. package/dist/providers/core/runtime/responses-provider.js.map +1 -1
  66. package/dist/providers/core/runtime/vision-debug-utils.d.ts +13 -0
  67. package/dist/providers/core/runtime/vision-debug-utils.js +114 -0
  68. package/dist/providers/core/runtime/vision-debug-utils.js.map +1 -0
  69. package/dist/providers/core/strategies/oauth-auth-code-flow.js +82 -25
  70. package/dist/providers/core/strategies/oauth-auth-code-flow.js.map +1 -1
  71. package/dist/providers/core/utils/http-client.d.ts +5 -0
  72. package/dist/providers/core/utils/http-client.js +31 -4
  73. package/dist/providers/core/utils/http-client.js.map +1 -1
  74. package/dist/providers/core/utils/provider-error-reporter.js +8 -2
  75. package/dist/providers/core/utils/provider-error-reporter.js.map +1 -1
  76. package/dist/providers/core/utils/snapshot-writer.d.ts +1 -1
  77. package/dist/providers/core/utils/snapshot-writer.js +5 -1
  78. package/dist/providers/core/utils/snapshot-writer.js.map +1 -1
  79. package/dist/providers/profile/provider-profile-loader.js +8 -4
  80. package/dist/providers/profile/provider-profile-loader.js.map +1 -1
  81. package/dist/runtime/runtime-flags.d.ts +4 -0
  82. package/dist/runtime/runtime-flags.js +32 -0
  83. package/dist/runtime/runtime-flags.js.map +1 -0
  84. package/dist/server/handlers/handler-utils.js +29 -2
  85. package/dist/server/handlers/handler-utils.js.map +1 -1
  86. package/dist/server/handlers/messages-handler.js +27 -26
  87. package/dist/server/handlers/messages-handler.js.map +1 -1
  88. package/dist/server/handlers/responses-handler.js +35 -1
  89. package/dist/server/handlers/responses-handler.js.map +1 -1
  90. package/dist/server/handlers/sse-dispatcher.js +22 -2
  91. package/dist/server/handlers/sse-dispatcher.js.map +1 -1
  92. package/dist/server/runtime/http-server/index.d.ts +10 -0
  93. package/dist/server/runtime/http-server/index.js +551 -148
  94. package/dist/server/runtime/http-server/index.js.map +1 -1
  95. package/dist/server/runtime/http-server/request-executor.d.ts +14 -0
  96. package/dist/server/runtime/http-server/request-executor.js +638 -149
  97. package/dist/server/runtime/http-server/request-executor.js.map +1 -1
  98. package/dist/server/runtime/http-server/routes.d.ts +5 -0
  99. package/dist/server/runtime/http-server/routes.js +69 -0
  100. package/dist/server/runtime/http-server/routes.js.map +1 -1
  101. package/dist/server/runtime/http-server/runtime-manager.js +18 -0
  102. package/dist/server/runtime/http-server/runtime-manager.js.map +1 -1
  103. package/dist/server/utils/sse-request-parser.d.ts +1 -0
  104. package/dist/server/utils/sse-request-parser.js +17 -6
  105. package/dist/server/utils/sse-request-parser.js.map +1 -1
  106. package/dist/server/utils/utf8-chunk-buffer.d.ts +43 -0
  107. package/dist/server/utils/utf8-chunk-buffer.js +132 -0
  108. package/dist/server/utils/utf8-chunk-buffer.js.map +1 -0
  109. package/dist/server/utils/warmup-detector.d.ts +7 -0
  110. package/dist/server/utils/warmup-detector.js +125 -0
  111. package/dist/server/utils/warmup-detector.js.map +1 -0
  112. package/dist/server/utils/warmup-storm-tracker.d.ts +9 -0
  113. package/dist/server/utils/warmup-storm-tracker.js +61 -0
  114. package/dist/server/utils/warmup-storm-tracker.js.map +1 -0
  115. package/dist/token-daemon/index.d.ts +7 -0
  116. package/dist/token-daemon/index.js +242 -0
  117. package/dist/token-daemon/index.js.map +1 -0
  118. package/dist/token-daemon/server-utils.d.ts +33 -0
  119. package/dist/token-daemon/server-utils.js +155 -0
  120. package/dist/token-daemon/server-utils.js.map +1 -0
  121. package/dist/token-daemon/token-daemon.d.ts +20 -0
  122. package/dist/token-daemon/token-daemon.js +144 -0
  123. package/dist/token-daemon/token-daemon.js.map +1 -0
  124. package/dist/token-daemon/token-types.d.ts +44 -0
  125. package/dist/token-daemon/token-types.js +18 -0
  126. package/dist/token-daemon/token-types.js.map +1 -0
  127. package/dist/token-daemon/token-utils.d.ts +17 -0
  128. package/dist/token-daemon/token-utils.js +153 -0
  129. package/dist/token-daemon/token-utils.js.map +1 -0
  130. package/dist/tools/semantic-replay.js +7 -6
  131. package/dist/tools/semantic-replay.js.map +1 -1
  132. package/dist/utils/debug-utils.js +14 -0
  133. package/dist/utils/debug-utils.js.map +1 -1
  134. package/dist/utils/error-handler-registry.d.ts +36 -0
  135. package/dist/utils/error-handler-registry.js +99 -12
  136. package/dist/utils/error-handler-registry.js.map +1 -1
  137. package/dist/utils/error-handling-utils.js +4 -3
  138. package/dist/utils/error-handling-utils.js.map +1 -1
  139. package/dist/utils/log-helpers.d.ts +6 -0
  140. package/dist/utils/log-helpers.js +90 -0
  141. package/dist/utils/log-helpers.js.map +1 -0
  142. package/dist/utils/logger.d.ts +8 -0
  143. package/dist/utils/logger.js +55 -2
  144. package/dist/utils/logger.js.map +1 -1
  145. package/dist/utils/snapshot-writer.js +2 -6
  146. package/dist/utils/snapshot-writer.js.map +1 -1
  147. package/node_modules/@jsonstudio/llms/README.md +2 -0
  148. package/node_modules/@jsonstudio/llms/dist/conversion/codecs/gemini-openai-codec.js +152 -6
  149. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/auto-thinking.d.ts +6 -0
  150. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/auto-thinking.js +25 -0
  151. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/field-mapping.d.ts +14 -0
  152. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/field-mapping.js +155 -0
  153. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/gemini-web-search.d.ts +17 -0
  154. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/gemini-web-search.js +68 -0
  155. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-image-content.d.ts +2 -0
  156. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-image-content.js +83 -0
  157. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-tool-extraction.d.ts +2 -0
  158. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-tool-extraction.js +264 -0
  159. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-vision-prompt.d.ts +11 -0
  160. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-vision-prompt.js +177 -0
  161. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-web-search.d.ts +2 -0
  162. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/glm-web-search.js +63 -0
  163. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/qwen-transform.d.ts +3 -0
  164. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/qwen-transform.js +209 -0
  165. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/request-rules.d.ts +24 -0
  166. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/request-rules.js +63 -0
  167. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-blacklist.d.ts +14 -0
  168. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-blacklist.js +85 -0
  169. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-normalize.d.ts +5 -0
  170. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-normalize.js +121 -0
  171. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-validate.d.ts +5 -0
  172. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/response-validate.js +76 -0
  173. package/{dist/providers/compat/utils/snapshot-writer.d.ts → node_modules/@jsonstudio/llms/dist/conversion/compat/actions/snapshot.d.ts} +2 -2
  174. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/snapshot.js +21 -0
  175. package/node_modules/@jsonstudio/llms/dist/conversion/compat/actions/tool-schema.d.ts +6 -0
  176. package/{dist/providers/compat/glm/utils/tool-schema-helpers.js → node_modules/@jsonstudio/llms/dist/conversion/compat/actions/tool-schema.js} +6 -1
  177. package/{dist/providers/compat/filters → node_modules/@jsonstudio/llms/dist/conversion/compat/actions}/universal-shape-filter.d.ts +17 -22
  178. package/{dist/providers/compat/filters → node_modules/@jsonstudio/llms/dist/conversion/compat/actions}/universal-shape-filter.js +46 -99
  179. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-gemini.json +17 -0
  180. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-glm.json +196 -13
  181. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-iflow.json +194 -26
  182. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-lmstudio.json +43 -35
  183. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/chat-qwen.json +20 -16
  184. package/node_modules/@jsonstudio/llms/dist/conversion/compat/profiles/responses-c4m.json +42 -42
  185. package/node_modules/@jsonstudio/llms/dist/conversion/config/sample-config.json +1 -1
  186. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-engine.d.ts +7 -2
  187. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-engine.js +5 -665
  188. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-pipeline-executor.d.ts +9 -0
  189. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-pipeline-executor.js +869 -0
  190. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/compat/compat-types.d.ts +55 -0
  191. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline.d.ts +2 -0
  192. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/hub-pipeline.js +74 -5
  193. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/stages/req_outbound/req_outbound_stage3_compat/index.js +2 -2
  194. package/node_modules/@jsonstudio/llms/dist/conversion/hub/pipeline/target-utils.js +9 -0
  195. package/node_modules/@jsonstudio/llms/dist/conversion/hub/process/chat-process.js +213 -1
  196. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/provider-response.d.ts +34 -0
  197. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/provider-response.js +84 -24
  198. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/response-runtime.js +19 -2
  199. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/server-side-tools.d.ts +26 -0
  200. package/node_modules/@jsonstudio/llms/dist/conversion/hub/response/server-side-tools.js +383 -0
  201. package/node_modules/@jsonstudio/llms/dist/conversion/hub/semantic-mappers/gemini-mapper.js +241 -14
  202. package/node_modules/@jsonstudio/llms/dist/conversion/hub/semantic-mappers/responses-mapper.js +17 -1
  203. package/node_modules/@jsonstudio/llms/dist/conversion/hub/standardized-bridge.js +14 -0
  204. package/node_modules/@jsonstudio/llms/dist/conversion/hub/types/standardized.d.ts +1 -0
  205. package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-host-policy.d.ts +6 -0
  206. package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-host-policy.js +14 -0
  207. package/node_modules/@jsonstudio/llms/dist/conversion/responses/responses-openai-bridge.js +133 -5
  208. package/node_modules/@jsonstudio/llms/dist/conversion/shared/anthropic-message-utils.js +98 -3
  209. package/node_modules/@jsonstudio/llms/dist/conversion/shared/bridge-message-utils.js +137 -10
  210. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-output-builder.js +43 -2
  211. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-reasoning-registry.d.ts +4 -0
  212. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-reasoning-registry.js +62 -1
  213. package/node_modules/@jsonstudio/llms/dist/conversion/shared/responses-response-utils.js +23 -1
  214. package/node_modules/@jsonstudio/llms/dist/conversion/shared/snapshot-utils.js +17 -47
  215. package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-canonicalizer.d.ts +2 -0
  216. package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-filter-pipeline.js +12 -0
  217. package/node_modules/@jsonstudio/llms/dist/conversion/shared/tool-mapping.js +25 -2
  218. package/node_modules/@jsonstudio/llms/dist/index.d.ts +1 -0
  219. package/node_modules/@jsonstudio/llms/dist/index.js +1 -0
  220. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/bootstrap.js +540 -36
  221. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/classifier.js +12 -11
  222. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/context-advisor.d.ts +19 -0
  223. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/context-advisor.js +64 -0
  224. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine.d.ts +26 -0
  225. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/engine.js +450 -54
  226. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/features.js +23 -458
  227. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/health-manager.js +2 -7
  228. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/message-utils.d.ts +7 -0
  229. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/message-utils.js +78 -0
  230. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/provider-registry.js +7 -2
  231. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/token-counter.js +14 -3
  232. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/token-estimator.d.ts +2 -0
  233. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/token-estimator.js +16 -0
  234. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/token-file-scanner.d.ts +15 -0
  235. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/token-file-scanner.js +56 -0
  236. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/tool-signals.d.ts +13 -0
  237. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/tool-signals.js +403 -0
  238. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/types.d.ts +86 -2
  239. package/node_modules/@jsonstudio/llms/dist/router/virtual-router/types.js +3 -1
  240. package/node_modules/@jsonstudio/llms/dist/servertool/engine.d.ts +27 -0
  241. package/node_modules/@jsonstudio/llms/dist/servertool/engine.js +60 -0
  242. package/node_modules/@jsonstudio/llms/dist/servertool/flow-types.d.ts +40 -0
  243. package/node_modules/@jsonstudio/llms/dist/servertool/flow-types.js +1 -0
  244. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/vision.d.ts +1 -0
  245. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/vision.js +194 -0
  246. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/web-search.d.ts +1 -0
  247. package/node_modules/@jsonstudio/llms/dist/servertool/handlers/web-search.js +638 -0
  248. package/node_modules/@jsonstudio/llms/dist/servertool/orchestration-types.d.ts +33 -0
  249. package/node_modules/@jsonstudio/llms/dist/servertool/orchestration-types.js +1 -0
  250. package/node_modules/@jsonstudio/llms/dist/servertool/registry.d.ts +18 -0
  251. package/node_modules/@jsonstudio/llms/dist/servertool/registry.js +27 -0
  252. package/node_modules/@jsonstudio/llms/dist/servertool/server-side-tools.d.ts +8 -0
  253. package/node_modules/@jsonstudio/llms/dist/servertool/server-side-tools.js +208 -0
  254. package/node_modules/@jsonstudio/llms/dist/servertool/types.d.ts +88 -0
  255. package/node_modules/@jsonstudio/llms/dist/servertool/types.js +1 -0
  256. package/node_modules/@jsonstudio/llms/dist/servertool/vision-tool.d.ts +2 -0
  257. package/node_modules/@jsonstudio/llms/dist/servertool/vision-tool.js +185 -0
  258. package/node_modules/@jsonstudio/llms/dist/sse/json-to-sse/event-generators/responses.js +15 -3
  259. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/builders/response-builder.js +6 -3
  260. package/node_modules/@jsonstudio/llms/dist/sse/sse-to-json/gemini-sse-to-json-converter.js +27 -1
  261. package/node_modules/@jsonstudio/llms/dist/sse/types/gemini-types.d.ts +20 -1
  262. package/node_modules/@jsonstudio/llms/dist/sse/types/responses-types.js +1 -1
  263. package/node_modules/@jsonstudio/llms/dist/telemetry/stats-center.d.ts +73 -0
  264. package/node_modules/@jsonstudio/llms/dist/telemetry/stats-center.js +280 -0
  265. package/node_modules/@jsonstudio/llms/package.json +2 -2
  266. package/package.json +11 -10
  267. package/scripts/README.md +26 -12
  268. package/scripts/auth-antigravity-token.mjs +64 -0
  269. package/scripts/auth-gemini-cli-token.mjs +96 -0
  270. package/scripts/auth-iflow-manual.mjs +81 -0
  271. package/scripts/auth-iflow-token-direct.mjs +87 -0
  272. package/scripts/auth-iflow-token.mjs +77 -0
  273. package/scripts/copy-compat-assets.mjs +3 -15
  274. package/scripts/install-verify.mjs +1 -0
  275. package/scripts/pack-mode.mjs +2 -1
  276. package/scripts/publish-rcc.mjs +20 -4
  277. package/scripts/replay-codex-sample.mjs +13 -8
  278. package/scripts/tests/chat-pipeline-blackbox.mjs +1 -1
  279. package/scripts/tests/virtual-router-health.mjs +141 -6
  280. package/scripts/tools/capture-provider-goldens.mjs +8 -7
  281. package/scripts/verify-client-headers.mjs +224 -0
  282. package/dist/providers/compat/base-compatibility.d.ts +0 -27
  283. package/dist/providers/compat/base-compatibility.js +0 -143
  284. package/dist/providers/compat/base-compatibility.js.map +0 -1
  285. package/dist/providers/compat/compat-directory-loader.d.ts +0 -4
  286. package/dist/providers/compat/compat-directory-loader.js +0 -85
  287. package/dist/providers/compat/compat-directory-loader.js.map +0 -1
  288. package/dist/providers/compat/compatibility-adapter.d.ts +0 -18
  289. package/dist/providers/compat/compatibility-adapter.js +0 -104
  290. package/dist/providers/compat/compatibility-adapter.js.map +0 -1
  291. package/dist/providers/compat/compatibility-factory.d.ts +0 -57
  292. package/dist/providers/compat/compatibility-factory.js +0 -155
  293. package/dist/providers/compat/compatibility-factory.js.map +0 -1
  294. package/dist/providers/compat/compatibility-interface.d.ts +0 -35
  295. package/dist/providers/compat/compatibility-interface.js +0 -2
  296. package/dist/providers/compat/compatibility-interface.js.map +0 -1
  297. package/dist/providers/compat/compatibility-manager.d.ts +0 -85
  298. package/dist/providers/compat/compatibility-manager.js +0 -368
  299. package/dist/providers/compat/compatibility-manager.js.map +0 -1
  300. package/dist/providers/compat/config/config-compatibility.d.ts +0 -28
  301. package/dist/providers/compat/config/config-compatibility.js +0 -95
  302. package/dist/providers/compat/config/config-compatibility.js.map +0 -1
  303. package/dist/providers/compat/field-mapping.d.ts +0 -102
  304. package/dist/providers/compat/field-mapping.js +0 -447
  305. package/dist/providers/compat/field-mapping.js.map +0 -1
  306. package/dist/providers/compat/filters/blacklist-sanitizer.d.ts +0 -45
  307. package/dist/providers/compat/filters/blacklist-sanitizer.js +0 -133
  308. package/dist/providers/compat/filters/blacklist-sanitizer.js.map +0 -1
  309. package/dist/providers/compat/filters/response-blacklist-sanitizer.d.ts +0 -28
  310. package/dist/providers/compat/filters/response-blacklist-sanitizer.js +0 -138
  311. package/dist/providers/compat/filters/response-blacklist-sanitizer.js.map +0 -1
  312. package/dist/providers/compat/filters/universal-shape-filter.js.map +0 -1
  313. package/dist/providers/compat/glm/config/blacklist-rules.json +0 -22
  314. package/dist/providers/compat/glm/config/field-mappings.json +0 -92
  315. package/dist/providers/compat/glm/config/response-blacklist.json +0 -7
  316. package/dist/providers/compat/glm/config/shape-filters.json +0 -37
  317. package/dist/providers/compat/glm/field-mapping/field-mapping-processor.d.ts +0 -28
  318. package/dist/providers/compat/glm/field-mapping/field-mapping-processor.js +0 -306
  319. package/dist/providers/compat/glm/field-mapping/field-mapping-processor.js.map +0 -1
  320. package/dist/providers/compat/glm/functions/glm-processor.d.ts +0 -50
  321. package/dist/providers/compat/glm/functions/glm-processor.js +0 -134
  322. package/dist/providers/compat/glm/functions/glm-processor.js.map +0 -1
  323. package/dist/providers/compat/glm/glm-compatibility.d.ts +0 -34
  324. package/dist/providers/compat/glm/glm-compatibility.js +0 -117
  325. package/dist/providers/compat/glm/glm-compatibility.js.map +0 -1
  326. package/dist/providers/compat/glm/hooks/base-hook.d.ts +0 -21
  327. package/dist/providers/compat/glm/hooks/base-hook.js +0 -53
  328. package/dist/providers/compat/glm/hooks/base-hook.js.map +0 -1
  329. package/dist/providers/compat/glm/hooks/glm-request-validation-hook.d.ts +0 -24
  330. package/dist/providers/compat/glm/hooks/glm-request-validation-hook.js +0 -268
  331. package/dist/providers/compat/glm/hooks/glm-request-validation-hook.js.map +0 -1
  332. package/dist/providers/compat/glm/hooks/glm-response-normalization-hook.d.ts +0 -21
  333. package/dist/providers/compat/glm/hooks/glm-response-normalization-hook.js +0 -171
  334. package/dist/providers/compat/glm/hooks/glm-response-normalization-hook.js.map +0 -1
  335. package/dist/providers/compat/glm/hooks/glm-response-validation-hook.d.ts +0 -25
  336. package/dist/providers/compat/glm/hooks/glm-response-validation-hook.js +0 -236
  337. package/dist/providers/compat/glm/hooks/glm-response-validation-hook.js.map +0 -1
  338. package/dist/providers/compat/glm/hooks/glm-tool-cleaning-hook.d.ts +0 -26
  339. package/dist/providers/compat/glm/hooks/glm-tool-cleaning-hook.js +0 -186
  340. package/dist/providers/compat/glm/hooks/glm-tool-cleaning-hook.js.map +0 -1
  341. package/dist/providers/compat/glm/index.d.ts +0 -24
  342. package/dist/providers/compat/glm/index.js +0 -29
  343. package/dist/providers/compat/glm/index.js.map +0 -1
  344. package/dist/providers/compat/glm/utils/tool-schema-helpers.d.ts +0 -3
  345. package/dist/providers/compat/glm/utils/tool-schema-helpers.js.map +0 -1
  346. package/dist/providers/compat/iflow/config/field-mappings.json +0 -92
  347. package/dist/providers/compat/iflow/config/shape-filters.json +0 -37
  348. package/dist/providers/compat/iflow/field-mapping/iflow-field-mapping-processor.d.ts +0 -34
  349. package/dist/providers/compat/iflow/field-mapping/iflow-field-mapping-processor.js +0 -386
  350. package/dist/providers/compat/iflow/field-mapping/iflow-field-mapping-processor.js.map +0 -1
  351. package/dist/providers/compat/iflow/functions/iflow-processor.d.ts +0 -53
  352. package/dist/providers/compat/iflow/functions/iflow-processor.js +0 -215
  353. package/dist/providers/compat/iflow/functions/iflow-processor.js.map +0 -1
  354. package/dist/providers/compat/iflow/hooks/base-hook.d.ts +0 -23
  355. package/dist/providers/compat/iflow/hooks/base-hook.js +0 -59
  356. package/dist/providers/compat/iflow/hooks/base-hook.js.map +0 -1
  357. package/dist/providers/compat/iflow/hooks/iflow-request-validation-hook.d.ts +0 -23
  358. package/dist/providers/compat/iflow/hooks/iflow-request-validation-hook.js +0 -279
  359. package/dist/providers/compat/iflow/hooks/iflow-request-validation-hook.js.map +0 -1
  360. package/dist/providers/compat/iflow/hooks/iflow-response-normalization-hook.d.ts +0 -20
  361. package/dist/providers/compat/iflow/hooks/iflow-response-normalization-hook.js +0 -180
  362. package/dist/providers/compat/iflow/hooks/iflow-response-normalization-hook.js.map +0 -1
  363. package/dist/providers/compat/iflow/hooks/iflow-response-validation-hook.d.ts +0 -23
  364. package/dist/providers/compat/iflow/hooks/iflow-response-validation-hook.js +0 -232
  365. package/dist/providers/compat/iflow/hooks/iflow-response-validation-hook.js.map +0 -1
  366. package/dist/providers/compat/iflow/hooks/iflow-tool-cleaning-hook.d.ts +0 -25
  367. package/dist/providers/compat/iflow/hooks/iflow-tool-cleaning-hook.js +0 -216
  368. package/dist/providers/compat/iflow/hooks/iflow-tool-cleaning-hook.js.map +0 -1
  369. package/dist/providers/compat/iflow/iflow-compatibility.d.ts +0 -24
  370. package/dist/providers/compat/iflow/iflow-compatibility.js +0 -94
  371. package/dist/providers/compat/iflow/iflow-compatibility.js.map +0 -1
  372. package/dist/providers/compat/index.d.ts +0 -59
  373. package/dist/providers/compat/index.js +0 -83
  374. package/dist/providers/compat/index.js.map +0 -1
  375. package/dist/providers/compat/lmstudio-compatibility.d.ts +0 -44
  376. package/dist/providers/compat/lmstudio-compatibility.js +0 -193
  377. package/dist/providers/compat/lmstudio-compatibility.js.map +0 -1
  378. package/dist/providers/compat/passthrough-compatibility.d.ts +0 -29
  379. package/dist/providers/compat/passthrough-compatibility.js +0 -83
  380. package/dist/providers/compat/passthrough-compatibility.js.map +0 -1
  381. package/dist/providers/compat/profiles/chat/glm/index.d.ts +0 -6
  382. package/dist/providers/compat/profiles/chat/glm/index.js +0 -6
  383. package/dist/providers/compat/profiles/chat/glm/index.js.map +0 -1
  384. package/dist/providers/compat/profiles/chat/iflow/index.d.ts +0 -6
  385. package/dist/providers/compat/profiles/chat/iflow/index.js +0 -6
  386. package/dist/providers/compat/profiles/chat/iflow/index.js.map +0 -1
  387. package/dist/providers/compat/profiles/chat/lmstudio/index.d.ts +0 -6
  388. package/dist/providers/compat/profiles/chat/lmstudio/index.js +0 -6
  389. package/dist/providers/compat/profiles/chat/lmstudio/index.js.map +0 -1
  390. package/dist/providers/compat/profiles/chat/qwen/index.d.ts +0 -6
  391. package/dist/providers/compat/profiles/chat/qwen/index.js +0 -6
  392. package/dist/providers/compat/profiles/chat/qwen/index.js.map +0 -1
  393. package/dist/providers/compat/profiles/compat/passthrough/index.d.ts +0 -6
  394. package/dist/providers/compat/profiles/compat/passthrough/index.js +0 -6
  395. package/dist/providers/compat/profiles/compat/passthrough/index.js.map +0 -1
  396. package/dist/providers/compat/profiles/responses/c4m/index.d.ts +0 -6
  397. package/dist/providers/compat/profiles/responses/c4m/index.js +0 -6
  398. package/dist/providers/compat/profiles/responses/c4m/index.js.map +0 -1
  399. package/dist/providers/compat/profiles/responses/default/index.d.ts +0 -6
  400. package/dist/providers/compat/profiles/responses/default/index.js +0 -6
  401. package/dist/providers/compat/profiles/responses/default/index.js.map +0 -1
  402. package/dist/providers/compat/profiles/responses/fai/index.d.ts +0 -6
  403. package/dist/providers/compat/profiles/responses/fai/index.js +0 -6
  404. package/dist/providers/compat/profiles/responses/fai/index.js.map +0 -1
  405. package/dist/providers/compat/profiles/responses/fc/index.d.ts +0 -6
  406. package/dist/providers/compat/profiles/responses/fc/index.js +0 -6
  407. package/dist/providers/compat/profiles/responses/fc/index.js.map +0 -1
  408. package/dist/providers/compat/qwen/index.d.ts +0 -4
  409. package/dist/providers/compat/qwen/index.js +0 -6
  410. package/dist/providers/compat/qwen/index.js.map +0 -1
  411. package/dist/providers/compat/qwen-compatibility.d.ts +0 -52
  412. package/dist/providers/compat/qwen-compatibility.js +0 -330
  413. package/dist/providers/compat/qwen-compatibility.js.map +0 -1
  414. package/dist/providers/compat/register-compat-module.d.ts +0 -8
  415. package/dist/providers/compat/register-compat-module.js +0 -53
  416. package/dist/providers/compat/register-compat-module.js.map +0 -1
  417. package/dist/providers/compat/responses/c4m-responses-compatibility.d.ts +0 -27
  418. package/dist/providers/compat/responses/c4m-responses-compatibility.js +0 -197
  419. package/dist/providers/compat/responses/c4m-responses-compatibility.js.map +0 -1
  420. package/dist/providers/compat/standard-compatibility-utils.d.ts +0 -1
  421. package/dist/providers/compat/standard-compatibility-utils.js +0 -77
  422. package/dist/providers/compat/standard-compatibility-utils.js.map +0 -1
  423. package/dist/providers/compat/standard-compatibility.d.ts +0 -31
  424. package/dist/providers/compat/standard-compatibility.js +0 -118
  425. package/dist/providers/compat/standard-compatibility.js.map +0 -1
  426. package/dist/providers/compat/utils/snapshot-writer.js +0 -62
  427. package/dist/providers/compat/utils/snapshot-writer.js.map +0 -1
  428. package/dist/tools/replay-request.d.ts +0 -0
  429. package/dist/tools/replay-request.js +0 -2
  430. package/dist/tools/replay-request.js.map +0 -1
  431. package/scripts/check-glm-compat.mjs +0 -47
@@ -0,0 +1,869 @@
1
+ import { getCompatProfile } from './compat-profile-store.js';
2
+ import { UniversalShapeFilter } from '../../../compat/actions/universal-shape-filter.js';
3
+ import { ResponseBlacklistSanitizer } from '../../../compat/actions/response-blacklist.js';
4
+ import { applyFieldMappings } from '../../../compat/actions/field-mapping.js';
5
+ import { sanitizeToolSchema } from '../../../compat/actions/tool-schema.js';
6
+ import { applyRequestRules } from '../../../compat/actions/request-rules.js';
7
+ import { applyAutoThinking as runAutoThinking } from '../../../compat/actions/auto-thinking.js';
8
+ import { normalizeResponsePayload } from '../../../compat/actions/response-normalize.js';
9
+ import { validateResponsePayload } from '../../../compat/actions/response-validate.js';
10
+ import { writeCompatSnapshot } from '../../../compat/actions/snapshot.js';
11
+ import { applyQwenRequestTransform, applyQwenResponseTransform } from '../../../compat/actions/qwen-transform.js';
12
+ import { extractGlmToolMarkup } from '../../../compat/actions/glm-tool-extraction.js';
13
+ import { applyGlmWebSearchRequestTransform } from '../../../compat/actions/glm-web-search.js';
14
+ import { applyGeminiWebSearchCompat } from '../../../compat/actions/gemini-web-search.js';
15
+ import { applyGlmImageContentTransform } from '../../../compat/actions/glm-image-content.js';
16
+ import { applyGlmVisionPromptTransform } from '../../../compat/actions/glm-vision-prompt.js';
17
+ const RATE_LIMIT_ERROR = 'ERR_COMPAT_RATE_LIMIT_DETECTED';
18
+ const INTERNAL_STATE = Symbol('compat.internal_state');
19
+ export function runRequestCompatPipeline(profileId, payload, options) {
20
+ const profile = getCompatProfile(profileId);
21
+ if (!profile) {
22
+ return { payload };
23
+ }
24
+ const stage = pickStageConfig(profile, 'request');
25
+ if (!stage) {
26
+ return { payload };
27
+ }
28
+ const mutated = structuredClone(payload);
29
+ const state = initializeInternalState(mutated, 'request', options?.adapterContext);
30
+ if (Array.isArray(stage.mappings)) {
31
+ for (const mapping of stage.mappings) {
32
+ applyMapping(mutated, mapping, state);
33
+ }
34
+ }
35
+ return {
36
+ payload: mutated,
37
+ appliedProfile: profile.id
38
+ };
39
+ }
40
+ export function runResponseCompatPipeline(profileId, payload, options) {
41
+ const profile = getCompatProfile(profileId);
42
+ if (!profile) {
43
+ return { payload };
44
+ }
45
+ const stage = pickStageConfig(profile, 'response');
46
+ if (!stage) {
47
+ return { payload };
48
+ }
49
+ const mutated = structuredClone(payload);
50
+ const state = initializeInternalState(mutated, 'response', options?.adapterContext);
51
+ if (Array.isArray(stage.mappings)) {
52
+ for (const mapping of stage.mappings) {
53
+ applyMapping(mutated, mapping, state);
54
+ }
55
+ }
56
+ if (Array.isArray(stage.filters)) {
57
+ for (const filter of stage.filters) {
58
+ applyFilter(mutated, filter);
59
+ }
60
+ }
61
+ const requestIdFallback = state.originalRequestId || state.adapterContext?.requestId;
62
+ if (requestIdFallback && typeof mutated.request_id !== 'string') {
63
+ mutated.request_id = requestIdFallback;
64
+ }
65
+ return {
66
+ payload: mutated,
67
+ appliedProfile: profile.id
68
+ };
69
+ }
70
+ function pickStageConfig(profile, stage) {
71
+ if (!profile) {
72
+ return null;
73
+ }
74
+ if (stage === 'request' && profile.request) {
75
+ return profile.request;
76
+ }
77
+ if (stage === 'response' && profile.response) {
78
+ return profile.response;
79
+ }
80
+ if (profile.direction && profile.direction !== stage) {
81
+ return null;
82
+ }
83
+ if (profile.mappings || profile.filters) {
84
+ return {
85
+ mappings: profile.mappings,
86
+ filters: profile.filters
87
+ };
88
+ }
89
+ return null;
90
+ }
91
+ function applyMapping(root, mapping, state) {
92
+ switch (mapping.action) {
93
+ case 'remove':
94
+ removePath(root, mapping.path);
95
+ break;
96
+ case 'rename':
97
+ renamePath(root, mapping.from, mapping.to);
98
+ break;
99
+ case 'set':
100
+ setPath(root, mapping.path, mapping.value);
101
+ break;
102
+ case 'stringify':
103
+ stringifyPath(root, mapping.path, mapping.fallback);
104
+ break;
105
+ case 'parse_json':
106
+ parseJsonPath(root, mapping.path, mapping.fallback);
107
+ break;
108
+ case 'set_default':
109
+ setDefaultPath(root, mapping.path, mapping.value, mapping.valueSource);
110
+ break;
111
+ case 'normalize_tool_choice':
112
+ normalizeToolChoice(root, mapping);
113
+ break;
114
+ case 'inject_instruction':
115
+ injectInstruction(root, mapping);
116
+ break;
117
+ case 'convert_responses_output_to_choices':
118
+ convertResponsesOutputToChoices(root);
119
+ break;
120
+ case 'extract_glm_tool_markup':
121
+ extractGlmToolMarkup(root);
122
+ break;
123
+ case 'dto_unwrap':
124
+ dtoUnwrap(root, state);
125
+ break;
126
+ case 'dto_rewrap':
127
+ dtoRewrap(root, state);
128
+ break;
129
+ case 'shape_filter':
130
+ applyShapeFilterMapping(root, mapping, state);
131
+ break;
132
+ case 'field_map':
133
+ applyFieldMap(root, mapping, state);
134
+ break;
135
+ case 'tool_schema_sanitize':
136
+ applyToolSchemaSanitize(root, mapping);
137
+ break;
138
+ case 'apply_rules':
139
+ applyRules(root, mapping, state);
140
+ break;
141
+ case 'auto_thinking':
142
+ applyAutoThinkingAction(root, mapping, state);
143
+ break;
144
+ case 'snapshot':
145
+ triggerSnapshot(root, mapping, state);
146
+ break;
147
+ case 'resp_blacklist':
148
+ applyResponseBlacklist(root, mapping, state);
149
+ break;
150
+ case 'response_normalize':
151
+ applyResponseNormalize(root, mapping, state);
152
+ break;
153
+ case 'response_validate':
154
+ if (state.direction === 'response') {
155
+ validateResponsePayload(root, mapping.config);
156
+ }
157
+ break;
158
+ case 'qwen_request_transform':
159
+ replaceRoot(root, applyQwenRequestTransform(root));
160
+ break;
161
+ case 'qwen_response_transform':
162
+ replaceRoot(root, applyQwenResponseTransform(root));
163
+ break;
164
+ case 'glm_web_search_request':
165
+ if (state.direction === 'request') {
166
+ replaceRoot(root, applyGlmWebSearchRequestTransform(root));
167
+ }
168
+ break;
169
+ case 'gemini_web_search_request':
170
+ if (state.direction === 'request') {
171
+ replaceRoot(root, applyGeminiWebSearchCompat(root, state.adapterContext));
172
+ }
173
+ break;
174
+ case 'glm_image_content':
175
+ if (state.direction === 'request') {
176
+ replaceRoot(root, applyGlmImageContentTransform(root));
177
+ }
178
+ break;
179
+ case 'glm_vision_prompt':
180
+ if (state.direction === 'request') {
181
+ replaceRoot(root, applyGlmVisionPromptTransform(root));
182
+ }
183
+ break;
184
+ default:
185
+ break;
186
+ }
187
+ }
188
+ function applyFilter(payload, filter) {
189
+ if (filter.action === 'rate_limit_text') {
190
+ if (detectRateLimitText(payload, filter.needle)) {
191
+ const err = new Error('Provider returned rate limit notice');
192
+ err.code = RATE_LIMIT_ERROR;
193
+ err.statusCode = 429;
194
+ throw err;
195
+ }
196
+ }
197
+ }
198
+ function initializeInternalState(root, direction, adapterContext) {
199
+ const state = {
200
+ direction,
201
+ adapterContext,
202
+ originalRequestId: direction === 'response' ? extractRequestId(root) : undefined
203
+ };
204
+ Object.defineProperty(root, INTERNAL_STATE, {
205
+ value: state,
206
+ enumerable: false,
207
+ configurable: true
208
+ });
209
+ return state;
210
+ }
211
+ function replaceRoot(target, source) {
212
+ if (target === source) {
213
+ return;
214
+ }
215
+ for (const key of Object.keys(target)) {
216
+ delete target[key];
217
+ }
218
+ for (const [key, value] of Object.entries(source)) {
219
+ target[key] = value;
220
+ }
221
+ }
222
+ function dtoUnwrap(root, state) {
223
+ const original = structuredClone(root);
224
+ if (isRecord(original.data)) {
225
+ state.dtoEnvelope = { original, isDto: true };
226
+ replaceRoot(root, original.data);
227
+ }
228
+ else {
229
+ state.dtoEnvelope = { original, isDto: false };
230
+ }
231
+ }
232
+ function dtoRewrap(root, state) {
233
+ const envelope = state.dtoEnvelope;
234
+ if (!envelope) {
235
+ return;
236
+ }
237
+ if (!envelope.isDto) {
238
+ state.dtoEnvelope = undefined;
239
+ return;
240
+ }
241
+ const rebuilt = structuredClone(envelope.original);
242
+ rebuilt.data = structuredClone(root);
243
+ replaceRoot(root, rebuilt);
244
+ state.dtoEnvelope = undefined;
245
+ }
246
+ function applyShapeFilterMapping(root, mapping, state) {
247
+ const target = mapping.target ?? state.direction;
248
+ const filter = new UniversalShapeFilter(mapping.config);
249
+ const filtered = target === 'request'
250
+ ? filter.applyRequestFilter(root)
251
+ : filter.applyResponseFilter(root, state.adapterContext);
252
+ if (filtered === root) {
253
+ return;
254
+ }
255
+ replaceRoot(root, filtered);
256
+ }
257
+ function applyFieldMap(root, mapping, state) {
258
+ const direction = mapping.direction ?? state.direction;
259
+ const result = applyFieldMappings(root, mapping.config);
260
+ replaceRoot(root, result);
261
+ }
262
+ function applyToolSchemaSanitize(root, mapping) {
263
+ const sanitized = sanitizeToolSchema(root, mapping.mode ?? 'glm_shell');
264
+ replaceRoot(root, sanitized);
265
+ }
266
+ function applyRules(root, mapping, state) {
267
+ if (state.direction !== 'request') {
268
+ return;
269
+ }
270
+ const result = applyRequestRules(root, mapping.config);
271
+ replaceRoot(root, result);
272
+ }
273
+ function applyAutoThinkingAction(root, mapping, state) {
274
+ if (state.direction !== 'request') {
275
+ return;
276
+ }
277
+ runAutoThinking(root, mapping.config);
278
+ }
279
+ function triggerSnapshot(root, mapping, state) {
280
+ void writeCompatSnapshot({
281
+ phase: mapping.phase,
282
+ requestId: state.adapterContext?.requestId,
283
+ entryEndpoint: state.adapterContext?.entryEndpoint,
284
+ data: structuredClone(root)
285
+ });
286
+ }
287
+ function applyResponseBlacklist(root, mapping, state) {
288
+ if (state.direction !== 'response') {
289
+ return;
290
+ }
291
+ const sanitizer = new ResponseBlacklistSanitizer(mapping.config);
292
+ const result = sanitizer.apply(root);
293
+ replaceRoot(root, result);
294
+ }
295
+ function applyResponseNormalize(root, mapping, state) {
296
+ if (state.direction !== 'response') {
297
+ return;
298
+ }
299
+ const result = normalizeResponsePayload(root, mapping.config);
300
+ replaceRoot(root, result);
301
+ }
302
+ function detectRateLimitText(payload, needle) {
303
+ if (!needle || !payload) {
304
+ return false;
305
+ }
306
+ const normalizedNeedle = needle.toLowerCase();
307
+ const stack = [payload];
308
+ while (stack.length) {
309
+ const current = stack.pop();
310
+ if (typeof current === 'string') {
311
+ if (current.toLowerCase().includes(normalizedNeedle)) {
312
+ return true;
313
+ }
314
+ continue;
315
+ }
316
+ if (Array.isArray(current)) {
317
+ for (const entry of current) {
318
+ stack.push(entry);
319
+ }
320
+ continue;
321
+ }
322
+ if (isRecord(current)) {
323
+ for (const value of Object.values(current)) {
324
+ stack.push(value);
325
+ }
326
+ }
327
+ }
328
+ return false;
329
+ }
330
+ function parsePath(path) {
331
+ if (!path || typeof path !== 'string') {
332
+ return [];
333
+ }
334
+ return path
335
+ .split('.')
336
+ .map((segment) => segment.trim())
337
+ .filter(Boolean)
338
+ .map((segment) => {
339
+ if (segment.endsWith('[*]')) {
340
+ return {
341
+ key: segment.slice(0, -3),
342
+ wildcard: true
343
+ };
344
+ }
345
+ return {
346
+ key: segment,
347
+ wildcard: false
348
+ };
349
+ });
350
+ }
351
+ function removePath(root, path) {
352
+ const steps = parsePath(path);
353
+ if (!steps.length) {
354
+ return;
355
+ }
356
+ const parentSteps = steps.slice(0, -1);
357
+ const finalStep = steps[steps.length - 1];
358
+ const targets = resolveTargets(root, parentSteps);
359
+ for (const target of targets) {
360
+ if (isRecord(target) && finalStep && finalStep.key in target) {
361
+ delete target[finalStep.key];
362
+ }
363
+ }
364
+ }
365
+ function renamePath(root, fromPath, toPath) {
366
+ const value = getPathValue(root, fromPath);
367
+ if (value === undefined) {
368
+ return;
369
+ }
370
+ setPath(root, toPath, value);
371
+ removePath(root, fromPath);
372
+ }
373
+ function setPath(root, path, value) {
374
+ const steps = parsePath(path);
375
+ if (!steps.length) {
376
+ return;
377
+ }
378
+ let cursor = root;
379
+ for (let i = 0; i < steps.length; i++) {
380
+ const step = steps[i];
381
+ if (step.wildcard) {
382
+ throw new Error(`Cannot set wildcard path: ${path}`);
383
+ }
384
+ if (i === steps.length - 1) {
385
+ if (isRecord(cursor)) {
386
+ cursor[step.key] = structuredClone(value);
387
+ }
388
+ }
389
+ else {
390
+ if (!isRecord(cursor[step.key])) {
391
+ cursor[step.key] = {};
392
+ }
393
+ cursor = cursor[step.key];
394
+ }
395
+ }
396
+ }
397
+ function getPathValue(root, path) {
398
+ const steps = parsePath(path);
399
+ if (!steps.length) {
400
+ return undefined;
401
+ }
402
+ let cursor = root;
403
+ for (const step of steps) {
404
+ if (step.wildcard) {
405
+ if (!isRecord(cursor)) {
406
+ return undefined;
407
+ }
408
+ const arr = cursor[step.key];
409
+ if (!Array.isArray(arr) || !arr.length) {
410
+ return undefined;
411
+ }
412
+ cursor = arr[0];
413
+ continue;
414
+ }
415
+ if (!isRecord(cursor)) {
416
+ return undefined;
417
+ }
418
+ cursor = cursor[step.key];
419
+ if (cursor === undefined) {
420
+ return undefined;
421
+ }
422
+ }
423
+ return cursor;
424
+ }
425
+ function stringifyPath(root, path, fallback) {
426
+ const steps = parsePath(path);
427
+ if (!steps.length) {
428
+ return;
429
+ }
430
+ const parentSteps = steps.slice(0, -1);
431
+ const finalStep = steps[steps.length - 1];
432
+ const targets = resolveTargets(root, parentSteps);
433
+ for (const target of targets) {
434
+ if (!isRecord(target) || !finalStep) {
435
+ continue;
436
+ }
437
+ const current = target[finalStep.key];
438
+ if (typeof current === 'string') {
439
+ continue;
440
+ }
441
+ try {
442
+ if (current === undefined) {
443
+ target[finalStep.key] = JSON.stringify(fallback ?? {});
444
+ }
445
+ else {
446
+ target[finalStep.key] = JSON.stringify(current);
447
+ }
448
+ }
449
+ catch {
450
+ try {
451
+ target[finalStep.key] = JSON.stringify(fallback ?? {});
452
+ }
453
+ catch {
454
+ target[finalStep.key] = '{}';
455
+ }
456
+ }
457
+ }
458
+ }
459
+ function parseJsonPath(root, path, fallback) {
460
+ const steps = parsePath(path);
461
+ if (!steps.length) {
462
+ return;
463
+ }
464
+ const parentSteps = steps.slice(0, -1);
465
+ const finalStep = steps[steps.length - 1];
466
+ const targets = resolveTargets(root, parentSteps);
467
+ for (const target of targets) {
468
+ if (!isRecord(target) || !finalStep) {
469
+ continue;
470
+ }
471
+ const current = target[finalStep.key];
472
+ if (current === undefined || current === null) {
473
+ if (fallback !== undefined) {
474
+ target[finalStep.key] = structuredClone(fallback);
475
+ }
476
+ continue;
477
+ }
478
+ if (typeof current !== 'string') {
479
+ continue;
480
+ }
481
+ const trimmed = current.trim();
482
+ if (!trimmed) {
483
+ if (fallback !== undefined) {
484
+ target[finalStep.key] = structuredClone(fallback);
485
+ }
486
+ continue;
487
+ }
488
+ try {
489
+ target[finalStep.key] = JSON.parse(trimmed);
490
+ }
491
+ catch {
492
+ if (fallback !== undefined) {
493
+ target[finalStep.key] = structuredClone(fallback);
494
+ }
495
+ }
496
+ }
497
+ }
498
+ function setDefaultPath(root, path, value, source) {
499
+ const current = getPathValue(root, path);
500
+ if (current !== undefined) {
501
+ return;
502
+ }
503
+ let finalValue = value;
504
+ if (source === 'timestamp_seconds') {
505
+ finalValue = Math.floor(Date.now() / 1000);
506
+ }
507
+ else if (source === 'chat_completion_id') {
508
+ finalValue = `chatcmpl_${Date.now().toString(36)}_${Math.random().toString(36).slice(2)}`;
509
+ }
510
+ if (finalValue === undefined) {
511
+ return;
512
+ }
513
+ setPath(root, path, finalValue);
514
+ }
515
+ function normalizeToolChoice(root, mapping) {
516
+ const path = mapping.path || 'tool_choice';
517
+ const current = getPathValue(root, path);
518
+ if (!current || typeof current !== 'object' || Array.isArray(current)) {
519
+ return;
520
+ }
521
+ const replacement = mapping.objectReplacement ?? 'required';
522
+ setPath(root, path, replacement);
523
+ }
524
+ function injectInstruction(root, mapping) {
525
+ const raw = getPathValue(root, mapping.sourcePath);
526
+ removePath(root, mapping.sourcePath);
527
+ const value = typeof raw === 'string' ? raw.trim() : '';
528
+ if (!value) {
529
+ return;
530
+ }
531
+ let text = value;
532
+ if (mapping.stripHtml) {
533
+ text = stripHtml(text);
534
+ }
535
+ const maxLength = resolveMaxLength(mapping.maxLengthEnv);
536
+ if (maxLength && text.length > maxLength) {
537
+ text = text.slice(0, maxLength);
538
+ }
539
+ if (!text) {
540
+ return;
541
+ }
542
+ const targetPath = mapping.targetPath || 'input';
543
+ const targetArray = ensureArray(root, targetPath);
544
+ const message = {
545
+ type: 'message',
546
+ role: mapping.role || 'system',
547
+ content: [
548
+ {
549
+ type: mapping.contentType || 'input_text',
550
+ text
551
+ }
552
+ ]
553
+ };
554
+ targetArray.unshift(message);
555
+ }
556
+ function resolveTargets(root, steps) {
557
+ if (!steps.length) {
558
+ return [root];
559
+ }
560
+ const results = [];
561
+ const traverse = (node, index) => {
562
+ const step = steps[index];
563
+ if (!step || !isRecord(node)) {
564
+ return;
565
+ }
566
+ const next = node[step.key];
567
+ if (step.wildcard && Array.isArray(next)) {
568
+ if (index === steps.length - 1) {
569
+ for (const child of next) {
570
+ if (isRecord(child)) {
571
+ results.push(child);
572
+ }
573
+ }
574
+ }
575
+ else {
576
+ for (const child of next) {
577
+ traverse(child, index + 1);
578
+ }
579
+ }
580
+ return;
581
+ }
582
+ if (!step.wildcard && isRecord(next)) {
583
+ if (index === steps.length - 1) {
584
+ results.push(next);
585
+ }
586
+ else {
587
+ traverse(next, index + 1);
588
+ }
589
+ }
590
+ };
591
+ traverse(root, 0);
592
+ return results;
593
+ }
594
+ function isRecord(value) {
595
+ return typeof value === 'object' && value !== null;
596
+ }
597
+ function ensureArray(root, path) {
598
+ const steps = parsePath(path);
599
+ if (!steps.length) {
600
+ throw new Error(`Invalid array path: ${path}`);
601
+ }
602
+ let cursor = root;
603
+ for (let i = 0; i < steps.length; i++) {
604
+ const step = steps[i];
605
+ if (step.wildcard) {
606
+ throw new Error(`Array path does not support wildcards: ${path}`);
607
+ }
608
+ if (i === steps.length - 1) {
609
+ if (!Array.isArray(cursor[step.key])) {
610
+ cursor[step.key] = [];
611
+ }
612
+ if (!Array.isArray(cursor[step.key])) {
613
+ cursor[step.key] = [];
614
+ }
615
+ return cursor[step.key];
616
+ }
617
+ if (!isRecord(cursor[step.key])) {
618
+ cursor[step.key] = {};
619
+ }
620
+ cursor = cursor[step.key];
621
+ }
622
+ throw new Error(`Failed to resolve array path: ${path}`);
623
+ }
624
+ function stripHtml(value) {
625
+ return value.replace(/<\/?[^>]+(>|$)/g, '');
626
+ }
627
+ function resolveMaxLength(envVars) {
628
+ if (!envVars || !envVars.length) {
629
+ return undefined;
630
+ }
631
+ for (const envName of envVars) {
632
+ if (!envName)
633
+ continue;
634
+ const raw = process.env[envName];
635
+ if (!raw) {
636
+ continue;
637
+ }
638
+ const parsed = Number(raw);
639
+ if (Number.isFinite(parsed) && parsed > 0) {
640
+ return Math.floor(parsed);
641
+ }
642
+ }
643
+ return undefined;
644
+ }
645
+ function convertResponsesOutputToChoices(root) {
646
+ if (!isRecord(root)) {
647
+ return;
648
+ }
649
+ const existingChoices = root.choices;
650
+ if (Array.isArray(existingChoices) && existingChoices.length > 0) {
651
+ return;
652
+ }
653
+ const choicesFromOutput = buildChoicesFromResponsesOutput(root);
654
+ if (choicesFromOutput.length > 0) {
655
+ root.choices = choicesFromOutput;
656
+ return;
657
+ }
658
+ const fallbackText = extractOutputText(root);
659
+ if (typeof fallbackText === 'string') {
660
+ root.choices = [
661
+ {
662
+ index: 0,
663
+ finish_reason: normalizeFinishReason(typeof root.status === 'string' ? root.status : 'stop'),
664
+ message: {
665
+ role: 'assistant',
666
+ content: fallbackText
667
+ }
668
+ }
669
+ ];
670
+ }
671
+ }
672
+ function buildChoicesFromResponsesOutput(root) {
673
+ const outputEntries = Array.isArray(root.output) ? root.output : [];
674
+ const choices = [];
675
+ outputEntries.forEach((entry) => {
676
+ if (!isRecord(entry)) {
677
+ return;
678
+ }
679
+ if ('type' in entry && typeof entry.type === 'string' && entry.type !== 'message') {
680
+ return;
681
+ }
682
+ const choice = convertOutputEntryToChoice(entry, choices.length, root);
683
+ if (choice) {
684
+ choices.push(choice);
685
+ }
686
+ });
687
+ return choices;
688
+ }
689
+ function convertOutputEntryToChoice(entry, index, root) {
690
+ const message = buildMessageFromOutputEntry(entry, index);
691
+ if (!message) {
692
+ return null;
693
+ }
694
+ const finishReasonCandidate = (typeof entry.stop_reason === 'string' && entry.stop_reason) ||
695
+ (typeof entry.finish_reason === 'string' && entry.finish_reason) ||
696
+ (typeof entry.status === 'string' && entry.status) ||
697
+ (typeof root.status === 'string' && root.status) ||
698
+ 'stop';
699
+ return {
700
+ index,
701
+ finish_reason: normalizeFinishReason(finishReasonCandidate),
702
+ message
703
+ };
704
+ }
705
+ function buildMessageFromOutputEntry(entry, choiceIndex) {
706
+ const role = normalizeRole(typeof entry.role === 'string' ? entry.role : 'assistant');
707
+ const contentArray = Array.isArray(entry.content) ? entry.content : [];
708
+ const textSegments = [];
709
+ const toolCalls = [];
710
+ contentArray.forEach((part, partIndex) => {
711
+ if (!isRecord(part)) {
712
+ const fallback = coerceText(part);
713
+ if (fallback) {
714
+ textSegments.push(fallback);
715
+ }
716
+ return;
717
+ }
718
+ const type = typeof part.type === 'string'
719
+ ? part.type
720
+ : typeof part.content_type === 'string'
721
+ ? part.content_type
722
+ : '';
723
+ switch (type) {
724
+ case 'output_text': {
725
+ const txt = typeof part.text === 'string'
726
+ ? part.text
727
+ : coerceText(part.text);
728
+ if (txt) {
729
+ textSegments.push(txt);
730
+ }
731
+ break;
732
+ }
733
+ case 'tool_call': {
734
+ const normalized = normalizeToolCall(part, choiceIndex, toolCalls.length);
735
+ if (normalized) {
736
+ toolCalls.push(normalized);
737
+ }
738
+ break;
739
+ }
740
+ case 'input_text':
741
+ case 'reasoning_content': {
742
+ const txt = typeof part.text === 'string'
743
+ ? part.text
744
+ : coerceText(part.text);
745
+ if (txt) {
746
+ textSegments.push(txt);
747
+ }
748
+ break;
749
+ }
750
+ default: {
751
+ const fallback = coerceText(part);
752
+ if (fallback) {
753
+ textSegments.push(fallback);
754
+ }
755
+ break;
756
+ }
757
+ }
758
+ });
759
+ const message = {
760
+ role,
761
+ content: textSegments.join('')
762
+ };
763
+ if (toolCalls.length) {
764
+ message.tool_calls = toolCalls;
765
+ if (typeof message.content !== 'string') {
766
+ message.content = '';
767
+ }
768
+ }
769
+ return message;
770
+ }
771
+ function normalizeToolCall(part, choiceIndex, callIndex) {
772
+ const payload = isRecord(part.tool_call) ? part.tool_call : part;
773
+ const fnPayload = isRecord(payload.function)
774
+ ? payload.function
775
+ : isRecord(part.function)
776
+ ? part.function
777
+ : null;
778
+ const name = typeof fnPayload?.name === 'string' ? fnPayload.name : undefined;
779
+ if (!name) {
780
+ return null;
781
+ }
782
+ const rawArgs = fnPayload?.arguments;
783
+ let argString;
784
+ if (typeof rawArgs === 'string') {
785
+ argString = rawArgs;
786
+ }
787
+ else {
788
+ try {
789
+ argString = JSON.stringify(rawArgs ?? {});
790
+ }
791
+ catch {
792
+ argString = '{}';
793
+ }
794
+ }
795
+ const idCandidate = (typeof payload.id === 'string' && payload.id) ||
796
+ (typeof payload.tool_call_id === 'string'
797
+ ? payload.tool_call_id
798
+ : undefined) ||
799
+ (typeof payload.call_id === 'string'
800
+ ? payload.call_id
801
+ : undefined);
802
+ return {
803
+ id: idCandidate || `call_${choiceIndex}_${callIndex}`,
804
+ type: 'function',
805
+ function: {
806
+ name,
807
+ arguments: argString
808
+ }
809
+ };
810
+ }
811
+ function extractOutputText(root) {
812
+ const textCandidate = root.output_text;
813
+ if (typeof textCandidate === 'string' && textCandidate.length > 0) {
814
+ return textCandidate;
815
+ }
816
+ return undefined;
817
+ }
818
+ function normalizeRole(role) {
819
+ const normalized = role.toLowerCase();
820
+ if (normalized === 'assistant' || normalized === 'system' || normalized === 'user' || normalized === 'tool') {
821
+ return normalized;
822
+ }
823
+ return 'assistant';
824
+ }
825
+ function coerceText(value) {
826
+ if (typeof value === 'string') {
827
+ return value;
828
+ }
829
+ if (typeof value === 'number' || typeof value === 'boolean') {
830
+ return String(value);
831
+ }
832
+ if (Array.isArray(value)) {
833
+ return value.map((entry) => coerceText(entry)).join('');
834
+ }
835
+ if (isRecord(value)) {
836
+ try {
837
+ return JSON.stringify(value);
838
+ }
839
+ catch {
840
+ return '';
841
+ }
842
+ }
843
+ return '';
844
+ }
845
+ function normalizeFinishReason(reason) {
846
+ const normalized = reason.toLowerCase();
847
+ if (normalized.includes('tool')) {
848
+ return 'tool_calls';
849
+ }
850
+ if (normalized.includes('length') || normalized.includes('max_token') || normalized.includes('in_progress')) {
851
+ return 'length';
852
+ }
853
+ if (normalized.includes('filter')) {
854
+ return 'content_filter';
855
+ }
856
+ return 'stop';
857
+ }
858
+ function extractRequestId(node) {
859
+ if (typeof node.request_id === 'string') {
860
+ return node.request_id;
861
+ }
862
+ const dataNode = isRecord(node.data)
863
+ ? node.data
864
+ : undefined;
865
+ if (dataNode && typeof dataNode.request_id === 'string') {
866
+ return dataNode.request_id;
867
+ }
868
+ return undefined;
869
+ }