@jsonstudio/rcc 0.90.252 → 0.90.352

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 (335) hide show
  1. package/README.md +16 -16
  2. package/config/providers/ali-coding-plan.json +73 -0
  3. package/dist/build-info.js +2 -2
  4. package/dist/cli/commands/camoufox.js +2 -2
  5. package/dist/cli/commands/camoufox.js.map +1 -1
  6. package/dist/cli/commands/clean.js +4 -3
  7. package/dist/cli/commands/clean.js.map +1 -1
  8. package/dist/cli/commands/config.js +2 -1
  9. package/dist/cli/commands/config.js.map +1 -1
  10. package/dist/cli/commands/env.js +2 -1
  11. package/dist/cli/commands/env.js.map +1 -1
  12. package/dist/cli/commands/init/basic.js +2 -1
  13. package/dist/cli/commands/init/basic.js.map +1 -1
  14. package/dist/cli/commands/init.js +4 -3
  15. package/dist/cli/commands/init.js.map +1 -1
  16. package/dist/cli/commands/launcher-kernel.js +34 -8
  17. package/dist/cli/commands/launcher-kernel.js.map +1 -1
  18. package/dist/cli/commands/port.js +1 -1
  19. package/dist/cli/commands/port.js.map +1 -1
  20. package/dist/cli/commands/restart.js +3 -2
  21. package/dist/cli/commands/restart.js.map +1 -1
  22. package/dist/cli/commands/session-admin.js +46 -8
  23. package/dist/cli/commands/session-admin.js.map +1 -1
  24. package/dist/cli/commands/session-inject.js +43 -4
  25. package/dist/cli/commands/session-inject.js.map +1 -1
  26. package/dist/cli/commands/start.js +4 -3
  27. package/dist/cli/commands/start.js.map +1 -1
  28. package/dist/cli/commands/stop.js +3 -2
  29. package/dist/cli/commands/stop.js.map +1 -1
  30. package/dist/cli/config/bundled-docs.js +2 -6
  31. package/dist/cli/config/bundled-docs.js.map +1 -1
  32. package/dist/cli/config/init-config.d.ts +1 -0
  33. package/dist/cli/config/init-config.js +6 -3
  34. package/dist/cli/config/init-config.js.map +1 -1
  35. package/dist/cli/config/init-provider-catalog.js +4 -4
  36. package/dist/cli/config/init-provider-catalog.js.map +1 -1
  37. package/dist/cli/config/precommand-default-script.js +3 -9
  38. package/dist/cli/config/precommand-default-script.js.map +1 -1
  39. package/dist/cli/guardian/paths.js +2 -3
  40. package/dist/cli/guardian/paths.js.map +1 -1
  41. package/dist/cli.js +10 -2
  42. package/dist/cli.js.map +1 -1
  43. package/dist/commands/camoufox-fp.js +2 -3
  44. package/dist/commands/camoufox-fp.js.map +1 -1
  45. package/dist/commands/migrate-user-config.d.ts +6 -0
  46. package/dist/commands/migrate-user-config.js +53 -0
  47. package/dist/commands/migrate-user-config.js.map +1 -0
  48. package/dist/commands/provider-update.js +9 -9
  49. package/dist/commands/provider-update.js.map +1 -1
  50. package/dist/commands/quota-daemon.js +3 -3
  51. package/dist/commands/quota-daemon.js.map +1 -1
  52. package/dist/commands/quota-status.js +2 -2
  53. package/dist/commands/quota-status.js.map +1 -1
  54. package/dist/commands/token-daemon.js +2 -2
  55. package/dist/commands/token-daemon.js.map +1 -1
  56. package/dist/commands/validate.js +2 -3
  57. package/dist/commands/validate.js.map +1 -1
  58. package/dist/config/auth-file-resolver.js +2 -2
  59. package/dist/config/auth-file-resolver.js.map +1 -1
  60. package/dist/config/provider-v2-loader.js +9 -6
  61. package/dist/config/provider-v2-loader.js.map +1 -1
  62. package/dist/config/routecodex-config-loader.js +2 -2
  63. package/dist/config/routecodex-config-loader.js.map +1 -1
  64. package/dist/config/unified-config-paths.js +33 -11
  65. package/dist/config/unified-config-paths.js.map +1 -1
  66. package/dist/config/user-config-migration.d.ts +42 -0
  67. package/dist/config/user-config-migration.js +188 -0
  68. package/dist/config/user-config-migration.js.map +1 -0
  69. package/dist/config/user-data-paths.d.ts +59 -0
  70. package/dist/config/user-data-paths.js +174 -0
  71. package/dist/config/user-data-paths.js.map +1 -0
  72. package/dist/config/virtual-router-builder.d.ts +1 -1
  73. package/dist/config/virtual-router-builder.js +1 -1
  74. package/dist/daemon-admin-ui/assets/index-Bnx13Byl.js +15 -0
  75. package/dist/daemon-admin-ui/index.html +1 -1
  76. package/dist/docs/daemon-admin-ui.html +9 -9
  77. package/dist/index.js +66 -13
  78. package/dist/index.js.map +1 -1
  79. package/dist/manager/modules/health/index.js +2 -2
  80. package/dist/manager/modules/health/index.js.map +1 -1
  81. package/dist/manager/modules/quota/antigravity-quota-persistence.d.ts +2 -1
  82. package/dist/manager/modules/quota/antigravity-quota-persistence.js +11 -22
  83. package/dist/manager/modules/quota/antigravity-quota-persistence.js.map +1 -1
  84. package/dist/manager/quota/provider-quota-center.js +33 -25
  85. package/dist/manager/quota/provider-quota-center.js.map +1 -1
  86. package/dist/manager/quota/provider-quota-store.js +11 -4
  87. package/dist/manager/quota/provider-quota-store.js.map +1 -1
  88. package/dist/modules/config/pipeline-config-path.js +3 -3
  89. package/dist/modules/config/pipeline-config-path.js.map +1 -1
  90. package/dist/modules/llmswitch/bridge/index.d.ts +1 -1
  91. package/dist/modules/llmswitch/bridge/index.js +1 -1
  92. package/dist/modules/llmswitch/bridge/index.js.map +1 -1
  93. package/dist/modules/llmswitch/bridge/native-exports.d.ts +1 -0
  94. package/dist/modules/llmswitch/bridge/native-exports.js +27 -0
  95. package/dist/modules/llmswitch/bridge/native-exports.js.map +1 -1
  96. package/dist/modules/llmswitch/bridge/snapshot-recorder.js +95 -24
  97. package/dist/modules/llmswitch/bridge/snapshot-recorder.js.map +1 -1
  98. package/dist/modules/llmswitch/bridge/state-integrations.d.ts +18 -0
  99. package/dist/modules/llmswitch/bridge/state-integrations.js +28 -0
  100. package/dist/modules/llmswitch/bridge/state-integrations.js.map +1 -1
  101. package/dist/modules/llmswitch/bridge.d.ts +2 -2
  102. package/dist/modules/llmswitch/bridge.js +2 -2
  103. package/dist/modules/llmswitch/bridge.js.map +1 -1
  104. package/dist/modules/pipeline/utils/colored-logger.d.ts +1 -0
  105. package/dist/modules/pipeline/utils/colored-logger.js +13 -9
  106. package/dist/modules/pipeline/utils/colored-logger.js.map +1 -1
  107. package/dist/providers/auth/antigravity-fingerprint.js +2 -3
  108. package/dist/providers/auth/antigravity-fingerprint.js.map +1 -1
  109. package/dist/providers/auth/antigravity-reauth-state.js +2 -3
  110. package/dist/providers/auth/antigravity-reauth-state.js.map +1 -1
  111. package/dist/providers/auth/antigravity-user-agent.js +2 -2
  112. package/dist/providers/auth/antigravity-user-agent.js.map +1 -1
  113. package/dist/providers/auth/antigravity-warmup.js +2 -3
  114. package/dist/providers/auth/antigravity-warmup.js.map +1 -1
  115. package/dist/providers/auth/deepseek-account-auth.js +4 -3
  116. package/dist/providers/auth/deepseek-account-auth.js.map +1 -1
  117. package/dist/providers/auth/deepseek-account-token-acquirer.js +3 -2
  118. package/dist/providers/auth/deepseek-account-token-acquirer.js.map +1 -1
  119. package/dist/providers/auth/oauth-auth.js +2 -3
  120. package/dist/providers/auth/oauth-auth.js.map +1 -1
  121. package/dist/providers/auth/oauth-lifecycle/path-resolver.js +6 -7
  122. package/dist/providers/auth/oauth-lifecycle/path-resolver.js.map +1 -1
  123. package/dist/providers/auth/oauth-lifecycle.js +4 -4
  124. package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
  125. package/dist/providers/auth/oauth-repair-cooldown.js +2 -3
  126. package/dist/providers/auth/oauth-repair-cooldown.js.map +1 -1
  127. package/dist/providers/auth/token-scanner/index.js +2 -3
  128. package/dist/providers/auth/token-scanner/index.js.map +1 -1
  129. package/dist/providers/auth/token-storage/token-file-resolver.js +8 -7
  130. package/dist/providers/auth/token-storage/token-file-resolver.js.map +1 -1
  131. package/dist/providers/auth/tokenfile-auth.js +5 -6
  132. package/dist/providers/auth/tokenfile-auth.js.map +1 -1
  133. package/dist/providers/core/config/camoufox-launcher.js +3 -4
  134. package/dist/providers/core/config/camoufox-launcher.js.map +1 -1
  135. package/dist/providers/core/config/provider-oauth-configs.js +2 -2
  136. package/dist/providers/core/config/provider-oauth-configs.js.map +1 -1
  137. package/dist/providers/core/hooks/hooks-integration.js +1 -1
  138. package/dist/providers/core/hooks/hooks-integration.js.map +1 -1
  139. package/dist/providers/core/runtime/deepseek-http-provider.js +2 -1
  140. package/dist/providers/core/runtime/deepseek-http-provider.js.map +1 -1
  141. package/dist/providers/core/utils/snapshot-writer.js +2 -1
  142. package/dist/providers/core/utils/snapshot-writer.js.map +1 -1
  143. package/dist/providers/profile/families/anthropic-profile.js +32 -0
  144. package/dist/providers/profile/families/anthropic-profile.js.map +1 -1
  145. package/dist/server/handlers/config-admin-handler.d.ts +1 -1
  146. package/dist/server/handlers/config-admin-handler.js +6 -6
  147. package/dist/server/handlers/config-admin-handler.js.map +1 -1
  148. package/dist/server/handlers/handler-response-utils.js +9 -4
  149. package/dist/server/handlers/handler-response-utils.js.map +1 -1
  150. package/dist/server/runtime/http-server/clock-runtime-hooks.d.ts +2 -0
  151. package/dist/server/runtime/http-server/clock-runtime-hooks.js +91 -0
  152. package/dist/server/runtime/http-server/clock-runtime-hooks.js.map +1 -0
  153. package/dist/server/runtime/http-server/daemon-admin/auth-handler.js +51 -13
  154. package/dist/server/runtime/http-server/daemon-admin/auth-handler.js.map +1 -1
  155. package/dist/server/runtime/http-server/daemon-admin/auth-store.d.ts +1 -9
  156. package/dist/server/runtime/http-server/daemon-admin/auth-store.js +2 -18
  157. package/dist/server/runtime/http-server/daemon-admin/auth-store.js.map +1 -1
  158. package/dist/server/runtime/http-server/daemon-admin/control-handler.js +3 -3
  159. package/dist/server/runtime/http-server/daemon-admin/control-handler.js.map +1 -1
  160. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js +2 -2
  161. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js.map +1 -1
  162. package/dist/server/runtime/http-server/daemon-admin/providers-handler-routing-utils.js +5 -4
  163. package/dist/server/runtime/http-server/daemon-admin/providers-handler-routing-utils.js.map +1 -1
  164. package/dist/server/runtime/http-server/daemon-admin/providers-handler.js +3 -3
  165. package/dist/server/runtime/http-server/daemon-admin/providers-handler.js.map +1 -1
  166. package/dist/server/runtime/http-server/daemon-admin-routes.d.ts +2 -0
  167. package/dist/server/runtime/http-server/daemon-admin-routes.js +11 -8
  168. package/dist/server/runtime/http-server/daemon-admin-routes.js.map +1 -1
  169. package/dist/server/runtime/http-server/executor/client-injection-flow.js +9 -1
  170. package/dist/server/runtime/http-server/executor/client-injection-flow.js.map +1 -1
  171. package/dist/server/runtime/http-server/executor/provider-response-converter.js +119 -26
  172. package/dist/server/runtime/http-server/executor/provider-response-converter.js.map +1 -1
  173. package/dist/server/runtime/http-server/executor/request-retry-helpers.d.ts +1 -0
  174. package/dist/server/runtime/http-server/executor/request-retry-helpers.js +26 -0
  175. package/dist/server/runtime/http-server/executor/request-retry-helpers.js.map +1 -1
  176. package/dist/server/runtime/http-server/http-server-bootstrap.js +2 -3
  177. package/dist/server/runtime/http-server/http-server-bootstrap.js.map +1 -1
  178. package/dist/server/runtime/http-server/http-server-lifecycle.js +2 -0
  179. package/dist/server/runtime/http-server/http-server-lifecycle.js.map +1 -1
  180. package/dist/server/runtime/http-server/http-server-runtime-setup.js +2 -0
  181. package/dist/server/runtime/http-server/http-server-runtime-setup.js.map +1 -1
  182. package/dist/server/runtime/http-server/http-server-session-daemon.js +9 -299
  183. package/dist/server/runtime/http-server/http-server-session-daemon.js.map +1 -1
  184. package/dist/server/runtime/http-server/middleware.d.ts +7 -0
  185. package/dist/server/runtime/http-server/middleware.js +1 -1
  186. package/dist/server/runtime/http-server/middleware.js.map +1 -1
  187. package/dist/server/runtime/http-server/request-executor.js +36 -51
  188. package/dist/server/runtime/http-server/request-executor.js.map +1 -1
  189. package/dist/server/runtime/http-server/routes.js +10 -3
  190. package/dist/server/runtime/http-server/routes.js.map +1 -1
  191. package/dist/server/runtime/http-server/servertool-admin-state.d.ts +1 -0
  192. package/dist/server/runtime/http-server/servertool-admin-state.js +7 -2
  193. package/dist/server/runtime/http-server/servertool-admin-state.js.map +1 -1
  194. package/dist/server/runtime/http-server/session-client-route-utils.d.ts +1 -0
  195. package/dist/server/runtime/http-server/session-client-route-utils.js +49 -4
  196. package/dist/server/runtime/http-server/session-client-route-utils.js.map +1 -1
  197. package/dist/server/runtime/http-server/session-client-routes.d.ts +5 -1
  198. package/dist/server/runtime/http-server/session-client-routes.js +60 -30
  199. package/dist/server/runtime/http-server/session-client-routes.js.map +1 -1
  200. package/dist/server/runtime/http-server/session-dir.js +6 -12
  201. package/dist/server/runtime/http-server/session-dir.js.map +1 -1
  202. package/dist/server/runtime/http-server/stats-manager.js +4 -3
  203. package/dist/server/runtime/http-server/stats-manager.js.map +1 -1
  204. package/dist/server/utils/non-blocking-error-logger.js +2 -1
  205. package/dist/server/utils/non-blocking-error-logger.js.map +1 -1
  206. package/dist/server/utils/request-log-color.js +10 -3
  207. package/dist/server/utils/request-log-color.js.map +1 -1
  208. package/dist/server/utils/stage-logger.js +71 -9
  209. package/dist/server/utils/stage-logger.js.map +1 -1
  210. package/dist/token-daemon/history-store.js +2 -1
  211. package/dist/token-daemon/history-store.js.map +1 -1
  212. package/dist/token-daemon/leader-lock.js +2 -2
  213. package/dist/token-daemon/leader-lock.js.map +1 -1
  214. package/dist/token-daemon/quota-auth-issue.js +2 -4
  215. package/dist/token-daemon/quota-auth-issue.js.map +1 -1
  216. package/dist/token-daemon/server-utils.js +3 -4
  217. package/dist/token-daemon/server-utils.js.map +1 -1
  218. package/dist/token-daemon/token-daemon.js +6 -6
  219. package/dist/token-daemon/token-daemon.js.map +1 -1
  220. package/dist/token-daemon/token-utils.js +2 -1
  221. package/dist/token-daemon/token-utils.js.map +1 -1
  222. package/dist/token-portal/fingerprint-summary.js +2 -3
  223. package/dist/token-portal/fingerprint-summary.js.map +1 -1
  224. package/dist/token-portal/local-token-portal.js +1 -1
  225. package/dist/token-portal/local-token-portal.js.map +1 -1
  226. package/dist/utils/daemon-stop-intent.js +2 -2
  227. package/dist/utils/daemon-stop-intent.js.map +1 -1
  228. package/dist/utils/errorsamples.js +3 -1
  229. package/dist/utils/errorsamples.js.map +1 -1
  230. package/dist/utils/llms-engine-shadow.js +2 -2
  231. package/dist/utils/llms-engine-shadow.js.map +1 -1
  232. package/dist/utils/managed-server-pids.js +2 -2
  233. package/dist/utils/managed-server-pids.js.map +1 -1
  234. package/dist/utils/process-lifecycle-logger.js +2 -1
  235. package/dist/utils/process-lifecycle-logger.js.map +1 -1
  236. package/dist/utils/runtime-exit-forensics.js +2 -2
  237. package/dist/utils/runtime-exit-forensics.js.map +1 -1
  238. package/dist/utils/session-log-color.js +31 -5
  239. package/dist/utils/session-log-color.js.map +1 -1
  240. package/dist/utils/snapshot-writer.js +2 -1
  241. package/dist/utils/snapshot-writer.js.map +1 -1
  242. package/docs/CODEX_AND_CLAUDE_CODE.md +1 -1
  243. package/docs/CONFIG_ARCHITECTURE.md +7 -7
  244. package/docs/DAEMON_CONTROL_PLANE.md +2 -2
  245. package/docs/INSTALLATION_AND_QUICKSTART.md +2 -2
  246. package/docs/INSTRUCTION_MARKUP.md +2 -2
  247. package/docs/OAUTH.md +6 -6
  248. package/docs/PORTS.md +1 -1
  249. package/docs/PROVIDERS_BUILTIN.md +2 -2
  250. package/docs/QUOTA_MANAGER_V3.md +2 -2
  251. package/docs/ROUTING_POLICY_SCHEMA.md +1 -1
  252. package/docs/SERVERTOOL_CLOCK_DESIGN.md +1 -1
  253. package/docs/SERVERTOOL_PRE_COMMAND_HOOKS.md +4 -4
  254. package/docs/anthropic-request-golden-samples.md +4 -4
  255. package/docs/chat-glm-500-analysis.md +2 -2
  256. package/docs/chat-request-golden-samples.md +4 -4
  257. package/docs/codex-samples-replay.md +3 -3
  258. package/docs/daemon-admin-api-design.md +2 -2
  259. package/docs/daemon-admin-ui.html +9 -9
  260. package/docs/design/servertool-stopmessage-lifecycle.md +5 -0
  261. package/docs/golden-ci-library.md +8 -8
  262. package/docs/monitoring/Design.md +2 -2
  263. package/docs/multi-token-auth-guide.md +6 -6
  264. package/docs/oauth-authentication-guide.md +1 -1
  265. package/docs/oauth-iflow-implementation.md +2 -2
  266. package/docs/pipeline-routing-report.md +1 -1
  267. package/docs/plans/manager-daemon/PLAN.md +1 -1
  268. package/docs/plans/provider-config-v2-plan.md +8 -8
  269. package/docs/plans/provider-runtime-manager-plan.md +4 -4
  270. package/docs/provider-analysis.md +5 -5
  271. package/docs/provider-quota-design.md +2 -2
  272. package/docs/providers/antigravity-fingerprint-ua-warmup.md +5 -5
  273. package/docs/providers/antigravity-gemini-provider-compat.md +3 -3
  274. package/docs/providers/deepseek-web-provider-design.md +1 -1
  275. package/docs/providers/gemini-provider.md +1 -1
  276. package/docs/providers/provider-composite-testing.md +2 -2
  277. package/docs/providers/tabglm-claude-code-compat.md +1 -1
  278. package/docs/replay-evidence-iflow-400.txt +3 -3
  279. package/docs/reports/routing-classification-report.json +6 -6
  280. package/docs/reports/routing-classification-report.md +6 -6
  281. package/docs/reports/thinking-keywords-report.json +6 -6
  282. package/docs/responses/README.md +5 -5
  283. package/docs/responses-generic-provider.md +1 -1
  284. package/docs/responses-passthrough-provider-design.md +7 -7
  285. package/docs/routing-instructions.md +1 -1
  286. package/docs/token-daemon-preview.html +3 -3
  287. package/docs/token-refresh-daemon-plan.md +7 -7
  288. package/docs/verification/modelscope-verify.md +2 -2
  289. package/docs/verified-configs/README.md +2 -2
  290. package/docs/verified-configs/v0.45.0/README.md +5 -5
  291. package/docs/verified-configs/v0.45.0/merged-config.5521.json +3 -3
  292. package/docs/verified-configs/v0.45.0/merged-config.qwen-5522.json +3 -3
  293. package/package.json +3 -2
  294. package/scripts/anthropic-four-config-e2e.mjs +5 -5
  295. package/scripts/anthropic-toolcall.mjs +1 -1
  296. package/scripts/batch-toolcall-report.mjs +1 -1
  297. package/scripts/build-core.mjs +2 -7
  298. package/scripts/claude-e2e-listdir-all.sh +1 -1
  299. package/scripts/claude-e2e-listdir-per-config.sh +4 -4
  300. package/scripts/clean-safe.mjs +1 -1
  301. package/scripts/cleanup-beads-oversized-notes.mjs +182 -0
  302. package/scripts/config-core-compare.ts +1 -1
  303. package/scripts/ensure-llmswitch-mode.mjs +7 -1
  304. package/scripts/glm1210-curl-test.sh +1 -1
  305. package/scripts/install-release.sh +1 -1
  306. package/scripts/mock-provider/capture-from-configs.mjs +1 -1
  307. package/scripts/outbound-network-toolcall.mjs +2 -2
  308. package/scripts/outbound-regression-codex-samples.mjs +1 -1
  309. package/scripts/pack-mode.mjs +14 -1
  310. package/scripts/pack-rcc.mjs +9 -4
  311. package/scripts/provider-v2-smoke.mjs +3 -3
  312. package/scripts/publish-rcc.mjs +8 -3
  313. package/scripts/replay-recorded-toolcall.mjs +1 -2
  314. package/scripts/responses-fai-capture.mjs +1 -1
  315. package/scripts/responses-sse-capture.mjs +1 -1
  316. package/scripts/responses-sse-proxy.mjs +1 -1
  317. package/scripts/responses-sse-replay-golden.mjs +252 -111
  318. package/scripts/run-bg.sh +1 -1
  319. package/scripts/run-fg-gtimeout.sh +1 -1
  320. package/scripts/tests/antigravity-codex-sample-pipeline-compare.mjs +1 -1
  321. package/scripts/tests/antigravity-gemini-dryrun-compare.mjs +1 -1
  322. package/scripts/tests/responses-provider-dry-run.mjs +1 -1
  323. package/scripts/tests/virtual-router-health.mjs +1 -1
  324. package/scripts/update-models.mjs +2 -2
  325. package/scripts/v2-simple-monitor.mjs +1 -1
  326. package/scripts/vendor-core.mjs +12 -7
  327. package/scripts/verify-e2e-gemini-followup-sample.mjs +1 -1
  328. package/scripts/verify-e2e-toolcall.mjs +2 -2
  329. package/scripts/verify-health.mjs +2 -2
  330. package/scripts/verify-sse-loop.mjs +1 -1
  331. package/scripts/virtual-router-dryrun.mjs +2 -2
  332. package/scripts/virtual-router-shadow-v2-real.mjs +3 -3
  333. package/dist/daemon-admin-ui/assets/index-C8vP_c5E.js +0 -15
  334. package/docs/rccx-wasm-migration.md +0 -74
  335. package/scripts/compare-codex-rccx.mjs +0 -326
