zcode-pro 1.6.0__tar.gz → 1.6.1__tar.gz
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.
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/PKG-INFO +1 -3
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/README.md +0 -2
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/dist/inject.js +18 -448
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/package.json +1 -1
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/helper.mjs +0 -108
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/core.js +0 -18
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/settings-dialog.js +1 -81
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/index.js +0 -2
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/zcode_pro/__init__.py +1 -1
- zcode_pro-1.6.0/src/inject/features/auto-continue.js +0 -325
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/.gitignore +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/LICENSE +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/README.en.md +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/bin/zcode-pro +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/bin/zcode-pro.cmd +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/bin/zcode-pro.mjs +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/bin/zcode-pro.vbs +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/cli.mjs +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/pyproject.toml +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/cdp.mjs +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/main.mjs +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/paths.mjs +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/pickFolder.mjs +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/settings.mjs +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/setup.mjs +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/skill-stats.mjs +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/taskIndex.mjs +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/taskOrder.mjs +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/version.mjs +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/wallpaper.mjs +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/webdav.mjs +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/alias-migration.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/alias.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/composer-provider.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/copy-path.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/file-menu.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/idle-reclaim.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/image-menu.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/newtab-panels.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/open-folder.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/pinned-collapse.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/plugin-card-retry.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/plugin-updates.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/project-menu.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/relocate-dialog.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/sandbox-reclaim.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/session-switch.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/settings-entry.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/status-bar.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/styles.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/table-copy.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/task-order.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/theme.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/title-gen.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/title-lock.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/toolbar-icons.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/turn-usage.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/ws-rows.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/ws-running.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/provider-fields.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/ui.js +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/zcode_pro/__main__.py +0 -0
- {zcode_pro-1.6.0 → zcode_pro-1.6.1}/zcode_pro/cli.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: zcode-pro
|
|
3
|
-
Version: 1.6.
|
|
3
|
+
Version: 1.6.1
|
|
4
4
|
Summary: ZCode Pro — ZCode 桌面版增强工具:壁纸引擎(图片/视频/网页)、皮肤主题、会话快捷切换、状态栏统计等二十余项界面与体验增强;不修改客户端文件,用 ZCode Pro 快捷方式启动即可生效。
|
|
5
5
|
Project-URL: Homepage, https://github.com/duanluan/zcode-pro
|
|
6
6
|
Project-URL: Repository, https://github.com/duanluan/zcode-pro
|
|
@@ -67,7 +67,6 @@ ZCode 桌面版增强工具:壁纸引擎(图片/视频/网页)、皮肤主
|
|
|
67
67
|
| Vision | 视觉代理 | 主模型不识图时自动交给视觉模型识别图片,识别描述带给主模型;可视化编辑代理链(zcode-vision 插件) |
|
|
68
68
|
| Headroom | Headroom 压缩 | 管理压缩设备、省电切换与代理运行状态,headroom 本体检查更新与升级(headroom 插件) |
|
|
69
69
|
| rtk | rtk 压缩 | 管理改写提醒与命令白名单,rtk 本体检查更新与一键升级(rtk 插件) |
|
|
70
|
-
| 自动继续 | 回合失败自动继续 | 回合因请求故障失败(红色报错横幅)时自动发一条继续指令接上任务,重开会话(含重启后)没做完的任务也接上,认证、余额等永久性错误与手动停止不打扰;配置与 auto-continue 插件共用(auto-continue 插件) |
|
|
71
70
|
|
|
72
71
|
各项功能均可在设置弹窗中开关或调整,ZCode 3.16.1 与 3.15.x 均可使用。
|
|
73
72
|
|
|
@@ -207,7 +206,6 @@ bin\zcode-pro.cmd setup
|
|
|
207
206
|
| 全局提示词 | `~/.zcode/AGENTS.md` |
|
|
208
207
|
| ZCode 行为配置(技能清单预算等) | `~/.zcode/cli/config.json` |
|
|
209
208
|
| 视觉代理(zcode-vision 插件) | `~/.zcode/zcode-vision.json` |
|
|
210
|
-
| 自动继续(auto-continue 插件) | `~/.zcode/auto-continue.json` |
|
|
211
209
|
| rtk 压缩(rtk 插件) | `~/.zcode-rtk/` |
|
|
212
210
|
| Headroom(headroom 插件) | `~/.zcode/headroom.json` |
|
|
213
211
|
|
|
@@ -47,7 +47,6 @@ ZCode 桌面版增强工具:壁纸引擎(图片/视频/网页)、皮肤主
|
|
|
47
47
|
| Vision | 视觉代理 | 主模型不识图时自动交给视觉模型识别图片,识别描述带给主模型;可视化编辑代理链(zcode-vision 插件) |
|
|
48
48
|
| Headroom | Headroom 压缩 | 管理压缩设备、省电切换与代理运行状态,headroom 本体检查更新与升级(headroom 插件) |
|
|
49
49
|
| rtk | rtk 压缩 | 管理改写提醒与命令白名单,rtk 本体检查更新与一键升级(rtk 插件) |
|
|
50
|
-
| 自动继续 | 回合失败自动继续 | 回合因请求故障失败(红色报错横幅)时自动发一条继续指令接上任务,重开会话(含重启后)没做完的任务也接上,认证、余额等永久性错误与手动停止不打扰;配置与 auto-continue 插件共用(auto-continue 插件) |
|
|
51
50
|
|
|
52
51
|
各项功能均可在设置弹窗中开关或调整,ZCode 3.16.1 与 3.15.x 均可使用。
|
|
53
52
|
|
|
@@ -187,7 +186,6 @@ bin\zcode-pro.cmd setup
|
|
|
187
186
|
| 全局提示词 | `~/.zcode/AGENTS.md` |
|
|
188
187
|
| ZCode 行为配置(技能清单预算等) | `~/.zcode/cli/config.json` |
|
|
189
188
|
| 视觉代理(zcode-vision 插件) | `~/.zcode/zcode-vision.json` |
|
|
190
|
-
| 自动继续(auto-continue 插件) | `~/.zcode/auto-continue.json` |
|
|
191
189
|
| rtk 压缩(rtk 插件) | `~/.zcode-rtk/` |
|
|
192
190
|
| Headroom(headroom 插件) | `~/.zcode/headroom.json` |
|
|
193
191
|
|
|
@@ -475,15 +475,6 @@
|
|
|
475
475
|
pluginsUpdateFailed: "\u63D2\u4EF6\u66F4\u65B0\u5931\u8D25",
|
|
476
476
|
pluginsUpdatesAvailable: "zcode-plugins \u6709 {n} \u4E2A\u63D2\u4EF6\u53EF\u66F4\u65B0\uFF08ZCode Pro \u8BBE\u7F6E \u2192 \u529F\u80FD\uFF09",
|
|
477
477
|
pluginsAutoUpdated: "zcode-plugins \u63D2\u4EF6\u5DF2\u66F4\u65B0",
|
|
478
|
-
tabAutoContinue: "\u81EA\u52A8\u7EE7\u7EED",
|
|
479
|
-
acDesc: "\u56DE\u5408\u56E0\u8BF7\u6C42\u6545\u969C\u76F4\u63A5\u5931\u8D25\uFF08\u7EA2\u8272\u62A5\u9519\u6A2A\u5E45\uFF09\u65F6\uFF0C\u81EA\u52A8\u53D1\u4E00\u6761\u7EE7\u7EED\u6307\u4EE4\u628A\u4EFB\u52A1\u63A5\u4E0A\u2014\u2014\u8FD9\u6761\u5931\u8D25\u8DEF\u5F84\u4E0D\u89E6\u53D1\u63D2\u4EF6\u94A9\u5B50\uFF0C\u7531 ZCode Pro \u8865\u4E0A\uFF1B\u8BA4\u8BC1\u3001\u4F59\u989D\u3001\u6A21\u578B\u4E0D\u5B58\u5728\u7B49\u6C38\u4E45\u6027\u9519\u8BEF\u4E0D\u6253\u6270\u3002\u4E0E auto-continue \u63D2\u4EF6\u5171\u7528\u914D\u7F6E\uFF08~/.zcode/auto-continue.json\uFF09\uFF0C\u63D2\u4EF6\u8D1F\u8D23\u56DE\u5408\u6B63\u5E38\u7ED3\u675F\u540E\u7684\u9519\u8BEF\u6A2A\u5E45\u3001\u622A\u65AD\u4E0E\u7A7A\u54CD\u5E94\u6062\u590D\u3002",
|
|
480
|
-
acEnabled: "\u542F\u7528",
|
|
481
|
-
acPrompt: "\u7EE7\u7EED\u63D0\u793A\u8BCD",
|
|
482
|
-
acMaxRetries: "\u6700\u591A\u7EE7\u7EED\u6B21\u6570",
|
|
483
|
-
acMaxRetriesHint: "30 \u5206\u949F\u5185\u81EA\u52A8\u7EE7\u7EED\u7684\u7D2F\u8BA1\u4E0A\u9650\uFF0C\u9632\u6B62\u6545\u969C\u53CD\u590D\u65F6\u5237\u5C4F",
|
|
484
|
-
acCooldown: "\u5BC6\u96C6\u5931\u8D25\u9000\u907F\u57FA\u6570\uFF08\u79D2\uFF09",
|
|
485
|
-
acCooldownHint: "2 \u5206\u949F\u5185\u5DF2\u7EE7\u7EED\u8FC7\u5C31\u89C6\u4E3A\u5BC6\u96C6\u5931\u8D25\uFF0C\u95F4\u9694\u6309 2 \u500D\u9012\u589E\u3001\u4E0A\u9650 60 \u79D2\uFF1B\u5355\u6B21\u5931\u8D25\u53EA\u7B49 3 \u79D2\u754C\u9762\u7A33\u5B9A",
|
|
486
|
-
acLoadFailed: "\u8BFB\u53D6\u81EA\u52A8\u7EE7\u7EED\u914D\u7F6E\u5931\u8D25",
|
|
487
478
|
tabVision: "Vision",
|
|
488
479
|
visionDesc: "\u4E3B\u6A21\u578B\u4E0D\u652F\u6301\u56FE\u7247\u8F93\u5165\u65F6\uFF08\u5982 glm-5.3\uFF09\uFF0C\u81EA\u52A8\u628A\u6D88\u606F\u91CC\u7684\u56FE\u7247\u4EA4\u7ED9\u4E0B\u9762\u7684\u89C6\u89C9\u6A21\u578B\u8BC6\u522B\uFF0C\u628A\u63CF\u8FF0\u5E26\u7ED9\u4E3B\u6A21\u578B\uFF08zcode-vision \u63D2\u4EF6\uFF1B/vision-* \u547D\u4EE4\u7F16\u8F91\u540C\u4E00\u914D\u7F6E\uFF09\u3002",
|
|
489
480
|
visionEnabled: "\u542F\u7528",
|
|
@@ -1047,15 +1038,6 @@
|
|
|
1047
1038
|
pluginsUpdateFailed: "Plugin update failed",
|
|
1048
1039
|
pluginsUpdatesAvailable: "{n} zcode-plugins update(s) available (ZCode Pro settings \u2192 Features)",
|
|
1049
1040
|
pluginsAutoUpdated: "zcode-plugins updated",
|
|
1050
|
-
tabAutoContinue: "Auto-continue",
|
|
1051
|
-
acDesc: "When a turn dies from a request failure (red error banner), automatically send a continue prompt to pick the task back up \u2014 this failure path fires no plugin hooks, ZCode Pro covers it; permanent errors (auth, balance, missing model) are left alone. Shares one config with the auto-continue plugin (~/.zcode/auto-continue.json); the plugin covers error banners, truncation and empty responses after normally-ended turns.",
|
|
1052
|
-
acEnabled: "Enable",
|
|
1053
|
-
acPrompt: "Continue prompt",
|
|
1054
|
-
acMaxRetries: "Max auto-continues",
|
|
1055
|
-
acMaxRetriesHint: "Cap on auto-continues within 30 minutes, to avoid flooding on repeated failures",
|
|
1056
|
-
acCooldown: "Backoff base for burst failures (s)",
|
|
1057
|
-
acCooldownHint: "A continue within 2 minutes counts as a burst: interval doubles up to 60s; a single failure only waits 3s for the UI to settle",
|
|
1058
|
-
acLoadFailed: "Failed to load the auto-continue config",
|
|
1059
1041
|
tabVision: "Vision",
|
|
1060
1042
|
visionDesc: "When the main model cannot see images (e.g. glm-5.3), images in messages are recognized by the vision models below and passed to the main model as text (zcode-vision plugin; /vision-* commands edit the same file).",
|
|
1061
1043
|
visionEnabled: "Enable",
|
|
@@ -3448,7 +3430,7 @@
|
|
|
3448
3430
|
function waitFor(getter, timeoutMs, step) {
|
|
3449
3431
|
const start = Date.now();
|
|
3450
3432
|
return new Promise((resolve, reject) => {
|
|
3451
|
-
const
|
|
3433
|
+
const tick6 = () => {
|
|
3452
3434
|
let v = null;
|
|
3453
3435
|
try {
|
|
3454
3436
|
v = getter();
|
|
@@ -3462,9 +3444,9 @@
|
|
|
3462
3444
|
reject(new Error(step));
|
|
3463
3445
|
return;
|
|
3464
3446
|
}
|
|
3465
|
-
setTimeout(
|
|
3447
|
+
setTimeout(tick6, 120);
|
|
3466
3448
|
};
|
|
3467
|
-
|
|
3449
|
+
tick6();
|
|
3468
3450
|
});
|
|
3469
3451
|
}
|
|
3470
3452
|
function setReactInputValue(input, value) {
|
|
@@ -4888,8 +4870,8 @@
|
|
|
4888
4870
|
clearWallpaper();
|
|
4889
4871
|
return;
|
|
4890
4872
|
}
|
|
4891
|
-
const
|
|
4892
|
-
wpTickFn =
|
|
4873
|
+
const tick6 = () => showFile(files[nextIdx(files.length)], "library");
|
|
4874
|
+
wpTickFn = tick6;
|
|
4893
4875
|
if (!(Math.max(0, Number(bg.intervalMin) || 0) * 6e4 >= 3e4)) {
|
|
4894
4876
|
const pickFile = files.find((f) => sameName(f.name, bg.file));
|
|
4895
4877
|
if (!pickFile) {
|
|
@@ -4899,7 +4881,7 @@
|
|
|
4899
4881
|
showFile(pickFile, "library");
|
|
4900
4882
|
return;
|
|
4901
4883
|
}
|
|
4902
|
-
|
|
4884
|
+
tick6();
|
|
4903
4885
|
armRotateTimer(bg);
|
|
4904
4886
|
return;
|
|
4905
4887
|
}
|
|
@@ -4916,9 +4898,9 @@
|
|
|
4916
4898
|
clearWallpaper();
|
|
4917
4899
|
return;
|
|
4918
4900
|
}
|
|
4919
|
-
const
|
|
4920
|
-
wpTickFn =
|
|
4921
|
-
|
|
4901
|
+
const tick6 = () => showFile(files[nextIdx(files.length)], "folder");
|
|
4902
|
+
wpTickFn = tick6;
|
|
4903
|
+
tick6();
|
|
4922
4904
|
armRotateTimer(bg);
|
|
4923
4905
|
return;
|
|
4924
4906
|
}
|
|
@@ -5007,8 +4989,8 @@
|
|
|
5007
4989
|
clearInterval(st.timer);
|
|
5008
4990
|
st.timer = null;
|
|
5009
4991
|
}
|
|
5010
|
-
const setState = (image,
|
|
5011
|
-
regionState[region] = { sig, image, tick:
|
|
4992
|
+
const setState = (image, tick6) => {
|
|
4993
|
+
regionState[region] = { sig, image, tick: tick6, timer: null, interval: 0 };
|
|
5012
4994
|
if (image) addRule(region, image);
|
|
5013
4995
|
};
|
|
5014
4996
|
const drop = () => {
|
|
@@ -5196,7 +5178,7 @@
|
|
|
5196
5178
|
setState(L.upgradeFound.replaceAll("{v}", res.latest || ""));
|
|
5197
5179
|
btn.textContent = L.upgradeNow;
|
|
5198
5180
|
};
|
|
5199
|
-
const
|
|
5181
|
+
const tick6 = async () => {
|
|
5200
5182
|
const res = await rpc(endpoint + "/upgrade");
|
|
5201
5183
|
if (!res.ok) {
|
|
5202
5184
|
stopPoll();
|
|
@@ -5236,9 +5218,9 @@
|
|
|
5236
5218
|
btn.textContent = L.upgradeStop;
|
|
5237
5219
|
setState(L.upgradeRunning);
|
|
5238
5220
|
timer = setInterval(() => {
|
|
5239
|
-
void
|
|
5221
|
+
void tick6();
|
|
5240
5222
|
}, 1500);
|
|
5241
|
-
void
|
|
5223
|
+
void tick6();
|
|
5242
5224
|
};
|
|
5243
5225
|
void (async () => {
|
|
5244
5226
|
const res = await rpc(endpoint + "/upgrade");
|
|
@@ -5700,10 +5682,9 @@
|
|
|
5700
5682
|
const paneVision = h("div", { role: "tabpanel", style: "display:none" });
|
|
5701
5683
|
const paneRtk = h("div", { role: "tabpanel", style: "display:none" });
|
|
5702
5684
|
const paneHeadroom = h("div", { role: "tabpanel", style: "display:none" });
|
|
5703
|
-
const paneAutoContinue = h("div", { role: "tabpanel", style: "display:none" });
|
|
5704
5685
|
const paneTitleGen = h("div", { role: "tabpanel", style: "display:none" });
|
|
5705
5686
|
const paneDebug = h("div", { role: "tabpanel", style: "display:none" });
|
|
5706
|
-
const panes = { features: paneFeatures, shortcuts: paneShortcuts, styles: paneStyles, perf: panePerf, agents: paneAgents, proxy: paneProxy, sync: paneSync, vision: paneVision, headroom: paneHeadroom, rtk: paneRtk,
|
|
5687
|
+
const panes = { features: paneFeatures, shortcuts: paneShortcuts, styles: paneStyles, perf: panePerf, agents: paneAgents, proxy: paneProxy, sync: paneSync, vision: paneVision, headroom: paneHeadroom, rtk: paneRtk, debug: paneDebug };
|
|
5707
5688
|
const tabDefs = [
|
|
5708
5689
|
["features", L.tabFeatures],
|
|
5709
5690
|
["styles", L.tabStyles],
|
|
@@ -5715,7 +5696,6 @@
|
|
|
5715
5696
|
["vision", L.tabVision],
|
|
5716
5697
|
["headroom", L.tabHeadroom],
|
|
5717
5698
|
["rtk", L.tabRtk],
|
|
5718
|
-
["autoContinue", L.tabAutoContinue],
|
|
5719
5699
|
// “调试”标签页只对开发模式生效的用户显示(配置开关或 ZCODEPRO_DEV=1),
|
|
5720
5700
|
// 普通用户不可见
|
|
5721
5701
|
...config.devMode === true || config.devActive === true ? [["debug", L.tabDebug]] : []
|
|
@@ -8777,113 +8757,6 @@
|
|
|
8777
8757
|
);
|
|
8778
8758
|
};
|
|
8779
8759
|
renderTitleGenPane();
|
|
8780
|
-
let acRes = null;
|
|
8781
|
-
let acCfg = null;
|
|
8782
|
-
let acSaveTimer = null;
|
|
8783
|
-
const persistAc = async () => {
|
|
8784
|
-
const res = await rpc("/auto-continue", { method: "POST", body: { config: acCfg } });
|
|
8785
|
-
if (!res.ok) showToast(L.failed + ": " + errText(res), "error");
|
|
8786
|
-
};
|
|
8787
|
-
const saveAcSoon = () => {
|
|
8788
|
-
clearTimeout(acSaveTimer);
|
|
8789
|
-
acSaveTimer = setTimeout(() => {
|
|
8790
|
-
void persistAc();
|
|
8791
|
-
}, 500);
|
|
8792
|
-
};
|
|
8793
|
-
const renderAutoContinue = () => {
|
|
8794
|
-
if (!acRes || !acRes.ok) {
|
|
8795
|
-
paneAutoContinue.replaceChildren(
|
|
8796
|
-
h("p", { class: "text-ui-sm/relaxed text-foreground-subtle" }, L.acDesc),
|
|
8797
|
-
h("p", { class: "mt-2 text-ui-sm text-destructive" }, L.acLoadFailed + (acRes ? ": " + errText(acRes) : ""))
|
|
8798
|
-
);
|
|
8799
|
-
return;
|
|
8800
|
-
}
|
|
8801
|
-
if (!acCfg) {
|
|
8802
|
-
const raw = acRes.config && typeof acRes.config === "object" ? acRes.config : {};
|
|
8803
|
-
acCfg = {
|
|
8804
|
-
enabled: raw.enabled !== false,
|
|
8805
|
-
continueText: typeof raw.continueText === "string" && raw.continueText ? raw.continueText : isZhLocale() ? "\u7EE7\u7EED" : "continue",
|
|
8806
|
-
maxRetries: Number.isFinite(raw.maxRetries) ? raw.maxRetries : 8,
|
|
8807
|
-
cooldownBaseSec: Number.isFinite(raw.cooldownBaseSec) ? raw.cooldownBaseSec : 10
|
|
8808
|
-
};
|
|
8809
|
-
}
|
|
8810
|
-
const numRow = (labelText, hint, value, min, max, commit) => h(
|
|
8811
|
-
"label",
|
|
8812
|
-
{
|
|
8813
|
-
class: "flex shrink-0 items-center gap-1.5",
|
|
8814
|
-
title: hint
|
|
8815
|
-
},
|
|
8816
|
-
h("span", { class: "text-ui-xs text-foreground-subtle" }, labelText),
|
|
8817
|
-
numberField({
|
|
8818
|
-
value,
|
|
8819
|
-
fallback: min,
|
|
8820
|
-
min,
|
|
8821
|
-
max,
|
|
8822
|
-
onCommit: (v) => {
|
|
8823
|
-
commit(v);
|
|
8824
|
-
saveAcSoon();
|
|
8825
|
-
}
|
|
8826
|
-
}).el
|
|
8827
|
-
);
|
|
8828
|
-
const area = h("textarea", { class: "zcodepro-textarea zcodepro-textarea-sm", rows: "3", placeholder: L.acPrompt, title: L.acPrompt });
|
|
8829
|
-
area.value = acCfg.continueText || "";
|
|
8830
|
-
area.addEventListener("input", () => {
|
|
8831
|
-
acCfg.continueText = area.value;
|
|
8832
|
-
saveAcSoon();
|
|
8833
|
-
});
|
|
8834
|
-
const parts = [
|
|
8835
|
-
h("p", { class: "text-ui-sm/relaxed text-foreground-subtle" }, L.acDesc),
|
|
8836
|
-
// 信息卡:插件版本 + 启用开关(与 Vision 面板同款布局)
|
|
8837
|
-
h(
|
|
8838
|
-
"div",
|
|
8839
|
-
{ class: "mt-3 rounded-xl border border-border p-2" },
|
|
8840
|
-
h(
|
|
8841
|
-
"div",
|
|
8842
|
-
{ class: "flex flex-wrap items-center gap-2" },
|
|
8843
|
-
h("span", { class: "shrink-0 whitespace-nowrap text-ui-xs/relaxed text-foreground-subtle" }, `\u63D2\u4EF6 ${acRes.pluginVersion || "\u2014"}`),
|
|
8844
|
-
h(
|
|
8845
|
-
"div",
|
|
8846
|
-
{ class: "ml-auto" },
|
|
8847
|
-
settingRow(L.acEnabled, "", acCfg.enabled !== false, () => {
|
|
8848
|
-
acCfg.enabled = !(acCfg.enabled !== false);
|
|
8849
|
-
saveAcSoon();
|
|
8850
|
-
renderAutoContinue();
|
|
8851
|
-
})
|
|
8852
|
-
)
|
|
8853
|
-
)
|
|
8854
|
-
)
|
|
8855
|
-
];
|
|
8856
|
-
if (!acRes.pluginVersion) {
|
|
8857
|
-
parts.push(pluginInstallCard("auto-continue", async () => {
|
|
8858
|
-
const meta = await rpc("/auto-continue");
|
|
8859
|
-
if (meta.ok) acRes = meta;
|
|
8860
|
-
renderAutoContinue();
|
|
8861
|
-
}));
|
|
8862
|
-
}
|
|
8863
|
-
parts.push(
|
|
8864
|
-
h(
|
|
8865
|
-
"div",
|
|
8866
|
-
{ class: "mt-3 rounded-xl border border-border p-2" },
|
|
8867
|
-
h("div", { class: "mb-1 text-ui-xs font-medium text-foreground-subtle" }, L.acPrompt),
|
|
8868
|
-
area
|
|
8869
|
-
),
|
|
8870
|
-
h(
|
|
8871
|
-
"div",
|
|
8872
|
-
{ class: "mt-2 flex flex-wrap items-center gap-x-4 gap-y-1.5 rounded-xl border border-border p-2" },
|
|
8873
|
-
numRow(L.acMaxRetries, L.acMaxRetriesHint, acCfg.maxRetries, 1, 50, (v) => {
|
|
8874
|
-
acCfg.maxRetries = v;
|
|
8875
|
-
}),
|
|
8876
|
-
numRow(L.acCooldown, L.acCooldownHint, acCfg.cooldownBaseSec, 0, 600, (v) => {
|
|
8877
|
-
acCfg.cooldownBaseSec = v;
|
|
8878
|
-
})
|
|
8879
|
-
)
|
|
8880
|
-
);
|
|
8881
|
-
paneAutoContinue.replaceChildren(...parts);
|
|
8882
|
-
};
|
|
8883
|
-
void (async () => {
|
|
8884
|
-
acRes = await rpc("/auto-continue");
|
|
8885
|
-
renderAutoContinue();
|
|
8886
|
-
})();
|
|
8887
8760
|
const subTabHost = h("div", { class: "mt-2" });
|
|
8888
8761
|
for (const bar of Object.values(subTabBars)) {
|
|
8889
8762
|
bar.style.display = "none";
|
|
@@ -8901,7 +8774,6 @@
|
|
|
8901
8774
|
paneVision,
|
|
8902
8775
|
paneHeadroom,
|
|
8903
8776
|
paneRtk,
|
|
8904
|
-
paneAutoContinue,
|
|
8905
8777
|
paneDebug
|
|
8906
8778
|
);
|
|
8907
8779
|
}
|
|
@@ -10854,9 +10726,9 @@
|
|
|
10854
10726
|
var mapRefreshTimer = 0;
|
|
10855
10727
|
function refreshMapSoon() {
|
|
10856
10728
|
if (mapRefreshTimer) return;
|
|
10857
|
-
const
|
|
10729
|
+
const tick6 = () => {
|
|
10858
10730
|
if (document.hidden) {
|
|
10859
|
-
mapRefreshTimer = setTimeout(
|
|
10731
|
+
mapRefreshTimer = setTimeout(tick6, 1e4);
|
|
10860
10732
|
return;
|
|
10861
10733
|
}
|
|
10862
10734
|
mapRefreshTimer = 0;
|
|
@@ -10864,7 +10736,7 @@
|
|
|
10864
10736
|
if (m) scan4();
|
|
10865
10737
|
});
|
|
10866
10738
|
};
|
|
10867
|
-
mapRefreshTimer = setTimeout(
|
|
10739
|
+
mapRefreshTimer = setTimeout(tick6, MAP_REFRESH_MS);
|
|
10868
10740
|
}
|
|
10869
10741
|
var editingKey = null;
|
|
10870
10742
|
var bootDelay = 0;
|
|
@@ -11414,304 +11286,6 @@
|
|
|
11414
11286
|
}, SCAN_MS);
|
|
11415
11287
|
}
|
|
11416
11288
|
|
|
11417
|
-
// src/inject/features/auto-continue.js
|
|
11418
|
-
var SCAN_MS2 = 2e3;
|
|
11419
|
-
var BANNER_SEL = '[data-testid="chat-error-banner"]';
|
|
11420
|
-
var STOP_SEL = '[data-testid="v4-stop"]';
|
|
11421
|
-
var INPUT_SEL = '[data-testid="v4-composer-input"]';
|
|
11422
|
-
var SEND_SEL = '[data-testid="v4-composer-send"]';
|
|
11423
|
-
var DEFAULT_CONTINUE_TEXT = isZhLocale() ? "\u7EE7\u7EED" : "continue";
|
|
11424
|
-
var DEFAULTS = {
|
|
11425
|
-
enabled: true,
|
|
11426
|
-
continueText: DEFAULT_CONTINUE_TEXT,
|
|
11427
|
-
maxRetries: 8,
|
|
11428
|
-
cooldownBaseSec: 10,
|
|
11429
|
-
cooldownFactor: 2,
|
|
11430
|
-
cooldownMaxSec: 60,
|
|
11431
|
-
stuckAfterMin: 30,
|
|
11432
|
-
// 永久性错误关键词(正则,命中不自动继续),与插件引擎同一份配置可覆盖
|
|
11433
|
-
permanentPatterns: [
|
|
11434
|
-
"\\b40[123]\\b",
|
|
11435
|
-
"unauthorized",
|
|
11436
|
-
"forbidden",
|
|
11437
|
-
"authentication",
|
|
11438
|
-
"invalid[_ -]?api[_ -]?key",
|
|
11439
|
-
"api[_ -]?key",
|
|
11440
|
-
"credential",
|
|
11441
|
-
"\u9274\u6743",
|
|
11442
|
-
"\u8BA4\u8BC1\u5931\u8D25",
|
|
11443
|
-
"\u51ED\u8BC1",
|
|
11444
|
-
"\u65E0\u6548\u7684\u5BC6\u94A5",
|
|
11445
|
-
"insufficient (balance|funds|quota)",
|
|
11446
|
-
"\u4F59\u989D\u4E0D\u8DB3",
|
|
11447
|
-
"\u6B20\u8D39",
|
|
11448
|
-
"billing",
|
|
11449
|
-
"payment required",
|
|
11450
|
-
"quota exceeded",
|
|
11451
|
-
"\u914D\u989D(\u4E0D\u8DB3|\u5DF2\u7528|\u7528\u5C3D)",
|
|
11452
|
-
"\u514D\u8D39\u989D\u5EA6",
|
|
11453
|
-
"model not found",
|
|
11454
|
-
"unknown model",
|
|
11455
|
-
"no such model",
|
|
11456
|
-
"\u6A21\u578B\u4E0D\u5B58\u5728",
|
|
11457
|
-
"\u65E0\u53EF\u7528\u6A21\u578B",
|
|
11458
|
-
"access denied",
|
|
11459
|
-
"permission denied",
|
|
11460
|
-
"context[_ -]length",
|
|
11461
|
-
"prompt (is )?too long",
|
|
11462
|
-
"\u4E0A\u4E0B\u6587(\u8D85|\u8FC7|\u957F\u5EA6)",
|
|
11463
|
-
"\u8F93\u5165\u8FC7\u957F",
|
|
11464
|
-
"token limit"
|
|
11465
|
-
]
|
|
11466
|
-
};
|
|
11467
|
-
var cachedCfg = null;
|
|
11468
|
-
var cachedAt = 0;
|
|
11469
|
-
async function getConfig2() {
|
|
11470
|
-
const now = Date.now();
|
|
11471
|
-
if (cachedCfg && now - cachedAt < 3e4) return cachedCfg;
|
|
11472
|
-
const res = await rpc("/auto-continue");
|
|
11473
|
-
const raw = res.ok && res.config && typeof res.config === "object" ? res.config : {};
|
|
11474
|
-
cachedCfg = { ...DEFAULTS, ...raw };
|
|
11475
|
-
cachedAt = now;
|
|
11476
|
-
return cachedCfg;
|
|
11477
|
-
}
|
|
11478
|
-
function compile(patterns) {
|
|
11479
|
-
return (Array.isArray(patterns) ? patterns : []).map((src) => {
|
|
11480
|
-
try {
|
|
11481
|
-
return new RegExp(src, "i");
|
|
11482
|
-
} catch {
|
|
11483
|
-
return null;
|
|
11484
|
-
}
|
|
11485
|
-
}).filter(Boolean);
|
|
11486
|
-
}
|
|
11487
|
-
function isPermanent(text, cfg) {
|
|
11488
|
-
return compile(cfg.permanentPatterns).some((re) => re.test(text));
|
|
11489
|
-
}
|
|
11490
|
-
function isCancelled(text) {
|
|
11491
|
-
return /\bcancel+ed?\b|已取消|已停止|手动停止/i.test(text);
|
|
11492
|
-
}
|
|
11493
|
-
function trailingBanner() {
|
|
11494
|
-
const banners = [...document.querySelectorAll(`${BANNER_SEL}:not([data-zcodepro-ac])`)];
|
|
11495
|
-
if (!banners.length) return null;
|
|
11496
|
-
const rows = [...document.querySelectorAll('[data-testid^="v4-row-"]')];
|
|
11497
|
-
const lastRow = rows.length ? rows[rows.length - 1] : null;
|
|
11498
|
-
for (const b of banners) {
|
|
11499
|
-
const row = b.closest('[data-testid^="v4-row-"]');
|
|
11500
|
-
if (!row || !lastRow || row === lastRow) return b;
|
|
11501
|
-
}
|
|
11502
|
-
return null;
|
|
11503
|
-
}
|
|
11504
|
-
var continueTimes = [];
|
|
11505
|
-
function pruneTimes() {
|
|
11506
|
-
const cutoff = Date.now() - 30 * 60 * 1e3;
|
|
11507
|
-
continueTimes = continueTimes.filter((t2) => t2 >= cutoff);
|
|
11508
|
-
}
|
|
11509
|
-
function recentWithin(ms) {
|
|
11510
|
-
const cutoff = Date.now() - ms;
|
|
11511
|
-
return continueTimes.filter((t2) => t2 >= cutoff).length;
|
|
11512
|
-
}
|
|
11513
|
-
function sleep3(ms) {
|
|
11514
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
11515
|
-
}
|
|
11516
|
-
function fillComposer(text) {
|
|
11517
|
-
const input = document.querySelector(INPUT_SEL);
|
|
11518
|
-
if (!input) return false;
|
|
11519
|
-
const before = (input.textContent || "").length;
|
|
11520
|
-
input.focus();
|
|
11521
|
-
try {
|
|
11522
|
-
document.execCommand("insertText", false, text);
|
|
11523
|
-
} catch {
|
|
11524
|
-
}
|
|
11525
|
-
if ((input.textContent || "").length <= before) {
|
|
11526
|
-
input.dispatchEvent(new InputEvent("beforeinput", { bubbles: true, cancelable: true, inputType: "insertText", data: text }));
|
|
11527
|
-
input.dispatchEvent(new InputEvent("input", { bubbles: true, inputType: "insertText", data: text }));
|
|
11528
|
-
}
|
|
11529
|
-
return (input.textContent || "").length > before;
|
|
11530
|
-
}
|
|
11531
|
-
async function clickSend() {
|
|
11532
|
-
for (let i = 0; i < 10; i += 1) {
|
|
11533
|
-
const send = document.querySelector(SEND_SEL);
|
|
11534
|
-
if (send && !send.disabled) {
|
|
11535
|
-
send.click();
|
|
11536
|
-
return true;
|
|
11537
|
-
}
|
|
11538
|
-
await sleep3(200);
|
|
11539
|
-
}
|
|
11540
|
-
return false;
|
|
11541
|
-
}
|
|
11542
|
-
function delayFor(dense, cfg) {
|
|
11543
|
-
if (dense <= 1) return 3e3;
|
|
11544
|
-
const secs = Math.min(cfg.cooldownBaseSec * Math.pow(cfg.cooldownFactor || 2, dense - 2), cfg.cooldownMaxSec);
|
|
11545
|
-
return Math.round(secs * 1e3);
|
|
11546
|
-
}
|
|
11547
|
-
var inflight = false;
|
|
11548
|
-
async function tick6() {
|
|
11549
|
-
const banner = trailingBanner();
|
|
11550
|
-
if (!banner || inflight || document.querySelector(STOP_SEL)) return;
|
|
11551
|
-
inflight = true;
|
|
11552
|
-
try {
|
|
11553
|
-
const cfg = await getConfig2();
|
|
11554
|
-
if (cfg.enabled === false) return;
|
|
11555
|
-
const text = banner.innerText || "";
|
|
11556
|
-
if (isPermanent(text, cfg) || isCancelled(text)) {
|
|
11557
|
-
banner.dataset.zcodeproAc = "skip";
|
|
11558
|
-
return;
|
|
11559
|
-
}
|
|
11560
|
-
if (document.querySelector(STOP_SEL)) return;
|
|
11561
|
-
const input = document.querySelector(INPUT_SEL);
|
|
11562
|
-
if (!input || (input.textContent || "").trim()) return;
|
|
11563
|
-
pruneTimes();
|
|
11564
|
-
if (continueTimes.length >= (cfg.maxRetries || DEFAULTS.maxRetries)) {
|
|
11565
|
-
banner.dataset.zcodeproAc = "cap";
|
|
11566
|
-
return;
|
|
11567
|
-
}
|
|
11568
|
-
banner.dataset.zcodeproAc = "pending";
|
|
11569
|
-
await sleep3(delayFor(recentWithin(2 * 60 * 1e3), cfg));
|
|
11570
|
-
if (!banner.isConnected || document.querySelector(STOP_SEL)) {
|
|
11571
|
-
banner.dataset.zcodeproAc = "skip";
|
|
11572
|
-
return;
|
|
11573
|
-
}
|
|
11574
|
-
const input2 = document.querySelector(INPUT_SEL);
|
|
11575
|
-
const want = cfg.continueText || DEFAULT_CONTINUE_TEXT;
|
|
11576
|
-
const current2 = (input2 && input2.textContent || "").trim();
|
|
11577
|
-
if (current2 && !current2.includes(want.slice(0, 10))) {
|
|
11578
|
-
banner.dataset.zcodeproAc = "skip";
|
|
11579
|
-
return;
|
|
11580
|
-
}
|
|
11581
|
-
if (!current2 && !fillComposer(want)) {
|
|
11582
|
-
banner.dataset.zcodeproAc = "fail";
|
|
11583
|
-
return;
|
|
11584
|
-
}
|
|
11585
|
-
if (!await clickSend()) {
|
|
11586
|
-
banner.dataset.zcodeproAc = "fail";
|
|
11587
|
-
return;
|
|
11588
|
-
}
|
|
11589
|
-
banner.dataset.zcodeproAc = "1";
|
|
11590
|
-
continueTimes.push(Date.now());
|
|
11591
|
-
} finally {
|
|
11592
|
-
inflight = false;
|
|
11593
|
-
}
|
|
11594
|
-
}
|
|
11595
|
-
var STUCK_POLL_MS = 60 * 1e3;
|
|
11596
|
-
var stuckShown = /* @__PURE__ */ new Set();
|
|
11597
|
-
var stuckQueue = [];
|
|
11598
|
-
var stuckCardEl = null;
|
|
11599
|
-
async function stopAndContinue() {
|
|
11600
|
-
const stop = document.querySelector(STOP_SEL);
|
|
11601
|
-
if (stop) {
|
|
11602
|
-
stop.click();
|
|
11603
|
-
await sleep3(3e3);
|
|
11604
|
-
}
|
|
11605
|
-
const input = document.querySelector(INPUT_SEL);
|
|
11606
|
-
const want = cachedCfg && cachedCfg.continueText || DEFAULT_CONTINUE_TEXT;
|
|
11607
|
-
const current2 = (input && input.textContent || "").trim();
|
|
11608
|
-
if (current2 && !current2.includes(want.slice(0, 10))) return false;
|
|
11609
|
-
if (!current2 && !fillComposer(want)) return false;
|
|
11610
|
-
return clickSend();
|
|
11611
|
-
}
|
|
11612
|
-
function switchToTask(sessionId) {
|
|
11613
|
-
const row = document.querySelector(`[data-testid="task-item-${sessionId}"]`);
|
|
11614
|
-
if (!row) return false;
|
|
11615
|
-
row.click();
|
|
11616
|
-
return true;
|
|
11617
|
-
}
|
|
11618
|
-
function taskTitle(sessionId) {
|
|
11619
|
-
const row = document.querySelector(`[data-testid="task-item-${sessionId}"]`);
|
|
11620
|
-
const text = row ? (row.textContent || "").trim() : "";
|
|
11621
|
-
return text ? text.split("\n")[0].slice(0, 30) : String(sessionId).slice(0, 20) + "\u2026";
|
|
11622
|
-
}
|
|
11623
|
-
function dequeueStuck(task) {
|
|
11624
|
-
const i = stuckQueue.indexOf(task);
|
|
11625
|
-
if (i >= 0) stuckQueue.splice(i, 1);
|
|
11626
|
-
}
|
|
11627
|
-
function closeStuckCard() {
|
|
11628
|
-
if (stuckCardEl) {
|
|
11629
|
-
stuckCardEl.remove();
|
|
11630
|
-
stuckCardEl = null;
|
|
11631
|
-
}
|
|
11632
|
-
if (stuckQueue.length) setTimeout(showNextStuckCard, 500);
|
|
11633
|
-
}
|
|
11634
|
-
function showNextStuckCard() {
|
|
11635
|
-
if (stuckCardEl || !stuckQueue.length) return;
|
|
11636
|
-
const task = stuckQueue[0];
|
|
11637
|
-
const zh2 = isZhLocale();
|
|
11638
|
-
const mins = Math.round(task.ageSec / 60);
|
|
11639
|
-
const card = document.createElement("div");
|
|
11640
|
-
card.style.cssText = "position:fixed;right:16px;bottom:16px;z-index:2147483000;max-width:360px;padding:12px;border-radius:12px;border:1px solid var(--color-border, #666);background:var(--color-surface, #222);color:var(--color-foreground, #eee);font-size:13px;line-height:1.5;box-shadow:0 4px 24px rgba(0,0,0,.4)";
|
|
11641
|
-
const title = document.createElement("div");
|
|
11642
|
-
title.style.cssText = "font-weight:600;margin-bottom:4px";
|
|
11643
|
-
title.textContent = (zh2 ? "\u56DE\u5408\u7591\u4F3C\u5361\u6B7B" : "Turn appears stuck") + (stuckQueue.length > 1 ? `\uFF08\u961F\u5217\u4E2D\u8FD8\u6709 ${stuckQueue.length - 1} \u4E2A\uFF09` : "");
|
|
11644
|
-
const desc = document.createElement("div");
|
|
11645
|
-
desc.style.cssText = "opacity:.85";
|
|
11646
|
-
desc.textContent = zh2 ? `\u4EFB\u52A1\u201C${taskTitle(task.sessionId)}\u201D\u7684\u540E\u53F0\u4EFB\u52A1\u5DF2 ${mins} \u5206\u949F\u6CA1\u6709\u56DE\u62A5\u3002\u786E\u5B9E\u5728\u8DD1\u7684\u957F\u4EFB\u52A1\uFF08\u5982\u6253\u5305\uFF09\u70B9\u201C\u77E5\u9053\u4E86\u201D\u5373\u53EF\u3002` : `Task \u201C${taskTitle(task.sessionId)}\u201D has a background task silent for ${mins} min. Ignore for long-running builds.`;
|
|
11647
|
-
const row = document.createElement("div");
|
|
11648
|
-
row.style.cssText = "display:flex;gap:8px;margin-top:10px";
|
|
11649
|
-
const mkBtn = (label, primary) => {
|
|
11650
|
-
const b = document.createElement("button");
|
|
11651
|
-
b.type = "button";
|
|
11652
|
-
b.textContent = label;
|
|
11653
|
-
b.style.cssText = primary ? "cursor:pointer;border:none;border-radius:8px;padding:5px 12px;background:var(--color-brand, #4a7cf7);color:#fff;font-size:12px" : "cursor:pointer;border-radius:8px;padding:5px 12px;background:transparent;border:1px solid var(--color-border, #666);color:inherit;font-size:12px";
|
|
11654
|
-
return b;
|
|
11655
|
-
};
|
|
11656
|
-
const jump = mkBtn(zh2 ? "\u8DF3\u8F6C\u4EFB\u52A1" : "Go to task", false);
|
|
11657
|
-
jump.addEventListener("click", () => {
|
|
11658
|
-
switchToTask(task.sessionId);
|
|
11659
|
-
});
|
|
11660
|
-
const fix = mkBtn(zh2 ? "\u7EE7\u7EED" : "Continue", true);
|
|
11661
|
-
fix.addEventListener("click", () => {
|
|
11662
|
-
fix.disabled = true;
|
|
11663
|
-
switchToTask(task.sessionId);
|
|
11664
|
-
void (async () => {
|
|
11665
|
-
await sleep3(1e3);
|
|
11666
|
-
const ok = await stopAndContinue();
|
|
11667
|
-
if (ok) {
|
|
11668
|
-
dequeueStuck(task);
|
|
11669
|
-
closeStuckCard();
|
|
11670
|
-
} else {
|
|
11671
|
-
fix.disabled = false;
|
|
11672
|
-
desc.textContent = zh2 ? "\u7EE7\u7EED\u5931\u8D25\uFF1A\u76EE\u6807\u4F1A\u8BDD\u53EF\u80FD\u4E0D\u5728\u4FA7\u680F\u89C6\u56FE\u91CC\uFF0C\u70B9\u201C\u8DF3\u8F6C\u4EFB\u52A1\u201D\u540E\u624B\u52A8\u53D1\u4E00\u53E5\u7EE7\u7EED\u3002" : "Failed to continue: use \u201CGo to task\u201D and send continue manually.";
|
|
11673
|
-
}
|
|
11674
|
-
})();
|
|
11675
|
-
});
|
|
11676
|
-
const dismiss = mkBtn(zh2 ? "\u77E5\u9053\u4E86" : "Dismiss", false);
|
|
11677
|
-
dismiss.addEventListener("click", () => {
|
|
11678
|
-
dequeueStuck(task);
|
|
11679
|
-
closeStuckCard();
|
|
11680
|
-
});
|
|
11681
|
-
row.append(jump, fix, dismiss);
|
|
11682
|
-
card.append(title, desc, row);
|
|
11683
|
-
(document.body || document.documentElement).append(card);
|
|
11684
|
-
stuckCardEl = card;
|
|
11685
|
-
}
|
|
11686
|
-
async function stuckTick() {
|
|
11687
|
-
const res = await rpc("/ac-stuck");
|
|
11688
|
-
if (!res.ok || !Array.isArray(res.tasks)) return;
|
|
11689
|
-
const cfg = await getConfig2();
|
|
11690
|
-
if (cfg.enabled === false) return;
|
|
11691
|
-
const threshold = (cfg.stuckAfterMin || DEFAULTS.stuckAfterMin) * 60;
|
|
11692
|
-
for (const task of res.tasks) {
|
|
11693
|
-
if (task.ageSec < threshold || (task.silenceSec ?? 0) < threshold || stuckShown.has(task.taskId)) continue;
|
|
11694
|
-
stuckShown.add(task.taskId);
|
|
11695
|
-
stuckQueue.push(task);
|
|
11696
|
-
}
|
|
11697
|
-
stuckQueue.sort((a, b) => b.ageSec - a.ageSec);
|
|
11698
|
-
showNextStuckCard();
|
|
11699
|
-
}
|
|
11700
|
-
function startAutoContinue() {
|
|
11701
|
-
if (typeof document === "undefined") return;
|
|
11702
|
-
window.addEventListener("zcodepro:config-changed", () => {
|
|
11703
|
-
cachedAt = 0;
|
|
11704
|
-
});
|
|
11705
|
-
setInterval(() => {
|
|
11706
|
-
tick6().catch(() => {
|
|
11707
|
-
});
|
|
11708
|
-
}, SCAN_MS2);
|
|
11709
|
-
setInterval(() => {
|
|
11710
|
-
stuckTick().catch(() => {
|
|
11711
|
-
});
|
|
11712
|
-
}, STUCK_POLL_MS);
|
|
11713
|
-
}
|
|
11714
|
-
|
|
11715
11289
|
// src/inject/features/toolbar-icons.js
|
|
11716
11290
|
var HIDE_CLASS = "zcodepro-tb-hidden";
|
|
11717
11291
|
var SYNC_DEBOUNCE_MS = 150;
|
|
@@ -12435,10 +12009,6 @@
|
|
|
12435
12009
|
startPluginCardRetry();
|
|
12436
12010
|
} catch {
|
|
12437
12011
|
}
|
|
12438
|
-
try {
|
|
12439
|
-
startAutoContinue();
|
|
12440
|
-
} catch {
|
|
12441
|
-
}
|
|
12442
12012
|
try {
|
|
12443
12013
|
startToolbarIcons();
|
|
12444
12014
|
} catch {
|