@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.
- package/README.md +16 -16
- package/config/providers/ali-coding-plan.json +73 -0
- package/dist/build-info.js +2 -2
- package/dist/cli/commands/camoufox.js +2 -2
- package/dist/cli/commands/camoufox.js.map +1 -1
- package/dist/cli/commands/clean.js +4 -3
- package/dist/cli/commands/clean.js.map +1 -1
- package/dist/cli/commands/config.js +2 -1
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/env.js +2 -1
- package/dist/cli/commands/env.js.map +1 -1
- package/dist/cli/commands/init/basic.js +2 -1
- package/dist/cli/commands/init/basic.js.map +1 -1
- package/dist/cli/commands/init.js +4 -3
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/launcher-kernel.js +34 -8
- package/dist/cli/commands/launcher-kernel.js.map +1 -1
- package/dist/cli/commands/port.js +1 -1
- package/dist/cli/commands/port.js.map +1 -1
- package/dist/cli/commands/restart.js +3 -2
- package/dist/cli/commands/restart.js.map +1 -1
- package/dist/cli/commands/session-admin.js +46 -8
- package/dist/cli/commands/session-admin.js.map +1 -1
- package/dist/cli/commands/session-inject.js +43 -4
- package/dist/cli/commands/session-inject.js.map +1 -1
- package/dist/cli/commands/start.js +4 -3
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/stop.js +3 -2
- package/dist/cli/commands/stop.js.map +1 -1
- package/dist/cli/config/bundled-docs.js +2 -6
- package/dist/cli/config/bundled-docs.js.map +1 -1
- package/dist/cli/config/init-config.d.ts +1 -0
- package/dist/cli/config/init-config.js +6 -3
- package/dist/cli/config/init-config.js.map +1 -1
- package/dist/cli/config/init-provider-catalog.js +4 -4
- package/dist/cli/config/init-provider-catalog.js.map +1 -1
- package/dist/cli/config/precommand-default-script.js +3 -9
- package/dist/cli/config/precommand-default-script.js.map +1 -1
- package/dist/cli/guardian/paths.js +2 -3
- package/dist/cli/guardian/paths.js.map +1 -1
- package/dist/cli.js +10 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/camoufox-fp.js +2 -3
- package/dist/commands/camoufox-fp.js.map +1 -1
- package/dist/commands/migrate-user-config.d.ts +6 -0
- package/dist/commands/migrate-user-config.js +53 -0
- package/dist/commands/migrate-user-config.js.map +1 -0
- package/dist/commands/provider-update.js +9 -9
- package/dist/commands/provider-update.js.map +1 -1
- package/dist/commands/quota-daemon.js +3 -3
- package/dist/commands/quota-daemon.js.map +1 -1
- package/dist/commands/quota-status.js +2 -2
- package/dist/commands/quota-status.js.map +1 -1
- package/dist/commands/token-daemon.js +2 -2
- package/dist/commands/token-daemon.js.map +1 -1
- package/dist/commands/validate.js +2 -3
- package/dist/commands/validate.js.map +1 -1
- package/dist/config/auth-file-resolver.js +2 -2
- package/dist/config/auth-file-resolver.js.map +1 -1
- package/dist/config/provider-v2-loader.js +9 -6
- package/dist/config/provider-v2-loader.js.map +1 -1
- package/dist/config/routecodex-config-loader.js +2 -2
- package/dist/config/routecodex-config-loader.js.map +1 -1
- package/dist/config/unified-config-paths.js +33 -11
- package/dist/config/unified-config-paths.js.map +1 -1
- package/dist/config/user-config-migration.d.ts +42 -0
- package/dist/config/user-config-migration.js +188 -0
- package/dist/config/user-config-migration.js.map +1 -0
- package/dist/config/user-data-paths.d.ts +59 -0
- package/dist/config/user-data-paths.js +174 -0
- package/dist/config/user-data-paths.js.map +1 -0
- package/dist/config/virtual-router-builder.d.ts +1 -1
- package/dist/config/virtual-router-builder.js +1 -1
- package/dist/daemon-admin-ui/assets/index-Bnx13Byl.js +15 -0
- package/dist/daemon-admin-ui/index.html +1 -1
- package/dist/docs/daemon-admin-ui.html +9 -9
- package/dist/index.js +66 -13
- package/dist/index.js.map +1 -1
- package/dist/manager/modules/health/index.js +2 -2
- package/dist/manager/modules/health/index.js.map +1 -1
- package/dist/manager/modules/quota/antigravity-quota-persistence.d.ts +2 -1
- package/dist/manager/modules/quota/antigravity-quota-persistence.js +11 -22
- package/dist/manager/modules/quota/antigravity-quota-persistence.js.map +1 -1
- package/dist/manager/quota/provider-quota-center.js +33 -25
- package/dist/manager/quota/provider-quota-center.js.map +1 -1
- package/dist/manager/quota/provider-quota-store.js +11 -4
- package/dist/manager/quota/provider-quota-store.js.map +1 -1
- package/dist/modules/config/pipeline-config-path.js +3 -3
- package/dist/modules/config/pipeline-config-path.js.map +1 -1
- package/dist/modules/llmswitch/bridge/index.d.ts +1 -1
- package/dist/modules/llmswitch/bridge/index.js +1 -1
- package/dist/modules/llmswitch/bridge/index.js.map +1 -1
- package/dist/modules/llmswitch/bridge/native-exports.d.ts +1 -0
- package/dist/modules/llmswitch/bridge/native-exports.js +27 -0
- package/dist/modules/llmswitch/bridge/native-exports.js.map +1 -1
- package/dist/modules/llmswitch/bridge/snapshot-recorder.js +95 -24
- package/dist/modules/llmswitch/bridge/snapshot-recorder.js.map +1 -1
- package/dist/modules/llmswitch/bridge/state-integrations.d.ts +18 -0
- package/dist/modules/llmswitch/bridge/state-integrations.js +28 -0
- package/dist/modules/llmswitch/bridge/state-integrations.js.map +1 -1
- package/dist/modules/llmswitch/bridge.d.ts +2 -2
- package/dist/modules/llmswitch/bridge.js +2 -2
- package/dist/modules/llmswitch/bridge.js.map +1 -1
- package/dist/modules/pipeline/utils/colored-logger.d.ts +1 -0
- package/dist/modules/pipeline/utils/colored-logger.js +13 -9
- package/dist/modules/pipeline/utils/colored-logger.js.map +1 -1
- package/dist/providers/auth/antigravity-fingerprint.js +2 -3
- package/dist/providers/auth/antigravity-fingerprint.js.map +1 -1
- package/dist/providers/auth/antigravity-reauth-state.js +2 -3
- package/dist/providers/auth/antigravity-reauth-state.js.map +1 -1
- package/dist/providers/auth/antigravity-user-agent.js +2 -2
- package/dist/providers/auth/antigravity-user-agent.js.map +1 -1
- package/dist/providers/auth/antigravity-warmup.js +2 -3
- package/dist/providers/auth/antigravity-warmup.js.map +1 -1
- package/dist/providers/auth/deepseek-account-auth.js +4 -3
- package/dist/providers/auth/deepseek-account-auth.js.map +1 -1
- package/dist/providers/auth/deepseek-account-token-acquirer.js +3 -2
- package/dist/providers/auth/deepseek-account-token-acquirer.js.map +1 -1
- package/dist/providers/auth/oauth-auth.js +2 -3
- package/dist/providers/auth/oauth-auth.js.map +1 -1
- package/dist/providers/auth/oauth-lifecycle/path-resolver.js +6 -7
- package/dist/providers/auth/oauth-lifecycle/path-resolver.js.map +1 -1
- package/dist/providers/auth/oauth-lifecycle.js +4 -4
- package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
- package/dist/providers/auth/oauth-repair-cooldown.js +2 -3
- package/dist/providers/auth/oauth-repair-cooldown.js.map +1 -1
- package/dist/providers/auth/token-scanner/index.js +2 -3
- package/dist/providers/auth/token-scanner/index.js.map +1 -1
- package/dist/providers/auth/token-storage/token-file-resolver.js +8 -7
- package/dist/providers/auth/token-storage/token-file-resolver.js.map +1 -1
- package/dist/providers/auth/tokenfile-auth.js +5 -6
- package/dist/providers/auth/tokenfile-auth.js.map +1 -1
- package/dist/providers/core/config/camoufox-launcher.js +3 -4
- package/dist/providers/core/config/camoufox-launcher.js.map +1 -1
- package/dist/providers/core/config/provider-oauth-configs.js +2 -2
- package/dist/providers/core/config/provider-oauth-configs.js.map +1 -1
- package/dist/providers/core/hooks/hooks-integration.js +1 -1
- package/dist/providers/core/hooks/hooks-integration.js.map +1 -1
- package/dist/providers/core/runtime/deepseek-http-provider.js +2 -1
- package/dist/providers/core/runtime/deepseek-http-provider.js.map +1 -1
- package/dist/providers/core/utils/snapshot-writer.js +2 -1
- package/dist/providers/core/utils/snapshot-writer.js.map +1 -1
- package/dist/providers/profile/families/anthropic-profile.js +32 -0
- package/dist/providers/profile/families/anthropic-profile.js.map +1 -1
- package/dist/server/handlers/config-admin-handler.d.ts +1 -1
- package/dist/server/handlers/config-admin-handler.js +6 -6
- package/dist/server/handlers/config-admin-handler.js.map +1 -1
- package/dist/server/handlers/handler-response-utils.js +9 -4
- package/dist/server/handlers/handler-response-utils.js.map +1 -1
- package/dist/server/runtime/http-server/clock-runtime-hooks.d.ts +2 -0
- package/dist/server/runtime/http-server/clock-runtime-hooks.js +91 -0
- package/dist/server/runtime/http-server/clock-runtime-hooks.js.map +1 -0
- package/dist/server/runtime/http-server/daemon-admin/auth-handler.js +51 -13
- package/dist/server/runtime/http-server/daemon-admin/auth-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/auth-store.d.ts +1 -9
- package/dist/server/runtime/http-server/daemon-admin/auth-store.js +2 -18
- package/dist/server/runtime/http-server/daemon-admin/auth-store.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/control-handler.js +3 -3
- package/dist/server/runtime/http-server/daemon-admin/control-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js +2 -2
- package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/providers-handler-routing-utils.js +5 -4
- package/dist/server/runtime/http-server/daemon-admin/providers-handler-routing-utils.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin/providers-handler.js +3 -3
- package/dist/server/runtime/http-server/daemon-admin/providers-handler.js.map +1 -1
- package/dist/server/runtime/http-server/daemon-admin-routes.d.ts +2 -0
- package/dist/server/runtime/http-server/daemon-admin-routes.js +11 -8
- package/dist/server/runtime/http-server/daemon-admin-routes.js.map +1 -1
- package/dist/server/runtime/http-server/executor/client-injection-flow.js +9 -1
- package/dist/server/runtime/http-server/executor/client-injection-flow.js.map +1 -1
- package/dist/server/runtime/http-server/executor/provider-response-converter.js +119 -26
- package/dist/server/runtime/http-server/executor/provider-response-converter.js.map +1 -1
- package/dist/server/runtime/http-server/executor/request-retry-helpers.d.ts +1 -0
- package/dist/server/runtime/http-server/executor/request-retry-helpers.js +26 -0
- package/dist/server/runtime/http-server/executor/request-retry-helpers.js.map +1 -1
- package/dist/server/runtime/http-server/http-server-bootstrap.js +2 -3
- package/dist/server/runtime/http-server/http-server-bootstrap.js.map +1 -1
- package/dist/server/runtime/http-server/http-server-lifecycle.js +2 -0
- package/dist/server/runtime/http-server/http-server-lifecycle.js.map +1 -1
- package/dist/server/runtime/http-server/http-server-runtime-setup.js +2 -0
- package/dist/server/runtime/http-server/http-server-runtime-setup.js.map +1 -1
- package/dist/server/runtime/http-server/http-server-session-daemon.js +9 -299
- package/dist/server/runtime/http-server/http-server-session-daemon.js.map +1 -1
- package/dist/server/runtime/http-server/middleware.d.ts +7 -0
- package/dist/server/runtime/http-server/middleware.js +1 -1
- package/dist/server/runtime/http-server/middleware.js.map +1 -1
- package/dist/server/runtime/http-server/request-executor.js +36 -51
- package/dist/server/runtime/http-server/request-executor.js.map +1 -1
- package/dist/server/runtime/http-server/routes.js +10 -3
- package/dist/server/runtime/http-server/routes.js.map +1 -1
- package/dist/server/runtime/http-server/servertool-admin-state.d.ts +1 -0
- package/dist/server/runtime/http-server/servertool-admin-state.js +7 -2
- package/dist/server/runtime/http-server/servertool-admin-state.js.map +1 -1
- package/dist/server/runtime/http-server/session-client-route-utils.d.ts +1 -0
- package/dist/server/runtime/http-server/session-client-route-utils.js +49 -4
- package/dist/server/runtime/http-server/session-client-route-utils.js.map +1 -1
- package/dist/server/runtime/http-server/session-client-routes.d.ts +5 -1
- package/dist/server/runtime/http-server/session-client-routes.js +60 -30
- package/dist/server/runtime/http-server/session-client-routes.js.map +1 -1
- package/dist/server/runtime/http-server/session-dir.js +6 -12
- package/dist/server/runtime/http-server/session-dir.js.map +1 -1
- package/dist/server/runtime/http-server/stats-manager.js +4 -3
- package/dist/server/runtime/http-server/stats-manager.js.map +1 -1
- package/dist/server/utils/non-blocking-error-logger.js +2 -1
- package/dist/server/utils/non-blocking-error-logger.js.map +1 -1
- package/dist/server/utils/request-log-color.js +10 -3
- package/dist/server/utils/request-log-color.js.map +1 -1
- package/dist/server/utils/stage-logger.js +71 -9
- package/dist/server/utils/stage-logger.js.map +1 -1
- package/dist/token-daemon/history-store.js +2 -1
- package/dist/token-daemon/history-store.js.map +1 -1
- package/dist/token-daemon/leader-lock.js +2 -2
- package/dist/token-daemon/leader-lock.js.map +1 -1
- package/dist/token-daemon/quota-auth-issue.js +2 -4
- package/dist/token-daemon/quota-auth-issue.js.map +1 -1
- package/dist/token-daemon/server-utils.js +3 -4
- package/dist/token-daemon/server-utils.js.map +1 -1
- package/dist/token-daemon/token-daemon.js +6 -6
- package/dist/token-daemon/token-daemon.js.map +1 -1
- package/dist/token-daemon/token-utils.js +2 -1
- package/dist/token-daemon/token-utils.js.map +1 -1
- package/dist/token-portal/fingerprint-summary.js +2 -3
- package/dist/token-portal/fingerprint-summary.js.map +1 -1
- package/dist/token-portal/local-token-portal.js +1 -1
- package/dist/token-portal/local-token-portal.js.map +1 -1
- package/dist/utils/daemon-stop-intent.js +2 -2
- package/dist/utils/daemon-stop-intent.js.map +1 -1
- package/dist/utils/errorsamples.js +3 -1
- package/dist/utils/errorsamples.js.map +1 -1
- package/dist/utils/llms-engine-shadow.js +2 -2
- package/dist/utils/llms-engine-shadow.js.map +1 -1
- package/dist/utils/managed-server-pids.js +2 -2
- package/dist/utils/managed-server-pids.js.map +1 -1
- package/dist/utils/process-lifecycle-logger.js +2 -1
- package/dist/utils/process-lifecycle-logger.js.map +1 -1
- package/dist/utils/runtime-exit-forensics.js +2 -2
- package/dist/utils/runtime-exit-forensics.js.map +1 -1
- package/dist/utils/session-log-color.js +31 -5
- package/dist/utils/session-log-color.js.map +1 -1
- package/dist/utils/snapshot-writer.js +2 -1
- package/dist/utils/snapshot-writer.js.map +1 -1
- package/docs/CODEX_AND_CLAUDE_CODE.md +1 -1
- package/docs/CONFIG_ARCHITECTURE.md +7 -7
- package/docs/DAEMON_CONTROL_PLANE.md +2 -2
- package/docs/INSTALLATION_AND_QUICKSTART.md +2 -2
- package/docs/INSTRUCTION_MARKUP.md +2 -2
- package/docs/OAUTH.md +6 -6
- package/docs/PORTS.md +1 -1
- package/docs/PROVIDERS_BUILTIN.md +2 -2
- package/docs/QUOTA_MANAGER_V3.md +2 -2
- package/docs/ROUTING_POLICY_SCHEMA.md +1 -1
- package/docs/SERVERTOOL_CLOCK_DESIGN.md +1 -1
- package/docs/SERVERTOOL_PRE_COMMAND_HOOKS.md +4 -4
- package/docs/anthropic-request-golden-samples.md +4 -4
- package/docs/chat-glm-500-analysis.md +2 -2
- package/docs/chat-request-golden-samples.md +4 -4
- package/docs/codex-samples-replay.md +3 -3
- package/docs/daemon-admin-api-design.md +2 -2
- package/docs/daemon-admin-ui.html +9 -9
- package/docs/design/servertool-stopmessage-lifecycle.md +5 -0
- package/docs/golden-ci-library.md +8 -8
- package/docs/monitoring/Design.md +2 -2
- package/docs/multi-token-auth-guide.md +6 -6
- package/docs/oauth-authentication-guide.md +1 -1
- package/docs/oauth-iflow-implementation.md +2 -2
- package/docs/pipeline-routing-report.md +1 -1
- package/docs/plans/manager-daemon/PLAN.md +1 -1
- package/docs/plans/provider-config-v2-plan.md +8 -8
- package/docs/plans/provider-runtime-manager-plan.md +4 -4
- package/docs/provider-analysis.md +5 -5
- package/docs/provider-quota-design.md +2 -2
- package/docs/providers/antigravity-fingerprint-ua-warmup.md +5 -5
- package/docs/providers/antigravity-gemini-provider-compat.md +3 -3
- package/docs/providers/deepseek-web-provider-design.md +1 -1
- package/docs/providers/gemini-provider.md +1 -1
- package/docs/providers/provider-composite-testing.md +2 -2
- package/docs/providers/tabglm-claude-code-compat.md +1 -1
- package/docs/replay-evidence-iflow-400.txt +3 -3
- package/docs/reports/routing-classification-report.json +6 -6
- package/docs/reports/routing-classification-report.md +6 -6
- package/docs/reports/thinking-keywords-report.json +6 -6
- package/docs/responses/README.md +5 -5
- package/docs/responses-generic-provider.md +1 -1
- package/docs/responses-passthrough-provider-design.md +7 -7
- package/docs/routing-instructions.md +1 -1
- package/docs/token-daemon-preview.html +3 -3
- package/docs/token-refresh-daemon-plan.md +7 -7
- package/docs/verification/modelscope-verify.md +2 -2
- package/docs/verified-configs/README.md +2 -2
- package/docs/verified-configs/v0.45.0/README.md +5 -5
- package/docs/verified-configs/v0.45.0/merged-config.5521.json +3 -3
- package/docs/verified-configs/v0.45.0/merged-config.qwen-5522.json +3 -3
- package/package.json +3 -2
- package/scripts/anthropic-four-config-e2e.mjs +5 -5
- package/scripts/anthropic-toolcall.mjs +1 -1
- package/scripts/batch-toolcall-report.mjs +1 -1
- package/scripts/build-core.mjs +2 -7
- package/scripts/claude-e2e-listdir-all.sh +1 -1
- package/scripts/claude-e2e-listdir-per-config.sh +4 -4
- package/scripts/clean-safe.mjs +1 -1
- package/scripts/cleanup-beads-oversized-notes.mjs +182 -0
- package/scripts/config-core-compare.ts +1 -1
- package/scripts/ensure-llmswitch-mode.mjs +7 -1
- package/scripts/glm1210-curl-test.sh +1 -1
- package/scripts/install-release.sh +1 -1
- package/scripts/mock-provider/capture-from-configs.mjs +1 -1
- package/scripts/outbound-network-toolcall.mjs +2 -2
- package/scripts/outbound-regression-codex-samples.mjs +1 -1
- package/scripts/pack-mode.mjs +14 -1
- package/scripts/pack-rcc.mjs +9 -4
- package/scripts/provider-v2-smoke.mjs +3 -3
- package/scripts/publish-rcc.mjs +8 -3
- package/scripts/replay-recorded-toolcall.mjs +1 -2
- package/scripts/responses-fai-capture.mjs +1 -1
- package/scripts/responses-sse-capture.mjs +1 -1
- package/scripts/responses-sse-proxy.mjs +1 -1
- package/scripts/responses-sse-replay-golden.mjs +252 -111
- package/scripts/run-bg.sh +1 -1
- package/scripts/run-fg-gtimeout.sh +1 -1
- package/scripts/tests/antigravity-codex-sample-pipeline-compare.mjs +1 -1
- package/scripts/tests/antigravity-gemini-dryrun-compare.mjs +1 -1
- package/scripts/tests/responses-provider-dry-run.mjs +1 -1
- package/scripts/tests/virtual-router-health.mjs +1 -1
- package/scripts/update-models.mjs +2 -2
- package/scripts/v2-simple-monitor.mjs +1 -1
- package/scripts/vendor-core.mjs +12 -7
- package/scripts/verify-e2e-gemini-followup-sample.mjs +1 -1
- package/scripts/verify-e2e-toolcall.mjs +2 -2
- package/scripts/verify-health.mjs +2 -2
- package/scripts/verify-sse-loop.mjs +1 -1
- package/scripts/virtual-router-dryrun.mjs +2 -2
- package/scripts/virtual-router-shadow-v2-real.mjs +3 -3
- package/dist/daemon-admin-ui/assets/index-C8vP_c5E.js +0 -15
- package/docs/rccx-wasm-migration.md +0 -74
- package/scripts/compare-codex-rccx.mjs +0 -326
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
## 配置文件
|
|
48
48
|
|
|
49
49
|
### 1. 用户配置文件
|
|
50
|
-
`~/.
|
|
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
|
-
`~/.
|
|
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 ~/.
|
|
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 ~/.
|
|
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
|
-
`~/.
|
|
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": "~/.
|
|
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": "~/.
|
|
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/.
|
|
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": "~/.
|
|
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": "~/.
|
|
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/.
|
|
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.
|
|
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.
|
|
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 ~/.
|
|
25
|
-
* --passthrough-config ~/.
|
|
26
|
-
* --req-chat-resp-pass-config ~/.
|
|
27
|
-
* --req-pass-resp-chat-config ~/.
|
|
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 ~/.
|
|
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(), '.
|
|
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(), '.
|
|
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');
|
package/scripts/build-core.mjs
CHANGED
|
@@ -92,13 +92,8 @@ if (!fs.existsSync(proj)) {
|
|
|
92
92
|
process.exit(0);
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
-
//
|
|
96
|
-
|
|
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/.
|
|
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 ~/.
|
|
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/.
|
|
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 ~/.
|
|
60
|
-
run_one "$HOME/.
|
|
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"
|
package/scripts/clean-safe.mjs
CHANGED
|
@@ -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(), '.
|
|
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 (
|
|
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/.
|
|
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/.
|
|
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, '.
|
|
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 ~/.
|
|
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(), '.
|
|
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(), '.
|
|
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(
|
package/scripts/pack-mode.mjs
CHANGED
|
@@ -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
|
|
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
|
}
|
package/scripts/pack-rcc.mjs
CHANGED
|
@@ -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(
|
|
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
|
|
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
|
|
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
|
|
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(), '.
|
|
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 ~/.
|
|
21
|
+
console.error('no provider definition found in ~/.rcc/config.json');
|
|
22
22
|
process.exit(2);
|
|
23
23
|
}
|
|
24
24
|
const [providerId, providerConfig] = glmEntry;
|
package/scripts/publish-rcc.mjs
CHANGED
|
@@ -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(
|
|
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
|
|
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
|
|
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(), '.
|
|
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
|
-
|