@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
package/docs/responses/README.md
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
本节记录当前已经验证 **可以和 `https://www.fakercode.top/v1/responses` 正常通信** 的典型请求形状,方便后续实现 Responses provider 和 llmswitch-core 路由时参考。
|
|
4
4
|
|
|
5
5
|
> 最新直通黄金样本:
|
|
6
|
-
> - `~/.
|
|
7
|
-
> - `~/.
|
|
8
|
-
> - `~/.
|
|
6
|
+
> - `~/.rcc/codex-samples/openai-responses/req_req-v2-1763955655135-2z91vfddh_request_1_validation_pre.json`(llmswitch 输入)
|
|
7
|
+
> - `~/.rcc/codex-samples/openai-responses/req_1763955655139_mhw2j6ao_http-request.json`(/v1/responses 入口)
|
|
8
|
+
> - `~/.rcc/codex-samples/openai-responses/req_1763955655143_24f5h9qsj_provider-request.json`(Responses Provider 直通)
|
|
9
9
|
> 同一时间窗的前序样本(`req_1763955649860_832l5215_http-request.json`、`req_1763955649865_drd7xwttl_provider-request.json` 等)记录了相同请求在路由/Provider 侧的视角,可一起对照,`data` 或 `data.originalData` 即为发送给 FC 的最终载荷。
|
|
10
10
|
|
|
11
11
|
### 1. 已验证成功的请求形状(摘要)
|
|
@@ -100,7 +100,7 @@
|
|
|
100
100
|
- **metadata 可以保留 RouteCodex 自己的统计字段**,对上游兼容无明显影响。
|
|
101
101
|
- **stream=true + SSE**:该请求在 FC 上下游是以 Responses SSE 事件流的形式返回(`response.created` / `response.output_text.delta` / `response.completed` 等事件)。
|
|
102
102
|
- **工具结果配对只依赖 `call_id`**:OpenAI Responses 规范要求 `function_call` 与 `function_call_output` 仅通过同一 `call_id` 关联,并不会额外携带 `tool_call_id`。RouteCodex 在转换为 Chat 形状时会把 `call_id` 临时映射为 Chat 所需的 `tool_call_id`,但在发给上游或回传客户端前必须把结构还原为“只有 `call_id` 的官方形状”,否则像 c4m / Fai 这类严格实现会直接报 `Unknown parameter: input[].tool_call_id`。
|
|
103
|
-
- **强制开启 streaming:在用户 Provider 配置(例如 `~/.
|
|
103
|
+
- **强制开启 streaming:在用户 Provider 配置(例如 `~/.rcc/provider/fc/config.v1.json`)的 Responses 提供者下添加 `"responses": { "process": "passthrough", "streaming": "always" }`,这样 `ResponsesHttpProvider` 会通过 `responses.streaming` 判定为 `always`,即使入口是 Anthropic/Messages 也会对上游(如 Fai/c4m)以 SSE 模式发送请求。**
|
|
104
104
|
|
|
105
105
|
### 2. 失败的简化请求形状(对比)
|
|
106
106
|
|
|
@@ -122,7 +122,7 @@
|
|
|
122
122
|
```bash
|
|
123
123
|
FC_API_KEY=... FC_MODEL=gpt-5.1 \
|
|
124
124
|
node scripts/fc-responses-from-snapshot.mjs \
|
|
125
|
-
~/.
|
|
125
|
+
~/.rcc/codex-samples/openai-responses/req_req-v2-1763955655135-2z91vfddh_request_1_validation_pre.json
|
|
126
126
|
```
|
|
127
127
|
|
|
128
128
|
在成功场景下,SDK 报告的事件分布如下(节选):
|
|
@@ -67,7 +67,7 @@ virtualRouter 期望(关键片段)
|
|
|
67
67
|
- 工具链:`required_action.submit_tool_outputs` 原样透传,不文本化。
|
|
68
68
|
|
|
69
69
|
落盘与回放
|
|
70
|
-
- 目录:`~/.
|
|
70
|
+
- 目录:`~/.rcc/codex-samples/responses-replay`。
|
|
71
71
|
- 文件:`raw-request_req_*.json`、`provider-out-generic_*.json`、`sse-events-<RID>.log`。
|
|
72
72
|
- 脚本(新增):
|
|
73
73
|
- `scripts/verify-responses-passthrough.mjs`:对比 raw-request 与 provider-out 正文字段一致(headers/trace 差异允许)。
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
- 目标
|
|
8
8
|
- 在 `/v1/responses` 下提供“真实 SSE 透传”能力:输入 Responses 请求,输出同规范 Responses 事件流。
|
|
9
|
-
- 使用配置驱动:`~/.
|
|
9
|
+
- 使用配置驱动:`~/.rcc/config.json` 中新增一个 `type: "responses-standard"` 的 provider;模型设为 `gpt-5.1`;将其设置为默认路由(`routing.default`)。
|
|
10
10
|
- 与黑盒客户端无耦合:不需要客户端改代码即可稳定收到事件与字节。
|
|
11
11
|
- 强可观测:保留请求/响应快照;增加服务端原始 SSE 字节 tee 日志。
|
|
12
12
|
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
|
|
76
76
|
## 4. 配置与选择
|
|
77
77
|
|
|
78
|
-
- Provider 配置(示例,已按照你的要求生成到 `~/.
|
|
78
|
+
- Provider 配置(示例,已按照你的要求生成到 `~/.rcc/config.responses.json`):
|
|
79
79
|
- `type`: `"responses-standard"`
|
|
80
80
|
- `baseUrl`: `"https://www.fakercode.top/v1"`
|
|
81
81
|
- `auth.type`: `"apikey"`
|
|
@@ -104,7 +104,7 @@
|
|
|
104
104
|
- submit 路径新增对 `llmswitch-core` 的 `resumeResponsesConversation()` 调用,server 侧仅负责读取 `response_id` / `tool_outputs` 并交给核心缓存生成完整 payload,成功后再进 Hub Pipeline,失败返回 400(表示响应已过期或丢失)。
|
|
105
105
|
|
|
106
106
|
4) 配置示例(你已要求,已生成在用户目录):
|
|
107
|
-
- `~/.
|
|
107
|
+
- `~/.rcc/config.responses.json`(不改仓库内默认 config)。
|
|
108
108
|
|
|
109
109
|
## 6. 测试与验收
|
|
110
110
|
|
|
@@ -114,8 +114,8 @@
|
|
|
114
114
|
- 工具回路:收到 `required_action` 后,黑盒 `submit_tool_outputs`,再验证下一轮直到 `done`。
|
|
115
115
|
|
|
116
116
|
- 服务端可观测:
|
|
117
|
-
- 原始 SSE 字节:`~/.
|
|
118
|
-
- 快照:`~/.
|
|
117
|
+
- 原始 SSE 字节:`~/.rcc/logs/sse/<reqId>_server.sse.log`
|
|
118
|
+
- 快照:`~/.rcc/codex-samples/openai-responses/` 下的 `provider-request.json` / `provider-response.json` / `provider-error.json` 与 `*_sse_pre/post.json`
|
|
119
119
|
|
|
120
120
|
- 代理排查建议:
|
|
121
121
|
- Nginx:`proxy_buffering off;` `proxy_http_version 1.1;` `proxy_set_header Connection '';` `chunked_transfer_encoding on;`;
|
|
@@ -144,7 +144,7 @@
|
|
|
144
144
|
|
|
145
145
|
- 命令:`npm run verify:sse-loop`
|
|
146
146
|
- 统一触发 Responses、Chat(LMStudio)和 Anthropic(GLM-Anthropic)的官方 SDK → RouteCodex 对比。
|
|
147
|
-
- 需要提前在 `~/.
|
|
147
|
+
- 需要提前在 `~/.rcc/provider/<providerId>/` 配置相应上游;RouteCodex 本地实例需已启动(默认 `http://127.0.0.1:5555/v1`)。
|
|
148
148
|
- 环境变量:
|
|
149
149
|
- `RCC_LOOP_RESP_PROVIDER` / `RCC_LOOP_RESP_MODEL`
|
|
150
150
|
- `RCC_LOOP_CHAT_MODEL`
|
|
@@ -157,7 +157,7 @@
|
|
|
157
157
|
|
|
158
158
|
附:配置示例(已生成在用户目录)
|
|
159
159
|
|
|
160
|
-
- `~/.
|
|
160
|
+
- `~/.rcc/config.responses.json`(节选)
|
|
161
161
|
|
|
162
162
|
```
|
|
163
163
|
{
|
|
@@ -166,7 +166,7 @@ RouteCodex 支持通过用户消息中的特殊指令 `<**...**>` 来动态控
|
|
|
166
166
|
- 启用 / 更新自动续写:
|
|
167
167
|
- `<**stopMessage:"继续"**>` → 默认最多自动续写 10 次;
|
|
168
168
|
- `<**stopMessage:"继续",3**>` → 最多自动续写 3 次;
|
|
169
|
-
- `<**stopMessage:<file://stopMessage/message1.md>**>` → 读取 `~/.
|
|
169
|
+
- `<**stopMessage:<file://stopMessage/message1.md>**>` → 读取 `~/.rcc/stopMessage/message1.md` 作为 stopMessage 文案(设置时读取并缓存到内存);
|
|
170
170
|
- 清理 stopMessage 状态:
|
|
171
171
|
- `<**stopMessage:clear**>`
|
|
172
172
|
|
|
@@ -210,7 +210,7 @@
|
|
|
210
210
|
<div class="scope-switch">
|
|
211
211
|
<span class="dim">范围:</span>
|
|
212
212
|
<span class="scope-pill active">当前 Server(local-5555)</span>
|
|
213
|
-
<span class="scope-pill">当前 Config(~/.
|
|
213
|
+
<span class="scope-pill">当前 Config(~/.rcc/config.json)</span>
|
|
214
214
|
<span class="scope-pill">所有 Server</span>
|
|
215
215
|
<span class="scope-pill">所有 Config</span>
|
|
216
216
|
</div>
|
|
@@ -282,7 +282,7 @@
|
|
|
282
282
|
<span class="icon">📦</span>
|
|
283
283
|
<span class="mono">local-5520</span>
|
|
284
284
|
<span class="badge offline">offline</span>
|
|
285
|
-
<span class="dim mono">(~/.
|
|
285
|
+
<span class="dim mono">(~/.rcc/config.json)</span>
|
|
286
286
|
</div>
|
|
287
287
|
<ul>
|
|
288
288
|
<li class="tree-node">
|
|
@@ -319,7 +319,7 @@
|
|
|
319
319
|
<span class="mono">iflow</span>
|
|
320
320
|
<span class="tag">protocol=openai</span>
|
|
321
321
|
<span class="badge oauth">oauth</span>
|
|
322
|
-
<span class="dim mono">tokenFile=~/.
|
|
322
|
+
<span class="dim mono">tokenFile=~/.rcc/auth/iflow-oauth-1-186.json</span>
|
|
323
323
|
</div>
|
|
324
324
|
<ul>
|
|
325
325
|
<li class="tree-node">
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
## 概述
|
|
4
4
|
|
|
5
|
-
后台守护进程,监控 `~/.
|
|
5
|
+
后台守护进程,监控 `~/.rcc/auth/` 目录下的 Token 文件,自动管理 Token 刷新和重新认证。
|
|
6
6
|
|
|
7
7
|
## 核心职责
|
|
8
8
|
|
|
9
|
-
1. **监控 Token 文件** - 监控 `~/.
|
|
9
|
+
1. **监控 Token 文件** - 监控 `~/.rcc/auth/*.json` 变化
|
|
10
10
|
2. **检测过期** - 读取 `expires_at` 判断是否即将过期/已过期
|
|
11
11
|
3. **自动刷新** - OAuth Token 提前30分钟自动刷新
|
|
12
12
|
4. **触发认证(显式)** - 后台默认不弹窗;需要交互式修复时由用户运行 `rcc oauth --force <selector>` 或 `rcc oauth <provider>-auto <selector>`
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
## 目录结构
|
|
15
15
|
|
|
16
16
|
```
|
|
17
|
-
~/.
|
|
17
|
+
~/.rcc/auth/
|
|
18
18
|
├── iflow-oauth-1-work.json # 账号: work@example.com
|
|
19
19
|
├── iflow-oauth-2-personal.json # 账号: my@gmail.com
|
|
20
20
|
├── qwen-oauth-1-default.json # 账号: dev@company.com
|
|
@@ -176,7 +176,7 @@ routecodex token-daemon stop
|
|
|
176
176
|
```
|
|
177
177
|
🌙 Token Refresh Daemon 运行中
|
|
178
178
|
PID: 12345
|
|
179
|
-
📁 监控目录: ~/.
|
|
179
|
+
📁 监控目录: ~/.rcc/auth/
|
|
180
180
|
|
|
181
181
|
| 文件名 | 显示名称 | 状态 | 过期时间 | 剩余 |
|
|
182
182
|
|---------------------|------------------------|--------|----------------|--------|
|
|
@@ -204,7 +204,7 @@ PID: 12345
|
|
|
204
204
|
▼ ▼
|
|
205
205
|
┌──────────────────┐ ┌─────────────────────────────────┐
|
|
206
206
|
│ 配置文件Watcher │ │ 认证页面 (外部浏览器) │
|
|
207
|
-
│ ~/.
|
|
207
|
+
│ ~/.rcc/auth│ │ + 本地回调服务器 (localhost) │
|
|
208
208
|
└──────────────────┘ └─────────────────────────────────┘
|
|
209
209
|
```
|
|
210
210
|
|
|
@@ -233,7 +233,7 @@ PID: 12345
|
|
|
233
233
|
|
|
234
234
|
| 决策点 | 选择 | 理由 |
|
|
235
235
|
|--------|------|------|
|
|
236
|
-
| 监控目录 | `~/.
|
|
236
|
+
| 监控目录 | `~/.rcc/auth/` | 现有结构,保持兼容 |
|
|
237
237
|
| 进程间通信 | Unix Domain Socket | 本机通信,安全 |
|
|
238
238
|
| 配置文件监听 | chokidar | 跨平台,事件驱动 |
|
|
239
239
|
| 浏览器 | 外部浏览器 | Google 禁止自动化登录 |
|
|
@@ -261,7 +261,7 @@ PID: 12345
|
|
|
261
261
|
|
|
262
262
|
## 待确认问题
|
|
263
263
|
|
|
264
|
-
1. [x] 监控目录: `~/.
|
|
264
|
+
1. [x] 监控目录: `~/.rcc/auth/`
|
|
265
265
|
2. [x] 提前刷新时间: 30分钟
|
|
266
266
|
3. [x] 认证方式: 外部浏览器
|
|
267
267
|
4. [x] 回调方式: 本地 HTTP 服务器
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# ModelScope 独立验证记录
|
|
2
2
|
|
|
3
3
|
- 日期: 2025-09-26
|
|
4
|
-
- 配置文件: `~/.
|
|
4
|
+
- 配置文件: `~/.rcc/config/modelscope.json`
|
|
5
5
|
- 监听端口: 5507(示例环境)
|
|
6
6
|
|
|
7
7
|
## 验证范围
|
|
@@ -54,6 +54,6 @@ curl -i -sS -H 'Content-Type: application/json' \
|
|
|
54
54
|
## 日志与追踪
|
|
55
55
|
|
|
56
56
|
- 运行日志:`server-modelscope.log`
|
|
57
|
-
- DebugCenter:`~/.
|
|
57
|
+
- DebugCenter:`~/.rcc/logs/debug-center.log`
|
|
58
58
|
- 关联方式:使用响应头 `x-request-id` 在日志中检索对应请求链路
|
|
59
59
|
|
|
@@ -24,10 +24,10 @@
|
|
|
24
24
|
#### 使用方法
|
|
25
25
|
```bash
|
|
26
26
|
# 启动 LM Studio 配置 (端口 5521)
|
|
27
|
-
npx ts-node src/cli.ts start --config ~/.
|
|
27
|
+
npx ts-node src/cli.ts start --config ~/.rcc/config/lmstudio-5521-gpt-oss-20b-mlx.json --port 5521
|
|
28
28
|
|
|
29
29
|
# 启动 Qwen Provider 配置 (端口 5522)
|
|
30
|
-
npx ts-node src/cli.ts start --config ~/.
|
|
30
|
+
npx ts-node src/cli.ts start --config ~/.rcc/config/qwen-5522-qwen3-coder-plus.json --port 5522
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
## 目录结构
|
|
@@ -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",
|
|
@@ -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');
|
|
@@ -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);
|
|
@@ -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');
|