@jsonstudio/rcc 0.90.323 → 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/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 +23 -13
- 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/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 +11 -9
- 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/docs/daemon-admin-ui.html +9 -9
- package/dist/index.js +7 -5
- 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-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/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/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/runtime/http-server/daemon-admin/auth-store.js +2 -2
- 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/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/request-executor.js +0 -49
- package/dist/server/runtime/http-server/request-executor.js.map +1 -1
- package/dist/server/runtime/http-server/routes.js +1 -1
- package/dist/server/runtime/http-server/routes.js.map +1 -1
- package/dist/server/runtime/http-server/servertool-admin-state.js +2 -2
- package/dist/server/runtime/http-server/servertool-admin-state.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 +2 -1
- 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/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/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 +2 -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/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/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/provider-v2-smoke.mjs +3 -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/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
|
@@ -720,8 +720,8 @@
|
|
|
720
720
|
<div class="title">
|
|
721
721
|
<h1>RouteCodex Daemon Admin</h1>
|
|
722
722
|
<p>
|
|
723
|
-
Writes to <span class="mono">~/.
|
|
724
|
-
first visit will ask you to set one (stored at <span class="mono">~/.
|
|
723
|
+
Writes to <span class="mono">~/.rcc/config.json</span>. This UI requires an admin password:
|
|
724
|
+
first visit will ask you to set one (stored at <span class="mono">~/.rcc/login</span>), then you login with it.
|
|
725
725
|
</p>
|
|
726
726
|
</div>
|
|
727
727
|
<div class="statusline">
|
|
@@ -1039,7 +1039,7 @@
|
|
|
1039
1039
|
<input
|
|
1040
1040
|
id="apikeyValueInput"
|
|
1041
1041
|
type="password"
|
|
1042
|
-
placeholder="will be written to ~/.
|
|
1042
|
+
placeholder="will be written to ~/.rcc/auth/*.key"
|
|
1043
1043
|
style="flex: 1; min-width: 260px;"
|
|
1044
1044
|
/>
|
|
1045
1045
|
</div>
|
|
@@ -1074,7 +1074,7 @@
|
|
|
1074
1074
|
<input
|
|
1075
1075
|
id="cookieFileInput"
|
|
1076
1076
|
type="text"
|
|
1077
|
-
placeholder="~/.
|
|
1077
|
+
placeholder="~/.rcc/auth/iflow-work.cookie"
|
|
1078
1078
|
style="flex: 1; min-width: 280px;"
|
|
1079
1079
|
/>
|
|
1080
1080
|
</div>
|
|
@@ -1171,7 +1171,7 @@
|
|
|
1171
1171
|
<div class="card" style="box-shadow:none;">
|
|
1172
1172
|
<p class="section-title">Stats (historical)</p>
|
|
1173
1173
|
<p class="section-sub">
|
|
1174
|
-
Aggregated from <span class="mono">~/.
|
|
1174
|
+
Aggregated from <span class="mono">~/.rcc/logs/provider-stats.jsonl</span> (best-effort).
|
|
1175
1175
|
</p>
|
|
1176
1176
|
<div class="notice mono" id="statsHistoricalTotalsBox" style="white-space: pre-wrap;"></div>
|
|
1177
1177
|
<div class="table-wrap" style="margin-top: 10px;">
|
|
@@ -1233,7 +1233,7 @@
|
|
|
1233
1233
|
<p class="section-title">Token usage (session + historical)</p>
|
|
1234
1234
|
<p class="section-sub">
|
|
1235
1235
|
Session stats reset on server restart. Historical totals are aggregated from
|
|
1236
|
-
<span class="mono">~/.
|
|
1236
|
+
<span class="mono">~/.rcc/logs/provider-stats.jsonl</span> (best-effort).
|
|
1237
1237
|
</p>
|
|
1238
1238
|
<div class="row" style="margin-bottom: 10px;">
|
|
1239
1239
|
<button id="refreshTokensBtn" class="primary">Refresh</button>
|
|
@@ -1263,7 +1263,7 @@
|
|
|
1263
1263
|
<div class="card" style="box-shadow:none;">
|
|
1264
1264
|
<p class="section-title">Auth Inventory</p>
|
|
1265
1265
|
<p class="section-sub">
|
|
1266
|
-
Token files + API key authfiles in <span class="mono">~/.
|
|
1266
|
+
Token files + API key authfiles in <span class="mono">~/.rcc/auth</span>.
|
|
1267
1267
|
</p>
|
|
1268
1268
|
<div class="row" style="margin-bottom: 10px;">
|
|
1269
1269
|
<button id="refreshCredentialsBtn" class="primary">Refresh</button>
|
|
@@ -2292,7 +2292,7 @@
|
|
|
2292
2292
|
type: "iflow",
|
|
2293
2293
|
baseURL: "https://apis.iflow.cn/v1",
|
|
2294
2294
|
compatibilityProfile: "chat:iflow",
|
|
2295
|
-
auth: { type: "iflow-cookie", cookieFile: "~/.
|
|
2295
|
+
auth: { type: "iflow-cookie", cookieFile: "~/.rcc/auth/iflow-work.cookie" },
|
|
2296
2296
|
models: {}
|
|
2297
2297
|
};
|
|
2298
2298
|
}
|
|
@@ -3216,7 +3216,7 @@
|
|
|
3216
3216
|
if (authMode === "cookie") {
|
|
3217
3217
|
base.auth = {
|
|
3218
3218
|
type: "iflow-cookie",
|
|
3219
|
-
cookieFile: ($("cookieFileInput").value || "").trim() || "~/.
|
|
3219
|
+
cookieFile: ($("cookieFileInput").value || "").trim() || "~/.rcc/auth/iflow.cookie"
|
|
3220
3220
|
};
|
|
3221
3221
|
}
|
|
3222
3222
|
if (authMode === "oauth") {
|
|
@@ -45,6 +45,11 @@ Design goals:
|
|
|
45
45
|
- Normal servertools (e.g. search/vision) may use `reenterPipeline`.
|
|
46
46
|
- `stopMessage/clock/continue_execution` must use client injection dispatcher only.
|
|
47
47
|
|
|
48
|
+
2. Continue-execution stripping:
|
|
49
|
+
- `continue_execution` 的 tool_call 对客户端必须透明;响应侧在 chat process 的
|
|
50
|
+
`resp_process_stage2_finalize` 统一剥离该 tool_call,并将对应 choice 的
|
|
51
|
+
`finish_reason` 从 `tool_calls` 修正为 `stop`。
|
|
52
|
+
|
|
48
53
|
2. No fallback:
|
|
49
54
|
- No old session-based fallback compare.
|
|
50
55
|
- No daemon-only fallback for stopMessage matching.
|
|
@@ -28,10 +28,10 @@ roundtrip/工具校验,而不需要访问真实 provider。
|
|
|
28
28
|
命令会按照下面的顺序执行:
|
|
29
29
|
|
|
30
30
|
1. `node scripts/tools/capture-provider-goldens.mjs --custom-only --update-golden`
|
|
31
|
-
- 优先读取 `~/.
|
|
31
|
+
- 优先读取 `~/.rcc/golden_samples/new/<entry>/<provider>/`;
|
|
32
32
|
- 若用户目录缺失,则自动回退到 `samples/ci-goldens/...`;
|
|
33
33
|
- 最后才会使用 `samples/chat-blackbox/**/request-basic.json` 做最小回放。
|
|
34
|
-
- 结果写入 `~/.
|
|
34
|
+
- 结果写入 `~/.rcc/golden_samples/provider_golden_samples/**`,供 Provider
|
|
35
35
|
单测与 mock 回放使用。
|
|
36
36
|
2. `node scripts/mock-provider/run-regressions.mjs`
|
|
37
37
|
- 使用仓库内 `samples/mock-provider/_registry` 的样本,通过 mock provider
|
|
@@ -39,28 +39,28 @@ roundtrip/工具校验,而不需要访问真实 provider。
|
|
|
39
39
|
- 默认启用 `ROUTECODEX_MOCK_ENTRY_FILTER=all`,确保 chat/responses/anthropic
|
|
40
40
|
都被验证。
|
|
41
41
|
|
|
42
|
-
如果检测到 `~/.
|
|
42
|
+
如果检测到 `~/.rcc/codex-samples`,脚本会提示可以运行
|
|
43
43
|
`node scripts/mock-provider/capture-from-configs.mjs` 将真实请求转成 mock 回放样本。
|
|
44
|
-
该命令会根据本地 `~/.
|
|
45
|
-
`~/.
|
|
44
|
+
该命令会根据本地 `~/.rcc/provider/**/config*.json` 与
|
|
45
|
+
`~/.rcc/golden_samples/new/**` 生成新的 `samples/mock-provider/...`
|
|
46
46
|
目录,并刷新 `_registry/index.json`。随后再次执行 `npm run test:golden` 即可把
|
|
47
47
|
“真实” provider 行为也纳入回归。
|
|
48
48
|
|
|
49
49
|
### 如何补充新的 provider 样本
|
|
50
50
|
|
|
51
51
|
1. 在本地 `routecodex` 服务上真实跑通一次请求,确认
|
|
52
|
-
`~/.
|
|
52
|
+
`~/.rcc/golden_samples/new/<entry>/<provider>/request.sample.json` 已生成。
|
|
53
53
|
2. 运行 `npm run sync:ci-goldens`(或直接执行
|
|
54
54
|
`node scripts/tools/sync-ci-goldens.mjs --entry <entry> --provider <id>`)把刚产生的
|
|
55
55
|
样本复制到 `samples/ci-goldens/<entry>/<provider>/`,脚本会自动生成/刷新 `meta.json`
|
|
56
56
|
并用 `source: "ci-goldens"` 标识。
|
|
57
57
|
3. 运行 `npm run test:golden`,确认新的样本能够被
|
|
58
58
|
`capture-provider-goldens.mjs` 消费并写入
|
|
59
|
-
`~/.
|
|
59
|
+
`~/.rcc/golden_samples/provider_golden_samples/<provider>/<entry>/`。
|
|
60
60
|
4. 如需把同一份请求加入 mock provider 回放,可执行
|
|
61
61
|
`node scripts/mock-provider/capture-from-configs.mjs --filter <providerId>`,
|
|
62
62
|
该命令会复用刚才的 `request.sample` 生成 `samples/mock-provider/...` 记录。
|
|
63
63
|
|
|
64
64
|
> 注意:CI goldens 只存储对齐 chat 入口输入字段的最终 JSON,不包含任何密钥或本地路径。
|
|
65
65
|
> 如需测试特定机密字段,请在本地运行 `capture-provider-goldens` 并利用私有
|
|
66
|
-
> `~/.
|
|
66
|
+
> `~/.rcc/golden_samples/new/**`,不要把敏感样本提交到仓库。
|
|
@@ -19,7 +19,7 @@ This document describes a passive monitoring and replay system for RouteCodex.
|
|
|
19
19
|
- ReplayExecutor (future): replay `response.json` or `stream-events.jsonl`
|
|
20
20
|
|
|
21
21
|
## Storage Layout
|
|
22
|
-
Root: `~/.
|
|
22
|
+
Root: `~/.rcc/monitor/sessions/<YYYYMMDD>/<protocol>/<reqId>/`
|
|
23
23
|
|
|
24
24
|
- `meta.json` — meta + routing snapshot + redaction flags
|
|
25
25
|
- `request.json` — original input (protocol‑native)
|
|
@@ -45,7 +45,7 @@ Root: `~/.routecodex/monitor/sessions/<YYYYMMDD>/<protocol>/<reqId>/`
|
|
|
45
45
|
|
|
46
46
|
```bash
|
|
47
47
|
npm run build
|
|
48
|
-
node scripts/virtualrouter-dry-run-matrix.mjs --config ~/.
|
|
48
|
+
node scripts/virtualrouter-dry-run-matrix.mjs --config ~/.rcc/config/verified_0.46.32/multi-provider.json
|
|
49
49
|
```
|
|
50
50
|
|
|
51
51
|
## Integration Plan (Phased)
|
|
@@ -16,28 +16,28 @@ The `alias` part is optional and ignored by the system - it's just for your refe
|
|
|
16
16
|
|
|
17
17
|
## Automatic Discovery
|
|
18
18
|
|
|
19
|
-
The system automatically scans `~/.
|
|
19
|
+
The system automatically scans `~/.rcc/auth/` for token files matching the pattern and creates multiple provider instances. No manual configuration needed.
|
|
20
20
|
|
|
21
21
|
## Authentication Commands
|
|
22
22
|
|
|
23
23
|
### Authenticate specific token:
|
|
24
24
|
```bash
|
|
25
25
|
# Token 1
|
|
26
|
-
IFLOW_TOKEN_FILE="$HOME/.
|
|
26
|
+
IFLOW_TOKEN_FILE="$HOME/.rcc/auth/iflow-oauth-1-primary.json" node scripts/auth-iflow-token-direct.mjs
|
|
27
27
|
|
|
28
28
|
# Token 2
|
|
29
|
-
IFLOW_TOKEN_FILE="$HOME/.
|
|
29
|
+
IFLOW_TOKEN_FILE="$HOME/.rcc/auth/iflow-oauth-2-backup.json" node scripts/auth-iflow-token-direct.mjs
|
|
30
30
|
```
|
|
31
31
|
|
|
32
32
|
### Manual authentication (if device flow fails):
|
|
33
33
|
```bash
|
|
34
|
-
IFLOW_TOKEN_FILE="$HOME/.
|
|
34
|
+
IFLOW_TOKEN_FILE="$HOME/.rcc/auth/iflow-oauth-1-primary.json" node scripts/auth-iflow-manual.mjs
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
### Delete and re-authenticate:
|
|
38
38
|
```bash
|
|
39
|
-
rm ~/.
|
|
40
|
-
IFLOW_TOKEN_FILE="$HOME/.
|
|
39
|
+
rm ~/.rcc/auth/iflow-oauth-1-primary.json
|
|
40
|
+
IFLOW_TOKEN_FILE="$HOME/.rcc/auth/iflow-oauth-1-primary.json" node scripts/auth-iflow-token-direct.mjs
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
## How It Works
|
|
@@ -118,7 +118,7 @@ const provider = new ChatHttpProvider(iflowConfig, dependencies);
|
|
|
118
118
|
await provider.initialize(); // → 打开浏览器 → 授权 → 获取 API Key
|
|
119
119
|
|
|
120
120
|
// 3. 后续使用直接读取本地 token 文件
|
|
121
|
-
// ~/.
|
|
121
|
+
// ~/.rcc/auth/iflow-oauth.json 包含:
|
|
122
122
|
// {
|
|
123
123
|
// "access_token": "...",
|
|
124
124
|
// "refresh_token": "...",
|
|
@@ -102,7 +102,7 @@ const provider = new ChatHttpProvider(iflowConfig, dependencies);
|
|
|
102
102
|
await provider.initialize(); // → 打开浏览器 → 授权 → 获取 API Key
|
|
103
103
|
|
|
104
104
|
// 3. 后续使用直接读取本地 token 文件
|
|
105
|
-
// ~/.
|
|
105
|
+
// ~/.rcc/auth/iflow-oauth.json 包含:
|
|
106
106
|
// {
|
|
107
107
|
// "access_token": "...",
|
|
108
108
|
// "refresh_token": "...",
|
|
@@ -140,7 +140,7 @@ const response = await provider.processIncoming({
|
|
|
140
140
|
|
|
141
141
|
```bash
|
|
142
142
|
# 测试 OAuth 流程
|
|
143
|
-
node -e "const { TokenFileAuthProvider } = require('./dist/providers/auth/tokenfile-auth.js'); const provider = new TokenFileAuthProvider({type: 'oauth', tokenFile: '~/.
|
|
143
|
+
node -e "const { TokenFileAuthProvider } = require('./dist/providers/auth/tokenfile-auth.js'); const provider = new TokenFileAuthProvider({type: 'oauth', tokenFile: '~/.rcc/auth/iflow-oauth.json'}); provider.initialize().then(() => console.log('✅ iFlow OAuth working:', provider.getStatus()));"
|
|
144
144
|
|
|
145
145
|
# 测试 API Key 提取
|
|
146
146
|
node -e "const { fetchIFlowUserInfo } = require('./dist/providers/auth/iflow-userinfo-helper.js'); fetchIFlowUserInfo('test_token').catch(e => console.log('✅ Error handling working:', e.message));"
|
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
|
|
81
81
|
## 配置情况
|
|
82
82
|
|
|
83
|
-
- 用户 `~/.
|
|
83
|
+
- 用户 `~/.rcc/config.json`(或 `ROUTECODEX_CONFIG_PATH` 指定的文件)由 `bootstrapVirtualRouterConfig` 直接解析,得到 `virtualRouter` + `targetRuntime`,HTTP 服务按该结果构造 Hub Pipeline 与 Provider。
|
|
84
84
|
- OpenAI Router 中的 `targetUrl` 由构造参数/默认值直接决定,并非来自 `modules.json`:
|
|
85
85
|
- `src/server/protocol-handler.ts:89`
|
|
86
86
|
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
## 模块划分
|
|
13
13
|
|
|
14
14
|
- `TokenManager`(模块 id: `token`)
|
|
15
|
-
- 继承现有 token daemon 职责:监控 `~/.
|
|
15
|
+
- 继承现有 token daemon 职责:监控 `~/.rcc/auth/`、刷新 OAuth token、触发重新认证。
|
|
16
16
|
- API:供 CLI / HTTP server 查询 token 状态与触发刷新。
|
|
17
17
|
- 通过 host 级 leader lock(基于 PID 的锁文件)保证 **全局仅有一个 Token 刷新器**(server 内置 TokenManager 与外部 `token-daemon` 互斥)。
|
|
18
18
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
## 目标与约束
|
|
4
4
|
|
|
5
5
|
- 将现有「virtualrouter 内联 providers + routing」改为:
|
|
6
|
-
- Provider 配置:按 provider 维度拆分到 `~/.
|
|
6
|
+
- Provider 配置:按 provider 维度拆分到 `~/.rcc/provider/<id>/config.v2.json`。
|
|
7
7
|
- Routing 配置:保留在主配置(或单独 routing 文件)中,仅描述 route → pool → providerKey 关系。
|
|
8
8
|
- v2 配置通过 `version: "2.0.0"` 与 v1 完全区分,不影响已有 v1 配置(`config.v1.json` / `config.json.virtualrouter.providers`)。
|
|
9
9
|
- 正式运行路径**不做 v1/v2 兼容合并**:v2 模式只读 provider v2 配置;v1 配置仅供迁移脚本和回溯分析使用。
|
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
|
|
16
16
|
1. 顶层 Provider 目录
|
|
17
17
|
|
|
18
|
-
- 路径:`~/.
|
|
18
|
+
- 路径:`~/.rcc/provider`
|
|
19
19
|
- 启动行为:
|
|
20
20
|
- 若目录不存在:启动时自动创建。
|
|
21
21
|
- 若存在:每个子目录代表一个 provider 实例(`<providerId>` 或 `<providerId>-<profile>`)。
|
|
22
22
|
|
|
23
|
-
2. 单个 Provider 目录结构(示例:`~/.
|
|
23
|
+
2. 单个 Provider 目录结构(示例:`~/.rcc/provider/antigravity`)
|
|
24
24
|
|
|
25
25
|
- 静态配置(v2):
|
|
26
26
|
- 文件:`config.v2.json`
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"auth": {
|
|
36
36
|
"mode": "oauth",
|
|
37
37
|
"oauthProviderId": "antigravity",
|
|
38
|
-
"tokenFile": "~/.
|
|
38
|
+
"tokenFile": "~/.rcc/auth/antigravity-oauth-1-geetasamodgeetasamoda.json"
|
|
39
39
|
},
|
|
40
40
|
"models": [
|
|
41
41
|
{
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
2. VirtualRouterInput 组合逻辑(v2 模式)
|
|
92
92
|
|
|
93
93
|
- 启动时步骤:
|
|
94
|
-
1. 扫描 `~/.
|
|
94
|
+
1. 扫描 `~/.rcc/provider`:
|
|
95
95
|
- 如不存在则创建空目录。
|
|
96
96
|
- 对每个子目录:若存在 `config.v2.json`:解析为 `ProviderConfigV2`;否则跳过(无隐式迁移)。
|
|
97
97
|
2. 从 `config.json` / routing 文件读取 routing 配置。
|
|
@@ -130,7 +130,7 @@
|
|
|
130
130
|
- 预览:
|
|
131
131
|
- 在终端打印拟写入的 `config.v2.json`,高亮关键字段。
|
|
132
132
|
- 确认:
|
|
133
|
-
- 用户确认后写入/覆盖 `~/.
|
|
133
|
+
- 用户确认后写入/覆盖 `~/.rcc/provider/<id>/config.v2.json`。
|
|
134
134
|
|
|
135
135
|
3. list/delete 行为
|
|
136
136
|
|
|
@@ -139,7 +139,7 @@
|
|
|
139
139
|
- delete:
|
|
140
140
|
- 询问确认后:
|
|
141
141
|
- 仅删除 `config.v2.json`(保留 runtime-state 调试),或
|
|
142
|
-
- 删除整个 `~/.
|
|
142
|
+
- 删除整个 `~/.rcc/provider/<id>` 目录(可作为高级选项,默认不做)。
|
|
143
143
|
|
|
144
144
|
---
|
|
145
145
|
|
|
@@ -152,7 +152,7 @@
|
|
|
152
152
|
- 定义 `config.v2.json` 的 TypeScript 接口与基础校验逻辑。
|
|
153
153
|
|
|
154
154
|
2. 阶段 2:Provider v2 loader(只读,不接入 runtime)
|
|
155
|
-
- 实现扫描 `~/.
|
|
155
|
+
- 实现扫描 `~/.rcc/provider` 的 ProviderConfigV2 loader(**只读取显式 `config.v2.json`**,不做自动迁移)。
|
|
156
156
|
- 编写单元测试:确保 loader 对合法 v2 配置的读取行为稳定、可预期;迁移逻辑由单独脚本负责。
|
|
157
157
|
|
|
158
158
|
3. 阶段 3:Routing loader 与 VirtualRouterInput 组合器
|
|
@@ -71,10 +71,10 @@ interface ProviderRuntimeState {
|
|
|
71
71
|
type ProviderRuntimeTable = Map<string, ProviderRuntimeState>; // key = providerKey
|
|
72
72
|
```
|
|
73
73
|
- 磁盘持久化:
|
|
74
|
-
- 全局快照(可选):`~/.
|
|
74
|
+
- 全局快照(可选):`~/.rcc/state/providers/<serverId>/providers.jsonl`
|
|
75
75
|
- 每 provider 本地状态(推荐):
|
|
76
|
-
- `~/.
|
|
77
|
-
- `~/.
|
|
76
|
+
- `~/.rcc/provider/<id>/runtime-state.json`
|
|
77
|
+
- `~/.rcc/provider/<id>/events.jsonl`(ProviderErrorEvent / 手动操作日志)
|
|
78
78
|
- TTL 约束:
|
|
79
79
|
- 所有 `cooldownExpiresAt` / `blacklistExpiresAt` 必须**硬性截断**在 24 小时以内:
|
|
80
80
|
- 写入前:`expiresAt = min(now + requestedTtl, now + 24h)`。
|
|
@@ -179,7 +179,7 @@ Provider runtime 可以在发起请求前调用 `isRoutable` 做一次最终检
|
|
|
179
179
|
|
|
180
180
|
1. Server 启动时:
|
|
181
181
|
- ProviderRuntimeManager:
|
|
182
|
-
- 扫描 `~/.
|
|
182
|
+
- 扫描 `~/.rcc/provider/*/runtime-state.json`。
|
|
183
183
|
- 合并为全局 `ProviderRuntimeTable`,丢弃所有 `expiresAt <= now` 的条目。
|
|
184
184
|
- Virtual Router Engine:
|
|
185
185
|
- 通过注入的 `ProviderRuntimeView` 在首次构造时就能看到恢复后的状态。
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
▼
|
|
40
40
|
┌─────────────────────────────────────────────────────────────────┐
|
|
41
41
|
│ 3. Provider 配置生成 (writeProviderV2) │
|
|
42
|
-
│ 位置: ~/.
|
|
42
|
+
│ 位置: ~/.rcc/provider/{providerId}/config.v2.json │
|
|
43
43
|
│ │
|
|
44
44
|
│ 配置结构: │
|
|
45
45
|
│ { │
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
▼
|
|
60
60
|
┌─────────────────────────────────────────────────────────────────┐
|
|
61
61
|
│ 4. 主配置生成 (buildV2ConfigObject) │
|
|
62
|
-
│ 位置: ~/.
|
|
62
|
+
│ 位置: ~/.rcc/config.json │
|
|
63
63
|
│ │
|
|
64
64
|
│ 配置结构: │
|
|
65
65
|
│ { │
|
|
@@ -119,7 +119,7 @@ routecodex init --providers openai,qwen --default-provider qwen --force
|
|
|
119
119
|
1. **创建 Provider 配置目录**:
|
|
120
120
|
|
|
121
121
|
```bash
|
|
122
|
-
mkdir -p ~/.
|
|
122
|
+
mkdir -p ~/.rcc/provider/myprovider
|
|
123
123
|
```
|
|
124
124
|
|
|
125
125
|
2. **创建 config.v2.json**:
|
|
@@ -198,7 +198,7 @@ routecodex provider doctor myprovider
|
|
|
198
198
|
- Provider 鉴权类型对照表
|
|
199
199
|
|
|
200
200
|
2. **Provider 目录结构** (README.md 第 142-144 行):
|
|
201
|
-
- `~/.
|
|
201
|
+
- `~/.rcc/provider/<providerId>/config.v2.json`
|
|
202
202
|
|
|
203
203
|
3. **Provider 类型文档**:
|
|
204
204
|
- `docs/PROVIDER_TYPES.md` - Provider 类型说明
|
|
@@ -264,7 +264,7 @@ routecodex provider validate myprovider
|
|
|
264
264
|
|
|
265
265
|
#### A. Provider Catalog 扩展
|
|
266
266
|
|
|
267
|
-
- [ ] 支持自定义 catalog 扩展 (`~/.
|
|
267
|
+
- [ ] 支持自定义 catalog 扩展 (`~/.rcc/provider-catalog.json`)
|
|
268
268
|
- [ ] 支持从远程 URL 加载 catalog
|
|
269
269
|
- [ ] catalog 版本管理和更新检查
|
|
270
270
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
## 1. 文件结构
|
|
6
6
|
|
|
7
|
-
- 根目录:`~/.
|
|
7
|
+
- 根目录:`~/.rcc/quota/`
|
|
8
8
|
- `provider-quota.json`:当前生效的 quota 快照(virtual-router 只读)。
|
|
9
9
|
- `provider-errors.ndjson`:错误事件流水(daemon 可选使用,用于恢复 / 调试)。
|
|
10
10
|
|
|
@@ -134,7 +134,7 @@
|
|
|
134
134
|
### Phase 4:virtual-router 接线(可通过 feature flag 控制)
|
|
135
135
|
|
|
136
136
|
- 在 virtual-router 构建 provider 池时:
|
|
137
|
-
- 可选读取 `~/.
|
|
137
|
+
- 可选读取 `~/.rcc/quota/provider-quota.json`:
|
|
138
138
|
- 过滤 `inPool !== true` 或 `cooldownUntil/blacklistUntil > now` 的 provider。
|
|
139
139
|
- 按 `priorityTier` 做 tier 调度。
|
|
140
140
|
- 初期通过环境变量开启(例如 `ROUTECODEX_QUOTA_ENABLED=1`),待稳定后再作为默认路径。
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
## 0) 你需要知道的文件/目录/入口
|
|
10
10
|
|
|
11
|
-
### 关键目录(默认都在 `~/.
|
|
11
|
+
### 关键目录(默认都在 `~/.rcc/`)
|
|
12
12
|
|
|
13
13
|
- OAuth token:`auth/antigravity-oauth-*.json`
|
|
14
14
|
- Camoufox profile:`camoufox-profiles/rc-gemini.<alias>/...`
|
|
@@ -54,7 +54,7 @@ RouteCodex 的版本号来源(从高到低):
|
|
|
54
54
|
1. `ROUTECODEX_ANTIGRAVITY_USER_AGENT` / `RCC_ANTIGRAVITY_USER_AGENT`(完全覆盖)
|
|
55
55
|
2. `ROUTECODEX_ANTIGRAVITY_UA_VERSION` / `RCC_ANTIGRAVITY_UA_VERSION`
|
|
56
56
|
3. 远程拉取(可通过 `ROUTECODEX_ANTIGRAVITY_UA_DISABLE_REMOTE=1` 禁用)
|
|
57
|
-
4. `~/.
|
|
57
|
+
4. `~/.rcc/state/antigravity-ua-version.json`
|
|
58
58
|
5. 兜底版本(仅保证“有值”,不保证不过期)
|
|
59
59
|
|
|
60
60
|
### 修复步骤
|
|
@@ -64,7 +64,7 @@ RouteCodex 的版本号来源(从高到低):
|
|
|
64
64
|
- `routecodex oauth antigravity-auto <token-selector-or-path>`
|
|
65
65
|
- 或批量:`routecodex oauth reauth-required`
|
|
66
66
|
3. 如果 Google 提示需要二次验证(账户风控页),用对应 alias 的 profile 打开浏览器完成验证(“养号/解封”):
|
|
67
|
-
- `rcc camoufox ~/.
|
|
67
|
+
- `rcc camoufox ~/.rcc/auth/antigravity-oauth-<alias>.json --url '<verify_url>'`
|
|
68
68
|
|
|
69
69
|
> 关键点:必须用 **同一个 alias 的 Camoufox profile** 打开验证页,否则容易造成“验证通过但指纹漂移 → 继续 403”。
|
|
70
70
|
|
|
@@ -105,7 +105,7 @@ RouteCodex 的版本号来源(从高到低):
|
|
|
105
105
|
- `chat:gemini` 不会跑 `gemini_cli_request_wrap`(因此不会做历史 `thoughtSignature` 注入)
|
|
106
106
|
- Antigravity 必须用 `chat:gemini-cli`(Cloud Code Assist wrapper 对齐 + signature 注入)
|
|
107
107
|
|
|
108
|
-
修复点:确保你的用户配置中(`~/.
|
|
108
|
+
修复点:确保你的用户配置中(`~/.rcc/config.json`):
|
|
109
109
|
|
|
110
110
|
```jsonc
|
|
111
111
|
{
|
|
@@ -143,7 +143,7 @@ RouteCodex 的版本号来源(从高到低):
|
|
|
143
143
|
> 这个验证不依赖“你是否真的有 quota”;只要 upstream 在某次响应里下发过 signature,后续注入就应当可见。
|
|
144
144
|
|
|
145
145
|
### 如何确认 compat profile 真的生效
|
|
146
|
-
用 `--snap` 或 dev 默认快照(`~/.
|
|
146
|
+
用 `--snap` 或 dev 默认快照(`~/.rcc/codex-samples/...`)检查 pipeline stage8:
|
|
147
147
|
- `chat_process.req.stage8.outbound.compat.json` 里必须出现 `chat:gemini-cli`
|
|
148
148
|
- 如果你看到的是 `chat:gemini`,说明 profile 仍然配错(很容易复发“第一次 OK,第二次 429”)
|
|
149
149
|
|
|
@@ -172,14 +172,14 @@ antigravity/<version> <os>/<arch>
|
|
|
172
172
|
1. 显式 UA:`ROUTECODEX_ANTIGRAVITY_USER_AGENT` / `RCC_ANTIGRAVITY_USER_AGENT`(完全覆盖)
|
|
173
173
|
2. 显式版本号:`ROUTECODEX_ANTIGRAVITY_UA_VERSION` / `RCC_ANTIGRAVITY_UA_VERSION`
|
|
174
174
|
3. 远程拉取:`VERSION_URL`,失败时回退 `CHANGELOG_URL`(可用 `ROUTECODEX_ANTIGRAVITY_UA_DISABLE_REMOTE=1` 禁用)
|
|
175
|
-
4. 本地磁盘 cache:`~/.
|
|
175
|
+
4. 本地磁盘 cache:`~/.rcc/state/antigravity-ua-version.json`
|
|
176
176
|
5. 最后兜底:`KNOWN_STABLE_VERSION`(当前 `4.1.24`,对齐 Antigravity-Manager)
|
|
177
177
|
|
|
178
178
|
### 4.3 `<os>/<arch>` suffix 如何从指纹推断(并且为何禁 linux)
|
|
179
179
|
|
|
180
180
|
实现位置:`src/providers/auth/antigravity-fingerprint.ts`
|
|
181
181
|
|
|
182
|
-
- 指纹文件:`~/.
|
|
182
|
+
- 指纹文件:`~/.rcc/camoufox-fp/<profileId>.json`
|
|
183
183
|
- 从 `CAMOU_CONFIG_1` 的 `navigator.*` 字段推断:
|
|
184
184
|
- `windows|macos|linux`
|
|
185
185
|
- `amd64|aarch64`
|
|
@@ -191,7 +191,7 @@ RouteCodex 约束:
|
|
|
191
191
|
|
|
192
192
|
实现位置:`src/providers/core/config/camoufox-launcher.ts`
|
|
193
193
|
|
|
194
|
-
- 每个 alias 都对应一个稳定 profileId(目录在 `~/.
|
|
194
|
+
- 每个 alias 都对应一个稳定 profileId(目录在 `~/.rcc/camoufox-profiles/`)。
|
|
195
195
|
- `gemini-cli` 与 `antigravity` 共享同一“指纹家族(gemini)”,因此同 alias 在两者之间共享 profileId(避免一个账号跑出两套指纹)。
|
|
196
196
|
- OS policy:对 `(providerFamily, alias)` 做稳定 hash,把不同 alias 分布到 `windows/macos`,并**严格禁止 linux**。
|
|
197
197
|
|
|
@@ -77,8 +77,8 @@ test('protocol mismatch fails fast', async () => {
|
|
|
77
77
|
```
|
|
78
78
|
npm run build
|
|
79
79
|
node scripts/pipeline-dry-run.mjs \
|
|
80
|
-
--config ~/.
|
|
81
|
-
--samples ~/.
|
|
80
|
+
--config ~/.rcc/config.json \
|
|
81
|
+
--samples ~/.rcc/codex-samples \
|
|
82
82
|
--out demo-results/pipeline-dryrun
|
|
83
83
|
```
|
|
84
84
|
|
|
@@ -10,7 +10,7 @@ tabglm 的 Anthropic 入口会对请求做“官方客户端”校验;当 `sys
|
|
|
10
10
|
|
|
11
11
|
## 启用方式(推荐:只改 config)
|
|
12
12
|
|
|
13
|
-
在 `~/.
|
|
13
|
+
在 `~/.rcc/config.json`(或你的自定义 config)里为 tabglm provider 开启 compat profile(必须显式配置,禁止推断):
|
|
14
14
|
|
|
15
15
|
- 推荐:`virtualrouter.providers.tabglm.compatibilityProfile = "anthropic:claude-code"`
|
|
16
16
|
- 也支持:`virtualrouter.providers.tabglm.compatibilityProfile = "chat:claude-code"`
|
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
- Before fix: HTTP 400 business error 514
|
|
7
7
|
- After fix: HTTP 200, successful response
|
|
8
8
|
- Output saved: /tmp/replay-iflow-base-req_1770377342669_6d3e332c.txt (no longer available)
|
|
9
|
-
- Verification command: `npm run replay:codex-sample -- --sample ~/.
|
|
9
|
+
- Verification command: `npm run replay:codex-sample -- --sample ~/.rcc/codex-samples/openai-responses/iflow.1-186.kimi-k2.5/req_1770377342669_6d3e332c/client-request.json`
|
|
10
10
|
|
|
11
11
|
### Sample 2: Stop_followup request (openai-responses-iflow.1-186...20260207T100636992-003_stop_followup)
|
|
12
12
|
- Before fix: HTTP 400 business error 514
|
|
13
13
|
- After fix: HTTP 200, successful response
|
|
14
14
|
- Output saved: /tmp/replay-iflow-stop-followup-20260207T100636992-003.withkey.txt (no longer available)
|
|
15
|
-
- Verification command: `npm run replay:codex-sample -- --sample ~/.
|
|
15
|
+
- Verification command: `npm run replay:codex-sample -- --sample ~/.rcc/codex-samples/openai-responses/iflow.1-186.kimi-k2.5/.../client-request.json`
|
|
16
16
|
|
|
17
17
|
## Unaffected Provider (tab.gpt-5.3-codex) - Control Replay
|
|
18
18
|
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
- Before fix: HTTP 200, unchanged
|
|
21
21
|
- After fix: HTTP 200, unchanged
|
|
22
22
|
- Output saved: /tmp/replay-control-tab-key1.req_1770381056958_a35ee9ff.txt (no longer available)
|
|
23
|
-
- Verification command: `npm run replay:codex-sample -- --sample ~/.
|
|
23
|
+
- Verification command: `npm run replay:codex-sample -- --sample ~/.rcc/codex-samples/openai-chat/tab.key1.gpt-5.3-codex/req_1770381056958_a35ee9ff/client-request.json`
|
|
24
24
|
|
|
25
25
|
## Summary
|
|
26
26
|
All same-shape and control replays pass. The fix ensures:
|
|
@@ -13,12 +13,12 @@
|
|
|
13
13
|
"vision"
|
|
14
14
|
],
|
|
15
15
|
"sampleByCategory": {
|
|
16
|
-
"thinking": "/Users/fanzhang/.
|
|
17
|
-
"longContext": "/Users/fanzhang/.
|
|
18
|
-
"tools": "/Users/fanzhang/.
|
|
19
|
-
"webSearch": "/Users/fanzhang/.
|
|
20
|
-
"coding": "/Users/fanzhang/.
|
|
21
|
-
"default": "/Users/fanzhang/.
|
|
16
|
+
"thinking": "/Users/fanzhang/.rcc/codex-samples/openai-chat/req_1762999988376_zyns5xw9n_provider-request.json",
|
|
17
|
+
"longContext": "/Users/fanzhang/.rcc/codex-samples/openai-chat/req_1763000100195_09q89vvi2_provider-request.json",
|
|
18
|
+
"tools": "/Users/fanzhang/.rcc/codex-samples/openai-chat/req_1763002108961_i6ia6jndk_provider-request.json",
|
|
19
|
+
"webSearch": "/Users/fanzhang/.rcc/codex-samples/openai-chat/req_1763002108961_k3ysf83dl_provider-request.json",
|
|
20
|
+
"coding": "/Users/fanzhang/.rcc/codex-samples/openai-chat/req_1763002110308_iyj8j09zq_provider-request.json",
|
|
21
|
+
"default": "/Users/fanzhang/.rcc/codex-samples/openai-chat/req_1763014458732_3yfsckrin_provider-request.json"
|
|
22
22
|
},
|
|
23
23
|
"errors": []
|
|
24
24
|
}
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
|
|
7
7
|
## Samples
|
|
8
8
|
|
|
9
|
-
- thinking: /Users/fanzhang/.
|
|
10
|
-
- longContext: /Users/fanzhang/.
|
|
11
|
-
- tools: /Users/fanzhang/.
|
|
12
|
-
- webSearch: /Users/fanzhang/.
|
|
13
|
-
- coding: /Users/fanzhang/.
|
|
14
|
-
- default: /Users/fanzhang/.
|
|
9
|
+
- thinking: /Users/fanzhang/.rcc/codex-samples/openai-chat/req_1762999988376_zyns5xw9n_provider-request.json
|
|
10
|
+
- longContext: /Users/fanzhang/.rcc/codex-samples/openai-chat/req_1763000100195_09q89vvi2_provider-request.json
|
|
11
|
+
- tools: /Users/fanzhang/.rcc/codex-samples/openai-chat/req_1763002108961_i6ia6jndk_provider-request.json
|
|
12
|
+
- webSearch: /Users/fanzhang/.rcc/codex-samples/openai-chat/req_1763002108961_k3ysf83dl_provider-request.json
|
|
13
|
+
- coding: /Users/fanzhang/.rcc/codex-samples/openai-chat/req_1763002110308_iyj8j09zq_provider-request.json
|
|
14
|
+
- default: /Users/fanzhang/.rcc/codex-samples/openai-chat/req_1763014458732_3yfsckrin_provider-request.json
|
|
15
15
|
|
|
16
16
|
## Errors
|
|
17
17
|
|
|
@@ -9,11 +9,11 @@
|
|
|
9
9
|
"analyze": 12
|
|
10
10
|
},
|
|
11
11
|
"samplePerKeyword": {
|
|
12
|
-
"analysis": "/Users/fanzhang/.
|
|
13
|
-
"思考": "/Users/fanzhang/.
|
|
14
|
-
"推理": "/Users/fanzhang/.
|
|
15
|
-
"分析": "/Users/fanzhang/.
|
|
16
|
-
"reasoning": "/Users/fanzhang/.
|
|
17
|
-
"analyze": "/Users/fanzhang/.
|
|
12
|
+
"analysis": "/Users/fanzhang/.rcc/codex-samples/openai-chat/req_1762999988376_zyns5xw9n_provider-request.json",
|
|
13
|
+
"思考": "/Users/fanzhang/.rcc/codex-samples/openai-chat/req_1763002108523_9wlgh144y_provider-request.json",
|
|
14
|
+
"推理": "/Users/fanzhang/.rcc/codex-samples/openai-chat/req_1763002108523_9wlgh144y_provider-request.json",
|
|
15
|
+
"分析": "/Users/fanzhang/.rcc/codex-samples/openai-chat/req_1763002108523_9wlgh144y_provider-request.json",
|
|
16
|
+
"reasoning": "/Users/fanzhang/.rcc/codex-samples/openai-chat/req_1763002387567_v2m2i4vc2_provider-request.json",
|
|
17
|
+
"analyze": "/Users/fanzhang/.rcc/codex-samples/openai-chat/req_1763085298297_n028lwxea_provider-request.json"
|
|
18
18
|
}
|
|
19
19
|
}
|