dsh-codex-connect 0.1.0-alpha.4.38 → 0.1.0-alpha.4.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/INSTALL.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # Installation Runbook for CLI Agents
2
2
 
3
- Published Alpha 4.37 is verified with DSH `0.1.2-rc.1` and pi-ai `0.84.4` within `^0.84.2`, and with each exact DSH `0.1.5-alpha.1`, `0.1.5-rc.1`, and `0.1.5-rc.2` model-runtime pairing using pi-ai `0.85.1`.
3
+ Published Alpha 4.38 is verified with DSH `0.1.2-rc.1` and pi-ai `0.84.4` within `^0.84.2`, and with each exact DSH `0.1.5-alpha.1`, `0.1.5-rc.1`, and `0.1.5-rc.2` model-runtime pairing using pi-ai `0.85.1`.
4
4
 
5
5
  Install `dsh-codex-connect` into one requested DeepSeek Harness profile without changing its current default model, search route, global configuration, or OAuth state.
6
6
 
7
- Channel snapshot on 2026-09-19: npm `alpha` points to `0.1.0-alpha.4.37`; `latest` intentionally remains on `0.1.0-alpha.4.34`. Use the exact-version commands below for 4.37. Publishing an Alpha and promoting the default installation channel are separate actions.
7
+ Channel snapshot on 2026-09-20: npm `alpha` points to `0.1.0-alpha.4.38`; `latest` intentionally remains on `0.1.0-alpha.4.34`. Use the exact-version commands below for 4.38. Publishing an Alpha and promoting the default installation channel are separate actions.
8
8
 
9
9
  ## Safety requirements
10
10
 
@@ -25,17 +25,17 @@ Check `dsh --version` before changing the requested profile. Use `dsh --help` to
25
25
  | `0.1.0-rc.7` | `0.1.0-alpha.4.14` |
26
26
  | `0.1.1-rc.2` | `0.1.0-alpha.4.21` |
27
27
  | `0.1.2-alpha.2` | `0.1.0-alpha.4.23` |
28
- | `0.1.2-rc.1` | `0.1.0-alpha.4.37` |
28
+ | `0.1.2-rc.1` | `0.1.0-alpha.4.38` |
29
29
  | `0.1.2-alpha.5` | `0.1.0-alpha.4.25` |
30
- | `0.1.5-alpha.1` | `0.1.0-alpha.4.37` |
31
- | `0.1.5-rc.1` | `0.1.0-alpha.4.37` |
32
- | `0.1.5-rc.2` | `0.1.0-alpha.4.37` |
30
+ | `0.1.5-alpha.1` | `0.1.0-alpha.4.38` |
31
+ | `0.1.5-rc.1` | `0.1.0-alpha.4.38` |
32
+ | `0.1.5-rc.2` | `0.1.0-alpha.4.38` |
33
33
 
34
34
  If your exact DSH version is unknown or not listed, preserve the installed host, report that the combination is unverified, and verify it before making installation changes. A missing record does not prove incompatibility, and the catalog's latest verified DSH version is not the latest upstream release. Do not recommend upgrading or downgrading DSH merely to match a row. Investigate any specific failure and seek verification of the installed combination. Do not blindly install `dsh-codex-connect@alpha`: `alpha` is a moving tag, not a compatibility guarantee. Do not infer support for newer DSH versions from these rows.
35
35
 
36
- Alpha 4.37 requires one consistent DSH plugin API version: `0.1.2-rc.1` with `@earendil-works/pi-ai` `^0.84.2`, or one of `0.1.5-alpha.1`, `0.1.5-rc.1`, and `0.1.5-rc.2` with pi-ai `0.85.1`; Node.js remains `^22.19.0 || >=24.0.0`. Mixed host versions and other DSH/pi-ai combinations remain unverified. Alpha 4.25 remains the verified choice for DSH `0.1.2-alpha.5`, Alpha 4.23 remains the verified choice for DSH `0.1.2-alpha.2`, Alpha 4.21 remains the verified choice for DSH `0.1.1-rc.2`, and staying on DSH `0.1.0-rc.7` means selecting Alpha 4.14. Changing DSH is a separate operation requiring the user's explicit request; a plugin update request does not authorize it. The repository's `pnpm --silent run check:compatibility` remains a strict development/release dependency gate, not a recommendation to change a user's host.
36
+ Alpha 4.38 requires one consistent DSH plugin API version: `0.1.2-rc.1` with `@earendil-works/pi-ai` `^0.84.2`, or one of `0.1.5-alpha.1`, `0.1.5-rc.1`, and `0.1.5-rc.2` with pi-ai `0.85.1`; Node.js remains `^22.19.0 || >=24.0.0`. Mixed host versions and other DSH/pi-ai combinations remain unverified. Alpha 4.25 remains the verified choice for DSH `0.1.2-alpha.5`, Alpha 4.23 remains the verified choice for DSH `0.1.2-alpha.2`, Alpha 4.21 remains the verified choice for DSH `0.1.1-rc.2`, and staying on DSH `0.1.0-rc.7` means selecting Alpha 4.14. Changing DSH is a separate operation requiring the user's explicit request; a plugin update request does not authorize it. The repository's `pnpm --silent run check:compatibility` remains a strict development/release dependency gate, not a recommendation to change a user's host.
37
37
 
38
- The Alpha 4.37 recommendation follows successful exact-release main CI, 975 local tests, 32 Chromium tests, and a four-host same-artifact installation matrix with 40 fresh native-compaction lifecycle processes. Independent post-publication download verified that npm's archive is byte-identical to the tested artifact and the release workflow's verified package; the Git tag resolves to the exact release commit. These are synthetic-provider installation/lifecycle checks, not new real-account acceptance or a newly exercised published-package upgrade. See [.github/ALPHA_437_PUBLICATION.md](.github/ALPHA_437_PUBLICATION.md). Native context management remains opt-in. The preview-only DSH checkpoint-retry patch is not installed by this plugin, and stock DSH 0.1.6-alpha.2 remains undeclared.
38
+ The Alpha 4.38 recommendation follows successful exact-release main CI, 1012 local tests, 32 Chromium tests, and a four-host same-artifact installation matrix with 40 fresh native-compaction lifecycle processes. Independent post-publication download verified that npm's archive is byte-identical to the tested artifact and the release workflow's verified package; the Git tag resolves to the exact release commit. These are synthetic-provider installation/lifecycle checks, not new real-account acceptance or a newly exercised published-package upgrade. See [.github/ALPHA_438_PUBLICATION.md](.github/ALPHA_438_PUBLICATION.md). Native context management remains opt-in. The preview-only DSH checkpoint-retry patch is not installed by this plugin, and stock DSH 0.1.6-alpha.2 remains undeclared. A separate DSH 0.1.6-alpha.1 canary also passed with this artifact on macOS/Node 22.22.3; it does not broaden declared support or prove Windows/live-account recovery for #219.
39
39
 
