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 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
- To pin this release exactly, use `dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.5`. If npm is unavailable, use `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.5'`.
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: 27439ded00edd30a248acf6cc7af53d0ef93ef1b
6
- docs/README.zh.md: 49e5e00191ff055ab23109e1237d9e75f84f3b46
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
- ## See it in Harness
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
- Sign in and manage the plugin from **Settings → Plugins → Plugin configuration → Codex Connect**.
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/oauth-status.jpg" alt="Codex Connect ChatGPT OAuth status inside Harness plugin configuration" width="720">
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
- Optional Codex search and `view_image` capabilities remain explicit, profile-scoped choices:
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/plugin-configuration.jpg" alt="Codex Connect optional capability settings in DeepSeek Harness" width="720">
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
- Codex models then appear in Harness's normal model picker alongside the existing providers:
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 models in the DeepSeek Harness model picker" width="320">
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
- ## Install
71
+ To confirm the configured plugin row locally, run:
38
72
 
39
73
  ```sh
40
- dsh plugin --profile web add dsh-codex-connect@alpha
41
- dsh web
74
+ dsh --profile web --dump-config
42
75
  ```
43
76
 
44
- To pin this release exactly, use `dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.5`. If npm is unavailable, use the GitHub tag fallback: `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.5'`. From a DeepSeek Harness source checkout, prefix commands with `pnpm`. For a local checkout, install `link:/absolute/path/to/dsh-codex-connect`.
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
- Sign in from **Settings → Plugins → Plugin configuration → Codex Connect → Sign in with ChatGPT**, or use the CLI:
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 login
50
- dsh plugin --profile web exec dsh-codex-connect status
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
- The doctor command reads process and filesystem metadata only. It never opens the OAuth document or prints a token, authorization URL, authorization code, account id, or auth-file content.
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
- ## Explicit configuration
88
+ ## Optional capabilities (off by default)
57
89
 
58
- Open **Settings → Plugins → Plugin configuration → Codex Connect** to manage the ChatGPT account and optional capabilities in one card. Changes use Harness's revision-fenced settings store and apply live. **Save changes** affects only this plugin's capability section; it never selects a default model or global search route.
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
- The card can enable Codex standalone search. Selecting it as the profile's global search provider remains a separate explicit choice:
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
- ## Credentials, diagnostics, and conflicts
146
+ ## Reauthentication, diagnostics, and conflicts
104
147
 
105
- - OAuth is stored separately at `$DSH_HOME/.openai-codex-auth.json` (`~/.dsh` by default); `~/.codex/auth.json` is never copied or modified.
106
- - The parent directory and file are created with owner-only permissions where supported. Writes are atomic, and refresh writes use a cross-process file lock.
107
- - Status and diagnostics return only non-sensitive state. OAuth flow output is confined to an explicit `login` operation.
108
- - Browser OAuth routes accept only loopback clients and loopback Host/Origin values; sign-in fails closed when no valid HTTPS authorization URL arrives within 30 seconds.
109
- - A second adapter cannot own `openai-codex`. Startup fails with a focused hint when the legacy `dsh-codex` bundle or a manual provider row conflicts.
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
- ## 在 Harness 中的样子
17
+ 本中文指南中的 UI 截图均来自中文本地化的 Harness 界面;[English 版](../README.md) 使用同一状态的英文截图。模型与提供方标识保留其规范拼写,不随界面语言翻译。
18
18
 
19
- 在 **设置 → 插件 → 插件配置 → Codex Connect** 中登录并管理插件。
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/oauth-status.jpg" alt="Harness 插件配置中的 Codex Connect ChatGPT OAuth 状态" width="720">
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
- Codex 搜索与 `view_image` 都是显式、按 profile 控制的可选能力:
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/plugin-configuration.jpg" alt="DeepSeek Harness 中的 Codex Connect 可选能力设置" width="720">
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
- Codex 模型会和现有提供方一起出现在 Harness 原生模型选择器中:
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 模型" width="320">
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 plugin --profile web add dsh-codex-connect@alpha
41
- dsh web
74
+ dsh --profile web --dump-config
42
75
  ```
43
76
 
44
- 如需精确固定此版本,使用 `dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.5`。若 npm 不可用,可使用 GitHub tag 兜底:`dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.5'`。在 DeepSeek Harness 源码 checkout 中运行时,在命令前加 `pnpm`。本地开发可安装 `link:/absolute/path/to/dsh-codex-connect`。
77
+ 预期结果:配置中恰好有一条 `llm-openai-codex`。请只在本机查看这份配置输出,它可能包含无关的 profile 设置。
45
78
 
