zcode-pro 1.4.0 → 1.5.0

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/dist/inject.js CHANGED
@@ -114,7 +114,7 @@
114
114
  agentsSave: "\u4FDD\u5B58",
115
115
  agentsSaved: "\u5168\u5C40\u63D0\u793A\u8BCD\u5DF2\u4FDD\u5B58",
116
116
  agentsLoadFailed: "\u8BFB\u53D6\u5168\u5C40\u63D0\u793A\u8BCD\u5931\u8D25",
117
- proxyDesc: "\u4E3A ZCode Pro \u672C\u5730\u52A9\u624B\u53D1\u8D77\u7684\u7F51\u7EDC\u8BBF\u95EE\u8BBE\u7F6E HTTP \u4EE3\u7406\uFF1A\u63D2\u4EF6\u5E02\u573A\u7684\u66F4\u65B0\u4E0E\u5B89\u88C5\u3001\u63D2\u4EF6\u4F9D\u8D56\u8F6F\u4EF6\u7684\u5B89\u88C5\u4E0E\u5347\u7EA7\u3001WebDAV \u540C\u6B65\u90FD\u53EF\u8D70\u8BE5\u4EE3\u7406\uFF0C\u7528\u4E0B\u65B9\u5F00\u5173\u9009\u62E9\u751F\u6548\u8303\u56F4\u3002\u4E0D\u5F71\u54CD ZCode \u5E94\u7528\u672C\u8EAB\u4E0E\u6A21\u578B\u8BF7\u6C42\uFF0C\u4FDD\u5B58\u540E\u7ACB\u5373\u751F\u6548\u3002",
117
+ proxyDesc: "\u4E3A ZCode Pro \u672C\u5730\u52A9\u624B\u53D1\u8D77\u7684\u7F51\u7EDC\u8BBF\u95EE\u8BBE\u7F6E HTTP \u4EE3\u7406\uFF1A\u63D2\u4EF6\u5E02\u573A\u7684\u66F4\u65B0\u4E0E\u5B89\u88C5\u3001\u63D2\u4EF6\u4F9D\u8D56\u8F6F\u4EF6\u7684\u5B89\u88C5\u4E0E\u5347\u7EA7\u3001WebDAV \u540C\u6B65\u90FD\u53EF\u8D70\u8BE5\u4EE3\u7406\uFF0C\u7528\u4E0B\u65B9\u5F00\u5173\u9009\u62E9\u751F\u6548\u8303\u56F4\u3002\u4E0D\u5F71\u54CD ZCode \u5E94\u7528\u672C\u8EAB\u4E0E\u6A21\u578B\u8BF7\u6C42\u3002",
118
118
  proxyPlaceholder: "http://127.0.0.1:7890",
119
119
  proxySave: "\u4FDD\u5B58",
120
120
  proxySaved: "\u4EE3\u7406\u8BBE\u7F6E\u5DF2\u4FDD\u5B58",
@@ -128,7 +128,7 @@
128
128
  proxyScopeDeps: "\u63D2\u4EF6\u4F9D\u8D56\u8F6F\u4EF6",
129
129
  proxyScopeDepsDesc: "headroom \u4E0E rtk \u7684\u5B89\u88C5\u3001\u68C0\u67E5\u66F4\u65B0\u4E0E\u5347\u7EA7\uFF08pip \u4E0E GitHub \u4E0B\u8F7D\uFF09\u8D70\u4EE3\u7406\u3002",
130
130
  proxyScopeSync: "\u540C\u6B65",
131
- proxyScopeSyncDesc: "WebDAV \u4E0A\u4F20\u4E0E\u4E0B\u8F7D\u8D70\u4EE3\u7406\u3002\u9ED8\u8BA4\u5173\u95ED\uFF1A\u575A\u679C\u4E91\u7B49\u56FD\u5185\u7F51\u76D8\u76F4\u8FDE\u5373\u53EF\uFF0C\u4EE3\u7406\u505C\u4E86\u540C\u6B65\u4F1A\u8DDF\u7740\u5931\u8D25\u3002",
131
+ proxyScopeSyncDesc: "WebDAV \u4E0A\u4F20\u4E0E\u4E0B\u8F7D\u8D70\u4EE3\u7406\u3002",
132
132
  tabSync: "\u540C\u6B65",
133
133
  tabDebug: "\u8C03\u8BD5",
134
134
  testNoSessionHint: "\u9009\u62E9\u201C\u8DDF\u968F\u5F53\u524D\u4F1A\u8BDD[\u5F53\u524D\u6A21\u578B]\u201D\u65F6\uFF0C\u9009\u62E9\u4E0A\u6B21\u4F1A\u8BDD\u4E2D\u4F7F\u7528\u7684\u4F9B\u5E94\u5546[\u6A21\u578B]",
@@ -215,13 +215,13 @@
215
215
  defaultValue: "\u9ED8\u8BA4",
216
216
  resetDefault: "\u6062\u590D\u9ED8\u8BA4",
217
217
  featureProjectMenu: "\u9879\u76EE\u83DC\u5355\u589E\u5F3A",
218
- featureProjectMenuDesc: "\u9879\u76EE\u201C\u66F4\u591A\u201D\u83DC\u5355\u4E2D\u7684\u81EA\u5B9A\u4E49\u522B\u540D\u3001\u5207\u6362\u6587\u4EF6\u5939\u3001\u6253\u5F00\u6587\u4EF6\u5939\u4E0E\u590D\u5236\u8DEF\u5F84\uFF08\u522B\u540D\u540C\u65F6\u4F5C\u7528\u4E8E\u4FA7\u8FB9\u680F\u663E\u793A\uFF09\u3002",
218
+ featureProjectMenuDesc: "\u9879\u76EE\u66F4\u591A\u83DC\u5355\uFF1A\u6253\u5F00\u6587\u4EF6\u5939\u4E0E\u590D\u5236\u8DEF\u5F84\uFF08\u522B\u540D\u4E0E\u5207\u6362\u6587\u4EF6\u5939\u5DF2\u505C\u7528\uFF09\u3002",
219
219
  featureTaskOrder: "\u4FA7\u8FB9\u680F\u4F1A\u8BDD\u62D6\u52A8\u6392\u5E8F",
220
- featureTaskOrderDesc: "\u8BA9\u7F6E\u9876\u3001\u9879\u76EE\u4E0E\u5206\u7EC4\u4E2D\u7684\u4F1A\u8BDD\u62D6\u52A8\u540E\u8BB0\u4F4F\u987A\u5E8F\uFF0C\u5237\u65B0\u540E\u4FDD\u6301\u3002",
220
+ featureTaskOrderDesc: "\u62D6\u52A8\u8C03\u6574\u7F6E\u9876\u3001\u9879\u76EE\u4E0E\u5206\u7EC4\u4E2D\u7684\u4F1A\u8BDD\u987A\u5E8F\uFF0C\u91CD\u542F\u540E\u4E0D\u53D8\u3002",
221
221
  featureSessionSwitch: "\u4F1A\u8BDD\u5FEB\u6377\u5207\u6362",
222
- featureSessionSwitchDesc: "{last} \u5728\u5F53\u524D\u4E0E\u4E0A\u6B21\u4F1A\u8BDD\u95F4\u6765\u56DE\u5207\u6362\uFF1B\u6309\u4F4F alt \u518D\u6309 {prev}/{next} \u5F39\u51FA\u6700\u8FD1\u4F1A\u8BDD\u5217\u8868\u524D\u540E\u9009\u62E9\uFF08\u521D\u59CB 10 \u6761\uFF0C{next} \u5230\u5E95\u518D\u52A0\u8F7D 5 \u6761\uFF09\uFF0C{recent} \u76F4\u63A5\u6253\u5F00\u6700\u8FD1 10 \u6761\uFF0C{attention} \u6253\u5F00\u8FD0\u884C\u4E2D\u4E0E\u8FD0\u884C\u5B8C\u672A\u67E5\u770B\u7684\u4EFB\u52A1\uFF1B\u65B9\u5411\u952E\u540C\u6837\u53EF\u9009\uFF0CEnter \u6216\u677E\u5F00 alt \u5207\u6362\uFF08\u7C7B alt+tab\uFF09",
222
+ featureSessionSwitchDesc: "{last} \u6765\u56DE\u4E0A\u6B21\u4F1A\u8BDD\uFF1Balt+\u65B9\u5411\u952E/\u5FEB\u6377\u952E\u9009\u6700\u8FD1\u4F1A\u8BDD\uFF1B\u952E\u4F4D\u53EF\u6539",
223
223
  featureTitleLock: "\u91CD\u547D\u540D\u4F1A\u8BDD\u540D\u9501\u5B9A",
224
- featureTitleLockDesc: "\u624B\u52A8\u91CD\u547D\u540D\u8FC7\u7684\u4F1A\u8BDD\u4E0D\u518D\u88AB\u81EA\u52A8\u6807\u9898\u8986\u76D6\uFF1A\u4F1A\u8BDD\u6709\u65B0\u56DE\u7B54\u540E\u754C\u9762\u53EF\u80FD\u6539\u663E\u81EA\u52A8\u6807\u9898\uFF0C\u91CD\u542F\u540E\u53C8\u53D8\u56DE\uFF0C\u672C\u529F\u80FD\u8BA9\u4FA7\u680F\u59CB\u7EC8\u663E\u793A\u91CD\u547D\u540D\u540E\u7684\u540D\u5B57\u3002",
224
+ featureTitleLockDesc: "\u624B\u52A8\u91CD\u547D\u540D\u8FC7\u7684\u4F1A\u8BDD\u4E0D\u88AB\u81EA\u52A8\u6807\u9898\u8986\u76D6\uFF0C\u4FA7\u680F\u59CB\u7EC8\u663E\u793A\u91CD\u547D\u540D\u540E\u7684\u540D\u5B57\u3002",
225
225
  tabTitleGen: "\u4EFB\u52A1\u540D\u63D0\u793A\u8BCD",
226
226
  titleGenShortDesc: "\u65B0\u4F1A\u8BDD\u5F00\u59CB\u4F5C\u7B54\u65F6\uFF0C\u6309\u6240\u9009\u4F9B\u5E94\u5546\u4E0E\u63D0\u793A\u8BCD\u751F\u6210\u4EFB\u52A1\u540D\u5E76\u6309\u624B\u52A8\u91CD\u547D\u540D\u4FDD\u5B58\uFF0C\u5B98\u65B9\u81EA\u52A8\u6807\u9898\u4E0D\u518D\u8986\u76D6\u3002",
227
227
  titleGenEnabled: "\u542F\u7528",
@@ -247,7 +247,7 @@
247
247
  titleGenTestOk: "\u751F\u6210\u7ED3\u679C\uFF1A",
248
248
  titleGenTestFailed: "\u751F\u6210\u5931\u8D25",
249
249
  featureWsRunning: "\u6298\u53E0\u65F6\u4EFB\u52A1\u8FD0\u884C\u4E2D\u63D0\u793A",
250
- featureWsRunningDesc: "\u6709\u4F1A\u8BDD\u5728\u8FD0\u884C\u65F6\uFF0C\u6298\u53E0\u7684\u9879\u76EE\u4E0E\u201C\u4EFB\u52A1\u201D\u201C\u5DF2\u7F6E\u9876\u201D\u7B49\u5206\u533A\u5934\u663E\u793A\u4E0E\u4EFB\u52A1\u8FD0\u884C\u4E2D\u540C\u6B3E\u7684\u52A0\u8F7D\u56FE\u6807\uFF0C\u5168\u90E8\u7ED3\u675F\u540E\u6D88\u5931\u3002",
250
+ featureWsRunningDesc: "\u6709\u4F1A\u8BDD\u8FD0\u884C\u65F6\uFF0C\u6298\u53E0\u7684\u9879\u76EE\u4E0E\u4EFB\u52A1\u5206\u533A\u5934\u663E\u793A\u52A0\u8F7D\u56FE\u6807\uFF0C\u5168\u90E8\u7ED3\u675F\u6D88\u5931\u3002",
251
251
  tabPerformance: "\u6027\u80FD",
