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 +72 -0
- package/LICENSE +202 -0
- package/MIGRATION.md +12 -0
- package/NOTICE +15 -0
- package/README.i18n.yaml +6 -0
- package/README.md +110 -0
- package/README.zh.md +93 -0
- package/cordis.patch.yml +8 -0
- package/docs/design.i18n.yaml +4 -0
- package/docs/design.md +29 -0
- package/docs/design.zh.md +25 -0
- package/lib/bin.d.ts +6 -0
- package/lib/bin.js +145 -0
- package/lib/client.js +1086 -0
- package/lib/index.d.ts +333 -0
- package/lib/index.js +2 -0
- package/lib/invariant.d.ts +14 -0
- package/lib/invariant.js +15 -0
- package/lib/src-ILOioCkA.js +1484 -0
- package/package.json +145 -0
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.
|
package/README.i18n.yaml
ADDED
|
@@ -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
|
package/cordis.patch.yml
ADDED
|
@@ -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
|
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