46
- 可在 **设置 → 插件 → 插件配置 → Codex Connect → 使用 ChatGPT 登录**,也可使用 CLI:
79
+ 如需不启动 OAuth 的非敏感状态和诊断输出,运行:
47
80
 
48
81
  ```sh
49
- dsh plugin --profile web exec dsh-codex-connect login
50
- dsh plugin --profile web exec dsh-codex-connect status
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` 只读取进程与文件系统元数据,不打开 OAuth 文件,也不会输出 token、授权 URL、授权码、账户 ID 或认证文件内容。
55
-
56
- ## 显式配置
86
+ 预期结果:`status --json` 报告 `signed-in` 并以 `0` 退出,`doctor --json` 只输出一条非敏感 JSON。尚未登录时 `status --json` 会以 `1` 退出;回到第 4 步登录即可,不要把它当作插件故障。
57
87
 
58
- 打开 **设置 → 插件 → 插件配置 → Codex Connect**,可以在同一张卡片中管理 ChatGPT 账户和可选能力。更改通过 Harness 带 revision 防护的设置存储保存,并即时生效;**保存更改**只影响本插件的能力配置,绝不会选择默认模型或全局搜索路由。
88
+ ## 可选能力(默认关闭)
59
89
 
60
- 安装后的 bundle 行仍是 composition base,只注册模型提供方,不改变路由:
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
- 如需把 Codex 模型设为新 agent 的默认模型,需要自行添加或修改 Harness 的独立配置项:
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
- 卡片可以启用 Codex 独立搜索;如需把它选为 profile 的全局搜索提供方,仍需单独显式配置:
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
- 如需图片加载工具,在 `llm-openai-codex` 上设置 `enableImageTool: true`。浏览器粘贴/拖放属于 Harness 附件能力,不依赖该工具。
93
-
94
- ## 凭据、诊断与冲突
95
-
96
- - OAuth 单独存储于 `$DSH_HOME/.openai-codex-auth.json`(默认 `~/.dsh`),不会复制或修改 `~/.codex/auth.json`。
97
- - 支持的平台上,父目录与文件使用仅所有者可访问权限;写入采用原子替换,刷新写入使用跨进程文件锁。
98
- - 状态和诊断只返回非敏感信息;OAuth 交互只会由显式 `login` 操作触发。
99
- - 浏览器 OAuth 路由只接受 loopback 客户端和 loopback Host/Origin;30 秒内没有得到有效的 HTTPS 授权地址时会安全失败,不会一直挂起。
100
- - 两个 adapter 不能同时占用 `openai-codex`。旧 `dsh-codex` bundle 或手动 provider 配置冲突时,启动会给出明确迁移提示。
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
package/lib/bin.js CHANGED
@@ -1,11 +1,12 @@
1
1
  #!/usr/bin/env node
2
- import { A as logoutOpenAICodex, F as openAICodexAuthPath, j as openAICodexAuthStatus, k as loginOpenAICodex, w as diagnoseOpenAICodex } from "./src-k439bIuH.js";
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
- if (flags.filter((flag) => flag !== "--device-code").length > 0 || flags.includes("--device-code") && action !== "login") {
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.credentialFile.state === "permissions-too-broad" || report.credentialFile.state === "not-a-regular-file" || report.credentialFile.state === "unreadable-metadata" ? 1 : 0;
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, flags.includes("--device-code"), (text, options) => readline.question(text, options)),
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 logoutOpenAICodex, C as assertNoOpenAICodexProviderConflict, D as parseOpenAICodexUsage, E as OPENAI_CODEX_USAGE_URL, F as openAICodexAuthPath, M as OPENAI_CODEX_AUTH_FILENAME, N as OPENAI_CODEX_PROVIDER, O as readOpenAICodexRateLimits, P as OpenAICodexCredentialStore, 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 openAICodexAuthStatus, k as loginOpenAICodex, 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-k439bIuH.js";
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) throw new Error(response.status === 401 || response.status === 403 ? "OpenAI Codex sign-in needs to be renewed" : `OpenAI Codex usage request failed with HTTP ${response.status}`);
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.5";
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 { logoutOpenAICodex as A, assertNoOpenAICodexProviderConflict as C, parseOpenAICodexUsage as D, OPENAI_CODEX_USAGE_URL as E, openAICodexAuthPath as F, OPENAI_CODEX_AUTH_FILENAME as M, OPENAI_CODEX_PROVIDER as N, readOpenAICodexRateLimits as O, OpenAICodexCredentialStore 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, openAICodexAuthStatus as j, loginOpenAICodex 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 };
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",
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
  },