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.
Files changed (63) hide show
  1. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/PKG-INFO +1 -3
  2. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/README.md +0 -2
  3. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/dist/inject.js +18 -448
  4. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/package.json +1 -1
  5. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/helper.mjs +0 -108
  6. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/core.js +0 -18
  7. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/settings-dialog.js +1 -81
  8. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/index.js +0 -2
  9. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/zcode_pro/__init__.py +1 -1
  10. zcode_pro-1.6.0/src/inject/features/auto-continue.js +0 -325
  11. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/.gitignore +0 -0
  12. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/LICENSE +0 -0
  13. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/README.en.md +0 -0
  14. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/bin/zcode-pro +0 -0
  15. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/bin/zcode-pro.cmd +0 -0
  16. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/bin/zcode-pro.mjs +0 -0
  17. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/bin/zcode-pro.vbs +0 -0
  18. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/cli.mjs +0 -0
  19. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/pyproject.toml +0 -0
  20. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/cdp.mjs +0 -0
  21. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/main.mjs +0 -0
  22. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/paths.mjs +0 -0
  23. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/pickFolder.mjs +0 -0
  24. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/settings.mjs +0 -0
  25. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/setup.mjs +0 -0
  26. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/skill-stats.mjs +0 -0
  27. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/taskIndex.mjs +0 -0
  28. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/taskOrder.mjs +0 -0
  29. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/version.mjs +0 -0
  30. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/wallpaper.mjs +0 -0
  31. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/host/webdav.mjs +0 -0
  32. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/alias-migration.js +0 -0
  33. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/alias.js +0 -0
  34. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/composer-provider.js +0 -0
  35. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/copy-path.js +0 -0
  36. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/file-menu.js +0 -0
  37. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/idle-reclaim.js +0 -0
  38. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/image-menu.js +0 -0
  39. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/newtab-panels.js +0 -0
  40. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/open-folder.js +0 -0
  41. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/pinned-collapse.js +0 -0
  42. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/plugin-card-retry.js +0 -0
  43. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/plugin-updates.js +0 -0
  44. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/project-menu.js +0 -0
  45. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/relocate-dialog.js +0 -0
  46. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/sandbox-reclaim.js +0 -0
  47. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/session-switch.js +0 -0
  48. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/settings-entry.js +0 -0
  49. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/status-bar.js +0 -0
  50. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/styles.js +0 -0
  51. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/table-copy.js +0 -0
  52. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/task-order.js +0 -0
  53. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/theme.js +0 -0
  54. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/title-gen.js +0 -0
  55. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/title-lock.js +0 -0
  56. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/toolbar-icons.js +0 -0
  57. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/turn-usage.js +0 -0
  58. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/ws-rows.js +0 -0
  59. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/features/ws-running.js +0 -0
  60. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/provider-fields.js +0 -0
  61. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/src/inject/ui.js +0 -0
  62. {zcode_pro-1.6.0 → zcode_pro-1.6.1}/zcode_pro/__main__.py +0 -0
  63. {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.0
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 tick7 = () => {
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(tick7, 120);
3447
+ setTimeout(tick6, 120);
3466
3448
  };
3467
- tick7();
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 tick7 = () => showFile(files[nextIdx(files.length)], "library");
4892
- wpTickFn = tick7;
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
- tick7();
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 tick7 = () => showFile(files[nextIdx(files.length)], "folder");
4920
- wpTickFn = tick7;
4921
- tick7();
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, tick7) => {
5011
- regionState[region] = { sig, image, tick: tick7, timer: null, interval: 0 };
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 tick7 = async () => {
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 tick7();
5221
+ void tick6();
5240
5222
  }, 1500);
5241
- void tick7();
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, autoContinue: paneAutoContinue, debug: paneDebug };
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 tick7 = () => {
10729
+ const tick6 = () => {
10858
10730
  if (document.hidden) {
10859
- mapRefreshTimer = setTimeout(tick7, 1e4);
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(tick7, MAP_REFRESH_MS);
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 {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zcode-pro",
3
- "version": "1.6.0",
3
+ "version": "1.6.1",
4
4
  "description": "ZCode Pro — ZCode 桌面版增强工具:壁纸引擎(图片/视频/网页)、皮肤主题、会话快捷切换、状态栏统计等二十余项界面与体验增强;不修改客户端文件,用 ZCode Pro 快捷方式启动即可生效。",
5
5
  "type": "module",
6
6
  "bin": {