@@ -47,7 +47,7 @@
47
47
  ## 配置文件
48
48
 
49
49
  ### 1. 用户配置文件
50
- `~/.routecodex/config/lmstudio-5521-gpt-oss-20b-mlx.json`
50
+ `~/.rcc/config/lmstudio-5521-gpt-oss-20b-mlx.json`
51
51
  - 端口: 5521
52
52
  - 主机: 0.0.0.0
53
53
  - 虚拟路由器配置正确
@@ -84,7 +84,7 @@
84
84
 
85
85
  ### 配置文件
86
86
  #### 3. Qwen 用户配置文件
87
- `~/.routecodex/config/qwen-5522-qwen3-coder-plus.json`
87
+ `~/.rcc/config/qwen-5522-qwen3-coder-plus.json`
88
88
  - 端口: 5522
89
89
  - OAuth 认证配置
90
90
  - 4个模型配置完整
@@ -101,12 +101,12 @@
101
101
 
102
102
  #### LM Studio 配置
103
103
  ```bash
104
- npx ts-node src/cli.ts start --config ~/.routecodex/config/lmstudio-5521-gpt-oss-20b-mlx.json --port 5521
104
+ npx ts-node src/cli.ts start --config ~/.rcc/config/lmstudio-5521-gpt-oss-20b-mlx.json --port 5521
105
105
  ```
