@dsh-enhanced/coding-subscription-provider 0.1.1 → 0.1.3
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 +81 -30
- package/lib/adapter.d.ts +34 -3
- package/lib/adapter.d.ts.map +1 -1
- package/lib/adapter.js +288 -71
- package/lib/adapter.js.map +1 -1
- package/lib/codex-direct-auth.d.ts +34 -0
- package/lib/codex-direct-auth.d.ts.map +1 -0
- package/lib/codex-direct-auth.js +604 -0
- package/lib/codex-direct-auth.js.map +1 -0
- package/lib/codex-direct-responses.d.ts +50 -0
- package/lib/codex-direct-responses.d.ts.map +1 -0
- package/lib/codex-direct-responses.js +1585 -0
- package/lib/codex-direct-responses.js.map +1 -0
- package/lib/config.d.ts +16 -1
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +34 -1
- package/lib/config.js.map +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +32 -4
- package/lib/index.js.map +1 -1
- package/lib/process.d.ts +6 -0
- package/lib/process.d.ts.map +1 -1
- package/lib/process.js +26 -4
- package/lib/process.js.map +1 -1
- package/lib/prompt.d.ts.map +1 -1
- package/lib/prompt.js +33 -2
- package/lib/prompt.js.map +1 -1
- package/lib/session-cwd.d.ts +24 -0
- package/lib/session-cwd.d.ts.map +1 -0
- package/lib/session-cwd.js +39 -0
- package/lib/session-cwd.js.map +1 -0
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +14 -4
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# @dsh-enhanced/coding-subscription-provider
|
|
2
2
|
|
|
3
|
-
将同一台机器、同一 OS 用户已经登录的 Codex、Claude Code、Cursor Agent 与 Grok Build 注册为 DeepSeek Harness 可选择的模型 provider
|
|
3
|
+
将同一台机器、同一 OS 用户已经登录的 Codex、Claude Code、Cursor Agent 与 Grok Build 注册为 DeepSeek Harness 可选择的模型 provider。默认情况下,四条 route 会在经过 live Agent session 工作区校验的调用中,通过官方 CLI 的无 prompt 控制面观察当前账号可见模型;Codex、Claude 与 Grok 还会暴露逐模型 reasoning effort。调用消耗哪个套餐、是否允许额外用量,仍由对应官方客户端和账号决定。
|
|
4
4
|
|
|
5
|
-
这是一个实验性的 **LLM
|
|
5
|
+
这是一个实验性的 **LLM 兼容层**。默认 `cli` transport 会把完整对话序列化为一次本地 coding-agent 任务,只取回最终助手文本;Codex 另有必须显式开启的 `direct-responses` transport,可绕过 Codex CLI / App Server,流式返回文本、原生 function tool call,并在 attachment service 可用时发送图片。现有 API Key / OpenAI-compatible provider 是另一条路径,本插件不重复实现。
|
|
6
6
|
|
|
7
7
|
## 当前 provider
|
|
8
8
|
|
|
@@ -13,25 +13,27 @@
|
|
|
13
13
|
| `cursor-subscription` | `cursor-agent` | beta | `default` |
|
|
14
14
|
| `grok-subscription` | `grok` | beta | `default` |
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
在默认 CLI 模式中,`default` 不会传 `--model`,因此保留官方 CLI 当前选择。`listModels` / `resolveModel` 始终是无进程的纯读取:启动后先显示配置中的静态别名;一次经过 live session 校验的调用观察到 CLI 目录后,再合并该 5 分钟缓存。不需要把每个模型手写进配置。目录是提示性的发现信息,不会阻止用户配置新模型,最终可用性仍由官方 CLI 校验。Codex direct 模式不启动 App Server、也不发现动态目录;其中 `default` 会明确映射到 `codex.directModel`。
|
|
17
17
|
|
|
18
18
|
安全默认值只启用 Codex 与 Cursor。Claude 因第三方分发政策边界默认关闭;Grok 因本地 per-model API Key 可覆盖 OAuth,默认关闭并要求用户先核验后显式确认。四条 connector 都包含在插件中。
|
|
19
19
|
|
|
20
|
-
## 快速开始(5 步)
|
|
20
|
+
## 快速开始(CLI transport,5 步)
|
|
21
21
|
|
|
22
22
|
以启用 Codex 为例,最短路径如下:
|
|
23
23
|
|
|
24
24
|
1. **登录官方 CLI**(在运行 DSH 的同一 OS 用户下):`codex login status` 应输出 `Logged in using ChatGPT`。没登录就先 `codex login`。
|
|
25
25
|
2. **安装插件**:`dsh plugin --profile web add @dsh-enhanced/coding-subscription-provider`。
|
|
26
|
-
3.
|
|
26
|
+
3. **确认命令与工作目录**:`codex --version`。命令名不同就在 `~/.dsh/profiles/web/cordis.patch.yml` 里把 `codex.command` 改成实际路径;同时把 `cwd` 指向要处理的 Git 仓库(相对路径按 DSH 进程启动目录解析)。
|
|
27
27
|
4. **开启并落盘配置**:在配置中保持 `codex.enabled: true`(默认已开),执行 `dsh --profile web --dump-config` 检查生效值。
|
|
28
|
-
5. **选择模型与 effort
|
|
28
|
+
5. **选择模型与 effort**:首次可直接选配置中的 `default` 沿用 CLI 当前模型;经过一次 live-session 调用后,模型选择器会合并本次安全观察到的模型及 reasoning effort。目录初始化发生在 session/workspace 校验之后、提交 prompt 之前;真实生成调用会消耗你的订阅额度。
|
|
29
29
|
|
|
30
30
|
Claude / Grok 默认关闭,启用前请阅读下文「订阅认证优先」与「Claude 合规提示」。遇到报错先看下文「排查」表。
|
|
31
31
|
|
|
32
|
+
如果只使用显式 opt-in 的 Codex `direct-responses`,生成和模型目录都不会启动 Codex CLI/App Server,也不要求 `codex` 可执行文件存在;但运行 DSH 的同一 POSIX 用户必须已经拥有安全的 `CODEX_HOME/auth.json` 或 `~/.codex/auth.json`。这通常由官方 Codex 登录流程产生,插件自身不提供登录 UI。
|
|
33
|
+
|
|
32
34
|
## 安装
|
|
33
35
|
|
|
34
|
-
先分别安装需要的官方客户端,并由当前 OS
|
|
36
|
+
CLI transport 先分别安装需要的官方客户端,并由当前 OS 用户在客户端中完成登录。Codex direct 可跳过客户端安装,但仍要求上述安全 auth 文件。插件不会替用户打开登录页或接管初始登录:
|
|
35
37
|
|
|
36
38
|
```sh
|
|
37
39
|
codex login status
|
|
@@ -71,9 +73,15 @@ dsh --profile web --dump-config
|
|
|
71
73
|
logDiagnostics: false
|
|
72
74
|
codex:
|
|
73
75
|
enabled: true
|
|
76
|
+
transport: cli
|
|
74
77
|
command: codex
|
|
75
78
|
models: [default]
|
|
76
79
|
maxTurns: 1
|
|
80
|
+
directModel: gpt-5.6-sol
|
|
81
|
+
directReasoningEfforts: [low, medium, high, xhigh, max, ultra]
|
|
82
|
+
directDefaultReasoningEffort: low
|
|
83
|
+
maxRequestBytes: 33554432
|
|
84
|
+
maxRequestImageBytes: 25165824
|
|
77
85
|
claude:
|
|
78
86
|
enabled: false
|
|
79
87
|
command: claude
|
|
@@ -92,14 +100,33 @@ dsh --profile web --dump-config
|
|
|
92
100
|
userVerifiedSubscription: false
|
|
93
101
|
```
|
|
94
102
|
|
|
95
|
-
|
|
103
|
+
如需试用 Codex 私有直连,只把 Codex 的 transport 显式改为下列值;不要把它当成默认或稳定路径:
|
|
104
|
+
|
|
105
|
+
```yaml
|
|
106
|
+
codex:
|
|
107
|
+
enabled: true
|
|
108
|
+
transport: direct-responses
|
|
109
|
+
models: [default]
|
|
110
|
+
directModel: gpt-5.6-sol
|
|
111
|
+
directReasoningEfforts: [low, medium, high, xhigh, max, ultra]
|
|
112
|
+
directDefaultReasoningEffort: low
|
|
113
|
+
maxRequestBytes: 33554432
|
|
114
|
+
maxRequestImageBytes: 25165824
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
- `codex.transport` 默认为 `cli`,维持官方 Codex CLI 的认证、沙箱和模型目录路径。只有显式设置为 `direct-responses` 才会启用下文说明的私有 Responses 协议;该模式绕过 Codex CLI 与 App Server,`command`、`maxTurns` 和 CLI 动态模型目录不参与生成。
|
|
118
|
+
- `codex.directModel` 是 direct 模式选择 `default` 时发送给后端的具体模型 id;显式选择其他模型时仍使用所选 id。这个默认值只是本插件的实验性配置,不代表私有后端长期保证该模型可用。
|
|
119
|
+
- `codex.directReasoningEfforts` 是 direct route 向 DSH 暴露的可选 effort 列表,`codex.directDefaultReasoningEffort` 是调用未指定 effort 时由 DSH 物化的默认值,并且必须属于前一列表。当前默认暴露 `low` 到 `ultra`;私有 wire 会按官方 Codex 当前行为把 `ultra` 规范化为 `max`,这同样不是稳定承诺。
|
|
120
|
+
- `codex.maxRequestBytes` 限制序列化后的完整 direct 请求(包括 base64 图片),`codex.maxRequestImageBytes` 限制请求内累计图片负载,且后者不能大于前者。默认分别为 32 MiB 与 24 MiB;两项只影响 direct 模式。
|
|
121
|
+
- `cwd` 是 CLI 子进程允许使用的工作目录,也是 direct 模式的本地 session 授权边界;相对路径按 DSH 进程启动目录解析,不是按 Web 会话显示的项目目录解析。对每个**带 prompt 的生成调用**,插件只接受 DSH Agent Loop 在本进程标记且深冻结的请求,使用其 live `sessionId` 从 host `sessions` 服务取 header cwd,对二者做 `realpath` 后要求与配置 cwd 完全相等。缺失、过期、伪造、未标记、路径不匹配或 symlink escape 都会在认证、网络请求或 CLI 启动前以 `LOCAL_SESSION_CWD_REQUIRED` 拒绝;CLI 模式收到的是该 canonical session cwd。Codex `exec` 要求这里是 Git 仓库;插件不会静默追加 `--skip-git-repo-check` 绕过该检查。Web profile 可在 `~/.dsh/profiles/web/cordis.patch.yml` 中覆盖此值,修改后需重启 DSH。
|
|
122
|
+
- `listModels` / `resolveModel` 没有 `GenerateOptions` 或 live session identity,因此只读取配置和已经安全观察到的内存缓存,**绝不做认证、目录发现或启动子进程**。目录刷新只发生在 `stream` 已校验 live session、canonical cwd 并完成认证之后;认证后还会再次读取 session,阻止过期/替换 session 启动目录进程。
|
|
96
123
|
- `timeoutMs` 是单次调用总时限;取消或超时先发 `SIGINT`,经过 `killGraceMs` 再发 `SIGKILL`,再等待一个等长窗口确认 `close`。仍未关闭时请求以 `teardown=timed-out` 错误结算,保留原始 abort/timeout 分类,并在后台继续引流并跟踪迟到的 `close`;不会伪称子进程已回收。
|
|
97
|
-
- `authProbeTimeoutMs` / `maxAuthProbeBytes`
|
|
124
|
+
- `authProbeTimeoutMs` / `maxAuthProbeBytes` 限制 CLI 模式 live-session 调用中的认证状态检查和无 prompt 模型目录发现;探针输出不会进入日志或模型响应。Codex direct 请求使用总调用的 `timeoutMs`,不运行这些 CLI 探针。
|
|
98
125
|
- 三项输出限制和 prompt 限制都按 UTF-8 字节计算。
|
|
99
126
|
- `maxTurns` 目前只映射到 Claude Code 和 Grok Build;Codex/Cursor 不会收到它们不支持的参数。
|
|
100
|
-
- `models`
|
|
127
|
+
- `models` 是启动时即可展示的静态别名列表;CLI route 会在一次安全调用观察目录后合并动态条目,Codex direct 模式只使用静态别名。通常保留 `[default]` 即可。
|
|
101
128
|
- 启用 Grok 前先通过 browser/device flow 完成 `grok login`,确认 `grok models` 报告已登录,再用 `grok inspect` 确认所选模型没有 `api_key` / `env_key` override;随后同时设置 `enabled: true` 与 `userVerifiedSubscription: true`。`inspect` 本身不报告 active credential,该确认是本机用户的显式声明,不是插件读取凭据后的推断。
|
|
102
|
-
- `command`
|
|
129
|
+
- `command` 是单个命令名或路径,CLI 模式固定参数数组并使用 `shell: false`,不接受 shell 片段;Codex direct 模式不使用该字段。
|
|
103
130
|
- `extraEnvNames` 只填写要额外继承的环境变量名,值只能来自启动 DSH 的环境,配置中不能直接写 secret。
|
|
104
131
|
- `logDiagnostics` 默认只提示“CLI 写入了 stderr”,不记录内容;显式开启后才记录经过常见 key/token/邮箱规则脱敏的末尾 2,000 字符,仍不适合高敏感环境。独立于该开关,插件始终会在每次调用结算时记录一条**无凭据**的生命周期诊断(阶段、prompt 是否提交、结果分类、teardown 状态、exit/signal,以及能可靠测得的毫秒级延迟指标),成功走 `debug`、非成功走 `info`。该行不含 prompt、argv、stderr 原文或认证凭据。
|
|
105
132
|
|
|
@@ -107,7 +134,7 @@ dsh --profile web --dump-config
|
|
|
107
134
|
|
|
108
135
|
### 订阅认证优先
|
|
109
136
|
|
|
110
|
-
子进程默认只继承运行客户端所需的最小环境,例如 `PATH`、`HOME`、XDG、代理/CA、`CODEX_HOME`、`CLAUDE_CONFIG_DIR` 和 `GROK_HOME`。以下 API 凭据即使写入 `extraEnvNames` 也不会传递:
|
|
137
|
+
CLI 子进程默认只继承运行客户端所需的最小环境,例如 `PATH`、`HOME`、XDG、代理/CA、`CODEX_HOME`、`CLAUDE_CONFIG_DIR` 和 `GROK_HOME`。以下 API 凭据即使写入 `extraEnvNames` 也不会传递:
|
|
111
138
|
|
|
112
139
|
```text
|
|
113
140
|
CODEX_API_KEY
|
|
@@ -121,35 +148,43 @@ XAI_API_KEY
|
|
|
121
148
|
|
|
122
149
|
已知的自定义 base URL、Claude Bedrock/Vertex/Foundry 切换变量也会被排除;上述变量即使出现在 `extraEnvNames` 也不会传递。插件在每次调用前或调用初始化阶段执行 fail-closed 门禁:
|
|
123
150
|
|
|
124
|
-
- Codex
|
|
151
|
+
- Codex CLI 模式只有 `codex login status` 精确报告 `Logged in using ChatGPT` 才运行,并以 `--ignore-user-config` 禁止真实生成被本地配置改路由到其他 API。模型发现会另启短生命周期 App Server,强制 `model_provider="openai"`,只执行 `initialize` 与 `model/list`,不会创建 thread 或 turn。
|
|
152
|
+
- Codex direct 模式不运行 `codex login status` 或 App Server,而是安全读取 `CODEX_HOME/auth.json`;未设置 `CODEX_HOME` 时读取 `~/.codex/auth.json`。认证路径在启动时固定为绝对路径;文件及其父目录必须由当前 POSIX 用户拥有,父目录不能向 group/other 开放写权限,文件必须是单链接普通文件、不能是 symlink、不能向 group/other 开放权限,并且 `auth_mode` 必须是 `chatgpt`。读取有字节上限并校验前后元数据一致。凭据只用于固定的 Codex Responses 请求;插件不会向调用方暴露 bearer token。
|
|
153
|
+
- direct 请求使用与固定官方快照核对过的 `session-id`、`thread-id` 和 `x-client-request-id` 兼容头;originator/version/user-agent 属于本插件固定的 reconstruction dialect 标识,并不冒充官方二进制逐字节相同的 OS/终端 user-agent。
|
|
154
|
+
- direct 请求收到 401 时,插件会先重新读取磁盘以复用其他进程已刷新的 session;仍是原 token 时,才向固定 OAuth token endpoint 发起一次 refresh。同一进程内相同认证身份共享一次刷新;写回采用元数据 CAS、同目录 `0600` 临时文件、`fsync` 和原子 rename。随后原请求只重试一次;其他 HTTP 状态不会触发刷新。插件自身并发写受 CAS 保护,但无法强制不遵循同一约定的外部 Codex 进程参与原子比较写,因此跨进程冲突处理是 best-effort。错误与诊断不记录 token。
|
|
125
155
|
- Claude 只有 `auth status --json` 报告 first-party `claude.ai` / `oauth_token` 才运行;目录发现只发送 Agent SDK `initialize` 控制帧并读取 `models`,不发送 user message。这是订阅 OAuth 来源的强启发式,不代表插件能证明具体套餐 entitlement。
|
|
126
156
|
- Cursor 先要求 `status` 成功,再以 `--list-models` 发现目录;本次生成仍要求 `stream-json` 的 `system/init.apiKeySource` 为 `login`,`env`、`flag` 或缺失字段都会中止。
|
|
127
157
|
- Grok 目录发现只发送 ACP `initialize` 并读取 `_meta.modelState`,不创建 session 或提交 prompt。headless 生成暂时无法独立证明 effective credential,因此仍必须由本机用户核对配置并设置 `userVerifiedSubscription: true`。
|
|
128
158
|
|
|
129
159
|
认证不满足时返回 `SUBSCRIPTION_AUTH_REQUIRED`,不会静默改走 API provider。API Key 调用继续使用 DSH 已有的独立 provider。
|
|
130
160
|
|
|
161
|
+
> **兼容性警告:** `direct-responses` 使用的是 ChatGPT/Codex 当前的非公开、私有风格协议,不是 OpenAI 面向第三方承诺稳定性的公开 API。endpoint、认证文件、header、模型 id 与 SSE 事件都可能在没有兼容期的情况下变化或失效;该模式必须视为可随时中断的实验功能,不能宣传为 OpenAI 官方支持的集成。默认 `cli` 不依赖这条私有协议。
|
|
162
|
+
|
|
131
163
|
## 默认执行策略
|
|
132
164
|
|
|
133
|
-
- Codex
|
|
165
|
+
- Codex CLI(默认):`codex exec --json --ephemeral --ignore-user-config --sandbox read-only`;选择具体模型时追加 `--model <id>`,选择 effort 时追加 `--config model_reasoning_effort="<effort>"`。
|
|
166
|
+
- Codex direct(显式 opt-in):不启动 CLI/App Server,固定向 `https://chatgpt.com/backend-api/codex/responses` 发送有界 SSE 请求。DSH tool schema 会映射为原生 function tools;插件只保留并返回后端给出的 tool name、原始 arguments 与 `call_id`,**不会自行执行工具**。实际工具调用由 DSH Agent Loop 交给 Policy 鉴权后执行,再以相同 `call_id` 的 tool result 进入下一轮模型请求。开启 attachment service 时可把 DSH image block 投影为图片输入;没有该服务时 provider 只声明 text。
|
|
134
167
|
- Claude Code:`-p --output-format stream-json --include-partial-messages --safe-mode --permission-mode dontAsk --tools "" --no-session-persistence`;选择 effort 时追加 `--effort <level>`。
|
|
135
168
|
- Cursor Agent:`--print --output-format stream-json`,不传 `--force`。
|
|
136
169
|
- Grok Build:`-p <task> --output-format streaming-json --permission-mode dontAsk --no-auto-update --no-memory --no-subagents --disable-web-search --verbatim --tools search_tool --disallowed-tools search_tool,use_tool`;`--verbatim` 保留 DSH 的原始 prompt,后两项按 Grok 1.0.5 的过滤规则把最终生成工具集收敛为空(空 `--tools` 会被当作未过滤),避免兼容层意外探索仓库。选择 effort 时追加 `--reasoning-effort <level>`。解析器按官方原生流读取 `text.data`,以 `end` 确认成功终态、以 `error` 拒绝失败终态。
|
|
137
170
|
|
|
138
|
-
每次调用都是独立任务,不恢复外部 CLI session。插件不会在失败后自动切换 provider
|
|
171
|
+
每次调用都是独立任务,不恢复外部 CLI session。插件不会在失败后自动切换 provider;Codex direct 仅为认证 401 做上述单次刷新与单次原请求重试,不对模型或工具轮次做通用重试。
|
|
139
172
|
|
|
140
173
|
## 权限与数据边界
|
|
141
174
|
|
|
142
175
|
| 能力 | 行为 |
|
|
143
176
|
|---|---|
|
|
144
|
-
| 文件系统 |
|
|
145
|
-
| 网络 |
|
|
146
|
-
| 子进程 |
|
|
147
|
-
| 凭据 |
|
|
177
|
+
| 文件系统 | CLI 模式把经过 live-loop session 身份和 canonical `realpath` 精确校验的 cwd 交给外部 CLI;普通 `listModels` / `resolveModel` 不启动进程。Codex CLI 使用 read-only sandbox;Claude 禁用内置 tools;Grok 1.0.5 使用 allowlist + denylist 形成空生成工具集;Cursor/Grok 的最终强度仍取决于客户端版本、用户配置和 OS 隔离。Codex direct 不把 cwd 交给模型进程,但会读取并可能以 CAS + 原子替换更新 `CODEX_HOME/auth.json` 或 `~/.codex/auth.json`;与不使用同一 CAS 的外部写者并发时只能 best-effort 避免覆盖。图片字节只通过宿主提供的 attachment service 读取。 |
|
|
178
|
+
| 网络 | CLI 模式下插件本身不请求模型端点,官方 CLI 会连接各自的登录、推理、更新或遥测服务。Codex direct 由插件固定请求 `https://chatgpt.com/backend-api/codex/responses`,仅在 401 刷新时请求 `https://auth.openai.com/oauth/token`;不能把凭据用于任意 URL。请求正文会把对话、tool schema/tool result,以及可用时的图片发送给该私有后端。 |
|
|
179
|
+
| 子进程 | CLI 模式仅直接启动配置的单个可执行文件,`shell: false`;目录发现会短暂启动同一可执行文件的 App Server、SDK/ACP 初始化或列表模式。POSIX 上为生成调用建立进程组并整体取消;Windows 只能 best-effort 终止直接子进程。官方 CLI 仍可能自行创建脱离进程组的后代。Codex direct 不启动 Codex CLI 或 App Server。 |
|
|
180
|
+
| 凭据 | CLI 模式不读取官方 auth 文件、不实现 OAuth,由官方客户端访问凭据。Codex direct 会按上述 POSIX 文件约束直接读取 ChatGPT session,在 401 时至多刷新一次,并以插件自身的 CAS + 原子替换流程写回;它不接受 API key fallback,也不把 token 写入响应或日志。 |
|
|
148
181
|
| 浏览器 | 插件不会打开浏览器;用户单独执行官方 login 时可能打开。 |
|
|
149
182
|
| 安装脚本 | 本 npm 包没有 install/postinstall 脚本,也不会安装或更新四个官方 CLI。 |
|
|
150
183
|
| 日志 | stderr 有界且默认不记录内容。选择 `logDiagnostics` 后会脱敏常见 key、Bearer token 和邮箱,但无法识别任意业务秘密;插件本身不主动记录 prompt。每次调用结算记录一条无凭据生命周期诊断(阶段/提交状态/结果分类/teardown/exit/signal,以及可测得的毫秒级延迟指标),不含 prompt、argv、stderr 原文或认证凭据。 |
|
|
151
184
|
|
|
152
|
-
|
|
185
|
+
CLI 模式的任务正文作为独立 argv 元素传给官方 CLI。它不会经过 shell,但仍受操作系统命令行长度限制,并且在某些系统上可能被同机高权限用户通过进程列表看到;敏感、多用户主机应增加 OS 级隔离。默认 prompt 上限因此保守设为 128 KiB。Codex direct 不把 prompt 放进进程 argv,而是受独立的 `codex.maxRequestBytes` 限制。
|
|
186
|
+
|
|
187
|
+
DSH 的 skill catalog 更新是完整替换。CLI 模式序列化兼容 prompt 时,若最新目录明确带有 replacement 标记,插件只发送最新目录,不再重复发送它已经取代的旧目录;durable session 历史不会被改写。裁剪后仍超过 `maxPromptBytes` 时,插件返回标准 `CONTEXT_WINDOW_EXCEEDED`;宿主启用了自动 compaction 时,可据此先压缩历史再重试。Codex direct 则发送 typed Responses input,并对完整 JSON 请求和累计图片负载分别做字节限制。
|
|
153
188
|
|
|
154
189
|
## 排查
|
|
155
190
|
|
|
@@ -157,14 +192,24 @@ XAI_API_KEY
|
|
|
157
192
|
|
|
158
193
|
| 错误码 | 含义 | 处理 |
|
|
159
194
|
|---|---|---|
|
|
160
|
-
| `SUBSCRIPTION_AUTH_REQUIRED` | 调用前的认证门禁未通过(未登录,或检测到 API key / 非订阅来源) | 在同一 OS 用户下重新 `login
|
|
195
|
+
| `SUBSCRIPTION_AUTH_REQUIRED` | 调用前的认证门禁未通过(未登录,或检测到 API key / 非订阅来源) | 在同一 OS 用户下重新 `login`;CLI 模式确认没有把 API key 写进 `extraEnvNames`;Codex direct 还要确认 auth 文件是当前用户拥有的普通文件且权限不向 group/other 开放;Grok 需另设 `userVerifiedSubscription: true`(见「订阅认证优先」)。 |
|
|
196
|
+
| `LOCAL_SESSION_CWD_REQUIRED` | 请求没有匹配的 live loop session,或其 canonical cwd 与配置 cwd 不完全一致 | 从真实 DSH Agent Loop 发起调用;确认 session header cwd 与插件配置的 `cwd` 指向同一 realpath,且不要通过 symlink 跨出该目录。 |
|
|
161
197
|
| `CLI_NOT_FOUND` | 找不到可执行文件(`ENOENT`) | 核对该 provider 的 `command` 是否为正确的命令名/绝对路径,并确认它在 DSH 进程的 `PATH` 中。 |
|
|
162
|
-
| `
|
|
163
|
-
| `
|
|
198
|
+
| `CLI_WORKING_DIRECTORY` | Codex 拒绝了配置的工作目录,因为它不是可接受的 Git 仓库 | 把 profile 中的 `cwd` 改为目标 Git 仓库的绝对路径并重启 DSH;不要只根据 Web 会话显示的 cwd 推断子进程 cwd。 |
|
|
199
|
+
| `CONTEXT_WINDOW_EXCEEDED` | CLI prompt 超过本地限制,或 Codex direct 明确返回 `context_length_exceeded` | 若宿主已启用自动 compaction,可让其压缩后重试;否则手动缩短历史、skill 描述或 tool schema。只有确认对应边界足够时才调大本地限制。 |
|
|
200
|
+
| `CLI_TIMEOUT` | 单次 CLI 或 Codex direct 调用超过 `timeoutMs` | 简化 prompt,或调大 `timeoutMs`;CLI 模式还应确认官方客户端未卡在交互式提示上。 |
|
|
201
|
+
| `CLI_PROTOCOL_ERROR` | CLI 输出或 Codex private SSE 不符合当前有界协议(含畸形事件、字段冲突或缺失终态) | CLI 模式可手动复现并采集 fixture;direct 模式优先怀疑私有协议漂移。 |
|
|
164
202
|
| `CLI_FAILED` | 子进程非零退出或其他未归类失败 | 开 `logDiagnostics` 看脱敏 stderr 尾部;单独运行官方 CLI 复现。 |
|
|
203
|
+
| `QUOTA` | Codex direct 明确返回 `insufficient_quota` | 检查当前 ChatGPT/Codex 账号的可用额度;插件不会自动切换 provider。 |
|
|
204
|
+
| `EMPTY_RESPONSE` | direct 请求成功终止但没有文本、reasoning 或可执行 tool call | 重试前先检查私有协议是否发生变化;该错误不会伪装成空成功。 |
|
|
205
|
+
| `CODEX_DIRECT_PROVIDER_HTTP` | Responses 或 refresh endpoint 返回非认证类 HTTP 错误 | 查看 `failure.status`(如 429/503),按服务状态处理;不会触发通用自动重试。 |
|
|
206
|
+
| `CODEX_DIRECT_PROVIDER_FAILURE` | private SSE 明确报告未细分的 provider failure | 私有后端拒绝了本轮;诊断使用固定脱敏文案,不透传 provider message。 |
|
|
207
|
+
| `CODEX_DIRECT_CONTENT_FILTER` | private SSE 明确报告内容过滤 | 调整输入;插件不会把过滤结果当作普通空输出。 |
|
|
208
|
+
| `CODEX_DIRECT_TRANSPORT_ERROR` | 固定 endpoint 的 fetch/连接失败 | 检查网络、代理和 TLS;凭据与 prompt 不会写入错误。 |
|
|
209
|
+
| `CODEX_DIRECT_RESPONSES_FAILED` | 其他未归类的 direct 请求失败 | 确认 `transport` 是有意开启;私有协议可能已变化,不能假定稳定兼容。 |
|
|
165
210
|
| `INVALID_PROVIDER` | 选择了本插件未提供的 provider id | 只使用上表四个 `*-subscription` route。 |
|
|
166
211
|
|
|
167
|
-
插件**不会**在失败后自动切换 provider
|
|
212
|
+
插件**不会**在失败后自动切换 provider,也不做通用模型重试;唯一例外是 Codex direct 的 401 认证刷新后原请求单次重试。每次调用结算都会记录一条无凭据生命周期诊断(成功走 `debug`、失败走 `info`),可据此定位失败发生在哪个阶段。
|
|
168
213
|
|
|
169
214
|
### 采集真实 CLI fixture(维护者)
|
|
170
215
|
|
|
@@ -178,14 +223,18 @@ node plugins/coding-subscription-provider/scripts/capture-cli-fixtures.mjs --hel
|
|
|
178
223
|
|
|
179
224
|
## 已知限制
|
|
180
225
|
|
|
181
|
-
- DSH `0.1.0-rc.
|
|
182
|
-
-
|
|
183
|
-
-
|
|
226
|
+
- DSH `0.1.0-rc.8` 只有 `LlmAdapter` provider 接缝;本版因此是兼容适配,不是完整的 Agent Runtime。
|
|
227
|
+
- Claude、Cursor、Grok 以及默认 Codex CLI route 仍是 text-only,不能发出 tool call。请求携带非空 `tools` 时,这些 CLI 路径会在启动子进程前以 `tool_calls_unsupported` 明确失败;对应 route capability 为 `toolCalls: none`。
|
|
228
|
+
- 只有显式 opt-in 的 Codex direct route 发布 `toolCalls: native`。它只负责把原生 function call 交还 DSH;工具选择、参数审批、执行和结果回传仍受 Agent Loop / Policy 控制,provider 本身没有绕开策略执行本机工具的权限。
|
|
229
|
+
- Codex direct 只有在可选 attachment service 实际可用时才声明 `text + image`;否则仍为 text-only。音频、视频和任意文件都不支持。其图片与完整 JSON 请求有独立字节上限。
|
|
230
|
+
- Codex direct 的 auth 文件安全检查依赖 POSIX 所有权、链接数和权限位,因此当前不支持 Windows;Windows 仍使用默认 CLI transport。
|
|
231
|
+
- CLI 路径不提供供应商 token usage;`assistant-automations` 的周期 token 预算会按全额预留结算,详见该插件 README。Codex direct 会读取私有 Responses 终态中的 usage,但该字段同样属于不稳定协议。
|
|
232
|
+
- CLI 模式下,`temperature`、`stop`、`maxTokens` 等参数只能进入任务约束,不能保证与原生模型 API 等价。当前私有 Codex request schema 没有 `temperature` 或 `max_output_tokens`:direct route 对显式 `temperature` 和非空 `stop` fail closed;DSH Agent Loop 的 `maxTokens` 只作为宿主本地预算消费,不发送到私有 wire。
|
|
184
233
|
- Codex JSONL 当前主要提供事件级文本;解析器允许已识别事件旁出现向后兼容扩展,但若整条流只有未知/畸形事件、没有 assistant 文本或缺少规定终态,会返回 `CLI_PROTOCOL_ERROR`,不会产生空成功。
|
|
185
234
|
- 仅靠“不传 force / dontAsk / prompt 指令”不是强沙箱。需要处理不可信仓库时,应在容器、只读挂载或独立 OS 账号中运行 DSH。
|
|
186
|
-
- 插件没有远程共享、公共 HTTP 代理、token
|
|
235
|
+
- 插件没有远程共享、公共 HTTP 代理、token 导入或浏览器抓取能力。Codex direct 只封装一个固定私有 endpoint 与固定 refresh endpoint,不是可配置的通用认证代理。
|
|
187
236
|
- Cursor 目前只自动发现模型。其官方 headless CLI 尚未暴露可验证的 effort 参数;Max Mode/Thinking 变体不会伪装成 DSH effort,待上游提供机器可用控制面后再接入。
|
|
188
|
-
- Codex App Server、Claude SDK control 与 Grok ACP
|
|
237
|
+
- Codex CLI 模式的 App Server、Claude SDK control 与 Grok ACP 只用于模型目录发现;这些生成路径仍使用各自一次性 CLI。Codex direct 不使用 App Server,也不做动态模型发现。Grok effective credential 绑定、动态 CLI 版本探测和持久外部会话属于后续阶段。
|
|
189
238
|
|
|
190
239
|
### Claude 合规提示
|
|
191
240
|
|
|
@@ -194,9 +243,11 @@ Anthropic 的技术文档允许 `claude -p` 使用订阅登录,但其法律与
|
|
|
194
243
|
## 兼容性与调研
|
|
195
244
|
|
|
196
245
|
- Node.js `^22.19.0 || >=24.0.0`
|
|
197
|
-
- DeepSeek Harness / `@deepseek-ai/dsh-llm` `>=0.1.0-rc.
|
|
246
|
+
- DeepSeek Harness / `@deepseek-ai/dsh-llm` `>=0.1.0-rc.8 <0.2.0`
|
|
198
247
|
- Cordis `^4.0.1`
|
|
199
248
|
- Codex CLI `0.147.0`(已验证;模型目录基于官方 [Codex App Server](https://developers.openai.com/codex/app-server) 的 `model/list`)
|
|
249
|
+
- Codex `direct-responses`(实验性私有协议;不是 OpenAI 面向第三方承诺的公开 API,兼容基线见 [compatibility.md](../../docs/compatibility.md))
|
|
250
|
+
- `@deepseek-ai/dsh-attachment` `>=0.1.0-rc.8 <0.2.0`(可选;Codex direct 图片输入依赖该服务)
|
|
200
251
|
- Claude Code `2.1.218`(已验证;目录字段遵循官方 [Agent SDK `supportedModels()`](https://code.claude.com/docs/en/agent-sdk/typescript))
|
|
201
252
|
- Grok Build `1.0.5`(已验证;目录与 effort 来自 ACP `initialize` 的 `modelState`,生成事件遵循官方 [headless `streaming-json`](https://github.com/xai-org/grok-build/blob/main/crates/codegen/xai-grok-pager/docs/user-guide/14-headless-mode.md#streaming-json))
|
|
202
253
|
- Cursor CLI:目录使用官方 [`--list-models`](https://cursor.com/changelog/cli-jan-08-2026);本机未安装,依赖 fixture 验证
|
package/lib/adapter.d.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { LlmAdapter, type GenerateOptions, type LlmModelInfo, type LlmProviderInfo, type LlmResolvedModelInfo, type ResolvedRetryPolicy, type StreamChunk } from '@deepseek-ai/dsh-llm';
|
|
2
2
|
import { type SubscriptionAuthVerifier } from './auth.js';
|
|
3
3
|
import { type CodexCatalog, type CodexCatalogInvocation, type DiscoverCodexModelsOptions } from './codex-catalog.js';
|
|
4
|
+
import { CodexCredentialStore } from './codex-direct-auth.js';
|
|
5
|
+
import { runCodexDirectResponses, type CodexDirectResponsesDependencies } from './codex-direct-responses.js';
|
|
4
6
|
import { type CodingSubscriptionProviderConfig } from './config.js';
|
|
5
7
|
import { type ProviderFailureContext, type RunCliTextOptions } from './process.js';
|
|
6
8
|
import { type CliInvocation, type ProviderId } from './providers.js';
|
|
9
|
+
import { type LiveSessionLookup } from './session-cwd.js';
|
|
7
10
|
import { type DiscoverSubscriptionCatalogOptions, type SubscriptionCatalog, type SubscriptionCatalogInvocation } from './subscription-catalog.js';
|
|
8
11
|
export type SubscriptionProviderRoute = 'codex-subscription' | 'claude-subscription' | 'cursor-subscription' | 'grok-subscription';
|
|
9
12
|
interface RouteDefinition {
|
|
@@ -16,6 +19,7 @@ export declare const routeDefinitions: readonly RouteDefinition[];
|
|
|
16
19
|
export type CliTextRunner = (invocation: CliInvocation, options?: RunCliTextOptions) => AsyncIterable<string>;
|
|
17
20
|
export type CodexCatalogDiscoverer = (invocation: CodexCatalogInvocation, options?: DiscoverCodexModelsOptions) => Promise<CodexCatalog>;
|
|
18
21
|
export type SubscriptionCatalogDiscoverer = (invocation: SubscriptionCatalogInvocation, options?: DiscoverSubscriptionCatalogOptions) => Promise<SubscriptionCatalog>;
|
|
22
|
+
export type CodexDirectRunner = typeof runCodexDirectResponses;
|
|
19
23
|
/**
|
|
20
24
|
* Full lifecycle facts the adapter can observe for one route: the transport context
|
|
21
25
|
* plus the `auth`/`preflight` phases (which precede spawn), a stable failure class, and
|
|
@@ -30,18 +34,31 @@ export interface RouteFailureContext extends Partial<Omit<ProviderFailureContext
|
|
|
30
34
|
readonly outcome: RouteOutcome;
|
|
31
35
|
}
|
|
32
36
|
/** Stable, credential-free outcome classes distinct enough for future health/cooldown routing. */
|
|
33
|
-
export type RouteOutcome = 'ok' | 'aborted' | 'timeout' | 'auth-required' | 'not-found' | 'protocol' | 'process' | 'output-limit' | 'line-limit' | 'io' | 'preflight' | 'failed';
|
|
37
|
+
export type RouteOutcome = 'ok' | 'aborted' | 'timeout' | 'auth-required' | 'working-directory' | 'not-found' | 'protocol' | 'process' | 'output-limit' | 'line-limit' | 'io' | 'preflight' | 'failed';
|
|
34
38
|
export interface AdapterDependencies {
|
|
35
39
|
runText?: CliTextRunner;
|
|
36
40
|
discoverCodexModels?: CodexCatalogDiscoverer;
|
|
37
41
|
discoverClaudeModels?: SubscriptionCatalogDiscoverer;
|
|
38
42
|
discoverCursorModels?: SubscriptionCatalogDiscoverer;
|
|
39
43
|
discoverGrokModels?: SubscriptionCatalogDiscoverer;
|
|
44
|
+
runCodexDirect?: CodexDirectRunner;
|
|
45
|
+
codexCredentials?: Pick<CodexCredentialStore, 'requestResponses'>;
|
|
46
|
+
attachments?: CodexDirectResponsesDependencies['attachments'];
|
|
47
|
+
/** Resolve the optional host attachment service at operation time. */
|
|
48
|
+
getAttachments?: () => CodexDirectResponsesDependencies['attachments'];
|
|
40
49
|
verifyAuth?: SubscriptionAuthVerifier;
|
|
41
50
|
onDiagnostic?: (route: SubscriptionProviderRoute, diagnostic: string) => void;
|
|
42
51
|
/** Receives credential-free lifecycle facts once per invocation (success or failure); never affects the stream. */
|
|
43
52
|
onSettled?: (context: RouteFailureContext) => void;
|
|
53
|
+
/** Host-owned live session lookup used to bind local process cwd to a loop request. */
|
|
54
|
+
liveSessions?: LiveSessionLookup;
|
|
44
55
|
}
|
|
56
|
+
export declare const CODEX_DIRECT_PROVIDER_HTTP_CODE = "CODEX_DIRECT_PROVIDER_HTTP";
|
|
57
|
+
export declare const CODEX_DIRECT_PROVIDER_FAILURE_CODE = "CODEX_DIRECT_PROVIDER_FAILURE";
|
|
58
|
+
export declare const CODEX_DIRECT_CONTENT_FILTER_CODE = "CODEX_DIRECT_CONTENT_FILTER";
|
|
59
|
+
export declare const CODEX_DIRECT_TRANSPORT_ERROR_CODE = "CODEX_DIRECT_TRANSPORT_ERROR";
|
|
60
|
+
/** Stable code for a request that needs tool calls this text-only route cannot make. */
|
|
61
|
+
export declare const TOOL_CALLS_UNSUPPORTED_CODE = "tool_calls_unsupported";
|
|
45
62
|
/** Experimental LLM-compatible facade over local, already-authenticated coding agents. */
|
|
46
63
|
export declare class CodingSubscriptionAdapter extends LlmAdapter {
|
|
47
64
|
private readonly config;
|
|
@@ -51,18 +68,32 @@ export declare class CodingSubscriptionAdapter extends LlmAdapter {
|
|
|
51
68
|
private readonly discoverClaudeModels;
|
|
52
69
|
private readonly discoverCursorModels;
|
|
53
70
|
private readonly discoverGrokModels;
|
|
71
|
+
private readonly runCodexDirect;
|
|
72
|
+
private readonly codexCredentials;
|
|
73
|
+
private readonly getAttachments;
|
|
54
74
|
private readonly verifyAuth;
|
|
55
75
|
private readonly onDiagnostic;
|
|
56
76
|
private readonly onSettled;
|
|
77
|
+
private readonly liveSessions;
|
|
57
78
|
private readonly lifecycle;
|
|
58
79
|
private codexCatalogCache;
|
|
59
80
|
private readonly subscriptionCatalogCache;
|
|
60
81
|
constructor(config: CodingSubscriptionProviderConfig, dependencies?: AdapterDependencies);
|
|
82
|
+
private trustedCwd;
|
|
61
83
|
private reportSettled;
|
|
62
84
|
providerInfo(provider: string): LlmProviderInfo;
|
|
63
85
|
providerRetryPolicy(_provider: string): ResolvedRetryPolicy;
|
|
64
|
-
private
|
|
65
|
-
private
|
|
86
|
+
private peekCodexCatalog;
|
|
87
|
+
private peekSubscriptionCatalog;
|
|
88
|
+
/**
|
|
89
|
+
* Observe the advisory CLI catalog only after stream has bound this operation to a
|
|
90
|
+
* canonical live-session cwd. The caller owns the auth probe and must revalidate
|
|
91
|
+
* the session immediately before crossing this subprocess boundary.
|
|
92
|
+
*/
|
|
93
|
+
private observeCodexCatalog;
|
|
94
|
+
private observeSubscriptionCatalog;
|
|
95
|
+
private observedCatalog;
|
|
96
|
+
private observeCatalog;
|
|
66
97
|
listModels(provider: string): Promise<readonly LlmModelInfo[]>;
|
|
67
98
|
resolveModel(provider: string, model: string, signal?: AbortSignal): Promise<LlmResolvedModelInfo>;
|
|
68
99
|
stream(options: GenerateOptions): AsyncIterable<StreamChunk>;
|
package/lib/adapter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|