cabletidy 0.4.0-rc.4 → 0.4.0-rc.6

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 CHANGED
@@ -24,31 +24,45 @@ CableTidy 的核心不是“提供一个统一 OpenAI API”,而是把复杂
24
24
  - Claude Code 请求概览按 Messages 内容块解析系统提示词、用户与历史模型内容、思考、工具调用及结果;每项完整展示,`user` 消息内的工具结果单独计数,支持跨页关联、错误与缓存标记、多模态类型和标题行右侧的精确原文定位。结构调研与展示边界见 [Claude Code 请求内容概览](docs/claude-request-overview.md)。
25
25
  - 请求历史按已识别的 thread / agent 上下文及明确继承关系保守匹配,Claude 最新用户消息中的文本保持展开;复用完整条目已完成的风险检查,包括无命中结果,规则或有效凭据变化后重新检查。新增风险与历史风险分别展示和计数,每条请求仍独立保留完整正文与当前证据;旧记录继续完整查看,不自动回填历史关系或阴性检测证明。范围见 [请求历史折叠与风险检测复用方案](docs/request-history-folding-and-inspection-reuse.md)。
26
26
  - “响应内容”页签完整展示本轮模型文本、推理 / 思考、工具调用与服务端结果;支持分类计数、独立分页、完整结构和原文定位。Codex 合并 Responses 增量并去重最终输出,Claude Code 分开拼接文本、思考、签名和工具 JSON;缺失与中断明确提示。会话风险跳转到请求内容或响应内容中的对应位置,自动加载所需分页;请求内容、响应内容和原始内容中的风险位置在普通浏览时也保持高亮。调研及边界见 [Codex 响应内容概览](docs/codex-response-overview.md) 和 [Claude Code 响应内容概览](docs/claude-response-overview.md)。
27
- - 审计存入数据目录中的 `audit.sqlite3`,默认保留 30 天,容量预算 128 MiB,接近容量时可能提前清理较旧记录。页面显示实际保留范围、写入状态和记录缺口。
27
+ - 审计存入数据目录中的 `audit.sqlite3`,默认保留 30 天,容量预算 5 GiB(5120 MiB);可在顶级“设置”页面调整保存周期和存储上限,两项均支持“不设上限”。接近容量时可能提前清理较旧记录。页面显示实际保留范围、写入状态和记录缺口。
28
28
  - 保留网关观察到的请求与响应正文,包括对话、模型输出、工具参数和客户端报告的工具结果;凭据、认证头、Cookie、私钥等保留原文并记录检测位置,详情页自动高亮敏感内容。点击风险可定位对应内容并查看上下文;流式命中保存检测当时的独立快照。普通对话、命令和路径保持可读。
29
29
  - 正文不再设单条固定长度上限,网关也不再按 8 MiB 拒绝请求。采用有界内存、临时加密暂存、原文分段落盘和正文按页加载;后台完整扫描保留的可检测内容,不再只检查前 1 MiB。共享内存、临时空间或审计存储预算不足时明确显示进度、失败和缺口;旧记录没有正文时不作补造。
30
30
 
31
31
  检查使用本地规则和有界缓冲。未知工具、动态脚本、未覆盖的推理内容、图片和加密内容显示“已检查(覆盖有限)”;正文缺失、解析失败和资源不足等检查缺口单独提示。流式结果按 Responses / Messages 各自的完整协议结束事件判定,客户端在结束事件后关闭连接不再误标为中断;连接接收状态与检查状态分别保留。数据库不可用或队列满时代理继续运行,页面显示审计退化状态;正常退出会排空已接收的写入,强制退出可能丢失未提交记录。它是本地可追溯日志,不提供零丢失或防篡改保证。
32
32
 
33
- 分类调研、规则清单、固定预算和 HTTP 查询接口见 [代理安全 V1 设计与实现](docs/agent-security-v1.md)。基础安全审计自 `0.3.0` 提供;会话轨迹、敏感原文保留与高亮纳入 `0.4.0-rc.1`,发布与验收状态见 [候选版发布说明](docs/releases/0.4.0-rc.4.md)。
33
+ 分类调研、规则清单、固定预算和 HTTP 查询接口见 [代理安全 V1 设计与实现](docs/agent-security-v1.md)。基础安全审计自 `0.3.0` 提供;会话轨迹、敏感原文保留与高亮纳入 `0.4.0-rc.1`,发布与验收状态见 [候选版发布说明](docs/releases/0.4.0-rc.6.md)。
34
34
 
35
- ## 配置套装导出与导入
35
+ ## 服务设置
36
36
 
37
- 在管理台的“配置套装”列表点击“导出配置”,勾选需要的套装后下载 JSON 文件。文件包含所选套装的客户端绑定、模型映射与可选参数、路由、上游地址和认证方式;共用的路由与上游只保存一次。
37
+ 管理台主导航中的“设置”用于管理 CableTidy 服务整体配置,对所有线路生效。目前支持审计记录的保存周期(正整数天数,至少 1 天)和存储上限(MiB,至少 16 MiB),默认分别为 30 天和 5 GiB(5120 MiB)。两项均可单独勾选“不限”。保存后立即生效,无需重启,并在后续启动时继续使用。
38
38
 