106
106
 
107
107
  #### Qwen Provider 配置
108
108
  ```bash
109
- npx ts-node src/cli.ts start --config ~/.routecodex/config/qwen-5522-qwen3-coder-plus.json --port 5522
109
+ npx ts-node src/cli.ts start --config ~/.rcc/config/qwen-5522-qwen3-coder-plus.json --port 5522
110
110
  ```
111
111
 
112
112
  ### 测试端点
@@ -198,7 +198,7 @@ RouteCodex 的 4 层管道架构设计完全正确:
198
198
 
199
199
  ### 配置文件
200
200
  #### 3. Qwen 用户配置文件
201
- `~/.routecodex/config/qwen-5522-qwen3-coder-plus.json`
201
+ `~/.rcc/config/qwen-5522-qwen3-coder-plus.json`
202
202
  - 端口: 5522
203
203
  - OAuth 认证配置
204
204
  - 4个模型配置完整
@@ -41,7 +41,7 @@
41
41
  ],
42
42
  "enableConsole": true,
43
43
  "enableFile": true,
44
- "filePath": "~/.routecodex/logs/debug-center.log",
44
+ "filePath": "~/.rcc/logs/debug-center.log",
45
45
  "maxFileSize": "10MB",
46
46
  "maxFiles": 5,
