@jsonstudio/rcc 0.89.1205 → 0.89.1457

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 (391) hide show
  1. package/README.md +53 -1412
  2. package/configsamples/config.json +426 -0
  3. package/configsamples/config.reference.json +58 -0
  4. package/configsamples/provider/crs/config.v1.json +46 -0
  5. package/configsamples/provider/glm/config.v1.json +81 -0
  6. package/configsamples/provider/glm-anthropic/config.v1.json +45 -0
  7. package/configsamples/provider/iflow/config.v1.json +74 -0
  8. package/configsamples/provider/kimi/config.v1.json +41 -0
  9. package/configsamples/provider/lmstudio/config.v1.json +101 -0
  10. package/configsamples/provider/mimo/config.v1.json +35 -0
  11. package/configsamples/provider/modelscope/config.v1.json +96 -0
  12. package/configsamples/provider/qwen/config.v1.json +38 -0
  13. package/configsamples/provider/tab/config.v1.json +50 -0
  14. package/configsamples/provider/tabglm/config.v1.json +49 -0
  15. package/dist/build-info.js +2 -2
  16. package/dist/cli/commands/code.js +12 -6
  17. package/dist/cli/commands/code.js.map +1 -1
  18. package/dist/cli/commands/config.d.ts +2 -1
  19. package/dist/cli/commands/config.js +77 -103
  20. package/dist/cli/commands/config.js.map +1 -1
  21. package/dist/cli/commands/examples.js +6 -6
  22. package/dist/cli/commands/examples.js.map +1 -1
  23. package/dist/cli/commands/init.d.ts +28 -0
  24. package/dist/cli/commands/init.js +94 -0
  25. package/dist/cli/commands/init.js.map +1 -0
  26. package/dist/cli/commands/port.js +10 -2
  27. package/dist/cli/commands/port.js.map +1 -1
  28. package/dist/cli/commands/restart.js +5 -2
  29. package/dist/cli/commands/restart.js.map +1 -1
  30. package/dist/cli/commands/start.js +25 -22
  31. package/dist/cli/commands/start.js.map +1 -1
  32. package/dist/cli/commands/status.js +1 -0
  33. package/dist/cli/commands/status.js.map +1 -1
  34. package/dist/cli/commands/stop.js +1 -0
  35. package/dist/cli/commands/stop.js.map +1 -1
  36. package/dist/cli/config/bundled-docs.d.ts +20 -0
  37. package/dist/cli/config/bundled-docs.js +91 -0
  38. package/dist/cli/config/bundled-docs.js.map +1 -0
  39. package/dist/cli/config/init-config.d.ts +37 -0
  40. package/dist/cli/config/init-config.js +212 -0
  41. package/dist/cli/config/init-config.js.map +1 -0
  42. package/dist/cli/config/init-provider-catalog.d.ts +8 -0
  43. package/dist/cli/config/init-provider-catalog.js +187 -0
  44. package/dist/cli/config/init-provider-catalog.js.map +1 -0
  45. package/dist/cli/register/init-command.d.ts +3 -0
  46. package/dist/cli/register/init-command.js +5 -0
  47. package/dist/cli/register/init-command.js.map +1 -0
  48. package/dist/cli.js +28 -3
  49. package/dist/cli.js.map +1 -1
  50. package/dist/client/gemini/gemini-protocol-client.js +2 -1
  51. package/dist/client/gemini/gemini-protocol-client.js.map +1 -1
  52. package/dist/client/gemini-cli/gemini-cli-protocol-client.js +40 -16
  53. package/dist/client/gemini-cli/gemini-cli-protocol-client.js.map +1 -1
  54. package/dist/client/openai/chat-protocol-client.js +2 -1
  55. package/dist/client/openai/chat-protocol-client.js.map +1 -1
  56. package/dist/client/responses/responses-protocol-client.js +2 -1
  57. package/dist/client/responses/responses-protocol-client.js.map +1 -1
  58. package/dist/config/risk-control-config.d.ts +94 -0
  59. package/dist/config/risk-control-config.js +196 -0
  60. package/dist/config/risk-control-config.js.map +1 -0
  61. package/dist/constants/index.d.ts +6 -0
  62. package/dist/constants/index.js +13 -0
  63. package/dist/constants/index.js.map +1 -1
  64. package/dist/docs/daemon-admin-ui.html +2113 -190
  65. package/dist/error-handling/quiet-error-handling-center.js +46 -8
  66. package/dist/error-handling/quiet-error-handling-center.js.map +1 -1
  67. package/dist/index.js +0 -1
  68. package/dist/index.js.map +1 -1
  69. package/dist/manager/modules/health/index.d.ts +1 -1
  70. package/dist/manager/modules/quota/antigravity-quota-manager.d.ts +70 -0
  71. package/dist/manager/modules/quota/antigravity-quota-manager.js +442 -0
  72. package/dist/manager/modules/quota/antigravity-quota-manager.js.map +1 -0
  73. package/dist/manager/modules/quota/index.d.ts +3 -127
  74. package/dist/manager/modules/quota/index.js +2 -1093
  75. package/dist/manager/modules/quota/index.js.map +1 -1
  76. package/dist/manager/modules/quota/provider-key-normalization.d.ts +3 -0
  77. package/dist/manager/modules/quota/provider-key-normalization.js +155 -0
  78. package/dist/manager/modules/quota/provider-key-normalization.js.map +1 -0
  79. package/dist/manager/modules/quota/provider-quota-daemon.cooldown.d.ts +9 -0
  80. package/dist/manager/modules/quota/provider-quota-daemon.cooldown.js +115 -0
  81. package/dist/manager/modules/quota/provider-quota-daemon.cooldown.js.map +1 -0
  82. package/dist/manager/modules/quota/provider-quota-daemon.d.ts +77 -0
  83. package/dist/manager/modules/quota/provider-quota-daemon.events.d.ts +12 -0
  84. package/dist/manager/modules/quota/provider-quota-daemon.events.js +239 -0
  85. package/dist/manager/modules/quota/provider-quota-daemon.events.js.map +1 -0
  86. package/dist/manager/modules/quota/provider-quota-daemon.js +404 -0
  87. package/dist/manager/modules/quota/provider-quota-daemon.js.map +1 -0
  88. package/dist/manager/modules/quota/provider-quota-daemon.model-backoff.d.ts +11 -0
  89. package/dist/manager/modules/quota/provider-quota-daemon.model-backoff.js +192 -0
  90. package/dist/manager/modules/quota/provider-quota-daemon.model-backoff.js.map +1 -0
  91. package/dist/manager/modules/quota/provider-quota-daemon.snapshot.d.ts +8 -0
  92. package/dist/manager/modules/quota/provider-quota-daemon.snapshot.js +96 -0
  93. package/dist/manager/modules/quota/provider-quota-daemon.snapshot.js.map +1 -0
  94. package/dist/manager/modules/quota/provider-quota-daemon.view.d.ts +19 -0
  95. package/dist/manager/modules/quota/provider-quota-daemon.view.js +37 -0
  96. package/dist/manager/modules/quota/provider-quota-daemon.view.js.map +1 -0
  97. package/dist/manager/modules/routing/index.d.ts +1 -0
  98. package/dist/manager/modules/routing/index.js +11 -25
  99. package/dist/manager/modules/routing/index.js.map +1 -1
  100. package/dist/manager/quota/provider-quota-center.d.ts +2 -0
  101. package/dist/manager/quota/provider-quota-center.js +80 -82
  102. package/dist/manager/quota/provider-quota-center.js.map +1 -1
  103. package/dist/modules/llmswitch/bridge.d.ts +16 -18
  104. package/dist/modules/llmswitch/bridge.js +293 -94
  105. package/dist/modules/llmswitch/bridge.js.map +1 -1
  106. package/dist/modules/llmswitch/core-loader.d.ts +4 -2
  107. package/dist/modules/llmswitch/core-loader.js +32 -20
  108. package/dist/modules/llmswitch/core-loader.js.map +1 -1
  109. package/dist/modules/pipeline/utils/colored-logger.js +3 -2
  110. package/dist/modules/pipeline/utils/colored-logger.js.map +1 -1
  111. package/dist/modules/pipeline/utils/debug-logger.js +1 -1
  112. package/dist/modules/pipeline/utils/debug-logger.js.map +1 -1
  113. package/dist/providers/auth/antigravity-userinfo-helper.d.ts +2 -1
  114. package/dist/providers/auth/antigravity-userinfo-helper.js +25 -4
  115. package/dist/providers/auth/antigravity-userinfo-helper.js.map +1 -1
  116. package/dist/providers/auth/iflow-cookie-auth.js +0 -2
  117. package/dist/providers/auth/iflow-cookie-auth.js.map +1 -1
  118. package/dist/providers/auth/oauth-lifecycle.js +2 -23
  119. package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
  120. package/dist/providers/auth/tokenfile-auth.d.ts +2 -0
  121. package/dist/providers/auth/tokenfile-auth.js +33 -1
  122. package/dist/providers/auth/tokenfile-auth.js.map +1 -1
  123. package/dist/providers/core/config/camoufox-launcher.d.ts +5 -0
  124. package/dist/providers/core/config/camoufox-launcher.js +40 -4
  125. package/dist/providers/core/config/camoufox-launcher.js.map +1 -1
  126. package/dist/providers/core/config/service-profiles.js +7 -18
  127. package/dist/providers/core/config/service-profiles.js.map +1 -1
  128. package/dist/providers/core/runtime/antigravity-quota-client.js +6 -3
  129. package/dist/providers/core/runtime/antigravity-quota-client.js.map +1 -1
  130. package/dist/providers/core/runtime/base-provider.d.ts +2 -7
  131. package/dist/providers/core/runtime/base-provider.js +84 -165
  132. package/dist/providers/core/runtime/base-provider.js.map +1 -1
  133. package/dist/providers/core/runtime/gemini-cli-http-provider.d.ts +7 -0
  134. package/dist/providers/core/runtime/gemini-cli-http-provider.js +368 -97
  135. package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
  136. package/dist/providers/core/runtime/http-request-executor.d.ts +3 -0
  137. package/dist/providers/core/runtime/http-request-executor.js +110 -38
  138. package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
  139. package/dist/providers/core/runtime/http-transport-provider.d.ts +17 -0
  140. package/dist/providers/core/runtime/http-transport-provider.js +165 -16
  141. package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
  142. package/dist/providers/core/runtime/provider-error-classifier.js +10 -0
  143. package/dist/providers/core/runtime/provider-error-classifier.js.map +1 -1
  144. package/dist/providers/core/runtime/provider-factory.js +7 -5
  145. package/dist/providers/core/runtime/provider-factory.js.map +1 -1
  146. package/dist/providers/core/runtime/provider-runtime-metadata.d.ts +6 -0
  147. package/dist/providers/core/runtime/provider-runtime-metadata.js.map +1 -1
  148. package/dist/providers/core/runtime/rate-limit-manager.d.ts +1 -12
  149. package/dist/providers/core/runtime/rate-limit-manager.js +4 -77
  150. package/dist/providers/core/runtime/rate-limit-manager.js.map +1 -1
  151. package/dist/providers/core/runtime/responses-provider.d.ts +1 -7
  152. package/dist/providers/core/runtime/responses-provider.js +12 -93
  153. package/dist/providers/core/runtime/responses-provider.js.map +1 -1
  154. package/dist/providers/core/strategies/oauth-auth-code-flow.js +12 -8
  155. package/dist/providers/core/strategies/oauth-auth-code-flow.js.map +1 -1
  156. package/dist/providers/core/utils/http-client.js +36 -46
  157. package/dist/providers/core/utils/http-client.js.map +1 -1
  158. package/dist/providers/core/utils/provider-error-logger.d.ts +1 -1
  159. package/dist/providers/core/utils/provider-error-reporter.d.ts +3 -1
  160. package/dist/providers/core/utils/provider-error-reporter.js +3 -0
  161. package/dist/providers/core/utils/provider-error-reporter.js.map +1 -1
  162. package/dist/providers/core/utils/snapshot-writer.js +1 -4
  163. package/dist/providers/core/utils/snapshot-writer.js.map +1 -1
  164. package/dist/providers/mock/mock-provider-runtime.js +57 -27
  165. package/dist/providers/mock/mock-provider-runtime.js.map +1 -1
  166. package/dist/scripts/camoufox/launch-auth.mjs +193 -58
  167. package/dist/server/handlers/handler-utils.js +8 -3
  168. package/dist/server/handlers/handler-utils.js.map +1 -1
  169. package/dist/server/handlers/responses-handler.js +1 -1
  170. package/dist/server/handlers/responses-handler.js.map +1 -1
  171. package/dist/server/runtime/http-server/daemon-admin/auth-handler.d.ts +2 -0
  172. package/dist/server/runtime/http-server/daemon-admin/auth-handler.js +103 -0
  173. package/dist/server/runtime/http-server/daemon-admin/auth-handler.js.map +1 -0
  174. package/dist/server/runtime/http-server/daemon-admin/auth-session.d.ts +5 -0
  175. package/dist/server/runtime/http-server/daemon-admin/auth-session.js +77 -0
  176. package/dist/server/runtime/http-server/daemon-admin/auth-session.js.map +1 -0
  177. package/dist/server/runtime/http-server/daemon-admin/auth-store.d.ts +18 -0
  178. package/dist/server/runtime/http-server/daemon-admin/auth-store.js +89 -0
  179. package/dist/server/runtime/http-server/daemon-admin/auth-store.js.map +1 -0
  180. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js +1 -2
  181. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js.map +1 -1
  182. package/dist/server/runtime/http-server/daemon-admin/providers-handler.js +226 -24
  183. package/dist/server/runtime/http-server/daemon-admin/providers-handler.js.map +1 -1
  184. package/dist/server/runtime/http-server/daemon-admin/quota-handler.js +47 -8
  185. package/dist/server/runtime/http-server/daemon-admin/quota-handler.js.map +1 -1
  186. package/dist/server/runtime/http-server/daemon-admin/restart-handler.js +1 -1
  187. package/dist/server/runtime/http-server/daemon-admin/restart-handler.js.map +1 -1
  188. package/dist/server/runtime/http-server/daemon-admin/stats-handler.js +1 -1
  189. package/dist/server/runtime/http-server/daemon-admin/stats-handler.js.map +1 -1
  190. package/dist/server/runtime/http-server/daemon-admin/status-handler.js +68 -4
  191. package/dist/server/runtime/http-server/daemon-admin/status-handler.js.map +1 -1
  192. package/dist/server/runtime/http-server/daemon-admin-routes.d.ts +3 -4
  193. package/dist/server/runtime/http-server/daemon-admin-routes.js +9 -14
  194. package/dist/server/runtime/http-server/daemon-admin-routes.js.map +1 -1
  195. package/dist/server/runtime/http-server/executor-metadata.js +1 -1
  196. package/dist/server/runtime/http-server/executor-metadata.js.map +1 -1
  197. package/dist/server/runtime/http-server/executor-response.js +0 -16
  198. package/dist/server/runtime/http-server/executor-response.js.map +1 -1
  199. package/dist/server/runtime/http-server/hub-shadow-compare.js +110 -34
  200. package/dist/server/runtime/http-server/hub-shadow-compare.js.map +1 -1
  201. package/dist/server/runtime/http-server/index.d.ts +5 -3
  202. package/dist/server/runtime/http-server/index.js +281 -136
  203. package/dist/server/runtime/http-server/index.js.map +1 -1
  204. package/dist/server/runtime/http-server/middleware.js +19 -1
  205. package/dist/server/runtime/http-server/middleware.js.map +1 -1
  206. package/dist/server/runtime/http-server/request-executor.js +59 -24
  207. package/dist/server/runtime/http-server/request-executor.js.map +1 -1
  208. package/dist/server/runtime/http-server/routes.js +12 -3
  209. package/dist/server/runtime/http-server/routes.js.map +1 -1
  210. package/dist/server/runtime/http-server/session-dir.d.ts +2 -0
  211. package/dist/server/runtime/http-server/session-dir.js +59 -0
  212. package/dist/server/runtime/http-server/session-dir.js.map +1 -0
  213. package/dist/server/runtime/http-server/types.d.ts +0 -4
  214. package/dist/server/utils/utf8-chunk-buffer.js +6 -3
  215. package/dist/server/utils/utf8-chunk-buffer.js.map +1 -1
  216. package/dist/server/utils/warmup-storm-tracker.js +1 -1
  217. package/dist/server/utils/warmup-storm-tracker.js.map +1 -1
  218. package/dist/server-factory.d.ts +6 -28
  219. package/dist/server-factory.js +8 -93
  220. package/dist/server-factory.js.map +1 -1
  221. package/dist/token-daemon/index.js +2 -2
  222. package/dist/token-daemon/index.js.map +1 -1
  223. package/dist/token-daemon/provider-registry.js +0 -1
  224. package/dist/token-daemon/provider-registry.js.map +1 -1
  225. package/dist/token-daemon/server-utils.js +8 -9
  226. package/dist/token-daemon/server-utils.js.map +1 -1
  227. package/dist/token-daemon/token-utils.js +1 -1
  228. package/dist/token-daemon/token-utils.js.map +1 -1
  229. package/dist/tools/semantic-replay.js +2 -2
  230. package/dist/tools/semantic-replay.js.map +1 -1
  231. package/dist/tools/stats-request-events.d.ts +1 -1
  232. package/dist/tools/stats-usage.js +6 -3
  233. package/dist/tools/stats-usage.js.map +1 -1
  234. package/dist/utils/llms-engine-shadow.d.ts +19 -0
  235. package/dist/utils/llms-engine-shadow.js +209 -0
  236. package/dist/utils/llms-engine-shadow.js.map +1 -0
  237. package/dist/utils/runtime-versions.js +2 -1
  238. package/dist/utils/runtime-versions.js.map +1 -1
  239. package/dist/utils/strip-internal-keys.d.ts +12 -0
  240. package/dist/utils/strip-internal-keys.js +28 -0
  241. package/dist/utils/strip-internal-keys.js.map +1 -0
  242. package/docs/ARCHITECTURE.md +402 -0
  243. package/docs/CHAT_PROCESS_PROTOCOL_AND_PIPELINE.md +221 -0
  244. package/docs/CODEX_AND_CLAUDE_CODE.md +69 -0
  245. package/docs/CONFIG_ARCHITECTURE.md +517 -0
  246. package/docs/ERROR_HANDLING_AUDIT.md +0 -0
  247. package/docs/GCLI2API_PARITY_GAPS.md +98 -0
  248. package/docs/INSTALLATION_AND_QUICKSTART.md +74 -0
  249. package/docs/INSTRUCTION_MARKUP.md +89 -0
  250. package/docs/MODULE_ENHANCEMENT_SYSTEM.md +666 -0
  251. package/docs/PORTS.md +36 -0
  252. package/docs/PROVIDERS_BUILTIN.md +111 -0
  253. package/docs/PROVIDER_TYPES.md +55 -0
  254. package/docs/SERVERTOOL_CLOCK_DESIGN.md +233 -0
  255. package/docs/USAGE_HANDLING_ANALYSIS.md +335 -0
  256. package/docs/USER_CONFIG_PARSER_CHANGES.md +175 -0
  257. package/docs/V3_INBOUND_OUTBOUND_DESIGN.md +86 -0
  258. package/docs/VIRTUAL_ROUTER_PRIORITY_AND_HEALTH.md +125 -0
  259. package/docs/anthropic-request-golden-samples.md +50 -0
  260. package/docs/antigravity-gemini-format-cleanup.md +102 -0
  261. package/docs/antigravity-routing-contract.md +31 -0
  262. package/docs/ccr-alignment-enhancetool.md +105 -0
  263. package/docs/chat-glm-500-analysis.md +79 -0
  264. package/docs/chat-request-golden-samples.md +42 -0
  265. package/docs/chat-semantic-expansion-plan.md +84 -0
  266. package/docs/cli-command-inventory.md +76 -0
  267. package/docs/codex-samples-replay.md +50 -0
  268. package/docs/daemon-admin-api-design.md +350 -0
  269. package/docs/daemon-admin-module-structure.md +169 -0
  270. package/docs/daemon-admin-ui.html +3394 -0
  271. package/docs/debug-system-design.md +734 -0
  272. package/docs/debugging/gemini-sse-root-cause.md +52 -0
  273. package/docs/debugging/sse_encoding_failure_analysis.md +53 -0
  274. package/docs/dry-run/README.md +721 -0
  275. package/docs/error-handling-v2.md +92 -0
  276. package/docs/exec-command-guard-policy.example.v1.json +42 -0
  277. package/docs/fixes/gemini-protocol-mapping.md +57 -0
  278. package/docs/fixes/oauth-portal-timing-fix.md +202 -0
  279. package/docs/fixes/web-search-hop3-fix.md +265 -0
  280. package/docs/glm-api-reference.md +390 -0
  281. package/docs/glm-chat-completions.md +1779 -0
  282. package/docs/glm-history-inline-images.md +44 -0
  283. package/docs/golden-ci-library.md +66 -0
  284. package/docs/lmstudio-dry-run-summary.md +203 -0
  285. package/docs/lmstudio-tool-calling.md +214 -0
  286. package/docs/mapping-tables/anthropic-to-openai.json +290 -0
  287. package/docs/mapping-tables/iflow-to-openai.json +215 -0
  288. package/docs/mapping-tables/openai-passthrough.json +190 -0
  289. package/docs/mapping-tables/openai-to-iflow.json +227 -0
  290. package/docs/monitoring/Design.md +61 -0
  291. package/docs/multi-token-auth-guide.md +66 -0
  292. package/docs/oauth-authentication-guide.md +168 -0
  293. package/docs/oauth-iflow-implementation.md +153 -0
  294. package/docs/pipeline-routing-report.md +209 -0
  295. package/docs/plans/manager-daemon/PLAN.md +86 -0
  296. package/docs/plans/provider-config-v2-plan.md +176 -0
  297. package/docs/plans/provider-runtime-manager-plan.md +209 -0
  298. package/docs/plans/transparent-429-failover.md +89 -0
  299. package/docs/plans/unified-hub-framework-v1.md +245 -0
  300. package/docs/provider-config-v2-ui-design.md +181 -0
  301. package/docs/provider-quota-design.md +129 -0
  302. package/docs/providers/gemini-provider.md +62 -0
  303. package/docs/providers/lmstudio-v2-migration-report.md +102 -0
  304. package/docs/providers/provider-composite-design.md +142 -0
  305. package/docs/providers/provider-composite-testing.md +98 -0
  306. package/docs/providers/provider-type-only-migration.md +111 -0
  307. package/docs/rccx-wasm-migration.md +74 -0
  308. package/docs/refactoring/architecture-comparison-diagram.md +140 -0
  309. package/docs/refactoring/compatibility-v2-architecture-design.md +738 -0
  310. package/docs/refactoring/workflow-compatibility-refactoring-design.md +361 -0
  311. package/docs/reports/routing-classification-report.json +24 -0
  312. package/docs/reports/routing-classification-report.md +18 -0
  313. package/docs/reports/thinking-keywords-report.json +19 -0
  314. package/docs/responses/README.md +156 -0
  315. package/docs/responses-generic-provider.md +86 -0
  316. package/docs/responses-passthrough-provider-design.md +202 -0
  317. package/docs/routing-awrr-health-weighted-round-robin.md +179 -0
  318. package/docs/routing-instructions.md +393 -0
  319. package/docs/servertool-framework.md +65 -0
  320. package/docs/stop-message-auto.md +225 -0
  321. package/docs/streaming-flow.html +30 -0
  322. package/docs/streaming-flow.md +182 -0
  323. package/docs/token-daemon-preview.html +490 -0
  324. package/docs/token-refresh-daemon-plan.md +269 -0
  325. package/docs/transformation-tables/Gemini-FinishReason/345/256/214/346/225/264/350/275/254/346/215/242/350/241/250.json +233 -0
  326. package/docs/transformation-tables/README.md +225 -0
  327. package/docs/transformation-tables/claude-code-router-anthropic-to-gemini.json +283 -0
  328. package/docs/transformation-tables/claude-code-router-anthropic-to-openai.json +208 -0
  329. package/docs/transformation-tables/claude-code-router-openai-to-anthropic.json +261 -0
  330. package/docs/transformation-tables/claude-code-router-openai-to-gemini.json +208 -0
  331. package/docs/transformation-tables/claude-code-router-openai-to-lmstudio.json +182 -0
  332. package/docs/transformation-tables/claude-code-router-openai-to-ollama.json +250 -0
  333. package/docs/transformation-tables/claude-code-router-openai-to-textgenwebui.json +295 -0
  334. package/docs/transformation-tables/claude-code-router-provider-conversions.json +193 -0
  335. package/docs/transformation-tables//345/256/214/346/225/264/347/232/204/345/267/245/345/205/267/346/211/247/350/241/214/346/265/201/347/250/213/350/275/254/346/215/242/350/241/250.json +299 -0
  336. package/docs/transformation-tables//345/257/271/350/257/235/345/216/206/345/217/262/347/273/264/346/212/244/345/210/206/346/236/220.md +134 -0
  337. package/docs/transformation-tables//345/267/245/345/205/267/350/260/203/347/224/250/346/250/241/345/274/217/345/210/206/346/236/220.md +158 -0
  338. package/docs/transformation-tables//347/212/266/346/200/201/347/256/241/347/220/206/351/234/200/346/261/202/345/210/206/346/236/220.md +175 -0
  339. package/docs/transformation-tables//351/235/231/346/200/201/350/241/250vs/345/212/250/346/200/201/345/210/206/346/236/220.md +189 -0
  340. package/docs/transformation-tables//351/235/231/346/200/201/350/241/250/345/207/206/347/241/256/346/200/247/350/257/204/344/274/260.md +179 -0
  341. package/docs/transformation-tables//351/235/236/346/265/201/345/274/217/345/234/272/346/231/257/345/210/206/346/236/220.md +189 -0
  342. package/docs/v2-architecture/IMPLEMENTATION-ROADMAP.md +367 -0
  343. package/docs/v2-architecture/OPTIMIZED-DESIGN.md +827 -0
  344. package/docs/v2-architecture/PRERUN-CONNECTION-DESIGN.md +716 -0
  345. package/docs/v2-architecture/README.md +549 -0
  346. package/docs/verification/modelscope-verify.md +59 -0
  347. package/docs/verified-configs/README.md +60 -0
  348. package/docs/verified-configs/v0.45.0/README.md +244 -0
  349. package/docs/verified-configs/v0.45.0/lmstudio-5521-gpt-oss-20b-mlx.json +135 -0
  350. package/docs/verified-configs/v0.45.0/merged-config.5521.json +1205 -0
  351. package/docs/verified-configs/v0.45.0/merged-config.qwen-5522.json +1559 -0
  352. package/docs/verified-configs/v0.45.0/qwen-5522-qwen3-coder-plus-final.json +221 -0
  353. package/docs/verified-configs/v0.45.0/qwen-5522-qwen3-coder-plus-fixed.json +242 -0
  354. package/docs/verified-configs/v0.45.0/qwen-5522-qwen3-coder-plus.json +242 -0
  355. package/docs/web-search-service-design.md +322 -0
  356. package/package.json +26 -15
  357. package/scripts/build-core.mjs +3 -1
  358. package/scripts/camoufox/launch-auth.mjs +193 -58
  359. package/scripts/ci/repo-sanity.mjs +138 -0
  360. package/scripts/mock-provider/run-regressions.mjs +157 -1
  361. package/scripts/monitor-diff.mjs +126 -0
  362. package/scripts/pack-mode.mjs +19 -1
  363. package/scripts/pack-rcc.mjs +63 -0
  364. package/scripts/run-bg.sh +0 -14
  365. package/scripts/tests/ci-jest.mjs +119 -0
  366. package/scripts/tools-dev/responses-debug-client/README.md +23 -0
  367. package/scripts/tools-dev/responses-debug-client/payloads/poem.json +13 -0
  368. package/scripts/tools-dev/responses-debug-client/payloads/sample-no-tools.json +98 -0
  369. package/scripts/tools-dev/responses-debug-client/payloads/text.json +13 -0
  370. package/scripts/tools-dev/responses-debug-client/payloads/tool.json +27 -0
  371. package/scripts/tools-dev/responses-debug-client/run.mjs +65 -0
  372. package/scripts/tools-dev/responses-debug-client/src/index.ts +281 -0
  373. package/scripts/tools-dev/run-llmswitch-chat.mjs +53 -0
  374. package/scripts/tools-dev/server-tools-dev/run-web-fetch.mjs +65 -0
  375. package/scripts/unified-hub-shadow-compare.mjs +33 -13
  376. package/scripts/vendor-core.mjs +13 -3
  377. package/scripts/verify-e2e-toolcall.mjs +115 -26
  378. package/dist/modules/llmswitch/pipeline-registry.d.ts +0 -57
  379. package/dist/modules/llmswitch/pipeline-registry.js +0 -229
  380. package/dist/modules/llmswitch/pipeline-registry.js.map +0 -1
  381. package/dist/server/RouteCodexServer.d.ts +0 -13
  382. package/dist/server/RouteCodexServer.js +0 -25
  383. package/dist/server/RouteCodexServer.js.map +0 -1
  384. package/dist/v2/conversion/hub/snapshot-recorder.d.ts +0 -12
  385. package/dist/v2/conversion/hub/snapshot-recorder.js +0 -22
  386. package/dist/v2/conversion/hub/snapshot-recorder.js.map +0 -1
  387. package/scripts/test-fc-responses.mjs +0 -66
  388. package/scripts/test-guidance.mjs +0 -100
  389. package/scripts/test-iflow-web-search.mjs +0 -141
  390. package/scripts/test-iflow.mjs +0 -379
  391. package/scripts/test-tool-exec.mjs +0 -26