39
- “包含认证凭据”复选框默认不勾选:导出不含 API Key、上游密钥、密钥引用或密钥配置状态,上游 URL 中的用户名、密码、查询参数和片段也会移除;如地址需要查询参数,请在导入后重新填写。勾选后导出所选套装的已保存密钥,并保留完整上游 URL,文件包含明文凭据,请妥善保管。无论是否勾选,均不包含客户端文件、应用与恢复记录、审计日志、管理台端口和其他机器设置;仅导出受支持的配置字段,未知扩展字段不携带。默认不含凭据时,若已保存的密钥出现在名称、模型设置或 URL 路径中,导出会拒绝并提示先移除该凭据。
39
+ 只关闭一项限制时,另一项仍可能清理记录;两项均关闭时不再按时间或容量自动清理。缩短保存周期或降低存储上限可能立即清理历史记录。清理优先删除较旧的已完成记录及其关联正文、风险与缓存,保留仍在接收或检查的记录;有存储上限时会为写入状态与风险信息留出空间,实际保留量可能低于上限。读事务占用的 WAL 或仍在处理的记录会延后回收,磁盘占用可能暂时超出上限。
40
40
 
41
- 点击“导入配置”选择文件,先预览待导入的配置,再点击“确认导入”。遇到同名配置时,每套配置须选择“更新已有配置”或“创建新配置”。更新会保留配置名称和本地入口,替换套装设置;创建新配置会添加 ` (import 2)` 等后缀。路由和上游 ID 冲突会自动调整。当文件包含认证凭据时,预览显示“使用导入配置中的认证凭据”复选框,默认勾选:文件中的密钥和 URL 认证信息会使用到导入配置,更新时优先使用文件密钥。取消勾选会忽略文件密钥并移除文件 URL 中的认证信息。未使用文件密钥时,更新已有配置保留该配置原有密钥,无需重新填写;原配置尚未设置密钥时仍需填写。创建新配置不继承本机已有凭据。使用文件密钥会分配独立引用,不会覆盖其他套装共享的本机密钥。更新后不再使用的旧路由和上游会清理,仍被其他套装使用的共享连接和凭据会保留。导入后按需应用到客户端。导入不自动修改 Codex 或 Claude Code 的本地文件。
41
+ 设置保存到 `config.json` 的 `audit` 字段:`retentionDays` 为天数,`budgetBytes` 为字节数,`null` 表示该项不设上限;旧配置缺少字段时使用默认值。设置复用 `POST /api/v1/config/commit` 的校验、修订冲突检查和备份流程,不随线路导出或导入。
42
42
 
43
- 导入复用配置提交的校验、修订冲突检查和备份流程,文件无效时不会部分写入;预览后若本机配置已变更,需要重新预览。带可选模型设置的 Codex 套装会按本机官方目录校验,纯透传套装不依赖该目录。
43
+ 5 GiB 默认值自 `0.4.0-rc.6` 提供。已有配置中保存的上限(包括 128 MiB)或“不限”继续沿用;要提高已有上限,在“设置”中将存储上限改为 5120 MiB 并保存。容量按需使用,不会预占 5 GiB。
44
44
 