47
47
  "enableRotation": true
@@ -64,7 +64,7 @@
64
64
  "level": "info",
65
65
  "enableConsole": true,
66
66
  "enableFile": true,
67
- "filePath": "~/.routecodex/logs/server/http-server.log",
67
+ "filePath": "~/.rcc/logs/server/http-server.log",
68
68
  "categories": [
69
69
  "server",
70
70
  "api",
@@ -1199,7 +1199,7 @@
1199
1199
  "version": "2.0.0",
1200
1200
  "engine": "routecodex-config-engine",
1201
1201
  "timestamp": 1760317417276,
1202
- "configPath": "/Users/fanzhang/.routecodex/config/lmstudio-5521-gpt-oss-20b-mlx.json"
1202
+ "configPath": "/Users/fanzhang/.rcc/config/lmstudio-5521-gpt-oss-20b-mlx.json"
1203
1203
  },
1204
1204
  "engineVersion": "legacy"
1205
1205
  }
@@ -41,7 +41,7 @@
41
41
  ],
42
42
  "enableConsole": true,
43
43
  "enableFile": true,
44
- "filePath": "~/.routecodex/logs/debug-center.log",
44
+ "filePath": "~/.rcc/logs/debug-center.log",
45
45
  "maxFileSize": "10MB",
46
46
  "maxFiles": 5,
47
47
  "enableRotation": true
@@ -64,7 +64,7 @@
64
64
  "level": "info",
65
65
  "enableConsole": true,
66
66
  "enableFile": true,
67
- "filePath": "~/.routecodex/logs/server/http-server.log",
67
+ "filePath": "~/.rcc/logs/server/http-server.log",
68
68
  "categories": [
69
69
  "server",
70
70
  "api",
@@ -1553,7 +1553,7 @@
1553
1553
  "version": "2.0.0",
1554
1554
  "engine": "routecodex-config-engine",
1555
1555
  "timestamp": 1760321473341,
1556
- "configPath": "/Users/fanzhang/.routecodex/config/qwen-5522-qwen3-coder-plus.json"
1556
+ "configPath": "/Users/fanzhang/.rcc/config/qwen-5522-qwen3-coder-plus.json"
1557
1557
  },
1558
1558
  "engineVersion": "legacy"
1559
1559
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsonstudio/rcc",
3
- "version": "0.90.252",
3
+ "version": "0.90.352",
4
4
  "description": "Multi-provider OpenAI proxy server with anthropic/responses/chat support (release)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -159,7 +159,7 @@
159
159
  "@ai-sdk/anthropic": "^3.0.58",
160
160
  "@ai-sdk/openai": "^3.0.41",
161
161
  "@anthropic-ai/sdk": "^0.65.0",
162
- "@jsonstudio/llms": "0.6.3689",
162
+ "@jsonstudio/llms": "0.6.3865",
163
163
  "@lmstudio/sdk": "^1.5.0",
164
164
  "@radix-ui/react-switch": "^1.2.6",
165
165
  "@types/socket.io": "^3.0.1",