@@ -0,0 +1,209 @@
1
+ # 请求路由 – 当前状态报告
2
+
3
+ ## 概览
4
+
5
+ 本报告梳理本项目中“请求从 HTTP 进入到外部服务”的实际执行路径,聚焦已有的服务器/路由/Provider 组件与 `src/modules/pipeline` 下的模块化流水线代码,指出当前生效路径、尚未接入的能力、存在的差距与风险,并给出可落地的改进建议与关键文件定位。
6
+
7
+ 要点摘要:
8
+ - 目前生效的是“直通转发”路径:HTTP Server → OpenAI Router → Pass‑Through Provider → 外部 OpenAI API。
9
+ - 模块化流水线(LLM Switch、Compatibility、Provider、Pipeline Manager)代码已存在于 `src/modules/pipeline`,但尚未被 HTTP 服务实际调用。
10
+ - Anthropic 端点已挂载但返回 501(占位占位符)。
11
+ - Virtual Router 与配置驱动分类逻辑存在,但未接入到 HTTP 请求链路中。
12
+
13
+ ---
14
+
15
+ ## 实际运行路径
16
+
17
+ 1) 启动与 HTTP Server 挂载
18
+ - 程序入口初始化并启动 HTTP Server:
19
+ - `src/index.ts:69`, `src/index.ts:70`, `src/index.ts:76`
20
+ - 将 OpenAI 路由挂载到 `/v1/openai/*`:
21
+ - `src/server/http-server.ts:518`
22
+
23
+ 2) OpenAI Chat Completions(非流式)
24
+ - 路由注册:
25
+ - `src/server/protocol-handler.ts:139`
26
+ - 处理函数直接调用“直通 Provider”(未经过 LLM Switch / Compatibility):
27
+ - `src/server/protocol-handler.ts:244`
28
+ - 将返回值直接写回客户端:
29
+ - `src/server/protocol-handler.ts:269`
30
+
31
+ 3) Pass‑Through Provider(直通转发)
32
+ - 目标地址为 `targetUrl + path`,默认 `targetUrl` 指向 OpenAI 官方 API(如未通过构造参数覆盖):
33
+ - 默认取值位置:`src/server/protocol-handler.ts:89`
34
+ - Chat 请求通过 Provider 层 `forwardRequest('/chat/completions', ...)` 直接转发:
35
+ - `src/providers/core/runtime/chat-http-provider.ts:154`
36
+ - 实际发起 HTTP 请求与头处理:
37
+ - `src/providers/core/runtime/chat-http-provider.ts:520`
38
+ - 如果原始请求头中带授权信息,会被透传。
39
+
40
+ 4) 流式(SSE)
41
+ - 当前在 Router 内为“本地模拟流式”,并非真实上游 SSE 透传:
42
+ - `src/server/protocol-handler.ts:812`
43
+
44
+ 5) Anthropic 端点
45
+ - 已挂载 `/v1/anthropic/*`,但固定返回 501:
46
+ - `src/server/http-server.ts:521`
47
+
48
+ ---
49
+
50
+ ## 模块化流水线能力 vs. 当前使用
51
+
52
+ 目标链路(概念):LLM Switch → Compatibility → Provider → 外部服务
53
+
54
+ - LLM Switch(分类/协议识别与转换)
55
+ - 已有:OpenAI→OpenAI 规范化、Anthropic→OpenAI 映射。
56
+ - `src/modules/pipeline/modules/llmswitch/openai-normalizer.ts`
57
+ - `src/modules/pipeline/modules/llmswitch/anthropic-openai-converter.ts`
58
+ - 现状:HTTP 服务未调用。
59
+
60
+ - Compatibility(格式转换)
61
+ - 已有:LM Studio 等兼容模块与 JSON 规则驱动的变换引擎(现全部驻留在 llmswitch-core compat profiles 中)。
62
+ > ⚠️ 2025-12 更新:`src/providers/compat/*` 已下线;兼容行为现由 `sharedmodule/llmswitch-core/src/conversion/compat/` 提供,旧行号仅供历史排查参考。
63
+ - 历史辅助引擎:`src/modules/pipeline/utils/transformation-engine.ts`
64
+ - 现状:HTTP 服务未调用。
65
+
66
+ - Provider(标准 HTTP 通信、无格式转换)
67
+ - 已有:统一的 Chat/Responses Provider 实现。
68
+ - `src/providers/core/runtime/chat-http-provider.ts:15`
69
+ - `src/providers/core/runtime/responses-http-provider.ts:15`
70
+ - 现状:HTTP 路径应直接复用上述 Provider(由 Hub Pipeline 装配器管理),避免额外的直连/PassThrough 实现。
71
+
72
+ - 流水线编排
73
+ - 已有:`BasePipeline` 将 LLM Switch → Workflow → Compatibility → Provider 串联,并在响应端做反向处理:
74
+ - `src/modules/pipeline/core/base-pipeline.ts:119`
75
+ - 管理/注册器存在,但未接入 HTTP Server:
76
+ - `src/modules/pipeline/core/pipeline-manager.ts`
77
+ - `src/modules/pipeline/core/pipeline-registry.ts`
78
+
79
+ ---
80
+
81
+ ## 配置情况
82
+
83
+ - 用户 `~/.routecodex/config.json`(或 `ROUTECODEX_CONFIG_PATH` 指定的文件)由 `bootstrapVirtualRouterConfig` 直接解析,得到 `virtualRouter` + `targetRuntime`,HTTP 服务按该结果构造 Hub Pipeline 与 Provider。
84
+ - OpenAI Router 中的 `targetUrl` 由构造参数/默认值直接决定,并非来自 `modules.json`:
85
+ - `src/server/protocol-handler.ts:89`
86
+
87
+ ---
88
+
89
+ ## Virtual Router 与分类(未接入 HTTP 路径)
90
+
91
+ - Virtual Router 模块提供:
92
+ - 配置驱动的请求分类(default/longContext/thinking/coding/webSearch 等)。
93
+ - 基于 provider.model 与 key 的负载均衡。
94
+ - 代表性位置:
95
+ - 模块入口:`src/modules/virtual-router/virtual-router-module.ts:19`
96
+ - 分类与路由选择:`src/modules/virtual-router/virtual-router-module.ts:288`
97
+ - 分组/负载均衡:`src/modules/virtual-router/virtual-router-module.ts:646`
98
+
99
+ 这些逻辑目前未与 `/v1/openai` 路径串联。
100
+
101
+ ---
102
+
103
+ ## 响应返回结构
104
+
105
+ - 直通路径下,Router 将 `PassThroughProvider.processChatCompletion` 的返回对象直接 `res.json` 给客户端。该对象是 Provider 自定义的 `ProviderResponse` 包装,含 `success/data/error/usage` 等字段,真实上游的 OpenAI JSON 在 `data` 字段内:
106
+ - 写回位置举例:`src/server/protocol-handler.ts:269` 等
107
+
108
+ 如需“完全 OpenAI 兼容”输出,应考虑在最终响应前去掉外层包装或改用严格对齐的响应结构。
109
+
110
+ ---
111
+
112
+ ## 差距与风险
113
+
114
+ - 模块化流水线未接入:请求未经过 LLM Switch / Compatibility 模块,Provider 也非模块化 Provider。
115
+ - Anthropic 端点仅为占位(501),多协议/多提供商能力未成闭环。
116
+ - 流式为本地模拟,缺少真实上游 SSE 透传。
117
+ - OpenAI `targetUrl` 未配置化读取 `modules.json`,多环境/多 Provider 的灵活性受限。
118
+ - Virtual Router 与分类未与 HTTP 链路整合,7 类路由能力无法在运行时发挥作用。
119
+
120
+ ---
121
+
122
+ ## 建议
123
+
124
+ 1) 将 HTTP Server 接入流水线管理器
125
+ - 在请求进入时交给 `PipelineManager`,调用 `BasePipeline.processRequest`,串联 LLM Switch →(Workflow 可选)→ Compatibility → Provider。
126
+
127
+ 2) 引入“智能选择”
128
+ - 使用 `HttpServer` 中的配置驱动 `RouteResolver`(`src/server/http-server.ts`),根据分类器与路由表选择合适的 LLM Switch(如 OpenAI→OpenAI 或 Anthropic→OpenAI)。
129
+
130
+ 3) `targetUrl` 与 Provider 选择配置化
131
+ - 将 Provider 基础地址、鉴权、模型路由统一由 `config/modules.json`(合并配置)驱动,而非在 Router 中硬编码默认值。
132
+
133
+ 4) 完成 Anthropic 端到端闭环
134
+ - 通过模块化链路完成 `anthropic →(LLM Switch)→ Compatibility → Provider` 的全链路调用,以验证多协议能力。
135
+
136
+ 5) 升级流式为真实上游透传
137
+ - 在 Provider 层对接真实流式,并在 Router 层进行透传,输出严格兼容的 OpenAI SSE。
138
+
139
+ 6) 激活 Virtual Router 智能路由
140
+ - 可选:在流水线选择前加入 Virtual Router 的分类逻辑,将请求映射到 7 类路由,并选择相应的流水线配置。
141
+
142
+ ---
143
+
144
+ ## 关键文件参考
145
+
146
+ - 服务器与路由
147
+ - HTTP Server 挂载:`src/server/http-server.ts:518`
148
+ - Anthropic 占位:`src/server/http-server.ts:521`
149
+ - OpenAI Chat 路由:`src/server/protocol-handler.ts:139`
150
+ - 直通调用位置:`src/server/protocol-handler.ts:244`
151
+ - 响应写回:`src/server/protocol-handler.ts:269`
152
+
153
+ - 直通 Provider
154
+ - 转发与 fetch:`src/providers/core/runtime/chat-http-provider.ts:520`
155
+
156
+ - 流水线(已实现但未接入 HTTP 路径)
157
+ - BasePipeline 主链路:`src/modules/pipeline/core/base-pipeline.ts:119`
158
+ - LLM Switch(OpenAI 直通):`src/modules/pipeline/modules/llmswitch/openai-passthrough.ts:15`
159
+ - 历史兼容层(LM Studio):`src/providers/compat/lmstudio-compatibility.ts:16`
160
+ - Provider(Chat/Responses):`src/providers/core/runtime/chat-http-provider.ts:15`
161
+ - 智能选择(格式识别/选择):`src/server/http-server.ts` 提供的 `ConfigRequestClassifier` + RR 组合逻辑
162
+
163
+ - Virtual Router 与分类
164
+ - 模块:`src/modules/virtual-router/virtual-router-module.ts:19`
165
+ - 路由选择与转换:`src/modules/virtual-router/virtual-router-module.ts:288`
166
+ - 负载均衡:`src/modules/virtual-router/virtual-router-module.ts:646`
167
+
168
+ - 配置
169
+ - 模块配置:`config/modules.json`
170
+ - 虚拟路由引导:`src/config/routecodex-config-loader.ts` + `llmswitch-core/v2/router/virtual-router/bootstrap.ts`
171
+
172
+ ---
173
+
174
+ ## 附录:端到端路径示意
175
+
176
+ - 当前生产路径(非流式):
177
+ ```
178
+ HTTP Server → OpenAI Router → Pass‑Through Provider → OpenAI API → OpenAI Router → Client
179
+ ```
180
+
181
+ - 目标模块化路径(OpenAI 直通示例):
182
+ ```
183
+ HTTP → PipelineManager → BasePipeline
184
+ → LLM Switch(openai‑passthrough)
185
+ → Workflow(可选)
186
+ → Compatibility(按 Provider 适配)
187
+ → Provider(标准 HTTP)
188
+ → 外部服务
189
+ ← 反向转换 → Client
190
+ ```
191
+
192
+ - 目标模块化路径(Anthropic → OpenAI 转换示例):
193
+ ```
194
+ HTTP → PipelineManager → BasePipeline
195
+ → LLM Switch(anthropic‑openai‑converter)
196
+ → Compatibility(工具/字段格式适配)
197
+ → Provider(标准 HTTP)
198
+ → 外部服务
199
+ ← 反向转换 → Client
200
+ ```
201
+
202
+ ---
203
+
204
+ ## 下一步(可选)
205
+ 如需,我可以:
206
+ - 将 Router 的直通处理切换为经由 PipelineManager(同时保留“直通模式”作为可配置选项)。
207
+ - 引入 SmartPipelineFactory/Selector,按 URL/请求体自动选择 LLM Switch。
208
+ - 将 Provider 端点、鉴权、模型与路由统一改为配置驱动。
209
+ - 实现真实流式透传与 Anthropic 的完整模块化链路。
@@ -0,0 +1,86 @@
1
+ # Manager Daemon 规划(Routing / Health / Token)
2
+
3
+ ## 目标
4
+
5
+ - 用单一 `ManagerDaemon` 进程内模块,统一管理:
6
+ - Token 生命周期(原 token daemon)。
7
+ - Virtual Router 路由状态(sticky / session 级指令)。
8
+ - Provider / 系列级健康与冷却(429 / quota / 熔断)。
9
+ - 支持按 **server + session** 维度持久化状态,server 重启后仍能继承冷却/黑名单与 sticky 配置。
10
+ - 每个子模块完全解耦,可独立启停与测试。
11
+
12
+ ## 模块划分
13
+
14
+ - `TokenManager`(模块 id: `token`)
15
+ - 继承现有 token daemon 职责:监控 `~/.routecodex/auth/`、刷新 OAuth token、触发重新认证。
16
+ - API:供 CLI / HTTP server 查询 token 状态与触发刷新。
17
+ - 通过 host 级 leader lock(基于 PID 的锁文件)保证 **全局仅有一个 Token 刷新器**(server 内置 TokenManager 与外部 `token-daemon` 互斥)。
18
+
19
+ - `RoutingStateManager`(模块 id: `routing`)
20
+ - 负责 session / conversation 级路由指令状态:
21
+ - sticky target(`forcedTarget` / `stickyTarget`)。
22
+ - `disabledProviders` / `disabledKeys` / `disabledModels`。
23
+ - stopMessage 状态(仅路由层视角)。
24
+ - 与 `VirtualRouterEngine` 的 `RoutingInstructionState` 做双向同步:
25
+ - 启动时从持久化快照恢复;
26
+ - 运行时在指令变更时落盘。
27
+
28
+ - `HealthManager`(模块 id: `health`)
29
+ - 消费 `providerErrorCenter` / Virtual Router Health 相关事件,维护:
30
+ - `ProviderKeyState`:单个 providerKey 的健康 / 冷却窗口 / 错误计数。
31
+ - `SeriesState`:如 claude / gemini 系列的整段熔断与配额冷却。
32
+ - 对 Virtual Router 暴露 `VirtualRouterHealthStore`:
33
+ - 启动时提供初始 snapshot(只包含未过期条目)。
34
+ - 运行时持久化 series cooldown / trip 事件。
35
+
36
+ ## 文件结构(src)
37
+
38
+ ```text
39
+ src/manager/
40
+ index.ts # ManagerDaemon 实现
41
+ types.ts # ManagerContext / ManagerModule 等公共类型
42
+ storage/
43
+ base-store.ts # StateStore 抽象接口
44
+ file-store.ts # JSONL 文件落盘占位实现(后续补全)
45
+ modules/
46
+ token/
47
+ index.ts # TokenManagerModule 占位(后续迁移现有 token-daemon 实现)
48
+ routing/
49
+ index.ts # RoutingStateManagerModule 占位
50
+ health/
51
+ index.ts # HealthManagerModule 占位
52
+ ```
53
+
54
+ > 当前阶段只创建结构和最小占位实现,确保 TypeScript 能编译,通过后再分阶段迁移逻辑与测试。
55
+
56
+ ## 对外集成关系(之后阶段)
57
+
58
+ - HTTP server 启动:
59
+ - 构造 `ManagerDaemon({ serverId })`,按配置注册 `token/routing/health` 模块并调用 `start()`。
60
+ - 构造 Virtual Router 时,将 `HealthManager` 暴露出的 `VirtualRouterHealthStore` 注入 HubPipeline。
61
+ - 错误与健康事件:
62
+ - Provider / Hub 通过 `emitProviderError` → `providerErrorCenter` → VirtualRouter → `HealthManager`。
63
+ - 所有冷却 / 熔断 / 黑名单只在 Virtual Router & HealthManager 合作下维护,Provider/HTTP server 不再各自维护本地状态。
64
+
65
+ ## 交付步骤
66
+
67
+ 1. **阶段 1:骨架搭建**(当前阶段)
68
+ - 建立 `src/manager/**` 文件结构与基础类型,不改变现有行为。
69
+ - 将规划文档落盘(本文件),并在 `task.md` 中新增 Manager Daemon 任务。
70
+
71
+ 2. **阶段 2:TokenManager 迁移**
72
+ - 把现有 `src/token-daemon/*` 逻辑抽取为 `TokenManagerModule` 内部实现。
73
+ - 保持 CLI/脚本行为不变,只调整内部依赖路径。
74
+
75
+ 3. **阶段 3:HealthManager ↔ VirtualRouter 对接(内存版)**
76
+ - 在 sharedmodule 中定义 `VirtualRouterHealthStore` 接口和事件模型。
77
+ - 由 `HealthManagerModule` 提供内存实现,仅反映当前进程的健康状态。
78
+
79
+ 4. **阶段 4:RoutingStateManager 替换 sticky-session 持久化**
80
+ - 用 RoutingStateManager 接管 `sticky-session-store.ts` 的落盘逻辑,统一 SessionRoutingState schema。
81
+
82
+ 5. **阶段 5:HealthManager 持久化**
83
+ - 在 file-store 基础上实现 providerKey / series 级 JSONL 落盘与 snapshot 恢复。
84
+
85
+ 6. **阶段 6:接线 & 调试接口**
86
+ - HTTP server 接入 ManagerDaemon,并提供 `/manager/state/*` 调试端点查看路由池拉黑与 session 状态。
@@ -0,0 +1,176 @@
1
+ # Provider v2 配置与路由拆分落地计划
2
+
3
+ ## 目标与约束
4
+
5
+ - 将现有「virtualrouter 内联 providers + routing」改为:
6
+ - Provider 配置:按 provider 维度拆分到 `~/.routecodex/provider/<id>/config.v2.json`。
7
+ - Routing 配置:保留在主配置(或单独 routing 文件)中,仅描述 route → pool → providerKey 关系。
8
+ - v2 配置通过 `version: "2.0.0"` 与 v1 完全区分,不影响已有 v1 配置(`config.v1.json` / `config.json.virtualrouter.providers`)。
9
+ - 正式运行路径**不做 v1/v2 兼容合并**:v2 模式只读 provider v2 配置;v1 配置仅供迁移脚本和回溯分析使用。
10
+ - 不改动 llmswitch-core 的 VirtualRouter 接口:仍然通过 `bootstrapVirtualRouterConfig(virtualrouter)` 喂入统一的 VirtualRouterInput。
11
+
12
+ ---
13
+
14
+ ## 目录与文件布局(Provider 侧)
15
+
16
+ 1. 顶层 Provider 目录
17
+
18
+ - 路径:`~/.routecodex/provider`
19
+ - 启动行为:
20
+ - 若目录不存在:启动时自动创建。
21
+ - 若存在:每个子目录代表一个 provider 实例(`<providerId>` 或 `<providerId>-<profile>`)。
22
+
23
+ 2. 单个 Provider 目录结构(示例:`~/.routecodex/provider/antigravity`)
24
+
25
+ - 静态配置(v2):
26
+ - 文件:`config.v2.json`
27
+ - 样例:
28
+ ```json
29
+ {
30
+ "version": "2.0.0",
31
+ "providerId": "antigravity",
32
+ "type": "gemini-cli-http-provider",
33
+ "providerType": "gemini",
34
+ "baseURL": "https://daily-cloudcode-pa.sandbox.googleapis.com",
35
+ "auth": {
36
+ "mode": "oauth",
37
+ "oauthProviderId": "antigravity",
38
+ "tokenFile": "~/.routecodex/auth/antigravity-oauth-1-geetasamodgeetasamoda.json"
39
+ },
40
+ "models": [
41
+ {
42
+ "id": "claude-sonnet-4-5-thinking",
43
+ "maxTokens": 64000,
44
+ "maxContext": 148000,
45
+ "supportsStreaming": true
46
+ }
47
+ ],
48
+ "compat": {
49
+ "profile": "chat:gemini",
50
+ "options": {}
51
+ },
52
+ "tags": ["gemini", "cli", "antigravity"]
53
+ }
54
+ ```
55
+ - 本地 runtime 状态(后续阶段接入):
56
+ - `runtime-state.json`:当前 providerKey 级别的健康 / 拉黑 / 冷却状态快照。
57
+ - `events.jsonl`:ProviderErrorEvent / 手动操作事件流。
58
+
59
+ 3. 与现有 provider 配置的关系
60
+
61
+ - 如目录下存在 `config.v1.json`,它只在 v1 模式或迁移脚本中使用;v2 模式**只读 `config.v2.json`**。
62
+ - v1 → v2 的对齐由独立脚本完成(例如 shadow/对比脚本),正式 server/CLI 代码不包含自动迁移或合并逻辑。
63
+
64
+ ---
65
+
66
+ ## 主配置(config.json)与 Routing 拆分
67
+
68
+ 1. config.json 角色简化
69
+
70
+ - 保留:
71
+ - server 端口、日志选项等 host 级配置。
72
+ - virtualrouter 的 routing 结构或指向 routing 文件的引用。
73
+ - 不再要求在 `config.json` 内联 provider 列表:
74
+ - v2 模式下忽略 `virtualrouter.providers` 字段(如存在,仅用于 v1 fallback)。
75
+ - 新增模式开关(示例):
76
+ ```json
77
+ {
78
+ "virtualrouterMode": "v2",
79
+ "virtualrouter": {
80
+ "routing": {
81
+ "default": {
82
+ "pools": [
83
+ { "id": "primary", "targets": ["antigravity.claude-sonnet-4-5-thinking"] }
84
+ ]
85
+ }
86
+ }
87
+ }
88
+ }
89
+ ```
90
+
91
+ 2. VirtualRouterInput 组合逻辑(v2 模式)
92
+
93
+ - 启动时步骤:
94
+ 1. 扫描 `~/.routecodex/provider`:
95
+ - 如不存在则创建空目录。
96
+ - 对每个子目录:若存在 `config.v2.json`:解析为 `ProviderConfigV2`;否则跳过(无隐式迁移)。
97
+ 2. 从 `config.json` / routing 文件读取 routing 配置。
98
+ 3. 组合为 VirtualRouterInput:
99
+ - `providers`: 仅来自上述 ProviderConfigV2 集合。
100
+ - `routing`: 来自 routing 配置(route → pools[] → targets[])。
101
+ 4. 调用 `bootstrapVirtualRouterConfig(input)`,生成 VirtualRouterConfig 交给 HubPipeline。
102
+
103
+ ---
104
+
105
+ ## Provider v2 CLI 管理(rcc provider …)
106
+
107
+ > 仅定义接口与交互流程,具体实现另行分阶段落地。
108
+
109
+ 1. 命令结构
110
+
111
+ - `rcc provider list`
112
+ - `rcc provider add`
113
+ - `rcc provider change <providerId>`
114
+ - `rcc provider delete <providerId>`
115
+
116
+ 2. add/change 交互流程(统一)
117
+
118
+ - 询问 providerId(例如 `antigravity`),检查对应目录是否存在。
119
+ - 选择 provider 类型:
120
+ - `gemini-http-provider` / `gemini-cli-http-provider` / `responses-http-provider` / `openai-http-provider` / `anthropic-http-provider` / `mock-provider` 等。
121
+ - baseURL 与 endpoint 区分说明,并询问 baseURL(针对常见类型给默认值)。
122
+ - 选择认证方式:
123
+ - `api_key`:输入 key 名称(env 名或 token 文件路径),选择新增/覆盖。
124
+ - `oauth`:选择/输入 `oauthProviderId`,说明会复用现有 OAuth 流程。
125
+ - 模型列表配置:
126
+ - 至少一个模型:输入 modelId,设置 maxTokens / maxContext / supportsStreaming 等,可回车接受默认建议值。
127
+ - 支持追加多个模型。
128
+ - compat 配置:
129
+ - 从已支持的 compat profile 列表中选择(例如 `none` / `chat:gemini` / `chat:responses` 等)。
130
+ - 预览:
131
+ - 在终端打印拟写入的 `config.v2.json`,高亮关键字段。
132
+ - 确认:
133
+ - 用户确认后写入/覆盖 `~/.routecodex/provider/<id>/config.v2.json`。
134
+
135
+ 3. list/delete 行为
136
+
137
+ - list:
138
+ - 扫描所有 `config.v2.json`,输出 providerId/type/baseURL/模型数量等摘要。
139
+ - delete:
140
+ - 询问确认后:
141
+ - 仅删除 `config.v2.json`(保留 runtime-state 调试),或
142
+ - 删除整个 `~/.routecodex/provider/<id>` 目录(可作为高级选项,默认不做)。
143
+
144
+ ---
145
+
146
+ ## 落地阶段计划
147
+
148
+ > 实际执行顺序将写入 `task.md`,这里给出高层分期。
149
+
150
+ 1. 阶段 1:定义 VirtualRouterInput 与 ProviderConfigV2 schema
151
+ - 在 host 层显式定义 VirtualRouterInput 类型(providers + routing),抽离出当前 loader 中的隐式结构。
152
+ - 定义 `config.v2.json` 的 TypeScript 接口与基础校验逻辑。
153
+
154
+ 2. 阶段 2:Provider v2 loader(只读,不接入 runtime)
155
+ - 实现扫描 `~/.routecodex/provider` 的 ProviderConfigV2 loader(**只读取显式 `config.v2.json`**,不做自动迁移)。
156
+ - 编写单元测试:确保 loader 对合法 v2 配置的读取行为稳定、可预期;迁移逻辑由单独脚本负责。
157
+
158
+ 3. 阶段 3:Routing loader 与 VirtualRouterInput 组合器
159
+ - 提取/实现 routing loader(从 config.json 或独立 routing 文件读取 route → pools → targets)。
160
+ - 实现组合器:从 ProviderConfigV2 + routing 构造 VirtualRouterInput。
161
+ - 在测试中以 “shadow 模式” 对比 v1 与 v2 VirtualRouterInput,确保结构一致。
162
+
163
+ 4. 阶段 4:接入 runtime(v2 模式开关)
164
+ - 在 `routecodex-config-loader` 中添加 `virtualrouterMode` 分支:
165
+ - `v1`:保持现有 monolithic 行为。
166
+ - `v2`:调用新组合器构建 VirtualRouterInput。
167
+ - 在 dev 环境下以 v2 模式运行全部现有验证脚本(e2e toolcall / routing-instructions / errorsamples 等),确认行为等价。
168
+
169
+ 5. 阶段 5:CLI 支持(rcc provider …)
170
+ - 实现 `rcc provider list/add/change/delete` 子命令。
171
+ - 将 CLI 与 ProviderConfigV2 loader 共用同一 schema/校验。
172
+ - 编写基础交互测试,确保 CLI 对配置文件的读写与 loader 保持一致。
173
+
174
+ 6. 阶段 6:默认切换与清理
175
+ - 在确认 v2 模式稳定后,将默认 `virtualrouterMode` 切换为 `v2`,保留 v1 fallback 若干版本。
176
+ - 在文档和 config 模板中标记 v1 provider 配置为 deprecated,但不立即删除实现,以便回退。
@@ -0,0 +1,209 @@
1
+ # Provider Runtime Manager & Virtual Router 协作设计
2
+
3
+ > 本文在 Provider v2 配置与路由拆分基础上,细化「全局 Provider 运行时状态管理」与 Virtual Router/Provider 的职责分工。
4
+
5
+ ## 1. 角色与边界
6
+
7
+ ### 1.1 Virtual Router(调度者)
8
+
9
+ - 只负责:
10
+ - 根据请求上下文、路由配置和历史错误信息,**决定**哪些 providerKey 需要进入冷却/拉黑窗口。
11
+ - 在每次路由选择时,读取当前 Provider 运行时视图,过滤掉不可用的 providerKey。
12
+ - 不再持有权威的黑名单/冷却状态:
13
+ - 不直接维护可写的 `providerCooldowns` 映射。
14
+ - 不持久化 provider 健康状态,只消费 ProviderRuntimeManager 暴露的只读视图。
15
+
16
+ ### 1.2 ProviderRuntimeManager(状态持有者)
17
+
18
+ - 作为 ManagerDaemon 下的一个模块(暂定 `ProviderManagerModule` 或对现有 `HealthManagerModule` 的扩展),负责:
19
+ - 维护全局 Provider 运行时状态(对所有 providerKey)。
20
+ - 接收 Virtual Router 的「状态决策事件」(例如建议冷却/拉黑),并将其应用到状态表。
21
+ - 接收 providerErrorCenter 的事件流,更新统计信息和健康状态。
22
+ - 将状态持久化到磁盘,并在 server 启动时恢复。
23
+ - 对 Virtual Router 和 Provider runtime 暴露统一的只读视图。
24
+
25
+ ### 1.3 Provider Runtime(执行者)
26
+
27
+ - 每个 provider 的 HTTP/runtime 实现,在真正发起上游请求前:
28
+ - 可选地查询 ProviderRuntimeManager 的视图(例如 `isAvailable(providerKey)`)。
29
+ - 如果被标记为 blacklisted/cooldown,可快速短路(本地 4xx/5xx)或让 Virtual Router 在选路阶段直接排除。
30
+ - 可以在内部增加额外防御逻辑,但**全局生效**的冷却/拉黑以 ProviderRuntimeManager 的状态为准。
31
+
32
+ ---
33
+
34
+ ## 2. 状态模型
35
+
36
+ ### 2.1 ProviderRuntimeState
37
+
38
+ > 仅示意核心字段,实际实现可根据需要扩展。
39
+
40
+ ```ts
41
+ type ProviderStatus = 'healthy' | 'cooldown' | 'blacklisted' | 'degraded';
42
+
43
+ interface ProviderRuntimeState {
44
+ providerKey: string; // 例如 antigravity.geetasamodgeetasamoda.claude-sonnet-4-5
45
+ providerId: string; // 例如 antigravity
46
+ modelId?: string; // 例如 claude-sonnet-4-5
47
+
48
+ status: ProviderStatus;
49
+ cooldownExpiresAt?: number; // ms since epoch
50
+ blacklistExpiresAt?: number; // ms since epoch
51
+
52
+ lastErrorCode?: string; // 例如 HTTP_400 / TOOL_PROTOCOL_ERROR
53
+ lastErrorAt?: number; // ms since epoch
54
+
55
+ errorCounters?: {
56
+ http4xx?: number;
57
+ http5xx?: number;
58
+ timeout?: number;
59
+ auth?: number;
60
+ protocol?: number;
61
+ };
62
+
63
+ lastUsedAt?: number; // 最近一次成功命中的时间
64
+ }
65
+ ```
66
+
67
+ ### 2.2 全局快照与本地文件
68
+
69
+ - 内存视图:
70
+ ```ts
71
+ type ProviderRuntimeTable = Map<string, ProviderRuntimeState>; // key = providerKey
72
+ ```
73
+ - 磁盘持久化:
74
+ - 全局快照(可选):`~/.routecodex/state/providers/<serverId>/providers.jsonl`
75
+ - 每 provider 本地状态(推荐):
76
+ - `~/.routecodex/provider/<id>/runtime-state.json`
77
+ - `~/.routecodex/provider/<id>/events.jsonl`(ProviderErrorEvent / 手动操作日志)
78
+ - TTL 约束:
79
+ - 所有 `cooldownExpiresAt` / `blacklistExpiresAt` 必须**硬性截断**在 24 小时以内:
80
+ - 写入前:`expiresAt = min(now + requestedTtl, now + 24h)`。
81
+ - 启动恢复时,自动丢弃 `expiresAt <= now` 的条目。
82
+
83
+ ---
84
+
85
+ ## 3. 接口设计
86
+
87
+ ### 3.1 Virtual Router → ProviderRuntimeManager(决策与通知)
88
+
89
+ Virtual Router 不直接改写内部 cooldown map,而是发送「运行时控制事件」:
90
+
91
+ ```ts
92
+ type ProviderRuntimeAction =
93
+ | { type: 'propose_cooldown'; providerKey: string; ttlMs: number; reason?: string }
94
+ | { type: 'propose_blacklist'; providerKey: string; ttlMs: number; reason?: string }
95
+ | { type: 'clear_runtime_state'; providerKey: string; reason?: string };
96
+
97
+ interface ProviderRuntimeController {
98
+ applyAction(action: ProviderRuntimeAction): void;
99
+ }
100
+ ```
101
+
102
+ 特性:
103
+
104
+ - Virtual Router 只负责「建议」:
105
+ - 比如在 series 冷却策略决定某 providerKey 需要 300 秒冷却时,发出 `propose_cooldown`。
106
+ - 若需要手动清理某个 providerKey 的状态,可发送 `clear_runtime_state`。
107
+ - ProviderRuntimeManager 是唯一实际更新 ProviderRuntimeTable 的组件:
108
+ - 可以合并多条建议(例如连续的冷却提案,只保留 TTL 更长者或使用统一策略)。
109
+ - 可以将自动冷却与手动拉黑整合在同一份状态中。
110
+
111
+ ### 3.2 ProviderErrorEvent 流
112
+
113
+ ProviderRuntimeManager 同时需要直接消费 ProviderErrorEvent,用于统计与自动动作:
114
+
115
+ ```ts
116
+ interface ProviderErrorConsumer {
117
+ reportError(event: ProviderErrorEvent): void;
118
+ }
119
+ ```
120
+
121
+ 行为示例:
122
+
123
+ - `reportError` 更新 `lastErrorCode` / `lastErrorAt` / `errorCounters`。
124
+ - 根据规则(例如连续 N 次 5xx)自动发起 `propose_cooldown` 或 `propose_blacklist`。
125
+
126
+ ### 3.3 ProviderRuntimeManager → Virtual Router & Provider runtime(视图)
127
+
128
+ 对 Virtual Router 和 Provider runtime 只暴露只读视图接口:
129
+
130
+ ```ts
131
+ interface ProviderRuntimeView {
132
+ getState(providerKey: string): ProviderRuntimeState | undefined;
133
+ isRoutable(providerKey: string): boolean;
134
+ }
135
+ ```
136
+
137
+ 约定:
138
+
139
+ - `isRoutable` 判定逻辑至少包含:
140
+ - 如果 `status === 'blacklisted'` 且 `blacklistExpiresAt > now` → false。
141
+ - 如果 `status === 'cooldown'` 且 `cooldownExpiresAt > now` → false。
142
+ - 其他情况视为 true(或根据 `status==='degraded'` 加权处理,具体策略可后续扩展)。
143
+
144
+ Virtual Router 在选路时只调用 `isRoutable` / `getState`,不直接改写状态。
145
+
146
+ Provider runtime 可以在发起请求前调用 `isRoutable` 做一次最终检查(可选)。
147
+
148
+ ---
149
+
150
+ ## 4. 事件流与调用时序
151
+
152
+ ### 4.1 错误 → 状态更新 → 下一次选路
153
+
154
+ 1. Provider 发生错误,上报 `emitProviderError({ ..., providerKey, error })`。
155
+ 2. `providerErrorCenter` 将 `ProviderErrorEvent` 广播给:
156
+ - Virtual Router(用于路由统计、series 策略等)。
157
+ - ProviderRuntimeManager(用于统计与状态更新)。
158
+ 3. Virtual Router 根据当前策略计算出建议动作:
159
+ - 例如:series 熔断认为 `antigravity.*.claude-sonnet-4-5` 需要冷却 60s。
160
+ - 调用 `ProviderRuntimeController.applyAction({ type: 'propose_cooldown', providerKey, ttlMs: 60000, reason })`。
161
+ 4. ProviderRuntimeManager:
162
+ - 根据 `reportError` 和 `applyAction` 更新 `ProviderRuntimeTable`。
163
+ - 将更新后的状态写回对应 provider 的 `runtime-state.json`,并按需写全局 snapshot。
164
+ 5. 下一次请求到达 Virtual Router:
165
+ - 从 routing 得到候选 providerKey 列表。
166
+ - 对每个候选调用 `runtimeView.isRoutable(providerKey)`,过滤掉不可用的 provider。
167
+ - 在剩余集合上做负载均衡与路由选择。
168
+
169
+ ### 4.2 手动拉黑 / 解除拉黑
170
+
171
+ 1. CLI/HTTP 调用(例如 `rcc provider blacklist ...`):
172
+ - 转换为 `ProviderRuntimeAction`,调用 `ProviderRuntimeController.applyAction`。
173
+ 2. ProviderRuntimeManager 更新 ProviderRuntimeTable 并持久化。
174
+ 3. 后续所有路由命中前都会通过 `isRoutable` 看到新的状态,无需 Virtual Router 知晓具体操作来源。
175
+
176
+ ---
177
+
178
+ ## 5. 持久化与重启行为
179
+
180
+ 1. Server 启动时:
181
+ - ProviderRuntimeManager:
182
+ - 扫描 `~/.routecodex/provider/*/runtime-state.json`。
183
+ - 合并为全局 `ProviderRuntimeTable`,丢弃所有 `expiresAt <= now` 的条目。
184
+ - Virtual Router Engine:
185
+ - 通过注入的 `ProviderRuntimeView` 在首次构造时就能看到恢复后的状态。
186
+
187
+ 2. 运行中:
188
+ - 每次状态变化(自动冷却/手动拉黑/解除):
189
+ - 更新内存 map。
190
+ - 异步保存到对应 provider 目录的 `runtime-state.json`(best-effort)。
191
+ - 可选保存全局 snapshot(用于快速对比或调试)。
192
+
193
+ 3. 关闭时:
194
+ - ManagerDaemon 停止各模块:
195
+ - ProviderRuntimeManager 可选择做一次 `compact()`,清理过期事件并写入最新快照。
196
+
197
+ ---
198
+
199
+ ## 6. 渐进式接线计划(概述)
200
+
201
+ > 具体执行任务写入 `task.md`,这里只列高层步骤。
202
+
203
+ 1. 在 sharedmodule 中定义 `ProviderRuntimeView` / `ProviderRuntimeAction` 类型(仅接口,不改现有逻辑)。
204
+ 2. 在 host 侧实现 ProviderRuntimeManager(内存版 + 基本落盘,不影响当前健康/冷却逻辑)。
205
+ 3. 将 Virtual Router Engine 内部的 providerCooldowns 写入逻辑迁移为对 ProviderRuntimeManager 的 action 调用:
206
+ - Engine 只发出 `propose_cooldown` / `propose_blacklist`,不直接改写本地 map。
207
+ 4. 在 Virtual Router 选路路径中改用 `ProviderRuntimeView.isRoutable` 过滤候选 providerKey。
208
+ 5. 将持久化逻辑从 sharedmodule 的 healthStore 挪到 host 的 ProviderRuntimeManager(engine 只消费 view,不再直接持久化 health snapshot)。
209
+