45
- 本地管理接口:`POST /api/v1/config/export` 接收 `{ "bindingIds": ["配置ID"], "includeCredentials": false }` 并返回套装文件;`POST /api/v1/config/import` 接收 `{ "bundle": 文件内容, "preview": true }` 返回预览、`baseRevision` 和 `hasCredentials`,正式导入使用 `{ "bundle": 文件内容, "baseRevision": 预览修订号, "choices": { "同名的源配置ID": "update 或 create" }, "useImportedCredentials": true }`。预览中的每套配置提供 `sourceId` 和 `conflict`,所有同名配置都必须明确选择;`choices` 也可用于预览所选更新方案。含凭据的文件通过顶层 `upstreamSecrets` 保存所选上游 ID 与密钥的对应关系,不包含本机密钥引用。`includeCredentials` 默认 `false`,`useImportedCredentials` 默认 `true`。文件标识为 `cabletidy.configuration-suites`,文件版本为 `1`,内部配置版本为 `2`。
45
+ 界面预览:[桌面](docs/screenshots/service-settings-desktop.png) · [手机](docs/screenshots/service-settings-mobile.png)。
46
+
47
+ ## 线路导出与导入
48
+
49
+ “配置套装”自 `0.4.0-rc.6` 更名为“线路”(英文 Cable):一条线路把一个 CLI 接到上游,当前版本每条线路只支持一个上游。随之变化的还有 `config.json` 的 `bindings` 字段(现为 `cables`,配置版本 `2` → `3`)、导出文件标识、导入导出接口路径与字段,以及 `status` 输出中的线路列表字段。旧 `config.json`、旧导出文件和升级前已应用的 Claude Code 接管记录继续可用,详见各节说明;新版导出的文件不保证能被旧版 CableTidy 读取。仍发送旧字段 `bindingId` 或 `bindingIds` 的请求会返回 `422 renamed_request_field`,不会退回默认选择,避免旧脚本看似成功却接到错误上游。
50
+
51
+ 在管理台的“线路”列表点击“导出线路”,勾选需要的线路后下载 JSON 文件。文件包含所选线路的客户端接入、模型映射与可选参数、路由、上游地址和认证方式;共用的路由与上游只保存一次。
52
+
53
+ “包含认证凭据”复选框默认不勾选:导出不含 API Key、上游密钥、密钥引用或密钥配置状态,上游 URL 中的用户名、密码、查询参数和片段也会移除;如地址需要查询参数,请在导入后重新填写。勾选后导出所选线路的已保存密钥,并保留完整上游 URL,文件包含明文凭据,请妥善保管。无论是否勾选,均不包含客户端文件、应用与恢复记录、审计日志、管理台端口和其他机器设置;仅导出受支持的配置字段,未知扩展字段不携带。默认不含凭据时,若已保存的密钥出现在名称、模型设置或 URL 路径中,导出会拒绝并提示先移除该凭据。
54
+
55
+ 点击“导入线路”选择文件,先预览待导入的线路,再点击“确认导入”。遇到同名线路时,每条线路须选择“更新已有线路”或“创建新线路”。更新会保留线路名称和本地入口,替换线路设置;创建新线路会添加 ` (import 2)` 等后缀。路由和上游 ID 冲突会自动调整。当文件包含认证凭据时,预览显示“使用线路文件中的认证凭据”复选框,默认勾选:文件中的密钥和 URL 认证信息会使用到导入的线路,更新时优先使用文件密钥。取消勾选会忽略文件密钥并移除文件 URL 中的认证信息。未使用文件密钥时,更新已有线路保留该线路原有密钥,无需重新填写;原线路尚未设置密钥时仍需填写。创建新线路不继承本机已有凭据。使用文件密钥会分配独立引用,不会覆盖其他线路共享的本机密钥。更新后不再使用的旧路由和上游会清理,仍被其他线路使用的共享连接和凭据会保留。导入后按需应用到客户端。导入不自动修改 Codex 或 Claude Code 的本地文件。
56
+
57
+ 导入复用配置提交的校验、修订冲突检查和备份流程,文件无效时不会部分写入;预览后若本机配置已变更,需要重新预览。带可选模型设置的 Codex 线路会按本机官方目录校验,纯透传线路不依赖该目录。
58
+
59
+ 本地管理接口:`POST /api/v1/cables/export` 接收 `{ "cableIds": ["线路ID"], "includeCredentials": false }` 并返回线路文件;`POST /api/v1/cables/import` 接收 `{ "bundle": 文件内容, "preview": true }` 返回预览、`baseRevision` 和 `hasCredentials`,正式导入使用 `{ "bundle": 文件内容, "baseRevision": 预览修订号, "choices": { "同名的源线路ID": "update 或 create" }, "useImportedCredentials": true }`。预览中的每条线路提供 `sourceId` 和 `conflict`,所有同名线路都必须明确选择;`choices` 也可用于预览所选更新方案。含凭据的文件通过顶层 `upstreamSecrets` 保存所选上游 ID 与密钥的对应关系,不包含本机密钥引用。`includeCredentials` 默认 `false`,`useImportedCredentials` 默认 `true`。文件标识为 `cabletidy.cables`,文件版本为 `1`,内部配置版本为 `3`。旧的 `cabletidy.configuration-suites` 文件(内部配置版本 `2`)仍可导入,其中的 `bindings` 按 `cables` 读取;同时包含 `bindings` 和 `cables` 的文件一律拒绝,不部分导入。
46
60
 
47
61
  ## 模型透传与可选设置
48
62
 
49
- 每份配置默认将客户端请求的 `model` 原样发送到唯一上游,无需注册模型或填写同名映射。未配置的模型、工具和输入类型由上游判断是否支持;协议兼容不代表上游支持所有模型。
63
+ 每条线路默认将客户端请求的 `model` 原样发送到唯一上游,无需注册模型或填写同名映射。未配置的模型、工具和输入类型由上游判断是否支持;协议兼容不代表上游支持所有模型。
50
64
 
51
- 需要改名或覆盖上下文等参数时,才添加模型设置。上游模型 ID 可留空,留空时继续使用请求中的模型名。设置只在当前配置内生效,不会影响其他配置,也不会阻止未配置的模型请求。请求未携带模型且没有显式默认模型时,返回 `model_required`。
65
+ 需要改名或覆盖上下文等参数时,才添加模型设置。上游模型 ID 可留空,留空时继续使用请求中的模型名。设置只在当前线路内生效,不会影响其他线路,也不会阻止未配置的模型请求。请求未携带模型且没有显式默认模型时,返回 `model_required`。
52
66
 
53
67
  Codex 的可选模型设置目前只支持与本机官方 GPT 目录明确对应的模型,允许上游使用不同的模型名称:
54
68
 
@@ -65,7 +79,7 @@ Codex 的可选模型设置目前只支持与本机官方 GPT 目录明确对应
65
79
 
66
80
  npm 安装方式推荐 Node.js 24,也支持 Node.js 22.13 及以上的 22.x 版本;完整版本约束见 `package.json`。原生程序可独立运行。发行包支持 Linux x64 / arm64、macOS x64 / arm64、Windows x64;源码构建需要稳定版 Rust 和系统 C 编译器 / 链接器。CI 执行源码测试与安装冒烟测试,跨平台结果以对应提交的 CI 为准。Windows 使用原生进程 API 查询进程身份;Codex 目录查询仍需要系统 Windows PowerShell,并允许 `Add-Type` 调用 Windows Job Object API。
67
81
 