@@ -210,6 +210,7 @@
210
210
  "@typescript-eslint/parser": "^6.7.4",
211
211
  "@typescript-eslint/typescript-estree": "^6.7.4",
212
212
  "@vitejs/plugin-react": "^5.1.0",
213
+ "c8": "^11.0.0",
213
214
  "complexity-report": "^2.0.0-alpha",
214
215
  "depcheck": "^1.4.7",
215
216
  "eslint": "^8.50.0",
@@ -21,10 +21,10 @@
21
21
  * 示例:
22
22
  *
23
23
  * node scripts/anthropic-four-config-e2e.mjs \\
24
- * --codec-config ~/.routecodex/provider/glm-anthropic/config.json \\
25
- * --passthrough-config ~/.routecodex/provider/glm-anthropic/config.passthrough.json \\
26
- * --req-chat-resp-pass-config ~/.routecodex/provider/glm-anthropic/config.req-chat_resp-pass.json \\
27
- * --req-pass-resp-chat-config ~/.routecodex/provider/glm-anthropic/config.req-pass_resp-chat.json \\
24
+ * --codec-config ~/.rcc/provider/glm-anthropic/config.json \\
25
+ * --passthrough-config ~/.rcc/provider/glm-anthropic/config.passthrough.json \\
26
+ * --req-chat-resp-pass-config ~/.rcc/provider/glm-anthropic/config.req-chat_resp-pass.json \\
27
+ * --req-pass-resp-chat-config ~/.rcc/provider/glm-anthropic/config.req-pass_resp-chat.json \\
28
28
  * --payload-file ~/.routecodex/codex-samples/anthropic-messages/req_XXXX_server-pre-process.json
29
29
  *
30
30
  * 说明:
@@ -226,7 +226,7 @@ async function main() {
226
226
  ].filter(t => t.cfg);
227
227
 
228
228
  if (!targets.length) {
229
- console.error('至少需要指定一个配置,例如 --codec-config ~/.routecodex/provider/glm-anthropic/config.json');
229
+ console.error('至少需要指定一个配置,例如 --codec-config ~/.rcc/provider/glm-anthropic/config.json');
230
230
  process.exit(2);
231
231
  }
232
232
 
@@ -6,7 +6,7 @@ import os from 'os';
6
6
  import path from 'path';
7
7
  import { pathToFileURL } from 'url';
8
8
 
9
- const PROVIDER_DIR = path.join(os.homedir(), '.routecodex', 'provider');
9
+ const PROVIDER_DIR = path.join(os.homedir(), '.rcc', 'provider');
10
10
  const OUT_DIR = path.join(os.homedir(), '.routecodex', 'logs', 'anthropic-sse');
11
11
 
12
12
  function ensureDir(p) { fs.mkdirSync(p, { recursive: true }); }
@@ -7,7 +7,7 @@ import os from 'os';
7
7
  import path from 'path';
8
8
  import { pathToFileURL } from 'url';
9
9
 
10
- const PROVIDER_DIR = path.join(os.homedir(), '.routecodex', 'provider');
10
+ const PROVIDER_DIR = path.join(os.homedir(), '.rcc', 'provider');
11
11
  const RESP_SAMPLES_DIR = path.join(os.homedir(), '.routecodex', 'codex-samples', 'openai-responses');
12
12
  const RESP_OUT_DIR = path.join(os.homedir(), '.routecodex', 'logs', 'responses-sse');
13
13
  const ANTH_OUT_DIR = path.join(os.homedir(), '.routecodex', 'logs', 'anthropic-sse');
@@ -92,13 +92,8 @@ if (!fs.existsSync(proj)) {
92
92
  process.exit(0);
93
93
  }
94
94
 