252
252
  perfDesc: "ZCode \u4E3A\u6BCF\u4E2A\u6253\u5F00\u8FC7\u7684\u9879\u76EE\u5E38\u9A7B\u4E00\u4E2A\u4F1A\u8BDD\u8FDB\u7A0B\uFF0C\u5E94\u7528\u81EA\u8EAB\u4E0D\u4F1A\u56DE\u6536\uFF0C\u9879\u76EE\u591A\u4E86\u5185\u5B58\u5360\u7528\u5C31\u9AD8\u3002\u5F00\u542F\u540E\uFF0C\u957F\u65F6\u95F4\u672A\u4F7F\u7528\u4E14\u6CA1\u6709\u4EFB\u52A1\u5728\u8DD1\u7684\u9879\u76EE\u4F1A\u88AB\u81EA\u52A8\u91CA\u653E\uFF1A\u4F1A\u8BDD\u8BB0\u5F55\u4E0D\u53D7\u5F71\u54CD\uFF0C\u518D\u6B21\u6253\u5F00\u65F6\u81EA\u52A8\u6062\u590D\uFF0C\u4EC5\u9996\u6B21\u56DE\u590D\u6709\u51E0\u79D2\u7B49\u5F85\u3002\u6B63\u5728\u4F7F\u7528\u7684\u9879\u76EE\u3001\u8FD0\u884C\u4E2D\u7684\u4F1A\u8BDD\u4E0E\u540E\u53F0\u547D\u4EE4\u3001\u5B9A\u65F6\u4EFB\u52A1\u90FD\u4E0D\u4F1A\u88AB\u56DE\u6536\u3002\u540E\u53F0\u547D\u4EE4\u68C0\u6D4B\u4F9D\u8D56\u7CFB\u7EDF\u8FDB\u7A0B\u4FE1\u606F\uFF08Linux / macOS / Windows \u5404\u8D70\u7CFB\u7EDF\u81EA\u5E26\u5DE5\u5177\uFF09\uFF0C\u68C0\u6D4B\u4E0D\u53EF\u7528\u65F6\u529F\u80FD\u81EA\u52A8\u505C\u7528\u3002",
253
253
  featureIdleReclaim: "\u7A7A\u95F2\u9879\u76EE\u5185\u5B58\u56DE\u6536",
@@ -257,17 +257,17 @@
257
257
  idleReclaimStartupHint: "\u5E94\u7528\u542F\u52A8\u4F1A\u4E3A\u6BCF\u4E2A\u6062\u590D\u7684\u9879\u76EE\u9884\u70ED\u8FDB\u7A0B\uFF0C\u5230\u70B9\u628A\u672A\u4F7F\u7528\u7684\u9879\u76EE\u4E00\u6B21\u6536\u6389\uFF1B0 = \u542F\u52A8\u540E\u7ACB\u5373\u56DE\u6536\uFF0C\u8BE5\u6B21\u4E0D\u53D7\u4E0A\u4E00\u9879\u7A7A\u95F2\u65F6\u957F\u9650\u5236",
258
258
  idleReclaimUnit: "\u5206\u949F",
259
259
  featureToolbarIcons: "\u4FA7\u680F\u83DC\u5355\u5E76\u5165\u9876\u680F",
260
- featureToolbarIconsDesc: "\u628A\u4FA7\u8FB9\u680F\u9876\u90E8\u7684\u201C\u65B0\u5EFA\u4EFB\u52A1 / \u641C\u7D22 / \u81EA\u52A8\u5316 / \u63D2\u4EF6\u5E02\u573A\u201D\u6536\u6210\u9876\u90E8\u5BFC\u822A\u680F\uFF08\u540E\u9000/\u524D\u8FDB\u65C1\uFF09\u7684\u56FE\u6807\u6309\u94AE\uFF1A\u60AC\u505C\u663E\u793A\u540D\u79F0\uFF0C\u5BF9\u5E94\u754C\u9762\u6253\u5F00\u65F6\u9AD8\u4EAE\uFF0C\u5FEB\u6377\u952E\u7167\u5E38\u53EF\u7528\uFF1B\u4FA7\u8FB9\u680F\u539F\u83DC\u5355\u9690\u85CF\u3002",
260
+ featureToolbarIconsDesc: "\u65B0\u5EFA\u4EFB\u52A1/\u641C\u7D22/\u81EA\u52A8\u5316/\u63D2\u4EF6\u5E02\u573A\u6536\u6210\u9876\u680F\u56FE\u6807\u6309\u94AE\u3002",
261
261
  tbNewTask: "\u65B0\u5EFA\u4EFB\u52A1",
262
262
  tbSearch: "\u641C\u7D22",
263
263
  tbAutomations: "\u81EA\u52A8\u5316",
264
264
  tbPluginStore: "\u63D2\u4EF6\u5E02\u573A",
265
265
  featurePinnedCollapse: "\u5DF2\u7F6E\u9876\u5206\u533A\u53EF\u6298\u53E0",
266
- featurePinnedCollapseDesc: "\u4FA7\u8FB9\u680F\u201C\u5DF2\u7F6E\u9876\u201D\u6807\u9898\u53EF\u70B9\u51FB\u6298\u53E0/\u5C55\u5F00\u5176\u4EFB\u52A1\u5217\u8868\uFF08\u4E0E\u201C\u9879\u76EE\u201D\u201C\u5206\u7EC4\u201D\u5206\u533A\u4E00\u81F4\uFF09\uFF0C\u72B6\u6001\u8BB0\u4F4F\u3002",
266
+ featurePinnedCollapseDesc: "\u4FA7\u8FB9\u680F\u5DF2\u7F6E\u9876\u6807\u9898\u53EF\u70B9\u51FB\u6298\u53E0/\u5C55\u5F00\u5176\u4EFB\u52A1\u5217\u8868\u3002",
267
267
  featureSandboxReclaim: "\u63D2\u4EF6\u754C\u9762\u6C99\u7BB1\u56DE\u6536",
268
- featureSandboxReclaimDesc: "\u63D2\u4EF6\u5361\u7247\u6C99\u7BB1\u6570\u91CF\u8FBE\u5230\u4E0A\u9650\u65F6\u81EA\u52A8\u91CA\u653E\u6700\u65E9\u521B\u5EFA\u7684\uFF08\u6B63\u5728\u67E5\u770B\u7684\u6392\u6700\u540E\uFF09\uFF0C\u907F\u514D 64 \u4E2A\u540D\u989D\u8017\u5C3D\u540E\u65B0\u5361\u7247\u6253\u4E0D\u5F00\uFF1B\u88AB\u91CA\u653E\u7684\u65E7\u5361\u7247\u91CD\u65B0\u6253\u5F00\u6240\u5728\u4F1A\u8BDD\u5373\u6062\u590D\uFF08\u9884\u7B97\u53EF\u5728\u914D\u7F6E\u6587\u4EF6 sandboxReclaimBudget \u8C03\u6574\uFF09\u3002",
268
+ featureSandboxReclaimDesc: "\u6C99\u7BB1\u6EE1 64 \u4E2A\u65F6\u81EA\u52A8\u91CA\u653E\u6700\u65E9\u7684\uFF0C\u65B0\u5361\u7247\u4E0D\u518D\u6253\u4E0D\u5F00\uFF1B\u65E7\u5361\u91CD\u65B0\u6253\u5F00\u6240\u5728\u4F1A\u8BDD\u5373\u53EF\u6062\u590D\u3002",
269
269
  featurePluginCardRetry: "\u63D2\u4EF6\u5361\u7247\u81EA\u52A8\u91CD\u8BD5",
270
- featurePluginCardRetryDesc: "\u56E0\u540D\u989D\u4E0A\u9650\u52A0\u8F7D\u5931\u8D25\u7684\u63D2\u4EF6\u5361\u7247\u81EA\u52A8\u70B9\u51FB\u201C\u91CD\u65B0\u52A0\u8F7D\u201D\uFF0C\u540D\u989D\u7A7A\u51FA\u540E\u81EA\u52A8\u6062\u590D\uFF0C\u65E0\u9700\u624B\u52A8\u8E72\u5B88\u3002",
270
+ featurePluginCardRetryDesc: "\u56E0\u540D\u989D\u4E0A\u9650\u52A0\u8F7D\u5931\u8D25\u7684\u63D2\u4EF6\u5361\u7247\u81EA\u52A8\u70B9\u51FB\u91CD\u65B0\u52A0\u8F7D\uFF0C\u540D\u989D\u7A7A\u51FA\u540E\u81EA\u52A8\u6062\u590D\u3002",
271
271
  visionCardUi: "\u601D\u8003\u8FC7\u7A0B\u663E\u793A\u8BC6\u56FE\u5361\u7247",
272
272
  pinnedToggleAria: "\u6298\u53E0/\u5C55\u5F00\u5DF2\u7F6E\u9876",
273
273
  sidebarProjectSpacingName: "\u9879\u76EE\u95F4\u8DDD",
@@ -290,7 +290,7 @@
290
290
  switcherAttentionHint: "\u8FD0\u884C\u4E2D / \u8FD0\u884C\u5B8C\u672A\u67E5\u770B\u7684\u4EFB\u52A1 \xB7 {prev} / {next} \u6216 \u2191 / \u2193 \u9009\u62E9\uFF0CEnter \u6216\u677E\u5F00 alt \u5207\u6362",
291
291
  switcherAttentionEmpty: "\u6682\u65E0\u8FD0\u884C\u4E2D\u6216\u672A\u67E5\u770B\u7684\u4EFB\u52A1",
292
292
  featureNewtabPanels: "\u65B0\u6807\u7B7E\u9875\u63D2\u4EF6\u9762\u677F\u5165\u53E3",
293
- featureNewtabPanelsDesc: "\u5B98\u65B9\u201C\u65B0\u6807\u7B7E\u9875\u201D\u53EA\u5217\u5B98\u65B9\u9762\u677F\u4E0E\u63A8\u8350\u7684\u5B98\u65B9\u63D2\u4EF6\uFF0C\u6B64\u529F\u80FD\u628A\u7B2C\u4E09\u65B9\u5E02\u573A\u63D2\u4EF6\uFF08headroom\u3001rtk \u7B49\uFF09\u7684\u9762\u677F\u5361\u7247\u52A0\u8FDB\u53BB\uFF0C\u70B9\u51FB\u5728\u4FA7\u8FB9\u9762\u677F\u6253\u5F00\u3002",
293
+ featureNewtabPanelsDesc: "\u65B0\u6807\u7B7E\u9875\u52A0\u5165\u7B2C\u4E09\u65B9\u63D2\u4EF6\uFF08headroom\u3001rtk \u7B49\uFF09\u7684\u9762\u677F\u5361\u7247\uFF0C\u70B9\u51FB\u5728\u4FA7\u8FB9\u9762\u677F\u6253\u5F00\u3002",
294
294
  ntpDescSuffix: "\u63D2\u4EF6\u9762\u677F",
295
295
  ntpNeedSession: "\u5148\u6253\u5F00\u4E00\u4E2A\u4EFB\u52A1\u4F1A\u8BDD\uFF0C\u518D\u4ECE\u65B0\u6807\u7B7E\u9875\u6253\u5F00\u63D2\u4EF6\u9762\u677F",
296
296
  featureStatusBarDesc: "\u63D0\u95EE\u8F93\u5165\u6846\u53F3\u4E0B\u89D2\u548C\u6BCF\u8F6E\u56DE\u7B54\u6700\u540E\u663E\u793A\u7EDF\u8BA1\u9879\u3002",
@@ -304,12 +304,12 @@
304
304
  themeBgRegionRight: "\u53F3\u4FA7\u8FB9\u680F",
305
305
  themeBgPane: "\u80CC\u666F\u56FE",
306
306
  themeSkinTitle: "\u76AE\u80A4",
307
- themeSkinDesc: "\u77E5\u540D\u7F16\u8F91\u5668\u4E3B\u9898\u914D\u8272\uFF0C\u660E\u6697\u4E24\u5957\u53D8\u4F53\u8DDF\u968F ZCode \u5F53\u524D\u660E\u6697\u81EA\u52A8\u5207\u6362\uFF1B\u9ED8\u8BA4\u4FDD\u6301 ZCode \u539F\u6837\uFF0C\u81EA\u5B9A\u4E49\u5728\u4E0B\u65B9\u81EA\u884C\u8C03\u8272\u3002",
307
+ themeSkinDesc: "\u77E5\u540D\u7F16\u8F91\u5668\u4E3B\u9898\u914D\u8272\uFF0C\u81EA\u52A8\u5339\u914D ZCode \u7684\u6D45\u8272 / \u6DF1\u8272\u6A21\u5F0F\uFF1B\u9ED8\u8BA4\u4FDD\u6301 ZCode \u539F\u6837\uFF0C\u81EA\u5B9A\u4E49\u5728\u4E0B\u65B9\u81EA\u884C\u8C03\u8272\u3002",
308
308
  themeSkinCustom: "\u81EA\u5B9A\u4E49",
