dsh-codex-connect 0.1.0-alpha.4.10

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,89 @@
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
+ The only verified combination is DSH plugin API packages `0.1.0-rc.7`, `@earendil-works/pi-ai` `0.82.1`, and Node.js `^22.19.0 || >=24.0.0`. Alpha 4.10 uses the rc.7 keyed Plugin configuration slot; DSH rc.6 users should remain on Alpha 4.9. Upgrade the DSH API packages and pi-ai together, then rerun `dsh-codex-connect doctor --json` and `pnpm --silent run check:compatibility`; the contract does not make claims about future versions.
16
+
17
+ 1. Check `dsh --version` or `dsh --help`. From a Harness checkout use `pnpm dsh`.
18
+ 2. Install the package:
19
+
20
+ ```sh
21
+ dsh plugin --profile web add dsh-codex-connect@alpha
22
+ ```
23
+
24
+ After `0.1.0-alpha.4.10` is published, pin it exactly with `dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.10`. 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.10'`.
25
+
26
+ 3. Run `dsh --profile web --dump-config` and require exactly one `llm-openai-codex` row loading `dsh-codex-connect`.
27
+ 4. Confirm the effective `agent-default-model` and `web.searchProvider` values are unchanged from before installation.
28
+ 5. Run secret-free diagnostics:
29
+
30
+ ```sh
31
+ dsh plugin --profile web exec dsh-codex-connect doctor
32
+ ```
33
+
34
+ 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.
35
+
36
+ ### Remote browser access
37
+
38
+ The default Web OAuth boundary is loopback-only. When DSH runs on one device and you open it from another device on a trusted network through an IP address or domain, run the following on the device that runs DSH with the exact origin from the browser address bar:
39
+
40
+ ```sh
41
+ dsh plugin --profile web exec dsh-codex-connect trust-origin http://192.168.1.20:3080
42
+ dsh plugin --profile web exec dsh-codex-connect trusted-origins
43
+ ```
44
+
45
+ The value is a full `http://` or `https://` origin including its port, not a bare device IP and not a path/query/fragment. Use `untrust-origin <origin>` to remove it. Restrict this to a trusted network and never expose the route publicly; use an SSH tunnel when that is safer. The Web client does not edit this list.
46
+
47
+ ## Optional configuration
48
+
49
+ 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.
50
+
51
+ Apply only requested choices and preserve unrelated keys:
52
+
53
+ ```yaml
54
+ - id: llm-openai-codex
55
+ config:
56
+ enableSearch: true
57
+ enableImageTool: false
58
+ searchMode: live
59
+
60
+ - id: web
61
+ config:
62
+ searchProvider: openai-codex
63
+
64
+ - id: agent-default-model
65
+ config:
66
+ provider: openai-codex
67
+ model: gpt-5.6-sol
68
+ ```
69
+
70
+ Do not add the last two rows unless the user separately requested those routing changes.
71
+
72
+ ## Conflict handling
73
+
74
+ `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.
75
+
76
+ ## Update and removal
77
+
78
+ ```sh
79
+ dsh plugin --profile web update dsh-codex-connect@alpha
80
+ dsh plugin --profile web remove dsh-codex-connect
81
+ ```
82
+
83
+ Use an exact npm version when a reproducible update is required; use a GitHub tag only as the npm-unavailable fallback.
84
+
85
+ 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.
86
+
87
+ ## Completion report
88
+
89
+ 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 docs/README.zh.md
5
+ README.md: 6eedfff99162f49458c9fc6f5fc4dff502aa7dfc
6
+ docs/README.zh.md: 3fa64da86d3c1f1305f67a5e29e4255ca309eccb
package/README.md ADDED
@@ -0,0 +1,193 @@
1
+ # Codex Connect
2
+
3
+ [![npm version](https://img.shields.io/npm/v/dsh-codex-connect?label=npm&color=cb3837)](https://www.npmjs.com/package/dsh-codex-connect)
4
+
5
+ English | [中文](docs/README.zh.md)
6
+
7
+ Connect your ChatGPT subscription to DeepSeek Harness with OAuth, user-controlled defaults, Harness-native approvals, diagnostics, and reliable session recovery.
8
+
9
+ <p align="center">
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
+ </p>
12
+
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
+
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
+
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
+
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.10`. 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.10'`. 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.
46
+
47
+ <p align="center">
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">
49
+ </p>
50
+
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.
56
+
57
+ <p align="center">
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">
59
+ </p>
60
+
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.
66
+
67
+ <p align="center">
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">
69
+ </p>
70
+
71
+ To confirm the configured plugin row locally, run:
72
+
73
+ ```sh
74
+ dsh --profile web --dump-config
75
+ ```
76
+
77
+ Expected result: the configuration has exactly one `llm-openai-codex` row. Keep this configuration dump local; it may include unrelated profile settings.
78
+
79
+ For secret-free status and diagnostics that do not start OAuth, run:
80
+
81
+ ```sh
82
+ dsh plugin --profile web exec dsh-codex-connect status --json
83
+ dsh plugin --profile web exec dsh-codex-connect doctor --json
84
+ ```
85
+
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.
87
+
88
+ ## Optional capabilities (off by default)
89
+
90
+ The installed bundle is intentionally inert beyond model-provider registration:
91
+
92
+ ```yaml
93
+ - id: llm-openai-codex
94
+ config:
95
+ enableSearch: false
96
+ enableImageTool: false
97
+ ```
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
+
114
+ To make a Codex model the default for new agents, add or update the separate Harness row yourself:
115
+
116
+ ```yaml
117
+ - id: agent-default-model
118
+ config:
119
+ provider: openai-codex
120
+ model: gpt-5.6-sol
121
+ ```
122
+
123
+ Selecting Codex as the profile's global search route is another explicit change:
124
+
125
+ ```yaml
126
+ - id: llm-openai-codex
127
+ config:
128
+ enableSearch: true
129
+ searchMode: live
130
+ searchContextSize: medium
131
+
132
+ - id: web
133
+ config:
134
+ searchProvider: openai-codex
135
+ ```
136
+
137
+ | Field | Default | Values |
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` | positive integer |
145
+
146
+ ## Reauthentication, diagnostics, and conflicts
147
+
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
+ - By default, the OAuth routes accept loopback browser requests only. When DSH runs on one device and you open it from another device on a trusted network, approve the browser address-bar origin explicitly on the device that runs DSH:
153
+
154
+ ```sh
155
+ dsh plugin --profile web exec dsh-codex-connect trust-origin http://192.168.1.20:3080
156
+ dsh plugin --profile web exec dsh-codex-connect trusted-origins
157
+ dsh plugin --profile web exec dsh-codex-connect untrust-origin http://192.168.1.20:3080
158
+ ```
159
+
160
+ Replace the example with the exact origin from the browser address bar, including scheme and port; do not enter the accessing device's IP, a bare host, a path, a query, or a fragment. Trust only a network you control, never expose this route to the public Internet, and use an SSH tunnel as the fallback when explicit network trust is not appropriate. The browser page only displays and copies this command; it never changes the allowlist itself.
161
+ - 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.
162
+ - Removing the package does not delete OAuth state. Run `logout` only when credential removal is intended.
163
+
164
+ ## Compatibility and security boundary
165
+
166
+ - The only verified compatibility combination is DSH plugin API packages `0.1.0-rc.7`, `@earendil-works/pi-ai` `0.82.1`, and Node.js `^22.19.0 || >=24.0.0`; see [compatibility.json](compatibility.json). Alpha 4.10 uses the rc.7 keyed Plugin configuration slot; DSH rc.6 users should remain on Alpha 4.9.
167
+ - Upgrade the DSH plugin API packages and `@earendil-works/pi-ai` as one group, then run `dsh-codex-connect doctor --json` and the compatibility check again. This contract does not make claims about future versions.
168
+ - ChatGPT plan eligibility, model access, quotas, and backend behavior are controlled by OpenAI and may change.
169
+ - 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.
170
+ - Shell, filesystem, skills, MCP, subagents, approvals, permissions, attachments, session persistence, compaction, and recovery continue to come from the active Harness profile.
171
+ - 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.
172
+ - No real OAuth operation is required for installation, build, tests, doctor, or package validation.
173
+
174
+ See [INSTALL.md](INSTALL.md) for the idempotent agent runbook, [RELEASING.md](RELEASING.md) for the Alpha release checklist, [MIGRATION.md](MIGRATION.md) for migration from `dsh-codex`, and [docs/design.md](docs/design.md) for architecture details.
175
+
176
+ ## Development
177
+
178
+ ```sh
179
+ pnpm install --frozen-lockfile
180
+ pnpm run check
181
+ ```
182
+
183
+ ## Releases
184
+
185
+ Maintainers publish alpha versions through the [manual OIDC release workflow](.github/workflows/release.yml); see the [alpha release runbook](RELEASING.md) for the separate, short-lived `latest` promotion step.
186
+
187
+ ## Legal / Acknowledgements
188
+
189
+ 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.
190
+
191
+ ## License
192
+
193
+ Apache-2.0
@@ -0,0 +1,28 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "engines": {
4
+ "node": "^22.19.0 || >=24.0.0"
5
+ },
6
+ "dshPluginApi": {
7
+ "version": "0.1.0-rc.7",
8
+ "packages": [
9
+ "@deepseek-ai/dsh-agent",
10
+ "@deepseek-ai/dsh-atomic-write",
11
+ "@deepseek-ai/dsh-attachment",
12
+ "@deepseek-ai/dsh-home-paths",
13
+ "@deepseek-ai/dsh-host-webserver",
14
+ "@deepseek-ai/dsh-invariants",
15
+ "@deepseek-ai/dsh-llm",
16
+ "@deepseek-ai/dsh-llm-pi-ai",
17
+ "@deepseek-ai/dsh-fs",
18
+ "@deepseek-ai/dsh-session",
19
+ "@deepseek-ai/dsh-settings",
20
+ "@deepseek-ai/dsh-tools",
21
+ "@deepseek-ai/dsh-web"
22
+ ]
23
+ },
24
+ "piAi": {
25
+ "package": "@earendil-works/pi-ai",
26
+ "version": "0.82.1"
27
+ }
28
+ }
@@ -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