zcode-pro 1.4.1 → 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",
@@ -348,6 +348,8 @@
348
348
  themeBgPanel: "\u9762\u677F\u4E0D\u900F\u660E\u5EA6",
349
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",
350
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",
351
353
  sbItemCtx: "\u4E0A\u4E0B\u6587\u5360\u7528",
352
354
  sbItemQuestions: "\u63D0\u95EE\u6B21\u6570",
353
355
  sbMaster: "\u542F\u7528\u7EDF\u8BA1",
@@ -400,7 +402,11 @@
400
402
  featureFileActions: "\u6587\u4EF6\u83DC\u5355\u589E\u5F3A",
401
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",
402
404
  featureImageCopy: "\u56FE\u7247\u53F3\u952E\u590D\u5236",
405
+ featureTableCopy: "\u590D\u5236\u8868\u683C",
406
+ featureComposerProvider: "\u6A21\u578B\u540D\u663E\u793A\u4F9B\u5E94\u5546",
403
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",
404
410
  imageCopy: "\u590D\u5236\u56FE\u7247",
405
411
  imageCopied: "\u56FE\u7247\u5DF2\u590D\u5236\u5230\u526A\u8D34\u677F",
406
412
  imageCopyFailed: "\u590D\u5236\u56FE\u7247\u5931\u8D25",
@@ -423,7 +429,7 @@
423
429
  pluginsUpdatesAvailable: "zcode-plugins \u6709 {n} \u4E2A\u63D2\u4EF6\u53EF\u66F4\u65B0\uFF08ZCode Pro \u8BBE\u7F6E \u2192 \u529F\u80FD\uFF09",
424
430
  pluginsAutoUpdated: "zcode-plugins \u63D2\u4EF6\u5DF2\u66F4\u65B0",
425
431
  tabVision: "Vision",
426
- 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",
427
433
  visionEnabled: "\u542F\u7528",
428
434
  visionForceIntercept: "\u4E3B\u6A21\u578B\u80FD\u770B\u56FE\u4E5F\u62E6\u622A",
429
435
  visionMode: "\u94FE\u6A21\u5F0F",
@@ -454,14 +460,14 @@
454
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",
455
461
  visionLoadFailed: "\u8BFB\u53D6\u89C6\u89C9\u4EE3\u7406\u914D\u7F6E\u5931\u8D25",
456
462
  tabRtk: "rtk",
457
- 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",
458
464
  rtkEnabled: "\u542F\u7528",
459
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",
460
466
  rtkInstallBin: "\u5B89\u88C5 rtk \u672C\u4F53",
461
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",
462
468
  rtkWhitelistTitle: "\u767D\u540D\u5355\uFF08\u4E0D\u538B\u7F29\u76F4\u63A5\u653E\u884C\uFF09",
463
469
  rtkBuiltinLabel: "\u5185\u7F6E\u653E\u884C\uFF08\u53EA\u8BFB\uFF0C\u968F\u63D2\u4EF6\u66F4\u65B0\uFF09\uFF1A",
464
- 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",
465
471
  rtkWhitelistPlaceholder: "name \u6216 git:name\uFF0C\u56DE\u8F66\u6DFB\u52A0",
466
472
  rtkWhitelistAdd: "\u6DFB\u52A0",
467
473
  rtkWhitelistClear: "\u6E05\u7A7A",
@@ -469,18 +475,18 @@
469
475
  rtkWhitelistInvalid: "\u6761\u76EE\u683C\u5F0F\u5E94\u4E3A name \u6216 git:name",
470
476
  rtkLoadFailed: "\u8BFB\u53D6 rtk \u914D\u7F6E\u5931\u8D25",
471
477
  tabHeadroom: "Headroom",
472
- 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",
473
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",
474
480
  hrInstallBin: "\u5B89\u88C5 headroom \u672C\u4F53",
475
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",
476
482
  headroomInstallTitle: "\u672A\u5B89\u88C5 headroom \u63D2\u4EF6",
477
- 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",
478
484
  headroomInstall: "\u5B89\u88C5",
479
485
  headroomInstalling: "\u5B89\u88C5\u4E2D\u2026",
480
486
  headroomInstalled: "\u5DF2\u5B89\u88C5 headroom \u63D2\u4EF6",
481
487
  headroomInstallRetry: "\u5B89\u88C5\u672A\u751F\u6548\uFF0C\u8BF7\u91CD\u8BD5\u6216\u624B\u52A8\u5728\u63D2\u4EF6\u5E02\u573A\u5B89\u88C5",