68
- 当前源码版本为 `0.4.0-rc.4`,在上一候选版基础上新增请求历史折叠与已完成风险检测复用,区分新增与历史风险,并修正流式完成判定及检查覆盖状态;同时移除冗余工具提议摘要与过时配置控件。候选版使用 npm `next`;默认 npm 安装命令仍选择 `latest` 指向的稳定版 `0.3.0`。候选版的发布状态、验收范围与升级步骤见 [0.4.0-rc.4 发布说明](docs/releases/0.4.0-rc.4.md);GitHub Release 与 npm 分别发布。稳定版见 [0.3.0 发布说明](docs/releases/0.3.0.md)。
82
+ 当前源码版本为 `0.4.0-rc.6`,在上一候选版基础上将配置套装更名为线路、提供独立导入导出页面,将默认审计存储上限提高到 5 GiB,并支持确认后继续应用或撤销有冲突的 Claude Code 配置;同时修复审计维护被文件锁阻塞时的读取失败,以及 Codex 配置分隔注释前的空行。候选版使用 npm `next`;默认 npm 安装命令仍选择 `latest` 指向的稳定版 `0.3.0`。候选版的发布状态、验收范围与升级步骤见 [0.4.0-rc.6 发布说明](docs/releases/0.4.0-rc.6.md);GitHub Release 与 npm 分别发布。稳定版见 [0.3.0 发布说明](docs/releases/0.3.0.md)。
69
83
 
70
84
  ### 从 npm 官方源安装
71
85
 
@@ -81,10 +95,10 @@ cabletidy start
81
95
  npm exec --yes --registry=https://registry.npmjs.org/ --package=cabletidy -- cabletidy start
82
96
  ```
83
97
 
84
- 试用 `0.4.0` 候选版时,先按[候选版升级说明](docs/releases/0.4.0-rc.4.md)停止服务并备份数据,再安装指定版本:
98
+ 试用 `0.4.0` 候选版时,先按[候选版升级说明](docs/releases/0.4.0-rc.6.md)停止服务并备份数据,再安装指定版本:
85
99
 
86
100
  ```bash
87
- npm install -g cabletidy@0.4.0-rc.4 --registry=https://registry.npmjs.org/
101
+ npm install -g cabletidy@0.4.0-rc.6 --registry=https://registry.npmjs.org/
88
102
  ```
89
103
 
90
104
  ### 从本地安装包使用
@@ -124,7 +138,7 @@ cabletidy restart
124
138
  cabletidy stop
125
139
  ```
126
140
 
127
- `status` 同时显示 daemon 是否在线、管理台 URL、配置版本和当前配置套装列表;每套配置包含 ID、名称、目标 CLI、本地接入 URL 和启用状态,不再需要单独的 URL 或 Web 状态命令。
141
+ `status` 同时显示 daemon 是否在线、管理台 URL、配置版本和当前线路列表(`cables`);每条线路包含 ID、名称、目标 CLI、本地接入 URL 和启用状态,不再需要单独的 URL 或 Web 状态命令。
128
142
  `status` 和不带参数的命令只读取状态,不创建数据目录、配置、密钥或备份。尚未初始化时,只提示未启动以及运行 `cabletidy start`,不返回预设的管理台地址。
129
143
 
130
144
  升级时先停止服务,再安装目标版本并重新启动。从 `0.2.0` 升级时,先在原运行终端按 Ctrl+C,或通过原进程管理器停止;该版本没有 `stop` 命令。以下命令适用于已经支持 `stop` 的版本,且 `latest` 只选择稳定版;完整升级步骤见 [发布说明](docs/releases/0.3.0.md):
@@ -222,21 +236,21 @@ CABLETIDY_HOME="$PWD/.cabletidy-dev" cabletidy start
222
236
 
223
237
  同一份数据目录只允许运行一个实例,初始化和退出清理期间均持有操作系统独占文件锁。被暂停的实例仍持有锁;`status` 可报告控制通道无响应,但不会因此允许第二个实例启动。锁的生命周期不依赖主机名、PID 查询或心跳时间。旧版目录锁的手动迁移方法见“启动、升级与卸载”。
224
238
 
225
- Web 管理台与所有 Virtual Provider 共用最终分配的端口。以下示例假设端口为 `43100`;每份配置通过 `/<配置ID>/v1/...` 接入,例如 `http://127.0.0.1:43100/codex-main/v1/responses`;管理接口仍使用 `/api/v1/...`。
239
+ Web 管理台与所有 Virtual Provider 共用最终分配的端口。以下示例假设端口为 `43100`;每条线路通过 `/<线路ID>/v1/...` 接入,例如 `http://127.0.0.1:43100/codex-main/v1/responses`;管理接口仍使用 `/api/v1/...`。
226
240
 
227
241
  ## Web 配置管理
228
242
 
229
- 管理台直接显示配置列表,首次使用与后续使用采用相同的操作流程,不设置介绍页或配置向导。点击“新建配置”填写:
243
+ 管理台直接显示线路列表,首次使用与后续使用采用相同的操作流程,不设置介绍页或配置向导。点击“新建线路”填写:
230
244
 
231
245
  - 目标 CLI:Codex 或 Claude Code。
232
- - 配置名称(可选);留空时按 `<CLI 名称> / <上游主机名>` 自动生成展示名称。
246
+ - 线路名称(可选);留空时按 `<CLI 名称> / <上游主机名>` 自动生成展示名称。
233
247
  - 上游地址和 API Key。
234
248
  - Claude Code 上游可选 `x-api-key` 或 `Authorization: Bearer` 认证。
235
249
  - 模型设置(可选):Codex 选择官方模型,Claude Code 填写客户端请求中的完整模型 ID;上游模型 ID 留空时直接透传。
236
250
  - Claude Code 的“模型别名”(可选):Opus / Sonnet / Fable / Haiku 从本次填写的客户端模型 ID 中选择,也可由 Claude 默认决定。