309
309
  themeCustomTitle: "\u81EA\u5B9A\u4E49\u4E3B\u9898",
310
- themeCustomHint: "\u6539\u989C\u8272\u5373\u5B9E\u65F6\u751F\u6548\uFF08\u81EA\u52A8\u5207\u5230\u81EA\u5B9A\u4E49\u76AE\u80A4\uFF09\uFF1B\u6BCF\u5957\u542B\u660E\u3001\u6697\u4E24\u4E2A\u53D8\u4F53\uFF0C\u4E94\u4E2A\u951A\u70B9\u8272\u6D3E\u751F\u6574\u5957\u754C\u9762\u914D\u8272\u3002",
311
- themeCustomLight: "\u660E\u8272\u53D8\u4F53",
312
- themeCustomDark: "\u6697\u8272\u53D8\u4F53",
310
+ themeCustomHint: "\u6539\u989C\u8272\u5373\u5B9E\u65F6\u751F\u6548\uFF08\u81EA\u52A8\u5207\u5230\u81EA\u5B9A\u4E49\u76AE\u80A4\uFF09\uFF1B\u6D45\u8272\u3001\u6DF1\u8272\u5404\u914D\u4E00\u6B21\uFF0C\u9009\u597D 5 \u4E2A\u989C\u8272\u5373\u53EF\u751F\u6210\u6574\u5957\u754C\u9762\u914D\u8272\u3002",
311
+ themeCustomLight: "\u6D45\u8272",
312
+ themeCustomDark: "\u6DF1\u8272",
313
313
  themeCustomBg: "\u80CC\u666F",
314
314
  themeCustomCard: "\u5361\u7247",
315
315
  themeCustomFg: "\u6B63\u6587",
@@ -341,8 +341,15 @@
341
341
  themeBgFitContain: "\u9002\u5E94",
342
342
  themeBgFitFill: "\u62C9\u4F38",
343
343
  themeBgFitTile: "\u5E73\u94FA",
344
- themeVisibility: "\u80CC\u666F\u53EF\u89C1\u5EA6",
344
+ themeBgMask: "\u906E\u7F69\u4E0D\u900F\u660E\u5EA6",
345
+ themeBgMaskHint: "\u6570\u503C\u8D8A\u9AD8\uFF0C\u56FE\u7247\u8D8A\u5411\u4E3B\u9898\u80CC\u666F\u8272\u6DE1\u5316\uFF0C\u6587\u5B57\u5BF9\u6BD4\u8D8A\u6E05\u6670",
346
+ themeBgMaskHint2: "\u56FE\u7247\u5411\u4E3B\u9898\u80CC\u666F\u8272\u6DE1\u5316\u7684\u7A0B\u5EA6",
347
+ themeBgBlur: "\u56FE\u7247\u6A21\u7CCA",
348
+ themeBgPanel: "\u9762\u677F\u4E0D\u900F\u660E\u5EA6",
349
+ themeBgPanelHint: "\u4FA7\u680F\u3001\u9762\u677F\u4E0E\u6807\u7B7E\u680F\u7684\u4E0D\u900F\u660E\u7A0B\u5EA6\u3002\u8D8A\u4F4E\uFF0C\u900F\u51FA\u7684\u56FE\u7247\u8D8A\u591A\u3002",
345
350
  themeBgDeletedActive: "\u5F53\u524D\u80CC\u666F\u5DF2\u5220\u9664\uFF0C\u5DF2\u81EA\u52A8\u505C\u7528\u80CC\u666F",
351
+ tableCopyBtn: "\u590D\u5236\u8868\u683C",
352
+ tableCopied: "\u8868\u683C\u5DF2\u590D\u5236",
346
353
  sbItemCtx: "\u4E0A\u4E0B\u6587\u5360\u7528",
347
354
  sbItemQuestions: "\u63D0\u95EE\u6B21\u6570",
348
355
  sbMaster: "\u542F\u7528\u7EDF\u8BA1",
@@ -395,7 +402,11 @@
395
402
  featureFileActions: "\u6587\u4EF6\u83DC\u5355\u589E\u5F3A",
396
403
  featureFileActionsDesc: "\u5728\u4F1A\u8BDD\u4E2D\u6587\u4EF6\u94FE\u63A5\u7684\u53F3\u952E\u83DC\u5355\u91CC\u65B0\u589E\u201C\u9ED8\u8BA4\u5E94\u7528\u6253\u5F00\u201D\u4E0E\u201C\u6253\u5F00\u6240\u5728\u76EE\u5F55\u201D\u3002",
397
404
  featureImageCopy: "\u56FE\u7247\u53F3\u952E\u590D\u5236",
405
+ featureTableCopy: "\u590D\u5236\u8868\u683C",
406
+ featureComposerProvider: "\u6A21\u578B\u540D\u663E\u793A\u4F9B\u5E94\u5546",
398
407
  featureImageCopyDesc: "\u53F3\u952E\u4F1A\u8BDD\u4E2D\u7684\u56FE\u7247\u6216\u70B9\u51FB\u653E\u5927\u7684\u9884\u89C8\u56FE\uFF0C\u53EF\u5C06\u56FE\u7247\u590D\u5236\u5230\u526A\u8D34\u677F\u3002",
408
+ featureTableCopyDesc: "\u8868\u683C\u5DE5\u5177\u6761\u65B0\u589E\u590D\u5236\u8868\u683C\uFF0C\u7C98\u8D34\u8FDB Excel / \u5BCC\u6587\u672C\u7F16\u8F91\u5668\u5373\u4E3A\u5E72\u51C0\u8868\u683C\u3002",
409
+ featureComposerProviderDesc: "\u6A21\u578B\u540D\u524D\u663E\u793A\u4F9B\u5E94\u5546\u540D\uFF08\u5982 BigModel-Max1 / glm-5.3\uFF09\uFF0C\u533A\u5206\u540C\u540D\u6A21\u578B\u3002",
399
410
  imageCopy: "\u590D\u5236\u56FE\u7247",
400
411
  imageCopied: "\u56FE\u7247\u5DF2\u590D\u5236\u5230\u526A\u8D34\u677F",
401
412
  imageCopyFailed: "\u590D\u5236\u56FE\u7247\u5931\u8D25",
@@ -418,7 +429,7 @@
418
429
  pluginsUpdatesAvailable: "zcode-plugins \u6709 {n} \u4E2A\u63D2\u4EF6\u53EF\u66F4\u65B0\uFF08ZCode Pro \u8BBE\u7F6E \u2192 \u529F\u80FD\uFF09",
419
430
  pluginsAutoUpdated: "zcode-plugins \u63D2\u4EF6\u5DF2\u66F4\u65B0",
420
431
  tabVision: "Vision",
421
- 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\u6539\u52A8\u81EA\u52A8\u4FDD\u5B58\u3002",
432
+ 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",
422
433
  visionEnabled: "\u542F\u7528",
423
434
  visionForceIntercept: "\u4E3B\u6A21\u578B\u80FD\u770B\u56FE\u4E5F\u62E6\u622A",
424
435
  visionMode: "\u94FE\u6A21\u5F0F",
@@ -449,14 +460,14 @@
449
460
  visionCompressKBHint: "\u8D85\u8FC7\u8BE5\u5927\u5C0F\u7684\u56FE\u5148\u538B\u7F29\u518D\u8BC6\u522B\uFF08\u6700\u957F\u8FB9 2000\u3001JPEG\uFF09\uFF1B0 = \u4E0D\u538B\u7F29",
450
461
  visionLoadFailed: "\u8BFB\u53D6\u89C6\u89C9\u4EE3\u7406\u914D\u7F6E\u5931\u8D25",
451
462
  tabRtk: "rtk",
452
- rtkDesc: "rtk \u63D2\u4EF6\uFF1A\u628A\u5E38\u89C1\u5F00\u53D1\u547D\u4EE4\u7684\u8F93\u51FA\u538B\u7F29 60-90% \u518D\u8FDB\u5165\u4E0A\u4E0B\u6587\uFF08/rtk-* \u547D\u4EE4\u7F16\u8F91\u540C\u4E00\u914D\u7F6E\uFF09\u3002\u6539\u52A8\u81EA\u52A8\u4FDD\u5B58\u5E76\u7ACB\u5373\u751F\u6548\u3002",
463
+ rtkDesc: "rtk \u63D2\u4EF6\uFF1A\u628A\u5E38\u89C1\u5F00\u53D1\u547D\u4EE4\u7684\u8F93\u51FA\u538B\u7F29 60-90% \u518D\u8FDB\u5165\u4E0A\u4E0B\u6587\uFF08/rtk-* \u547D\u4EE4\u7F16\u8F91\u540C\u4E00\u914D\u7F6E\uFF09\u3002",
453
464
  rtkEnabled: "\u542F\u7528",
454
465
  rtkNotInstalled: "\u672A\u5B89\u88C5 rtk \u672C\u4F53\uFF1B\u5B89\u88C5\u540E\u4EE5\u4E0B\u8BBE\u7F6E\u751F\u6548\uFF08\u4F1A\u8BDD\u91CC\u6267\u884C /rtk-setup \u4E5F\u53EF\u4EE5\uFF09",
455
466
  rtkInstallBin: "\u5B89\u88C5 rtk \u672C\u4F53",
456
467
  rtkBinInstalled: "rtk \u672C\u4F53\u5DF2\u5B89\u88C5\uFF1BPATH \u9700\u6CE8\u9500\u91CD\u767B\u540E\u5BF9\u4F1A\u8BDD\u751F\u6548\uFF0C\u63D2\u4EF6\u94A9\u5B50\u5373\u65F6\u751F\u6548",
457
468
  rtkWhitelistTitle: "\u767D\u540D\u5355\uFF08\u4E0D\u538B\u7F29\u76F4\u63A5\u653E\u884C\uFF09",
458
469
  rtkBuiltinLabel: "\u5185\u7F6E\u653E\u884C\uFF08\u53EA\u8BFB\uFF0C\u968F\u63D2\u4EF6\u66F4\u65B0\uFF09\uFF1A",
459
- rtkWhitelistDesc: "\u6BCF\u6761 name\uFF08\u5982 docker\uFF09\u6216 git:name\uFF08\u5982 git:clone\uFF09\u3002\u8F93\u51FA\u6781\u5C0F\u6216\u7EAF\u526F\u4F5C\u7528\u7684\u547D\u4EE4\u65E0\u9700\u538B\u7F29\uFF0C\u52A0\u5165\u540E\u4E0D\u518D\u538B\u7F29\uFF1B\u5185\u7F6E\u7684 git add/commit/push\u3001mkdir/cp \u7B49\u4E0D\u53EF\u79FB\u9664\u3002\u5220\u9664\u672C\u6587\u4EF6\u5373\u6062\u590D\u9ED8\u8BA4\u3002",
470
+ rtkWhitelistDesc: "\u6BCF\u6761 name\uFF08\u5982 docker\uFF09\u6216 git:name\uFF08\u5982 git:clone\uFF09\uFF0C\u52A0\u5165\u540E\u4E0D\u518D\u538B\u7F29\uFF1B\u5185\u7F6E\u7684 git add/commit/push\u3001mkdir/cp \u7B49\u4E0D\u53EF\u79FB\u9664\u3002",
460
471
  rtkWhitelistPlaceholder: "name \u6216 git:name\uFF0C\u56DE\u8F66\u6DFB\u52A0",
461
472
  rtkWhitelistAdd: "\u6DFB\u52A0",
462
473
  rtkWhitelistClear: "\u6E05\u7A7A",
@@ -464,18 +475,18 @@
464
475
  rtkWhitelistInvalid: "\u6761\u76EE\u683C\u5F0F\u5E94\u4E3A name \u6216 git:name",
465
476
  rtkLoadFailed: "\u8BFB\u53D6 rtk \u914D\u7F6E\u5931\u8D25",
466
477
  tabHeadroom: "Headroom",