482
488
  pluginInstallCardTitle: "\u672A\u5B89\u88C5 {name} \u63D2\u4EF6",
483
- 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",
484
490
  pluginInstallDone: "\u5DF2\u5B89\u88C5 {name} \u63D2\u4EF6",
485
491
  pluginEnable: "\u542F\u7528",
486
492
  hrStarting: "\u6B63\u5728\u542F\u52A8\u538B\u7F29\u4EE3\u7406\u2026",
@@ -523,7 +529,7 @@
523
529
  headroomBackendAuto: "\u81EA\u52A8 \xB7 \u663E\u5361\u4F18\u5148",
524
530
  headroomBackendCpu: "\u7701\u7535 \xB7 CPU \u4F18\u5148",
525
531
  headroomBackendNative: "\uFF08\u539F\u751F\u503C\uFF09",
526
- 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",
527
533
  headroomPower: "\u7701\u7535\u81EA\u52A8\u5207\u6362",
528
534
  headroomPowerOff: "\u5173\u95ED",
529
535
  headroomPowerOffDesc: "\u4E0D\u81EA\u52A8\u5207\u6362\uFF0C\u59CB\u7EC8\u6309\u201C\u538B\u7F29\u8BBE\u5907\u201D\u8FD0\u884C\u3002",
@@ -533,7 +539,7 @@
533
539
  headroomPowerSaverDesc: "\u4EC5\u7CFB\u7EDF\u8FDB\u5165\u7701\u7535\u6A21\u5F0F \u2192 CPU \u538B\u7F29\uFF0C\u9000\u51FA\u5207\u56DE\u3002",
534
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",
535
541
  headroomInterval: "\u76D1\u89C6\u95F4\u9694",
536
- 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",
537
543
  headroomSecUnit: "\u79D2",
538
544
  upgradeCheck: "\u68C0\u67E5\u66F4\u65B0",
539
545
  upgradeChecking: "\u68C0\u67E5\u4E2D\u2026",
@@ -620,7 +626,7 @@
620
626
  agentsSave: "Save",
621
627
  agentsSaved: "Global prompt saved.",
622
628
  agentsLoadFailed: "Failed to load the global prompt",
623
- 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.",
624
630
  proxyPlaceholder: "http://127.0.0.1:7890",
625
631
  proxySave: "Save",
626
632
  proxySaved: "Proxy settings saved.",
@@ -634,7 +640,7 @@
634
640
  proxyScopeDeps: "Plugin dependencies",
635
641
  proxyScopeDepsDesc: "headroom and rtk installs, update checks and upgrades (pip and GitHub downloads) go through the proxy.",
636
642
  proxyScopeSync: "Sync",
637
- 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.",
638
644
  tabSync: "Sync",
639
645
  tabDebug: "Debug",
640
646
  testNoSessionHint: "With \u201Cfollow current session [current model]\u201D selected, the provider [model] of the last session is used.",
@@ -721,13 +727,13 @@
721
727
  defaultValue: "default",
722
728
  resetDefault: "Reset to default",
723
729
  featureProjectMenu: "Project menu actions",
724
- 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).",
725
731
  featureTaskOrder: "Sidebar session drag ordering",
726
- 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.",
727
733
  featureSessionSwitch: "Session quick switch",
728
- 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",
729
735
  featureTitleLock: "Keep renamed session titles",
730
- 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.",
731
737
  tabTitleGen: "Task name prompt",
732
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.",
733
739
  titleGenEnabled: "Enable",
@@ -753,7 +759,7 @@
753
759
  titleGenTestOk: "Result: ",
754
760
  titleGenTestFailed: "Generation failed",
755
761
  featureWsRunning: "Running indicator when collapsed",
756
- 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.",
757
763
  tabPerformance: "Performance",
758
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.",
759
765
  featureIdleReclaim: "Idle project memory reclaim",
@@ -763,15 +769,15 @@
763
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",
764
770
  idleReclaimUnit: "min",
765
771
  featureToolbarIcons: "Sidebar menu in the top bar",
766
- 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.",
767
773
  tbNewTask: "New task",
768
774
  tbSearch: "Search",
769
775
  tbAutomations: "Automations",
770
776
  tbPluginStore: "Plugin store",
771
777
  featurePinnedCollapse: "Collapsible Pinned section",