40
40
  Historical Alpha 4.35 evidence (not relabeled as 4.37):
41
41
 
@@ -64,10 +64,10 @@ Alpha 4.33 omits the `modelErrors` profile field required by RC model packages,
64
64
  dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.23
65
65
  ```
66
66
 
67
- For DSH `0.1.2-rc.1`, `0.1.5-alpha.1`, `0.1.5-rc.1`, or `0.1.5-rc.2`, use Alpha 4.37:
67
+ For DSH `0.1.2-rc.1`, `0.1.5-alpha.1`, `0.1.5-rc.1`, or `0.1.5-rc.2`, use Alpha 4.38:
68
68
 
69
69
  ```sh
70
- dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.37
70
+ dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.38
71
71
  ```
72
72
 
73
73
  For DSH `0.1.2-alpha.5`, use Alpha 4.25:
@@ -76,7 +76,7 @@ Alpha 4.33 omits the `modelErrors` profile field required by RC model packages,
76
76
  dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.25
77
77
  ```
78
78
 
79
- If npm is unavailable after the matching GitHub prerelease is created, use `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.21'` only for the DSH `0.1.1-rc.2` combination, `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.23'` only for the DSH `0.1.2-alpha.2` combination, `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.25'` only for the DSH `0.1.2-alpha.5` combination, or `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.37'` only for the DSH `0.1.2-rc.1`, `0.1.5-alpha.1`, `0.1.5-rc.1`, or `0.1.5-rc.2` combinations.
79
+ If npm is unavailable after the matching GitHub prerelease is created, use `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.21'` only for the DSH `0.1.1-rc.2` combination, `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.23'` only for the DSH `0.1.2-alpha.2` combination, `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.25'` only for the DSH `0.1.2-alpha.5` combination, or `dsh plugin --profile web add 'github:franksong2702/dsh-codex-connect#v0.1.0-alpha.4.38'` only for the DSH `0.1.2-rc.1`, `0.1.5-alpha.1`, `0.1.5-rc.1`, or `0.1.5-rc.2` combinations.
80
80
 
81
81
  3. Run `dsh web --help` once to compose the installed profile without starting the server. DSH `0.1.2-rc.1` prepares profile plugin dependency fallback during this step.
82
82
  4. Run `dsh --profile web --dump-config` and require exactly one `llm-openai-codex` row loading `dsh-codex-connect`.
package/README.i18n.yaml CHANGED
@@ -2,5 +2,5 @@
2
2
  # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
3
  # after editing either side, bring the other along and re-record with:
4
4
  # git hash-object README.md docs/README.zh.md
5
- README.md: 59ddc56fb06a92c01d60d3d516095cc8cad5cd68
6
- docs/README.zh.md: c4784c0b2aece6af6f81f7944e12ec89f1631b46
5
+ README.md: 1b0dd174f9f6cd5cde9034ce0931cdd7b2fda5b8
6
+ docs/README.zh.md: 302b9f4e768307b51ab1a6740ba95ee87599c7e4
package/README.md CHANGED
@@ -16,17 +16,17 @@ This guide describes the published pairings below. Check `dsh --version` first a
16
16
 
17
17
  | Requirement | Verified pairing |
18
18
  |---|---|
19
- | Codex Connect | `0.1.0-alpha.4.37` |
19
+ | Codex Connect | `0.1.0-alpha.4.38` |
20
20
  | DeepSeek Harness | `0.1.2-rc.1`, `0.1.5-alpha.1`, `0.1.5-rc.1`, or `0.1.5-rc.2` |
21
21
  | Node.js | `^22.19.0 \|\| >=24.0.0` |
22
22
  | Account | ChatGPT OAuth with access to the requested Codex model; availability is decided by OpenAI |
23
23
 
24
- As of 2026-09-19, npm `alpha` points to 4.37 while `latest` intentionally remains on 4.34. Use the exact version below for 4.37; this recommendation does not promote the default installation channel.
24
+ As of 2026-09-20, npm `alpha` points to 4.38 while `latest` intentionally remains on 4.34. Use the exact version below for 4.38; this recommendation does not promote the default installation channel.
25
25
 
26
26
  ### 1. Install
27
27
 
28
28
  ```sh
29
- dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.37
29
+ dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.38
30
30
  dsh web
31
31
  ```
32
32
 
package/docs/README.zh.md CHANGED
@@ -16,17 +16,17 @@ Codex Connect 为标准 Harness agent loop 添加 `openai-codex` 模型提供方
16
16
 
17
17
  | 要求 | 已验证组合 |
18
18
  |---|---|
19
- | Codex Connect | `0.1.0-alpha.4.37` |
19
+ | Codex Connect | `0.1.0-alpha.4.38` |
20
20
  | DeepSeek Harness | `0.1.2-rc.1`、`0.1.5-alpha.1`、`0.1.5-rc.1` 或 `0.1.5-rc.2` |
21
21
  | Node.js | `^22.19.0 \|\| >=24.0.0` |
22
22
  | 账户 | 通过 ChatGPT OAuth 使用所请求的 Codex 模型;可用性由 OpenAI 决定 |
23
23
 
24
- 截至 2026-09-19,npm `alpha` 指向 4.37,`latest` 则有意保留在 4.34。安装 4.37 请使用下方精确版本命令;文档推荐更新不代表默认安装渠道已提升。
24
+ 截至 2026-09-20,npm `alpha` 指向 4.38,`latest` 则有意保留在 4.34。安装 4.38 请使用下方精确版本命令;文档推荐更新不代表默认安装渠道已提升。
25
25
 
26
26
  ### 1. 安装
27
27
 
28
28
  ```sh
29
- dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.37
29
+ dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.38
30
30
  dsh web
31
31
  ```
32
32
 
