dsh-codex-connect 0.1.0-alpha.4.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/INSTALL.md ADDED
@@ -0,0 +1,72 @@
1
+ # Installation Runbook for CLI Agents
2
+
3
+ Install `dsh-codex-connect` into one requested DeepSeek Harness profile without changing its current default model, search route, global configuration, or OAuth state.
4
+
5
+ ## Safety requirements
6
+
7
+ - Never read, print, copy, move, or modify `~/.codex/auth.json`.
8
+ - Never print or inspect `$DSH_HOME/.openai-codex-auth.json`; `doctor` may inspect pathname metadata only.
9
+ - Never add OAuth URLs, codes, tokens, account identifiers, or generated profile state to Git.
10
+ - Preserve every unrelated profile dependency and patch row.
11
+ - Do not start login unless the user explicitly asks to authenticate.
12
+
13
+ ## Install and validate
14
+
15
+ 1. Check `dsh --version` or `dsh --help`. From a Harness checkout use `pnpm dsh`.
16
+ 2. Install the package:
17
+
18
+ ```sh
19
+ dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.3'
20
+ ```
21
+
22
+ 3. Run `dsh --profile web --dump-config` and require exactly one `llm-openai-codex` row loading `dsh-codex-connect`.
23
+ 4. Confirm the effective `agent-default-model` and `web.searchProvider` values are unchanged from before installation.
24
+ 5. Run secret-free diagnostics:
25
+
26
+ ```sh
27
+ dsh plugin --profile web exec dsh-codex-connect doctor
28
+ ```
29
+
30
+ 6. If the user explicitly requests login, open **Settings → Plugins → Plugin configuration → Codex Connect**, or check `status` and then use `login` or `login --device-code`. OAuth approval belongs to the user.
31
+
32
+ ## Optional configuration
33
+
34
+ Use **Settings → Plugins → Plugin configuration → Codex Connect** for live, staged Save/Discard edits. The package row accepts the same `enableSearch` and `enableImageTool` fields as its composition base, both defaulting to `false`. Enabling search registers a provider but does not select it; selecting `web.searchProvider: openai-codex` is a second explicit profile change. Setting `agent-default-model` to `openai-codex` is also a separate explicit change.
35
+
36
+ Apply only requested choices and preserve unrelated keys:
37
+
38
+ ```yaml
39
+ - id: llm-openai-codex
40
+ config:
41
+ enableSearch: true
42
+ enableImageTool: false
43
+ searchMode: live
44
+
45
+ - id: web
46
+ config:
47
+ searchProvider: openai-codex
48
+
49
+ - id: agent-default-model
50
+ config:
51
+ provider: openai-codex
52
+ model: gpt-5.6-sol
53
+ ```
54
+
55
+ Do not add the last two rows unless the user separately requested those routing changes.
56
+
57
+ ## Conflict handling
58
+
59
+ `openai-codex` can have only one adapter. If startup reports a collision, inspect the effective config and remove only the old `dsh-codex` bundle or manual `openai-codex` provider row after confirming it is the conflicting owner. Do not delete auth files or unrelated providers.
60
+
61
+ ## Update and removal
62
+
63
+ ```sh
64
+ dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#<new-release-tag>'
65
+ dsh plugin --profile web remove dsh-codex-connect
66
+ ```
67
+
68
+ Removal of the package and removal of its separate OAuth file are different actions. Run `dsh plugin --profile web exec dsh-codex-connect logout` only with explicit credential-deletion authorization.
69
+
70
+ ## Completion report
71
+
72
+ Report the profile, installed version, effective default model, effective search route, enabled optional capabilities, signed-in/signed-out state only if checked, and Web client detection. Never report OAuth URLs, codes, token timestamps, account ids, or auth-file contents.
package/LICENSE ADDED
@@ -0,0 +1,202 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright 2026 Yan-Zero
190
+ Copyright 2026 Frank Song (modifications and additional work)
191
+
192
+ Licensed under the Apache License, Version 2.0 (the "License");
193
+ you may not use this file except in compliance with the License.
194
+ You may obtain a copy of the License at
195
+
196
+ http://www.apache.org/licenses/LICENSE-2.0
197
+
198
+ Unless required by applicable law or agreed to in writing, software
199
+ distributed under the License is distributed on an "AS IS" BASIS,
200
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201
+ See the License for the specific language governing permissions and
202
+ limitations under the License.
package/MIGRATION.md ADDED
@@ -0,0 +1,12 @@
1
+ # Migrating from `dsh-codex`
2
+
3
+ `dsh-codex-connect` uses the same provider id (`openai-codex`), OAuth filename (`.openai-codex-auth.json`), Cordis row id (`llm-openai-codex`), and browser auth routes for compatibility. The packages cannot be active together because Harness forbids duplicate provider adapters.
4
+
5
+ 1. Record the effective default model, search route, and `llm-openai-codex` config without reading any OAuth file.
6
+ 2. Remove `dsh-codex` from the selected profile and add `dsh-codex-connect`.
7
+ 3. Keep exactly one `llm-openai-codex` row loading `dsh-codex-connect`.
8
+ 4. Decide explicitly whether to set `enableSearch` and `enableImageTool`; both default to `false` after migration.
9
+ 5. Preserve the prior `agent-default-model` and `web.searchProvider` only when the user wants those routes to remain selected.
10
+ 6. Run `--dump-config`, then `dsh-codex-connect doctor`. Do not run OAuth again when `status` already reports signed in.
11
+
12
+ Rollback is the inverse package swap. Do not delete or copy the separate OAuth file during either direction. If Harness reports a duplicate `openai-codex` adapter, the old bundle or a manual provider row is still active; resolve that one row instead of changing credentials.
package/NOTICE ADDED
@@ -0,0 +1,15 @@
1
+ dsh-codex-connect
2
+ Copyright 2026 Frank Song
3
+
4
+ This product includes software derived from Yan-Zero/dsh-codex:
5
+ https://github.com/Yan-Zero/dsh-codex
6
+ Copyright 2026 Yan-Zero
7
+
8
+ Modifications and additional work for Codex Connect are Copyright 2026
9
+ Frank Song. They include a distinct package identity, opt-in routing and
10
+ capabilities, secret-free diagnostics, provider-conflict guidance, migration
11
+ documentation, security hardening, live plugin configuration, and Alpha
12
+ release validation.
13
+
14
+ The upstream material and the Codex Connect modifications are distributed
15
+ under the Apache License, Version 2.0 included in LICENSE.
@@ -0,0 +1,6 @@
1
+ # Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
2
+ # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
+ # after editing either side, bring the other along and re-record with:
4
+ # git hash-object README.md README.zh.md
5
+ README.md: e7a63add3ad36f0291b42190cdbf16e2c655a3b8
6
+ README.zh.md: bae8717ef5c8c8221d7576ec5b889b9a206991f3
package/README.md ADDED
@@ -0,0 +1,110 @@
1
+ # Codex Connect
2
+
3
+ English | [中文](README.zh.md)
4
+
5
+ Connect your ChatGPT subscription to DeepSeek Harness with OAuth, user-controlled defaults, Harness-native approvals, diagnostics, and reliable session recovery.
6
+
7
+ `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.
8
+
9
+ 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.
10
+
11
+ ## Install
12
+
13
+ ```sh
14
+ dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.3'
15
+ dsh web
16
+ ```
17
+
18
+ This installs the current alpha directly from its tagged GitHub release using Harness's supported Git package path. From a DeepSeek Harness source checkout, prefix commands with `pnpm`. For a local checkout, install `link:/absolute/path/to/dsh-codex-connect`.
19
+
20
+ Sign in from **Settings → Plugins → Plugin configuration → Codex Connect → Sign in with ChatGPT**, or use the CLI:
21
+
22
+ ```sh
23
+ dsh plugin --profile web exec dsh-codex-connect login
24
+ dsh plugin --profile web exec dsh-codex-connect status
25
+ dsh plugin --profile web exec dsh-codex-connect doctor
26
+ ```
27
+
28
+ 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.
29
+
30
+ ## Explicit configuration
31
+
32
+ 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.
33
+
34
+ The installed bundle row remains the composition base and is intentionally inert beyond model-provider registration:
35
+
36
+ ```yaml
37
+ - id: llm-openai-codex
38
+ config:
39
+ enableSearch: false
40
+ enableImageTool: false
41
+ ```
42
+
43
+ To make a Codex model the default for new agents, add or update the separate Harness row yourself:
44
+
45
+ ```yaml
46
+ - id: agent-default-model
47
+ config:
48
+ provider: openai-codex
49
+ model: gpt-5.6-sol
50
+ ```
51
+
52
+ The card can enable Codex standalone search. Selecting it as the profile's global search provider remains a separate explicit choice:
53
+
54
+ ```yaml
55
+ - id: llm-openai-codex
56
+ config:
57
+ enableSearch: true
58
+ searchMode: live
59
+ searchContextSize: medium
60
+
61
+ - id: web
62
+ config:
63
+ searchProvider: openai-codex
64
+ ```
65
+
66
+ 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.
67
+
68
+ | Field | Default | Values |
69
+ |---|---:|---|
70
+ | `enableSearch` | `false` | boolean |
71
+ | `enableImageTool` | `false` | boolean |
72
+ | `searchModel` | `gpt-5.6-sol` | Codex model id |
73
+ | `searchMode` | `cached` | `cached`, `indexed`, `live` |
74
+ | `searchContextSize` | `medium` | `low`, `medium`, `high` |
75
+ | `searchMaxOutputTokens` | `10000` | positive integer |
76
+
77
+ ## Credentials, diagnostics, and conflicts
78
+
79
+ - OAuth is stored separately at `$DSH_HOME/.openai-codex-auth.json` (`~/.dsh` by default); `~/.codex/auth.json` is never copied or modified.
80
+ - 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.
81
+ - Status and diagnostics return only non-sensitive state. OAuth flow output is confined to an explicit `login` operation.
82
+ - 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.
83
+ - 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.
84
+ - Removing the package does not delete OAuth state. Run `logout` only when credential removal is intended.
85
+
86
+ ## Compatibility and security boundary
87
+
88
+ - Alpha compatibility targets the current Harness `0.1.0-rc.5` main-line composition and compatible `0.1.0-rc.6` plugin APIs, Node.js `^22.19.0 || >=24.0.0`, and the pinned `@earendil-works/pi-ai` Codex provider.
89
+ - ChatGPT plan eligibility, model access, quotas, and backend behavior are controlled by OpenAI and may change.
90
+ - The Codex endpoint does not enforce the ordinary Responses `max_output_tokens` field. Harness compaction still works, but that summary cap cannot be imposed server-side on this route.
91
+ - Shell, filesystem, skills, MCP, subagents, approvals, permissions, attachments, session persistence, compaction, and recovery continue to come from the active Harness profile.
92
+ - Remote `view_image` URLs are limited to public HTTP(S) destinations. Every DNS result and redirect is checked, and the connection is pinned to the validated address so localhost, private networks, link-local services, and cloud metadata endpoints remain unreachable.
93
+ - No real OAuth operation is required for installation, build, tests, doctor, or package validation.
94
+
95
+ See [INSTALL.md](INSTALL.md) for the idempotent agent runbook, [MIGRATION.md](MIGRATION.md) for migration from `dsh-codex`, and [docs/design.md](docs/design.md) for architecture details.
96
+
97
+ ## Development
98
+
99
+ ```sh
100
+ pnpm install --frozen-lockfile
101
+ pnpm run check
102
+ ```
103
+
104
+ ## Legal / Acknowledgements
105
+
106
+ Copyright 2026 Frank Song for the modifications and additional work in Codex Connect. This project includes software derived from [Yan-Zero/dsh-codex](https://github.com/Yan-Zero/dsh-codex); Copyright 2026 Yan-Zero is retained for the upstream material. Both are distributed under Apache-2.0, with details in [NOTICE](NOTICE). This project is not affiliated with or endorsed by OpenAI, ChatGPT, Codex, DeepSeek, or DeepSeek Harness.
107
+
108
+ ## License
109
+
110
+ Apache-2.0
package/README.zh.md ADDED
@@ -0,0 +1,93 @@
1
+ # Codex Connect
2
+
3
+ [English](README.md) | 中文
4
+
5
+ 通过 OAuth 将你的 ChatGPT 订阅连接到 DeepSeek Harness,同时保留用户自主默认项、Harness 原生审批、非敏感诊断和可靠的会话恢复。
6
+
7
+ `dsh-codex-connect` 提供 `openai-codex` 模型目录和独立的 ChatGPT OAuth 登录。模型仍走 Harness 标准 LLM 服务,因此流式输出、工具调用、reasoning replay、压缩、文件系统控制、权限门禁和审批提示仍由 Harness 负责。ChatGPT 订阅不会因此变成 OpenAI Platform API 凭据。
8
+
9
+ 安装是增量的:bundle 不会替换当前主模型或搜索路由;独立搜索提供方和 `view_image` 工具也默认关闭,必须显式开启。
10
+
11
+ ## 安装
12
+
13
+ ```sh
14
+ dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.3'
15
+ dsh web
16
+ ```
17
+
18
+ 该命令通过 Harness 支持的 Git package 方式,直接安装 GitHub 上带版本标签的当前 Alpha。在 DeepSeek Harness 源码 checkout 中运行时,在命令前加 `pnpm`。本地开发可安装 `link:/absolute/path/to/dsh-codex-connect`。
19
+
20
+ 可在 **设置 → 插件 → 插件配置 → Codex Connect → 使用 ChatGPT 登录**,也可使用 CLI:
21
+
22
+ ```sh
23
+ dsh plugin --profile web exec dsh-codex-connect login
24
+ dsh plugin --profile web exec dsh-codex-connect status
25
+ dsh plugin --profile web exec dsh-codex-connect doctor
26
+ ```
27
+
28
+ `doctor` 只读取进程与文件系统元数据,不打开 OAuth 文件,也不会输出 token、授权 URL、授权码、账户 ID 或认证文件内容。
29
+
30
+ ## 显式配置
31
+
32
+ 打开 **设置 → 插件 → 插件配置 → Codex Connect**,可以在同一张卡片中管理 ChatGPT 账户和可选能力。更改通过 Harness 带 revision 防护的设置存储保存,并即时生效;**保存更改**只影响本插件的能力配置,绝不会选择默认模型或全局搜索路由。
33
+
34
+ 安装后的 bundle 行仍是 composition base,只注册模型提供方,不改变路由:
35
+
36
+ ```yaml
37
+ - id: llm-openai-codex
38
+ config:
39
+ enableSearch: false
40
+ enableImageTool: false
41
+ ```
42
+
43
+ 如需把 Codex 模型设为新 agent 的默认模型,需要自行添加或修改 Harness 的独立配置项:
44
+
45
+ ```yaml
46
+ - id: agent-default-model
47
+ config:
48
+ provider: openai-codex
49
+ model: gpt-5.6-sol
50
+ ```
51
+
52
+ 卡片可以启用 Codex 独立搜索;如需把它选为 profile 的全局搜索提供方,仍需单独显式配置:
53
+
54
+ ```yaml
55
+ - id: llm-openai-codex
56
+ config:
57
+ enableSearch: true
58
+ searchMode: live
59
+ searchContextSize: medium
60
+
61
+ - id: web
62
+ config:
63
+ searchProvider: openai-codex
64
+ ```
65
+
66
+ 如需图片加载工具,在 `llm-openai-codex` 上设置 `enableImageTool: true`。浏览器粘贴/拖放属于 Harness 附件能力,不依赖该工具。
67
+
68
+ ## 凭据、诊断与冲突
69
+
70
+ - OAuth 单独存储于 `$DSH_HOME/.openai-codex-auth.json`(默认 `~/.dsh`),不会复制或修改 `~/.codex/auth.json`。
71
+ - 支持的平台上,父目录与文件使用仅所有者可访问权限;写入采用原子替换,刷新写入使用跨进程文件锁。
72
+ - 状态和诊断只返回非敏感信息;OAuth 交互只会由显式 `login` 操作触发。
73
+ - 浏览器 OAuth 路由只接受 loopback 客户端和 loopback Host/Origin;30 秒内没有得到有效的 HTTPS 授权地址时会安全失败,不会一直挂起。
74
+ - 两个 adapter 不能同时占用 `openai-codex`。旧 `dsh-codex` bundle 或手动 provider 配置冲突时,启动会给出明确迁移提示。
75
+ - 移除包不会删除 OAuth 状态;只有确实需要删除凭据时才运行 `logout`。
76
+
77
+ ## 兼容性与安全边界
78
+
79
+ - 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。
80
+ - ChatGPT 套餐资格、模型权限、额度和后端行为由 OpenAI 控制,可能变化。
81
+ - shell、文件系统、skills、MCP、subagents、审批、权限、附件、会话持久化、压缩与恢复继续由当前 Harness profile 提供。
82
+ - 远程 `view_image` 只允许公共 HTTP(S) 目标;每一次 DNS 结果与重定向都会重新检查,并将连接固定到已验证地址,从而阻止 localhost、私网、link-local 服务和云元数据地址。
83
+ - 安装、构建、测试、doctor 和包内容验证均不需要真实 OAuth。
84
+
85
+ 详见 [INSTALL.md](INSTALL.md)、[MIGRATION.md](MIGRATION.md) 与 [docs/design.zh.md](docs/design.zh.md)。
86
+
87
+ ## 法律与致谢
88
+
89
+ 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 不存在隶属关系,也未获得其背书。
90
+
91
+ ## 许可证
92
+
93
+ Apache-2.0
@@ -0,0 +1,8 @@
1
+ # Install the provider without changing the profile's current default model or
2
+ # web-search route. Optional capabilities require explicit profile config.
3
+ - insert:
4
+ - id: llm-openai-codex
5
+ name: dsh-codex-connect
6
+ config:
7
+ enableSearch: false
8
+ enableImageTool: false
@@ -0,0 +1,4 @@
1
+ # Bilingual-pair consistency record for the design document. Re-record with:
2
+ # git hash-object docs/design.md docs/design.zh.md
3
+ design.md: c03949ff0c973040401b558cadf34f92cdccf568
4
+ design.zh.md: 2bd55edd9b6a6f079775eaf6dcc5892755ef6fda
package/docs/design.md ADDED
@@ -0,0 +1,29 @@
1
+ # Codex Connect: Alpha design
2
+
3
+ ## Ownership and composition
4
+
5
+ The package registers `openai-codex` through Harness's public `LlmRuntime` and `PiAiAdapter` surfaces. The main model path is not a one-shot subagent: it remains the normal Harness agent loop, preserving native tool approvals, permission policy, streaming, attachment resolution, reasoning replay, session persistence, compaction, and recovery.
6
+
7
+ The bundle patch inserts only `llm-openai-codex`. It never writes `agent-default-model` or `web.searchProvider`. `enableSearch` and `enableImageTool` are capability gates defaulting to `false`; the optional service injections are not registered while disabled.
8
+
9
+ The Host registers `llm-openai-codex` as the plugin-owned settings namespace and declares `OpenAI Codex` in the LLM configurable-provider directory. The browser binds that namespace through Harness's settings-scope transport and renders account, quota, Save/Discard capability controls in the existing Plugin configuration card. Revision-fenced field writes preserve unrelated settings. Committed changes reconcile search and image registrations live; the default-model and global-search namespaces are never written.
10
+
11
+ ## OAuth persistence
12
+
13
+ The plugin uses `$DSH_HOME/.openai-codex-auth.json`, separate from Codex CLI/Desktop state. The file format is strict and versioned. POSIX reads reject group/world-accessible files. Parent directories and files are created with owner-only modes, writes are atomic, and refresh mutations use the Harness cross-process file lock. Callers receive cloned credentials.
14
+
15
+ The settings routes and CLI reuse the existing OAuth path and route names for migration compatibility. Only an explicit login operation emits an authorization URL or code. Browser requests must come from a loopback peer with a loopback Host and, when supplied, an exact loopback HTTP(S) Origin. A login challenge accepts only credential-free HTTPS URLs and fails closed after 30 seconds or when the provider finishes without a URL; logout and disposal cancel pending waiters. Status responses are redacted. Doctor uses `lstat` metadata and never opens the document.
16
+
17
+ ## Search and images
18
+
19
+ When `enableSearch: true`, the plugin registers its standalone search provider and secret-free request event. Harness still requires explicit `web.searchProvider: openai-codex` when multiple providers exist. Search responses are mapped to Harness text and citation records.
20
+
21
+ When `enableImageTool: true`, `view_image` is registered only after tools, filesystem, and attachment services are available. Local files remain bounded by the Harness filesystem surface. Remote images allow only credential-free public HTTP(S): all DNS answers must be public unicast, each redirect is revalidated, and each socket is pinned to the validated address to close DNS-rebinding gaps. The tool also checks bounded bytes, accepted media signatures, and current-model image support before saving a Harness attachment.
22
+
23
+ ## Conflicts and diagnostics
24
+
25
+ Before registration the plugin checks current provider ids. An existing `openai-codex` adapter produces a focused message naming the likely legacy-bundle or manual-provider cause. The boot-free CLI `doctor` reports package/runtime version, OAuth path metadata, capability defaults, and safe conflict guidance without returning auth content.
26
+
27
+ ## Compatibility boundary
28
+
29
+ The Alpha pins Harness `0.1.0-rc.6` development dependencies while targeting the current `0.1.0-rc.5` main-line composition and compatible APIs; supported Node.js is `^22.19.0 || >=24.0.0`. It pins `@earendil-works/pi-ai` `0.82.1`. Backend eligibility, quotas, models, and protocol details remain controlled upstream. Tests use temporary OAuth documents and mocked network responses; CI does not perform real authentication.
@@ -0,0 +1,25 @@
1
+ # Codex Connect:Alpha 设计
2
+
3
+ ## 所有权与组合
4
+
5
+ 本包通过 Harness 公共 `LlmRuntime` 与 `PiAiAdapter` 注册 `openai-codex`。主模型路径不是一次性 subagent,而是标准 Harness agent loop,因此原生工具审批、权限策略、流式输出、附件解析、reasoning replay、会话持久化、压缩与恢复均保持有效。
6
+
7
+ bundle patch 只插入 `llm-openai-codex`,不会写入 `agent-default-model` 或 `web.searchProvider`。`enableSearch` 与 `enableImageTool` 默认均为 `false`;关闭时不会注册对应可选服务。
8
+
9
+ Host 将 `llm-openai-codex` 注册为插件自有 settings namespace,并在 LLM 可配置 provider 目录中声明显示名为 `OpenAI Codex`。浏览器通过 Harness settings-scope transport 绑定该 namespace,把账户、额度以及带保存/放弃的能力配置放在现有“插件配置”卡片中。带 revision 防护的逐字段写入不会覆盖无关设置;提交后会即时协调搜索与图片能力的注册状态,且绝不写入默认模型或全局搜索 namespace。
10
+
11
+ ## OAuth 持久化
12
+
13
+ 插件使用 `$DSH_HOME/.openai-codex-auth.json`,与 Codex CLI/Desktop 状态分离。文件格式严格且有版本号;POSIX 上会拒绝组/其他用户可读文件。父目录和文件按仅所有者权限创建,写入采用原子替换,刷新修改使用 Harness 跨进程文件锁,返回给调用方的是凭据副本。
14
+
15
+ 为兼容迁移,设置页路由、OAuth 路径和 provider id 不改名。浏览器请求必须来自 loopback 对端,并带有 loopback Host;若带 Origin,则必须与该本地 HTTP(S) 源精确匹配。登录挑战只接受不含凭据的 HTTPS 地址;30 秒内未得到地址、provider 已结束但没有地址、退出登录或插件卸载时,所有 waiter 都会被清理。只有显式登录会输出授权 URL 或代码;状态输出会脱敏。doctor 只用 `lstat` 检查元数据,不打开文件。
16
+
17
+ ## 搜索与图片
18
+
19
+ 仅当 `enableSearch: true` 时注册 Codex 独立搜索提供方和不含凭据的请求事件。多 provider 环境仍需显式设置 `web.searchProvider: openai-codex`。仅当 `enableImageTool: true` 且 tools、filesystem、attachments 服务存在时注册 `view_image`。本地文件继续受 Harness 文件系统边界与大小限制;远程图片只允许不含凭据的公共 HTTP(S),所有 DNS 结果必须是公共单播地址,每次重定向都会重新验证,并把实际连接固定到已验证地址以关闭 DNS rebinding 缺口。
20
+
21
+ ## 冲突、诊断与兼容边界
22
+
23
+ 注册前检查现有 provider id;发现 `openai-codex` 已被占用时,给出旧 bundle 或手动 provider 配置的定向迁移提示。boot-free CLI doctor 只报告包/运行时版本、OAuth 路径元数据、能力默认值和安全提示。
24
+
25
+ Alpha 固定使用 Harness `0.1.0-rc.6` 开发依赖,同时面向当前 `0.1.0-rc.5` 主线组合与兼容 API;Node.js 支持 `^22.19.0 || >=24.0.0`。`@earendil-works/pi-ai` 固定为 `0.82.1`。资格、额度、模型和后端协议仍由上游控制。测试仅使用临时 OAuth 文档和模拟网络响应,CI 不执行真实认证。
package/lib/bin.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ //#region src/bin.d.ts
2
+ /** Standalone credential CLI for the optional OpenAI Codex bundle. */
3
+ /** Execute one boot-free credential command. */
4
+ declare function run(argv: readonly string[]): Promise<number>;
5
+ //#endregion
6
+ export { run };