772
- 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.",
773
779
  featureSandboxReclaim: "Plugin card sandbox reclaim",
774
- 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.",
775
781
  featurePluginCardRetry: "Plugin card auto-retry",
776
782
  featurePluginCardRetryDesc: 'Auto-clicks "Reload" on cards that failed the slot cap; they recover as soon as a slot frees up.',
777
783
  visionCardUi: "Vision cards",
@@ -796,7 +802,7 @@
796
802
  switcherAttentionHint: "Running / finished but unseen tasks \xB7 {prev} / {next} or \u2191 / \u2193 to choose, Enter or release alt to switch",
797
803
  switcherAttentionEmpty: "No running or unseen tasks",
798
804
  featureNewtabPanels: "Plugin panels on the new tab page",
799
- 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.",
800
806
  ntpDescSuffix: "plugin panel",
801
807
  ntpNeedSession: "Open a task session first, then open plugin panels from the new tab page",
802
808
  featureStatusBarDesc: "Shows statistics at the bottom-right of the input box and at the end of each answer.",
@@ -854,6 +860,8 @@
854
860
  themeBgPanel: "Panel opacity",
855
861
  themeBgPanelHint: "Opacity of sidebar, panels and tab bar. Lower reveals more of the image.",
856
862
  themeBgDeletedActive: "Active background was deleted; background disabled",
863
+ tableCopyBtn: "Copy table",
864
+ tableCopied: "Table copied",
857
865
  sbItemCtx: "Context usage",
858
866
  sbItemQuestions: "Questions asked",
859
867
  sbMaster: "Enable statistics",
@@ -906,7 +914,11 @@
906
914
  featureFileActions: "File menu actions",
907
915
  featureFileActionsDesc: 'Adds "Open with default app" and "Reveal in file manager" to the right-click menu of file links in chat.',
908
916
  featureImageCopy: "Image right-click copy",
917
+ featureTableCopy: "Copy table",
918
+ featureComposerProvider: "Provider in model name",
909
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).",
910
922
  imageCopy: "Copy image",
911
923
  imageCopied: "Image copied to the clipboard.",
912
924
  imageCopyFailed: "Failed to copy the image.",
@@ -929,7 +941,7 @@
929
941
  pluginsUpdatesAvailable: "{n} zcode-plugins update(s) available (ZCode Pro settings \u2192 Features)",
930
942
  pluginsAutoUpdated: "zcode-plugins updated",
931
943
  tabVision: "Vision",
932
- 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).",
933
945
  visionEnabled: "Enable",
934
946
  visionForceIntercept: "Intercept even if the main model sees images",
935
947
  visionMode: "Chain mode",
@@ -960,14 +972,14 @@
960
972
  visionCompressKBHint: "Images above this size are compressed first (max edge 2000, JPEG); 0 = never",
961
973
  visionLoadFailed: "Failed to load the vision config",
962
974
  tabRtk: "rtk",
963
- 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).",
964
976
  rtkEnabled: "Enable",
965
977
  rtkNotInstalled: "rtk is not installed. The settings below take effect after installation (/rtk-setup in a session).",
966
978
  rtkInstallBin: "Install rtk binary",
967
979
  rtkBinInstalled: "rtk installed; PATH takes effect for sessions after signing out and back in \u2014 the plugin hook works immediately",
968
980
  rtkWhitelistTitle: "Whitelist (pass through without compression)",
969
981
  rtkBuiltinLabel: "Built-in exemptions (read-only, follow plugin updates):",
970
- 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.",
971
983
  rtkWhitelistPlaceholder: "name or git:name, press Enter to add",
972
984
  rtkWhitelistAdd: "Add",
973
985
  rtkWhitelistClear: "Clear",
@@ -975,18 +987,18 @@
975
987
  rtkWhitelistInvalid: "Entry must be name or git:name",
976
988
  rtkLoadFailed: "Failed to load the rtk config",
977
989
  tabHeadroom: "Headroom",
978
- 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.",
979
991
  headroomBinMissing: "The headroom program was not found, so the proxy cannot start. The settings below take effect once it is installed.",
980
992
  hrInstallBin: "Install headroom binary",
981
993
  hrBinInstalled: "headroom installed; reopen a session and the hook will start the proxy automatically",
982
994
  headroomInstallTitle: "headroom plugin not installed",
983
- 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.",
984
996
  headroomInstall: "Install",