467
- headroomDesc: "Headroom \u63D2\u4EF6\uFF1A\u672C\u5730\u538B\u7F29\u4EE3\u7406\u9A7B\u7559 127.0.0.1\uFF08\u9ED8\u8BA4 8787 \u7AEF\u53E3\uFF09\uFF0C\u538B\u7F29\u53D1\u5F80\u6A21\u578B\u7684\u4E0A\u4E0B\u6587\u4EE5\u7701 token\uFF08/hr-* \u547D\u4EE4\u7F16\u8F91\u540C\u4E00\u914D\u7F6E\uFF09\u3002\u538B\u7F29\u8BBE\u5907\u4E0E\u7701\u7535\u5207\u6362\u4FDD\u5B58\u540E\u7ACB\u5373\u751F\u6548\uFF1B\u5207\u6362\u8BBE\u5907\u4F1A\u91CD\u542F\u4EE3\u7406\uFF0C\u6B63\u5728\u5904\u7406\u7684\u8BF7\u6C42\u53EF\u80FD\u4E2D\u65AD\u4E00\u6B21\u3002",
478
+ headroomDesc: "Headroom \u63D2\u4EF6\uFF1A\u672C\u5730\u538B\u7F29\u4EE3\u7406\u9A7B\u7559 127.0.0.1\uFF08\u9ED8\u8BA4 8787 \u7AEF\u53E3\uFF09\uFF0C\u538B\u7F29\u53D1\u5F80\u6A21\u578B\u7684\u4E0A\u4E0B\u6587\u4EE5\u7701 token\uFF08/hr-* \u547D\u4EE4\u7F16\u8F91\u540C\u4E00\u914D\u7F6E\uFF09\u3002\u5207\u6362\u8BBE\u5907\u4F1A\u91CD\u542F\u4EE3\u7406\uFF0C\u6B63\u5728\u5904\u7406\u7684\u8BF7\u6C42\u53EF\u80FD\u4E2D\u65AD\u4E00\u6B21\u3002",
468
479
  headroomBinMissing: "\u672A\u627E\u5230 headroom \u7A0B\u5E8F\uFF0C\u4EE3\u7406\u65E0\u6CD5\u542F\u52A8\uFF1B\u5B89\u88C5 headroom \u540E\u4EE5\u4E0B\u8BBE\u7F6E\u81EA\u52A8\u751F\u6548",
469
480
  hrInstallBin: "\u5B89\u88C5 headroom \u672C\u4F53",
470
481
  hrBinInstalled: "headroom \u672C\u4F53\u5DF2\u5B89\u88C5\uFF1B\u91CD\u65B0\u6253\u5F00\u4F1A\u8BDD\u540E\u4EE3\u7406\u53EF\u7528\uFF08SessionStart \u94A9\u5B50\u81EA\u52A8\u62C9\u8D77\uFF09",
471
482
  headroomInstallTitle: "\u672A\u5B89\u88C5 headroom \u63D2\u4EF6",
472
- headroomInstallDesc: "\u4ECE zcode-plugins \u5E02\u573A\u5B89\u88C5\u540E\u5373\u53EF\u5728\u6B64\u7BA1\u7406\u538B\u7F29\u4EE3\u7406\uFF1B\u5EFA\u8BAE\u5B89\u88C5\u540E\u91CD\u542F\u4F1A\u8BDD\u751F\u6548\u3002",
483
+ headroomInstallDesc: "\u4ECE zcode-plugins \u5E02\u573A\u5B89\u88C5\u540E\u5373\u53EF\u5728\u6B64\u7BA1\u7406\u538B\u7F29\u4EE3\u7406\uFF1B\u91CD\u542F\u4F1A\u8BDD\u540E\u751F\u6548\u3002",
473
484
  headroomInstall: "\u5B89\u88C5",
474
485
  headroomInstalling: "\u5B89\u88C5\u4E2D\u2026",
475
486
  headroomInstalled: "\u5DF2\u5B89\u88C5 headroom \u63D2\u4EF6",
476
487
  headroomInstallRetry: "\u5B89\u88C5\u672A\u751F\u6548\uFF0C\u8BF7\u91CD\u8BD5\u6216\u624B\u52A8\u5728\u63D2\u4EF6\u5E02\u573A\u5B89\u88C5",
477
488
  pluginInstallCardTitle: "\u672A\u5B89\u88C5 {name} \u63D2\u4EF6",
478
- pluginInstallCardDesc: "\u4ECE zcode-plugins \u5E02\u573A\u5B89\u88C5\u540E\u5373\u53EF\u5728\u6B64\u7BA1\u7406\uFF1B\u5EFA\u8BAE\u5B89\u88C5\u540E\u91CD\u542F\u4F1A\u8BDD\u751F\u6548\u3002",
489
+ pluginInstallCardDesc: "\u4ECE zcode-plugins \u5E02\u573A\u5B89\u88C5\u540E\u5373\u53EF\u5728\u6B64\u7BA1\u7406\uFF1B\u91CD\u542F\u4F1A\u8BDD\u540E\u751F\u6548\u3002",
479
490
  pluginInstallDone: "\u5DF2\u5B89\u88C5 {name} \u63D2\u4EF6",
480
491
  pluginEnable: "\u542F\u7528",
481
492
  hrStarting: "\u6B63\u5728\u542F\u52A8\u538B\u7F29\u4EE3\u7406\u2026",
@@ -518,7 +529,7 @@
518
529
  headroomBackendAuto: "\u81EA\u52A8 \xB7 \u663E\u5361\u4F18\u5148",
519
530
  headroomBackendCpu: "\u7701\u7535 \xB7 CPU \u4F18\u5148",
520
531
  headroomBackendNative: "\uFF08\u539F\u751F\u503C\uFF09",
521
- headroomBackendDesc: "\u81EA\u52A8\uFF1Aheadroom \u9009\u6700\u5FEB\u8BBE\u5907\uFF08CUDA/MPS \u663E\u5361\u4F18\u5148\uFF09\uFF1BCPU\uFF1A\u5F3A\u5236 CPU \u538B\u7F29\uFF0C\u7701\u7535\u4E14\u4E0D\u5360\u663E\u5B58\u3002\u4E5F\u652F\u6301 headroom \u539F\u751F\u503C\uFF08onnx\u3001pytorch_mps \u7B49\uFF09\u3002\u5207\u6362\u4F1A\u91CD\u542F\u4EE3\u7406\u7ACB\u5373\u751F\u6548\u3002",
532
+ headroomBackendDesc: "\u81EA\u52A8\uFF1Aheadroom \u9009\u6700\u5FEB\u8BBE\u5907\uFF08CUDA/MPS \u663E\u5361\u4F18\u5148\uFF09\uFF1BCPU\uFF1A\u5F3A\u5236 CPU \u538B\u7F29\uFF0C\u7701\u7535\u4E14\u4E0D\u5360\u663E\u5B58\u3002\u4E5F\u652F\u6301 headroom \u539F\u751F\u503C\uFF08onnx\u3001pytorch_mps \u7B49\uFF09\u3002",
522
533
  headroomPower: "\u7701\u7535\u81EA\u52A8\u5207\u6362",
523
534
  headroomPowerOff: "\u5173\u95ED",
524
535
  headroomPowerOffDesc: "\u4E0D\u81EA\u52A8\u5207\u6362\uFF0C\u59CB\u7EC8\u6309\u201C\u538B\u7F29\u8BBE\u5907\u201D\u8FD0\u884C\u3002",
@@ -528,7 +539,7 @@
528
539
  headroomPowerSaverDesc: "\u4EC5\u7CFB\u7EDF\u8FDB\u5165\u7701\u7535\u6A21\u5F0F \u2192 CPU \u538B\u7F29\uFF0C\u9000\u51FA\u5207\u56DE\u3002",
529
540
  hrCpuPinnedHint: "\u538B\u7F29\u8BBE\u5907\u5DF2\u56FA\u5B9A\u4E3A CPU\uFF0C\u7701\u7535\u81EA\u52A8\u5207\u6362\u4E0D\u4F1A\u518D\u6539\u53D8\u5B83\u3002",
530
541
  headroomInterval: "\u76D1\u89C6\u95F4\u9694",
531
- headroomIntervalDesc: "\u7701\u7535\u76D1\u89C6\u5668\u8F6E\u8BE2\u7535\u6E90\u72B6\u6001\u7684\u95F4\u9694\uFF0810\u20133600 \u79D2\uFF0C\u9ED8\u8BA4 60\uFF09\uFF1B\u4FDD\u5B58\u540E\u4ECE\u4E0B\u4E00\u8F6E\u5DE1\u68C0\u8D77\u751F\u6548\uFF0C\u65E0\u9700\u91CD\u542F\u3002",
542
+ headroomIntervalDesc: "\u7701\u7535\u76D1\u89C6\u5668\u8F6E\u8BE2\u7535\u6E90\u72B6\u6001\u7684\u95F4\u9694\uFF0810\u20133600 \u79D2\uFF0C\u9ED8\u8BA4 60\uFF09\uFF1B\u4FDD\u5B58\u540E\u4ECE\u4E0B\u4E00\u8F6E\u5DE1\u68C0\u8D77\u751F\u6548\u3002",
532
543
  headroomSecUnit: "\u79D2",
533
544
  upgradeCheck: "\u68C0\u67E5\u66F4\u65B0",
534
545
  upgradeChecking: "\u68C0\u67E5\u4E2D\u2026",
@@ -615,7 +626,7 @@
615
626
  agentsSave: "Save",
616
627
  agentsSaved: "Global prompt saved.",
617
628
  agentsLoadFailed: "Failed to load the global prompt",
618
- proxyDesc: "Set an HTTP proxy for network access made by the local helper: plugin marketplace updates and installs, plugin dependency installs and upgrades, and WebDAV sync can all use it \u2014 pick the scopes with the toggles below. Does not affect the ZCode app itself or model requests. Applies immediately.",
629
+ proxyDesc: "Set an HTTP proxy for network access made by the local helper: plugin marketplace updates and installs, plugin dependency installs and upgrades, and WebDAV sync can all use it \u2014 pick the scopes with the toggles below. Does not affect the ZCode app itself or model requests.",
619
630
  proxyPlaceholder: "http://127.0.0.1:7890",
620
631
  proxySave: "Save",
621
632
  proxySaved: "Proxy settings saved.",
@@ -629,7 +640,7 @@
629
640
  proxyScopeDeps: "Plugin dependencies",
630
641
  proxyScopeDepsDesc: "headroom and rtk installs, update checks and upgrades (pip and GitHub downloads) go through the proxy.",
631
642
  proxyScopeSync: "Sync",
632
- proxyScopeSyncDesc: "WebDAV upload and download go through the proxy. Off by default: domestic WebDAV providers work fine direct, and a stopped proxy breaks sync.",
643
+ proxyScopeSyncDesc: "WebDAV upload and download go through the proxy.",
633
644
  tabSync: "Sync",
634
645
  tabDebug: "Debug",
635
646
  testNoSessionHint: "With \u201Cfollow current session [current model]\u201D selected, the provider [model] of the last session is used.",
@@ -716,13 +727,13 @@
716
727
  defaultValue: "default",
717
728
  resetDefault: "Reset to default",
718
729
  featureProjectMenu: "Project menu actions",
719
- featureProjectMenuDesc: 'Custom alias, switch folder, open folder and copy path in the project "More" menu (the alias also applies to the sidebar).',
730
+ featureProjectMenuDesc: "Open folder and copy path in the project More menu (alias and folder switch retired).",
720
731
  featureTaskOrder: "Sidebar session drag ordering",
721
- featureTaskOrderDesc: "Makes session drags in Pinned, Projects and Groups persist across refreshes.",
732
+ featureTaskOrderDesc: "Drag to reorder sessions in Pinned, Projects and Groups; survives restarts.",
722
733
  featureSessionSwitch: "Session quick switch",
723
- featureSessionSwitchDesc: "{last} toggles between the current and the last session; hold alt and press {prev}/{next} to move the highlight across recently used sessions (10 shown initially, pressing {next} at the bottom loads 5 more), {recent} opens the last 10 directly, {attention} opens running / finished-but-unseen tasks; arrow keys also move the highlight, Enter or release alt to switch (like alt+tab)",
734
+ featureSessionSwitchDesc: "{last} toggles to the last session; alt + arrows pick recent sessions; keys remappable",
724
735
  featureTitleLock: "Keep renamed session titles",
