@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,76 @@
1
+ # CLI Command Inventory & Contracts
2
+
3
+ Source of truth: `src/cli.ts` (wiring) + command implementations in `src/cli/commands/*` and `src/commands/*`.
4
+
5
+ ## Inventory (from `src/cli.ts`)
6
+
7
+ | Command | Where registered | Implementation | Side effects (non-exhaustive) | Exit behavior |
8
+ |---|---|---|---|---|
9
+ | `env` | `src/cli/register/basic-commands.ts` | `src/cli/commands/env.ts` | Reads config file (optional) | `ctx.exit(1)` on parse/config errors; otherwise returns |
10
+ | `clean` | `src/cli/register/basic-commands.ts` | `src/cli/commands/clean.ts` | Deletes captures/logs via `fs.rmSync(recursive)` | Returns on success; on failure uses spinner/logger (no direct `ctx.exit` in this file) |
11
+ | `examples` | `src/cli/register/basic-commands.ts` | `src/cli/commands/examples.ts` | Prints examples | Returns |
12
+ | `port` | `src/cli/register/basic-commands.ts` | `src/cli/commands/port.ts` | Reads port listeners; may kill PIDs (`--kill`) | `ctx.exit(2)` on invalid port; `ctx.exit(1)` on failures |
13
+ | `config` | `src/cli/register/status-config-commands.ts` | `src/cli/commands/config.ts` | Writes config file; reads existing config | Returns (no direct `ctx.exit` in this file) |
14
+ | `status` | `src/cli/register/status-config-commands.ts` | `src/cli/commands/status.ts` | Network `fetch` to server status endpoint | Returns (no direct `ctx.exit` in this file) |
15
+ | `start` | `src/cli/register/start-command.ts` | `src/cli/commands/start.ts` | Reads config; may write temp config + pid file; may `fetch` shutdown; may kill PIDs; spawns server (`node dist/index.js`) | Uses `ctx.exit(...)` for success/error paths |
16
+ | `stop` | `src/cli/register/stop-command.ts` | `src/cli/commands/stop.ts` | Reads config (release); kill PIDs; optional token-daemon stop | `ctx.exit(1)` on config/stop failures; otherwise returns |
17
+ | `restart` | `src/cli/register/restart-command.ts` | `src/cli/commands/restart.ts` | Reads config; kill PIDs; may `fetch` shutdown; spawns server; writes pid file | Uses `ctx.exit(...)` for success/error paths |
18
+ | `code` | `src/cli/register/code-command.ts` | `src/cli/commands/code.ts` | Reads config for `apikey`; may `fetch /ready`; may spawn server; spawns `claude` | Uses `ctx.exit(...)` for success/error paths |
19
+ | `provider-update` *(optional)* | `src/cli.ts` dynamic import | `src/commands/provider-update.ts` | Reads/writes provider config and lists; may call RouteCodex HTTP endpoint for probing | Uses `process.exit(1)` in multiple branches |
20
+ | `camoufox-fp` *(optional)* | `src/cli.ts` dynamic import | `src/commands/camoufox-fp.ts` | Reads fingerprint JSON on disk | Sets `process.exitCode` on errors |
21
+ | `camoufox-backfill` *(optional)* | `src/cli.ts` dynamic import | `src/commands/camoufox-backfill.ts` | Backfills fingerprints (disk IO) | Uses `process.exitCode` on errors (by pattern) |
22
+ | `token-daemon` *(optional)* | `src/cli.ts` dynamic import | `src/commands/token-daemon.ts` | Spawns background daemon; reads/writes snapshots | Uses `process.exit(...)` / `process.exitCode` in command handlers |
23
+ | `quota-status` *(optional)* | `src/cli.ts` dynamic import | `src/commands/quota-status.ts` | Reads quota snapshot file | Returns; throws on missing file |
24
+ | `quota-daemon` *(optional)* | `src/cli.ts` dynamic import | `src/commands/quota-daemon.ts` | Reads replay NDJSON; writes `provider-quota.json` unless `--dry-run` | Returns; on failure throws/sets exit |
25
+ | `oauth` *(optional)* | `src/cli.ts` dynamic import | `src/commands/oauth.ts` | Triggers OAuth flows (Camoufox/browser automation) | Returns; may set exit codes on failures (subcommands) |
26
+ | `validate` *(optional)* | `src/cli.ts` dynamic import | `src/commands/validate.ts` | `fetch` health + API; may spawn `rcc start`; reads payload file | Calls `process.exit(1)` on failures |
27
+
28
+ ## Contracts (inputs/outputs) — extracted from `.option(...)`
29
+
30
+ ### `env` (`src/cli/commands/env.ts`)
31
+ - Inputs: `--port`, `--host`, `--config`, `--json`; reads config file if present.
32
+ - Output: prints shell exports (default) or JSON (`--json`).
33
+ - Exit: `1` on invalid/missing config-derived port.
34
+
35
+ ### `clean` (`src/cli/commands/clean.ts`)
36
+ - Inputs: `--yes`, `--what <targets>` (default `all`).
37
+ - Output: spinner/log messages about deleted targets.
38
+ - Exit: no explicit `ctx.exit` in this file (errors are handled inside action).
39
+
40
+ ### `port` (`src/cli/commands/port.ts`)
41
+ - Inputs: `--port <port>` (default `5555`), `--kill`.
42
+ - Output: diagnostics; when `--kill`, attempts to kill listeners.
43
+ - Exit: `2` on invalid port; `1` on kill failure or unexpected errors.
44
+
45
+ ### `config` (`src/cli/commands/config.ts`)
46
+ - Inputs: `--config <config>`, `--template <template>`, `--force`.
47
+ - Output: writes/prints config info via logger/spinner.
48
+ - Exit: no explicit `ctx.exit` in this file.
49
+
50
+ ### `status` (`src/cli/commands/status.ts`)
51
+ - Inputs: `--json`.
52
+ - Output: human-readable status or JSON.
53
+ - Exit: no explicit `ctx.exit` in this file.
54
+
55
+ ### `start` (`src/cli/commands/start.ts`)
56
+ - Inputs: `--config`, `--port`, `--quota-routing on|off`, `--log-level`, `--codex/--claude`, `--ua`, `--snap/--snap-off`, `--verbose-errors/--quiet-errors`, `--restart`, `--exclusive`.
57
+ - Output: spinner/log lines; server process inherits stdio.
58
+ - Exit: `0` on normal termination; `1` on validation/start/shutdown errors.
59
+
60
+ ### `stop` (`src/cli/commands/stop.ts`)
61
+ - Inputs: none; release mode reads config file for port; dev mode uses default/env port.
62
+ - Output: spinner/log lines about stop result.
63
+ - Exit: `1` on configuration/stop errors.
64
+
65
+ ### `restart` (`src/cli/commands/restart.ts`)
66
+ - Inputs: `--config`, `--log-level`, `--codex/--claude`.
67
+ - Output: spinner/log lines; server process inherits stdio.
68
+ - Exit: `0` on normal termination; `1` on validation/restart errors.
69
+
70
+ ### `code` (`src/cli/commands/code.ts`)
71
+ - Inputs: `--port`, `--host` (default `0.0.0.0`), `--url`, `--config`, `--apikey`, `--claude-path`, `--cwd`, `--model`, `--profile`, `--ensure-server`.
72
+ - Output: launches Claude Code (subprocess inherits stdio).
73
+ - Exit: `0` when Claude exits cleanly; `1` on connection/start failures.
74
+
75
+ ### Optional command groups (`src/commands/*`)
76
+ These are wired via `program.addCommand(...)` and still use `process.exit(...)`/`process.exitCode` in places. They are not yet migrated into the `ctx.exit`/testable registration pattern.
@@ -0,0 +1,50 @@
1
+ # Codex Samples 回放
2
+
3
+ `scripts/replay-codex-sample.mjs` 允许我们将 `~/.routecodex/codex-samples/**/*_client-request.json` 等样本重新发送到本地 RouteCodex,确保工具调用、SSE chunk 和最终 JSON 都被完整记录。
4
+
5
+ ## 使用步骤
6
+
7
+ 1. 启动 RouteCodex 主包(默认 `http://127.0.0.1:5555`)。
8
+ 2. 准备好想要回放的样本文件,例如:
9
+ `~/.routecodex/codex-samples/openai-responses/req_req-v2-1764415000213-z1sxtbhuo_client-request.json`
10
+ 3. 执行:
11
+
12
+ ```bash
13
+ npm run replay:codex-sample -- \
14
+ --sample ~/.routecodex/codex-samples/openai-responses/req_req-v2-1764415000213-z1sxtbhuo_client-request.json \
15
+ --label first-run
16
+ ```
17
+
18
+ 可选参数:
19
+
20
+ | 参数 | 说明 |
21
+ | --- | --- |
22
+ | `--label` | 为本次运行命名(默认使用时间戳)。 |
23
+ | `--base` | RouteCodex 基地址,默认 `http://127.0.0.1:5555`。 |
24
+ | `--key` | API Key / Bearer Token,默认 `routecodex-test`。 |
25
+
26
+ ## 产出内容
27
+
28
+ 脚本会在样本所在目录下生成 `runs/<requestId>/<label>/`,包括:
29
+
30
+ - `request.json`:发送给 RouteCodex 的 endpoint 与 body;
31
+ - `response.meta.json`:状态码、响应头以及是否流式;
32
+ - 若为流式:
33
+ - `response.sse.log`:完整的 SSE 文本(`event:`/`data:`);
34
+ - `response.sse.ndjson`:逐帧 NDJSON,方便与黄金样本 diff;
35
+ - 若为 JSON:
36
+ - `response.json`:RouteCodex 返回的 JSON payload;
37
+ - 若发生错误,额外写入 `response.error.txt`。
38
+
39
+ ## 配合 proxy replay
40
+
41
+ 对于 responses SSE,可使用 `scripts/responses-sse-proxy.mjs --replay <capture>/response.sse.log` 将黄金样本作为上游输出,再结合本脚本回放客户端 payload,实现“同一份请求 + 同一份 SSE 流”在 RouteCodex 中的完整闭环。
42
+
43
+ ## 常见场景
44
+
45
+ - **工具调用链路**:先回放 `/v1/responses` 样本捕获 `required_action`,再回放对应的 `/v1/responses.submit_tool_outputs` 样本;
46
+ - **对比黄金样本**:和 `npm run verify:sse-loop -- --skip-chat --skip-anthropic --use-proxy-capture` 搭配,先复现请求,再检查 SSE 是否与黄金帧一致;
47
+ - **调试快照**:`runs/` 输出可以直接归档到版本库/CI 工件,作为后续 Regression 的输入。
48
+
49
+ 通过上述流程,可以确保 codex samples 中的工具请求、工具返回以及最终响应数据均可被精准复现,并在磁盘上形成完备的 JSON/SSE 证据链。
50
+
@@ -0,0 +1,350 @@
1
+ # Daemon / Token / Quota / Providers / Config V2 管理 API 设计
2
+
3
+ > 目标:为 Daemon 管理 UI 和基于 Config V2 的 Provider 管理视图提供一组 **只读或低风险** 的 HTTP JSON API。
4
+ > 所有 API 均由 HTTP server 提供,数据来源于 ManagerDaemon、虚拟路由和 Config V2,禁止在此层做路由/工具语义决策。
5
+
6
+ ---
7
+
8
+ ## 1. 通用约定
9
+
10
+ - 所有 API 均以 JSON 形式返回。
11
+ - 错误返回格式对齐现有 HTTP server:
12
+ - HTTP 状态码 4xx/5xx。
13
+ - Body: `{ "error": { "message": string, "code"?: string, ... } }`
14
+ - 仅暴露**非敏感字段**:
15
+ - 不返回 access_token / refresh_token / client_secret 等。
16
+ - 对 token 文件路径等敏感信息仅返回相对路径或掩码版本。
17
+
18
+ ---
19
+
20
+ ## 2. Daemon 状态 API
21
+
22
+ ### 2.1 `GET /daemon/status`
23
+
24
+ > 展示当前 HTTP server 实例的 daemon/manager 状态,以及关键模块是否运行。
25
+
26
+ - 响应示例:
27
+
28
+ ```jsonc
29
+ {
30
+ "ok": true,
31
+ "serverId": "routecodex-dev-5555",
32
+ "version": "0.89.872",
33
+ "uptimeSec": 1234,
34
+ "manager": {
35
+ "active": true,
36
+ "modules": [
37
+ { "id": "token", "status": "leader", "details": { "intervalSec": 60 } },
38
+ { "id": "quota", "status": "running" },
39
+ { "id": "health", "status": "running" },
40
+ { "id": "routing", "status": "running", "stickyEnabled": true }
41
+ ]
42
+ }
43
+ }
44
+ ```
45
+
46
+ - 数据来源:
47
+ - `RouteCodexHttpServer`(serverId、版本、uptime)。
48
+ - `ManagerDaemon` + 各 `ManagerModule` 的只读状态。
49
+
50
+ ---
51
+
52
+ ## 3. Credentials 管理 API
53
+
54
+ > 注意:所有 API 必须避免泄露敏感字段,只用于展示凭证状态和触发安全的 verify/refresh 操作。
55
+
56
+ ### 3.1 `GET /daemon/credentials`
57
+
58
+ - 用途:列出 daemon 管理下已知的 credential 条目。
59
+ - 响应示例:
60
+
61
+ ```jsonc
62
+ [
63
+ {
64
+ "id": "iflow-oauth-1-186",
65
+ "kind": "oauth",
66
+ "providerFamily": "gemini",
67
+ "alias": "iflow-186",
68
+ "tokenFile": "~/.routecodex/auth/iflow-oauth-1-186.json",
69
+ "projectId": "my-project",
70
+ "expiresAt": 1736500000000,
71
+ "expiresInSec": 3600,
72
+ "status": "valid", // valid | expiring | expired | invalid
73
+ "lastError": null
74
+ }
75
+ ]
76
+ ```
77
+
78
+ - 数据来源:
79
+ - Token 文件扫描器(现有 `scanProviderTokenFiles` 等)。
80
+ - `readTokenFile` + `evaluateTokenState`。
81
+
82
+ ### 3.2 `GET /daemon/credentials/:id`
83
+
84
+ - 用途:查看单个 credential 的详细信息(仍然不包含密钥本体)。
85
+ - 响应字段在列表基础上可增加:
86
+
87
+ ```jsonc
88
+ {
89
+ "id": "iflow-oauth-1-186",
90
+ "kind": "oauth",
91
+ "providerFamily": "gemini",
92
+ "alias": "iflow-186",
93
+ "tokenFile": "~/.routecodex/auth/iflow-oauth-1-186.json",
94
+ "projectId": "my-project",
95
+ "expiresAt": 1736500000000,
96
+ "expiresInSec": 3600,
97
+ "status": "valid",
98
+ "lastError": null,
99
+ "issuer": "https://accounts.google.com",
100
+ "scopes": ["https://www.googleapis.com/auth/cloud-platform"],
101
+ "createdAt": 1736400000000,
102
+ "updatedAt": 1736499900000
103
+ }
104
+ ```
105
+
106
+ ### 3.3 `POST /daemon/credentials/:id/verify`
107
+
108
+ - 用途:触发一次“最佳努力”的远端验证(例如调用 userinfo 或简单的 API ping)。
109
+ - 请求体:可为空 `{}`。
110
+ - 响应示例:
111
+
112
+ ```jsonc
113
+ {
114
+ "ok": true,
115
+ "id": "iflow-oauth-1-186",
116
+ "status": "valid", // valid | invalid | error
117
+ "checkedAt": 1736500100000,
118
+ "message": "Token accepted by upstream."
119
+ }
120
+ ```
121
+
122
+ - 行为约束:
123
+ - 仅在本地发起一次轻量级验证,不做重试风暴。
124
+ - 失败时只记录错误,不修改配置文件。
125
+
126
+ ### 3.4 `POST /daemon/credentials/:id/refresh`
127
+
128
+ - 用途:在安全前提下触发一次刷新(如果支持 refresh_token)。
129
+ - 响应示例:
130
+
131
+ ```jsonc
132
+ {
133
+ "ok": true,
134
+ "id": "iflow-oauth-1-186",
135
+ "status": "refreshed",
136
+ "expiresAt": 1736503600000
137
+ }
138
+ ```
139
+
140
+ - 约束:
141
+ - 必须遵守现有 token-daemon 的刷新策略,不与后台自动刷新逻辑冲突。
142
+ - 若不支持手动刷新,应返回 `400` 或 `409` 并给出明确错误信息。
143
+
144
+ ---
145
+
146
+ ## 4. Quota & 429 冷却 API
147
+
148
+ ### 4.1 `GET /quota/summary`
149
+
150
+ - 用途:展示所有受管配额(目前主要是 Antigravity)的摘要。
151
+ - 响应示例:
152
+
153
+ ```jsonc
154
+ {
155
+ "updatedAt": 1736500000000,
156
+ "records": [
157
+ {
158
+ "key": "antigravity://jasonqueque/gemini-3-pro-low",
159
+ "alias": "jasonqueque",
160
+ "modelId": "gemini-3-pro-low",
161
+ "remainingFraction": 0.42,
162
+ "resetAt": 1736503600000
163
+ }
164
+ ]
165
+ }
166
+ ```
167
+
168
+ - 数据来源:
169
+ - `QuotaManagerModule.getRawSnapshot()`。
170
+
171
+ ### 4.2 `GET /quota/runtime`
172
+
173
+ - 用途:按 runtimeKey 或 providerKey 过滤配额状态。
174
+ - 查询参数:
175
+ - `runtimeKey?: string`
176
+ - `providerKey?: string`
177
+ - 响应示例:
178
+
179
+ ```jsonc
180
+ {
181
+ "runtimeKey": "antigravity.jasonqueque",
182
+ "items": [
183
+ {
184
+ "providerKey": "antigravity.jasonqueque.gemini-3-pro-low",
185
+ "modelId": "gemini-3-pro-low",
186
+ "remainingFraction": 0.42,
187
+ "resetAt": 1736503600000
188
+ }
189
+ ]
190
+ }
191
+ ```
192
+
193
+ ### 4.3 `GET /quota/cooldowns`
194
+
195
+ - 用途:展示当前虚拟路由层面的 series cooldown 状态(与 429 相关)。
196
+ - 响应示例(形态示意):
197
+
198
+ ```jsonc
199
+ [
200
+ {
201
+ "providerId": "antigravity.jasonqueque",
202
+ "providerKey": "antigravity.jasonqueque.gemini-3-pro-low",
203
+ "series": "gemini-pro",
204
+ "cooldownMs": 300000,
205
+ "until": 1736500200000
206
+ }
207
+ ]
208
+ ```
209
+
210
+ - 数据来源:
211
+ - llmswitch-core virtual router 暴露的 cooldown 只读视图(或内部缓存)。
212
+
213
+ ---
214
+
215
+ ## 5. Providers 运行时视图 API
216
+
217
+ ### 5.1 `GET /providers/runtimes`
218
+
219
+ - 用途:展示当前 virtual router 中实际存在的 provider runtimes 及其状态。
220
+ - 响应示例:
221
+
222
+ ```jsonc
223
+ [
224
+ {
225
+ "providerKey": "antigravity.jasonqueque.gemini-3-pro-low",
226
+ "runtimeKey": "antigravity.jasonqueque",
227
+ "family": "gemini",
228
+ "protocol": "gemini-chat",
229
+ "series": "gemini-pro",
230
+ "enabled": true,
231
+ "boundCredentialId": "iflow-oauth-1-186",
232
+ "health": {
233
+ "status": "ok",
234
+ "lastErrorAt": null,
235
+ "recent429Count": 2
236
+ }
237
+ }
238
+ ]
239
+ ```
240
+
241
+ - 数据来源:
242
+ - `RouteCodexHttpServer` 中的 provider runtime 映射。
243
+ - Health/quota manager 模块。
244
+ - Credential 绑定信息从 Config 解析(不直接读取密钥)。
245
+
246
+ ---
247
+
248
+ ## 6. Config V2 Provider 视图 API
249
+
250
+ > 与 `docs/provider-config-v2-ui-design.md` 对应,只读展示 Config V2 中声明的 provider 定义,并与 runtime/credentials 形成弱关联。
251
+
252
+ ### 6.1 `GET /config/providers/v2`
253
+
254
+ - 用途:列出 Config V2 中声明的 provider 定义摘要。
255
+
256
+ ```jsonc
257
+ [
258
+ {
259
+ "id": "antigravity.jasonqueque.gemini-3-pro-low",
260
+ "family": "gemini",
261
+ "protocol": "gemini-chat",
262
+ "runtimeKey": "antigravity.jasonqueque",
263
+ "route": "default",
264
+ "series": "gemini-pro",
265
+ "enabled": true,
266
+ "source": "virtualrouter.v2.json#providers[3]",
267
+ "defaultModels": ["gemini-3-pro-low"],
268
+ "credentialsRef": "antigravity-oauth-2-jasonqueque.json"
269
+ }
270
+ ]
271
+ ```
272
+
273
+ ### 6.2 `GET /config/providers/v2/:id`
274
+
275
+ - 用途:查看单个 provider 的详细 Config V2 配置。
276
+ - 在 6.1 的基础上,增加:
277
+
278
+ ```jsonc
279
+ {
280
+ "id": "antigravity.jasonqueque.gemini-3-pro-low",
281
+ "family": "gemini",
282
+ "protocol": "gemini-chat",
283
+ "runtimeKey": "antigravity.jasonqueque",
284
+ "route": "default",
285
+ "series": "gemini-pro",
286
+ "enabled": true,
287
+ "source": "virtualrouter.v2.json#providers[3]",
288
+ "defaultModels": ["gemini-3-pro-low"],
289
+ "allowedModels": ["gemini-3-pro-low", "gemini-3-pro-high"],
290
+ "aliases": {
291
+ "thinking": "gemini-3-pro-high",
292
+ "low": "gemini-3-pro-low"
293
+ },
294
+ "credentialsRef": "antigravity-oauth-2-jasonqueque.json",
295
+ "quota": {
296
+ "perMinuteLimit": 60,
297
+ "perHourLimit": 2000
298
+ },
299
+ "flags": {
300
+ "beta": false,
301
+ "internalOnly": false
302
+ },
303
+ "notes": "Primary Gemini Pro provider for Antigravity runtime."
304
+ }
305
+ ```
306
+
307
+ ### 6.3 `GET /config/providers/v2/:id/preview-route`
308
+
309
+ - 用途:把该 provider 在虚拟路由中的路由规则用人类可读的方式展示出来。
310
+
311
+ ```jsonc
312
+ {
313
+ "id": "antigravity.jasonqueque.gemini-3-pro-low",
314
+ "route": "default",
315
+ "series": "gemini-pro",
316
+ "description": [
317
+ "Matched when route=default and series=gemini-pro.",
318
+ "Primary for tools: tool-request-detected, last-tool-other.",
319
+ "Cooldown series: gemini-pro (300000 ms)."
320
+ ]
321
+ }
322
+ ```
323
+
324
+ - 数据来源:
325
+ - Virtual Router 的内部路由表,序列化为文本说明。
326
+
327
+ ---
328
+
329
+ ## 7. 安全与访问控制(设计约束)
330
+
331
+ - 初期阶段,所有管理 API 仅对 `localhost` 暴露:
332
+ - 与现有 `/shutdown` 路由类似,限制 remoteAddress 为 127.0.0.1 / ::1。
333
+ - 不在管理 API 中提供:
334
+ - 修改配置、强制切换路由、直接操作上游 provider 的危险动作。
335
+ - 日志:
336
+ - 重要错误统一走 `RouteErrorHub`,标记 `scope: 'http' | 'daemon'`,但避免在日志中打印敏感字段。
337
+
338
+ ---
339
+
340
+ ## 8. 与任务规划的对应关系
341
+
342
+ - 「文件结构落盘」:
343
+ - 对应 `docs/daemon-admin-module-structure.md` 中的模块/路径设计。
344
+ - 「文档详细设计更新」:
345
+ - 对应本文件中对各 API 的输入/输出定义。
346
+ - 后续实现步骤:
347
+ - 在 HTTP server 中新增 `daemon-admin-routes` 与各 handler。
348
+ - 在前端 UI 中按本 API 规范对接数据。
349
+ - 最终做一轮端到端集成测试(含 429 冷却/配额展示/credential 状态联动)。
350
+
@@ -0,0 +1,169 @@
1
+ # Daemon / Token 管理 & Provider Config V2 视图模块结构设计
2
+
3
+ > 目标:在不破坏现有 HTTP server / Manager 架构的前提下,为 Daemon/Token 管理 UI 和基于 Config V2 的 Provider 管理视图定义清晰的**模块与文件结构**。本设计仅落盘结构与职责,不改动任何实现。
4
+
5
+ ---
6
+
7
+ ## 1. 总体架构与边界
8
+
9
+ - **HTTP Server 仍然是唯一入口**
10
+ - 继续使用 `src/server/runtime/http-server/index.ts` + `routes.ts` 注册所有 HTTP 路径。
11
+ - 新的管理类 API(daemon/token/health/quota/providers/config-v2)作为一组「管理接口」,挂在 HTTP server 之下。
12
+
13
+ - **ManagerDaemon 继续作为状态聚合点**
14
+ - 已有的 `src/manager` 模块负责:
15
+ - token 刷新(`TokenManagerModule`)
16
+ - health 持久化(`HealthManagerModule`)
17
+ - quota 追踪(`QuotaManagerModule`)
18
+ - routing 指令状态(`RoutingStateManagerModule`)
19
+ - 新的管理 API 只“读”这些模块暴露的状态或执行低风险动作(例如触发一次 verify),不直接操作 llmswitch-core 的内部路由逻辑。
20
+
21
+ - **前端 UI 为独立模块**
22
+ - 静态设计页面保留在 `docs/daemon-admin-ui.html`。
23
+ - 真正运行时的管理 UI 视图将作为 HTTP server 提供的静态页面(后续实现阶段接入),前端通过一组只读 JSON API 获取数据。
24
+
25
+ ---
26
+
27
+ ## 2. 后端模块结构(HTTP Server 侧)
28
+
29
+ ### 2.1 入口与路由注册
30
+
31
+ - 现状:
32
+ - HTTP server 在 `src/server/runtime/http-server/index.ts` 中构造 `RouteCodexHttpServer`。
33
+ - 路由在 `src/server/runtime/http-server/routes.ts` 中通过 `registerHttpRoutes` 注册。
34
+
35
+ - 规划:
36
+ - 新增一个轻量的“管理 API 路由模块”:
37
+ - 文件:`src/server/runtime/http-server/daemon-admin-routes.ts`
38
+ - 导出函数:`registerDaemonAdminRoutes(options: DaemonAdminRouteOptions): void`
39
+ - 在 `routes.ts` 内部调用 `registerDaemonAdminRoutes(...)`,与现有 `/health`、`/config` 等路由并列。
40
+
41
+ ```ts
42
+ // src/server/runtime/http-server/daemon-admin-routes.ts(示意)
43
+ export interface DaemonAdminRouteOptions {
44
+ app: Application;
45
+ getManagerDaemon: () => ManagerDaemon | null;
46
+ getServerId: () => string;
47
+ }
48
+
49
+ export function registerDaemonAdminRoutes(options: DaemonAdminRouteOptions): void {
50
+ const { app } = options;
51
+ // 这里仅定义 path → handler 的绑定,具体 handler 抽到子模块。
52
+ }
53
+ ```
54
+
55
+ ### 2.2 管理 API Handler 模块划分
56
+
57
+ 在 `src/server/runtime/http-server` 下增加一个子目录,专门存放管理类 handler:
58
+
59
+ - 目录:`src/server/runtime/http-server/daemon-admin/`
60
+
61
+ 建议的文件划分:
62
+
63
+ - `daemon-admin/status-handler.ts`
64
+ - 对应 API:`GET /daemon/status`
65
+ - 依赖:
66
+ - `ManagerDaemon`(读取当前是否为 leader、运行模块列表)
67
+ - `TokenManagerModule`(token Daemon 运行状态)
68
+ - `HealthManagerModule` / `QuotaManagerModule`(用于统计摘要)
69
+
70
+ - `daemon-admin/credentials-handler.ts`
71
+ - 对应 API:
72
+ - `GET /daemon/credentials`
73
+ - `GET /daemon/credentials/:id`
74
+ - `POST /daemon/credentials/:id/verify`
75
+ - `POST /daemon/credentials/:id/refresh`
76
+ - 依赖:
77
+ - 现有 token 文件扫描、解析工具:
78
+ - `providers/auth/token-scanner` 系列
79
+ - `token-daemon/token-utils` 中的 `readTokenFile` / `evaluateTokenState`
80
+ - 必须避免返回敏感字段(access_token / refresh_token 等),只返回文件路径、issuer、project_id 等非敏感信息。
81
+
82
+ - `daemon-admin/quota-handler.ts`
83
+ - 对应 API:
84
+ - `GET /quota/summary`
85
+ - `GET /quota/runtime`(按 runtimeKey / providerKey 过滤)
86
+ - `GET /quota/cooldowns`(暴露当前 429 冷却相关信息)
87
+ - 依赖:
88
+ - `QuotaManagerModule` 的 `getRawSnapshot()`。
89
+ - 虚拟路由 cooldown 状态(通过 llmswitch-core 暴露的只读接口,或已有的 series cooldown 统计)。
90
+
91
+ - `daemon-admin/providers-runtime-handler.ts`
92
+ - 对应 API:`GET /providers/runtimes`
93
+ - 依赖:
94
+ - `RouteCodexHttpServer` 内部已维护的 `providerHandles` / `providerKeyToRuntimeKey` 映射。
95
+ - `HealthManagerModule` / `QuotaManagerModule` 的统计,用于补充 runtime 健康/配额状态。
96
+
97
+ - `daemon-admin/config-providers-v2-handler.ts`
98
+ - 对应 API:
99
+ - `GET /config/providers/v2`
100
+ - `GET /config/providers/v2/:id`
101
+ - `GET /config/providers/v2/:id/preview-route`
102
+ - 依赖:
103
+ - 未来的 Config V2 loader / Virtual Router builder:
104
+ - provider 定义集合(id/family/protocol/runtimeKey/route/series/defaultModels/credentialsRef/flags)。
105
+ - 虚拟路由中的路由规则(用于 preview-route 的人类可读描述)。
106
+
107
+ > 以上 handler 模块均保持「薄层」:只做数据组装与序列化,不直接参与路由决策或工具语义处理。
108
+
109
+ ### 2.3 与 ManagerDaemon 的绑定
110
+
111
+ - `RouteCodexHttpServer` 构造时已经创建并启动了 `ManagerDaemon`:
112
+ - 在 `src/server/runtime/http-server/index.ts` 中:
113
+ - 创建 `ManagerDaemon`;
114
+ - 注册 `HealthManagerModule` / `RoutingStateManagerModule` / `TokenManagerModule` / `QuotaManagerModule`;
115
+ - 持有一个 `managerDaemon` 字段。
116
+
117
+ - 新的 `registerDaemonAdminRoutes` 需要能够访问这个实例:
118
+ - 在 `RouteCodexHttpServer` 内暴露一个 `getManagerDaemon(): ManagerDaemon | null` 的只读方法。
119
+ - 调用 `registerHttpRoutes` 时,将此方法以闭包形式传递给 `registerDaemonAdminRoutes`,实现解耦:
120
+
121
+ ```ts
122
+ // routes.ts(示意)
123
+ registerDaemonAdminRoutes({
124
+ app,
125
+ getManagerDaemon: () => this.managerDaemon,
126
+ getServerId: () => this.config.server.serverId
127
+ });
128
+ ```
129
+
130
+ ---
131
+
132
+ ## 3. 前端静态资源结构
133
+
134
+ ### 3.1 设计稿与运行时文件的关系
135
+
136
+ - 设计稿:
137
+ - `docs/daemon-admin-ui.html` 保留为设计 Mock,展示完整的 UI 布局和交互。
138
+
139
+ - 运行时静态页面(后续实现阶段):
140
+ - 计划通过 HTTP server 暴露一个只读页面,例如:
141
+ - `GET /daemon/admin` → 返回一个内嵌或打包好的 HTML。
142
+ - 为了减少重复,推荐方案:
143
+ - 在构建流程中,将 `docs/daemon-admin-ui.html` 复制/压缩到构建输出目录(例如 `dist/daemon-admin/index.html`)。
144
+ - 在 HTTP server 中提供一个简单的静态文件响应(不在本次设计中实现具体逻辑)。
145
+
146
+ ### 3.2 前端脚本组织(后续)
147
+
148
+ - 前端 JS/CSS 初期可以内联在单一 HTML 中(如当前 mock)。
149
+ - 一旦接入真实 API,可将脚本拆分为:
150
+ - `daemon-admin.js`:负责 Tab 切换、调用 JSON API、渲染数据。
151
+ - 后续如有必要,再拆分子模块(例如 `credentials-panel.js`、`providers-panel.js`),但这不是当前阶段的目标。
152
+
153
+ ---
154
+
155
+ ## 4. 与现有路由的关系与约束
156
+
157
+ - 所有新 API 都必须遵守现有 HTTP server 的约束:
158
+ - 不在管理 API 中直接调用 provider 上游或 llmswitch-core 的 Hub Pipeline。
159
+ - 错误处理统一走现有的 `reportRouteError` + `mapErrorToHttp` 逻辑(通过封装好的 helper)。
160
+ - 只暴露只读或低风险的动作,不提供重写配置、强制路由等高风险操作。
161
+
162
+ - 管理 UI 相关路径建议统一在以下空间之内:
163
+ - `/daemon/*`:daemon 自身状态、tokens、credentials。
164
+ - `/quota/*`:配额快照与 429 冷却视图。
165
+ - `/providers/*`:runtime 级别的 provider 运行状态。
166
+ - `/config/providers/v2*`:Config V2 声明性配置视图。
167
+
168
+ > 本文档仅定义结构与边界,实际实现将严格参考本结构,并在实现前再与现有代码和运行约束对齐。实现阶段需同时更新对应的 API 设计文档。
169
+