@@ -1,3 +1,31 @@
1
+ # Alpha 4.39 preparation checkpoint — 2026-09-21
2
+
3
+ Remote main is `6ce8a37ca7c28640a43b9189b767e4f6212cea7e`, the normal merge of #227. Published Alpha `0.1.0-alpha.4.38` remains the current public recommendation while 4.39 is prepared; `latest` remains separately managed at 4.34. #227 centralizes authenticated `chatgpt.com/backend-api` request governance across Model/pi-ai, Search, quota, image generation, Auto-review and native compaction. It preserves pi-ai's model identity, uses honest plugin identity on plugin-owned direct routes, adds per-attempt correlation, bounded admission, cancellation/deadline composition, proxy lifetime and server-directed lane cooldown. It does not establish the unverified risk-control hypothesis from #219.
4
+
5
+ The second review of #227 found and fixed response-lifetime/cancellation leaks, cooldown admission races, queued deadline gaps, Request-signal propagation and authenticated redirect risks before merge. All eight exact-head GitHub checks passed on the corrected head. The overlapping #226 is now closed as superseded and must not be revived independently.
6
+
7
+ ## Current Adaptive Runtime tracks
8
+
9
+ | Track | Current state | Next gate |
10
+ | --- | --- | --- |
11
+ | Remember #65 / #196 | Native compaction mechanism is merged, released and default-off; bounded real A/B and preview evidence exist. | Real-provider durable restart/fork/fault/accounting/long-task acceptance remains broader than current synthetic and bounded live controls. |
12
+ | Think #220 → #221 → #222 → #224 | Four stacked draft PRs cover replay isolation, native admission/cancellation, four-host lifecycle, saved default-off opt-in and native UI controls. #167 is now historical/conflicting. | Rebase/replay the stack onto current main after #227, then verify authenticated Session-page transport and human experience before considering merge. |
13
+ | Split #199 → #200 | Draft design plus bounded read-only worker; exact-host and Chromium/Gateway/Conversation synthetic acceptance are substantial. | Human usefulness, persistent permission/budget reconstruction, restart/resume and real-task value remain unaccepted. |
14
+
15
+ The umbrella remains #195. Think/Split are not included in Alpha 4.39. Do not infer composability merely because Remember is already on main.
16
+
17
+ ## Compatibility and open acceptance
18
+
19
+ Declared DSH hosts remain exactly `0.1.2-rc.1`, `0.1.5-alpha.1`, `0.1.5-rc.1`, and `0.1.5-rc.2`. #211 remains an upstream DSH 0.1.6-alpha.2 peer-resolution repair tracker; the proposed host-side repair was delivered to the upstream Discussion but is not a stock release. #207/#183 retain their separate broader acceptance scopes.
20
+
21
+ #219 remains open for the external reporter to confirm whether the original persistent overloaded condition recurs under comparable normal use. #215 remains primarily blocked on the reporter's missing local profile archive evidence. #194 waits for natural Luna Reserve eligibility rather than manufactured exhaustion. #208 remains an independent opt-in “new session Fast Mode default” enhancement.
22
+
23
+ Alpha 4.39 preparation is authorized through normal review/merge/OIDC publication. It must not change daily services, use live credentials/models, promote `latest`, or silently enable experimental defaults. Candidate verification and publication evidence belong in [.github/ALPHA_439_RELEASE_READINESS.md](../../.github/ALPHA_439_RELEASE_READINESS.md) and the eventual publication record.
24
+
25
+ The dated checkpoints below are historical and retain their original scope.
26
+
27
+ ---
28
+
1
29
  # Alpha 4.37 published checkpoint — 2026-09-19
2
30
 
3
31
  Alpha `0.1.0-alpha.4.37` was published from `5cbd0d330d12c81f0bf37515b65bc799e480aa78` through successful workflow `35439115133`. The npm archive equals the final tested artifact; the Git tag and published GitHub prerelease match the release commit. `alpha` is 4.37; `latest` remains 4.34. See [publication verification](../../.github/ALPHA_437_PUBLICATION.md). No service or default changed, and no new live-model request was made. The local DSH repair, Think and Split are not included.
package/docs/design.md CHANGED
@@ -18,6 +18,14 @@ The settings routes and CLI reuse the existing OAuth path and route names for mi
18
18
 
19
19
  Browser account and update requests have a 45-second deadline covering response headers and JSON bodies. A timed-out account mutation is not retried automatically: while the account view is observed, the browser reads server state again because the mutation may already have committed. Failed state reads retry after five seconds, including when no account is stored. Plugin disposal aborts browser waits without logging out the server account.
20
20
 
21
+ ## Backend request governance
22
+
23
+ Authenticated runtime traffic to `https://chatgpt.com/backend-api/` passes through one plugin-owned request governor before network dispatch. The governor fail-closes on any other origin/path, composes caller and route deadlines, keeps the existing Codex-only proxy scope alive for the complete logical direct request or provider stream, assigns a fresh `x-client-request-id` to every HTTP attempt, and bounds one plugin instance to eight concurrent backend requests. Concurrency is counted per HTTP attempt, not during authentication; even parallel fetches within one logical operation share that limit. Requests queued behind that limit remain cancellable and within route deadlines. Cancelling unread/paused bodies, response-hook failures and scope disposal releases resources; scope disposal runs before other plugin teardown waits. URL/header inputs are snapshotted before queue waits and authenticated requests never automatically follow redirects. HTTP `429` or `503` responses with a valid `Retry-After` create a lane-local cooldown that is rechecked on admission, never occupies a network slot while waiting, and honors longer service delays using timer slices of at most 15 minutes; the governor does not invent an account-block verdict or replay a failed model turn. Route-specific protocol retries remain with their existing owners, such as pi-ai model retry semantics and native-compaction's bounded retry loop.
24
+
25
+ Direct plugin routes use the honest shared identity `originator: deepseek-harness` and `User-Agent: dsh-codex-connect`; Search, quota, image generation, Auto-review, and native compaction all use that policy. The pi-ai model route deliberately preserves pi-ai's provider identity rather than impersonating Codex CLI/Desktop, while still receiving the same attempt id, concurrency, proxy, cancellation, server-directed cooldown, and bounded HTTP diagnostic metadata. Native compaction travels through the provider fetch seam at runtime and therefore shares the model governor lane while retaining the direct-plugin identity on its own request. This split is explicit policy, not a claim about undocumented upstream risk controls.
26
+
27
+ Standalone capability/Auto-review probes reuse the same pure URL/header policy but keep their isolated one-shot dispatcher and deadline instead of depending on a running plugin governor. The proxy reachability probe is also a bootstrap exception because it tests the proxy primitive used by the governor itself. OAuth authorization/refresh and credential-free public image fetching are outside `backend-api` and keep their separate security boundaries. Browser calls to this plugin's own local HTTP routes are likewise not upstream backend traffic.
28
+
21
29
  ## Search and images
22
30
 
