dsh-codex-subscription 2.6.2 → 2.6.4
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 +53 -3
- package/lib/index.js +10 -2
- 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.4
|
|
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.4
|
|
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.4
|
|
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.4
|
|
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.4`, 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.4
|
|
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.4
|
|
122
122
|
```
|
|
123
123
|
|
|
124
124
|
安装完成后按提示重启 DSH,再到 **设置 → Codex 订阅** 登录。插件页面和终端均由 DSH 管理安装。
|
|
@@ -131,7 +131,7 @@ dsh plugin --profile web add dsh-codex-subscription@2.6.2
|
|
|
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.4
|
|
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.4
|
|
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.4`,然后重启 DSH。
|
|
315
315
|
|
|
316
316
|
</details>
|
|
317
317
|
|
package/lib/client.js
CHANGED
|
@@ -5960,6 +5960,10 @@ window.__ModuleLoader__.load({
|
|
|
5960
5960
|
deviceHint: "在登录页输入此设备代码:",
|
|
5961
5961
|
waiting: "正在等待登录完成…",
|
|
5962
5962
|
failed: "登录失败,请重试。",
|
|
5963
|
+
failed_account_claim: "登录已授权,但这个账号的令牌里没有 ChatGPT 账号 ID(常见于只用手机号注册的账号)。请改用邮箱账号登录,或先在 ChatGPT 里为账号绑定邮箱后重试。",
|
|
5964
|
+
failed_network: "登录时网络连接失败。请检查网络或代理后重试。",
|
|
5965
|
+
failed_token_exchange: "授权已完成,但换取令牌失败。请重试;反复出现时请检查网络或代理。",
|
|
5966
|
+
failed_callback: "没有收到浏览器的授权回调。请重试,或改用设备码登录。",
|
|
5963
5967
|
accountRetry: "重试",
|
|
5964
5968
|
accountRetrying: "正在重试账户状态…",
|
|
5965
5969
|
accountCredentialUnavailable: "登录凭据暂时不可用。请重试;不会删除已保存的登录信息。",
|
|
@@ -6121,6 +6125,8 @@ window.__ModuleLoader__.load({
|
|
|
6121
6125
|
effortLabel: "推理等级",
|
|
6122
6126
|
providerDefault: "默认",
|
|
6123
6127
|
selectModel: "选择模型",
|
|
6128
|
+
modelSearch: "搜索模型",
|
|
6129
|
+
modelNoMatch: "没有匹配的模型。",
|
|
6124
6130
|
modelsLoading: "正在读取模型…",
|
|
6125
6131
|
modelsEmpty: "没有可用模型;请先登录,并确认网络可用。",
|
|
6126
6132
|
modelsHidden: "所有模型都已从列表中隐藏;可在设置中重新显示。",
|
|
@@ -6560,6 +6566,10 @@ window.__ModuleLoader__.load({
|
|
|
6560
6566
|
deviceHint: "Enter this device code on the sign-in page:",
|
|
6561
6567
|
waiting: "Waiting for sign-in to finish…",
|
|
6562
6568
|
failed: "Sign-in failed. Try again.",
|
|
6569
|
+
failed_account_claim: "Sign-in was authorized, but the token of this account has no ChatGPT account ID (common for accounts created with only a phone number). Sign in with an email account, or add an email to the account in ChatGPT first, then try again.",
|
|
6570
|
+
failed_network: "The network connection failed during sign-in. Check the network or proxy and try again.",
|
|
6571
|
+
failed_token_exchange: "Authorization finished, but exchanging it for a token failed. Try again; if it keeps happening, check the network or proxy.",
|
|
6572
|
+
failed_callback: "The browser did not send the authorization back. Try again, or use device code sign-in.",
|
|
6563
6573
|
accountRetry: "Retry",
|
|
6564
6574
|
accountRetrying: "Retrying account status…",
|
|
6565
6575
|
accountCredentialUnavailable: "The saved sign-in credentials are temporarily unavailable. Retry; saved sign-in information will not be deleted.",
|
|
@@ -6721,6 +6731,8 @@ window.__ModuleLoader__.load({
|
|
|
6721
6731
|
effortLabel: "Effort",
|
|
6722
6732
|
providerDefault: "Default",
|
|
6723
6733
|
selectModel: "Select model",
|
|
6734
|
+
modelSearch: "Search models",
|
|
6735
|
+
modelNoMatch: "No matching models.",
|
|
6724
6736
|
modelsLoading: "Loading models…",
|
|
6725
6737
|
modelsEmpty: "No models available. Sign in and make sure the network is reachable.",
|
|
6726
6738
|
modelsHidden: "All models are hidden from this list. Show one in settings.",
|
|
@@ -6975,6 +6987,8 @@ window.__ModuleLoader__.load({
|
|
|
6975
6987
|
.codexModelSelectCellLabel{flex:none;white-space:nowrap}
|
|
6976
6988
|
.codexModelSelectCellValue{flex:auto;min-width:0;overflow:hidden;color:var(--dsw-alias-label-tertiary);text-align:right;text-overflow:ellipsis;white-space:nowrap}
|
|
6977
6989
|
.codexModelSelectCellChevron{flex:none;color:var(--dsw-alias-label-tertiary)}
|
|
6990
|
+
.codexModelSelectSearch{display:block;width:100%;box-sizing:border-box;height:32px;margin:0 0 4px;padding:0 10px;border:1px solid var(--dsw-alias-border-l3);border-radius:8px;outline:0;background:transparent;color:inherit;font:inherit;font-size:13px}
|
|
6991
|
+
.codexModelSelectSearch:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-border-l3)}
|
|
6978
6992
|
.codexModelSelectGroups{min-height:0;max-height:352px;overflow-y:auto}
|
|
6979
6993
|
.codexModelSelectGroup+.codexModelSelectGroup{margin-top:4px}
|
|
6980
6994
|
.codexModelSelectGroupTitle{position:sticky;top:0;z-index:1;padding:5px 8px 3px;background:var(--dsw-alias-bg-layer-2,#2c2c2e);color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:500;line-height:18px}
|
|
@@ -9139,7 +9153,7 @@ window.__ModuleLoader__.load({
|
|
|
9139
9153
|
}
|
|
9140
9154
|
//#endregion
|
|
9141
9155
|
//#region src/version.js
|
|
9142
|
-
const PACKAGE_VERSION = "2.6.
|
|
9156
|
+
const PACKAGE_VERSION = "2.6.4";
|
|
9143
9157
|
//#endregion
|
|
9144
9158
|
//#region src/client-recovery.js
|
|
9145
9159
|
async function recoveryCall(rpc, endpoint, payload = {}, timeoutMs = 1e4) {
|
|
@@ -9415,6 +9429,7 @@ window.__ModuleLoader__.load({
|
|
|
9415
9429
|
const preferenceSnapshot = usePreferenceSnapshot(preference);
|
|
9416
9430
|
const [open, setOpen] = (0, react.useState)(false);
|
|
9417
9431
|
const [pane, setPane] = (0, react.useState)("root");
|
|
9432
|
+
const [query, setQuery] = (0, react.useState)("");
|
|
9418
9433
|
const rootRef = (0, react.useRef)(null);
|
|
9419
9434
|
const triggerRef = (0, react.useRef)(null);
|
|
9420
9435
|
const id = (0, react.useId)();
|
|
@@ -9450,6 +9465,17 @@ window.__ModuleLoader__.load({
|
|
|
9450
9465
|
...effort.description === void 0 ? {} : { description: effort.description }
|
|
9451
9466
|
}))], [reasoning, t]);
|
|
9452
9467
|
const modelLabel = currentChoice?.model.name ?? t("selectModel");
|
|
9468
|
+
const searchable = visibleGroups.reduce((total, group) => total + group.models.length, 0) > 4;
|
|
9469
|
+
const needle = searchable ? query.trim().toLocaleLowerCase() : "";
|
|
9470
|
+
const shownGroups = needle === "" ? visibleGroups : visibleGroups.map((group) => ({
|
|
9471
|
+
...group,
|
|
9472
|
+
models: group.models.filter((model) => [
|
|
9473
|
+
model.name,
|
|
9474
|
+
model.id,
|
|
9475
|
+
model.description,
|
|
9476
|
+
group.name
|
|
9477
|
+
].some((text) => typeof text === "string" && text.toLocaleLowerCase().includes(needle)))
|
|
9478
|
+
})).filter((group) => group.models.length > 0);
|
|
9453
9479
|
const speedSupported = state.current?.provider === "openai-codex" && (preferenceSnapshot.fastModels?.includes(state.current?.model) ?? supportsCodexFastMode(state.current?.model));
|
|
9454
9480
|
const speedWritable = preferenceSnapshot.status === "ready" && preferenceSnapshot.writable === true;
|
|
9455
9481
|
const ultrafastSupported = state.current?.provider === "openai-codex" && (preferenceSnapshot.ultrafastModels ?? []).includes(state.current?.model);
|
|
@@ -9491,11 +9517,15 @@ window.__ModuleLoader__.load({
|
|
|
9491
9517
|
if (!rootRef.current?.contains(event.target)) {
|
|
9492
9518
|
setOpen(false);
|
|
9493
9519
|
setPane("root");
|
|
9520
|
+
setQuery("");
|
|
9494
9521
|
}
|
|
9495
9522
|
};
|
|
9496
9523
|
document.addEventListener("mousedown", closeOutside);
|
|
9497
9524
|
return () => document.removeEventListener("mousedown", closeOutside);
|
|
9498
9525
|
}, [open]);
|
|
9526
|
+
(0, react.useEffect)(() => {
|
|
9527
|
+
if (pane !== "model") setQuery("");
|
|
9528
|
+
}, [pane]);
|
|
9499
9529
|
(0, react.useEffect)(() => {
|
|
9500
9530
|
if (!speedSupported && pane === "speed") setPane("root");
|
|
9501
9531
|
if (!verbositySupported && pane === "verbosity") setPane("root");
|
|
@@ -9508,6 +9538,7 @@ window.__ModuleLoader__.load({
|
|
|
9508
9538
|
const close = (restoreFocus = false) => {
|
|
9509
9539
|
setOpen(false);
|
|
9510
9540
|
setPane("root");
|
|
9541
|
+
setQuery("");
|
|
9511
9542
|
if (restoreFocus) queueMicrotask(() => triggerRef.current?.focus());
|
|
9512
9543
|
};
|
|
9513
9544
|
const settleSelection = (accepted) => {
|
|
@@ -9607,9 +9638,18 @@ window.__ModuleLoader__.load({
|
|
|
9607
9638
|
value: failure.message
|
|
9608
9639
|
})
|
|
9609
9640
|
}, failure.id)),
|
|
9641
|
+
searchable ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
9642
|
+
className: "codexModelSelectSearch",
|
|
9643
|
+
type: "search",
|
|
9644
|
+
value: query,
|
|
9645
|
+
autoFocus: true,
|
|
9646
|
+
placeholder: t("modelSearch"),
|
|
9647
|
+
"aria-label": t("modelSearch"),
|
|
9648
|
+
onChange: (event) => setQuery(event.target.value)
|
|
9649
|
+
}) : null,
|
|
9610
9650
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
9611
9651
|
className: "codexModelSelectGroups scrollable",
|
|
9612
|
-
children:
|
|
9652
|
+
children: shownGroups.map((group) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
|
|
9613
9653
|
className: "codexModelSelectGroup",
|
|
9614
9654
|
role: "group",
|
|
9615
9655
|
"aria-labelledby": `${id}-${group.id}`,
|
|
@@ -9640,6 +9680,10 @@ window.__ModuleLoader__.load({
|
|
|
9640
9680
|
state.status === "ready" && visibleGroups.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
9641
9681
|
className: "codexModelSelectEmpty",
|
|
9642
9682
|
children: t(choices.length === 0 ? "modelsEmpty" : "modelsHidden")
|
|
9683
|
+
}) : null,
|
|
9684
|
+
state.status === "ready" && visibleGroups.length > 0 && shownGroups.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
9685
|
+
className: "codexModelSelectEmpty",
|
|
9686
|
+
children: t("modelNoMatch")
|
|
9643
9687
|
}) : null
|
|
9644
9688
|
]
|
|
9645
9689
|
});
|
|
@@ -11107,6 +11151,12 @@ window.__ModuleLoader__.load({
|
|
|
11107
11151
|
}
|
|
11108
11152
|
//#endregion
|
|
11109
11153
|
//#region src/client-account.jsx
|
|
11154
|
+
const LOGIN_FAILURES = [
|
|
11155
|
+
"account-claim",
|
|
11156
|
+
"network",
|
|
11157
|
+
"token-exchange",
|
|
11158
|
+
"callback"
|
|
11159
|
+
];
|
|
11110
11160
|
function AccountEmail({ candidate, fallback, t, emailVisible, onClick }) {
|
|
11111
11161
|
if (typeof candidate?.email !== "string" || candidate.email.length === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
11112
11162
|
title: t("emailUnavailable"),
|
|
@@ -11466,7 +11516,7 @@ window.__ModuleLoader__.load({
|
|
|
11466
11516
|
flow?.phase === "failed" || error !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
11467
11517
|
className: "codexSubscriptionError",
|
|
11468
11518
|
role: "alert",
|
|
11469
|
-
children: error ?? t("failed")
|
|
11519
|
+
children: error ?? (LOGIN_FAILURES.includes(flow?.failure) ? t(`failed_${flow.failure.replace("-", "_")}`) : t("failed"))
|
|
11470
11520
|
}) : null
|
|
11471
11521
|
]
|
|
11472
11522
|
});
|
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.4";
|
|
2084
2084
|
const USER_AGENT = `dsh-codex-subscription/${PACKAGE_VERSION}`;
|
|
2085
2085
|
//#endregion
|
|
2086
2086
|
//#region src/codex-images.js
|
|
@@ -3358,6 +3358,13 @@ const publicPrompt = (prompt) => ({
|
|
|
3358
3358
|
message: String(prompt.message ?? ""),
|
|
3359
3359
|
...typeof prompt.placeholder === "string" ? { placeholder: prompt.placeholder } : {}
|
|
3360
3360
|
});
|
|
3361
|
+
const PUBLIC_FAILURES = /* @__PURE__ */ new Set([
|
|
3362
|
+
"account-claim",
|
|
3363
|
+
"network",
|
|
3364
|
+
"token-exchange",
|
|
3365
|
+
"callback"
|
|
3366
|
+
]);
|
|
3367
|
+
const publicFailure = (kind) => PUBLIC_FAILURES.has(kind) ? kind : void 0;
|
|
3361
3368
|
function classifyLoginFailure(error) {
|
|
3362
3369
|
const message = error instanceof Error ? error.message : "";
|
|
3363
3370
|
if (/token exchange failed/iu.test(message)) return "token-exchange";
|
|
@@ -3517,7 +3524,8 @@ var CodexLoginCoordinator = class {
|
|
|
3517
3524
|
method,
|
|
3518
3525
|
phase: "failed",
|
|
3519
3526
|
authenticated: false,
|
|
3520
|
-
error: "Codex login failed"
|
|
3527
|
+
error: "Codex login failed",
|
|
3528
|
+
failure: publicFailure(classifyLoginFailure(error))
|
|
3521
3529
|
};
|
|
3522
3530
|
session.hostError = error;
|
|
3523
3531
|
}).finally(publishReady);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-codex-subscription",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.4",
|
|
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",
|