985
997
  headroomInstalling: "Installing\u2026",
986
998
  headroomInstalled: "headroom plugin installed",
987
999
  headroomInstallRetry: "Installation did not take effect; retry or install it from the marketplace manually",
988
1000
  pluginInstallCardTitle: "{name} plugin not installed",
989
- 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.",
990
1002
  pluginInstallDone: "{name} plugin installed",
991
1003
  pluginEnable: "Enable",
992
1004
  hrStarting: "Starting compression proxy\u2026",
@@ -1039,7 +1051,7 @@
1039
1051
  headroomPowerSaverDesc: "Only the system power-saver mode \u2192 CPU; back when it exits.",
1040
1052
  hrCpuPinnedHint: "The compression device is pinned to CPU, so power-save switching no longer changes anything.",
1041
1053
  headroomInterval: "Watch interval",
1042
- 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.",
1043
1055
  headroomSecUnit: "s",
1044
1056
  upgradeCheck: "Check update",
1045
1057
  upgradeChecking: "Checking\u2026",
@@ -1619,7 +1631,7 @@
1619
1631
  "div",
1620
1632
  { class: "min-w-0 flex-1" },
1621
1633
  h("div", { class: "text-ui-sm font-medium text-foreground" }, name),
1622
- 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 ?? "")
1623
1635
  ),
1624
1636
  ...extraEl ? [extraEl] : [],
1625
1637
  h("button", {
@@ -1661,6 +1673,14 @@
1661
1673
  /* \u6EDA\u5230\u5E95\u4E0D\u518D\u628A\u6EDA\u52A8\u4F20\u7ED9\u5F39\u7A97\u540E\u9762\u7684\u9875\u9762 */
1662
1674
  overscroll-behavior: contain;
1663
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
+ }
1664
1684
  /* \u5F00\u5173\uFF08\u8BBE\u7F6E\u5F39\u7A97\uFF09\uFF1A\u51E0\u4F55\u56FA\u5B9A\u5199\u5165\uFF0C\u989C\u8272\u968F\u4E3B\u9898\u53D8\u91CF */
1665
1685
  [data-zcodepro-switch] {
1666
1686
  position: relative;
@@ -1957,6 +1977,9 @@
1957
1977
  height: 12px;
1958
1978
  flex-shrink: 0;
1959
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);
1960
1983
  }
1961
1984
  .zcodepro-statusbar b { font-weight: 600; color: var(--color-foreground-subtle, #666); }
1962
1985
  .zcodepro-statusbar i {
@@ -3124,10 +3147,10 @@
3124
3147
  function startImageMenu() {
3125
3148
  if (typeof window === "undefined") return;
3126
3149
  if (typeof navigator.clipboard?.write !== "function" || typeof window.ClipboardItem === "undefined") return;
3127
- let enabled9 = true;
3150
+ let enabled11 = true;
3128
3151
  const refresh = () => {
3129
3152
  void getConfig().then((c) => {
3130
- enabled9 = !(c.features && c.features.imageCopy === false);
3153
+ enabled11 = !(c.features && c.features.imageCopy === false);
3131
3154
  });
3132
3155
  };
3133
3156
  refresh();
@@ -3136,7 +3159,7 @@
3136
3159
  const img = copyTargetOf(e.target, e.clientX, e.clientY);
3137
3160
  if (!img) return;
3138
3161
  e.preventDefault();
3139
- if (enabled9) showMenu(e.clientX, e.clientY, img);
3162
+ if (enabled11) showMenu(e.clientX, e.clientY, img);
3140
3163
  refresh();
3141
3164
  }, true);
3142
3165
  }
@@ -4651,8 +4674,12 @@
4651
4674
  h("span", { class: "inline-block size-2 rounded-full bg-emerald-500" }),
4652
4675
  h("span", { class: "text-foreground-subtle/70" }, `${health.version} \xB7 ${HELPER_URL}`)
4653
4676
  );
4654
- 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" });
4655
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
+ };
4656
4683
  const pluginsBtn = btnSmall(L.pluginsCheckNow, () => {
4657
4684
  void runPluginsUpdate();
4658
4685
  });
@@ -4661,23 +4688,23 @@
4661
4688
  if (pluginsUpdating) return;
4662
4689
  pluginsUpdating = true;
4663
4690
  pluginsBtn.disabled = true;