725
- featureTitleLockDesc: "Sessions you renamed keep their custom title: after new replies the app may show an auto-generated title instead, which reverts after a restart; this keeps the renamed title in the sidebar.",
736
+ featureTitleLockDesc: "Sessions you renamed keep their custom title in the sidebar.",
726
737
  tabTitleGen: "Task name prompt",
727
738
  titleGenShortDesc: "When a new session starts answering, generates the task name with the chosen provider and prompt and saves it as a manual rename the built-in title never overrides.",
728
739
  titleGenEnabled: "Enable",
@@ -748,7 +759,7 @@
748
759
  titleGenTestOk: "Result: ",
749
760
  titleGenTestFailed: "Generation failed",
750
761
  featureWsRunning: "Running indicator when collapsed",
751
- featureWsRunningDesc: "Shows the same spinning loader as running tasks on collapsed projects and on section headers (\u201CTasks\u201D, \u201CPinned\u201D) while any session is running; clears when they all finish.",
762
+ featureWsRunningDesc: "Collapsed project and task headers show a loader while sessions run.",
752
763
  tabPerformance: "Performance",
753
764
  perfDesc: "ZCode keeps a session process resident for every project you have opened and never reclaims it, so memory grows with projects. When enabled, projects unused for a while with nothing running release their memory automatically: sessions are untouched and reload when reopened, with a few seconds wait on the first reply. The project in use, running sessions, background commands and scheduled tasks are never reclaimed. Background-command detection reads system process info via built-in tools (Linux / macOS / Windows); when unavailable, the feature disables itself.",
754
765
  featureIdleReclaim: "Idle project memory reclaim",
@@ -758,15 +769,15 @@
758
769
  idleReclaimStartupHint: "Startup pre-spawns a process per restored project; this pass collects the unused ones once. 0 = reclaim right after startup, ignoring the idle minutes above",
759
770
  idleReclaimUnit: "min",
760
771
  featureToolbarIcons: "Sidebar menu in the top bar",
761
- featureToolbarIconsDesc: "Turns the sidebar menu (New task / Search / Automations / Plugin store) into icon buttons next to the back/forward arrows in the top bar: hover shows the name, the button stays highlighted while its view is open, and shortcuts still work; the original sidebar menu is hidden.",
772
+ featureToolbarIconsDesc: "New task / search / automations / plugin store become top-bar icon buttons.",
762
773
  tbNewTask: "New task",
763
774
  tbSearch: "Search",
764
775
  tbAutomations: "Automations",
765
776
  tbPluginStore: "Plugin store",
766
777
  featurePinnedCollapse: "Collapsible Pinned section",
767
- featurePinnedCollapseDesc: 'The sidebar "Pinned" header collapses/expands its task list (like Projects and Groups); the state is remembered.',
778
+ featurePinnedCollapseDesc: "The Pinned header collapses/expands its task list.",
768
779
  featureSandboxReclaim: "Plugin card sandbox reclaim",
769
- featureSandboxReclaimDesc: "Releases the oldest plugin-card sandboxes once the cap is hit (the one being viewed goes last), so new cards keep opening after the 64-slot pool fills up; released cards come back when their session is reopened (budget adjustable via sandboxReclaimBudget in the config file).",
780
+ featureSandboxReclaimDesc: "Reclaims the oldest sandboxes at the 64 cap so new cards keep opening; released cards come back when their session is reopened.",
770
781
  featurePluginCardRetry: "Plugin card auto-retry",
771
782
  featurePluginCardRetryDesc: 'Auto-clicks "Reload" on cards that failed the slot cap; they recover as soon as a slot frees up.',
772
783
  visionCardUi: "Vision cards",
@@ -791,7 +802,7 @@
791
802
  switcherAttentionHint: "Running / finished but unseen tasks \xB7 {prev} / {next} or \u2191 / \u2193 to choose, Enter or release alt to switch",
792
803
  switcherAttentionEmpty: "No running or unseen tasks",
793
804
  featureNewtabPanels: "Plugin panels on the new tab page",
794
- featureNewtabPanelsDesc: 'The built-in "new tab page" only lists built-in panels and recommended official plugins; this adds cards for third-party marketplace plugin panels (headroom, rtk, \u2026) that open in the side pane.',
805
+ featureNewtabPanelsDesc: "Adds third-party plugin panels (headroom, rtk, ...) to the new tab page; click to open in the side pane.",
795
806
  ntpDescSuffix: "plugin panel",
796
807
  ntpNeedSession: "Open a task session first, then open plugin panels from the new tab page",
797
808
  featureStatusBarDesc: "Shows statistics at the bottom-right of the input box and at the end of each answer.",
@@ -805,12 +816,12 @@
805
816
  themeBgRegionRight: "Right sidebar",
806
817
  themeBgPane: "Background",
807
818
  themeSkinTitle: "Skins",
808
- themeSkinDesc: 'Famous editor theme palettes; light and dark variants follow ZCode\u2019s current mode automatically; "Default" keeps ZCode as-is, "Custom" is tuned below.',
819
+ themeSkinDesc: 'Famous editor theme palettes, auto-matching ZCode\u2019s light / dark mode; "Default" keeps ZCode as-is, "Custom" is tuned below.',
809
820
  themeSkinCustom: "Custom",
810
821
  themeCustomTitle: "Custom theme",
811
- themeCustomHint: "Color changes apply live (auto-switches to the custom skin); light and dark variants, five anchor colors derive the whole palette.",
812
- themeCustomLight: "Light variant",
813
- themeCustomDark: "Dark variant",
822
+ themeCustomHint: "Color changes apply live (auto-switches to the custom skin); set light and dark separately \u2014 pick 5 colors and the whole palette is derived.",
823
+ themeCustomLight: "Light",
824
+ themeCustomDark: "Dark",
814
825
  themeCustomBg: "Background",
815
826
  themeCustomCard: "Card",
816
827
  themeCustomFg: "Text",
@@ -842,8 +853,15 @@
842
853
  themeBgFitContain: "Fit",
843
854
  themeBgFitFill: "Stretch",
844
855
  themeBgFitTile: "Tile",
845
- themeVisibility: "Background visibility",
856
+ themeBgMask: "Mask opacity",
857
+ themeBgMaskHint: "Higher values fade the image toward the theme background color for clearer text",
858
+ themeBgMaskHint2: "How much the image fades toward the theme background color",
859
+ themeBgBlur: "Image blur",
860
+ themeBgPanel: "Panel opacity",
861
+ themeBgPanelHint: "Opacity of sidebar, panels and tab bar. Lower reveals more of the image.",
846
862
  themeBgDeletedActive: "Active background was deleted; background disabled",
863
+ tableCopyBtn: "Copy table",
864
+ tableCopied: "Table copied",
847
865
  sbItemCtx: "Context usage",
848
866
  sbItemQuestions: "Questions asked",
849
867
  sbMaster: "Enable statistics",
@@ -896,7 +914,11 @@
896
914
  featureFileActions: "File menu actions",
897
915
  featureFileActionsDesc: 'Adds "Open with default app" and "Reveal in file manager" to the right-click menu of file links in chat.',
898
916
  featureImageCopy: "Image right-click copy",
917
+ featureTableCopy: "Copy table",
918
+ featureComposerProvider: "Provider in model name",
899
919
  featureImageCopyDesc: "Right-click an image in chat or the enlarged preview to copy it to the clipboard.",
920
+ featureTableCopyDesc: "Copy-table button on the table toolbar; pastes into Excel / editors as a clean table.",
921
+ featureComposerProviderDesc: "Shows the provider before the model name (e.g. BigModel-Max1 / glm-5.3).",
900
922
  imageCopy: "Copy image",
901
923
  imageCopied: "Image copied to the clipboard.",
902
924
  imageCopyFailed: "Failed to copy the image.",
@@ -919,7 +941,7 @@
919
941
  pluginsUpdatesAvailable: "{n} zcode-plugins update(s) available (ZCode Pro settings \u2192 Features)",
920
942
  pluginsAutoUpdated: "zcode-plugins updated",
921
943
  tabVision: "Vision",
922
- 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). Changes save automatically.",
944
+ 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).",
923
945
  visionEnabled: "Enable",
924
946
  visionForceIntercept: "Intercept even if the main model sees images",
925
947
  visionMode: "Chain mode",
@@ -950,14 +972,14 @@
950
972
  visionCompressKBHint: "Images above this size are compressed first (max edge 2000, JPEG); 0 = never",
951
973
  visionLoadFailed: "Failed to load the vision config",
952
974
  tabRtk: "rtk",
953
- rtkDesc: "rtk plugin: compresses common dev command output by 60-90% before it reaches the context (/rtk-* commands edit the same files). Changes save automatically and apply immediately.",
975
+ rtkDesc: "rtk plugin: compresses common dev command output by 60-90% before it reaches the context (/rtk-* commands edit the same files).",
954
976
  rtkEnabled: "Enable",
955
977
  rtkNotInstalled: "rtk is not installed. The settings below take effect after installation (/rtk-setup in a session).",
956
978
  rtkInstallBin: "Install rtk binary",
957
979
  rtkBinInstalled: "rtk installed; PATH takes effect for sessions after signing out and back in \u2014 the plugin hook works immediately",
958
980
  rtkWhitelistTitle: "Whitelist (pass through without compression)",
959
981
  rtkBuiltinLabel: "Built-in exemptions (read-only, follow plugin updates):",
960
- rtkWhitelistDesc: "Each entry is name (e.g. docker) or git:name (e.g. git:clone). Commands with tiny or no output need no compression; adding them skips compression. Built-ins (git add/commit/push, mkdir/cp, \u2026) cannot be removed. Delete the file to reset.",
982
+ rtkWhitelistDesc: "Each entry is name (e.g. docker) or git:name (e.g. git:clone); added commands skip compression. Built-ins (git add/commit/push, mkdir/cp, \u2026) cannot be removed.",
961
983
  rtkWhitelistPlaceholder: "name or git:name, press Enter to add",
962
984
  rtkWhitelistAdd: "Add",
963
985
  rtkWhitelistClear: "Clear",
@@ -965,18 +987,18 @@
965
987
  rtkWhitelistInvalid: "Entry must be name or git:name",
966
988
  rtkLoadFailed: "Failed to load the rtk config",
967
989
  tabHeadroom: "Headroom",
968
- headroomDesc: "Headroom plugin: a local compression proxy on 127.0.0.1 (port 8787 by default) that compresses context sent to the model to save tokens (/hr-* commands edit the same file). Device and power-save changes apply immediately; switching the device restarts the proxy, so requests in progress may be interrupted once.",
990
+ headroomDesc: "Headroom plugin: a local compression proxy on 127.0.0.1 (port 8787 by default) that compresses context sent to the model to save tokens (/hr-* commands edit the same file). Switching the device restarts the proxy, so requests in progress may be interrupted once.",
969
991
  headroomBinMissing: "The headroom program was not found, so the proxy cannot start. The settings below take effect once it is installed.",
970
992
  hrInstallBin: "Install headroom binary",
971
993
  hrBinInstalled: "headroom installed; reopen a session and the hook will start the proxy automatically",
972
994
  headroomInstallTitle: "headroom plugin not installed",
973
- headroomInstallDesc: "Install it from the zcode-plugins marketplace to manage the compression proxy here; restarting the session afterwards is recommended.",
995
+ headroomInstallDesc: "Install it from the zcode-plugins marketplace to manage the compression proxy here; takes effect after a session restart.",
974
996
  headroomInstall: "Install",
975
997
  headroomInstalling: "Installing\u2026",
976
998
  headroomInstalled: "headroom plugin installed",
977
999
  headroomInstallRetry: "Installation did not take effect; retry or install it from the marketplace manually",
978
1000
  pluginInstallCardTitle: "{name} plugin not installed",
979
- pluginInstallCardDesc: "Install it from the zcode-plugins marketplace to manage it here; restarting the session afterwards is recommended.",
1001
+ pluginInstallCardDesc: "Install it from the zcode-plugins marketplace to manage it here; takes effect after a session restart.",
980
1002
  pluginInstallDone: "{name} plugin installed",
981
1003
  pluginEnable: "Enable",
982
1004
  hrStarting: "Starting compression proxy\u2026",