237
- - Claude Code 的“默认模型”(可选):启动模型和子代理模型均以下拉选项选择。启动模型支持 Claude 官方的 `best`、`opus`、`sonnet`、`fable`、`haiku`、`opusplan`;子代理模型支持 `opus`、`sonnet`、`fable`、`haiku`。两者都可选择对应的默认行为,或当前配置中的客户端模型 ID;保存别名本身,不提前转换为具体模型 ID。
251
+ - Claude Code 的“默认模型”(可选):启动模型和子代理模型均以下拉选项选择。启动模型支持 Claude 官方的 `best`、`opus`、`sonnet`、`fable`、`haiku`、`opusplan`;子代理模型支持 `opus`、`sonnet`、`fable`、`haiku`。两者都可选择对应的默认行为,或当前线路中的客户端模型 ID;保存别名本身,不提前转换为具体模型 ID。
238
252
 
239
- 点击“创建配置”后,服务端自动校验、保存并使配置生效,成功后进入详情页。本地服务入口和路由自动生成。配置 ID 按配置名称规范化生成,Virtual Provider ID 为 `cabletidy_<配置ID>`,并直接用作 Codex 的 `model_provider`;URL 路径使用不带此前缀的配置 ID。留空名称时,自动生成的名称也会参与 ID 规范化;如果多个配置使用同一上游主机且都留空名称,需要为后续配置填写不同名称。
253
+ 点击“创建线路”后,服务端自动校验、保存并使线路生效,成功后进入详情页。本地服务入口和路由自动生成。线路 ID 按线路名称规范化生成,Virtual Provider ID 为 `cabletidy_<线路ID>`,并直接用作 Codex 的 `model_provider`;URL 路径使用不带此前缀的线路 ID。留空名称时,自动生成的名称也会参与 ID 规范化;如果多条线路使用同一上游主机且都留空名称,需要为后续线路填写不同名称。
240
254
 
241
255
  列表显示 CLI、模型设置数量(无设置时显示“直接透传”)、本地地址和本地服务状态。列表与详情页的状态根据 Virtual Provider 的运行情况显示“已启动”“已暂停”或“未启动”,不受上游连通性测试结果影响。详情页依次展示唯一上游的连接设置、可选模型设置和客户端接入;每行模型设置包含客户端模型及可选的上游模型 ID,底部接入区域集中展示本地地址、Virtual Provider ID 和服务启停、预览、应用操作。“保存上游”和“保存模型设置”分别直接保存对应修改;模型设置可全部删除,恢复直接透传。失败时保留输入并在当前表单显示错误。“诊断”页面提供模型解析测试和事件记录,解析使用已保存的配置。
242
256
 
@@ -246,13 +260,13 @@ Web 管理台与所有 Virtual Provider 共用最终分配的端口。以下示
246
260
 
247
261
  “应用到 Codex”和“应用到 Claude Code”保持独立,只有主动点击时才修改客户端配置文件。测试连通性和配置预览使用已保存的配置。
248
262
 
249
- 按需在 Codex 套装详情页中添加模型设置;仅覆盖上下文时无需填写上游模型 ID。模型能力与上下文默认折叠,元数据默认“沿用官方定义”;
263
+ 按需在 Codex 线路详情页中添加模型设置;仅覆盖上下文时无需填写上游模型 ID。模型能力与上下文默认折叠,元数据默认“沿用官方定义”;
250
264
  展开并选择“覆盖上游限制”后可设置 context window 和图片输入,已有覆盖值或待确认的旧策略会自动展开。不提供固定 reasoning effort 或未实现的 compact 控件。
251
- 旧窗口和压缩配置会提示待确认,不会因升级自动同步到 Codex。不同套装可使用同一个官方模型名,映射在各自 Virtual Provider 内隔离。
265
+ 旧窗口和压缩配置会提示待确认,不会因升级自动同步到 Codex。不同线路可使用同一个官方模型名,映射在各自 Virtual Provider 内隔离。
252
266
 
253
267
  Daybreak Blue 和 Red 保留可选,位于模型列表末尾的“安全专项模型”分组,分别标记“需授权”和“需专项授权”。选中后显示简短用途提示,不自动禁用或更改已有映射;目录中的隐藏标记不等同于授权状态,实际可用性由上游支持和账户权限决定。
254
268
 
255
- 每份配置只连接一个上游,配置内所有模型都映射到该上游;Codex 接入使用 Responses 协议。需要另一个上游时创建另一份配置,不支持在同一配置内添加备用上游或自动切换。多上游配置会被校验拒绝,上游失败直接返回错误。
269
+ 每条线路只连接一个上游,线路内所有模型都映射到该上游;Codex 接入使用 Responses 协议。需要另一个上游时创建另一条线路,不支持在同一线路内添加备用上游或自动切换。多上游线路会被校验拒绝,上游失败直接返回错误。
256
270
  首次配置不再填充统一的百万上下文或 850K 压缩阈值,也不要求用户填写模型别名或内部 ID。
257
271
 
258
272
  创建或保存时,服务端执行配置校验、版本冲突检查和运行时更新。校验或更新失败不会覆盖已生效配置;版本冲突时刷新管理页会合并其他窗口新增的模型和不冲突的字段修改,保留本地编辑。同一字段冲突、修改与删除冲突或无法安全合并的结构变更会暂停该表单的保存,并保留当前输入;可先复制需要保留的内容,再点击“加载最新配置”确认放弃该表单的本地修改后重新编辑。上游 secret 保存在本地 `secrets.json`,Web GET 和预览不会回显明文。
@@ -275,17 +289,17 @@ requires_openai_auth = false
275
289
 