4664
- pluginsStatusLine.textContent = L.pluginsUpdating;
4691
+ setPluginsStatus(L.pluginsUpdating);
4665
4692
  const res = await rpc("/plugins/update", { method: "POST", body: {} });
4666
4693
  pluginsUpdating = false;
4667
4694
  pluginsBtn.disabled = false;
4668
4695
  if (!res.ok) {
4669
- pluginsStatusLine.textContent = "";
4696
+ setPluginsStatus("");
4670
4697
  showToast(L.pluginsUpdateFailed + ": " + errText(res), "error");
4671
4698
  return;
4672
4699
  }
4673
- 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);
4674
4701
  showToast(pluginsStatusLine.textContent, "success");
4675
4702
  };
4676
4703
  void (async () => {
4677
4704
  const cfg = await getConfig(true).catch(() => null);
4678
4705
  const res = await rpc("/plugins/status");
4679
4706
  if (!res.ok) {
4680
- pluginsStatusLine.textContent = "";
4707
+ setPluginsStatus("");
4681
4708
  return;
4682
4709
  }
4683
4710
  const n = (res.updates || []).length;
@@ -4685,7 +4712,7 @@
4685
4712
  void runPluginsUpdate();
4686
4713
  return;
4687
4714
  }
4688
- pluginsStatusLine.textContent = n > 0 ? L.pluginsUpdatesFound.replaceAll("{n}", String(n)) : L.pluginsUpToDate;
4715
+ setPluginsStatus(n > 0 ? L.pluginsUpdatesFound.replaceAll("{n}", String(n)) : L.pluginsUpToDate);
4689
4716
  })();
4690
4717
  const HK_ACTIONS = [
4691
4718
  ["switchLast", "hkAltZ"],
@@ -4753,6 +4780,16 @@
4753
4780
  if (await setFeature("imageCopy", next)) f.imageCopy = next;
4754
4781
  refreshRows();
4755
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
+ }),
4756
4793
  settingRow(L.featureSandboxReclaim, L.featureSandboxReclaimDesc, f.sandboxReclaim !== false, async () => {
4757
4794
  const next = !(f.sandboxReclaim !== false);
4758
4795
  if (await setFeature("sandboxReclaim", next)) f.sandboxReclaim = next;
@@ -4791,12 +4828,14 @@
4791
4828
  if (nameEl) {
4792
4829
  nameEl.replaceChildren(
4793
4830
  document.createTextNode(L.featureAutoUpdatePlugins + " "),
4794
- repoLink,
4795
- document.createTextNode(" \u63D2\u4EF6")
4831
+ repoLink
4796
4832
  );
4797
4833
  }
4798
4834
  const descEl = row.querySelector("[data-zcodepro-row-desc]");
4799
- if (descEl) descEl.replaceChildren(pluginsStatusLine);
4835
+ if (descEl) {
4836
+ descEl.replaceChildren(pluginsStatusLine);
4837
+ descEl.setAttribute("title", descEl.textContent.trim());
4838
+ }
4800
4839
  return row;
4801
4840
  })()
4802
4841
  );
@@ -4989,10 +5028,10 @@
4989
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 };
4990
5029
  const tabDefs = [
4991
5030
  ["features", L.tabFeatures],
4992
- ["shortcuts", L.tabShortcuts],
4993
- ["agents", L.tabBehavior],
4994
5031
  ["styles", L.tabStyles],
5032
+ ["agents", L.tabBehavior],
4995
5033
  ["perf", L.tabPerformance],
5034
+ ["shortcuts", L.tabShortcuts],
4996
5035
  ["proxy", L.tabProxy],
4997
5036
  ["sync", L.tabSync],
4998
5037
  ["vision", L.tabVision],
@@ -10578,6 +10617,236 @@
10578
10617
  });
10579
10618
  }
10580
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
+
10581
10850
  // src/inject/features/plugin-updates.js
10582
10851
  var NOTIFIED_KEY = "zcodepro-plugin-updates-notified";
10583
10852
  async function startPluginUpdateCheck() {
@@ -10709,6 +10978,14 @@
10709
10978
  startTheme();
10710
10979
  } catch {
10711
10980
  }
10981
+ try {
10982
+ startTableCopy();
10983
+ } catch {
10984
+ }
10985
+ try {
10986
+ startComposerProvider();
10987
+ } catch {
10988
+ }
10712
10989
  try {
10713
10990
  startSettingsEntry();
10714
10991
  } catch {