@@ -1029,7 +1051,7 @@
1029
1051
  headroomPowerSaverDesc: "Only the system power-saver mode \u2192 CPU; back when it exits.",
1030
1052
  hrCpuPinnedHint: "The compression device is pinned to CPU, so power-save switching no longer changes anything.",
1031
1053
  headroomInterval: "Watch interval",
1032
- headroomIntervalDesc: "Seconds between power checks (10\u20133600, default 60); applies from the next round, no restart needed.",
1054
+ headroomIntervalDesc: "Seconds between power checks (10\u20133600, default 60); applies from the next round.",
1033
1055
  headroomSecUnit: "s",
1034
1056
  upgradeCheck: "Check update",
1035
1057
  upgradeChecking: "Checking\u2026",
@@ -1258,8 +1280,8 @@
1258
1280
  clearTimeout(toastTimer);
1259
1281
  toastTimer = setTimeout(() => el.remove(), kind === "error" ? 5e3 : 2600);
1260
1282
  }
1261
- var overlayClass = "fixed inset-0 isolate z-50 flex items-center justify-center bg-black/60 supports-backdrop-filter:backdrop-blur-xs duration-100 p-4 platform-linux-desktop:top-12";
1262
- var overlayClassBare = "fixed inset-0 isolate z-50 flex items-center justify-center duration-100 p-4 platform-linux-desktop:top-12";
1283
+ var overlayClass = "fixed inset-0 isolate z-50 flex items-start justify-center bg-black/60 supports-backdrop-filter:backdrop-blur-xs duration-100 p-4 platform-linux-desktop:top-12";
1284
+ var overlayClassBare = "fixed inset-0 isolate z-50 flex items-start justify-center duration-100 p-4 platform-linux-desktop:top-12";
1263
1285
  var contentClass = "w-full sm:max-w-md rounded-2xl border-none bg-popover/98 p-5 text-ui-base/relaxed text-foreground ring-border shadow-2xl";
1264
1286
  var dialogStack = [];