276
290
  新配置不强制指定 `model`,应用时保留 Codex 已有的模型选择。旧配置中的显式 `defaultModel` 仍受支持。
277
291
 
278
- 配置与 Virtual Provider 一对一。例如填写配置名称 `my-relay`,配置 ID、Virtual Provider ID 和 Codex `model_provider` 分别为 `my-relay`、`cabletidy_my-relay` 和 `cabletidy_my-relay`。名称包含大写或空格时仍会规范化为同样的配置 ID。
279
- 配置名称会转换为小写,并将空格等字符转换为 `-`;无法生成有效标识时使用原配置 ID。规范化后重名的配置,以及占用管理接口保留路径 `api` 的配置,会被拒绝。
292
+ 线路与 Virtual Provider 一对一。例如填写线路名称 `my-relay`,线路 ID、Virtual Provider ID 和 Codex `model_provider` 分别为 `my-relay`、`cabletidy_my-relay` 和 `cabletidy_my-relay`。名称包含大写或空格时仍会规范化为同样的线路 ID。
293
+ 线路名称会转换为小写,并将空格等字符转换为 `-`;无法生成有效标识时使用原线路 ID。规范化后重名的线路,以及占用管理接口保留路径 `api` 的线路,会被拒绝。
280
294
  旧配置加载时自动对齐内部 ID 和引用,保留模型映射和上游密钥,并移除 Virtual Provider 的独立 `listenHost` / `listenPort` 及 `daemon.proxyPortRange`。共用监听地址由 `web.listenHost` / `web.port` 决定,修改它需要重启 daemon。
281
- 升级后重启 CableTidy,在详情页重新“应用到 Codex”,将旧的独立端口地址更新为配置路径。暂停一份配置只暂停对应入口;重命名配置会改变路径,需要再次应用客户端配置。
295
+ 升级后重启 CableTidy,在详情页重新“应用到 Codex”,将旧的独立端口地址更新为线路路径。暂停一条线路只暂停对应入口;重命名线路会改变路径,需要再次应用客户端配置。
282
296
  上游连接的内部 ID 只用于 CableTidy 关联模型映射和路由,不参与 Codex provider 命名。
283
297
  CableTidy 不会在 daemon 启动时改写已有 Codex `config.toml`;只有用户主动应用配置时才会写入新的 provider。
284
298
 
285
299
  Codex Native Provider 的 MVP 接口契约是:
286
300
 
287
301
  ```text
288
- GET /v1/models 返回当前配置中显式设置的模型
302
+ GET /v1/models 返回当前线路中显式设置的模型
289
303
  POST /v1/responses 必须:普通和 stream Responses 请求
290
304
  ```
291
305
 
@@ -305,7 +319,7 @@ Web 管理台的“应用”操作会在 `~/.codex/config.toml` 中增量维护
305
319
 
306
320
  启用元数据覆盖后,“应用”还会写入 `model-catalogs/cabletidy-<hash>.json`,将根级 `model_catalog_json` 指向其绝对路径,并暂时移除会覆盖逐模型窗口的根级 `model_context_window`。原目录引用和窗口保存在 `.cabletidy-model-catalog.json`,所有模型恢复官方定义、再次应用时会恢复它们。原目录文件不被覆盖,其其他条目保留在生成目录中。
307
321
 
308
- Codex 的模型目录是当前配置级别的,不按 provider 隔离。手动切换其他 provider 不会自动撤销目录覆盖;应先恢复官方定义并应用。已有 `model_instructions_file`、`developer_instructions`、reasoning effort、compact 阈值和其他用户设置保持不变,预览会提示影响模型行为的覆盖项。生成目录后重启 Codex;更新 Codex 版本后刷新模型列表并重新应用。
322
+ Codex 的模型目录是当前线路级别的,不按 provider 隔离。手动切换其他 provider 不会自动撤销目录覆盖;应先恢复官方定义并应用。已有 `model_instructions_file`、`developer_instructions`、reasoning effort、compact 阈值和其他用户设置保持不变,预览会提示影响模型行为的覆盖项。生成目录后重启 Codex;更新 Codex 版本后刷新模型列表并重新应用。
309
323
 
310
324
  Virtual Provider 只监听 `127.0.0.1`、`localhost` 或 `::1`,不生成或校验本地 API Key。
311
325
  Codex 配置不包含 `env_key`,也不需要设置认证环境变量。例如,可以直接请求:
@@ -314,7 +328,7 @@ Codex 配置不包含 `env_key`,也不需要设置认证环境变量。例如
314
328
  curl http://127.0.0.1:43100/codex-main/v1/models
