dsh-codex-connect 0.1.0-alpha.4.5 → 0.1.0-alpha.4.7
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/INSTALL.md +1 -1
- package/README.i18n.yaml +2 -2
- package/README.md +73 -30
- package/docs/README.zh.md +92 -32
- package/docs/assets/en/hero.jpg +0 -0
- package/docs/assets/en/model-selector.jpg +0 -0
- package/docs/assets/en/oauth-status.jpg +0 -0
- package/docs/assets/en/plugin-configuration.jpg +0 -0
- package/docs/assets/en/plugin-entry.jpg +0 -0
- package/docs/assets/zh/hero.jpg +0 -0
- package/docs/assets/zh/model-selector.jpg +0 -0
- package/docs/assets/zh/oauth-status.jpg +0 -0
- package/docs/assets/zh/plugin-configuration.jpg +0 -0
- package/docs/assets/zh/plugin-entry.jpg +0 -0
- package/lib/bin.js +44 -5
- package/lib/client.js +6 -4
- package/lib/index.js +1 -1
- package/lib/{src-k439bIuH.js → src-Bk1Nq6B4.js} +31 -3
- package/package.json +2 -1
package/INSTALL.md
CHANGED
|
@@ -19,7 +19,7 @@ Install `dsh-codex-connect` into one requested DeepSeek Harness profile without
|
|
|
19
19
|
dsh plugin --profile web add dsh-codex-connect@alpha
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
After `0.1.0-alpha.4.7` is published, pin it exactly with `dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.7`. If npm is unavailable after its matching GitHub prerelease is created, use `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.7'`.
|
|
23
23
|
|
|
24
24
|
3. Run `dsh --profile web --dump-config` and require exactly one `llm-openai-codex` row loading `dsh-codex-connect`.
|
|
25
25
|
4. Confirm the effective `agent-default-model` and `web.searchProvider` values are unchanged from before installation.
|
package/README.i18n.yaml
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
# side as of the last confirmed-consistent state. Both languages carry equal authority;
|
|
3
3
|
# after editing either side, bring the other along and re-record with:
|
|
4
4
|
# git hash-object README.md docs/README.zh.md
|
|
5
|
-
README.md:
|
|
6
|
-
docs/README.zh.md:
|
|
5
|
+
README.md: 6eedfff99162f49458c9fc6f5fc4dff502aa7dfc
|
|
6
|
+
docs/README.zh.md: 3fa64da86d3c1f1305f67a5e29e4255ca309eccb
|
package/README.md
CHANGED
|
@@ -7,57 +7,87 @@ English | [中文](docs/README.zh.md)
|
|
|
7
7
|
Connect your ChatGPT subscription to DeepSeek Harness with OAuth, user-controlled defaults, Harness-native approvals, diagnostics, and reliable session recovery.
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
10
|
-
<img src="https://raw.githubusercontent.com/franksong2702/dsh-codex-connect/main/docs/assets/hero.jpg" alt="Codex Connect — ChatGPT OAuth for DeepSeek Harness" width="100%">
|
|
10
|
+
<img src="https://raw.githubusercontent.com/franksong2702/dsh-codex-connect/main/docs/assets/en/hero.jpg" alt="Codex Connect — ChatGPT OAuth for DeepSeek Harness" width="100%">
|
|
11
11
|
</p>
|
|
12
12
|
|
|
13
13
|
`dsh-codex-connect` adds the `openai-codex` model catalog and a separate ChatGPT OAuth login. Models run through Harness's normal LLM service, so streaming, tool calls, reasoning replay, compaction, filesystem controls, permission gates, and approval prompts remain Harness-owned. It does not turn a ChatGPT subscription into an OpenAI Platform API credential.
|
|
14
14
|
|
|
15
15
|
Installation is additive. The bundle does not replace the current default model or search route, and its standalone search provider and `view_image` tool are disabled until explicitly enabled.
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
Every UI screenshot in this English guide is captured from the English-localized Harness UI. The [Chinese guide](docs/README.zh.md) uses a Chinese capture of the same state. Model and provider identifiers keep their canonical spelling in both languages.
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
## Quick start (about five minutes)
|
|
20
|
+
|
|
21
|
+
This guide uses the `web` profile. Replace `web` with the name of the Harness profile you already use. You need a working `dsh` installation; from a DeepSeek Harness source checkout, prefix the commands with `pnpm`.
|
|
22
|
+
|
|
23
|
+
### 1. Install the plugin into one profile
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
dsh plugin --profile web add dsh-codex-connect@alpha
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Expected result: the package is added to that profile. This does not change the profile's default model or global search route.
|
|
30
|
+
|
|
31
|
+
To reproduce this release exactly, use `dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.7`. If npm is unavailable after the matching GitHub prerelease exists, use `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.7'`. A local checkout can be installed as `link:/absolute/path/to/dsh-codex-connect`.
|
|
32
|
+
|
|
33
|
+
### 2. Start Harness
|
|
34
|
+
|
|
35
|
+
```sh
|
|
36
|
+
dsh web
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Expected result: the Harness web UI opens for the selected profile.
|
|
40
|
+
|
|
41
|
+
### 3. Find the Codex Connect card
|
|
42
|
+
|
|
43
|
+
Open **Settings → Plugins → Plugin configuration → Codex Connect**.
|
|
44
|
+
|
|
45
|
+
Expected result: a fresh installation shows **Not signed in** and a **Sign in with ChatGPT** button. The card is where you later manage optional capabilities too.
|
|
20
46
|
|
|
21
47
|
<p align="center">
|
|
22
|
-
<img src="https://raw.githubusercontent.com/franksong2702/dsh-codex-connect/main/docs/assets/
|
|
48
|
+
<img src="https://raw.githubusercontent.com/franksong2702/dsh-codex-connect/main/docs/assets/en/plugin-entry.jpg" alt="Collapsed English-localized Codex Connect entry under Harness plugin configuration" width="720">
|
|
23
49
|
</p>
|
|
24
50
|
|
|
25
|
-
|
|
51
|
+
### 4. Sign in with ChatGPT
|
|
52
|
+
|
|
53
|
+
Click **Sign in with ChatGPT** and complete the browser approval yourself. Do not copy an authorization URL, code, token, or account identifier into an issue, log, or configuration file.
|
|
54
|
+
|
|
55
|
+
Expected result: the account area changes to **Signed in**. The screenshot below is the successful end state after this step; it is not the initial sign-in screen.
|
|
26
56
|
|
|
27
57
|
<p align="center">
|
|
28
|
-
<img src="https://raw.githubusercontent.com/franksong2702/dsh-codex-connect/main/docs/assets/
|
|
58
|
+
<img src="https://raw.githubusercontent.com/franksong2702/dsh-codex-connect/main/docs/assets/en/oauth-status.jpg" alt="English-localized Codex Connect signed-in state inside Harness plugin configuration" width="720">
|
|
29
59
|
</p>
|
|
30
60
|
|
|
31
|
-
|
|
61
|
+
### 5. Choose a model and make one safe check
|
|
62
|
+
|
|
63
|
+
Open Harness's normal model picker and select an `openai-codex` model for the agent or session you are using. This selection is separate from writing the profile's default model or global search route.
|
|
64
|
+
|
|
65
|
+
The picker groups the available entries under **OpenAI Codex**. Model identifiers such as `GPT-5.6 Luna` are canonical names, so they intentionally remain un-translated.
|
|
32
66
|
|
|
33
67
|
<p align="center">
|
|
34
|
-
<img src="https://raw.githubusercontent.com/franksong2702/dsh-codex-connect/main/docs/assets/model-selector.jpg" alt="OpenAI Codex
|
|
68
|
+
<img src="https://raw.githubusercontent.com/franksong2702/dsh-codex-connect/main/docs/assets/en/model-selector.jpg" alt="OpenAI Codex model group in the English-localized DeepSeek Harness model picker" width="360">
|
|
35
69
|
</p>
|
|
36
70
|
|
|
37
|
-
|
|
71
|
+
To confirm the configured plugin row locally, run:
|
|
38
72
|
|
|
39
73
|
```sh
|
|
40
|
-
dsh
|
|
41
|
-
dsh web
|
|
74
|
+
dsh --profile web --dump-config
|
|
42
75
|
```
|
|
43
76
|
|
|
44
|
-
|
|
77
|
+
Expected result: the configuration has exactly one `llm-openai-codex` row. Keep this configuration dump local; it may include unrelated profile settings.
|
|
45
78
|
|
|
46
|
-
|
|
79
|
+
For secret-free status and diagnostics that do not start OAuth, run:
|
|
47
80
|
|
|
48
81
|
```sh
|
|
49
|
-
dsh plugin --profile web exec dsh-codex-connect
|
|
50
|
-
dsh plugin --profile web exec dsh-codex-connect
|
|
51
|
-
dsh plugin --profile web exec dsh-codex-connect doctor
|
|
82
|
+
dsh plugin --profile web exec dsh-codex-connect status --json
|
|
83
|
+
dsh plugin --profile web exec dsh-codex-connect doctor --json
|
|
52
84
|
```
|
|
53
85
|
|
|
54
|
-
|
|
86
|
+
Expected result: `status --json` reports `signed-in` and exits `0`, while `doctor --json` prints one secret-free JSON document. A signed-out `status --json` exits `1`; return to step 4 instead of treating that as a plugin failure.
|
|
55
87
|
|
|
56
|
-
##
|
|
88
|
+
## Optional capabilities (off by default)
|
|
57
89
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
The installed bundle row remains the composition base and is intentionally inert beyond model-provider registration:
|
|
90
|
+
The installed bundle is intentionally inert beyond model-provider registration:
|
|
61
91
|
|
|
62
92
|
```yaml
|
|
63
93
|
- id: llm-openai-codex
|
|
@@ -66,6 +96,21 @@ The installed bundle row remains the composition base and is intentionally inert
|
|
|
66
96
|
enableImageTool: false
|
|
67
97
|
```
|
|
68
98
|
|
|
99
|
+
Open **Settings → Plugins → Plugin configuration → Codex Connect** to manage the account and these options in one card. **Save changes** affects only this plugin's capability section and applies live. It never selects a default model or a global search route.
|
|
100
|
+
|
|
101
|
+
### Enable only the capability you intend to use
|
|
102
|
+
|
|
103
|
+
- `enableSearch: true` registers Codex as an available search provider. It does not select the profile's global search route.
|
|
104
|
+
- `enableImageTool: true` enables `view_image` for approved local reads and public-network image fetches on vision-capable models.
|
|
105
|
+
|
|
106
|
+
The screenshot below is an example after someone has explicitly enabled capabilities. It does not show the fresh-install default. This English guide uses the English-localized capture; the Chinese guide shows the matching Chinese-localized state.
|
|
107
|
+
|
|
108
|
+
<p align="center">
|
|
109
|
+
<img src="https://raw.githubusercontent.com/franksong2702/dsh-codex-connect/main/docs/assets/en/plugin-configuration.jpg" alt="English-localized Codex Connect optional capability configuration after explicit opt-in" width="720">
|
|
110
|
+
</p>
|
|
111
|
+
|
|
112
|
+
### Change a default model or global search route separately
|
|
113
|
+
|
|
69
114
|
To make a Codex model the default for new agents, add or update the separate Harness row yourself:
|
|
70
115
|
|
|
71
116
|
```yaml
|
|
@@ -75,7 +120,7 @@ To make a Codex model the default for new agents, add or update the separate Har
|
|
|
75
120
|
model: gpt-5.6-sol
|
|
76
121
|
```
|
|
77
122
|
|
|
78
|
-
|
|
123
|
+
Selecting Codex as the profile's global search route is another explicit change:
|
|
79
124
|
|
|
80
125
|
```yaml
|
|
81
126
|
- id: llm-openai-codex
|
|
@@ -89,8 +134,6 @@ The card can enable Codex standalone search. Selecting it as the profile's globa
|
|
|
89
134
|
searchProvider: openai-codex
|
|
90
135
|
```
|
|
91
136
|
|
|
92
|
-
To add the image-loading tool, set `enableImageTool: true` on `llm-openai-codex`. Browser paste/drop remains a Harness attachment feature and does not depend on this tool.
|
|
93
|
-
|
|
94
137
|
| Field | Default | Values |
|
|
95
138
|
|---|---:|---|
|
|
96
139
|
| `enableSearch` | `false` | boolean |
|
|
@@ -100,13 +143,13 @@ To add the image-loading tool, set `enableImageTool: true` on `llm-openai-codex`
|
|
|
100
143
|
| `searchContextSize` | `medium` | `low`, `medium`, `high` |
|
|
101
144
|
| `searchMaxOutputTokens` | `10000` | positive integer |
|
|
102
145
|
|
|
103
|
-
##
|
|
146
|
+
## Reauthentication, diagnostics, and conflicts
|
|
104
147
|
|
|
105
|
-
-
|
|
106
|
-
-
|
|
107
|
-
-
|
|
108
|
-
-
|
|
109
|
-
-
|
|
148
|
+
- If the card says **Sign in again** or the server asks for reauthentication, click that action and complete the same safe browser flow. It preserves this plugin's capability settings and does not silently change your default model or global search route. Do not run `logout` just to renew a session.
|
|
149
|
+
- `doctor` reads process and filesystem metadata only. `doctor --json` emits exactly one secret-free JSON document with schema version 1, package/version/Node metadata, credential-file state and safe mode, capabilities, conflict status, and hints. It omits the absolute credential path and OAuth, account, and expiry data.
|
|
150
|
+
- `status --json` emits only signed-in or signed-out state with package metadata. `status --json` reads the credential only to determine sign-in state, but never prints credential contents or starts OAuth.
|
|
151
|
+
- OAuth is stored separately at `$DSH_HOME/.openai-codex-auth.json` (`~/.dsh` by default). `~/.codex/auth.json` is never copied or modified. The parent directory and file use owner-only permissions where supported, writes are atomic, and refresh writes use a cross-process file lock.
|
|
152
|
+
- If startup reports an `openai-codex` collision, an old `dsh-codex` bundle or manual provider row may already own the adapter. Inspect the effective configuration and remove only the confirmed conflicting owner. Do not delete auth files or unrelated providers.
|
|
110
153
|
- Removing the package does not delete OAuth state. Run `logout` only when credential removal is intended.
|
|
111
154
|
|
|
112
155
|
## Compatibility and security boundary
|
package/docs/README.zh.md
CHANGED
|
@@ -7,57 +7,87 @@
|
|
|
7
7
|
通过 OAuth 将你的 ChatGPT 订阅连接到 DeepSeek Harness,同时保留用户自主默认项、Harness 原生审批、非敏感诊断和可靠的会话恢复。
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
10
|
-
<img src="https://raw.githubusercontent.com/franksong2702/dsh-codex-connect/main/docs/assets/hero.jpg" alt="Codex Connect — 通过 ChatGPT OAuth 连接 DeepSeek Harness" width="100%">
|
|
10
|
+
<img src="https://raw.githubusercontent.com/franksong2702/dsh-codex-connect/main/docs/assets/zh/hero.jpg" alt="Codex Connect — 通过 ChatGPT OAuth 连接 DeepSeek Harness" width="100%">
|
|
11
11
|
</p>
|
|
12
12
|
|
|
13
13
|
`dsh-codex-connect` 提供 `openai-codex` 模型目录和独立的 ChatGPT OAuth 登录。模型仍走 Harness 标准 LLM 服务,因此流式输出、工具调用、reasoning replay、压缩、文件系统控制、权限门禁和审批提示仍由 Harness 负责。ChatGPT 订阅不会因此变成 OpenAI Platform API 凭据。
|
|
14
14
|
|
|
15
15
|
安装是增量的:bundle 不会替换当前主模型或搜索路由;独立搜索提供方和 `view_image` 工具也默认关闭,必须显式开启。
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
本中文指南中的 UI 截图均来自中文本地化的 Harness 界面;[English 版](../README.md) 使用同一状态的英文截图。模型与提供方标识保留其规范拼写,不随界面语言翻译。
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
## 五分钟快速开始
|
|
20
|
+
|
|
21
|
+
本指南使用 `web` profile。请把 `web` 替换成你已经在用的 Harness profile 名称。你需要先有可用的 `dsh` 安装;如果在 DeepSeek Harness 源码 checkout 中运行,请在命令前加 `pnpm`。
|
|
22
|
+
|
|
23
|
+
### 1. 将插件装入一个 profile
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
dsh plugin --profile web add dsh-codex-connect@alpha
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
预期结果:包被加入该 profile。这个动作不会更改 profile 的默认模型或全局搜索路由。
|
|
30
|
+
|
|
31
|
+
如需精确复现这个版本,使用 `dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.7`。对应 GitHub prerelease 已创建但 npm 不可用时,可使用 `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.7'`。本地 checkout 可安装为 `link:/absolute/path/to/dsh-codex-connect`。
|
|
32
|
+
|
|
33
|
+
### 2. 启动 Harness
|
|
34
|
+
|
|
35
|
+
```sh
|
|
36
|
+
dsh web
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
预期结果:所选 profile 的 Harness Web UI 打开。
|
|
40
|
+
|
|
41
|
+
### 3. 找到 Codex Connect 卡片
|
|
42
|
+
|
|
43
|
+
打开 **设置 → 插件 → 插件配置 → Codex Connect**。
|
|
44
|
+
|
|
45
|
+
预期结果:新安装时账户区显示 **尚未登录**,并出现 **使用 ChatGPT 登录** 按钮。之后管理可选能力也在同一张卡片中完成。
|
|
20
46
|
|
|
21
47
|
<p align="center">
|
|
22
|
-
<img src="https://raw.githubusercontent.com/franksong2702/dsh-codex-connect/main/docs/assets/
|
|
48
|
+
<img src="https://raw.githubusercontent.com/franksong2702/dsh-codex-connect/main/docs/assets/zh/plugin-entry.jpg" alt="Harness 插件配置中的中文 Codex Connect 折叠入口" width="720">
|
|
23
49
|
</p>
|
|
24
50
|
|
|
25
|
-
|
|
51
|
+
### 4. 使用 ChatGPT 登录
|
|
52
|
+
|
|
53
|
+
点击 **使用 ChatGPT 登录**,并自行完成浏览器审批。不要把授权 URL、授权码、token 或账户标识复制到 Issue、日志或配置文件中。
|
|
54
|
+
|
|
55
|
+
预期结果:账户区变为 **已登录**。下图展示的是完成本步骤后的成功状态,不是开始登录前的页面。
|
|
26
56
|
|
|
27
57
|
<p align="center">
|
|
28
|
-
<img src="https://raw.githubusercontent.com/franksong2702/dsh-codex-connect/main/docs/assets/
|
|
58
|
+
<img src="https://raw.githubusercontent.com/franksong2702/dsh-codex-connect/main/docs/assets/zh/oauth-status.jpg" alt="Harness 插件配置中的中文 Codex Connect 已登录状态" width="720">
|
|
29
59
|
</p>
|
|
30
60
|
|
|
31
|
-
|
|
61
|
+
### 5. 选择模型并做一次安全检查
|
|
62
|
+
|
|
63
|
+
打开 Harness 原生模型选择器,为当前正在使用的 agent 或会话选择一个 `openai-codex` 模型。这个选择与写入 profile 的默认模型或全局搜索路由是两件事。
|
|
64
|
+
|
|
65
|
+
选择器会把可用项归在 **OpenAI Codex** 下。`GPT-5.6 Luna` 一类模型标识是规范名称,因此会保留原样,不翻译。
|
|
32
66
|
|
|
33
67
|
<p align="center">
|
|
34
|
-
<img src="https://raw.githubusercontent.com/franksong2702/dsh-codex-connect/main/docs/assets/model-selector.jpg" alt="DeepSeek Harness 模型选择器中的 OpenAI Codex
|
|
68
|
+
<img src="https://raw.githubusercontent.com/franksong2702/dsh-codex-connect/main/docs/assets/zh/model-selector.jpg" alt="中文 DeepSeek Harness 模型选择器中的 OpenAI Codex 模型分组" width="360">
|
|
35
69
|
</p>
|
|
36
70
|
|
|
37
|
-
|
|
71
|
+
如需在本机确认插件配置行,运行:
|
|
38
72
|
|
|
39
73
|
```sh
|
|
40
|
-
dsh
|
|
41
|
-
dsh web
|
|
74
|
+
dsh --profile web --dump-config
|
|
42
75
|
```
|
|
43
76
|
|
|
44
|
-
|
|
77
|
+
预期结果:配置中恰好有一条 `llm-openai-codex`。请只在本机查看这份配置输出,它可能包含无关的 profile 设置。
|
|
45
78
|
|
|
46
|
-
|
|
79
|
+
如需不启动 OAuth 的非敏感状态和诊断输出,运行:
|
|
47
80
|
|
|
48
81
|
```sh
|
|
49
|
-
dsh plugin --profile web exec dsh-codex-connect
|
|
50
|
-
dsh plugin --profile web exec dsh-codex-connect
|
|
51
|
-
dsh plugin --profile web exec dsh-codex-connect doctor
|
|
82
|
+
dsh plugin --profile web exec dsh-codex-connect status --json
|
|
83
|
+
dsh plugin --profile web exec dsh-codex-connect doctor --json
|
|
52
84
|
```
|
|
53
85
|
|
|
54
|
-
`doctor`
|
|
55
|
-
|
|
56
|
-
## 显式配置
|
|
86
|
+
预期结果:`status --json` 报告 `signed-in` 并以 `0` 退出,`doctor --json` 只输出一条非敏感 JSON。尚未登录时 `status --json` 会以 `1` 退出;回到第 4 步登录即可,不要把它当作插件故障。
|
|
57
87
|
|
|
58
|
-
|
|
88
|
+
## 可选能力(默认关闭)
|
|
59
89
|
|
|
60
|
-
安装后的 bundle
|
|
90
|
+
安装后的 bundle 只注册模型提供方,默认不额外启用任何能力:
|
|
61
91
|
|
|
62
92
|
```yaml
|
|
63
93
|
- id: llm-openai-codex
|
|
@@ -66,7 +96,22 @@ dsh plugin --profile web exec dsh-codex-connect doctor
|
|
|
66
96
|
enableImageTool: false
|
|
67
97
|
```
|
|
68
98
|
|
|
69
|
-
|
|
99
|
+
打开 **设置 → 插件 → 插件配置 → Codex Connect**,即可在同一张卡片中管理账户和这些选项。**保存更改**只影响本插件的能力配置并即时生效,绝不会选择默认模型或全局搜索路由。
|
|
100
|
+
|
|
101
|
+
### 只开启你准备使用的能力
|
|
102
|
+
|
|
103
|
+
- `enableSearch: true` 会把 Codex 注册为可选择的搜索提供方,不会把它选为 profile 的全局搜索路由。
|
|
104
|
+
- `enableImageTool: true` 会为具备视觉能力的模型启用 `view_image`,用于审批后的本地读取和公网图片获取。
|
|
105
|
+
|
|
106
|
+
下图是有人显式开启能力之后的配置示例,不是新安装的默认状态。本中文指南使用中文本地化截图;English 版展示同一状态的英文截图。
|
|
107
|
+
|
|
108
|
+
<p align="center">
|
|
109
|
+
<img src="https://raw.githubusercontent.com/franksong2702/dsh-codex-connect/main/docs/assets/zh/plugin-configuration.jpg" alt="中文 Codex Connect 显式开启可选能力后的配置示例" width="720">
|
|
110
|
+
</p>
|
|
111
|
+
|
|
112
|
+
### 单独更改默认模型或全局搜索路由
|
|
113
|
+
|
|
114
|
+
如需把 Codex 模型设为新 agent 的默认模型,需要自行添加或修改独立的 Harness 配置项:
|
|
70
115
|
|
|
71
116
|
```yaml
|
|
72
117
|
- id: agent-default-model
|
|
@@ -75,7 +120,7 @@ dsh plugin --profile web exec dsh-codex-connect doctor
|
|
|
75
120
|
model: gpt-5.6-sol
|
|
76
121
|
```
|
|
77
122
|
|
|
78
|
-
|
|
123
|
+
如需把 Codex 选为 profile 的全局搜索路由,还需要另做一次显式配置:
|
|
79
124
|
|
|
80
125
|
```yaml
|
|
81
126
|
- id: llm-openai-codex
|
|
@@ -89,27 +134,42 @@ dsh plugin --profile web exec dsh-codex-connect doctor
|
|
|
89
134
|
searchProvider: openai-codex
|
|
90
135
|
```
|
|
91
136
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
137
|
+
| 字段 | 默认值 | 可选值 |
|
|
138
|
+
|---|---:|---|
|
|
139
|
+
| `enableSearch` | `false` | boolean |
|
|
140
|
+
| `enableImageTool` | `false` | boolean |
|
|
141
|
+
| `searchModel` | `gpt-5.6-sol` | Codex model id |
|
|
142
|
+
| `searchMode` | `cached` | `cached`、`indexed`、`live` |
|
|
143
|
+
| `searchContextSize` | `medium` | `low`、`medium`、`high` |
|
|
144
|
+
| `searchMaxOutputTokens` | `10000` | 正整数 |
|
|
145
|
+
|
|
146
|
+
## 重新登录、诊断与冲突
|
|
147
|
+
|
|
148
|
+
- 卡片显示 **重新登录**,或服务端要求重新认证时,点击该操作并完成同一套安全的浏览器流程。它会保留本插件的能力配置,不会偷偷改动默认模型或全局搜索路由。不要为了刷新会话而运行 `logout`。
|
|
149
|
+
- `doctor` 只读取进程与文件系统元数据。`doctor --json` 只输出一条可解析的非敏感 JSON,包含 schema version 1、包/版本/Node 信息、认证文件状态与安全 mode、能力、冲突状态和提示;它省略认证文件绝对路径以及 OAuth、账户和过期时间信息。
|
|
150
|
+
- `status --json` 只输出 signed-in 或 signed-out 状态及包元数据。它只为判断登录态读取认证文件,但不会输出认证文件内容或启动 OAuth。
|
|
151
|
+
- OAuth 单独存储于 `$DSH_HOME/.openai-codex-auth.json`(默认 `~/.dsh`)。`~/.codex/auth.json` 不会被复制或修改。支持的平台上,父目录与文件使用仅所有者可访问权限;写入采用原子替换,刷新写入使用跨进程文件锁。
|
|
152
|
+
- 启动报告 `openai-codex` 冲突时,旧 `dsh-codex` bundle 或手动 provider 配置可能已占用该 adapter。先检查有效配置,只移除已确认的冲突所有者。不要删除认证文件或无关 provider。
|
|
101
153
|
- 移除包不会删除 OAuth 状态;只有确实需要删除凭据时才运行 `logout`。
|
|
102
154
|
|
|
103
155
|
## 兼容性与安全边界
|
|
104
156
|
|
|
105
157
|
- Alpha 面向当前 Harness `0.1.0-rc.5` 主线组合与兼容的 `0.1.0-rc.6` 插件 API、Node.js `^22.19.0 || >=24.0.0` 和固定版本的 `@earendil-works/pi-ai` Codex provider。
|
|
106
158
|
- ChatGPT 套餐资格、模型权限、额度和后端行为由 OpenAI 控制,可能变化。
|
|
159
|
+
- Codex 端点不会强制普通 Responses 的 `max_output_tokens` 字段。Harness 压缩仍可工作,但这个摘要上限不能由服务端在该路由上强制。
|
|
107
160
|
- shell、文件系统、skills、MCP、subagents、审批、权限、附件、会话持久化、压缩与恢复继续由当前 Harness profile 提供。
|
|
108
161
|
- 远程 `view_image` 只允许公共 HTTP(S) 目标;每一次 DNS 结果与重定向都会重新检查,并将连接固定到已验证地址,从而阻止 localhost、私网、link-local 服务和云元数据地址。
|
|
109
162
|
- 安装、构建、测试、doctor 和包内容验证均不需要真实 OAuth。
|
|
110
163
|
|
|
111
164
|
详见 [安装运行手册](../INSTALL.md)、[Alpha 发布清单](../RELEASING.md)、[MIGRATION.md](../MIGRATION.md) 与 [架构说明](design.zh.md)。
|
|
112
165
|
|
|
166
|
+
## 开发
|
|
167
|
+
|
|
168
|
+
```sh
|
|
169
|
+
pnpm install --frozen-lockfile
|
|
170
|
+
pnpm run check
|
|
171
|
+
```
|
|
172
|
+
|
|
113
173
|
## 法律与致谢
|
|
114
174
|
|
|
115
175
|
Codex Connect 的修改与新增工作 Copyright 2026 Frank Song。本项目包含派生自 [Yan-Zero/dsh-codex](https://github.com/Yan-Zero/dsh-codex) 的软件;上游内容继续保留 Copyright 2026 Yan-Zero。两部分均按 Apache-2.0 发布,详情见 [NOTICE](../NOTICE)。本项目与 OpenAI、ChatGPT、Codex、DeepSeek 或 DeepSeek Harness 不存在隶属关系,也未获得其背书。
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/lib/bin.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { A as
|
|
2
|
+
import { A as loginOpenAICodex, E as CODEX_CONNECT_VERSION, I as openAICodexAuthPath, M as openAICodexAuthStatus, j as logoutOpenAICodex, w as diagnoseOpenAICodex } from "./src-Bk1Nq6B4.js";
|
|
3
3
|
import { spawn } from "node:child_process";
|
|
4
4
|
import { realpathSync } from "node:fs";
|
|
5
5
|
import { createInterface } from "node:readline/promises";
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
7
7
|
//#region src/bin.ts
|
|
8
8
|
/** Standalone credential CLI for the optional OpenAI Codex bundle. */
|
|
9
|
+
const JSON_SCHEMA_VERSION = 1;
|
|
9
10
|
/** Open one trusted HTTPS URL with the platform browser, best effort. */
|
|
10
11
|
function openBrowser(rawUrl) {
|
|
11
12
|
const url = new URL(rawUrl);
|
|
@@ -63,16 +64,39 @@ async function answerPrompt(prompt, deviceCode, question) {
|
|
|
63
64
|
/** Print the standalone command help. */
|
|
64
65
|
function printHelp() {
|
|
65
66
|
process.stdout.write([
|
|
66
|
-
"Usage: dsh-codex-connect <doctor|login|logout|status> [--device-code]",
|
|
67
|
+
"Usage: dsh-codex-connect <doctor|login|logout|status> [--device-code|--json]",
|
|
67
68
|
"",
|
|
68
69
|
" doctor inspect secret-free runtime and OAuth file metadata",
|
|
69
70
|
" login sign in with a separate ChatGPT OAuth session",
|
|
70
71
|
" logout remove the dsh credential without changing ~/.codex",
|
|
71
72
|
" status report non-secret dsh credential state",
|
|
72
73
|
" --device-code use headless device-code login (login only)",
|
|
74
|
+
" --json emit one secret-free JSON document (doctor/status only)",
|
|
73
75
|
""
|
|
74
76
|
].join("\n"));
|
|
75
77
|
}
|
|
78
|
+
function doctorExitCode(report) {
|
|
79
|
+
return report.credentialFile.state === "permissions-too-broad" || report.credentialFile.state === "not-a-regular-file" || report.credentialFile.state === "unreadable-metadata" ? 1 : 0;
|
|
80
|
+
}
|
|
81
|
+
/** Project the diagnostic report without its absolute credential pathname. */
|
|
82
|
+
function doctorJson(report) {
|
|
83
|
+
return {
|
|
84
|
+
schemaVersion: JSON_SCHEMA_VERSION,
|
|
85
|
+
package: report.package,
|
|
86
|
+
version: report.version,
|
|
87
|
+
node: report.node,
|
|
88
|
+
credentialFile: {
|
|
89
|
+
state: report.credentialFile.state,
|
|
90
|
+
...report.credentialFile.mode === void 0 ? {} : { mode: report.credentialFile.mode }
|
|
91
|
+
},
|
|
92
|
+
capabilities: report.capabilities,
|
|
93
|
+
providerConflict: report.providerConflict,
|
|
94
|
+
hints: report.hints
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function printJson(value) {
|
|
98
|
+
process.stdout.write(`${JSON.stringify(value)}\n`);
|
|
99
|
+
}
|
|
76
100
|
/** Execute one boot-free credential command. */
|
|
77
101
|
async function run(argv) {
|
|
78
102
|
if (argv.length === 0 || argv[0] === "--help" || argv[0] === "-h") {
|
|
@@ -85,7 +109,9 @@ async function run(argv) {
|
|
|
85
109
|
return 1;
|
|
86
110
|
}
|
|
87
111
|
const action = rawAction;
|
|
88
|
-
|
|
112
|
+
const deviceCode = flags.includes("--device-code");
|
|
113
|
+
const jsonOutput = flags.includes("--json");
|
|
114
|
+
if (flags.filter((flag) => flag !== "--device-code" && flag !== "--json").length > 0 || deviceCode && action !== "login" || jsonOutput && (action === "login" || action === "logout" || deviceCode)) {
|
|
89
115
|
process.stderr.write(`dsh-codex-connect: invalid options for ${action}: ${flags.join(" ")}\n`);
|
|
90
116
|
return 1;
|
|
91
117
|
}
|
|
@@ -93,6 +119,10 @@ async function run(argv) {
|
|
|
93
119
|
switch (action) {
|
|
94
120
|
case "doctor": {
|
|
95
121
|
const report = await diagnoseOpenAICodex();
|
|
122
|
+
if (jsonOutput) {
|
|
123
|
+
printJson(doctorJson(report));
|
|
124
|
+
return doctorExitCode(report);
|
|
125
|
+
}
|
|
96
126
|
process.stdout.write([
|
|
97
127
|
`Codex Connect ${report.version} on ${report.node}`,
|
|
98
128
|
`OAuth file metadata: ${report.credentialFile.state} (${report.credentialFile.path})`,
|
|
@@ -101,10 +131,19 @@ async function run(argv) {
|
|
|
101
131
|
...report.hints.map((hint) => `Hint: ${hint}`),
|
|
102
132
|
""
|
|
103
133
|
].join("\n"));
|
|
104
|
-
return report
|
|
134
|
+
return doctorExitCode(report);
|
|
105
135
|
}
|
|
106
136
|
case "status": {
|
|
107
137
|
const status = await openAICodexAuthStatus();
|
|
138
|
+
if (jsonOutput) {
|
|
139
|
+
printJson({
|
|
140
|
+
schemaVersion: JSON_SCHEMA_VERSION,
|
|
141
|
+
package: "dsh-codex-connect",
|
|
142
|
+
version: CODEX_CONNECT_VERSION,
|
|
143
|
+
status: status.authenticated ? "signed-in" : "signed-out"
|
|
144
|
+
});
|
|
145
|
+
return status.authenticated ? 0 : 1;
|
|
146
|
+
}
|
|
108
147
|
if (!status.authenticated) {
|
|
109
148
|
process.stdout.write("Codex Connect: signed out\n");
|
|
110
149
|
return 1;
|
|
@@ -125,7 +164,7 @@ async function run(argv) {
|
|
|
125
164
|
});
|
|
126
165
|
try {
|
|
127
166
|
await loginOpenAICodex({
|
|
128
|
-
prompt: (prompt) => answerPrompt(prompt,
|
|
167
|
+
prompt: (prompt) => answerPrompt(prompt, deviceCode, (text, options) => readline.question(text, options)),
|
|
129
168
|
notify: (event) => notify(event, true)
|
|
130
169
|
});
|
|
131
170
|
} finally {
|
package/lib/client.js
CHANGED
|
@@ -666,7 +666,7 @@ window.__ModuleLoader__.load({
|
|
|
666
666
|
height: 9,
|
|
667
667
|
borderRadius: "50%",
|
|
668
668
|
flex: "0 0 auto",
|
|
669
|
-
background: status === "signed-in" ? "var(--dsw-alias-state-success-primary, #22a06b)" : status === "error" ? "var(--dsw-alias-state-error-primary, #d92d20)" : status === "signing-in" || status === "loading" ? "var(--dsw-alias-brand-primary, #1677ff)" : "var(--dsw-alias-label-dimmed, #9aa0a6)"
|
|
669
|
+
background: status === "signed-in" ? "var(--dsw-alias-state-success-primary, #22a06b)" : status === "error" || status === "reauth-required" ? "var(--dsw-alias-state-error-primary, #d92d20)" : status === "signing-in" || status === "loading" ? "var(--dsw-alias-brand-primary, #1677ff)" : "var(--dsw-alias-label-dimmed, #9aa0a6)"
|
|
670
670
|
};
|
|
671
671
|
}
|
|
672
672
|
async function jsonRequest(path, method = "GET", signal) {
|
|
@@ -768,7 +768,7 @@ window.__ModuleLoader__.load({
|
|
|
768
768
|
if (mounted.current) setBusy(false);
|
|
769
769
|
}
|
|
770
770
|
};
|
|
771
|
-
const label = status.status === "signed-in" ? t("signedIn") : status.status === "loading" ? t("loadingAccount") : status.status === "signing-in" ? t("signingIn") : status.status === "error" ? t("requestFailed") : t("signedOut");
|
|
771
|
+
const label = status.status === "signed-in" ? t("signedIn") : status.status === "loading" ? t("loadingAccount") : status.status === "signing-in" ? t("signingIn") : status.status === "reauth-required" ? t("reauthRequired") : status.status === "error" ? t("requestFailed") : t("signedOut");
|
|
772
772
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
|
|
773
773
|
style: embedded ? embeddedPageStyle : pageStyle,
|
|
774
774
|
...embedded ? { "aria-label": t("title") } : { "aria-labelledby": "openai-codex-settings-title" },
|
|
@@ -813,10 +813,10 @@ window.__ModuleLoader__.load({
|
|
|
813
813
|
onClick: () => {
|
|
814
814
|
signIn();
|
|
815
815
|
},
|
|
816
|
-
children: busy ? t("working") : status.status === "error" ? t("loginAgain") : t("login")
|
|
816
|
+
children: busy ? t("working") : status.status === "error" || status.status === "reauth-required" ? t("loginAgain") : t("login")
|
|
817
817
|
})]
|
|
818
818
|
}),
|
|
819
|
-
status.status === "error" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
819
|
+
status.status === "error" || status.status === "reauth-required" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
820
820
|
style: errorStyle,
|
|
821
821
|
children: status.message
|
|
822
822
|
}) : null,
|
|
@@ -938,6 +938,7 @@ window.__ModuleLoader__.load({
|
|
|
938
938
|
signedOut: "Not signed in",
|
|
939
939
|
signingIn: "Waiting for browser authorization…",
|
|
940
940
|
signedIn: "Signed in",
|
|
941
|
+
reauthRequired: "Sign in again",
|
|
941
942
|
login: "Sign in with ChatGPT",
|
|
942
943
|
loginAgain: "Sign in again",
|
|
943
944
|
logout: "Sign out",
|
|
@@ -996,6 +997,7 @@ window.__ModuleLoader__.load({
|
|
|
996
997
|
signedOut: "尚未登录",
|
|
997
998
|
signingIn: "正在等待浏览器授权…",
|
|
998
999
|
signedIn: "已登录",
|
|
1000
|
+
reauthRequired: "需要重新登录",
|
|
999
1001
|
login: "使用 ChatGPT 登录",
|
|
1000
1002
|
loginAgain: "重新登录",
|
|
1001
1003
|
logout: "退出登录",
|
package/lib/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { A as
|
|
1
|
+
import { A as loginOpenAICodex, C as assertNoOpenAICodexProviderConflict, D as OPENAI_CODEX_USAGE_URL, F as OpenAICodexCredentialStore, I as openAICodexAuthPath, M as openAICodexAuthStatus, N as OPENAI_CODEX_AUTH_FILENAME, O as parseOpenAICodexUsage, P as OPENAI_CODEX_PROVIDER, S as VIEW_IMAGE_TOOL_NAME, T as openAICodexConflictMessage, _ as decodeOpenAICodexSettings, a as name, b as installOpenAICodexSearchEvent, c as OPENAI_CODEX_SEARCH_URL, d as DEFAULT_OPENAI_CODEX_SEARCH_CONTEXT_SIZE, f as DEFAULT_OPENAI_CODEX_SEARCH_MAX_OUTPUT_TOKENS, g as OPENAI_CODEX_SETTINGS_NAMESPACE, h as DEFAULT_OPENAI_CODEX_SETTINGS, i as inject, j as logoutOpenAICodex, k as readOpenAICodexRateLimits, l as OpenAICodexSearchProvider, m as DEFAULT_OPENAI_CODEX_SEARCH_MODEL, n as OPENAI_CODEX_SETTINGS_NS, o as OPENAI_CODEX_BASE_URL, p as DEFAULT_OPENAI_CODEX_SEARCH_MODE, r as apply, s as OPENAI_CODEX_SEARCH_PROVIDER, t as Config, u as mapOpenAICodexSearchResponse, v as resolveOpenAICodexSettings, w as diagnoseOpenAICodex, x as recordOpenAICodexSearchRequest, y as OPENAI_CODEX_SEARCH_MODEL_REQUEST_EVENT } from "./src-Bk1Nq6B4.js";
|
|
2
2
|
export { Config, DEFAULT_OPENAI_CODEX_SEARCH_CONTEXT_SIZE, DEFAULT_OPENAI_CODEX_SEARCH_MAX_OUTPUT_TOKENS, DEFAULT_OPENAI_CODEX_SEARCH_MODE, DEFAULT_OPENAI_CODEX_SEARCH_MODEL, DEFAULT_OPENAI_CODEX_SETTINGS, OPENAI_CODEX_AUTH_FILENAME, OPENAI_CODEX_BASE_URL, OPENAI_CODEX_PROVIDER, OPENAI_CODEX_SEARCH_MODEL_REQUEST_EVENT, OPENAI_CODEX_SEARCH_PROVIDER, OPENAI_CODEX_SEARCH_URL, OPENAI_CODEX_SETTINGS_NAMESPACE, OPENAI_CODEX_SETTINGS_NS, OPENAI_CODEX_USAGE_URL, OpenAICodexCredentialStore, OpenAICodexSearchProvider, VIEW_IMAGE_TOOL_NAME, apply, assertNoOpenAICodexProviderConflict, decodeOpenAICodexSettings, diagnoseOpenAICodex, inject, installOpenAICodexSearchEvent, loginOpenAICodex, logoutOpenAICodex, mapOpenAICodexSearchResponse, name, openAICodexAuthPath, openAICodexAuthStatus, openAICodexConflictMessage, parseOpenAICodexUsage, readOpenAICodexRateLimits, recordOpenAICodexSearchRequest, resolveOpenAICodexSettings };
|
|
@@ -252,6 +252,27 @@ async function openAICodexAuthStatus(store = new OpenAICodexCredentialStore()) {
|
|
|
252
252
|
/** Fixed endpoint used by the official Codex client for ChatGPT rate limits. */
|
|
253
253
|
const OPENAI_CODEX_USAGE_URL = "https://chatgpt.com/backend-api/wham/usage";
|
|
254
254
|
const USAGE_REQUEST_TIMEOUT_MS = 15e3;
|
|
255
|
+
/** Stable public discriminant for an expired or revoked Codex OAuth session. */
|
|
256
|
+
const OPENAI_CODEX_REAUTH_REQUIRED_CODE = "OPENAI_CODEX_REAUTH_REQUIRED";
|
|
257
|
+
/** Fixed, secret-free message for a browser-facing reauthorization prompt. */
|
|
258
|
+
const OPENAI_CODEX_REAUTH_REQUIRED_MESSAGE = "OpenAI Codex authorization must be renewed";
|
|
259
|
+
/**
|
|
260
|
+
* Raised when the usage endpoint rejects the current OAuth session.
|
|
261
|
+
*
|
|
262
|
+
* The error intentionally carries no response, credential, or account data so
|
|
263
|
+
* callers can safely pass its fixed message across the Web boundary.
|
|
264
|
+
*/
|
|
265
|
+
var OpenAICodexReauthRequiredError = class extends Error {
|
|
266
|
+
code = OPENAI_CODEX_REAUTH_REQUIRED_CODE;
|
|
267
|
+
constructor() {
|
|
268
|
+
super(OPENAI_CODEX_REAUTH_REQUIRED_MESSAGE);
|
|
269
|
+
this.name = "OpenAICodexReauthRequiredError";
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
/** Identify the dedicated reauthorization failure without comparing messages. */
|
|
273
|
+
function isOpenAICodexReauthRequiredError(error) {
|
|
274
|
+
return error instanceof OpenAICodexReauthRequiredError;
|
|
275
|
+
}
|
|
255
276
|
function isRecord$2(value) {
|
|
256
277
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
257
278
|
}
|
|
@@ -363,7 +384,10 @@ async function readOpenAICodexRateLimits(store) {
|
|
|
363
384
|
},
|
|
364
385
|
signal: AbortSignal.timeout(USAGE_REQUEST_TIMEOUT_MS)
|
|
365
386
|
});
|
|
366
|
-
if (!response.ok)
|
|
387
|
+
if (!response.ok) {
|
|
388
|
+
if (response.status === 401 || response.status === 403) throw new OpenAICodexReauthRequiredError();
|
|
389
|
+
throw new Error(`OpenAI Codex usage request failed with HTTP ${response.status}`);
|
|
390
|
+
}
|
|
367
391
|
let value;
|
|
368
392
|
try {
|
|
369
393
|
value = await response.json();
|
|
@@ -507,6 +531,10 @@ var OpenAICodexWebAuth = class {
|
|
|
507
531
|
usage: await readOpenAICodexRateLimits(this.store)
|
|
508
532
|
};
|
|
509
533
|
} catch (error) {
|
|
534
|
+
if (isOpenAICodexReauthRequiredError(error)) return {
|
|
535
|
+
status: "reauth-required",
|
|
536
|
+
message: OPENAI_CODEX_REAUTH_REQUIRED_MESSAGE
|
|
537
|
+
};
|
|
510
538
|
return {
|
|
511
539
|
status: "signed-in",
|
|
512
540
|
usage: { rateLimits: [] },
|
|
@@ -618,7 +646,7 @@ function registerOpenAICodexAuthRoutes(ctx, store) {
|
|
|
618
646
|
}
|
|
619
647
|
//#endregion
|
|
620
648
|
//#region src/version.ts
|
|
621
|
-
const CODEX_CONNECT_VERSION = "0.1.0-alpha.4.
|
|
649
|
+
const CODEX_CONNECT_VERSION = "0.1.0-alpha.4.7";
|
|
622
650
|
//#endregion
|
|
623
651
|
//#region src/doctor.ts
|
|
624
652
|
/** Secret-free diagnostics and duplicate-provider guidance. */
|
|
@@ -1481,4 +1509,4 @@ function apply(ctx, config) {
|
|
|
1481
1509
|
scheduleCapabilities();
|
|
1482
1510
|
}
|
|
1483
1511
|
//#endregion
|
|
1484
|
-
export {
|
|
1512
|
+
export { loginOpenAICodex as A, assertNoOpenAICodexProviderConflict as C, OPENAI_CODEX_USAGE_URL as D, CODEX_CONNECT_VERSION as E, OpenAICodexCredentialStore as F, openAICodexAuthPath as I, openAICodexAuthStatus as M, OPENAI_CODEX_AUTH_FILENAME as N, parseOpenAICodexUsage as O, OPENAI_CODEX_PROVIDER as P, VIEW_IMAGE_TOOL_NAME as S, openAICodexConflictMessage as T, decodeOpenAICodexSettings as _, name as a, installOpenAICodexSearchEvent as b, OPENAI_CODEX_SEARCH_URL as c, DEFAULT_OPENAI_CODEX_SEARCH_CONTEXT_SIZE as d, DEFAULT_OPENAI_CODEX_SEARCH_MAX_OUTPUT_TOKENS as f, OPENAI_CODEX_SETTINGS_NAMESPACE as g, DEFAULT_OPENAI_CODEX_SETTINGS as h, inject as i, logoutOpenAICodex as j, readOpenAICodexRateLimits as k, OpenAICodexSearchProvider as l, DEFAULT_OPENAI_CODEX_SEARCH_MODEL as m, OPENAI_CODEX_SETTINGS_NS as n, OPENAI_CODEX_BASE_URL as o, DEFAULT_OPENAI_CODEX_SEARCH_MODE as p, apply as r, OPENAI_CODEX_SEARCH_PROVIDER as s, Config as t, mapOpenAICodexSearchResponse as u, resolveOpenAICodexSettings as v, diagnoseOpenAICodex as w, recordOpenAICodexSearchRequest as x, OPENAI_CODEX_SEARCH_MODEL_REQUEST_EVENT as y };
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "dsh-codex-connect",
|
|
3
3
|
"displayName": "Codex Connect",
|
|
4
4
|
"description": "ChatGPT OAuth and Codex models for DeepSeek Harness.",
|
|
5
|
-
"version": "0.1.0-alpha.4.
|
|
5
|
+
"version": "0.1.0-alpha.4.7",
|
|
6
6
|
"author": "Frank Song",
|
|
7
7
|
"contributors": [
|
|
8
8
|
"Yan-Zero (original dsh-codex author)"
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
"test": "vitest run",
|
|
44
44
|
"typecheck": "tsc -p tsconfig.json && tsc -p tsconfig.client.json",
|
|
45
45
|
"pack:check": "node scripts/check-pack.mjs",
|
|
46
|
+
"check:dsh-install": "node scripts/check-dsh-install.mjs",
|
|
46
47
|
"check": "pnpm run lint && pnpm run typecheck && pnpm run test && pnpm run build && pnpm run pack:check",
|
|
47
48
|
"prepublishOnly": "pnpm --config.minimum-release-age=0 run check"
|
|
48
49
|
},
|