95
- // 标准流程:release 构建必须依赖 npm 包(@jsonstudio/llms),禁止编译本地 sharedmodule。
96
- if (buildMode !== 'dev') {
97
- console.log('[build-core] BUILD_MODE=release: skip local llmswitch-core build (use npm @jsonstudio/llms)');
98
- process.exit(0);
99
- }
100
-
101
- // Allow skip via env or if dist already present
95
+ // 有本地 sharedmodule/llmswitch-core 时,无论 dev/release 都以本地源码为唯一构建真源。
96
+ // 仅当 sharedmodule 缺失时,release 才允许退回 npm 包。
102
97
  if (skip === '1' || skip === 'true' || skip === 'yes') {
103
98
  console.log('[build-core] skip requested by env (ROUTECODEX_SKIP_CORE_BUILD/SKIP_CORE_BUILD)');
104
99
  process.exit(0);
@@ -5,7 +5,7 @@
5
5
 
6
6
  set -euo pipefail
7
7
 
8
- CONF="${ROUTECODEX_CONFIG_PATH:-${ROUTECODEX_CONFIG:-$HOME/.routecodex/config.json}}"
8
+ CONF="${ROUTECODEX_CONFIG_PATH:-${ROUTECODEX_CONFIG:-$HOME/.rcc/config.json}}"
9
9
  CONF="${CONF/#\~\//$HOME/}"
10
10
  export CONF
11
11
  if [ ! -f "$CONF" ]; then
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env bash
2
2
  # Run Claude CLI listdir prompt per provider config file, without modifying config.json.
3
- # Discovers configs under ~/.routecodex/config matching common provider names.
3
+ # Discovers configs under ~/.rcc/config matching common provider names.
4
4
 
5
5
  set -euo pipefail
6
6
 
7
7
  PROMPT=${PROMPT:-"列出本地文件目录(只输出名称列表)"}
8
- CONF_DIR="$HOME/.routecodex/config"
8
+ CONF_DIR="$HOME/.rcc/config"
9
9
 
10
10
  if [ ! -d "$CONF_DIR" ]; then
11
11
  echo "Config dir not found: $CONF_DIR" >&2
@@ -56,8 +56,8 @@ if [ "$#" -gt 0 ]; then
56
56
  else
57
57
  FILES=( $(discover_configs) )
58
58
  if [ ${#FILES[@]} -eq 0 ]; then
59
- echo "No provider-specific configs found under $CONF_DIR; running default ~/.routecodex/config.json"
60
- run_one "$HOME/.routecodex/config.json"
59
+ echo "No provider-specific configs found under $CONF_DIR; running default ~/.rcc/config.json"
60
+ run_one "$HOME/.rcc/config.json"
61
61
  else
62
62
  for f in "${FILES[@]}"; do
63
63
  run_one "$CONF_DIR/$f"
@@ -39,7 +39,7 @@ function resolveConfigPath() {
39
39
  if (explicit) {
40
40
  return path.resolve(explicit);
41
41
  }
42
- return path.join(os.homedir(), '.routecodex', 'config.json');
42
+ return path.join(os.homedir(), '.rcc', 'config.json');
43
43
  }
44
44
 
45
45
  function isPidAlive(pid) {
@@ -0,0 +1,182 @@
1
+ #!/usr/bin/env node
2
+
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+
6
+ function parseArgs(argv) {
7
+ const options = {
8
+ file: '.beads/issues.jsonl',
9
+ apply: false,
10
+ maxBytes: 64 * 1024,
11
+ maxNoteChars: 4000,
12
+ backup: true
13
+ };
14
+
15
+ for (let i = 0; i < argv.length; i += 1) {
16
+ const arg = argv[i];
17
+ if (arg === '--apply') {
18
+ options.apply = true;
19
+ continue;
20
+ }
21
+ if (arg === '--no-backup') {
22
+ options.backup = false;
23
+ continue;
24
+ }
25
+ if (arg === '--file' && argv[i + 1]) {
26
+ options.file = argv[i + 1];
27
+ i += 1;
28
+ continue;
29
+ }
30
+ if (arg === '--max-bytes' && argv[i + 1]) {
31
+ options.maxBytes = Number(argv[i + 1]);
32
+ i += 1;
33
+ continue;
34
+ }
35
+ if (arg === '--max-note-chars' && argv[i + 1]) {
36
+ options.maxNoteChars = Number(argv[i + 1]);
37
+ i += 1;
38
+ continue;
39
+ }
40
+ }
41
+
42
+ if (!Number.isFinite(options.maxBytes) || options.maxBytes <= 0) {
43
+ throw new Error(`Invalid --max-bytes: ${options.maxBytes}`);
44
+ }
45
+ if (!Number.isFinite(options.maxNoteChars) || options.maxNoteChars <= 64) {
46
+ throw new Error(`Invalid --max-note-chars: ${options.maxNoteChars}`);
47
+ }
48
+
49
+ return options;
50
+ }
51
+
52
+ function byteLength(value) {
53
+ return Buffer.byteLength(value, 'utf8');
54
+ }
55
+
56
+ function compactNotes(notes, maxNoteChars) {
57
+ const normalized = String(notes || '').replace(/\r\n/g, '\n').trim();
58
+ if (!normalized) {
59
+ return normalized;
60
+ }
61
+
62
+ const lines = normalized
63
+ .split('\n')
64
+ .map((line) => line.trimEnd())
65
+ .filter((line) => line.trim().length > 0);
66
+
67
+ const summaryLines = [];
68
+ let remaining = maxNoteChars;
69
+ for (const line of lines) {
70
+ const next = summaryLines.length === 0 ? line : `\n${line}`;
71
+ if (next.length > remaining) {
72
+ break;
73
+ }
74
+ summaryLines.push(line);
75
+ remaining -= next.length;
76
+ }
77
+
78
+ let compacted = summaryLines.join('\n').trim();
79
+ if (!compacted) {
80
+ compacted = normalized.slice(0, Math.max(256, maxNoteChars - 160)).trim();
81
+ }
82
+
83
+ const suffix =
84
+ '\n[compacted by cleanup-beads-oversized-notes.mjs: raw build/test logs removed; keep detailed output in artifacts, MEMORY.md, or dedicated log files]';
85
+ const allowed = Math.max(128, maxNoteChars - suffix.length);
86
+ if (compacted.length > allowed) {
87
+ compacted = compacted.slice(0, allowed).trimEnd();
88
+ }
89
+ return `${compacted}${suffix}`;
90
+ }
91
+
92
+ function compactRecordLine(line, maxBytes, maxNoteChars) {
93
+ const parsed = JSON.parse(line);
94
+ const originalNotes = typeof parsed.notes === 'string' ? parsed.notes : '';
95
+ if (!originalNotes) {
96
+ return { changed: false, line };
97
+ }
98
+
99
+ const originalBytes = byteLength(line);
100
+ if (originalBytes <= maxBytes && originalNotes.length <= maxNoteChars) {
101
+ return { changed: false, line };
102
+ }
103
+
104
+ let nextNotes = compactNotes(originalNotes, maxNoteChars);
105
+ parsed.notes = nextNotes;
106
+ let nextLine = JSON.stringify(parsed, null, 0);
107
+
108
+ if (byteLength(nextLine) > maxBytes) {
109
+ const hardLimit = Math.max(256, Math.min(maxNoteChars, Math.floor(maxBytes / 4)));
110
+ nextNotes = compactNotes(originalNotes, hardLimit);
111
+ parsed.notes = nextNotes;
112
+ nextLine = JSON.stringify(parsed, null, 0);
113
+ }
114
+
115
+ if (byteLength(nextLine) > maxBytes) {
116
+ const fallbackSuffix =
117
+ '\n[compacted: original notes exceeded storage threshold; see repository artifacts/history for full logs]';
118
+ const prefixBudget = Math.max(128, Math.floor(maxBytes / 6) - fallbackSuffix.length);
119
+ parsed.notes = `${originalNotes.slice(0, prefixBudget).trimEnd()}${fallbackSuffix}`;
120
+ nextLine = JSON.stringify(parsed, null, 0);
121
+ }
122
+
123
+ return {
124
+ changed: nextLine !== line,
125
+ line: nextLine,
126
+ id: parsed.id,
127
+ beforeBytes: originalBytes,
128
+ afterBytes: byteLength(nextLine),
129
+ beforeNoteChars: originalNotes.length,
130
+ afterNoteChars: String(parsed.notes || '').length
131
+ };
132
+ }
133
+
134
+ function main() {
135
+ const options = parseArgs(process.argv.slice(2));
136
+ const filePath = path.resolve(options.file);
137
+ const content = fs.readFileSync(filePath, 'utf8');
138
+ const inputLines = content.split('\n').filter((line) => line.length > 0);
139
+
140
+ const outputLines = [];
141
+ const changedRecords = [];
142
+
143
+ for (const line of inputLines) {
144
+ const result = compactRecordLine(line, options.maxBytes, options.maxNoteChars);
145
+ outputLines.push(result.line);
146
+ if (result.changed) {
147
+ changedRecords.push(result);
148
+ }
149
+ }
150
+
151
+ console.log(`file=${filePath}`);
152
+ console.log(`records=${inputLines.length}`);
153
+ console.log(`changed=${changedRecords.length}`);
154
+ for (const record of changedRecords) {
155
+ console.log(
156
+ [
157
+ `id=${record.id}`,
158
+ `beforeBytes=${record.beforeBytes}`,
159
+ `afterBytes=${record.afterBytes}`,
160
+ `beforeNoteChars=${record.beforeNoteChars}`,
161
+ `afterNoteChars=${record.afterNoteChars}`
162
+ ].join(' ')
163
+ );
164
+ }
165
+
166
+ if (!options.apply) {
167
+ console.log('dry-run only; re-run with --apply to rewrite the file');
168
+ return;
169
+ }
170
+
171
+ if (options.backup) {
172
+ const stamp = new Date().toISOString().replace(/[:.]/g, '-');
173
+ const backupPath = `${filePath}.bak.${stamp}`;
174
+ fs.copyFileSync(filePath, backupPath);
175
+ console.log(`backup=${backupPath}`);
176
+ }
177
+
178
+ fs.writeFileSync(filePath, `${outputLines.join('\n')}\n`, 'utf8');
179
+ console.log('applied=true');
180
+ }
181
+
182
+ main();
@@ -23,7 +23,7 @@ function main() {
23
23
  const corePacPath = './config/pipeline_assembler.core.json';
24
24
  const generatedPipelinePath =
25
25
  process.argv[2] ||
26
- path.join(os.homedir(), '.routecodex', 'config', 'generated', 'pipeline-config.generated.json');
26
+ path.join(os.homedir(), '.rcc', 'config', 'generated', 'pipeline-config.generated.json');
27
27
  if (!fs.existsSync(corePacPath)) {
28
28
  console.error('[compare] core assembler not found:', corePacPath);
29
29
  process.exit(2);
@@ -88,7 +88,13 @@ function ensureReleasePackage() {
88
88
  console.log('[llmswitch:ensure] release package ok: using npm-installed @jsonstudio/llms');
89
89
  }
90
90
 
91
- if (mode === 'dev') {
91
+ if (exists(sharedCoreDir)) {
92
+ const banner = mode === 'dev'
93
+ ? '[llmswitch:ensure] BUILD_MODE=dev: prefer local sharedmodule/llmswitch-core'
94
+ : '[llmswitch:ensure] BUILD_MODE=release but local sharedmodule/llmswitch-core exists; prefer local core';
95
+ console.log(banner);
96
+ ensureDevLink();
97
+ } else if (mode === 'dev') {
92
98
  ensureDevLink();
93
99
  } else {
94
100
  ensureReleasePackage();
@@ -14,7 +14,7 @@ if [[ ! -f "$RAW_FILE" ]]; then
14
14
  exit 2
15
15
  fi
16
16
 
17
- CONFIG_PATH="${ROUTECODEX_CONFIG_PATH:-${ROUTECODEX_CONFIG:-$HOME/.routecodex/config.json}}"
17
+ CONFIG_PATH="${ROUTECODEX_CONFIG_PATH:-${ROUTECODEX_CONFIG:-$HOME/.rcc/config.json}}"
18
18
  CONFIG_PATH="${CONFIG_PATH/#\~\//$HOME/}"
19
19
  if [[ ! -f "$CONFIG_PATH" ]]; then
20
20
  echo "Config not found: $CONFIG_PATH" >&2
@@ -85,7 +85,7 @@ else
85
85
  fi
86
86
 
87
87
  verify_server_request() {
88
- local VERIFY_CONFIG=${ROUTECODEX_INSTALL_VERIFY_CONFIG:-"$HOME/.routecodex/config.json"}
88
+ local VERIFY_CONFIG=${ROUTECODEX_INSTALL_VERIFY_CONFIG:-"$HOME/.rcc/config.json"}
89
89
  local VERIFY_TIMEOUT=${ROUTECODEX_INSTALL_VERIFY_TIMEOUT:-240}
90
90
  local VERIFY_LOG="/tmp/routecodex-release-verify-$(date +%s).log"
91
91
  local TIMEOUT_BIN=""
@@ -10,7 +10,7 @@ import { spawn } from 'node:child_process';
10
10
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
11
11
  const PROJECT_ROOT = path.resolve(__dirname, '../..');
12
12
  const HOME = os.homedir();
13
- const PROVIDER_ROOT = path.join(HOME, '.routecodex', 'provider');
13
+ const PROVIDER_ROOT = path.join(HOME, '.rcc', 'provider');
14
14
  const GOLDEN_ROOT = path.join(HOME, '.routecodex', 'golden_samples');
15
15
  const CUSTOM_SAMPLE_ROOT = path.join(GOLDEN_ROOT, 'new');
16
16
  const MOCK_SAMPLES_ROOT = path.join(PROJECT_ROOT, 'samples', 'mock-provider');
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  // One-click outbound network toolcall tests against openai-compatible providers.
3
- // Reads provider configs under ~/.routecodex/provider/*/config*.json
3
+ // Reads provider configs under ~/.rcc/provider/*/config*.json
4
4
  // Sends a function-calling prompt and reports whether a functionCall/tool_calls is returned.
5
5
 
6
6
  import fs from 'fs';
@@ -8,7 +8,7 @@ import path from 'path';
8
8
  import os from 'os';
9
9
  import { ProviderFactory } from '../dist/providers/core/runtime/provider-factory.js';
10
10
 
11
- const root = path.join(os.homedir(), '.routecodex', 'provider');
11
+ const root = path.join(os.homedir(), '.rcc', 'provider');
12
12
  const MAX_PROVIDERS = parseInt(process.env.RCC_NET_MAX_PROVIDERS || '5', 10);
13
13
  // Per-provider rate limit: default 3 req/min (can override by RCC_NET_RATE_MAX_PER_MINUTE)
14
14
  const RATE_MAX_PER_MIN = parseInt(process.env.RCC_NET_RATE_MAX_PER_MINUTE || '3', 10);
@@ -12,7 +12,7 @@ import { ProviderFactory } from '../dist/providers/core/runtime/provider-factory
12
12
  const CODEx_DIR = path.join(os.homedir(), '.routecodex', 'codex-samples', 'openai-chat');
13
13
  const RESPONSES_SAMPLE_DIR = path.join(os.homedir(), '.routecodex', 'codex-samples', 'openai-responses');
14
14
  const TARGET_TOOL_NAME = (process.env.RCC_REG_TOOL_NAME || 'add').toLowerCase();
15
- const PROVIDER_DIR = path.join(os.homedir(), '.routecodex', 'provider');
15
+ const PROVIDER_DIR = path.join(os.homedir(), '.rcc', 'provider');
16
16
  const MAX_PER_PROVIDER_PER_MIN = parseInt(process.env.RCC_NET_RATE_MAX_PER_MINUTE || '3', 10);
17
17
  const RATE_DISABLED = (process.env.RCC_NET_RATE_DISABLED || '0') === '1';
18
18
  const TARGET_PROTOCOLS = new Set(
@@ -25,6 +25,7 @@ const pkgPath = path.join(projectRoot, 'package.json');
25
25
  const backupPath = pkgPath + '.bak.pack';
26
26
  const ensureScriptPath = path.join(projectRoot, 'scripts', 'ensure-llmswitch-mode.mjs');
27
27
  const llmsPath = path.join(projectRoot, 'node_modules', '@jsonstudio', 'llms');
28
+ const localLlmsPkgPath = path.join(projectRoot, 'sharedmodule', 'llmswitch-core', 'package.json');
28
29
 
29
30
  function runEnsureMode(mode) {
30
31
  const env = { ...process.env, BUILD_MODE: mode };
@@ -42,6 +43,15 @@ function isSymlink(p) {
42
43
  }
43
44
  }
44
45
 
46
+ function readLocalLlmsVersion() {
47
+ try {
48
+ const pkg = JSON.parse(fs.readFileSync(localLlmsPkgPath, 'utf-8'));
49
+ return String(pkg.version || '').trim();
50
+ } catch {
51
+ return '';
52
+ }
53
+ }
54
+
45
55
  const isDevPkg = args.name === 'routecodex';
46
56
  const isRcc = args.name === 'rcc' || args.name === '@jsonstudio/rcc';
47
57
  const isRccx = args.name === '@jsonstudio/rccx';
@@ -70,7 +80,10 @@ try {
70
80
  mutated.bundledDependencies = [];
71
81
  mutated.bundleDependencies = [];
72
82
  const llmsOverride = String(process.env.RCC_LLMS_VERSION || process.env.ROUTECODEX_PACK_LLMS_VERSION || '').trim();
73
- const llmsVersion = (isRcc && llmsOverride) ? llmsOverride : (original.dependencies?.['@jsonstudio/llms'] || '^0.6.230');
83
+ const localLlmsVersion = readLocalLlmsVersion();
84
+ const llmsVersion = (isRcc && llmsOverride)
85
+ ? llmsOverride
86
+ : (localLlmsVersion || original.dependencies?.['@jsonstudio/llms'] || '^0.6.230');
74
87
  if (isRcc && llmsOverride) {
75
88
  console.log(`[pack-mode] using RCC_LLMS_VERSION override: @jsonstudio/llms=${llmsVersion}`);
76
89
  }
@@ -10,6 +10,7 @@ const PROJECT_ROOT = path.resolve(__dirname, '..');
10
10
  const pkgPath = path.join(PROJECT_ROOT, 'package.json');
11
11
  const PACK_SCRIPT = path.join(PROJECT_ROOT, 'scripts', 'pack-mode.mjs');
12
12
  const llmsPath = path.join(PROJECT_ROOT, 'node_modules', '@jsonstudio', 'llms');
13
+ const localLlmsPkgPath = path.join(PROJECT_ROOT, 'sharedmodule', 'llmswitch-core', 'package.json');
13
14
 
14
15
  function parseArgs(argv) {
15
16
  const out = {};
@@ -48,7 +49,11 @@ function exists(p) {
48
49
  try {
49
50
  const args = parseArgs(process.argv);
50
51
  const llmsTgz = String(args.llmsTgz || process.env.RCC_LLMS_TGZ || '').trim();
51
- const llmsVersion = String(args.llmsVersion || process.env.RCC_LLMS_VERSION || '').trim();
52
+ const llmsVersion = String(
53
+ args.llmsVersion ||
54
+ process.env.RCC_LLMS_VERSION ||
55
+ (exists(localLlmsPkgPath) ? JSON.parse(fs.readFileSync(localLlmsPkgPath, 'utf-8')).version : '')
56
+ ).trim();
52
57
 
53
58
  const hadDevLink = isSymlink(llmsPath);
54
59
 
@@ -64,13 +69,13 @@ try {
64
69
  run('npm', ['install', '--no-audit', '--no-fund', '--no-save', llmsTgz], { cwd: PROJECT_ROOT });
65
70
  }
66
71
 
67
- // 1) release 模式构建 dist(依赖 npm 上的 @jsonstudio/llms)
72
+ // 1) release 模式构建 dist。若存在本地 sharedmodule/llmswitch-core,则 release 也以其为唯一真源。
68
73
  run('npm', ['run', 'build:min'], {
69
74
  cwd: PROJECT_ROOT,
70
75
  env: { ...process.env, BUILD_MODE: 'release', ...(llmsVersion ? { RCC_LLMS_VERSION: llmsVersion } : {}) }
71
76
  });
72
77
 
73
- // 2) 通过 pack-mode 生成 rcc tarball(内部会临时切换 package.json.name/bin 并确保 llms 为 release 包)
78
+ // 2) 通过 pack-mode 生成 rcc tarball(内部会临时切换 package.json.name/bin,并同步 llms 版本声明)
74
79
  run(
75
80
  process.execPath,
76
81
  [PACK_SCRIPT, '--name', '@jsonstudio/rcc', '--bin', 'rcc'],
@@ -88,7 +93,7 @@ try {
88
93
 
89
94
  console.log(`[pack-rcc] ✅ tarball ready: ${tarballPath}`);
90
95
 
91
- // 3) pack 结束后恢复 dev 模式(routecodex 约定始终为 dev CLI;rcc 打包时才切 release)。
96
+ // 3) pack 结束后恢复 dev 模式。
92
97
  if (hadDevLink) {
93
98
  run('npm', ['run', 'llmswitch:ensure'], {
94
99
  cwd: PROJECT_ROOT,
@@ -6,10 +6,10 @@ import path from 'path';
6
6
 
7
7
  function readJson(p){ try { return JSON.parse(fs.readFileSync(p,'utf-8')); } catch { return null; } }
8
8
  function loadUserConfig(){
9
- const explicit = process.env.ROUTECODEX_CONFIG_PATH;
9
+ const explicit = process.env.ROUTECODEX_CONFIG_PATH || process.env.RCC_CONFIG_PATH || process.env.ROUTECODEX_CONFIG || process.env.RCC_CONFIG;
10
10
  const candidate = explicit && explicit.trim()
11
11
  ? path.resolve(explicit.trim())
12
- : path.join(os.homedir(), '.routecodex', 'config.json');
12
+ : path.join(os.homedir(), '.rcc', 'config.json');
13
13
  return readJson(candidate);
14
14
  }
15
15
 
@@ -18,7 +18,7 @@ const providers = cfg?.virtualrouter?.providers || {};
18
18
  const entries = Object.entries(providers);
19
19
  const glmEntry = entries.find(([id]) => id.includes('glm')) || entries[0];
20
20
  if (!glmEntry) {
21
- console.error('no provider definition found in ~/.routecodex/config.json');
21
+ console.error('no provider definition found in ~/.rcc/config.json');
22
22
  process.exit(2);
23
23
  }
24
24
  const [providerId, providerConfig] = glmEntry;
@@ -9,6 +9,7 @@ const PROJECT_ROOT = path.resolve(__dirname, '..');
9
9
  const PACK_SCRIPT = path.join(PROJECT_ROOT, 'scripts', 'pack-mode.mjs');
10
10
  const pkgPath = path.join(PROJECT_ROOT, 'package.json');
11
11
  const llmsPath = path.join(PROJECT_ROOT, 'node_modules', '@jsonstudio', 'llms');
12
+ const localLlmsPkgPath = path.join(PROJECT_ROOT, 'sharedmodule', 'llmswitch-core', 'package.json');
12
13
 
13
14
  function parseArgs(argv) {
14
15
  const out = {};
@@ -39,7 +40,11 @@ function run(command, args, options = {}) {
39
40
  try {
40
41
  const args = parseArgs(process.argv);
41
42
  const llmsTgz = String(args.llmsTgz || process.env.RCC_LLMS_TGZ || '').trim();
42
- const llmsVersion = String(args.llmsVersion || process.env.RCC_LLMS_VERSION || '').trim();
43
+ const llmsVersion = String(
44
+ args.llmsVersion ||
45
+ process.env.RCC_LLMS_VERSION ||
46
+ (exists(localLlmsPkgPath) ? JSON.parse(fs.readFileSync(localLlmsPkgPath, 'utf-8')).version : '')
47
+ ).trim();
43
48
 
44
49
  const hadDevLink = (() => {
45
50
  try {
@@ -59,13 +64,13 @@ try {
59
64
  run('npm', ['install', '--no-audit', '--no-fund', '--no-save', llmsTgz], { cwd: PROJECT_ROOT });
60
65
  }
61
66
 
62
- // 1) 使用 release 模式构建 dist(依赖 npm 上的 @jsonstudio/llms)
67
+ // 1) 使用 release 模式构建 dist。若存在本地 sharedmodule/llmswitch-core,则 release 也以其为唯一真源。
63
68
  run('npm', ['run', 'build:min'], {
64
69
  cwd: PROJECT_ROOT,
65
70
  env: { ...process.env, BUILD_MODE: 'release', ...(llmsVersion ? { RCC_LLMS_VERSION: llmsVersion } : {}) }
66
71
  });
67
72
 
68
- // 2) 通过 pack-mode 生成 rcc tarball(内部会临时切换 package.json.name/bin 并确保 llms 为 release 包)
73
+ // 2) 通过 pack-mode 生成 rcc tarball(内部会临时切换 package.json.name/bin,并同步 llms 版本声明)
69
74
  run(
70
75
  process.execPath,
71
76
  [PACK_SCRIPT, '--name', '@jsonstudio/rcc', '--bin', 'rcc'],
@@ -41,7 +41,7 @@ async function sleep(ms) { await new Promise(r => setTimeout(r, ms)); }
41
41
  async function getPortFromConfig() {
42
42
  try {
43
43
  const envPath = process.env.ROUTECODEX_CONFIG_PATH || process.env.ROUTECODEX_CONFIG || '';
44
- const candidate = envPath || path.join(os.homedir(), '.routecodex', 'config.json');
44
+ const candidate = envPath || path.join(os.homedir(), '.rcc', 'config.json');
45
45
  if (fsSync.existsSync(candidate)) {
46
46
  const cfg = await readJson(candidate);
47
47
  const p = (cfg && cfg.httpserver && typeof cfg.httpserver.port === 'number') ? cfg.httpserver.port : cfg.port;
@@ -227,4 +227,3 @@ async function main() {
227
227
  }
228
228
 
229
229
  main().catch(err => { console.error(err); process.exit(1); });
230
-