315
329
  ```
316
330
 
317
- 升级后重启 CableTidy,再在套装详情页点击“应用 Codex 配置”,即可移除该 provider
331
+ 升级后重启 CableTidy,再在线路详情页点击“应用 Codex 配置”,即可移除该 provider
318
332
  旧的 `env_key`。旧 CableTidy 配置中的 `localAuth` 和 `codex.localEnvKey` 在加载时忽略,
319
333
  旧 secrets store 中的本地密钥不再使用;上游密钥仍用于 daemon 出站认证。
320
334
  Claude Code 适配器会自动注入固定的 `cabletidy-local` 占位值以满足客户端认证检查,
@@ -322,13 +336,13 @@ Claude Code 适配器会自动注入固定的 `cabletidy-local` 占位值以满
322
336
 
323
337
  ## Claude Code 接入
324
338
 
325
- 新建配置时选择 Claude Code,填写 Anthropic Messages 兼容上游地址、认证方式和凭据。Anthropic 官方 API 和提供同协议的中转服务使用同一接入流程,每份配置仍只连接一个上游。
339
+ 新建线路时选择 Claude Code,填写 Anthropic Messages 兼容上游地址、认证方式和凭据。Anthropic 官方 API 和提供同协议的中转服务使用同一接入流程,每条线路仍只连接一个上游。
326
340
 
327
341
  默认透传客户端模型名,无需登记模型。按需添加“客户端完整模型 ID → 上游模型 ID”映射;仅改名不会限制工具、图片、thinking 等能力,具体能力由客户端和上游决定。已有配置中的显式能力限制仍然生效。Claude Code 的 `sonnet`、`opus` 等别名会在客户端解析,映射应填写实际发到 API 的完整模型 ID。
328
342
 
329
343
  模型映射只提供“客户端模型 ID”和“上游模型 ID”。客户端输入框支持搜索官方建议,也可直接填写自定义 ID;上游 ID 手动填写,留空时原样透传。建议目录内置于 `web/claude-models.js`,根据 [Anthropic 模型文档](https://platform.claude.com/docs/en/about-claude/models/overview) 整理,记录核对日期和来源,随 CableTidy 发版更新,无需额外 API Key。目录只辅助输入,不限制保存或请求中的模型名,也不会自动加入 `/v1/models`。
330
344
 
331
- “Claude Code 模型选择”分为“模型别名”和“默认模型”:前者包含 Opus/Sonnet/Fable/Haiku 的别名指向,后者包含下拉选择的启动模型和子代理模型。启动模型和子代理模型的下拉都提供默认行为、对应的官方别名和当前配置客户端模型 ID;创建页使用本次填写的模型映射,详情页使用已保存的模型映射,不使用上游模型 ID 或其他配置的模型。模型发现开关保留在表单底部,不单独分组。四个家族别名分别生成官方的 `ANTHROPIC_DEFAULT_<家族>_MODEL` 变量,Fable 使用 `ANTHROPIC_DEFAULT_FABLE_MODEL`。模型改名时同步更新引用它的家族别名、启动模型和子代理模型;删除映射时,引用该客户端 ID 的选择回到默认。启动模型或子代理模型选择的官方别名始终保留原文,由 Claude 解析,即使与内部模型 ID 同名也不会提前展开。保存后需要重新应用客户端配置。已不在候选列表中的旧默认值会在下一次正常保存时清空,页面不会自动写回配置。
345
+ “Claude Code 模型选择”分为“模型别名”和“默认模型”:前者包含 Opus/Sonnet/Fable/Haiku 的别名指向,后者包含下拉选择的启动模型和子代理模型。启动模型和子代理模型的下拉都提供默认行为、对应的官方别名和当前线路客户端模型 ID;创建页使用本次填写的模型映射,详情页使用已保存的模型映射,不使用上游模型 ID 或其他线路的模型。模型发现开关保留在表单底部,不单独分组。四个家族别名分别生成官方的 `ANTHROPIC_DEFAULT_<家族>_MODEL` 变量,Fable 使用 `ANTHROPIC_DEFAULT_FABLE_MODEL`。模型改名时同步更新引用它的家族别名、启动模型和子代理模型;删除映射时,引用该客户端 ID 的选择回到默认。启动模型或子代理模型选择的官方别名始终保留原文,由 Claude 解析,即使与内部模型 ID 同名也不会提前展开。保存后需要重新应用客户端配置。已不在候选列表中的旧默认值会在下一次正常保存时清空,页面不会自动写回配置。
332
346
 
333
347
  选择默认行为时 CableTidy 不指定该字段对应的模型;再次应用会恢复此前接管的对应环境变量原值,由 Claude 自身配置决定。选择启动模型通过 `ANTHROPIC_MODEL` 设置,选择子代理模型通过 `CLAUDE_CODE_SUBAGENT_MODEL` 设置,后续每次启动都会生效。上下文、reasoning effort 和压缩策略仍由 Claude Code 管理,不生成没有实际效果的逐模型窗口或 compact 设置。
334
348
 
@@ -355,7 +369,7 @@ Claude Code 适配器会自动注入固定的 `cabletidy-local` 占位值以满
355
369
 
356
370
  应用前会在 CableTidy 的 `backups` 目录备份原文件,在 Claude 配置目录的 `.cabletidy-settings.json` 中记录接管字段及原值,文件权限为 `0600`。切换到另一份 Claude 配置后,撤销仍恢复最初接入前的值。点击当前已应用配置的“撤销接入”恢复这些字段,保留应用后新增的无关设置;不会停止本地服务。
357
371
 
358
- 如果接管字段已被手工修改,预览列出冲突字段,应用和撤销均停止写入,不覆盖修改,也不显示冲突字段的秘密值。请先核对备份并保留自己的修改后处理冲突。无效 JSON、非普通文件和符号链接文件不会被替换。已有 `claude.env.v1` 配置继续兼容,新配置使用 `claude.settings.json.v1`。
372
+ 如果接管字段与上次应用记录不一致,预览列出冲突字段。点击应用或撤销时会弹窗说明情况:选择取消保留当前文件;选择确定则先备份当前文件,再继续覆盖接管字段。重新应用后,撤销仍恢复最初接入前的值,覆盖前的修改可从备份找回。弹窗不显示冲突字段的秘密值;确认期间 Claude 文件再次出现冲突时,需要重新确认。若另一窗口修改了线路目标或影响应用的配置,旧确认失效并中断当前流程,提示刷新后重新应用。确认校验到客户端写入期间,线路修改会等待本次操作结束。无效 JSON、非普通文件和符号链接文件不会被替换。已有 `claude.env.v1` 配置继续兼容,新配置使用 `claude.settings.json.v1`。
359
373
 
360
374
  管理台仅展示实际应用到 `settings.json` 的 JSON 片段,包含将合并的 `env` 字段,并显示目标路径、变更字段和冲突提示。点击“应用到 Claude Code”后仍显示同一种内容,不展示独立文件、Shell 命令或 PowerShell 等其他接入方式。
361
375
 
@@ -367,7 +381,7 @@ Claude Code 适配器会自动注入固定的 `cabletidy-local` 占位值以满
367
381
  | --- | --- | --- |
368
382
  | POST | `/v1/messages` | 普通及 SSE 推理;保留查询参数、协议扩展字段和 `anthropic-*` 请求头 |
369
383
  | POST | `/v1/messages/count_tokens` | 使用相同上游和模型映射,返回上游计数;不要求 `max_tokens`,上游不支持时保留其错误 |
370
- | GET | `/v1/models` | 只返回当前配置显式设置的客户端模型,协议字段 `display_name` 使用客户端 ID;支持 `limit=1..1000` 和 `after_id` |
384
+ | GET | `/v1/models` | 只返回当前线路显式设置的客户端模型,协议字段 `display_name` 使用客户端 ID;支持 `limit=1..1000` 和 `after_id` |
371
385
  | HEAD | `/api/hello` | 本地返回 204、不请求上游,仅确认本地入口可达 |
372
386
 
373
387
  `/messages` 保留为旧版兼容路径。标准接口应使用 `/v1/messages`。SSE 保留 ping、工具参数增量和流内错误,客户端断开时取消上游请求;模型改名只修改 Messages 响应及 `message_start` 的模型字段,不改工具数据。上游错误保留原状态码和响应体,重试、请求 ID 和 Anthropic 限流头随响应转发。
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "0.4.0-rc.4",
2
+ "version": "0.4.0-rc.6",
3
3
  "platform": "darwin-arm64",
4
4
  "target": "aarch64-apple-darwin",
5
- "sha256": "b5d7ff51e6aa39b8f02f4d3633a0928bd03afc2a3f90965bdf1e7903c2f2e1a8"
5
+ "sha256": "30415834cd0fd16fd1a96a885f12971b5cdd8ec3eaf73988556a0db12a9db966"
6
6
  }
Binary file
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "0.4.0-rc.4",
2
+ "version": "0.4.0-rc.6",
3
3
  "platform": "darwin-x64",
4
4
  "target": "x86_64-apple-darwin",
5
- "sha256": "8e27edddb2c5c97fd964c138313b1e5bc372b47565a33a4130bf163f03b2d603"
5
+ "sha256": "73aa55faf33937dc3bb6315a1216e970af6ff238183fc6903abcc259b670ea59"
6
6
  }
Binary file
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "0.4.0-rc.4",
2
+ "version": "0.4.0-rc.6",
3
3
  "platform": "linux-arm64",
4
4
  "target": "aarch64-unknown-linux-musl",
5
- "sha256": "2e30f8b82d83d1f91b442feb02f95823ffaf16244b41a39e5688debeee22c7f3"
5
+ "sha256": "fd1b155cceb5ee1690cf1fafea9b576eb3bd28a71838e264b0d71fd80cce2306"
6
6
  }
Binary file
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "0.4.0-rc.4",
2
+ "version": "0.4.0-rc.6",
3
3
  "platform": "linux-x64",
4
4
  "target": "x86_64-unknown-linux-musl",
5
- "sha256": "b6b7f56f4f4a1b4d4a399d9f6b2db3b47ec72570e2f227559fc06c12a204ffbe"
5
+ "sha256": "9b40694daa0b3eb7ada87023b9727665e765c22ac443fd0277885191665adf81"
6
6
  }
Binary file
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "0.4.0-rc.4",
2
+ "version": "0.4.0-rc.6",
3
3
  "platform": "win32-x64",
4
4
  "target": "x86_64-pc-windows-msvc",
5
- "sha256": "98450f6e5fb2d531f8809bb6eedffe137aaa7a12e1376ec838e148e93de98ae6"
5
+ "sha256": "8ce5ddf991c0405b72a859a5d5d290602d0667d941e09995cbf95734b9acee2f"
6
6
  }
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cabletidy",
3
- "version": "0.4.0-rc.4",
3
+ "version": "0.4.0-rc.6",
4
4
  "description": "A local multi-target coding CLI gateway and provider manager.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -34,7 +34,8 @@
34
34
  "dev:status": "node scripts/dev.mjs status",
35
35
  "test": "node scripts/test.mjs",
36
36
  "test:security:browser": "node scripts/build-native.mjs --debug --test && node scripts/security-browser.mjs",
37
- "test:config:browser": "node scripts/build-native.mjs --debug --test && node scripts/config-transfer-browser.mjs",
37
+ "test:cables:browser": "node scripts/build-native.mjs --debug --test && node scripts/cable-transfer-browser.mjs",
38
+ "test:settings:browser": "node scripts/build-native.mjs --debug --test && node scripts/settings-browser.mjs",
38
39
  "test:package": "npm run build && node --test scripts/package-smoke.mjs",
39
40
  "test:claude": "node scripts/build-native.mjs --debug --test && node --test scripts/claude-smoke.mjs",
40
41
  "check:release": "node scripts/check-release.mjs",