23
31
  When `enableSearch: true`, the plugin registers its standalone search provider. It does not append a plugin-owned required-on-read Session event because an external package cannot guarantee that its `@deepseek-ai/dsh-session` module instance owns the Host persistence vocabulary; the standard web Tool call and result remain in the Session log. DSH `0.1.2-rc.1` does not expose the WebRuntime provider selection through its settings service, so the compatibility adapter verifies that release's runtime field, records the previous provider, and selects Codex only while the capability is active. Disable and disposal restore the recorded provider unless another owner has selected a newer route. An unsupported runtime fails activation instead of reporting a route change that did not occur. Search responses are mapped to Harness text and citation records.
@@ -0,0 +1,34 @@
1
+ # Alpha 4.38 — persistent-error diagnostics and quota traffic
2
+
3
+ ## English
4
+
5
+ This release addresses confirmed client-side defects from #219, not a proven account-block cause or verified recovery of the reporter's 23-hour condition.
6
+
7
+ - Preserve bounded HTTP/SSE error code/type and request IDs through the model adapter, with a unique client ID per HTTP attempt. Append diagnostics after Harness classification; leave model retries and client identity unchanged. No raw payload, token or account ID is added to the diagnostic suffix.
8
+ - Pause quota polling in hidden pages; share and coalesce ordinary quota reads even when Reserve is disabled. Apply increasing failure backoff, valid server Retry-After hints, and credential-bound rejection state. Reserve background polling stops after two minutes without foreground demand.
9
+ - Fix expiry timers cancelling fresh requests and prevent unread later SSE errors from being attributed to earlier malformed/oversized/terminal frames.
10
+
11
+ Validated with 1012 local tests, 32 Chromium UI tests, both Node CI targets and a four-host identical-artifact installation matrix. A separate DSH 0.1.6-alpha.1 synthetic canary passed on macOS / Node 22.22.3; that is not full declared support or Windows/live-account acceptance.
12
+
13
+ For the four declared DSH versions (0.1.2-rc.1, 0.1.5-alpha.1, 0.1.5-rc.1, 0.1.5-rc.2), pin the exact plugin version after checking the installed host:
14
+
15
+ ~~~sh
16
+ dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.38
17
+ dsh plugin --profile web exec dsh-codex-connect doctor --json
18
+ ~~~
19
+
20
+ Keep your current profile name and host version. npm alpha now points to 4.38; latest intentionally remains 4.34. No automatic OAuth, account rotation, first-party impersonation or service restart is part of this release.
21
+
22
+ npm processing delayed public availability beyond the original workflow's readback window. The recovery-only workflow completed the missing GitHub prerelease after exact archive verification; npm was not republished. The released tag and package identify commit `40dae54cac2561eb153cb217353a0b7345a43b8d`.
23
+
24
+ #219 remains open pending comparable normal-use verification or service-side evidence. If the failure recurs, retain the timestamp and bounded error fields; share request IDs privately with the service operator, never tokens or complete session archives.
25
+
26
+ ## 中文
27
+
28
+ 本版修复 #219 中已确认的客户端诊断与额度查询缺陷,不把 overloaded 文案当作封号证据,也不声称已验证原始持续故障恢复。
29
+
30
+ 错误信息现在保留有界的 HTTP/SSE 错误码、类型和请求标识;每次 HTTP 尝试具有独立标识,且在 Harness 完成分类后追加诊断,避免误分类。不会在新增诊断中保存 token、账户 ID 或完整响应正文,也不修改客户端身份或增加模型请求重试。
31
+
32
+ 隐藏页面暂停额度轮询,普通查询也共享缓存并合并并发请求;失败逐步退避并遵守 Retry-After。Reserve 在两分钟无人读取后停止后台查询。同时修复旧定时器误取消新请求、错误归因到未读取的后续 SSE 帧两处回归。
33
+
34
+ 完整测试、浏览器测试、Node CI 和四个声明支持的 DSH 安装组合均通过。报告者所用 DSH 0.1.6-alpha.1 的额外模拟检查也通过,但不等于 Windows 实机或真实账户验收。请保留现有 DSH 和 profile,使用上方精确版本命令;本版不自动登录、切换账户或重启服务。#219 仍等待报告者确认同类正常使用下是否恢复。
@@ -0,0 +1,36 @@
1
+ # Alpha 4.39 — unified Codex backend request governance
2
+
3
+ ## English
4
+
5
+ Alpha 4.39 delivers the backend-request architecture follow-up from #219 and merged PR #227. It centralizes authenticated `chatgpt.com/backend-api` traffic behind one plugin-owned governance layer without claiming that the reporter's persistent upstream condition was caused by request identity or traffic shape.
6
+
7
+ - Model/pi-ai, Search, quota, image generation, Auto-review, and native compaction now share request admission, cancellation/deadline composition, Codex-only proxy scope, per-attempt request correlation, and bounded response metadata.
8
+ - Direct plugin routes use the existing honest plugin identity; the model route preserves pi-ai's provider identity. The plugin does not impersonate Codex CLI/Desktop or invent undocumented first-party headers.
9
+ - Authenticated backend requests fail closed outside `https://chatgpt.com/backend-api/`, reject credential-bearing URLs, and do not automatically follow redirects.
10
+ - One plugin instance admits at most eight simultaneously open backend responses. Queue waits remain cancellable, cooldown waits do not consume a slot, and an already queued request rechecks cooldown before dispatch.
11
+ - HTTP 429/503 with valid Retry-After creates lane-local server-directed cooldown. The client does not infer an account block, truncate a longer service-directed deadline, or automatically replay failed model turns.
12
+ - Follow-up review hardened stream cancellation/body cleanup, queued deadlines, Request-signal propagation, redirect protection, and response cleanup when hooks fail.
13
+
14
+ Existing route-specific semantics remain in place: pi-ai owns ordinary model/SSE retries, quota keeps its credential-bound cache/backoff, native compaction keeps its bounded retry loop, and Search/Image/Auto-review do not gain automatic replay.
15
+
16
+ For a declared compatible DSH host, pin the exact version after checking the installed host:
17
+
18
+ ~~~sh
19
+ dsh plugin --profile web add dsh-codex-connect@0.1.0-alpha.4.39
20
+ dsh plugin --profile web exec dsh-codex-connect doctor --json
21
+ ~~~
22
+
23
+ All optional capabilities remain disabled by default. This release does not close #219 or establish undocumented OpenAI risk-control behavior. It does not change OAuth credentials, daily services, or the separately managed `latest` npm channel.
24
+
25
+ ## 中文
26
+
27
+ Alpha 4.39 交付 #219 暴露出的后续架构工作以及已合并的 #227:把经过认证的 `chatgpt.com/backend-api` 流量统一收敛到插件内部的一层请求治理中,但不把“请求身份/流量形态触发了上游风控”当作已经证实的因果关系。
28
+
29
+ - Model/pi-ai、Search、额度、图片生成、Auto-review 和 Native Compaction 共享请求准入、取消/超时组合、Codex 专用代理作用域、每次 HTTP 尝试的 request ID 与有界响应诊断。
30
+ - 插件直连路径使用一致且诚实的插件身份;模型路径继续保留 pi-ai 自己的 provider 身份,不伪装 Codex CLI/Desktop。
31
+ - 携带认证的请求只允许发送到 `https://chatgpt.com/backend-api/`,拒绝 URL 中嵌入凭据,也不会自动跟随重定向。
32
+ - 单个插件实例最多同时持有 8 个开放的后端响应;排队和冷却等待可以取消,冷却不占并发槽位,排队完成后会再次检查是否仍需冷却。
33
+ - 只有 HTTP 429/503 且服务端提供有效 Retry-After 时才建立对应 lane 的冷却;不会据此推断“账户被封”,不会缩短服务端要求的更长等待,也不会自动重放失败的模型请求。
34
+ - 合并前二次 review 进一步修复了流取消/响应体清理、排队超时、Request signal 传递、重定向保护以及诊断 hook 失败后的资源释放。
35
+
36
+ 原有各路径的协议语义保持不变;所有可选能力仍默认关闭。这个版本不代表 #219 原始持续故障已经由报告者确认恢复,也不会修改 OAuth 凭据、日常服务或单独维护的 npm `latest` 渠道。
package/lib/bin.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { A as DSH_PLUGIN_API_PACKAGES, B as isSupportedDshPluginApiVersion, Ft as loginOpenAICodex, Gt as openAICodexAuthPath, It as logoutOpenAICodex, Lt as openAICodexAuthStatus, Pt as openAICodexModelCatalog, Rt as publicAuthError, Ut as OPENAI_CODEX_PROVIDER, V as readInstalledPackageVersion, Wt as OpenAICodexCredentialStore, c as migrateOpenAICodexSearchHistory, d as OPENAI_CODEX_BASE_URL, jt as normalizeOpenAICodexProxyUrl, l as CODEX_AUTO_REVIEW_MODEL, nt as OpenAICodexTrustedOriginsStore, rt as normalizeTrustedOrigin, u as probeCodexAutoReview, x as CODEX_CONNECT_VERSION, y as diagnoseOpenAICodex, z as evaluateCompatibility } from "./src-hB8Ph2Et.js";
2
+ import { A as DSH_PLUGIN_API_PACKAGES, B as isSupportedDshPluginApiVersion, Ft as prepareOpenAICodexBackendHeaders, Gt as OpenAICodexCredentialStore, It as loginOpenAICodex, Kt as openAICodexAuthPath, Lt as logoutOpenAICodex, Pt as openAICodexModelCatalog, Rt as openAICodexAuthStatus, V as readInstalledPackageVersion, Wt as OPENAI_CODEX_PROVIDER, c as migrateOpenAICodexSearchHistory, d as OPENAI_CODEX_BASE_URL, jt as normalizeOpenAICodexProxyUrl, l as CODEX_AUTO_REVIEW_MODEL, nt as OpenAICodexTrustedOriginsStore, rt as normalizeTrustedOrigin, u as probeCodexAutoReview, x as CODEX_CONNECT_VERSION, y as diagnoseOpenAICodex, z as evaluateCompatibility, zt as publicAuthError } from "./src-lkjrFR_5.js";
3
3
  import { i as fetch, r as ProxyAgent, t as Agent } from "./undici-runtime-H2uktiw6.js";
