dsh-codex-subscription 2.6.4 → 2.6.5
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/README.en.md +5 -5
- package/README.md +5 -5
- package/lib/client.js +1 -1
- package/lib/index.js +35 -5
- package/package.json +1 -1
package/README.en.md
CHANGED
|
@@ -106,7 +106,7 @@ This plugin supports the latest DeepSeek Harness release recorded in its package
|
|
|
106
106
|
2. Paste this package name, with its version, into the **Package name or address** field:
|
|
107
107
|
|
|
108
108
|
```text
|
|
109
|
-
dsh-codex-subscription@2.6.
|
|
109
|
+
dsh-codex-subscription@2.6.5
|
|
110
110
|
```
|
|
111
111
|
|
|
112
112
|
3. Click **Install** and wait for completion. Follow the page instructions; save your work before restarting if requested.
|
|
@@ -118,7 +118,7 @@ Why the version is included: DSH's plugin page only installs versions that are a
|
|
|
118
118
|
<summary>Terminal installation (with an existing dsh command)</summary>
|
|
119
119
|
|
|
120
120
|
```sh
|
|
121
|
-
dsh plugin --profile web add dsh-codex-subscription@2.6.
|
|
121
|
+
dsh plugin --profile web add dsh-codex-subscription@2.6.5
|
|
122
122
|
```
|
|
123
123
|
|
|
124
124
|
Follow the restart instructions, then sign in under **Settings → Codex**. Both the Plugins page and the terminal use DSH's installation management.
|
|
@@ -131,7 +131,7 @@ Follow the restart instructions, then sign in under **Settings → Codex**. Both
|
|
|
131
131
|
After signing in and selecting a Codex model in Web, install the same plugin in the Headless profile:
|
|
132
132
|
|
|
133
133
|
```sh
|
|
134
|
-
dsh plugin --profile headless add dsh-codex-subscription@2.6.
|
|
134
|
+
dsh plugin --profile headless add dsh-codex-subscription@2.6.5
|
|
135
135
|
dsh --profile headless "Reply with only the word: ok"
|
|
136
136
|
```
|
|
137
137
|
|
|
@@ -266,7 +266,7 @@ Find this plugin on the DSH **Plugins** page and use its update or uninstall act
|
|
|
266
266
|
<summary>Terminal commands</summary>
|
|
267
267
|
|
|
268
268
|
```sh
|
|
269
|
-
dsh plugin --profile web update dsh-codex-subscription@2.6.
|
|
269
|
+
dsh plugin --profile web update dsh-codex-subscription@2.6.5
|
|
270
270
|
```
|
|
271
271
|
|
|
272
272
|
Run only when you want to uninstall:
|
|
@@ -282,7 +282,7 @@ dsh plugin --profile web remove dsh-codex-subscription
|
|
|
282
282
|
<details>
|
|
283
283
|
<summary>DSH 0.2.0-rc.2 reports the plugin as incompatible?</summary>
|
|
284
284
|
|
|
285
|
-
DSH 0.2.0-rc.2 did not exist when any release before 2.2.10 was published, and a published package's compatibility declaration cannot be changed. Install 2.2.10 or later (a bare package name can resolve to an older release during the first 24 hours, so enter `dsh-codex-subscription@2.2.10`) from the **Plugins** page, or run `dsh plugin --profile web update dsh-codex-subscription@2.6.
|
|
285
|
+
DSH 0.2.0-rc.2 did not exist when any release before 2.2.10 was published, and a published package's compatibility declaration cannot be changed. Install 2.2.10 or later (a bare package name can resolve to an older release during the first 24 hours, so enter `dsh-codex-subscription@2.2.10`) from the **Plugins** page, or run `dsh plugin --profile web update dsh-codex-subscription@2.6.5`, then restart DSH.
|
|
286
286
|
|
|
287
287
|
</details>
|
|
288
288
|
|
package/README.md
CHANGED
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
2. 在 **包名或地址** 输入框中粘贴下面的包名(已带版本号):
|
|
107
107
|
|
|
108
108
|
```text
|
|
109
|
-
dsh-codex-subscription@2.6.
|
|
109
|
+
dsh-codex-subscription@2.6.5
|
|
110
110
|
```
|
|
111
111
|
|
|
112
112
|
3. 点击 **安装**,等待安装完成;按页面提示操作,需要重启时先保存工作。
|
|
@@ -118,7 +118,7 @@
|
|
|
118
118
|
<summary>终端安装(已能运行 dsh 命令)</summary>
|
|
119
119
|
|
|
120
120
|
```sh
|
|
121
|
-
dsh plugin --profile web add dsh-codex-subscription@2.6.
|
|
121
|
+
dsh plugin --profile web add dsh-codex-subscription@2.6.5
|
|
122
122
|
```
|
|
123
123
|
|
|
124
124
|
安装完成后按提示重启 DSH,再到 **设置 → Codex 订阅** 登录。插件页面和终端均由 DSH 管理安装。
|
|
@@ -131,7 +131,7 @@ dsh plugin --profile web add dsh-codex-subscription@2.6.4
|
|
|
131
131
|
先在 Web 中完成登录并选择一次 Codex 模型,再把同一个插件安装到 Headless profile:
|
|
132
132
|
|
|
133
133
|
```sh
|
|
134
|
-
dsh plugin --profile headless add dsh-codex-subscription@2.6.
|
|
134
|
+
dsh plugin --profile headless add dsh-codex-subscription@2.6.5
|
|
135
135
|
dsh --profile headless "只回复:ok"
|
|
136
136
|
```
|
|
137
137
|
|
|
@@ -295,7 +295,7 @@ DSH 实机设置截图。
|
|
|
295
295
|
<summary>终端方式</summary>
|
|
296
296
|
|
|
297
297
|
```sh
|
|
298
|
-
dsh plugin --profile web update dsh-codex-subscription@2.6.
|
|
298
|
+
dsh plugin --profile web update dsh-codex-subscription@2.6.5
|
|
299
299
|
```
|
|
300
300
|
|
|
301
301
|
仅在需要卸载时运行:
|
|
@@ -311,7 +311,7 @@ dsh plugin --profile web remove dsh-codex-subscription
|
|
|
311
311
|
<details>
|
|
312
312
|
<summary>DSH 0.2.0-rc.2 提示插件不兼容?</summary>
|
|
313
313
|
|
|
314
|
-
2.2.10 之前的所有版本发布时 DSH 0.2.0-rc.2 还不存在,其兼容声明无法事后修改。请安装 2.2.10 或更高版本(只填包名时,发布满 24 小时前可能装到旧版,请直接填 `dsh-codex-subscription@2.2.10`):在 **插件** 页面更新,或运行 `dsh plugin --profile web update dsh-codex-subscription@2.6.
|
|
314
|
+
2.2.10 之前的所有版本发布时 DSH 0.2.0-rc.2 还不存在,其兼容声明无法事后修改。请安装 2.2.10 或更高版本(只填包名时,发布满 24 小时前可能装到旧版,请直接填 `dsh-codex-subscription@2.2.10`):在 **插件** 页面更新,或运行 `dsh plugin --profile web update dsh-codex-subscription@2.6.5`,然后重启 DSH。
|
|
315
315
|
|
|
316
316
|
</details>
|
|
317
317
|
|
package/lib/client.js
CHANGED
|
@@ -9153,7 +9153,7 @@ window.__ModuleLoader__.load({
|
|
|
9153
9153
|
}
|
|
9154
9154
|
//#endregion
|
|
9155
9155
|
//#region src/version.js
|
|
9156
|
-
const PACKAGE_VERSION = "2.6.
|
|
9156
|
+
const PACKAGE_VERSION = "2.6.5";
|
|
9157
9157
|
//#endregion
|
|
9158
9158
|
//#region src/client-recovery.js
|
|
9159
9159
|
async function recoveryCall(rpc, endpoint, payload = {}, timeoutMs = 1e4) {
|
package/lib/index.js
CHANGED
|
@@ -2080,7 +2080,7 @@ function inheritedOriginalImageRef(session, assetId) {
|
|
|
2080
2080
|
}
|
|
2081
2081
|
//#endregion
|
|
2082
2082
|
//#region src/version.js
|
|
2083
|
-
const PACKAGE_VERSION = "2.6.
|
|
2083
|
+
const PACKAGE_VERSION = "2.6.5";
|
|
2084
2084
|
const USER_AGENT = `dsh-codex-subscription/${PACKAGE_VERSION}`;
|
|
2085
2085
|
//#endregion
|
|
2086
2086
|
//#region src/codex-images.js
|
|
@@ -5377,7 +5377,7 @@ function createWakeSignal() {
|
|
|
5377
5377
|
};
|
|
5378
5378
|
}
|
|
5379
5379
|
function shortResetDelay(usage, nowMs, maxWaitMs, resetMarginMs) {
|
|
5380
|
-
if (typeof usage?.rateLimitReachedType === "string" && /^
|
|
5380
|
+
if (typeof usage?.rateLimitReachedType === "string" && /^workspace_[a-z_]*usage_limit_reached$/u.test(usage.rateLimitReachedType)) return void 0;
|
|
5381
5381
|
let latestDelayMs;
|
|
5382
5382
|
for (const limit of usage?.rateLimits ?? []) {
|
|
5383
5383
|
if (limit?.id !== "codex") continue;
|
|
@@ -5441,6 +5441,29 @@ async function waitForResetOrWake(delayMs, signal, wait, wakeSignal, revision) {
|
|
|
5441
5441
|
controller.abort();
|
|
5442
5442
|
return result;
|
|
5443
5443
|
}
|
|
5444
|
+
async function modelsReadyOrCancelled(modelsReady, signal) {
|
|
5445
|
+
if (signal?.aborted) return "cancelled";
|
|
5446
|
+
let onAbort;
|
|
5447
|
+
const cancelled = new Promise((resolve) => {
|
|
5448
|
+
onAbort = () => resolve("cancelled");
|
|
5449
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
5450
|
+
});
|
|
5451
|
+
const ready = Promise.resolve().then(modelsReady).then((value) => value === true, () => false);
|
|
5452
|
+
try {
|
|
5453
|
+
return await Promise.race([ready, cancelled]);
|
|
5454
|
+
} finally {
|
|
5455
|
+
signal?.removeEventListener("abort", onAbort);
|
|
5456
|
+
}
|
|
5457
|
+
}
|
|
5458
|
+
/**
|
|
5459
|
+
* Model readiness for a retry after an account switch. The refresh joins the
|
|
5460
|
+
* switch's own catalog reload and is not tied to the turn, so cancelling one
|
|
5461
|
+
* turn never aborts the reload other consumers share.
|
|
5462
|
+
*/
|
|
5463
|
+
const catalogModelsReady = (modelCatalog) => async () => {
|
|
5464
|
+
await modelCatalog.refresh();
|
|
5465
|
+
return modelCatalog.getModels().length > 0;
|
|
5466
|
+
};
|
|
5444
5467
|
/**
|
|
5445
5468
|
* Recover a Codex subscription RATE_LIMIT only when the backend confirms an
|
|
5446
5469
|
* exhausted short quota window whose reset is close enough to wait out.
|
|
@@ -5449,9 +5472,9 @@ async function waitForResetOrWake(delayMs, signal, wait, wakeSignal, revision) {
|
|
|
5449
5472
|
* the host's standard model-retry surface event so the turn shows the reason,
|
|
5450
5473
|
* countdown, and normal turn cancellation affordance while it is parked.
|
|
5451
5474
|
*/
|
|
5452
|
-
function createCodexQuotaRetryHandler({ usageReader, provider = "openai-codex", enabled = () => true, now = Date.now, wait = cancellableDelay, maxWaitMs = DEFAULT_MAX_WAIT_MS, resetMarginMs = DEFAULT_RESET_MARGIN_MS } = {}) {
|
|
5475
|
+
function createCodexQuotaRetryHandler({ usageReader, provider = "openai-codex", enabled = () => true, now = Date.now, wait = cancellableDelay, modelsReady = () => true, maxWaitMs = DEFAULT_MAX_WAIT_MS, resetMarginMs = DEFAULT_RESET_MARGIN_MS } = {}) {
|
|
5453
5476
|
if (usageReader === void 0 || typeof usageReader.read !== "function") throw new TypeError("quota retry requires a usage reader");
|
|
5454
|
-
if (typeof enabled !== "function" || typeof now !== "function" || typeof wait !== "function") throw new TypeError("quota retry requires enablement, clock, and
|
|
5477
|
+
if (typeof enabled !== "function" || typeof now !== "function" || typeof wait !== "function" || typeof modelsReady !== "function") throw new TypeError("quota retry requires enablement, clock, wait, and model readiness functions");
|
|
5455
5478
|
if (!Number.isFinite(maxWaitMs) || maxWaitMs <= 0 || !Number.isFinite(resetMarginMs) || resetMarginMs < 0) throw new TypeError("quota retry requires a positive wait cap and non-negative reset margin");
|
|
5456
5479
|
const wakeSignal = createWakeSignal();
|
|
5457
5480
|
const clearCache = async () => {
|
|
@@ -5491,6 +5514,12 @@ function createCodexQuotaRetryHandler({ usageReader, provider = "openai-codex",
|
|
|
5491
5514
|
const reason = await waitForResetOrWake(resetDelayMs + resetMarginMs, signal, wait, wakeSignal, wakeRevision);
|
|
5492
5515
|
if (reason === "cancelled" || signal?.aborted) return void 0;
|
|
5493
5516
|
if (!enabled()) return next();
|
|
5517
|
+
if (reason === "account") {
|
|
5518
|
+
const ready = await modelsReadyOrCancelled(modelsReady, signal);
|
|
5519
|
+
if (ready === "cancelled" || signal?.aborted) return void 0;
|
|
5520
|
+
if (!ready) return next();
|
|
5521
|
+
break;
|
|
5522
|
+
}
|
|
5494
5523
|
if (reason !== "configuration") break;
|
|
5495
5524
|
wakeRevision = wakeSignal.revision();
|
|
5496
5525
|
resetDelayMs = shortResetDelay(usage, now(), maxWaitMs, resetMarginMs);
|
|
@@ -6771,7 +6800,8 @@ function apply(ctx, config = {}) {
|
|
|
6771
6800
|
const activeQuotaRetries = /* @__PURE__ */ new Set();
|
|
6772
6801
|
const quotaRetryHandler = createCodexQuotaRetryHandler({
|
|
6773
6802
|
usageReader,
|
|
6774
|
-
enabled: () => normalizeAutoQuotaRetry(settings.get()[AUTO_QUOTA_RETRY_FIELD])
|
|
6803
|
+
enabled: () => normalizeAutoQuotaRetry(settings.get()[AUTO_QUOTA_RETRY_FIELD]),
|
|
6804
|
+
modelsReady: catalogModelsReady(modelCatalog)
|
|
6775
6805
|
});
|
|
6776
6806
|
const disposeQuotaRetry = ctx.on("agent/request-error", (payload, next) => {
|
|
6777
6807
|
if (quotaRetryLifetime.signal.aborted) return Promise.resolve(void 0);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-codex-subscription",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.5",
|
|
4
4
|
"description": "Use ChatGPT and Codex subscriptions in DeepSeek Harness with OAuth, quota, safe resets, web search, images, and Fast mode",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|