1265
1287
  function openDialog({ title, description, onMount, onClose, width = "sm:max-w-md", overlay = "dim", draggable = false, posKey = "", dismissOnOutside = true, bodyClass = "", closable = false }) {
@@ -1287,7 +1309,8 @@
1287
1309
  const content = h("div", {
1288
1310
  role: "dialog",
1289
1311
  "aria-modal": "true",
1290
- class: contentClass.replace("sm:max-w-md", width) + " zcodepro-card"
1312
+ class: contentClass.replace("sm:max-w-md", width) + " zcodepro-card",
1313
+ style: "margin-top:12vh;max-height:calc(88vh - 3rem);overflow-y:auto;"
1291
1314
  });
1292
1315
  const overlayEl = h("div", {
1293
1316
  "data-overlay": overlay,
@@ -1608,7 +1631,7 @@
1608
1631
  "div",
1609
1632
  { class: "min-w-0 flex-1" },
1610
1633
  h("div", { class: "text-ui-sm font-medium text-foreground" }, name),
1611
- h("div", { class: "mt-0.5 text-ui-xs/relaxed text-foreground-subtle", "data-zcodepro-row-desc": "" }, desc ?? "")
1634
+ h("div", { class: "mt-0.5 text-ui-xs/relaxed text-foreground-subtle zcodepro-row-desc", "data-zcodepro-row-desc": "", title: desc ?? "" }, desc ?? "")
1612
1635
  ),
1613
1636
  ...extraEl ? [extraEl] : [],
1614
1637
  h("button", {
@@ -1650,6 +1673,14 @@
1650
1673
  /* \u6EDA\u5230\u5E95\u4E0D\u518D\u628A\u6EDA\u52A8\u4F20\u7ED9\u5F39\u7A97\u540E\u9762\u7684\u9875\u9762 */
1651
1674
  overscroll-behavior: contain;
1652
1675
  }
1676
+ /* \u53CC\u5217\u7F51\u683C\uFF08\u529F\u80FD\u9875\uFF09\u91CC\u7684\u884C\u63CF\u8FF0\u6700\u591A\u4E24\u884C\u7701\u7565\uFF1A\u957F\u63CF\u8FF0\u6491\u51FA\u7684\u53C2\u5DEE\u884C\u9AD8\u662F
1677
+ \u7F51\u683C\u89C2\u611F\u5DEE\u7684\u6839\u6E90\uFF1B\u5355\u5217\u573A\u666F\uFF08\u5176\u4ED6\u9762\u677F\uFF09\u4E0D\u53D7\u5F71\u54CD */
1678
+ .grid.grid-cols-2 > div > div > .zcodepro-row-desc {
1679
+ display: -webkit-box;
1680
+ -webkit-line-clamp: 2;
1681
+ -webkit-box-orient: vertical;
1682
+ overflow: hidden;
1683
+ }
1653
1684
  /* \u5F00\u5173\uFF08\u8BBE\u7F6E\u5F39\u7A97\uFF09\uFF1A\u51E0\u4F55\u56FA\u5B9A\u5199\u5165\uFF0C\u989C\u8272\u968F\u4E3B\u9898\u53D8\u91CF */
1654
1685
  [data-zcodepro-switch] {
1655
1686
  position: relative;
@@ -1816,6 +1847,8 @@
1816
1847
  -webkit-appearance: none;
1817
1848
  appearance: none;
1818
1849
  width: 100%;
1850
+ /* \u4E0D\u7ED9 padding\uFF1Apadding \u4F1A\u7F29\u5C0F thumb \u7684\u53EF\u6ED1\u533A\u95F4\uFF08\u62D6\u4E0D\u5230\u6700\u5DE6/\u6700\u53F3\uFF09\u3002
1851
+ \u8F68\u9053\u8D77\u70B9\u5BF9\u9F50\u7531\u5F39\u7A97\u91CC\u7684\u56FA\u5B9A\u6807\u7B7E\u5217\u5BBD\u8D1F\u8D23 */
1819
1852
  height: 4px;
1820
1853
  border-radius: 9999px;
1821
1854
  background: color-mix(in oklab, var(--color-foreground, #888) 18%, transparent);
@@ -1944,6 +1977,9 @@
1944
1977
  height: 12px;
1945
1978
  flex-shrink: 0;
1946
1979
  opacity: 0.6;
1980
+ /* 11px \u5B57\u4F53\u7684\u89C6\u89C9\u4E2D\u5FC3\uFF08x-height \u4E2D\u70B9\uFF09\u9AD8\u4E8E\u884C\u76D2\u51E0\u4F55\u4E2D\u5FC3\u7EA6 1px\uFF08\u4E0B\u4F38\u90E8
1981
+ \u9884\u7559\uFF09\uFF0C\u51E0\u4F55\u5C45\u4E2D\u7684\u56FE\u6807\u770B\u8D77\u6765\u504F\u4E0B\u2014\u2014\u6574\u4F53\u4E0A\u79FB 1px \u5BF9\u9F50\u89C6\u89C9\u4E2D\u5FC3 */
1982
+ transform: translateY(-1px);
1947
1983
  }
1948
1984
  .zcodepro-statusbar b { font-weight: 600; color: var(--color-foreground-subtle, #666); }
1949
1985
  .zcodepro-statusbar i {
@@ -3111,10 +3147,10 @@
3111
3147
  function startImageMenu() {
3112
3148
  if (typeof window === "undefined") return;
3113
3149
  if (typeof navigator.clipboard?.write !== "function" || typeof window.ClipboardItem === "undefined") return;
3114
- let enabled9 = true;
3150
+ let enabled11 = true;
3115
3151
  const refresh = () => {
3116
3152
  void getConfig().then((c) => {
3117
- enabled9 = !(c.features && c.features.imageCopy === false);
3153
+ enabled11 = !(c.features && c.features.imageCopy === false);
3118
3154
  });
3119
3155
  };
3120
3156
  refresh();
@@ -3123,7 +3159,7 @@
3123
3159
  const img = copyTargetOf(e.target, e.clientX, e.clientY);
3124
3160
  if (!img) return;
3125
3161
  e.preventDefault();
3126
- if (enabled9) showMenu(e.clientX, e.clientY, img);
3162
+ if (enabled11) showMenu(e.clientX, e.clientY, img);
3127
3163
  refresh();
3128
3164
  }, true);
3129
3165
  }
@@ -4131,7 +4167,7 @@
4131
4167
  var bgStyleEl = null;
4132
4168
  var injectedKeys = /* @__PURE__ */ new Set();
4133
4169
  var classObserver = null;
4134
- var currentTheme = { skin: "default", custom: null, bg: { mode: "none", visibility: 0.8 } };
4170
+ var currentTheme = { skin: "default", custom: null, bg: { mode: "none", maskOpacity: 0.82, blurPx: 0, panelOpacity: 0.3 } };
4135
4171
  var lastModeSig = "";
4136
4172
  var bgTimer = null;
4137
4173
  var regionStyleEl = null;
@@ -4240,12 +4276,15 @@
4240
4276
  await applyRegionBackgrounds(bg);
4241
4277
  return;
4242
4278
  }
4243
- const visibility = typeof bg.visibility === "number" && Number.isFinite(bg.visibility) ? Math.min(1, Math.max(0, bg.visibility)) : 0.8;
4244
- const alpha = 1 - visibility;
4279
+ const num01 = (v, dflt) => typeof v === "number" && Number.isFinite(v) ? Math.min(1, Math.max(0, v)) : dflt;
4280
+ const maskOpacity = num01(bg.maskOpacity, 0.82);
4281
+ const alpha = Math.min(0.99, maskOpacity);
4282
+ const blurPx = typeof bg.blurPx === "number" && Number.isFinite(bg.blurPx) ? Math.min(24, Math.max(0, Math.round(bg.blurPx))) : 0;
4283
+ const panelOpacity = num01(bg.panelOpacity, 0.3);
4245
4284
  const resolvedBg = resolvedColor("--color-background");
4246
4285
  const mHex = resolvedBg.match(/^rgba?\(([\d.]+),\s*([\d.]+),\s*([\d.]+)/);
4247
4286
  const rgb = mHex ? [Math.round(+mHex[1]), Math.round(+mHex[2]), Math.round(+mHex[3])].join(",") : isDarkMode() ? "13,13,13" : "248,248,248";
4248
- const panelMix = Math.min(100, Math.round(alpha * 100) + 10);
4287
+ const panelMix = Math.round(panelOpacity * 100);
4249
4288
  if (panelMix < 100) {
4250
4289
  for (const t2 of SURFACE_TOKENS) {
4251
4290
  const v = resolvedColor(t2);
@@ -4255,7 +4294,7 @@
4255
4294
  }
4256
4295
  }
4257
4296
  }
4258
- await applyRegionBackgrounds(bg, { mask, rgb, alpha, fit: bg.fit, visibility, seq });
4297
+ await applyRegionBackgrounds(bg, { rgb, alpha, fit: bg.fit, seq });
4259
4298
  if (seq !== applySeq) return;
4260
4299
  if (!bgActive) return;
4261
4300
  const FIT_CSS = {
@@ -4265,8 +4304,10 @@
4265
4304
  tile: "background-size:100% 100%,auto !important;background-repeat:no-repeat,repeat !important;"
4266
4305
  };
4267
4306
  const fitCss = FIT_CSS[bg.fit] || FIT_CSS.cover;
4307
+ const blurCss = blurPx > 0 ? `filter:blur(${blurPx}px);` : "";
4308
+ const spread = blurPx > 0 ? Math.max(20, blurPx * 2) : 0;
4268
4309
  const setImage = (image) => {
4269
- bgStyleEl.textContent = `html.zcodepro-bg-on{background-color:rgb(${rgb}) !important;background-image:linear-gradient(rgba(${rgb},${alpha}),rgba(${rgb},${alpha})),${image} !important;${fitCss}background-position:center !important;}`;
4310
+ bgStyleEl.textContent = `html.zcodepro-bg-on{background-color:rgb(${rgb}) !important;}html.zcodepro-bg-on::before{content:'' !important;position:fixed;inset:-${spread}px;z-index:-1;pointer-events:none;background-image:linear-gradient(rgba(${rgb},${alpha}),rgba(${rgb},${alpha})),${image} !important;${fitCss}background-position:center !important;${blurCss}}`;
4270
4311
  root.classList.add("zcodepro-bg-on");
4271
4312
  };
4272
4313
  const helperUrl = liveBoot().helperUrl || HELPER_URL;
@@ -4325,7 +4366,7 @@
4325
4366
  const flush = () => {
4326
4367
  regionStyleEl.textContent = [...rules.values()].join("");
4327
4368
  };
4328
- const alpha = pre ? pre.alpha : 0.2;
4369
+ const alpha = pre ? pre.alpha : 0.82;
4329
4370
  const rgb = pre ? pre.rgb : "13,13,13";
4330
4371
  const FIT_CSS = {
4331
4372
  cover: "100% 100%,cover",
@@ -4379,7 +4420,7 @@
4379
4420
  }
4380
4421
  function startTheme() {
4381
4422
  if (!document.head && !document.documentElement) return;
4382
- applyAll({ skin: "default", custom: null, bg: { mode: "none", visibility: 0.8 } });
4423
+ applyAll({ skin: "default", custom: null, bg: { mode: "none", maskOpacity: 0.82, blurPx: 0, panelOpacity: 0.3 } });
4383
4424
  void getConfig().then((cfg) => applyAll(cfg.theme)).catch(() => {
4384
4425
  });
4385
4426
  window.addEventListener("zcodepro:config-changed", () => {
@@ -4633,8 +4674,12 @@
4633
4674
  h("span", { class: "inline-block size-2 rounded-full bg-emerald-500" }),
4634
4675
  h("span", { class: "text-foreground-subtle/70" }, `${health.version} \xB7 ${HELPER_URL}`)
4635
4676
  );
4636
- const rows = h("div", { class: "divide-y divide-border rounded-xl border border-border" });
4677
+ const rows = h("div", { class: "grid grid-cols-2 gap-x-0 gap-y-1 rounded-xl border border-border p-2 divide-x divide-border" });
4637
4678
  const pluginsStatusLine = h("span", { class: "max-w-40 truncate text-ui-xs/relaxed text-foreground-subtle" }, "\u2026");
4679
+ const setPluginsStatus = (text) => {
4680
+ setPluginsStatus(text);
4681
+ pluginsStatusLine.setAttribute("title", text);
4682
+ };
4638
4683
  const pluginsBtn = btnSmall(L.pluginsCheckNow, () => {
4639
4684
  void runPluginsUpdate();
4640
4685
  });
@@ -4643,23 +4688,23 @@
4643
4688
  if (pluginsUpdating) return;
4644
4689
  pluginsUpdating = true;
4645
4690
  pluginsBtn.disabled = true;
4646
- pluginsStatusLine.textContent = L.pluginsUpdating;
4691
+ setPluginsStatus(L.pluginsUpdating);
4647
4692
  const res = await rpc("/plugins/update", { method: "POST", body: {} });
4648
4693
  pluginsUpdating = false;
4649
4694
  pluginsBtn.disabled = false;
4650
4695
  if (!res.ok) {
4651
- pluginsStatusLine.textContent = "";
4696
+ setPluginsStatus("");
4652
4697
  showToast(L.pluginsUpdateFailed + ": " + errText(res), "error");
4653
4698
  return;
4654
4699
  }
4655
- pluginsStatusLine.textContent = res.updated > 0 ? L.pluginsUpdatedDone.replaceAll("{n}", String(res.updated)) : L.pluginsUpToDate;
4700
+ setPluginsStatus(res.updated > 0 ? L.pluginsUpdatedDone.replaceAll("{n}", String(res.updated)) : L.pluginsUpToDate);
4656
4701
  showToast(pluginsStatusLine.textContent, "success");
4657
4702
  };
4658
4703
  void (async () => {
4659
4704
  const cfg = await getConfig(true).catch(() => null);
4660
4705
  const res = await rpc("/plugins/status");
4661
4706
  if (!res.ok) {
4662
- pluginsStatusLine.textContent = "";
4707
+ setPluginsStatus("");
4663
4708
  return;
4664
4709
  }
4665
4710
  const n = (res.updates || []).length;
@@ -4667,7 +4712,7 @@
4667
4712
  void runPluginsUpdate();
4668
4713
  return;
4669
4714
  }
4670
- pluginsStatusLine.textContent = n > 0 ? L.pluginsUpdatesFound.replaceAll("{n}", String(n)) : L.pluginsUpToDate;
4715
+ setPluginsStatus(n > 0 ? L.pluginsUpdatesFound.replaceAll("{n}", String(n)) : L.pluginsUpToDate);
4671
4716
  })();
4672
4717
  const HK_ACTIONS = [
4673
4718
  ["switchLast", "hkAltZ"],
@@ -4735,6 +4780,16 @@
4735
4780
  if (await setFeature("imageCopy", next)) f.imageCopy = next;
4736
4781
  refreshRows();
4737
4782
  }),
4783
+ settingRow(L.featureTableCopy, L.featureTableCopyDesc, f.tableCopy !== false, async () => {
4784
+ const next = !(f.tableCopy !== false);
4785
+ if (await setFeature("tableCopy", next)) f.tableCopy = next;
4786
+ refreshRows();
4787
+ }),
4788
+ settingRow(L.featureComposerProvider, L.featureComposerProviderDesc, f.composerProvider !== false, async () => {
4789
+ const next = !(f.composerProvider !== false);
4790
+ if (await setFeature("composerProvider", next)) f.composerProvider = next;
4791
+ refreshRows();
4792
+ }),
4738
4793
  settingRow(L.featureSandboxReclaim, L.featureSandboxReclaimDesc, f.sandboxReclaim !== false, async () => {
4739
4794
  const next = !(f.sandboxReclaim !== false);
4740
4795
  if (await setFeature("sandboxReclaim", next)) f.sandboxReclaim = next;
@@ -4773,12 +4828,14 @@
4773
4828
  if (nameEl) {
4774
4829
  nameEl.replaceChildren(
4775
4830
  document.createTextNode(L.featureAutoUpdatePlugins + " "),
4776
- repoLink,
4777
- document.createTextNode(" \u63D2\u4EF6")
4831
+ repoLink
4778
4832
  );
4779
4833
  }
4780
4834
  const descEl = row.querySelector("[data-zcodepro-row-desc]");
4781
- if (descEl) descEl.replaceChildren(pluginsStatusLine);
4835
+ if (descEl) {
4836
+ descEl.replaceChildren(pluginsStatusLine);
4837
+ descEl.setAttribute("title", descEl.textContent.trim());
4838
+ }
4782
4839
  return row;
4783
4840
  })()
4784
4841
  );
@@ -4971,10 +5028,10 @@
4971
5028
  const panes = { features: paneFeatures, shortcuts: paneShortcuts, styles: paneStyles, perf: panePerf, agents: paneAgents, proxy: paneProxy, sync: paneSync, vision: paneVision, headroom: paneHeadroom, rtk: paneRtk, debug: paneDebug };
4972
5029
  const tabDefs = [
4973
5030
  ["features", L.tabFeatures],
4974
- ["shortcuts", L.tabShortcuts],
4975
- ["agents", L.tabBehavior],
4976
5031
  ["styles", L.tabStyles],
5032
+ ["agents", L.tabBehavior],
4977
5033
  ["perf", L.tabPerformance],
5034
+ ["shortcuts", L.tabShortcuts],
4978
5035
  ["proxy", L.tabProxy],
4979
5036
  ["sync", L.tabSync],
4980
5037
  ["vision", L.tabVision],
@@ -5333,21 +5390,18 @@
5333
5390
  turnList
5334
5391
  );
5335
5392
  let themeCfg = structuredClone(config.theme || {});
5393
+ const numOrBg = (v, d) => typeof v === "number" && Number.isFinite(v) ? v : d;
5336
5394
  themeCfg.skin = themeCfg.skin || "default";
5337
5395
  themeCfg.custom = {
5338
5396
  light: themeCfg.custom && themeCfg.custom.light || {},
5339
5397
  dark: themeCfg.custom && themeCfg.custom.dark || {}
5340
5398
  };
5341
5399
  themeCfg.bg = {
5342
- mode: "none",
5343
- file: "",
5344
- folder: "",
5345
- folderRandom: true,
5346
- url: "",
5347
- intervalMin: 0,
5348
- fit: "cover",
5349
- visibility: 0.8,
5350
- ...themeCfg.bg || {}
5400
+ ...themeCfg.bg || {},
5401
+ mode: themeCfg.bg?.mode || "none",
5402
+ maskOpacity: numOrBg(themeCfg.bg?.maskOpacity, 0.82),
5403
+ blurPx: numOrBg(themeCfg.bg?.blurPx, 0),
5404
+ panelOpacity: numOrBg(themeCfg.bg?.panelOpacity, 0.3)
5351
5405
  };
5352
5406
  themeCfg.bg.regions = themeCfg.bg.regions && typeof themeCfg.bg.regions === "object" ? themeCfg.bg.regions : {};
5353
5407
  let bgFiles = [];
@@ -5590,27 +5644,73 @@
5590
5644
  );
5591
5645
  };
5592
5646
  const renderThemeBg = () => {
5593
- const vis = Math.round((themeCfg.bg.visibility ?? 0.8) * 100);
5594
- const visLabel = h("span", { class: "w-10 text-right text-ui-xs tabular-nums text-foreground-subtle" }, vis + "%");
5595
- const visRange = h("input", {
5596
- type: "range",
5597
- min: "0",
5598
- max: "100",
5599
- step: "5",
5600
- value: String(vis),
5601
- class: "zcodepro-range",
5602
- "aria-label": L.themeVisibility,
5603
- style: "flex:1"
5604
- });
5605
- let visTimer = null;
5606
- visRange.addEventListener("input", () => {
5607
- const v = Number(visRange.value);
5608
- visLabel.textContent = v + "%";
5609
- clearTimeout(visTimer);
5610
- visTimer = setTimeout(() => {
5611
- void saveTheme({ bg: { visibility: v / 100 } });
5612
- }, 300);
5613
- });
5647
+ const sliderRow = (label, title, min, max, step, val, unit, commit, hint) => {
5648
+ const lab = h("span", { class: "shrink-0 whitespace-nowrap text-ui-xs font-medium text-foreground-subtle", title, style: "width:72px" }, label);
5649
+ const valLabel = h("span", { class: "w-12 text-right text-ui-xs tabular-nums text-foreground-subtle" }, val + unit);
5650
+ const range = h("input", {
5651
+ type: "range",
5652
+ min: String(min),
5653
+ max: String(max),
5654
+ step: String(step),
5655
+ value: String(val),
5656
+ class: "zcodepro-range",
5657
+ "aria-label": label,
5658
+ style: "flex:1"
5659
+ });
5660
+ let timer = null;
5661
+ range.addEventListener("input", () => {
5662
+ const v = Number(range.value);
5663
+ valLabel.textContent = v + unit;
5664
+ clearTimeout(timer);
5665
+ timer = setTimeout(() => commit(v), 300);
5666
+ });
5667
+ return h(
5668
+ "div",
5669
+ { class: "flex flex-col gap-0.5" },
5670
+ h("div", { class: "flex items-center gap-3" }, lab, range, valLabel),
5671
+ hint ? h("span", { class: "text-ui-xs/relaxed text-foreground-subtle" }, hint) : null
5672
+ );
5673
+ };
5674
+ const numOr = (v, d) => typeof v === "number" && Number.isFinite(v) ? v : d;
5675
+ const maskRow = () => sliderRow(
5676
+ L.themeBgMask,
5677
+ L.themeBgMaskHint,
5678
+ 0,
5679
+ 99,
5680
+ 1,
5681
+ Math.round(numOr(themeCfg.bg.maskOpacity, 0.82) * 100),
5682
+ "%",
5683
+ (v) => {
5684
+ void saveTheme({ bg: { maskOpacity: v / 100 } });
5685
+ },
5686
+ L.themeBgMaskHint2
5687
+ );
5688
+ const blurRow = () => sliderRow(
5689
+ L.themeBgBlur,
5690
+ "",
5691
+ 0,
5692
+ 24,
5693
+ 1,
5694
+ numOr(themeCfg.bg.blurPx, 0),
5695
+ "px",
5696
+ (v) => {
5697
+ void saveTheme({ bg: { blurPx: v } });
5698
+ },
5699
+ ""
5700
+ );
5701
+ const panelRow = () => sliderRow(
5702
+ L.themeBgPanel,
5703
+ "",
5704
+ 0,
5705
+ 100,
5706
+ 1,
5707
+ Math.round(numOr(themeCfg.bg.panelOpacity, 0.3) * 100),
5708
+ "%",
5709
+ (v) => {
5710
+ void saveTheme({ bg: { panelOpacity: v / 100 } });
5711
+ },
5712
+ L.themeBgPanelHint
5713
+ );
5614
5714
  const modeBtn = (id, label) => h("button", {
5615
5715
  type: "button",
5616
5716
  class: "zcodepro-tab",
@@ -5785,10 +5885,10 @@
5785
5885
  ),
5786
5886
  h(
5787
5887
  "div",
5788
- { class: "mt-3 flex items-center gap-3" },
5789
- h("span", { class: "shrink-0 text-ui-xs font-medium text-foreground-subtle" }, L.themeVisibility),
5790
- visRange,
5791
- visLabel
5888
+ { class: "mt-3 flex flex-col gap-2" },
5889
+ maskRow(),
5890
+ blurRow(),
5891
+ panelRow()
5792
5892
  ),
5793
5893
  bgInput
5794
5894
  );
@@ -10517,6 +10617,236 @@
10517
10617
  });