4
4
  import { createHash } from "node:crypto";
5
5
  import { realpathSync } from "node:fs";
@@ -55,18 +55,22 @@ async function probeCodexResponses(request, createDispatcher = (proxyUrl) => pro
55
55
  const timer = setTimeout(() => controller.abort(), request.timeoutMs);
56
56
  let httpStatus;
57
57
  try {
58
+ const { headers } = prepareOpenAICodexBackendHeaders({
59
+ authorization: `Bearer ${request.access}`,
60
+ "chatgpt-account-id": request.accountId,
61
+ "content-type": "application/json",
62
+ accept: "text/event-stream"
63
+ }, "plugin");
64
+ const requestHeaders = {};
65
+ headers.forEach((value, key) => {
66
+ requestHeaders[key] = value;
67
+ });
58
68
  const response = await fetch(`${OPENAI_CODEX_BASE_URL}/responses`, {
59
69
  dispatcher,
60
70
  method: "POST",
61
71
  redirect: "manual",
62
72
  signal: controller.signal,
63
- headers: {
64
- authorization: `Bearer ${request.access}`,
65
- "chatgpt-account-id": request.accountId,
66
- "content-type": "application/json",
67
- accept: "text/event-stream",
68
- originator: "deepseek-harness"
69
- },
73
+ headers: requestHeaders,
70
74
  body: JSON.stringify({
71
75
  model: request.model,
72
76
  instructions: "You are a connectivity diagnostic. Reply with only ok.",
package/lib/client.js CHANGED
@@ -6543,7 +6543,7 @@ window.__ModuleLoader__.load({
6543
6543
  }
6544
6544
  //#endregion
6545
6545
  //#region src/version.ts
6546
- const CODEX_CONNECT_VERSION = "0.1.0-alpha.4.38";
6546
+ const CODEX_CONNECT_VERSION = "0.1.0-alpha.4.39";
6547
6547
  //#endregion
6548
6548
  //#region src/client/OpenAICodexModelsCard.tsx
6549
6549
  /** Compact Models account entry with quota disclosure and shared configuration. */
package/lib/index.d.ts CHANGED
@@ -131,6 +131,65 @@ export declare class OpenAICodexProxyManager {
131
131
  /** Probe the bounded automatic candidate set in parallel. */
132
132
  export declare function detectOpenAICodexProxies(manager: OpenAICodexProxyManager): Promise<readonly OpenAICodexProxyProbeResult[]>;
133
133
  //#endregion
134
+ //#region src/backend-request-policy.d.ts
135
+ type OpenAICodexBackendIdentity = 'plugin' | 'preserve' | 'probe';
136
+ interface OpenAICodexBackendResponseMeta {
137
+ readonly clientRequestId: string;
138
+ readonly httpStatus: number;
139
+ readonly httpRequestId?: string;
140
+ readonly retryAfterMs?: number;
141
+ }
142
+ //#endregion
143
+ //#region src/backend-request.d.ts
144
+ type OpenAICodexBackendLane = 'model' | 'search' | 'quota' | 'image' | 'auto-review';
145
+ type BackendFetch = typeof globalThis.fetch;
146
+ interface OpenAICodexBackendRunOptions {
147
+ readonly lane: OpenAICodexBackendLane;
148
+ readonly signal?: AbortSignal | undefined;
149
+ readonly timeoutMs?: number | undefined;
150
+ }
151
+ interface OpenAICodexBackendFetchOptions {
152
+ readonly lane: OpenAICodexBackendLane;
153
+ readonly identity?: OpenAICodexBackendIdentity;
154
+ readonly fetch?: BackendFetch;
155
+ readonly onAttempt?: (meta: Pick<OpenAICodexBackendResponseMeta, 'clientRequestId'>) => void;
156
+ readonly onResponse?: (meta: OpenAICodexBackendResponseMeta) => void | Promise<void>;
157
+ }
158
+ interface OpenAICodexBackendRunContext {
159
+ readonly signal: AbortSignal;
160
+ fetch(input: string | URL | Request, init?: RequestInit, options?: Omit<OpenAICodexBackendFetchOptions, 'lane'>): Promise<Response>;
161
+ }
162
+ /** One plugin instance owns one governor; it never guesses account-level service policy. */
163
+ declare class OpenAICodexBackendRequests {
164
+ private readonly proxyManager?;
165
+ private readonly resolveProxyUrl;
166
+ private readonly maxConcurrent;
167
+ private active;
168
+ private readonly waiters;
169
+ private readonly cooldowns;
170
+ private readonly lifecycle;
171
+ private disposed;
172
+ constructor(proxyManager?: OpenAICodexProxyManager | undefined, resolveProxyUrl?: () => string | undefined, maxConcurrent?: number);
173
+ private combinedSignal;
174
+ private drain;
175
+ private release;
176
+ private acquire;
177
+ private beforeRequest;
178
+ private admit;
179
+ private recordResponse;
180
+ private fetchAttempt;
181
+ /** Own one logical deadline/proxy scope; each HTTP attempt acquires its own slot. */
182
+ run<T>(options: OpenAICodexBackendRunOptions, operation: (context: OpenAICodexBackendRunContext) => Promise<T>): Promise<T>;
183
+ /** Wrap provider-owned fetch while preserving provider identity and stream proxy lifetime. */
184
+ wrapFetch(options: OpenAICodexBackendFetchOptions): BackendFetch;
185
+ /** Keep the existing proxy lease for the complete provider stream. */
186
+ runStream<T extends {
187
+ result(): Promise<unknown>;
188
+ }>(operation: () => T): T;
189
+ /** Abort queued/in-flight managed requests and prevent new admission. */
190
+ dispose(): void;
191
+ }
192
+ //#endregion
134
193
  //#region src/transport.d.ts
135
194
  /** Cordis service name owned by the core plugin fiber. */
136
195
  export declare const OPENAI_CODEX_TRANSPORT_SERVICE = "openaiCodexTransport";
@@ -208,8 +267,9 @@ export declare class OpenAICodexTransport extends Service implements OpenAICodex
208
267
  private readonly proxyManager?;
209
268
  private readonly resolveProxyUrl;
210
269
  private readonly resolveImageModelHint;
270
+ private readonly backendRequests?;
211
271
  readonly apiVersion: 1;
212
- constructor(ctx: Context, credentials: OpenAICodexCredentialStore, proxyManager?: OpenAICodexProxyManager | undefined, resolveProxyUrl?: () => string | undefined, resolveImageModelHint?: () => string);
272
+ constructor(ctx: Context, credentials: OpenAICodexCredentialStore, proxyManager?: OpenAICodexProxyManager | undefined, resolveProxyUrl?: () => string | undefined, resolveImageModelHint?: () => string, backendRequests?: OpenAICodexBackendRequests | undefined);
213
273
  generateImages(input: ImageGenerationRequest, context: ImageRequestContext): Promise<ImageGenerationResponse>;
214
274
  private generateImagesWithoutProxy;
215
275
  }
@@ -528,6 +588,8 @@ interface OpenAICodexSearchProviderOptions {
528
588
  readonly proxyManager?: OpenAICodexProxyManager;
529
589
  /** Resolve the active proxy for each search request. */
530
590
  readonly resolveProxyUrl?: () => string | undefined;
591
+ /** Shared runtime request governor; preferred over the legacy proxy-only path. */
592
+ readonly backendRequests?: OpenAICodexBackendRequests;
531
593
  /** Record the exact secret-free request before dispatch. */
532
594
  readonly recordRequest?: (request: OpenAICodexSearchRequestRecord) => void;
533
595
  }
package/lib/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import { $ as OPENAI_CODEX_FAST_MODE_MAX_SESSIONS, A as DSH_PLUGIN_API_PACKAGES, At as isValidOpenAICodexProxyUrl, Bt as OPENAI_CODEX_AUTH_DOCUMENT_LIMIT, C as checkForOpenAICodexUpdate, Ct as DEFAULT_OPENAI_CODEX_SEARCH_MODE, D as COMPATIBILITY_CONTRACT, Dt as decodeOpenAICodexSettings, E as parseOpenAICodexVersion, Et as OPENAI_CODEX_SETTINGS_NAMESPACE, F as SUPPORTED_NODE_RANGE, Ft as loginOpenAICodex, G as OPENAI_CODEX_PROXY_CANDIDATE_LIMIT, Gt as openAICodexAuthPath, H as OPENAI_CODEX_PROXY_DETECT_PATH, Ht as OPENAI_CODEX_AUTH_V1_BACKUP_SUFFIX, I as SUPPORTED_PI_AI_RANGE, It as logoutOpenAICodex, J as OpenAICodexProxyManager, K as OPENAI_CODEX_PROXY_PROBE_TIMEOUT_MS, L as assessCompatibility, Lt as openAICodexAuthStatus, M as SUPPORTED_DSH_PLUGIN_API_RANGE, Mt as resolveOpenAICodexProxyUrl, N as SUPPORTED_DSH_PLUGIN_API_VERSION, Nt as resolveOpenAICodexSettings, O as COMPATIBILITY_PACKAGES, Ot as isValidOpenAICodexContextWindowOverrides, P as SUPPORTED_DSH_PLUGIN_API_VERSIONS, Q as FastModeRegistry, R as detectCompatibility, S as OPENAI_CODEX_UPDATE_PATH, St as DEFAULT_OPENAI_CODEX_SEARCH_MAX_OUTPUT_TOKENS, T as parseOpenAICodexUpdateResult, Tt as DEFAULT_OPENAI_CODEX_SETTINGS, U as OPENAI_CODEX_PROXY_TEST_PATH, Ut as OPENAI_CODEX_PROVIDER, Vt as OPENAI_CODEX_AUTH_FILENAME, W as OPENAI_CODEX_LOCAL_PROXY_CANDIDATES, Wt as OpenAICodexCredentialStore, X as listOpenAICodexProxyCandidates, Y as detectOpenAICodexProxies, Z as OPENAI_CODEX_FAST_MODE_PATH, _ as IMAGE_GENERATE_TOOL_NAME, _t as OpenAICodexTransportError, a as name, at as parseOpenAICodexUsage, b as openAICodexConflictMessage, bt as DEFAULT_OPENAI_CODEX_PROXY_URL, c as migrateOpenAICodexSearchHistory, ct as OPENAI_CODEX_IMAGE_MAX_COUNT, d as OPENAI_CODEX_BASE_URL, dt as OPENAI_CODEX_IMAGE_PROMPT_MAX_LENGTH, et as OPENAI_CODEX_FAST_MODE_MAX_SESSION_ID_LENGTH, f as OPENAI_CODEX_SEARCH_PROVIDER, ft as OPENAI_CODEX_IMAGE_REQUEST_TIMEOUT_MS, g as VIEW_IMAGE_TOOL_NAME, gt as OpenAICodexTransport, h as mapOpenAICodexSearchResponse, ht as OPENAI_CODEX_TRANSPORT_SERVICE, i as inject, it as OPENAI_CODEX_USAGE_URL, j as PI_AI_PACKAGE, k as COMPATIBILITY_SCHEMA_VERSION, kt as isValidOpenAICodexImageModelHint, lt as OPENAI_CODEX_IMAGE_MAX_ERROR_BYTES, m as OpenAICodexSearchProvider, mt as OPENAI_CODEX_TRANSPORT_ERROR_CODES, n as OPENAI_CODEX_SETTINGS_NS, o as OPENAI_CODEX_HISTORY_BACKUP_SUFFIX, ot as readOpenAICodexRateLimits, p as OPENAI_CODEX_SEARCH_URL, pt as OPENAI_CODEX_TRANSPORT_API_VERSION, q as OPENAI_CODEX_PROXY_PROBE_URL, r as apply, s as OPENAI_CODEX_SEARCH_MODEL_REQUEST_EVENT, st as OPENAI_CODEX_IMAGE_GENERATION_URL, t as Config, tt as isFastModeSessionId, ut as OPENAI_CODEX_IMAGE_MAX_RESPONSE_BYTES, v as assertNoOpenAICodexProviderConflict, vt as isOpenAICodexTransportError, w as compareOpenAICodexVersions, wt as DEFAULT_OPENAI_CODEX_SEARCH_MODEL, xt as DEFAULT_OPENAI_CODEX_SEARCH_CONTEXT_SIZE, y as diagnoseOpenAICodex, yt as DEFAULT_OPENAI_CODEX_IMAGE_MODEL_HINT, z as evaluateCompatibility, zt as OPENAI_CODEX_ACCOUNT_LIMIT } from "./src-hB8Ph2Et.js";
1
+ import { $ as OPENAI_CODEX_FAST_MODE_MAX_SESSIONS, A as DSH_PLUGIN_API_PACKAGES, At as isValidOpenAICodexProxyUrl, Bt as OPENAI_CODEX_ACCOUNT_LIMIT, C as checkForOpenAICodexUpdate, Ct as DEFAULT_OPENAI_CODEX_SEARCH_MODE, D as COMPATIBILITY_CONTRACT, Dt as decodeOpenAICodexSettings, E as parseOpenAICodexVersion, Et as OPENAI_CODEX_SETTINGS_NAMESPACE, F as SUPPORTED_NODE_RANGE, G as OPENAI_CODEX_PROXY_CANDIDATE_LIMIT, Gt as OpenAICodexCredentialStore, H as OPENAI_CODEX_PROXY_DETECT_PATH, Ht as OPENAI_CODEX_AUTH_FILENAME, I as SUPPORTED_PI_AI_RANGE, It as loginOpenAICodex, J as OpenAICodexProxyManager, K as OPENAI_CODEX_PROXY_PROBE_TIMEOUT_MS, Kt as openAICodexAuthPath, L as assessCompatibility, Lt as logoutOpenAICodex, M as SUPPORTED_DSH_PLUGIN_API_RANGE, Mt as resolveOpenAICodexProxyUrl, N as SUPPORTED_DSH_PLUGIN_API_VERSION, Nt as resolveOpenAICodexSettings, O as COMPATIBILITY_PACKAGES, Ot as isValidOpenAICodexContextWindowOverrides, P as SUPPORTED_DSH_PLUGIN_API_VERSIONS, Q as FastModeRegistry, R as detectCompatibility, Rt as openAICodexAuthStatus, S as OPENAI_CODEX_UPDATE_PATH, St as DEFAULT_OPENAI_CODEX_SEARCH_MAX_OUTPUT_TOKENS, T as parseOpenAICodexUpdateResult, Tt as DEFAULT_OPENAI_CODEX_SETTINGS, U as OPENAI_CODEX_PROXY_TEST_PATH, Ut as OPENAI_CODEX_AUTH_V1_BACKUP_SUFFIX, Vt as OPENAI_CODEX_AUTH_DOCUMENT_LIMIT, W as OPENAI_CODEX_LOCAL_PROXY_CANDIDATES, Wt as OPENAI_CODEX_PROVIDER, X as listOpenAICodexProxyCandidates, Y as detectOpenAICodexProxies, Z as OPENAI_CODEX_FAST_MODE_PATH, _ as IMAGE_GENERATE_TOOL_NAME, _t as OpenAICodexTransportError, a as name, at as parseOpenAICodexUsage, b as openAICodexConflictMessage, bt as DEFAULT_OPENAI_CODEX_PROXY_URL, c as migrateOpenAICodexSearchHistory, ct as OPENAI_CODEX_IMAGE_MAX_COUNT, d as OPENAI_CODEX_BASE_URL, dt as OPENAI_CODEX_IMAGE_PROMPT_MAX_LENGTH, et as OPENAI_CODEX_FAST_MODE_MAX_SESSION_ID_LENGTH, f as OPENAI_CODEX_SEARCH_PROVIDER, ft as OPENAI_CODEX_IMAGE_REQUEST_TIMEOUT_MS, g as VIEW_IMAGE_TOOL_NAME, gt as OpenAICodexTransport, h as mapOpenAICodexSearchResponse, ht as OPENAI_CODEX_TRANSPORT_SERVICE, i as inject, it as OPENAI_CODEX_USAGE_URL, j as PI_AI_PACKAGE, k as COMPATIBILITY_SCHEMA_VERSION, kt as isValidOpenAICodexImageModelHint, lt as OPENAI_CODEX_IMAGE_MAX_ERROR_BYTES, m as OpenAICodexSearchProvider, mt as OPENAI_CODEX_TRANSPORT_ERROR_CODES, n as OPENAI_CODEX_SETTINGS_NS, o as OPENAI_CODEX_HISTORY_BACKUP_SUFFIX, ot as readOpenAICodexRateLimits, p as OPENAI_CODEX_SEARCH_URL, pt as OPENAI_CODEX_TRANSPORT_API_VERSION, q as OPENAI_CODEX_PROXY_PROBE_URL, r as apply, s as OPENAI_CODEX_SEARCH_MODEL_REQUEST_EVENT, st as OPENAI_CODEX_IMAGE_GENERATION_URL, t as Config, tt as isFastModeSessionId, ut as OPENAI_CODEX_IMAGE_MAX_RESPONSE_BYTES, v as assertNoOpenAICodexProviderConflict, vt as isOpenAICodexTransportError, w as compareOpenAICodexVersions, wt as DEFAULT_OPENAI_CODEX_SEARCH_MODEL, xt as DEFAULT_OPENAI_CODEX_SEARCH_CONTEXT_SIZE, y as diagnoseOpenAICodex, yt as DEFAULT_OPENAI_CODEX_IMAGE_MODEL_HINT, z as evaluateCompatibility } from "./src-lkjrFR_5.js";
2
2
  export { COMPATIBILITY_CONTRACT, COMPATIBILITY_PACKAGES, COMPATIBILITY_SCHEMA_VERSION, Config, DEFAULT_OPENAI_CODEX_IMAGE_MODEL_HINT, DEFAULT_OPENAI_CODEX_PROXY_URL, DEFAULT_OPENAI_CODEX_SEARCH_CONTEXT_SIZE, DEFAULT_OPENAI_CODEX_SEARCH_MAX_OUTPUT_TOKENS, DEFAULT_OPENAI_CODEX_SEARCH_MODE, DEFAULT_OPENAI_CODEX_SEARCH_MODEL, DEFAULT_OPENAI_CODEX_SETTINGS, DSH_PLUGIN_API_PACKAGES, FastModeRegistry, FastModeRegistry as OpenAICodexFastModeRegistry, IMAGE_GENERATE_TOOL_NAME, OPENAI_CODEX_ACCOUNT_LIMIT, OPENAI_CODEX_AUTH_DOCUMENT_LIMIT, OPENAI_CODEX_AUTH_FILENAME, OPENAI_CODEX_AUTH_V1_BACKUP_SUFFIX, OPENAI_CODEX_BASE_URL, OPENAI_CODEX_FAST_MODE_MAX_SESSIONS, OPENAI_CODEX_FAST_MODE_MAX_SESSION_ID_LENGTH, OPENAI_CODEX_FAST_MODE_PATH, OPENAI_CODEX_HISTORY_BACKUP_SUFFIX, OPENAI_CODEX_IMAGE_GENERATION_URL, OPENAI_CODEX_IMAGE_MAX_COUNT, OPENAI_CODEX_IMAGE_MAX_ERROR_BYTES, OPENAI_CODEX_IMAGE_MAX_RESPONSE_BYTES, OPENAI_CODEX_IMAGE_PROMPT_MAX_LENGTH, OPENAI_CODEX_IMAGE_REQUEST_TIMEOUT_MS, OPENAI_CODEX_LOCAL_PROXY_CANDIDATES, OPENAI_CODEX_PROVIDER, OPENAI_CODEX_PROXY_CANDIDATE_LIMIT, OPENAI_CODEX_PROXY_DETECT_PATH, OPENAI_CODEX_PROXY_PROBE_TIMEOUT_MS, OPENAI_CODEX_PROXY_PROBE_URL, OPENAI_CODEX_PROXY_TEST_PATH, OPENAI_CODEX_SEARCH_MODEL_REQUEST_EVENT, OPENAI_CODEX_SEARCH_PROVIDER, OPENAI_CODEX_SEARCH_URL, OPENAI_CODEX_SETTINGS_NAMESPACE, OPENAI_CODEX_SETTINGS_NS, OPENAI_CODEX_TRANSPORT_API_VERSION, OPENAI_CODEX_TRANSPORT_ERROR_CODES, OPENAI_CODEX_TRANSPORT_SERVICE, OPENAI_CODEX_UPDATE_PATH, OPENAI_CODEX_USAGE_URL, OpenAICodexCredentialStore, OpenAICodexProxyManager, OpenAICodexSearchProvider, OpenAICodexTransport, OpenAICodexTransportError, PI_AI_PACKAGE, SUPPORTED_DSH_PLUGIN_API_RANGE, SUPPORTED_DSH_PLUGIN_API_VERSION, SUPPORTED_DSH_PLUGIN_API_VERSIONS, SUPPORTED_NODE_RANGE, SUPPORTED_PI_AI_RANGE, VIEW_IMAGE_TOOL_NAME, apply, assertNoOpenAICodexProviderConflict, assessCompatibility, checkForOpenAICodexUpdate, compareOpenAICodexVersions, decodeOpenAICodexSettings, detectCompatibility, detectOpenAICodexProxies, diagnoseOpenAICodex, evaluateCompatibility, inject, isFastModeSessionId, isOpenAICodexTransportError, isValidOpenAICodexContextWindowOverrides, isValidOpenAICodexImageModelHint, isValidOpenAICodexProxyUrl, listOpenAICodexProxyCandidates, loginOpenAICodex, logoutOpenAICodex, mapOpenAICodexSearchResponse, migrateOpenAICodexSearchHistory, name, openAICodexAuthPath, openAICodexAuthStatus, openAICodexConflictMessage, parseOpenAICodexUpdateResult, parseOpenAICodexUsage, parseOpenAICodexVersion, readOpenAICodexRateLimits, resolveOpenAICodexProxyUrl, resolveOpenAICodexSettings };