10518
10618
  }
10519
10619
 
10620
+ // src/inject/features/table-copy.js
10621
+ var installed5 = false;
10622
+ var enabled9 = true;
10623
+ function cleanTable(table) {
10624
+ const clone = table.cloneNode(false);
10625
+ const walk = (src, dst) => {
10626
+ for (const node of src.childNodes) {
10627
+ if (node.nodeType === Node.TEXT_NODE) {
10628
+ if (node.textContent.trim()) dst.append(document.createTextNode(node.textContent));
10629
+ continue;
10630
+ }
10631
+ if (node.nodeType !== Node.ELEMENT_NODE) continue;
10632
+ const tag = node.tagName;
10633
+ const el = document.createElement(tag.toLowerCase());
10634
+ if (tag === "TD" || tag === "TH") {
10635
+ for (const a of ["colspan", "rowspan"]) {
10636
+ const v = node.getAttribute(a);
10637
+ if (v && v !== "1") el.setAttribute(a, v);
10638
+ }
10639
+ }
10640
+ dst.append(el);
10641
+ walk(node, el);
10642
+ }
10643
+ };
10644
+ walk(table, clone);
10645
+ return clone;
10646
+ }
10647
+ function tableToTsv(table) {
10648
+ const rows = [];
10649
+ for (const tr of table.rows) {
10650
+ const cells = [];
10651
+ for (const cell of tr.cells) {
10652
+ cells.push((cell.textContent || "").replace(/[\t\r\n]+/g, " ").trim());
10653
+ }
10654
+ rows.push(cells.join(" "));
10655
+ }
10656
+ return rows.join("\n");
10657
+ }
10658
+ async function copyTable(table) {
10659
+ const L = t();
10660
+ const clean = cleanTable(table);
10661
+ const html = '<meta charset="utf-8"><table>' + clean.innerHTML + "</table>";
10662
+ const tsv = tableToTsv(table);
10663
+ try {
10664
+ if (typeof ClipboardItem !== "undefined" && navigator.clipboard && navigator.clipboard.write) {
10665
+ await navigator.clipboard.write([
10666
+ new ClipboardItem({
10667
+ "text/html": new Blob([html], { type: "text/html" }),
10668
+ "text/plain": new Blob([tsv], { type: "text/plain" })
10669
+ })
10670
+ ]);
10671
+ showToast(L.tableCopied, "success");
10672
+ return;
10673
+ }
10674
+ } catch {
10675
+ }
10676
+ try {
10677
+ const holder = document.createElement("div");
10678
+ holder.contentEditable = "true";
10679
+ holder.style.cssText = "position:fixed;left:-9999px;top:0;";
10680
+ holder.append(clean);
10681
+ document.body.append(holder);
10682
+ const range = document.createRange();
10683
+ range.selectNodeContents(holder);
10684
+ const sel = window.getSelection();
10685
+ sel.removeAllRanges();
10686
+ sel.addRange(range);
10687
+ const ok = document.execCommand("copy");
10688
+ sel.removeAllRanges();
10689
+ holder.remove();
10690
+ if (ok) {
10691
+ showToast(L.tableCopied, "success");
10692
+ return;
10693
+ }
10694
+ } catch {
10695
+ }
10696
+ showToast(L.failed, "error");
10697
+ }
10698
+ function makeButton(onClick) {
10699
+ const L = t();
10700
+ const btn = document.createElement("button");
10701
+ btn.type = "button";
10702
+ btn.setAttribute("aria-label", L.tableCopyBtn);
10703
+ btn.title = L.tableCopyBtn;
10704
+ btn.className = "group/button inline-flex items-center justify-center border border-transparent bg-clip-padding whitespace-nowrap transition-colors outline-none select-none text-foreground hover:bg-hover hover:text-foreground size-7 rounded-lg [&_svg:not([class*='size-'])]:size-4 shrink-0";
10705
+ btn.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-table size-3.5" aria-hidden="true"><path d="M12 3v18"></path><path d="M3 9h18"></path><path d="M3 15h18"></path><path d="M5 21h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2"></path></svg>';
10706
+ btn.addEventListener("click", (e) => {
10707
+ e.stopPropagation();
10708
+ onClick();
10709
+ });
10710
+ return btn;
10711
+ }
10712
+ function startTableCopy() {
10713
+ if (installed5 || typeof document === "undefined") return;
10714
+ installed5 = true;
10715
+ ensureStyle();
10716
+ const tableOf = (bar) => {
10717
+ let scope = bar.parentElement;
10718
+ for (let i = 0; i < 3 && scope; i++) {
10719
+ const table = scope.querySelector("table");
10720
+ if (table) return table;
10721
+ scope = scope.parentElement;
10722
+ }
10723
+ return null;
10724
+ };
10725
+ const enhance = (bar) => {
10726
+ if (bar.dataset.zcodeproTableCopy) return;
10727
+ bar.dataset.zcodeproTableCopy = "1";
10728
+ const table = tableOf(bar);
10729
+ if (!table) return;
10730
+ bar.append(makeButton(() => {
10731
+ void copyTable(table);
10732
+ }));
10733
+ };
10734
+ const scan5 = () => {
10735
+ for (const bar of document.querySelectorAll("[data-markdown-table-toolbar]")) enhance(bar);
10736
+ };
10737
+ scan5();
10738
+ void getConfig().then((cfg) => {
10739
+ enabled9 = cfg.features ? cfg.features.tableCopy !== false : true;
10740
+ }).catch(() => {
10741
+ });
10742
+ window.addEventListener("zcodepro:config-changed", () => {
10743
+ void getConfig(true).then((cfg) => {
10744
+ enabled9 = cfg.features ? cfg.features.tableCopy !== false : true;
10745
+ }).catch(() => {
10746
+ });
10747
+ });
10748
+ const observer2 = new MutationObserver(() => {
10749
+ if (enabled9) scan5();
10750
+ });
10751
+ observer2.observe(document.body, { childList: true, subtree: true });
10752
+ }
10753
+
10754
+ // src/inject/features/composer-provider.js
10755
+ var installed6 = false;
10756
+ var enabled10 = true;
10757
+ function labelToDisplay(label) {
10758
+ const i = label.indexOf("/");
10759
+ if (i <= 0) return null;
10760
+ const provider = label.slice(0, i).trim();
10761
+ const rest = label.slice(i + 1);
10762
+ const model = rest.trim().split(/\s+/)[0];
10763
+ if (!provider || !model) return null;
10764
+ return `${provider} / ${model}`;
10765
+ }
10766
+ function apply3() {
10767
+ if (!enabled10) {
10768
+ for (const btn of document.querySelectorAll('[data-testid="chat-model-select-trigger"]')) {
10769
+ if (!btn.dataset.zcodeproProviderShown) continue;
10770
+ const label = btn.getAttribute("aria-label") || "";
10771
+ const i = label.indexOf("/");
10772
+ if (i <= 0) continue;
10773
+ const model = label.slice(i + 1).trim().split(/\s+/)[0];
10774
+ if (!model) continue;
10775
+ for (const sp of btn.querySelectorAll("span[title]")) sp.setAttribute("title", model);
10776
+ for (const el of btn.querySelectorAll("span[title] span:not([title])")) {
10777
+ if (!el.querySelector("span") && el.textContent.includes("/")) el.textContent = model;
10778
+ }
10779
+ delete btn.dataset.zcodeproProviderShown;
10780
+ }
10781
+ return;
10782
+ }
10783
+ for (const btn of document.querySelectorAll('[data-testid="chat-model-select-trigger"]')) {
10784
+ const label = btn.getAttribute("aria-label") || "";
10785
+ const display = labelToDisplay(label);
10786
+ if (!display) continue;
10787
+ const titleSpans = [...btn.querySelectorAll("span[title]")];
10788
+ if (!titleSpans.length) continue;
10789
+ const innermost = titleSpans.filter((sp) => !sp.querySelector("span[title]"));
10790
+ if (!innermost.length) continue;
10791
+ const holders = [];
10792
+ for (const sp of innermost) {
10793
+ sp.querySelectorAll("span:not([title])").forEach((el) => {
10794
+ if (!el.querySelector("span") && el.textContent.trim() && !el.textContent.includes("/")) holders.push(el);
10795
+ });
10796
+ }
10797
+ if (!holders.length) continue;
10798
+ for (const sp of titleSpans) {
10799
+ if (sp.getAttribute("title") !== display) sp.setAttribute("title", display);
10800
+ }
10801
+ for (const el of holders) el.textContent = display;
10802
+ btn.dataset.zcodeproProviderShown = "1";
10803
+ }
10804
+ }
10805
+ function startComposerProvider() {
10806
+ if (installed6 || typeof document === "undefined") return;
10807
+ installed6 = true;
10808
+ const COMPOSER_SEL = '[data-composer-layout], [data-composer-leading-content], [data-testid="chat-model-select-trigger"]';
10809
+ const relevant2 = (muts) => {
10810
+ for (const m of muts) {
10811
+ if (m.type === "childList") {
10812
+ for (const n of [...m.addedNodes, ...m.removedNodes]) {
10813
+ if (n instanceof Element && (n.matches?.(COMPOSER_SEL) || n.querySelector?.(COMPOSER_SEL))) return true;
10814
+ }
10815
+ } else if (m.type === "characterData") {
10816
+ let el = m.target.parentElement;
10817
+ while (el && el !== document.body) {
10818
+ if (el.matches?.("[data-composer-layout], [data-composer-leading-actions], [data-composer-leading-content]")) return true;
10819
+ el = el.parentElement;
10820
+ }
10821
+ }
10822
+ }
10823
+ return false;
10824
+ };
10825
+ const schedule = () => {
10826
+ clearTimeout(schedule.t);
10827
+ schedule.t = setTimeout(apply3, 120);
10828
+ };
10829
+ void getConfig().then((cfg) => {
10830
+ enabled10 = cfg.features ? cfg.features.composerProvider !== false : true;
10831
+ }).catch(() => {
10832
+ });
10833
+ window.addEventListener("zcodepro:config-changed", () => {
10834
+ void getConfig(true).then((cfg) => {
10835
+ const next = cfg.features ? cfg.features.composerProvider !== false : true;
10836
+ if (next !== enabled10) {
10837
+ enabled10 = next;
10838
+ apply3();
10839
+ }
10840
+ }).catch(() => {
10841
+ });
10842
+ });
10843
+ const observer2 = new MutationObserver((muts) => {
10844
+ if (enabled10 && relevant2(muts)) schedule();
10845
+ });
10846
+ observer2.observe(document.body, { childList: true, subtree: true, characterData: true });
10847
+ apply3();
10848
+ }
10849
+
10520
10850
  // src/inject/features/plugin-updates.js
10521
10851
  var NOTIFIED_KEY = "zcodepro-plugin-updates-notified";
10522
10852
  async function startPluginUpdateCheck() {
@@ -10648,6 +10978,14 @@
10648
10978
  startTheme();
10649
10979
  } catch {
10650
10980
  }
10981
+ try {
10982
+ startTableCopy();
10983
+ } catch {
10984
+ }
10985
+ try {
10986
+ startComposerProvider();
10987
+ } catch {
10988
+ }
10651
10989
  try {
10652
10990
  startSettingsEntry();
10653
10991
  } catch {