@dsh-workbench/core 0.1.17 → 0.1.18

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/client.js CHANGED
@@ -443,7 +443,12 @@ window.__ModuleLoader__.load({
443
443
  "host"
444
444
  ];
445
445
  var CARD_KEYS = ["titleKey", "order"];
446
- var TOOL_KEYS = ["name", "writes"];
446
+ var TOOL_KEYS = [
447
+ "name",
448
+ "writes",
449
+ "key"
450
+ ];
451
+ var TOOL_KEY_SHAPE = /^[a-z][a-zA-Z0-9]*$/;
447
452
  var HOST_KEYS = ["inject", "optional"];
448
453
  function text(value) {
449
454
  return typeof value === "string" ? value.trim() : "";
@@ -485,6 +490,7 @@ window.__ModuleLoader__.load({
485
490
  if (!Array.isArray(tools)) problems.push(`${subject}: dsh.workbench.tools 要是一串声明,现在是 ${JSON.stringify(tools)}`);
486
491
  else {
487
492
  const seen = /* @__PURE__ */ new Set();
493
+ const seenKeys = /* @__PURE__ */ new Set();
488
494
  tools.forEach((tool, index) => {
489
495
  const at = `dsh.workbench.tools[${index}]`;
490
496
  if (!isRecord(tool)) {
@@ -498,6 +504,12 @@ window.__ModuleLoader__.load({
498
504
  else if (seen.has(name)) problems.push(`${subject}: ${at}.name「${name}」与前面那条撞了 —— 工具名会进 dsh 的工具表,不许重`);
499
505
  else seen.add(name);
500
506
  if (typeof tool.writes !== "boolean") problems.push(`${subject}: ${at}.writes 要是 true / false(它是"这会写"的唯一声明,缺了审批无从认领)`);
507
+ if (tool.key !== void 0) {
508
+ const key = text(tool.key);
509
+ if (!TOOL_KEY_SHAPE.test(key)) problems.push(`${subject}: ${at}.key 要是 lowerCamelCase 的标识符(如 \`sync\` / \`podLogs\`),现在是 ${JSON.stringify(tool.key)} —— 它会变成生成物里的键名,所以不引号、不许带点或横线`);
510
+ else if (seenKeys.has(key)) problems.push(`${subject}: ${at}.key「${key}」与前面那条撞了 —— 生成物里的键只能有一个`);
511
+ else seenKeys.add(key);
512
+ }
501
513
  });
502
514
  }
503
515
  }
@@ -1229,11 +1241,10 @@ window.__ModuleLoader__.load({
1229
1241
  "panels.market.missing": "not installed",
1230
1242
  "panels.market.unchecked": "unknown",
1231
1243
  "panels.market.checking": "checking",
1232
- "panels.market.sectionInstalled": "Installed",
1244
+ "panels.market.sectionInstalled": "Installed modules",
1233
1245
  "panels.market.sectionPending": "Not installed",
1234
1246
  "panels.market.sectionShared": "Shared dependencies",
1235
1247
  "panels.market.sharedUsedBy": "Used by {modules}",
1236
- "panels.market.sharedFoot": "These cannot be uninstalled here: they come with modules, and would be reinstalled anyway. To stop using one, turn off the modules that use it.",
1237
1248
  "panels.market.listSeparator": ", ",
1238
1249
  "panels.market.sharedMissing": "not installed",
1239
1250
  "panels.market.sharedOutdated": "update available",
@@ -1258,15 +1269,13 @@ window.__ModuleLoader__.load({
1258
1269
  "panels.market.noSource": "This module declares no install method — install it yourself",
1259
1270
  "panels.market.badSource": "The install method is incomplete — install it yourself",
1260
1271
  "panels.market.empty": "No modules available",
1261
- "panels.market.installedSection": "Installed",
1262
- "panels.market.sectionLocal": "Linked locally",
1272
+ "panels.market.sectionLocal": "Local modules",
1263
1273
  "panels.market.sectionUnlisted": "Not from the market",
1264
1274
  "panels.market.sectionPlugins": "Installed opencli plugins",
1265
1275
  "panels.market.moduleOutdated": "update available",
1266
1276
  "panels.market.moduleRefused": "This module was built for an older version of the workbench, so it does not work here. Update it, or uninstall.",
1267
1277
  "panels.market.moduleRefusedDetail": "Why it cannot be used: {reason}",
1268
1278
  "panels.market.moduleRestartHint": "installed but not active — restart dsh once to bring it up",
1269
- "panels.market.pluginLocalNoUpdate": "Installed from a local folder, so there is nowhere to check for a newer version — uninstall only",
1270
1279
  "panels.market.pluginKeptInUse": "Files kept for now: {names} still uses it.",
1271
1280
  "panels.market.pluginKeptUnsure": "Files kept for now: some modules on this machine do not say what they use, so it is unclear who needs it.",
1272
1281
  "panels.market.pluginKeptHeld": "Files kept: this one is yours, and a module letting go will not remove it.",
@@ -1560,11 +1569,10 @@ window.__ModuleLoader__.load({
1560
1569
  "panels.market.missing": "未装",
1561
1570
  "panels.market.unchecked": "状态未知",
1562
1571
  "panels.market.checking": "检测中",
1563
- "panels.market.sectionInstalled": "已安装",
1572
+ "panels.market.sectionInstalled": "已安装模块",
1564
1573
  "panels.market.sectionPending": "未安装",
1565
1574
  "panels.market.sectionShared": "共用依赖",
1566
1575
  "panels.market.sharedUsedBy": "供 {modules} 使用",
1567
- "panels.market.sharedFoot": "这一段不给卸载:它们跟着模块来,卸掉也会被装回来。要停用一份,就去关掉正在用它的那些模块。",
1568
1576
  "panels.market.listSeparator": "、",
1569
1577
  "panels.market.sharedMissing": "未装",
1570
1578
  "panels.market.sharedOutdated": "有新版",
@@ -1589,15 +1597,13 @@ window.__ModuleLoader__.load({
1589
1597
  "panels.market.noSource": "这个模块没声明怎么装,只能自己动手",
1590
1598
  "panels.market.badSource": "安装方式没写全,只能自己动手",
1591
1599
  "panels.market.empty": "暂无可用模块",
1592
- "panels.market.installedSection": "已安装",
1593
- "panels.market.sectionLocal": "本地装的",
1600
+ "panels.market.sectionLocal": "本地模块",
1594
1601
  "panels.market.sectionUnlisted": "不是从市场装的",
1595
1602
  "panels.market.sectionPlugins": "已安装 opencli 插件",
1596
1603
  "panels.market.moduleOutdated": "有新版",
1597
1604
  "panels.market.moduleRefused": "这个模块是给旧版本的工作台写的,现在用不了。更新它,或者卸载。",
1598
1605
  "panels.market.moduleRefusedDetail": "装不上的原因:{reason}",
1599
1606
  "panels.market.moduleRestartHint": "装好了但还没生效 —— 重启一次 dsh 就会出来",
1600
- "panels.market.pluginLocalNoUpdate": "本地装的,没地方查新版,所以只给卸载",
1601
1607
  "panels.market.pluginKeptInUse": "文件先留着:{names} 还要用它。",
1602
1608
  "panels.market.pluginKeptUnsure": "文件先留着:这台机器上还有模块看不出用了什么,说不准谁在用它。",
1603
1609
  "panels.market.pluginKeptHeld": "文件留着:你自己装的那一份,模块放手不动它。",
@@ -2399,6 +2405,9 @@ window.__ModuleLoader__.load({
2399
2405
  //#endregion
2400
2406
  //#region src/app/layouts/rightbar/market-freshness.ts
2401
2407
  var MARKET_STALE_MS = VERSION_CHECK_TTL_MS;
2408
+ function marketSettled(freshness, installedRead) {
2409
+ return freshness.loaded && installedRead !== false;
2410
+ }
2402
2411
  function shouldProbeOnEnter(input) {
2403
2412
  if (input.checkedAt === null) return true;
2404
2413
  return input.now - input.checkedAt >= input.staleMs;
@@ -2885,7 +2894,7 @@ window.__ModuleLoader__.load({
2885
2894
  },
2886
2895
  {
2887
2896
  id: "plugin-local",
2888
- label: "本地目录装的 opencli 插件:没有版本源(只给卸载,行上说清为什么)",
2897
+ label: "本地目录装的 opencli 插件:没有版本源,只给卸载",
2889
2898
  manifests: [],
2890
2899
  capabilities: {},
2891
2900
  plugins: [{
@@ -2897,8 +2906,7 @@ window.__ModuleLoader__.load({
2897
2906
  rows: 0,
2898
2907
  plugins: 1,
2899
2908
  pluginActions: ["uninstall-plugin"],
2900
- pluginNote: true,
2901
- pluginNoteKey: "panels.market.pluginLocalNoUpdate"
2909
+ pluginNote: false
2902
2910
  }
2903
2911
  },
2904
2912
  {
@@ -3595,10 +3603,7 @@ window.__ModuleLoader__.load({
3595
3603
  key: "panels.market.pluginBroken",
3596
3604
  params: {}
3597
3605
  };
3598
- if (plugin.local === true) return {
3599
- key: "panels.market.pluginLocalNoUpdate",
3600
- params: {}
3601
- };
3606
+ if (plugin.local === true) return void 0;
3602
3607
  if (plugin.name !== void 0 && plugin.name !== plugin.pkg) return {
3603
3608
  key: "panels.market.pluginAlsoKnownAs",
3604
3609
  params: { pkg: plugin.pkg }
@@ -3861,16 +3866,6 @@ window.__ModuleLoader__.load({
3861
3866
  function MarketEmpty({ t }) {
3862
3867
  return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmptyTitle }, t("panels.market.empty")));
3863
3868
  }
3864
- var PanelFoot_module_default = {
3865
- foot: "_foot_1us83_1",
3866
- footText: "_footText_1us83_12",
3867
- footTextMd: "_footTextMd_1us83_17"
3868
- };
3869
- //#endregion
3870
- //#region src/shared/components/PanelFoot.tsx
3871
- function PanelFoot({ text, size = "sm", children }) {
3872
- return /* @__PURE__ */ h("footer", { className: PanelFoot_module_default.foot }, /* @__PURE__ */ h("span", { className: size === "md" ? PanelFoot_module_default.footTextMd : PanelFoot_module_default.footText }, text), children ?? null);
3873
- }
3874
3869
  //#endregion
3875
3870
  //#region src/app/layouts/rightbar/market-view-text.ts
3876
3871
  var PROGRESS_KEY = {
@@ -3939,10 +3934,17 @@ window.__ModuleLoader__.load({
3939
3934
  pending,
3940
3935
  failure: failureOf(row.id),
3941
3936
  onAct: (action) => void act(row.id, action)
3942
- }))), /* @__PURE__ */ h(PanelFoot, {
3943
- size: "md",
3944
- text: t("panels.market.sharedFoot")
3945
- }));
3937
+ }))));
3938
+ }
3939
+ var PanelFoot_module_default = {
3940
+ foot: "_foot_1us83_1",
3941
+ footText: "_footText_1us83_12",
3942
+ footTextMd: "_footTextMd_1us83_17"
3943
+ };
3944
+ //#endregion
3945
+ //#region src/shared/components/PanelFoot.tsx
3946
+ function PanelFoot({ text, size = "sm", children }) {
3947
+ return /* @__PURE__ */ h("footer", { className: PanelFoot_module_default.foot }, /* @__PURE__ */ h("span", { className: size === "md" ? PanelFoot_module_default.footTextMd : PanelFoot_module_default.footText }, text), children ?? null);
3946
3948
  }
3947
3949
  //#endregion
3948
3950
  //#region src/app/layouts/rightbar/MarketView.tsx
@@ -4145,7 +4147,7 @@ window.__ModuleLoader__.load({
4145
4147
  message: t("panels.market.failed", { reason })
4146
4148
  });
4147
4149
  };
4148
- const settled = freshness.loaded && installedRead !== false;
4150
+ const settled = marketSettled(freshness, installedRead);
4149
4151
  const nothing = shown.length === 0 && installedList.length === 0 && pluginList.length === 0;
4150
4152
  if (!settled || (settling?.size ?? 0) > 0 && shown.length === 0 && installedList.length === 0) return /* @__PURE__ */ h(MarketChecking, { t });
4151
4153
  if (nothing) return /* @__PURE__ */ h(MarketEmpty, { t });
@@ -5201,11 +5203,14 @@ window.__ModuleLoader__.load({
5201
5203
  });
5202
5204
  const mock = fixturePick.enabled ? fixturePick.current : void 0;
5203
5205
  const mockNonce = fixturePick.nonce;
5206
+ const shownFreshness = mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS;
5207
+ const shownRead = mock === void 0 ? installedRead : mock.installedRead ?? true;
5208
+ const busy = !marketSettled(shownFreshness, shownRead) || shownFreshness.checking;
5204
5209
  return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketPage }, /* @__PURE__ */ h("header", { className: MarketPage_module_default.marketPageHead }, /* @__PURE__ */ h("div", null, /* @__PURE__ */ h("h1", { className: MarketPage_module_default.marketPageTitle }, t("panels.tab.market")), /* @__PURE__ */ h("p", { className: MarketPage_module_default.marketPageIntro }, t("panels.market.lead"))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketPageTools }, /* @__PURE__ */ h(Tip, { label: t("panels.market.recheck") }, /* @__PURE__ */ h("button", {
5205
5210
  type: "button",
5206
- className: `${MarketPage_module_default.marketIconButton}${checking ? ` ${MarketPage_module_default.marketIconButtonSpinning}` : ""}`,
5211
+ className: `${MarketPage_module_default.marketIconButton}${shownFreshness.checking ? ` ${MarketPage_module_default.marketIconButtonSpinning}` : ""}`,
5207
5212
  "aria-label": t("panels.market.checkUpdates"),
5208
- disabled: checking,
5213
+ disabled: busy,
5209
5214
  onClick: () => {
5210
5215
  forceProbe();
5211
5216
  reloadVersions({ force: true });
@@ -5218,6 +5223,7 @@ window.__ModuleLoader__.load({
5218
5223
  size: "sm",
5219
5224
  className: MarketPage_module_default.marketAddButton,
5220
5225
  icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutlineRegular, { size: 13 }),
5226
+ disabled: busy,
5221
5227
  onClick: () => setAdding(true)
5222
5228
  }, t("panels.market.add.open")))), fixturePick.enabled ? /* @__PURE__ */ h(MockStrip, {
5223
5229
  mocks: marketMocks,
@@ -5228,11 +5234,11 @@ window.__ModuleLoader__.load({
5228
5234
  t,
5229
5235
  manifests,
5230
5236
  capabilities,
5231
- freshness: mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS,
5237
+ freshness: shownFreshness,
5232
5238
  onChanged: reload,
5233
5239
  updates,
5234
5240
  installed,
5235
- installedRead: mock === void 0 ? installedRead : mock.installedRead ?? true,
5241
+ installedRead: shownRead,
5236
5242
  plugins,
5237
5243
  settling: mock === void 0 ? settling : void 0,
5238
5244
  mock
package/dist/board.css ADDED
@@ -0,0 +1,31 @@
1
+ [data-wb-dot] {
2
+ display: flex;
3
+ align-items: center;
4
+ gap: var(--wb-len-6);
5
+ }
6
+
7
+ .wb-iconButton:hover {
8
+ color: var(--dsw-alias-label-primary);
9
+ }
10
+
11
+ .wb-iconButton:focus-visible {
12
+ outline: var(--dsw-focus-ring-width) solid
13
+ var(--dsw-focus-ring-color, var(--dsw-alias-state-business-primary));
14
+ outline-offset: -2px;
15
+ }
16
+
17
+ .wb-spinning svg {
18
+ animation: wb-spin var(--wb-dur-0-9) linear infinite;
19
+ }
20
+
21
+ @keyframes wb-dash {
22
+ 0% {
23
+ stroke-dasharray: 12 150;
24
+ stroke-dashoffset: 0;
25
+ }50% {
26
+ stroke-dasharray: 24 150;
27
+ stroke-dashoffset: -6;
28
+ }to {
29
+ stroke-dasharray: 12 150;
30
+ stroke-dashoffset: 0;
31
+ }}
@@ -436,7 +436,12 @@ var DECLARATION_REQUIRED_KEYS = [
436
436
  "host"
437
437
  ];
438
438
  var CARD_KEYS = ["titleKey", "order"];
439
- var TOOL_KEYS = ["name", "writes"];
439
+ var TOOL_KEYS = [
440
+ "name",
441
+ "writes",
442
+ "key"
443
+ ];
444
+ var TOOL_KEY_SHAPE = /^[a-z][a-zA-Z0-9]*$/;
440
445
  var HOST_KEYS = ["inject", "optional"];
441
446
  function text(value) {
442
447
  return typeof value === "string" ? value.trim() : "";
@@ -478,6 +483,7 @@ function declarationProblemsOf(subject, raw) {
478
483
  if (!Array.isArray(tools)) problems.push(`${subject}: dsh.workbench.tools 要是一串声明,现在是 ${JSON.stringify(tools)}`);
479
484
  else {
480
485
  const seen = /* @__PURE__ */ new Set();
486
+ const seenKeys = /* @__PURE__ */ new Set();
481
487
  tools.forEach((tool, index) => {
482
488
  const at = `dsh.workbench.tools[${index}]`;
483
489
  if (!isRecord(tool)) {
@@ -491,6 +497,12 @@ function declarationProblemsOf(subject, raw) {
491
497
  else if (seen.has(name)) problems.push(`${subject}: ${at}.name「${name}」与前面那条撞了 —— 工具名会进 dsh 的工具表,不许重`);
492
498
  else seen.add(name);
493
499
  if (typeof tool.writes !== "boolean") problems.push(`${subject}: ${at}.writes 要是 true / false(它是"这会写"的唯一声明,缺了审批无从认领)`);
500
+ if (tool.key !== void 0) {
501
+ const key = text(tool.key);
502
+ if (!TOOL_KEY_SHAPE.test(key)) problems.push(`${subject}: ${at}.key 要是 lowerCamelCase 的标识符(如 \`sync\` / \`podLogs\`),现在是 ${JSON.stringify(tool.key)} —— 它会变成生成物里的键名,所以不引号、不许带点或横线`);
503
+ else if (seenKeys.has(key)) problems.push(`${subject}: ${at}.key「${key}」与前面那条撞了 —— 生成物里的键只能有一个`);
504
+ else seenKeys.add(key);
505
+ }
494
506
  });
495
507
  }
496
508
  }
@@ -1222,11 +1234,10 @@ var en = {
1222
1234
  "panels.market.missing": "not installed",
1223
1235
  "panels.market.unchecked": "unknown",
1224
1236
  "panels.market.checking": "checking",
1225
- "panels.market.sectionInstalled": "Installed",
1237
+ "panels.market.sectionInstalled": "Installed modules",
1226
1238
  "panels.market.sectionPending": "Not installed",
1227
1239
  "panels.market.sectionShared": "Shared dependencies",
1228
1240
  "panels.market.sharedUsedBy": "Used by {modules}",
1229
- "panels.market.sharedFoot": "These cannot be uninstalled here: they come with modules, and would be reinstalled anyway. To stop using one, turn off the modules that use it.",
1230
1241
  "panels.market.listSeparator": ", ",
1231
1242
  "panels.market.sharedMissing": "not installed",
1232
1243
  "panels.market.sharedOutdated": "update available",
@@ -1251,15 +1262,13 @@ var en = {
1251
1262
  "panels.market.noSource": "This module declares no install method — install it yourself",
1252
1263
  "panels.market.badSource": "The install method is incomplete — install it yourself",
1253
1264
  "panels.market.empty": "No modules available",
1254
- "panels.market.installedSection": "Installed",
1255
- "panels.market.sectionLocal": "Linked locally",
1265
+ "panels.market.sectionLocal": "Local modules",
1256
1266
  "panels.market.sectionUnlisted": "Not from the market",
1257
1267
  "panels.market.sectionPlugins": "Installed opencli plugins",
1258
1268
  "panels.market.moduleOutdated": "update available",
1259
1269
  "panels.market.moduleRefused": "This module was built for an older version of the workbench, so it does not work here. Update it, or uninstall.",
1260
1270
  "panels.market.moduleRefusedDetail": "Why it cannot be used: {reason}",
1261
1271
  "panels.market.moduleRestartHint": "installed but not active — restart dsh once to bring it up",
1262
- "panels.market.pluginLocalNoUpdate": "Installed from a local folder, so there is nowhere to check for a newer version — uninstall only",
1263
1272
  "panels.market.pluginKeptInUse": "Files kept for now: {names} still uses it.",
1264
1273
  "panels.market.pluginKeptUnsure": "Files kept for now: some modules on this machine do not say what they use, so it is unclear who needs it.",
1265
1274
  "panels.market.pluginKeptHeld": "Files kept: this one is yours, and a module letting go will not remove it.",
@@ -1553,11 +1562,10 @@ var zh = {
1553
1562
  "panels.market.missing": "未装",
1554
1563
  "panels.market.unchecked": "状态未知",
1555
1564
  "panels.market.checking": "检测中",
1556
- "panels.market.sectionInstalled": "已安装",
1565
+ "panels.market.sectionInstalled": "已安装模块",
1557
1566
  "panels.market.sectionPending": "未安装",
1558
1567
  "panels.market.sectionShared": "共用依赖",
1559
1568
  "panels.market.sharedUsedBy": "供 {modules} 使用",
1560
- "panels.market.sharedFoot": "这一段不给卸载:它们跟着模块来,卸掉也会被装回来。要停用一份,就去关掉正在用它的那些模块。",
1561
1569
  "panels.market.listSeparator": "、",
1562
1570
  "panels.market.sharedMissing": "未装",
1563
1571
  "panels.market.sharedOutdated": "有新版",
@@ -1582,15 +1590,13 @@ var zh = {
1582
1590
  "panels.market.noSource": "这个模块没声明怎么装,只能自己动手",
1583
1591
  "panels.market.badSource": "安装方式没写全,只能自己动手",
1584
1592
  "panels.market.empty": "暂无可用模块",
1585
- "panels.market.installedSection": "已安装",
1586
- "panels.market.sectionLocal": "本地装的",
1593
+ "panels.market.sectionLocal": "本地模块",
1587
1594
  "panels.market.sectionUnlisted": "不是从市场装的",
1588
1595
  "panels.market.sectionPlugins": "已安装 opencli 插件",
1589
1596
  "panels.market.moduleOutdated": "有新版",
1590
1597
  "panels.market.moduleRefused": "这个模块是给旧版本的工作台写的,现在用不了。更新它,或者卸载。",
1591
1598
  "panels.market.moduleRefusedDetail": "装不上的原因:{reason}",
1592
1599
  "panels.market.moduleRestartHint": "装好了但还没生效 —— 重启一次 dsh 就会出来",
1593
- "panels.market.pluginLocalNoUpdate": "本地装的,没地方查新版,所以只给卸载",
1594
1600
  "panels.market.pluginKeptInUse": "文件先留着:{names} 还要用它。",
1595
1601
  "panels.market.pluginKeptUnsure": "文件先留着:这台机器上还有模块看不出用了什么,说不准谁在用它。",
1596
1602
  "panels.market.pluginKeptHeld": "文件留着:你自己装的那一份,模块放手不动它。",
@@ -2392,6 +2398,9 @@ function panelRowName(label, hint, t) {
2392
2398
  //#endregion
2393
2399
  //#region src/app/layouts/rightbar/market-freshness.ts
2394
2400
  var MARKET_STALE_MS = VERSION_CHECK_TTL_MS;
2401
+ function marketSettled(freshness, installedRead) {
2402
+ return freshness.loaded && installedRead !== false;
2403
+ }
2395
2404
  function shouldProbeOnEnter(input) {
2396
2405
  if (input.checkedAt === null) return true;
2397
2406
  return input.now - input.checkedAt >= input.staleMs;
@@ -2878,7 +2887,7 @@ function buildMarketMocks(roster) {
2878
2887
  },
2879
2888
  {
2880
2889
  id: "plugin-local",
2881
- label: "本地目录装的 opencli 插件:没有版本源(只给卸载,行上说清为什么)",
2890
+ label: "本地目录装的 opencli 插件:没有版本源,只给卸载",
2882
2891
  manifests: [],
2883
2892
  capabilities: {},
2884
2893
  plugins: [{
@@ -2890,8 +2899,7 @@ function buildMarketMocks(roster) {
2890
2899
  rows: 0,
2891
2900
  plugins: 1,
2892
2901
  pluginActions: ["uninstall-plugin"],
2893
- pluginNote: true,
2894
- pluginNoteKey: "panels.market.pluginLocalNoUpdate"
2902
+ pluginNote: false
2895
2903
  }
2896
2904
  },
2897
2905
  {
@@ -3588,10 +3596,7 @@ function noteOf(plugin) {
3588
3596
  key: "panels.market.pluginBroken",
3589
3597
  params: {}
3590
3598
  };
3591
- if (plugin.local === true) return {
3592
- key: "panels.market.pluginLocalNoUpdate",
3593
- params: {}
3594
- };
3599
+ if (plugin.local === true) return void 0;
3595
3600
  if (plugin.name !== void 0 && plugin.name !== plugin.pkg) return {
3596
3601
  key: "panels.market.pluginAlsoKnownAs",
3597
3602
  params: { pkg: plugin.pkg }
@@ -3854,16 +3859,6 @@ function MarketChecking({ t }) {
3854
3859
  function MarketEmpty({ t }) {
3855
3860
  return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmptyTitle }, t("panels.market.empty")));
3856
3861
  }
3857
- var PanelFoot_module_default = {
3858
- foot: "_foot_1us83_1",
3859
- footText: "_footText_1us83_12",
3860
- footTextMd: "_footTextMd_1us83_17"
3861
- };
3862
- //#endregion
3863
- //#region src/shared/components/PanelFoot.tsx
3864
- function PanelFoot({ text, size = "sm", children }) {
3865
- return /* @__PURE__ */ h("footer", { className: PanelFoot_module_default.foot }, /* @__PURE__ */ h("span", { className: size === "md" ? PanelFoot_module_default.footTextMd : PanelFoot_module_default.footText }, text), children ?? null);
3866
- }
3867
3862
  //#endregion
3868
3863
  //#region src/app/layouts/rightbar/market-view-text.ts
3869
3864
  var PROGRESS_KEY = {
@@ -3932,10 +3927,17 @@ function SharedSection({ t, rows, pending, failureOf, act }) {
3932
3927
  pending,
3933
3928
  failure: failureOf(row.id),
3934
3929
  onAct: (action) => void act(row.id, action)
3935
- }))), /* @__PURE__ */ h(PanelFoot, {
3936
- size: "md",
3937
- text: t("panels.market.sharedFoot")
3938
- }));
3930
+ }))));
3931
+ }
3932
+ var PanelFoot_module_default = {
3933
+ foot: "_foot_1us83_1",
3934
+ footText: "_footText_1us83_12",
3935
+ footTextMd: "_footTextMd_1us83_17"
3936
+ };
3937
+ //#endregion
3938
+ //#region src/shared/components/PanelFoot.tsx
3939
+ function PanelFoot({ text, size = "sm", children }) {
3940
+ return /* @__PURE__ */ h("footer", { className: PanelFoot_module_default.foot }, /* @__PURE__ */ h("span", { className: size === "md" ? PanelFoot_module_default.footTextMd : PanelFoot_module_default.footText }, text), children ?? null);
3939
3941
  }
3940
3942
  //#endregion
3941
3943
  //#region src/app/layouts/rightbar/MarketView.tsx
@@ -4138,7 +4140,7 @@ function MarketView({ t, manifests, capabilities, freshness, onChanged, updates,
4138
4140
  message: t("panels.market.failed", { reason })
4139
4141
  });
4140
4142
  };
4141
- const settled = freshness.loaded && installedRead !== false;
4143
+ const settled = marketSettled(freshness, installedRead);
4142
4144
  const nothing = shown.length === 0 && installedList.length === 0 && pluginList.length === 0;
4143
4145
  if (!settled || (settling?.size ?? 0) > 0 && shown.length === 0 && installedList.length === 0) return /* @__PURE__ */ h(MarketChecking, { t });
4144
4146
  if (nothing) return /* @__PURE__ */ h(MarketEmpty, { t });
@@ -5194,11 +5196,14 @@ function MarketPanel({ t, units }) {
5194
5196
  });
5195
5197
  const mock = fixturePick.enabled ? fixturePick.current : void 0;
5196
5198
  const mockNonce = fixturePick.nonce;
5199
+ const shownFreshness = mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS;
5200
+ const shownRead = mock === void 0 ? installedRead : mock.installedRead ?? true;
5201
+ const busy = !marketSettled(shownFreshness, shownRead) || shownFreshness.checking;
5197
5202
  return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketPage }, /* @__PURE__ */ h("header", { className: MarketPage_module_default.marketPageHead }, /* @__PURE__ */ h("div", null, /* @__PURE__ */ h("h1", { className: MarketPage_module_default.marketPageTitle }, t("panels.tab.market")), /* @__PURE__ */ h("p", { className: MarketPage_module_default.marketPageIntro }, t("panels.market.lead"))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketPageTools }, /* @__PURE__ */ h(Tip, { label: t("panels.market.recheck") }, /* @__PURE__ */ h("button", {
5198
5203
  type: "button",
5199
- className: `${MarketPage_module_default.marketIconButton}${checking ? ` ${MarketPage_module_default.marketIconButtonSpinning}` : ""}`,
5204
+ className: `${MarketPage_module_default.marketIconButton}${shownFreshness.checking ? ` ${MarketPage_module_default.marketIconButtonSpinning}` : ""}`,
5200
5205
  "aria-label": t("panels.market.checkUpdates"),
5201
- disabled: checking,
5206
+ disabled: busy,
5202
5207
  onClick: () => {
5203
5208
  forceProbe();
5204
5209
  reloadVersions({ force: true });
@@ -5211,6 +5216,7 @@ function MarketPanel({ t, units }) {
5211
5216
  size: "sm",
5212
5217
  className: MarketPage_module_default.marketAddButton,
5213
5218
  icon: /* @__PURE__ */ h(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutlineRegular, { size: 13 }),
5219
+ disabled: busy,
5214
5220
  onClick: () => setAdding(true)
5215
5221
  }, t("panels.market.add.open")))), fixturePick.enabled ? /* @__PURE__ */ h(MockStrip, {
5216
5222
  mocks: marketMocks,
@@ -5221,11 +5227,11 @@ function MarketPanel({ t, units }) {
5221
5227
  t,
5222
5228
  manifests,
5223
5229
  capabilities,
5224
- freshness: mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS,
5230
+ freshness: shownFreshness,
5225
5231
  onChanged: reload,
5226
5232
  updates,
5227
5233
  installed,
5228
- installedRead: mock === void 0 ? installedRead : mock.installedRead ?? true,
5234
+ installedRead: shownRead,
5229
5235
  plugins,
5230
5236
  settling: mock === void 0 ? settling : void 0,
5231
5237
  mock
@@ -439,7 +439,12 @@ var DECLARATION_REQUIRED_KEYS = [
439
439
  "host"
440
440
  ];
441
441
  var CARD_KEYS = ["titleKey", "order"];
442
- var TOOL_KEYS = ["name", "writes"];
442
+ var TOOL_KEYS = [
443
+ "name",
444
+ "writes",
445
+ "key"
446
+ ];
447
+ var TOOL_KEY_SHAPE = /^[a-z][a-zA-Z0-9]*$/;
443
448
  var HOST_KEYS = ["inject", "optional"];
444
449
  function text(value) {
445
450
  return typeof value === "string" ? value.trim() : "";
@@ -481,6 +486,7 @@ function declarationProblemsOf(subject, raw) {
481
486
  if (!Array.isArray(tools)) problems.push(`${subject}: dsh.workbench.tools 要是一串声明,现在是 ${JSON.stringify(tools)}`);
482
487
  else {
483
488
  const seen = /* @__PURE__ */ new Set();
489
+ const seenKeys = /* @__PURE__ */ new Set();
484
490
  tools.forEach((tool, index) => {
485
491
  const at = `dsh.workbench.tools[${index}]`;
486
492
  if (!isRecord(tool)) {
@@ -494,6 +500,12 @@ function declarationProblemsOf(subject, raw) {
494
500
  else if (seen.has(name)) problems.push(`${subject}: ${at}.name「${name}」与前面那条撞了 —— 工具名会进 dsh 的工具表,不许重`);
495
501
  else seen.add(name);
496
502
  if (typeof tool.writes !== "boolean") problems.push(`${subject}: ${at}.writes 要是 true / false(它是"这会写"的唯一声明,缺了审批无从认领)`);
503
+ if (tool.key !== void 0) {
504
+ const key = text(tool.key);
505
+ if (!TOOL_KEY_SHAPE.test(key)) problems.push(`${subject}: ${at}.key 要是 lowerCamelCase 的标识符(如 \`sync\` / \`podLogs\`),现在是 ${JSON.stringify(tool.key)} —— 它会变成生成物里的键名,所以不引号、不许带点或横线`);
506
+ else if (seenKeys.has(key)) problems.push(`${subject}: ${at}.key「${key}」与前面那条撞了 —— 生成物里的键只能有一个`);
507
+ else seenKeys.add(key);
508
+ }
497
509
  });
498
510
  }
499
511
  }
@@ -1225,11 +1237,10 @@ var en = {
1225
1237
  "panels.market.missing": "not installed",
1226
1238
  "panels.market.unchecked": "unknown",
1227
1239
  "panels.market.checking": "checking",
1228
- "panels.market.sectionInstalled": "Installed",
1240
+ "panels.market.sectionInstalled": "Installed modules",
1229
1241
  "panels.market.sectionPending": "Not installed",
1230
1242
  "panels.market.sectionShared": "Shared dependencies",
1231
1243
  "panels.market.sharedUsedBy": "Used by {modules}",
1232
- "panels.market.sharedFoot": "These cannot be uninstalled here: they come with modules, and would be reinstalled anyway. To stop using one, turn off the modules that use it.",
1233
1244
  "panels.market.listSeparator": ", ",
1234
1245
  "panels.market.sharedMissing": "not installed",
1235
1246
  "panels.market.sharedOutdated": "update available",
@@ -1254,15 +1265,13 @@ var en = {
1254
1265
  "panels.market.noSource": "This module declares no install method — install it yourself",
1255
1266
  "panels.market.badSource": "The install method is incomplete — install it yourself",
1256
1267
  "panels.market.empty": "No modules available",
1257
- "panels.market.installedSection": "Installed",
1258
- "panels.market.sectionLocal": "Linked locally",
1268
+ "panels.market.sectionLocal": "Local modules",
1259
1269
  "panels.market.sectionUnlisted": "Not from the market",
1260
1270
  "panels.market.sectionPlugins": "Installed opencli plugins",
1261
1271
  "panels.market.moduleOutdated": "update available",
1262
1272
  "panels.market.moduleRefused": "This module was built for an older version of the workbench, so it does not work here. Update it, or uninstall.",
1263
1273
  "panels.market.moduleRefusedDetail": "Why it cannot be used: {reason}",
1264
1274
  "panels.market.moduleRestartHint": "installed but not active — restart dsh once to bring it up",
1265
- "panels.market.pluginLocalNoUpdate": "Installed from a local folder, so there is nowhere to check for a newer version — uninstall only",
1266
1275
  "panels.market.pluginKeptInUse": "Files kept for now: {names} still uses it.",
1267
1276
  "panels.market.pluginKeptUnsure": "Files kept for now: some modules on this machine do not say what they use, so it is unclear who needs it.",
1268
1277
  "panels.market.pluginKeptHeld": "Files kept: this one is yours, and a module letting go will not remove it.",
@@ -1556,11 +1565,10 @@ var zh = {
1556
1565
  "panels.market.missing": "未装",
1557
1566
  "panels.market.unchecked": "状态未知",
1558
1567
  "panels.market.checking": "检测中",
1559
- "panels.market.sectionInstalled": "已安装",
1568
+ "panels.market.sectionInstalled": "已安装模块",
1560
1569
  "panels.market.sectionPending": "未安装",
1561
1570
  "panels.market.sectionShared": "共用依赖",
1562
1571
  "panels.market.sharedUsedBy": "供 {modules} 使用",
1563
- "panels.market.sharedFoot": "这一段不给卸载:它们跟着模块来,卸掉也会被装回来。要停用一份,就去关掉正在用它的那些模块。",
1564
1572
  "panels.market.listSeparator": "、",
1565
1573
  "panels.market.sharedMissing": "未装",
1566
1574
  "panels.market.sharedOutdated": "有新版",
@@ -1585,15 +1593,13 @@ var zh = {
1585
1593
  "panels.market.noSource": "这个模块没声明怎么装,只能自己动手",
1586
1594
  "panels.market.badSource": "安装方式没写全,只能自己动手",
1587
1595
  "panels.market.empty": "暂无可用模块",
1588
- "panels.market.installedSection": "已安装",
1589
- "panels.market.sectionLocal": "本地装的",
1596
+ "panels.market.sectionLocal": "本地模块",
1590
1597
  "panels.market.sectionUnlisted": "不是从市场装的",
1591
1598
  "panels.market.sectionPlugins": "已安装 opencli 插件",
1592
1599
  "panels.market.moduleOutdated": "有新版",
1593
1600
  "panels.market.moduleRefused": "这个模块是给旧版本的工作台写的,现在用不了。更新它,或者卸载。",
1594
1601
  "panels.market.moduleRefusedDetail": "装不上的原因:{reason}",
1595
1602
  "panels.market.moduleRestartHint": "装好了但还没生效 —— 重启一次 dsh 就会出来",
1596
- "panels.market.pluginLocalNoUpdate": "本地装的,没地方查新版,所以只给卸载",
1597
1603
  "panels.market.pluginKeptInUse": "文件先留着:{names} 还要用它。",
1598
1604
  "panels.market.pluginKeptUnsure": "文件先留着:这台机器上还有模块看不出用了什么,说不准谁在用它。",
1599
1605
  "panels.market.pluginKeptHeld": "文件留着:你自己装的那一份,模块放手不动它。",
@@ -2395,6 +2401,9 @@ function panelRowName(label, hint, t) {
2395
2401
  //#endregion
2396
2402
  //#region src/app/layouts/rightbar/market-freshness.ts
2397
2403
  var MARKET_STALE_MS = VERSION_CHECK_TTL_MS;
2404
+ function marketSettled(freshness, installedRead) {
2405
+ return freshness.loaded && installedRead !== false;
2406
+ }
2398
2407
  function shouldProbeOnEnter(input) {
2399
2408
  if (input.checkedAt === null) return true;
2400
2409
  return input.now - input.checkedAt >= input.staleMs;
@@ -2881,7 +2890,7 @@ function buildMarketMocks(roster) {
2881
2890
  },
2882
2891
  {
2883
2892
  id: "plugin-local",
2884
- label: "本地目录装的 opencli 插件:没有版本源(只给卸载,行上说清为什么)",
2893
+ label: "本地目录装的 opencli 插件:没有版本源,只给卸载",
2885
2894
  manifests: [],
2886
2895
  capabilities: {},
2887
2896
  plugins: [{
@@ -2893,8 +2902,7 @@ function buildMarketMocks(roster) {
2893
2902
  rows: 0,
2894
2903
  plugins: 1,
2895
2904
  pluginActions: ["uninstall-plugin"],
2896
- pluginNote: true,
2897
- pluginNoteKey: "panels.market.pluginLocalNoUpdate"
2905
+ pluginNote: false
2898
2906
  }
2899
2907
  },
2900
2908
  {
@@ -3591,10 +3599,7 @@ function noteOf(plugin) {
3591
3599
  key: "panels.market.pluginBroken",
3592
3600
  params: {}
3593
3601
  };
3594
- if (plugin.local === true) return {
3595
- key: "panels.market.pluginLocalNoUpdate",
3596
- params: {}
3597
- };
3602
+ if (plugin.local === true) return void 0;
3598
3603
  if (plugin.name !== void 0 && plugin.name !== plugin.pkg) return {
3599
3604
  key: "panels.market.pluginAlsoKnownAs",
3600
3605
  params: { pkg: plugin.pkg }
@@ -3857,16 +3862,6 @@ function MarketChecking({ t }) {
3857
3862
  function MarketEmpty({ t }) {
3858
3863
  return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmpty }, /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketEmptyTitle }, t("panels.market.empty")));
3859
3864
  }
3860
- var PanelFoot_module_default = {
3861
- foot: "_foot_1us83_1",
3862
- footText: "_footText_1us83_12",
3863
- footTextMd: "_footTextMd_1us83_17"
3864
- };
3865
- //#endregion
3866
- //#region src/shared/components/PanelFoot.tsx
3867
- function PanelFoot({ text, size = "sm", children }) {
3868
- return /* @__PURE__ */ h("footer", { className: PanelFoot_module_default.foot }, /* @__PURE__ */ h("span", { className: size === "md" ? PanelFoot_module_default.footTextMd : PanelFoot_module_default.footText }, text), children ?? null);
3869
- }
3870
3865
  //#endregion
3871
3866
  //#region src/app/layouts/rightbar/market-view-text.ts
3872
3867
  var PROGRESS_KEY = {
@@ -3935,10 +3930,17 @@ function SharedSection({ t, rows, pending, failureOf, act }) {
3935
3930
  pending,
3936
3931
  failure: failureOf(row.id),
3937
3932
  onAct: (action) => void act(row.id, action)
3938
- }))), /* @__PURE__ */ h(PanelFoot, {
3939
- size: "md",
3940
- text: t("panels.market.sharedFoot")
3941
- }));
3933
+ }))));
3934
+ }
3935
+ var PanelFoot_module_default = {
3936
+ foot: "_foot_1us83_1",
3937
+ footText: "_footText_1us83_12",
3938
+ footTextMd: "_footTextMd_1us83_17"
3939
+ };
3940
+ //#endregion
3941
+ //#region src/shared/components/PanelFoot.tsx
3942
+ function PanelFoot({ text, size = "sm", children }) {
3943
+ return /* @__PURE__ */ h("footer", { className: PanelFoot_module_default.foot }, /* @__PURE__ */ h("span", { className: size === "md" ? PanelFoot_module_default.footTextMd : PanelFoot_module_default.footText }, text), children ?? null);
3942
3944
  }
3943
3945
  //#endregion
3944
3946
  //#region src/app/layouts/rightbar/MarketView.tsx
@@ -4141,7 +4143,7 @@ function MarketView({ t, manifests, capabilities, freshness, onChanged, updates,
4141
4143
  message: t("panels.market.failed", { reason })
4142
4144
  });
4143
4145
  };
4144
- const settled = freshness.loaded && installedRead !== false;
4146
+ const settled = marketSettled(freshness, installedRead);
4145
4147
  const nothing = shown.length === 0 && installedList.length === 0 && pluginList.length === 0;
4146
4148
  if (!settled || (settling?.size ?? 0) > 0 && shown.length === 0 && installedList.length === 0) return /* @__PURE__ */ h(MarketChecking, { t });
4147
4149
  if (nothing) return /* @__PURE__ */ h(MarketEmpty, { t });
@@ -5197,11 +5199,14 @@ function MarketPanel({ t, units }) {
5197
5199
  });
5198
5200
  const mock = fixturePick.enabled ? fixturePick.current : void 0;
5199
5201
  const mockNonce = fixturePick.nonce;
5202
+ const shownFreshness = mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS;
5203
+ const shownRead = mock === void 0 ? installedRead : mock.installedRead ?? true;
5204
+ const busy = !marketSettled(shownFreshness, shownRead) || shownFreshness.checking;
5200
5205
  return /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketPage }, /* @__PURE__ */ h("header", { className: MarketPage_module_default.marketPageHead }, /* @__PURE__ */ h("div", null, /* @__PURE__ */ h("h1", { className: MarketPage_module_default.marketPageTitle }, t("panels.tab.market")), /* @__PURE__ */ h("p", { className: MarketPage_module_default.marketPageIntro }, t("panels.market.lead"))), /* @__PURE__ */ h("div", { className: MarketPage_module_default.marketPageTools }, /* @__PURE__ */ h(Tip, { label: t("panels.market.recheck") }, /* @__PURE__ */ h("button", {
5201
5206
  type: "button",
5202
- className: `${MarketPage_module_default.marketIconButton}${checking ? ` ${MarketPage_module_default.marketIconButtonSpinning}` : ""}`,
5207
+ className: `${MarketPage_module_default.marketIconButton}${shownFreshness.checking ? ` ${MarketPage_module_default.marketIconButtonSpinning}` : ""}`,
5203
5208
  "aria-label": t("panels.market.checkUpdates"),
5204
- disabled: checking,
5209
+ disabled: busy,
5205
5210
  onClick: () => {
5206
5211
  forceProbe();
5207
5212
  reloadVersions({ force: true });
@@ -5214,6 +5219,7 @@ function MarketPanel({ t, units }) {
5214
5219
  size: "sm",
5215
5220
  className: MarketPage_module_default.marketAddButton,
5216
5221
  icon: /* @__PURE__ */ h(IconPlusOutlineRegular, { size: 13 }),
5222
+ disabled: busy,
5217
5223
  onClick: () => setAdding(true)
5218
5224
  }, t("panels.market.add.open")))), fixturePick.enabled ? /* @__PURE__ */ h(MockStrip, {
5219
5225
  mocks: marketMocks,
@@ -5224,11 +5230,11 @@ function MarketPanel({ t, units }) {
5224
5230
  t,
5225
5231
  manifests,
5226
5232
  capabilities,
5227
- freshness: mock === void 0 ? freshness : mock.loaded === false ? pendingFreshness : MOCK_FRESHNESS,
5233
+ freshness: shownFreshness,
5228
5234
  onChanged: reload,
5229
5235
  updates,
5230
5236
  installed,
5231
- installedRead: mock === void 0 ? installedRead : mock.installedRead ?? true,
5237
+ installedRead: shownRead,
5232
5238
  plugins,
5233
5239
  settling: mock === void 0 ? settling : void 0,
5234
5240
  mock
@@ -67,7 +67,12 @@ var DECLARATION_REQUIRED_KEYS = [
67
67
  "host"
68
68
  ];
69
69
  var CARD_KEYS = ["titleKey", "order"];
70
- var TOOL_KEYS = ["name", "writes"];
70
+ var TOOL_KEYS = [
71
+ "name",
72
+ "writes",
73
+ "key"
74
+ ];
75
+ var TOOL_KEY_SHAPE = /^[a-z][a-zA-Z0-9]*$/;
71
76
  var HOST_KEYS = ["inject", "optional"];
72
77
  function text$1(value) {
73
78
  return typeof value === "string" ? value.trim() : "";
@@ -109,6 +114,7 @@ function declarationProblemsOf(subject, raw) {
109
114
  if (!Array.isArray(tools)) problems.push(`${subject}: dsh.workbench.tools 要是一串声明,现在是 ${JSON.stringify(tools)}`);
110
115
  else {
111
116
  const seen = /* @__PURE__ */ new Set();
117
+ const seenKeys = /* @__PURE__ */ new Set();
112
118
  tools.forEach((tool, index) => {
113
119
  const at = `dsh.workbench.tools[${index}]`;
114
120
  if (!isRecord(tool)) {
@@ -122,6 +128,12 @@ function declarationProblemsOf(subject, raw) {
122
128
  else if (seen.has(name)) problems.push(`${subject}: ${at}.name「${name}」与前面那条撞了 —— 工具名会进 dsh 的工具表,不许重`);
123
129
  else seen.add(name);
124
130
  if (typeof tool.writes !== "boolean") problems.push(`${subject}: ${at}.writes 要是 true / false(它是"这会写"的唯一声明,缺了审批无从认领)`);
131
+ if (tool.key !== void 0) {
132
+ const key = text$1(tool.key);
133
+ if (!TOOL_KEY_SHAPE.test(key)) problems.push(`${subject}: ${at}.key 要是 lowerCamelCase 的标识符(如 \`sync\` / \`podLogs\`),现在是 ${JSON.stringify(tool.key)} —— 它会变成生成物里的键名,所以不引号、不许带点或横线`);
134
+ else if (seenKeys.has(key)) problems.push(`${subject}: ${at}.key「${key}」与前面那条撞了 —— 生成物里的键只能有一个`);
135
+ else seenKeys.add(key);
136
+ }
125
137
  });
126
138
  }
127
139
  }
@@ -250,11 +250,10 @@ export declare const kit: {
250
250
  readonly "panels.market.missing": "\u672A\u88C5";
251
251
  readonly "panels.market.unchecked": "\u72B6\u6001\u672A\u77E5";
252
252
  readonly "panels.market.checking": "\u68C0\u6D4B\u4E2D";
253
- readonly "panels.market.sectionInstalled": "\u5DF2\u5B89\u88C5";
253
+ readonly "panels.market.sectionInstalled": "\u5DF2\u5B89\u88C5\u6A21\u5757";
254
254
  readonly "panels.market.sectionPending": "\u672A\u5B89\u88C5";
255
255
  readonly "panels.market.sectionShared": "\u5171\u7528\u4F9D\u8D56";
256
256
  readonly "panels.market.sharedUsedBy": "\u4F9B {modules} \u4F7F\u7528";
257
- readonly "panels.market.sharedFoot": "\u8FD9\u4E00\u6BB5\u4E0D\u7ED9\u5378\u8F7D\uFF1A\u5B83\u4EEC\u8DDF\u7740\u6A21\u5757\u6765\uFF0C\u5378\u6389\u4E5F\u4F1A\u88AB\u88C5\u56DE\u6765\u3002\u8981\u505C\u7528\u4E00\u4EFD\uFF0C\u5C31\u53BB\u5173\u6389\u6B63\u5728\u7528\u5B83\u7684\u90A3\u4E9B\u6A21\u5757\u3002";
258
257
  readonly "panels.market.listSeparator": "\u3001";
259
258
  readonly "panels.market.sharedMissing": "\u672A\u88C5";
260
259
  readonly "panels.market.sharedOutdated": "\u6709\u65B0\u7248";
@@ -279,15 +278,13 @@ export declare const kit: {
279
278
  readonly "panels.market.noSource": "\u8FD9\u4E2A\u6A21\u5757\u6CA1\u58F0\u660E\u600E\u4E48\u88C5\uFF0C\u53EA\u80FD\u81EA\u5DF1\u52A8\u624B";
280
279
  readonly "panels.market.badSource": "\u5B89\u88C5\u65B9\u5F0F\u6CA1\u5199\u5168\uFF0C\u53EA\u80FD\u81EA\u5DF1\u52A8\u624B";
281
280
  readonly "panels.market.empty": "\u6682\u65E0\u53EF\u7528\u6A21\u5757";
282
- readonly "panels.market.installedSection": "\u5DF2\u5B89\u88C5";
283
- readonly "panels.market.sectionLocal": "\u672C\u5730\u88C5\u7684";
281
+ readonly "panels.market.sectionLocal": "\u672C\u5730\u6A21\u5757";
284
282
  readonly "panels.market.sectionUnlisted": "\u4E0D\u662F\u4ECE\u5E02\u573A\u88C5\u7684";
285
283
  readonly "panels.market.sectionPlugins": "\u5DF2\u5B89\u88C5 opencli \u63D2\u4EF6";
286
284
  readonly "panels.market.moduleOutdated": "\u6709\u65B0\u7248";
287
285
  readonly "panels.market.moduleRefused": "\u8FD9\u4E2A\u6A21\u5757\u662F\u7ED9\u65E7\u7248\u672C\u7684\u5DE5\u4F5C\u53F0\u5199\u7684\uFF0C\u73B0\u5728\u7528\u4E0D\u4E86\u3002\u66F4\u65B0\u5B83\uFF0C\u6216\u8005\u5378\u8F7D\u3002";
288
286
  readonly "panels.market.moduleRefusedDetail": "\u88C5\u4E0D\u4E0A\u7684\u539F\u56E0\uFF1A{reason}";
289
287
  readonly "panels.market.moduleRestartHint": "\u88C5\u597D\u4E86\u4F46\u8FD8\u6CA1\u751F\u6548 \u2014\u2014 \u91CD\u542F\u4E00\u6B21 dsh \u5C31\u4F1A\u51FA\u6765";
290
- readonly "panels.market.pluginLocalNoUpdate": "\u672C\u5730\u88C5\u7684\uFF0C\u6CA1\u5730\u65B9\u67E5\u65B0\u7248\uFF0C\u6240\u4EE5\u53EA\u7ED9\u5378\u8F7D";
291
288
  readonly "panels.market.pluginKeptInUse": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A{names} \u8FD8\u8981\u7528\u5B83\u3002";
292
289
  readonly "panels.market.pluginKeptUnsure": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A\u8FD9\u53F0\u673A\u5668\u4E0A\u8FD8\u6709\u6A21\u5757\u770B\u4E0D\u51FA\u7528\u4E86\u4EC0\u4E48\uFF0C\u8BF4\u4E0D\u51C6\u8C01\u5728\u7528\u5B83\u3002";
293
290
  readonly "panels.market.pluginKeptHeld": "\u6587\u4EF6\u7559\u7740\uFF1A\u4F60\u81EA\u5DF1\u88C5\u7684\u90A3\u4E00\u4EFD\uFF0C\u6A21\u5757\u653E\u624B\u4E0D\u52A8\u5B83\u3002";
@@ -512,7 +509,7 @@ export declare const kit: {
512
509
  readonly "panel.conversation": "\u5BF9\u8BDD";
513
510
  readonly "panels.label": "\u5168\u5C40\u9762\u677F";
514
511
  };
515
- en: Record<"time.now" | "time.minutes" | "time.hours" | "time.days" | "blocker.retry" | "blocker.copy" | "blocker.unknown.title" | "blocker.login.go" | "blocker.login.titleGeneric" | "blocker.login.title" | "blocker.login.manual" | "blocker.login.hint" | "blocker.forbidden.open" | "blocker.forbidden.titleGeneric" | "blocker.forbidden.title" | "blocker.forbidden.hint" | "blocker.timeout.hint" | "blocker.exec.hint" | "blocker.fix.install" | "blocker.fix.update" | "blocker.market.open" | "env.unit.failed" | "env.unit.failedHint" | "env.unit.missingPlugin" | "env.unit.hint" | "env.unit.missingCommands" | "env.unit.missingCommandsHint" | "env.unit.unchecked" | "env.unit.uncheckedHint" | "brand.name" | "toggle.open" | "toggle.collapse" | "project.label" | "workspace.section" | "project.none" | "project.empty" | "project.add" | "project.search.label" | "project.search.placeholder" | "project.search.empty" | "project.rename.row" | "project.rename.current" | "project.rename.title" | "project.rename.description" | "project.rename.field" | "project.rename.placeholder" | "project.rename.hint" | "project.rename.save" | "project.rename.saving" | "project.rename.cancel" | "project.rename.failed" | "session.new" | "session.new.label" | "session.empty" | "session.noProject" | "session.pinned" | "session.actions" | "status.idle" | "status.running" | "status.waitingApproval" | "status.planReview" | "status.waitingAnswer" | "status.completed" | "status.subagentsRunning.one" | "status.subagentsRunning.other" | "panels.title" | "panels.reset" | "panels.enabled" | "panels.disabled" | "panels.choose" | "panels.buildModule" | "panels.failed" | "panels.hintEffect" | "panels.dragHint" | "panels.unknownStep" | "panels.labelWithHint" | "panels.dep.failed" | "panels.dep.missingPlugin" | "panels.dep.missingCommands" | "panels.dep.unchecked" | "panels.tab.modules" | "panels.tab.market" | "panels.browseMarket" | "panels.noneInstalled" | "panels.noneInstalledHint" | "panels.market.installed" | "panels.market.outdated" | "panels.market.hasNew" | "panels.market.missing" | "panels.market.unchecked" | "panels.market.checking" | "panels.market.sectionInstalled" | "panels.market.sectionPending" | "panels.market.sectionShared" | "panels.market.sharedUsedBy" | "panels.market.sharedFoot" | "panels.market.listSeparator" | "panels.market.sharedMissing" | "panels.market.sharedOutdated" | "panels.market.sharedUnsatisfied" | "panels.market.sharedOk" | "panels.market.versionArrow" | "panels.market.lead" | "panels.market.install" | "panels.market.update" | "panels.market.uninstall" | "panels.market.uninstallLabel" | "panels.market.installing" | "panels.market.updating" | "panels.market.uninstalling" | "panels.market.confirmUninstallTitle" | "panels.market.confirmUninstallDetail" | "panels.market.confirmUninstallAck" | "panels.market.confirmYes" | "panels.market.confirmNo" | "panels.market.failed" | "panels.market.needEnv" | "panels.market.noSource" | "panels.market.badSource" | "panels.market.empty" | "panels.market.installedSection" | "panels.market.sectionLocal" | "panels.market.sectionUnlisted" | "panels.market.sectionPlugins" | "panels.market.moduleOutdated" | "panels.market.moduleRefused" | "panels.market.moduleRefusedDetail" | "panels.market.moduleRestartHint" | "panels.market.pluginLocalNoUpdate" | "panels.market.pluginKeptInUse" | "panels.market.pluginKeptUnsure" | "panels.market.pluginKeptHeld" | "panels.market.pluginKeptUnnamed" | "panels.market.pluginAlsoKnownAs" | "panels.market.pluginBroken" | "panels.market.restartNeeded" | "panels.market.foot" | "panels.market.recheck" | "panels.market.checkUpdates" | "panels.market.checkedAt" | "panels.market.justNow" | "panels.market.minutesAgo" | "panels.market.hoursAgo" | "panels.market.add.description" | "panels.market.add.specPlaceholder" | "panels.market.add.guideToggle" | "panels.market.add.guideHide" | "panels.market.add.guideIdTitle" | "panels.market.add.guideIdExample" | "panels.market.add.guideIdHint" | "panels.market.add.guideGitTitle" | "panels.market.add.guideGitExample" | "panels.market.add.guideGitHint" | "panels.market.add.guidePathTitle" | "panels.market.add.guidePathExample" | "panels.market.add.guidePathHint" | "panels.market.add.guideExampleLabel" | "panels.market.add.guideFill" | "panels.market.add.guideSafety" | "panels.market.add.registryLegend" | "panels.market.add.registryOfficial" | "panels.market.add.registryMirror" | "panels.market.add.registryWithHost" | "panels.market.add.registryToggle" | "panels.market.add.installVersion" | "panels.market.add.registryDefault" | "panels.market.add.registryCustom" | "panels.market.add.registryCustomPlaceholder" | "panels.market.add.registryCustomHint" | "panels.market.add.registryCustomInvalid" | "panels.market.add.run" | "panels.market.add.edit" | "panels.market.add.changeRegistry" | "panels.market.add.installingTitle" | "panels.market.add.installedTitle" | "panels.market.add.failedTitle" | "panels.market.add.cancelledTitle" | "panels.market.add.failureNetworkHost" | "panels.market.add.problemInvalid" | "panels.market.add.problemInstalled" | "panels.market.add.problemNotFound" | "panels.market.add.problemNotPackage" | "panels.market.add.problemNotBundle" | "panels.market.add.problemNotWorkbenchModule" | "panels.market.add.problemNotModuleOrPlugin" | "panels.market.add.failureNotModuleOrPlugin" | "panels.market.add.installedPlugin" | "panels.market.add.problemNetwork" | "panels.market.add.problemUnknown" | "panels.market.add.failureNetwork" | "panels.market.add.failureNotFound" | "panels.market.add.failureNoMatchingVersion" | "panels.market.add.failureDiskFull" | "panels.market.add.failurePermission" | "panels.market.add.failureBuildBlocked" | "panels.market.add.failureIntegrity" | "panels.market.add.failureTimeout" | "panels.market.add.failurePnpmMissing" | "panels.market.add.failureGeneric" | "panels.market.add.approveTitle" | "panels.market.add.approveCaution" | "panels.market.add.approveRun" | "panels.market.add.restart" | "panels.market.add.tookEffect" | "panels.market.add.details" | "panels.market.add.open" | "panels.market.add.title" | "panels.market.add.intro" | "panels.market.add.specLabel" | "panels.market.add.specHint" | "panels.market.add.exampleTitle" | "panels.market.add.exampleFill" | "panels.market.add.registryLabel" | "panels.market.add.registryProfile" | "panels.market.add.registryPnpm" | "panels.market.add.check" | "panels.market.add.checking" | "panels.market.add.classifying" | "panels.market.add.change" | "panels.market.add.previewTitle" | "panels.market.add.fieldName" | "panels.market.add.fieldVersion" | "panels.market.add.fieldDescription" | "panels.market.add.fieldSource" | "panels.market.add.install" | "panels.market.add.installing" | "panels.market.add.cancel" | "panels.market.add.close" | "panels.market.add.retry" | "panels.market.add.changeSource" | "panels.market.add.approveBuilds" | "panels.market.add.approveHint" | "panels.market.add.doneApplied" | "panels.market.add.doneRestart" | "panels.market.add.cancelled" | "panels.market.add.failed" | "panels.market.add.removed" | "panels.market.add.supplyPending" | "panels.market.add.supplyFailed" | "panels.market.add.notModule" | "panels.market.add.removedRestart" | "panels.market.add.remove" | "panels.market.add.problem.invalidSpec" | "panels.market.add.problem.alreadyInstalled" | "panels.market.add.problem.notFound" | "panels.market.add.problem.notAPackage" | "panels.market.add.problem.notABundle" | "panels.market.add.problem.network" | "panels.market.add.problem.unknown" | "panels.market.add.reason.invalidSpec" | "panels.market.add.reason.incompatible" | "panels.market.add.reason.notBundle" | "panels.market.add.reason.notRemovable" | "panels.market.add.reason.bundleInUse" | "panels.market.add.reason.stopProfile" | "panels.market.add.reason.staleApproval" | "panels.market.add.reason.operationError" | "panels.market.add.reason.buildBlocked" | "panels.market.add.reason.pnpmMissing" | "panels.market.add.reason.noMatchingVersion" | "panels.market.add.reason.diskFull" | "panels.market.add.reason.permission" | "panels.market.add.reason.integrity" | "panels.market.add.reason.timeout" | "panels.market.add.reason.network" | "panels.market.add.reason.notFound" | "panels.market.add.reason.unknown" | "blocker.fix.running" | "blocker.fix.failed" | "blocker.retry.running" | "panels.reading" | "panels.cardBroken" | "panels.cardRetry" | "panels.empty" | "panels.emptyHint" | "env.title" | "env.checking" | "env.installing" | "env.failed" | "env.elapsed" | "env.stepFailed.install" | "env.stepFailed.path" | "env.stepFailed.shell" | "env.bridge.ok" | "env.bridge.short" | "env.bridge.why" | "env.bridge.daemon" | "env.bridge.extension" | "env.bridge.extensionLink" | "env.bridge.profile" | "env.bridge.stale" | "env.bridge.unknown" | "env.fix.title" | "env.fix.why" | "env.fix.whyPath" | "env.fix.whyShell" | "env.fix.step" | "env.fix.stepPath" | "env.fix.stepShell" | "env.fix.permission" | "env.fix.network" | "env.fix.details" | "env.retry" | "env.copyCommand" | "env.copied" | "env.step.opencli" | "env.step.codingPlugin" | "env.step.bridge" | "env.step.warm" | "env.warm.done" | "env.warm.short" | "rightbar.label" | "rightbar.expand" | "rightbar.collapse" | "rightbar.column.label" | "rightbar.column.workbench" | "rightbar.column.dsh" | "rightbar.refresh" | "rightbar.refreshing" | "rightbar.updatedAt" | "rightbar.noProject" | "rightbar.openPlatform" | "coding.notARepo.title" | "error.unknown" | "board.title" | "panel.conversation" | "panels.label", string>;
512
+ en: Record<"time.now" | "time.minutes" | "time.hours" | "time.days" | "blocker.retry" | "blocker.copy" | "blocker.unknown.title" | "blocker.login.go" | "blocker.login.titleGeneric" | "blocker.login.title" | "blocker.login.manual" | "blocker.login.hint" | "blocker.forbidden.open" | "blocker.forbidden.titleGeneric" | "blocker.forbidden.title" | "blocker.forbidden.hint" | "blocker.timeout.hint" | "blocker.exec.hint" | "blocker.fix.install" | "blocker.fix.update" | "blocker.market.open" | "env.unit.failed" | "env.unit.failedHint" | "env.unit.missingPlugin" | "env.unit.hint" | "env.unit.missingCommands" | "env.unit.missingCommandsHint" | "env.unit.unchecked" | "env.unit.uncheckedHint" | "brand.name" | "toggle.open" | "toggle.collapse" | "project.label" | "workspace.section" | "project.none" | "project.empty" | "project.add" | "project.search.label" | "project.search.placeholder" | "project.search.empty" | "project.rename.row" | "project.rename.current" | "project.rename.title" | "project.rename.description" | "project.rename.field" | "project.rename.placeholder" | "project.rename.hint" | "project.rename.save" | "project.rename.saving" | "project.rename.cancel" | "project.rename.failed" | "session.new" | "session.new.label" | "session.empty" | "session.noProject" | "session.pinned" | "session.actions" | "status.idle" | "status.running" | "status.waitingApproval" | "status.planReview" | "status.waitingAnswer" | "status.completed" | "status.subagentsRunning.one" | "status.subagentsRunning.other" | "panels.title" | "panels.reset" | "panels.enabled" | "panels.disabled" | "panels.choose" | "panels.buildModule" | "panels.failed" | "panels.hintEffect" | "panels.dragHint" | "panels.unknownStep" | "panels.labelWithHint" | "panels.dep.failed" | "panels.dep.missingPlugin" | "panels.dep.missingCommands" | "panels.dep.unchecked" | "panels.tab.modules" | "panels.tab.market" | "panels.browseMarket" | "panels.noneInstalled" | "panels.noneInstalledHint" | "panels.market.installed" | "panels.market.outdated" | "panels.market.hasNew" | "panels.market.missing" | "panels.market.unchecked" | "panels.market.checking" | "panels.market.sectionInstalled" | "panels.market.sectionPending" | "panels.market.sectionShared" | "panels.market.sharedUsedBy" | "panels.market.listSeparator" | "panels.market.sharedMissing" | "panels.market.sharedOutdated" | "panels.market.sharedUnsatisfied" | "panels.market.sharedOk" | "panels.market.versionArrow" | "panels.market.lead" | "panels.market.install" | "panels.market.update" | "panels.market.uninstall" | "panels.market.uninstallLabel" | "panels.market.installing" | "panels.market.updating" | "panels.market.uninstalling" | "panels.market.confirmUninstallTitle" | "panels.market.confirmUninstallDetail" | "panels.market.confirmUninstallAck" | "panels.market.confirmYes" | "panels.market.confirmNo" | "panels.market.failed" | "panels.market.needEnv" | "panels.market.noSource" | "panels.market.badSource" | "panels.market.empty" | "panels.market.sectionLocal" | "panels.market.sectionUnlisted" | "panels.market.sectionPlugins" | "panels.market.moduleOutdated" | "panels.market.moduleRefused" | "panels.market.moduleRefusedDetail" | "panels.market.moduleRestartHint" | "panels.market.pluginKeptInUse" | "panels.market.pluginKeptUnsure" | "panels.market.pluginKeptHeld" | "panels.market.pluginKeptUnnamed" | "panels.market.pluginAlsoKnownAs" | "panels.market.pluginBroken" | "panels.market.restartNeeded" | "panels.market.foot" | "panels.market.recheck" | "panels.market.checkUpdates" | "panels.market.checkedAt" | "panels.market.justNow" | "panels.market.minutesAgo" | "panels.market.hoursAgo" | "panels.market.add.description" | "panels.market.add.specPlaceholder" | "panels.market.add.guideToggle" | "panels.market.add.guideHide" | "panels.market.add.guideIdTitle" | "panels.market.add.guideIdExample" | "panels.market.add.guideIdHint" | "panels.market.add.guideGitTitle" | "panels.market.add.guideGitExample" | "panels.market.add.guideGitHint" | "panels.market.add.guidePathTitle" | "panels.market.add.guidePathExample" | "panels.market.add.guidePathHint" | "panels.market.add.guideExampleLabel" | "panels.market.add.guideFill" | "panels.market.add.guideSafety" | "panels.market.add.registryLegend" | "panels.market.add.registryOfficial" | "panels.market.add.registryMirror" | "panels.market.add.registryWithHost" | "panels.market.add.registryToggle" | "panels.market.add.installVersion" | "panels.market.add.registryDefault" | "panels.market.add.registryCustom" | "panels.market.add.registryCustomPlaceholder" | "panels.market.add.registryCustomHint" | "panels.market.add.registryCustomInvalid" | "panels.market.add.run" | "panels.market.add.edit" | "panels.market.add.changeRegistry" | "panels.market.add.installingTitle" | "panels.market.add.installedTitle" | "panels.market.add.failedTitle" | "panels.market.add.cancelledTitle" | "panels.market.add.failureNetworkHost" | "panels.market.add.problemInvalid" | "panels.market.add.problemInstalled" | "panels.market.add.problemNotFound" | "panels.market.add.problemNotPackage" | "panels.market.add.problemNotBundle" | "panels.market.add.problemNotWorkbenchModule" | "panels.market.add.problemNotModuleOrPlugin" | "panels.market.add.failureNotModuleOrPlugin" | "panels.market.add.installedPlugin" | "panels.market.add.problemNetwork" | "panels.market.add.problemUnknown" | "panels.market.add.failureNetwork" | "panels.market.add.failureNotFound" | "panels.market.add.failureNoMatchingVersion" | "panels.market.add.failureDiskFull" | "panels.market.add.failurePermission" | "panels.market.add.failureBuildBlocked" | "panels.market.add.failureIntegrity" | "panels.market.add.failureTimeout" | "panels.market.add.failurePnpmMissing" | "panels.market.add.failureGeneric" | "panels.market.add.approveTitle" | "panels.market.add.approveCaution" | "panels.market.add.approveRun" | "panels.market.add.restart" | "panels.market.add.tookEffect" | "panels.market.add.details" | "panels.market.add.open" | "panels.market.add.title" | "panels.market.add.intro" | "panels.market.add.specLabel" | "panels.market.add.specHint" | "panels.market.add.exampleTitle" | "panels.market.add.exampleFill" | "panels.market.add.registryLabel" | "panels.market.add.registryProfile" | "panels.market.add.registryPnpm" | "panels.market.add.check" | "panels.market.add.checking" | "panels.market.add.classifying" | "panels.market.add.change" | "panels.market.add.previewTitle" | "panels.market.add.fieldName" | "panels.market.add.fieldVersion" | "panels.market.add.fieldDescription" | "panels.market.add.fieldSource" | "panels.market.add.install" | "panels.market.add.installing" | "panels.market.add.cancel" | "panels.market.add.close" | "panels.market.add.retry" | "panels.market.add.changeSource" | "panels.market.add.approveBuilds" | "panels.market.add.approveHint" | "panels.market.add.doneApplied" | "panels.market.add.doneRestart" | "panels.market.add.cancelled" | "panels.market.add.failed" | "panels.market.add.removed" | "panels.market.add.supplyPending" | "panels.market.add.supplyFailed" | "panels.market.add.notModule" | "panels.market.add.removedRestart" | "panels.market.add.remove" | "panels.market.add.problem.invalidSpec" | "panels.market.add.problem.alreadyInstalled" | "panels.market.add.problem.notFound" | "panels.market.add.problem.notAPackage" | "panels.market.add.problem.notABundle" | "panels.market.add.problem.network" | "panels.market.add.problem.unknown" | "panels.market.add.reason.invalidSpec" | "panels.market.add.reason.incompatible" | "panels.market.add.reason.notBundle" | "panels.market.add.reason.notRemovable" | "panels.market.add.reason.bundleInUse" | "panels.market.add.reason.stopProfile" | "panels.market.add.reason.staleApproval" | "panels.market.add.reason.operationError" | "panels.market.add.reason.buildBlocked" | "panels.market.add.reason.pnpmMissing" | "panels.market.add.reason.noMatchingVersion" | "panels.market.add.reason.diskFull" | "panels.market.add.reason.permission" | "panels.market.add.reason.integrity" | "panels.market.add.reason.timeout" | "panels.market.add.reason.network" | "panels.market.add.reason.notFound" | "panels.market.add.reason.unknown" | "blocker.fix.running" | "blocker.fix.failed" | "blocker.retry.running" | "panels.reading" | "panels.cardBroken" | "panels.cardRetry" | "panels.empty" | "panels.emptyHint" | "env.title" | "env.checking" | "env.installing" | "env.failed" | "env.elapsed" | "env.stepFailed.install" | "env.stepFailed.path" | "env.stepFailed.shell" | "env.bridge.ok" | "env.bridge.short" | "env.bridge.why" | "env.bridge.daemon" | "env.bridge.extension" | "env.bridge.extensionLink" | "env.bridge.profile" | "env.bridge.stale" | "env.bridge.unknown" | "env.fix.title" | "env.fix.why" | "env.fix.whyPath" | "env.fix.whyShell" | "env.fix.step" | "env.fix.stepPath" | "env.fix.stepShell" | "env.fix.permission" | "env.fix.network" | "env.fix.details" | "env.retry" | "env.copyCommand" | "env.copied" | "env.step.opencli" | "env.step.codingPlugin" | "env.step.bridge" | "env.step.warm" | "env.warm.done" | "env.warm.short" | "rightbar.label" | "rightbar.expand" | "rightbar.collapse" | "rightbar.column.label" | "rightbar.column.workbench" | "rightbar.column.dsh" | "rightbar.refresh" | "rightbar.refreshing" | "rightbar.updatedAt" | "rightbar.noProject" | "rightbar.openPlatform" | "coding.notARepo.title" | "error.unknown" | "board.title" | "panel.conversation" | "panels.label", string>;
516
513
  };
517
514
  mergeMessages(base: apiModule.Dictionaries, contributions: readonly MessagesContribution[]): apiModule.Dictionaries;
518
515
  mergeMessagesSkipping(base: apiModule.Dictionaries, contributions: readonly MessagesContribution[]): apiModule.MessagesMerge;
@@ -583,11 +580,10 @@ export declare const kit: {
583
580
  readonly "panels.market.missing": "\u672A\u88C5";
584
581
  readonly "panels.market.unchecked": "\u72B6\u6001\u672A\u77E5";
585
582
  readonly "panels.market.checking": "\u68C0\u6D4B\u4E2D";
586
- readonly "panels.market.sectionInstalled": "\u5DF2\u5B89\u88C5";
583
+ readonly "panels.market.sectionInstalled": "\u5DF2\u5B89\u88C5\u6A21\u5757";
587
584
  readonly "panels.market.sectionPending": "\u672A\u5B89\u88C5";
588
585
  readonly "panels.market.sectionShared": "\u5171\u7528\u4F9D\u8D56";
589
586
  readonly "panels.market.sharedUsedBy": "\u4F9B {modules} \u4F7F\u7528";
590
- readonly "panels.market.sharedFoot": "\u8FD9\u4E00\u6BB5\u4E0D\u7ED9\u5378\u8F7D\uFF1A\u5B83\u4EEC\u8DDF\u7740\u6A21\u5757\u6765\uFF0C\u5378\u6389\u4E5F\u4F1A\u88AB\u88C5\u56DE\u6765\u3002\u8981\u505C\u7528\u4E00\u4EFD\uFF0C\u5C31\u53BB\u5173\u6389\u6B63\u5728\u7528\u5B83\u7684\u90A3\u4E9B\u6A21\u5757\u3002";
591
587
  readonly "panels.market.listSeparator": "\u3001";
592
588
  readonly "panels.market.sharedMissing": "\u672A\u88C5";
593
589
  readonly "panels.market.sharedOutdated": "\u6709\u65B0\u7248";
@@ -612,15 +608,13 @@ export declare const kit: {
612
608
  readonly "panels.market.noSource": "\u8FD9\u4E2A\u6A21\u5757\u6CA1\u58F0\u660E\u600E\u4E48\u88C5\uFF0C\u53EA\u80FD\u81EA\u5DF1\u52A8\u624B";
613
609
  readonly "panels.market.badSource": "\u5B89\u88C5\u65B9\u5F0F\u6CA1\u5199\u5168\uFF0C\u53EA\u80FD\u81EA\u5DF1\u52A8\u624B";
614
610
  readonly "panels.market.empty": "\u6682\u65E0\u53EF\u7528\u6A21\u5757";
615
- readonly "panels.market.installedSection": "\u5DF2\u5B89\u88C5";
616
- readonly "panels.market.sectionLocal": "\u672C\u5730\u88C5\u7684";
611
+ readonly "panels.market.sectionLocal": "\u672C\u5730\u6A21\u5757";
617
612
  readonly "panels.market.sectionUnlisted": "\u4E0D\u662F\u4ECE\u5E02\u573A\u88C5\u7684";
618
613
  readonly "panels.market.sectionPlugins": "\u5DF2\u5B89\u88C5 opencli \u63D2\u4EF6";
619
614
  readonly "panels.market.moduleOutdated": "\u6709\u65B0\u7248";
620
615
  readonly "panels.market.moduleRefused": "\u8FD9\u4E2A\u6A21\u5757\u662F\u7ED9\u65E7\u7248\u672C\u7684\u5DE5\u4F5C\u53F0\u5199\u7684\uFF0C\u73B0\u5728\u7528\u4E0D\u4E86\u3002\u66F4\u65B0\u5B83\uFF0C\u6216\u8005\u5378\u8F7D\u3002";
621
616
  readonly "panels.market.moduleRefusedDetail": "\u88C5\u4E0D\u4E0A\u7684\u539F\u56E0\uFF1A{reason}";
622
617
  readonly "panels.market.moduleRestartHint": "\u88C5\u597D\u4E86\u4F46\u8FD8\u6CA1\u751F\u6548 \u2014\u2014 \u91CD\u542F\u4E00\u6B21 dsh \u5C31\u4F1A\u51FA\u6765";
623
- readonly "panels.market.pluginLocalNoUpdate": "\u672C\u5730\u88C5\u7684\uFF0C\u6CA1\u5730\u65B9\u67E5\u65B0\u7248\uFF0C\u6240\u4EE5\u53EA\u7ED9\u5378\u8F7D";
624
618
  readonly "panels.market.pluginKeptInUse": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A{names} \u8FD8\u8981\u7528\u5B83\u3002";
625
619
  readonly "panels.market.pluginKeptUnsure": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A\u8FD9\u53F0\u673A\u5668\u4E0A\u8FD8\u6709\u6A21\u5757\u770B\u4E0D\u51FA\u7528\u4E86\u4EC0\u4E48\uFF0C\u8BF4\u4E0D\u51C6\u8C01\u5728\u7528\u5B83\u3002";
626
620
  readonly "panels.market.pluginKeptHeld": "\u6587\u4EF6\u7559\u7740\uFF1A\u4F60\u81EA\u5DF1\u88C5\u7684\u90A3\u4E00\u4EFD\uFF0C\u6A21\u5757\u653E\u624B\u4E0D\u52A8\u5B83\u3002";
@@ -1065,11 +1059,10 @@ export declare const kit: {
1065
1059
  readonly "panels.market.missing": "\u672A\u88C5";
1066
1060
  readonly "panels.market.unchecked": "\u72B6\u6001\u672A\u77E5";
1067
1061
  readonly "panels.market.checking": "\u68C0\u6D4B\u4E2D";
1068
- readonly "panels.market.sectionInstalled": "\u5DF2\u5B89\u88C5";
1062
+ readonly "panels.market.sectionInstalled": "\u5DF2\u5B89\u88C5\u6A21\u5757";
1069
1063
  readonly "panels.market.sectionPending": "\u672A\u5B89\u88C5";
1070
1064
  readonly "panels.market.sectionShared": "\u5171\u7528\u4F9D\u8D56";
1071
1065
  readonly "panels.market.sharedUsedBy": "\u4F9B {modules} \u4F7F\u7528";
1072
- readonly "panels.market.sharedFoot": "\u8FD9\u4E00\u6BB5\u4E0D\u7ED9\u5378\u8F7D\uFF1A\u5B83\u4EEC\u8DDF\u7740\u6A21\u5757\u6765\uFF0C\u5378\u6389\u4E5F\u4F1A\u88AB\u88C5\u56DE\u6765\u3002\u8981\u505C\u7528\u4E00\u4EFD\uFF0C\u5C31\u53BB\u5173\u6389\u6B63\u5728\u7528\u5B83\u7684\u90A3\u4E9B\u6A21\u5757\u3002";
1073
1066
  readonly "panels.market.listSeparator": "\u3001";
1074
1067
  readonly "panels.market.sharedMissing": "\u672A\u88C5";
1075
1068
  readonly "panels.market.sharedOutdated": "\u6709\u65B0\u7248";
@@ -1094,15 +1087,13 @@ export declare const kit: {
1094
1087
  readonly "panels.market.noSource": "\u8FD9\u4E2A\u6A21\u5757\u6CA1\u58F0\u660E\u600E\u4E48\u88C5\uFF0C\u53EA\u80FD\u81EA\u5DF1\u52A8\u624B";
1095
1088
  readonly "panels.market.badSource": "\u5B89\u88C5\u65B9\u5F0F\u6CA1\u5199\u5168\uFF0C\u53EA\u80FD\u81EA\u5DF1\u52A8\u624B";
1096
1089
  readonly "panels.market.empty": "\u6682\u65E0\u53EF\u7528\u6A21\u5757";
1097
- readonly "panels.market.installedSection": "\u5DF2\u5B89\u88C5";
1098
- readonly "panels.market.sectionLocal": "\u672C\u5730\u88C5\u7684";
1090
+ readonly "panels.market.sectionLocal": "\u672C\u5730\u6A21\u5757";
1099
1091
  readonly "panels.market.sectionUnlisted": "\u4E0D\u662F\u4ECE\u5E02\u573A\u88C5\u7684";
1100
1092
  readonly "panels.market.sectionPlugins": "\u5DF2\u5B89\u88C5 opencli \u63D2\u4EF6";
1101
1093
  readonly "panels.market.moduleOutdated": "\u6709\u65B0\u7248";
1102
1094
  readonly "panels.market.moduleRefused": "\u8FD9\u4E2A\u6A21\u5757\u662F\u7ED9\u65E7\u7248\u672C\u7684\u5DE5\u4F5C\u53F0\u5199\u7684\uFF0C\u73B0\u5728\u7528\u4E0D\u4E86\u3002\u66F4\u65B0\u5B83\uFF0C\u6216\u8005\u5378\u8F7D\u3002";
1103
1095
  readonly "panels.market.moduleRefusedDetail": "\u88C5\u4E0D\u4E0A\u7684\u539F\u56E0\uFF1A{reason}";
1104
1096
  readonly "panels.market.moduleRestartHint": "\u88C5\u597D\u4E86\u4F46\u8FD8\u6CA1\u751F\u6548 \u2014\u2014 \u91CD\u542F\u4E00\u6B21 dsh \u5C31\u4F1A\u51FA\u6765";
1105
- readonly "panels.market.pluginLocalNoUpdate": "\u672C\u5730\u88C5\u7684\uFF0C\u6CA1\u5730\u65B9\u67E5\u65B0\u7248\uFF0C\u6240\u4EE5\u53EA\u7ED9\u5378\u8F7D";
1106
1097
  readonly "panels.market.pluginKeptInUse": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A{names} \u8FD8\u8981\u7528\u5B83\u3002";
1107
1098
  readonly "panels.market.pluginKeptUnsure": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A\u8FD9\u53F0\u673A\u5668\u4E0A\u8FD8\u6709\u6A21\u5757\u770B\u4E0D\u51FA\u7528\u4E86\u4EC0\u4E48\uFF0C\u8BF4\u4E0D\u51C6\u8C01\u5728\u7528\u5B83\u3002";
1108
1099
  readonly "panels.market.pluginKeptHeld": "\u6587\u4EF6\u7559\u7740\uFF1A\u4F60\u81EA\u5DF1\u88C5\u7684\u90A3\u4E00\u4EFD\uFF0C\u6A21\u5757\u653E\u624B\u4E0D\u52A8\u5B83\u3002";
@@ -1327,7 +1318,7 @@ export declare const kit: {
1327
1318
  readonly "panel.conversation": "\u5BF9\u8BDD";
1328
1319
  readonly "panels.label": "\u5168\u5C40\u9762\u677F";
1329
1320
  };
1330
- en: Record<"time.now" | "time.minutes" | "time.hours" | "time.days" | "blocker.retry" | "blocker.copy" | "blocker.unknown.title" | "blocker.login.go" | "blocker.login.titleGeneric" | "blocker.login.title" | "blocker.login.manual" | "blocker.login.hint" | "blocker.forbidden.open" | "blocker.forbidden.titleGeneric" | "blocker.forbidden.title" | "blocker.forbidden.hint" | "blocker.timeout.hint" | "blocker.exec.hint" | "blocker.fix.install" | "blocker.fix.update" | "blocker.market.open" | "env.unit.failed" | "env.unit.failedHint" | "env.unit.missingPlugin" | "env.unit.hint" | "env.unit.missingCommands" | "env.unit.missingCommandsHint" | "env.unit.unchecked" | "env.unit.uncheckedHint" | "brand.name" | "toggle.open" | "toggle.collapse" | "project.label" | "workspace.section" | "project.none" | "project.empty" | "project.add" | "project.search.label" | "project.search.placeholder" | "project.search.empty" | "project.rename.row" | "project.rename.current" | "project.rename.title" | "project.rename.description" | "project.rename.field" | "project.rename.placeholder" | "project.rename.hint" | "project.rename.save" | "project.rename.saving" | "project.rename.cancel" | "project.rename.failed" | "session.new" | "session.new.label" | "session.empty" | "session.noProject" | "session.pinned" | "session.actions" | "status.idle" | "status.running" | "status.waitingApproval" | "status.planReview" | "status.waitingAnswer" | "status.completed" | "status.subagentsRunning.one" | "status.subagentsRunning.other" | "panels.title" | "panels.reset" | "panels.enabled" | "panels.disabled" | "panels.choose" | "panels.buildModule" | "panels.failed" | "panels.hintEffect" | "panels.dragHint" | "panels.unknownStep" | "panels.labelWithHint" | "panels.dep.failed" | "panels.dep.missingPlugin" | "panels.dep.missingCommands" | "panels.dep.unchecked" | "panels.tab.modules" | "panels.tab.market" | "panels.browseMarket" | "panels.noneInstalled" | "panels.noneInstalledHint" | "panels.market.installed" | "panels.market.outdated" | "panels.market.hasNew" | "panels.market.missing" | "panels.market.unchecked" | "panels.market.checking" | "panels.market.sectionInstalled" | "panels.market.sectionPending" | "panels.market.sectionShared" | "panels.market.sharedUsedBy" | "panels.market.sharedFoot" | "panels.market.listSeparator" | "panels.market.sharedMissing" | "panels.market.sharedOutdated" | "panels.market.sharedUnsatisfied" | "panels.market.sharedOk" | "panels.market.versionArrow" | "panels.market.lead" | "panels.market.install" | "panels.market.update" | "panels.market.uninstall" | "panels.market.uninstallLabel" | "panels.market.installing" | "panels.market.updating" | "panels.market.uninstalling" | "panels.market.confirmUninstallTitle" | "panels.market.confirmUninstallDetail" | "panels.market.confirmUninstallAck" | "panels.market.confirmYes" | "panels.market.confirmNo" | "panels.market.failed" | "panels.market.needEnv" | "panels.market.noSource" | "panels.market.badSource" | "panels.market.empty" | "panels.market.installedSection" | "panels.market.sectionLocal" | "panels.market.sectionUnlisted" | "panels.market.sectionPlugins" | "panels.market.moduleOutdated" | "panels.market.moduleRefused" | "panels.market.moduleRefusedDetail" | "panels.market.moduleRestartHint" | "panels.market.pluginLocalNoUpdate" | "panels.market.pluginKeptInUse" | "panels.market.pluginKeptUnsure" | "panels.market.pluginKeptHeld" | "panels.market.pluginKeptUnnamed" | "panels.market.pluginAlsoKnownAs" | "panels.market.pluginBroken" | "panels.market.restartNeeded" | "panels.market.foot" | "panels.market.recheck" | "panels.market.checkUpdates" | "panels.market.checkedAt" | "panels.market.justNow" | "panels.market.minutesAgo" | "panels.market.hoursAgo" | "panels.market.add.description" | "panels.market.add.specPlaceholder" | "panels.market.add.guideToggle" | "panels.market.add.guideHide" | "panels.market.add.guideIdTitle" | "panels.market.add.guideIdExample" | "panels.market.add.guideIdHint" | "panels.market.add.guideGitTitle" | "panels.market.add.guideGitExample" | "panels.market.add.guideGitHint" | "panels.market.add.guidePathTitle" | "panels.market.add.guidePathExample" | "panels.market.add.guidePathHint" | "panels.market.add.guideExampleLabel" | "panels.market.add.guideFill" | "panels.market.add.guideSafety" | "panels.market.add.registryLegend" | "panels.market.add.registryOfficial" | "panels.market.add.registryMirror" | "panels.market.add.registryWithHost" | "panels.market.add.registryToggle" | "panels.market.add.installVersion" | "panels.market.add.registryDefault" | "panels.market.add.registryCustom" | "panels.market.add.registryCustomPlaceholder" | "panels.market.add.registryCustomHint" | "panels.market.add.registryCustomInvalid" | "panels.market.add.run" | "panels.market.add.edit" | "panels.market.add.changeRegistry" | "panels.market.add.installingTitle" | "panels.market.add.installedTitle" | "panels.market.add.failedTitle" | "panels.market.add.cancelledTitle" | "panels.market.add.failureNetworkHost" | "panels.market.add.problemInvalid" | "panels.market.add.problemInstalled" | "panels.market.add.problemNotFound" | "panels.market.add.problemNotPackage" | "panels.market.add.problemNotBundle" | "panels.market.add.problemNotWorkbenchModule" | "panels.market.add.problemNotModuleOrPlugin" | "panels.market.add.failureNotModuleOrPlugin" | "panels.market.add.installedPlugin" | "panels.market.add.problemNetwork" | "panels.market.add.problemUnknown" | "panels.market.add.failureNetwork" | "panels.market.add.failureNotFound" | "panels.market.add.failureNoMatchingVersion" | "panels.market.add.failureDiskFull" | "panels.market.add.failurePermission" | "panels.market.add.failureBuildBlocked" | "panels.market.add.failureIntegrity" | "panels.market.add.failureTimeout" | "panels.market.add.failurePnpmMissing" | "panels.market.add.failureGeneric" | "panels.market.add.approveTitle" | "panels.market.add.approveCaution" | "panels.market.add.approveRun" | "panels.market.add.restart" | "panels.market.add.tookEffect" | "panels.market.add.details" | "panels.market.add.open" | "panels.market.add.title" | "panels.market.add.intro" | "panels.market.add.specLabel" | "panels.market.add.specHint" | "panels.market.add.exampleTitle" | "panels.market.add.exampleFill" | "panels.market.add.registryLabel" | "panels.market.add.registryProfile" | "panels.market.add.registryPnpm" | "panels.market.add.check" | "panels.market.add.checking" | "panels.market.add.classifying" | "panels.market.add.change" | "panels.market.add.previewTitle" | "panels.market.add.fieldName" | "panels.market.add.fieldVersion" | "panels.market.add.fieldDescription" | "panels.market.add.fieldSource" | "panels.market.add.install" | "panels.market.add.installing" | "panels.market.add.cancel" | "panels.market.add.close" | "panels.market.add.retry" | "panels.market.add.changeSource" | "panels.market.add.approveBuilds" | "panels.market.add.approveHint" | "panels.market.add.doneApplied" | "panels.market.add.doneRestart" | "panels.market.add.cancelled" | "panels.market.add.failed" | "panels.market.add.removed" | "panels.market.add.supplyPending" | "panels.market.add.supplyFailed" | "panels.market.add.notModule" | "panels.market.add.removedRestart" | "panels.market.add.remove" | "panels.market.add.problem.invalidSpec" | "panels.market.add.problem.alreadyInstalled" | "panels.market.add.problem.notFound" | "panels.market.add.problem.notAPackage" | "panels.market.add.problem.notABundle" | "panels.market.add.problem.network" | "panels.market.add.problem.unknown" | "panels.market.add.reason.invalidSpec" | "panels.market.add.reason.incompatible" | "panels.market.add.reason.notBundle" | "panels.market.add.reason.notRemovable" | "panels.market.add.reason.bundleInUse" | "panels.market.add.reason.stopProfile" | "panels.market.add.reason.staleApproval" | "panels.market.add.reason.operationError" | "panels.market.add.reason.buildBlocked" | "panels.market.add.reason.pnpmMissing" | "panels.market.add.reason.noMatchingVersion" | "panels.market.add.reason.diskFull" | "panels.market.add.reason.permission" | "panels.market.add.reason.integrity" | "panels.market.add.reason.timeout" | "panels.market.add.reason.network" | "panels.market.add.reason.notFound" | "panels.market.add.reason.unknown" | "blocker.fix.running" | "blocker.fix.failed" | "blocker.retry.running" | "panels.reading" | "panels.cardBroken" | "panels.cardRetry" | "panels.empty" | "panels.emptyHint" | "env.title" | "env.checking" | "env.installing" | "env.failed" | "env.elapsed" | "env.stepFailed.install" | "env.stepFailed.path" | "env.stepFailed.shell" | "env.bridge.ok" | "env.bridge.short" | "env.bridge.why" | "env.bridge.daemon" | "env.bridge.extension" | "env.bridge.extensionLink" | "env.bridge.profile" | "env.bridge.stale" | "env.bridge.unknown" | "env.fix.title" | "env.fix.why" | "env.fix.whyPath" | "env.fix.whyShell" | "env.fix.step" | "env.fix.stepPath" | "env.fix.stepShell" | "env.fix.permission" | "env.fix.network" | "env.fix.details" | "env.retry" | "env.copyCommand" | "env.copied" | "env.step.opencli" | "env.step.codingPlugin" | "env.step.bridge" | "env.step.warm" | "env.warm.done" | "env.warm.short" | "rightbar.label" | "rightbar.expand" | "rightbar.collapse" | "rightbar.column.label" | "rightbar.column.workbench" | "rightbar.column.dsh" | "rightbar.refresh" | "rightbar.refreshing" | "rightbar.updatedAt" | "rightbar.noProject" | "rightbar.openPlatform" | "coding.notARepo.title" | "error.unknown" | "board.title" | "panel.conversation" | "panels.label", string>;
1321
+ en: Record<"time.now" | "time.minutes" | "time.hours" | "time.days" | "blocker.retry" | "blocker.copy" | "blocker.unknown.title" | "blocker.login.go" | "blocker.login.titleGeneric" | "blocker.login.title" | "blocker.login.manual" | "blocker.login.hint" | "blocker.forbidden.open" | "blocker.forbidden.titleGeneric" | "blocker.forbidden.title" | "blocker.forbidden.hint" | "blocker.timeout.hint" | "blocker.exec.hint" | "blocker.fix.install" | "blocker.fix.update" | "blocker.market.open" | "env.unit.failed" | "env.unit.failedHint" | "env.unit.missingPlugin" | "env.unit.hint" | "env.unit.missingCommands" | "env.unit.missingCommandsHint" | "env.unit.unchecked" | "env.unit.uncheckedHint" | "brand.name" | "toggle.open" | "toggle.collapse" | "project.label" | "workspace.section" | "project.none" | "project.empty" | "project.add" | "project.search.label" | "project.search.placeholder" | "project.search.empty" | "project.rename.row" | "project.rename.current" | "project.rename.title" | "project.rename.description" | "project.rename.field" | "project.rename.placeholder" | "project.rename.hint" | "project.rename.save" | "project.rename.saving" | "project.rename.cancel" | "project.rename.failed" | "session.new" | "session.new.label" | "session.empty" | "session.noProject" | "session.pinned" | "session.actions" | "status.idle" | "status.running" | "status.waitingApproval" | "status.planReview" | "status.waitingAnswer" | "status.completed" | "status.subagentsRunning.one" | "status.subagentsRunning.other" | "panels.title" | "panels.reset" | "panels.enabled" | "panels.disabled" | "panels.choose" | "panels.buildModule" | "panels.failed" | "panels.hintEffect" | "panels.dragHint" | "panels.unknownStep" | "panels.labelWithHint" | "panels.dep.failed" | "panels.dep.missingPlugin" | "panels.dep.missingCommands" | "panels.dep.unchecked" | "panels.tab.modules" | "panels.tab.market" | "panels.browseMarket" | "panels.noneInstalled" | "panels.noneInstalledHint" | "panels.market.installed" | "panels.market.outdated" | "panels.market.hasNew" | "panels.market.missing" | "panels.market.unchecked" | "panels.market.checking" | "panels.market.sectionInstalled" | "panels.market.sectionPending" | "panels.market.sectionShared" | "panels.market.sharedUsedBy" | "panels.market.listSeparator" | "panels.market.sharedMissing" | "panels.market.sharedOutdated" | "panels.market.sharedUnsatisfied" | "panels.market.sharedOk" | "panels.market.versionArrow" | "panels.market.lead" | "panels.market.install" | "panels.market.update" | "panels.market.uninstall" | "panels.market.uninstallLabel" | "panels.market.installing" | "panels.market.updating" | "panels.market.uninstalling" | "panels.market.confirmUninstallTitle" | "panels.market.confirmUninstallDetail" | "panels.market.confirmUninstallAck" | "panels.market.confirmYes" | "panels.market.confirmNo" | "panels.market.failed" | "panels.market.needEnv" | "panels.market.noSource" | "panels.market.badSource" | "panels.market.empty" | "panels.market.sectionLocal" | "panels.market.sectionUnlisted" | "panels.market.sectionPlugins" | "panels.market.moduleOutdated" | "panels.market.moduleRefused" | "panels.market.moduleRefusedDetail" | "panels.market.moduleRestartHint" | "panels.market.pluginKeptInUse" | "panels.market.pluginKeptUnsure" | "panels.market.pluginKeptHeld" | "panels.market.pluginKeptUnnamed" | "panels.market.pluginAlsoKnownAs" | "panels.market.pluginBroken" | "panels.market.restartNeeded" | "panels.market.foot" | "panels.market.recheck" | "panels.market.checkUpdates" | "panels.market.checkedAt" | "panels.market.justNow" | "panels.market.minutesAgo" | "panels.market.hoursAgo" | "panels.market.add.description" | "panels.market.add.specPlaceholder" | "panels.market.add.guideToggle" | "panels.market.add.guideHide" | "panels.market.add.guideIdTitle" | "panels.market.add.guideIdExample" | "panels.market.add.guideIdHint" | "panels.market.add.guideGitTitle" | "panels.market.add.guideGitExample" | "panels.market.add.guideGitHint" | "panels.market.add.guidePathTitle" | "panels.market.add.guidePathExample" | "panels.market.add.guidePathHint" | "panels.market.add.guideExampleLabel" | "panels.market.add.guideFill" | "panels.market.add.guideSafety" | "panels.market.add.registryLegend" | "panels.market.add.registryOfficial" | "panels.market.add.registryMirror" | "panels.market.add.registryWithHost" | "panels.market.add.registryToggle" | "panels.market.add.installVersion" | "panels.market.add.registryDefault" | "panels.market.add.registryCustom" | "panels.market.add.registryCustomPlaceholder" | "panels.market.add.registryCustomHint" | "panels.market.add.registryCustomInvalid" | "panels.market.add.run" | "panels.market.add.edit" | "panels.market.add.changeRegistry" | "panels.market.add.installingTitle" | "panels.market.add.installedTitle" | "panels.market.add.failedTitle" | "panels.market.add.cancelledTitle" | "panels.market.add.failureNetworkHost" | "panels.market.add.problemInvalid" | "panels.market.add.problemInstalled" | "panels.market.add.problemNotFound" | "panels.market.add.problemNotPackage" | "panels.market.add.problemNotBundle" | "panels.market.add.problemNotWorkbenchModule" | "panels.market.add.problemNotModuleOrPlugin" | "panels.market.add.failureNotModuleOrPlugin" | "panels.market.add.installedPlugin" | "panels.market.add.problemNetwork" | "panels.market.add.problemUnknown" | "panels.market.add.failureNetwork" | "panels.market.add.failureNotFound" | "panels.market.add.failureNoMatchingVersion" | "panels.market.add.failureDiskFull" | "panels.market.add.failurePermission" | "panels.market.add.failureBuildBlocked" | "panels.market.add.failureIntegrity" | "panels.market.add.failureTimeout" | "panels.market.add.failurePnpmMissing" | "panels.market.add.failureGeneric" | "panels.market.add.approveTitle" | "panels.market.add.approveCaution" | "panels.market.add.approveRun" | "panels.market.add.restart" | "panels.market.add.tookEffect" | "panels.market.add.details" | "panels.market.add.open" | "panels.market.add.title" | "panels.market.add.intro" | "panels.market.add.specLabel" | "panels.market.add.specHint" | "panels.market.add.exampleTitle" | "panels.market.add.exampleFill" | "panels.market.add.registryLabel" | "panels.market.add.registryProfile" | "panels.market.add.registryPnpm" | "panels.market.add.check" | "panels.market.add.checking" | "panels.market.add.classifying" | "panels.market.add.change" | "panels.market.add.previewTitle" | "panels.market.add.fieldName" | "panels.market.add.fieldVersion" | "panels.market.add.fieldDescription" | "panels.market.add.fieldSource" | "panels.market.add.install" | "panels.market.add.installing" | "panels.market.add.cancel" | "panels.market.add.close" | "panels.market.add.retry" | "panels.market.add.changeSource" | "panels.market.add.approveBuilds" | "panels.market.add.approveHint" | "panels.market.add.doneApplied" | "panels.market.add.doneRestart" | "panels.market.add.cancelled" | "panels.market.add.failed" | "panels.market.add.removed" | "panels.market.add.supplyPending" | "panels.market.add.supplyFailed" | "panels.market.add.notModule" | "panels.market.add.removedRestart" | "panels.market.add.remove" | "panels.market.add.problem.invalidSpec" | "panels.market.add.problem.alreadyInstalled" | "panels.market.add.problem.notFound" | "panels.market.add.problem.notAPackage" | "panels.market.add.problem.notABundle" | "panels.market.add.problem.network" | "panels.market.add.problem.unknown" | "panels.market.add.reason.invalidSpec" | "panels.market.add.reason.incompatible" | "panels.market.add.reason.notBundle" | "panels.market.add.reason.notRemovable" | "panels.market.add.reason.bundleInUse" | "panels.market.add.reason.stopProfile" | "panels.market.add.reason.staleApproval" | "panels.market.add.reason.operationError" | "panels.market.add.reason.buildBlocked" | "panels.market.add.reason.pnpmMissing" | "panels.market.add.reason.noMatchingVersion" | "panels.market.add.reason.diskFull" | "panels.market.add.reason.permission" | "panels.market.add.reason.integrity" | "panels.market.add.reason.timeout" | "panels.market.add.reason.network" | "panels.market.add.reason.notFound" | "panels.market.add.reason.unknown" | "blocker.fix.running" | "blocker.fix.failed" | "blocker.retry.running" | "panels.reading" | "panels.cardBroken" | "panels.cardRetry" | "panels.empty" | "panels.emptyHint" | "env.title" | "env.checking" | "env.installing" | "env.failed" | "env.elapsed" | "env.stepFailed.install" | "env.stepFailed.path" | "env.stepFailed.shell" | "env.bridge.ok" | "env.bridge.short" | "env.bridge.why" | "env.bridge.daemon" | "env.bridge.extension" | "env.bridge.extensionLink" | "env.bridge.profile" | "env.bridge.stale" | "env.bridge.unknown" | "env.fix.title" | "env.fix.why" | "env.fix.whyPath" | "env.fix.whyShell" | "env.fix.step" | "env.fix.stepPath" | "env.fix.stepShell" | "env.fix.permission" | "env.fix.network" | "env.fix.details" | "env.retry" | "env.copyCommand" | "env.copied" | "env.step.opencli" | "env.step.codingPlugin" | "env.step.bridge" | "env.step.warm" | "env.warm.done" | "env.warm.short" | "rightbar.label" | "rightbar.expand" | "rightbar.collapse" | "rightbar.column.label" | "rightbar.column.workbench" | "rightbar.column.dsh" | "rightbar.refresh" | "rightbar.refreshing" | "rightbar.updatedAt" | "rightbar.noProject" | "rightbar.openPlatform" | "coding.notARepo.title" | "error.unknown" | "board.title" | "panel.conversation" | "panels.label", string>;
1331
1322
  };
1332
1323
  mergeMessages(base: apiModule.Dictionaries, contributions: readonly MessagesContribution[]): apiModule.Dictionaries;
1333
1324
  mergeMessagesSkipping(base: apiModule.Dictionaries, contributions: readonly MessagesContribution[]): apiModule.MessagesMerge;
@@ -1398,11 +1389,10 @@ export declare const kit: {
1398
1389
  readonly "panels.market.missing": "\u672A\u88C5";
1399
1390
  readonly "panels.market.unchecked": "\u72B6\u6001\u672A\u77E5";
1400
1391
  readonly "panels.market.checking": "\u68C0\u6D4B\u4E2D";
1401
- readonly "panels.market.sectionInstalled": "\u5DF2\u5B89\u88C5";
1392
+ readonly "panels.market.sectionInstalled": "\u5DF2\u5B89\u88C5\u6A21\u5757";
1402
1393
  readonly "panels.market.sectionPending": "\u672A\u5B89\u88C5";
1403
1394
  readonly "panels.market.sectionShared": "\u5171\u7528\u4F9D\u8D56";
1404
1395
  readonly "panels.market.sharedUsedBy": "\u4F9B {modules} \u4F7F\u7528";
1405
- readonly "panels.market.sharedFoot": "\u8FD9\u4E00\u6BB5\u4E0D\u7ED9\u5378\u8F7D\uFF1A\u5B83\u4EEC\u8DDF\u7740\u6A21\u5757\u6765\uFF0C\u5378\u6389\u4E5F\u4F1A\u88AB\u88C5\u56DE\u6765\u3002\u8981\u505C\u7528\u4E00\u4EFD\uFF0C\u5C31\u53BB\u5173\u6389\u6B63\u5728\u7528\u5B83\u7684\u90A3\u4E9B\u6A21\u5757\u3002";
1406
1396
  readonly "panels.market.listSeparator": "\u3001";
1407
1397
  readonly "panels.market.sharedMissing": "\u672A\u88C5";
1408
1398
  readonly "panels.market.sharedOutdated": "\u6709\u65B0\u7248";
@@ -1427,15 +1417,13 @@ export declare const kit: {
1427
1417
  readonly "panels.market.noSource": "\u8FD9\u4E2A\u6A21\u5757\u6CA1\u58F0\u660E\u600E\u4E48\u88C5\uFF0C\u53EA\u80FD\u81EA\u5DF1\u52A8\u624B";
1428
1418
  readonly "panels.market.badSource": "\u5B89\u88C5\u65B9\u5F0F\u6CA1\u5199\u5168\uFF0C\u53EA\u80FD\u81EA\u5DF1\u52A8\u624B";
1429
1419
  readonly "panels.market.empty": "\u6682\u65E0\u53EF\u7528\u6A21\u5757";
1430
- readonly "panels.market.installedSection": "\u5DF2\u5B89\u88C5";
1431
- readonly "panels.market.sectionLocal": "\u672C\u5730\u88C5\u7684";
1420
+ readonly "panels.market.sectionLocal": "\u672C\u5730\u6A21\u5757";
1432
1421
  readonly "panels.market.sectionUnlisted": "\u4E0D\u662F\u4ECE\u5E02\u573A\u88C5\u7684";
1433
1422
  readonly "panels.market.sectionPlugins": "\u5DF2\u5B89\u88C5 opencli \u63D2\u4EF6";
1434
1423
  readonly "panels.market.moduleOutdated": "\u6709\u65B0\u7248";
1435
1424
  readonly "panels.market.moduleRefused": "\u8FD9\u4E2A\u6A21\u5757\u662F\u7ED9\u65E7\u7248\u672C\u7684\u5DE5\u4F5C\u53F0\u5199\u7684\uFF0C\u73B0\u5728\u7528\u4E0D\u4E86\u3002\u66F4\u65B0\u5B83\uFF0C\u6216\u8005\u5378\u8F7D\u3002";
1436
1425
  readonly "panels.market.moduleRefusedDetail": "\u88C5\u4E0D\u4E0A\u7684\u539F\u56E0\uFF1A{reason}";
1437
1426
  readonly "panels.market.moduleRestartHint": "\u88C5\u597D\u4E86\u4F46\u8FD8\u6CA1\u751F\u6548 \u2014\u2014 \u91CD\u542F\u4E00\u6B21 dsh \u5C31\u4F1A\u51FA\u6765";
1438
- readonly "panels.market.pluginLocalNoUpdate": "\u672C\u5730\u88C5\u7684\uFF0C\u6CA1\u5730\u65B9\u67E5\u65B0\u7248\uFF0C\u6240\u4EE5\u53EA\u7ED9\u5378\u8F7D";
1439
1427
  readonly "panels.market.pluginKeptInUse": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A{names} \u8FD8\u8981\u7528\u5B83\u3002";
1440
1428
  readonly "panels.market.pluginKeptUnsure": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A\u8FD9\u53F0\u673A\u5668\u4E0A\u8FD8\u6709\u6A21\u5757\u770B\u4E0D\u51FA\u7528\u4E86\u4EC0\u4E48\uFF0C\u8BF4\u4E0D\u51C6\u8C01\u5728\u7528\u5B83\u3002";
1441
1429
  readonly "panels.market.pluginKeptHeld": "\u6587\u4EF6\u7559\u7740\uFF1A\u4F60\u81EA\u5DF1\u88C5\u7684\u90A3\u4E00\u4EFD\uFF0C\u6A21\u5757\u653E\u624B\u4E0D\u52A8\u5B83\u3002";
@@ -1875,11 +1863,10 @@ export declare const kit: {
1875
1863
  readonly "panels.market.missing": "\u672A\u88C5";
1876
1864
  readonly "panels.market.unchecked": "\u72B6\u6001\u672A\u77E5";
1877
1865
  readonly "panels.market.checking": "\u68C0\u6D4B\u4E2D";
1878
- readonly "panels.market.sectionInstalled": "\u5DF2\u5B89\u88C5";
1866
+ readonly "panels.market.sectionInstalled": "\u5DF2\u5B89\u88C5\u6A21\u5757";
1879
1867
  readonly "panels.market.sectionPending": "\u672A\u5B89\u88C5";
1880
1868
  readonly "panels.market.sectionShared": "\u5171\u7528\u4F9D\u8D56";
1881
1869
  readonly "panels.market.sharedUsedBy": "\u4F9B {modules} \u4F7F\u7528";
1882
- readonly "panels.market.sharedFoot": "\u8FD9\u4E00\u6BB5\u4E0D\u7ED9\u5378\u8F7D\uFF1A\u5B83\u4EEC\u8DDF\u7740\u6A21\u5757\u6765\uFF0C\u5378\u6389\u4E5F\u4F1A\u88AB\u88C5\u56DE\u6765\u3002\u8981\u505C\u7528\u4E00\u4EFD\uFF0C\u5C31\u53BB\u5173\u6389\u6B63\u5728\u7528\u5B83\u7684\u90A3\u4E9B\u6A21\u5757\u3002";
1883
1870
  readonly "panels.market.listSeparator": "\u3001";
1884
1871
  readonly "panels.market.sharedMissing": "\u672A\u88C5";
1885
1872
  readonly "panels.market.sharedOutdated": "\u6709\u65B0\u7248";
@@ -1904,15 +1891,13 @@ export declare const kit: {
1904
1891
  readonly "panels.market.noSource": "\u8FD9\u4E2A\u6A21\u5757\u6CA1\u58F0\u660E\u600E\u4E48\u88C5\uFF0C\u53EA\u80FD\u81EA\u5DF1\u52A8\u624B";
1905
1892
  readonly "panels.market.badSource": "\u5B89\u88C5\u65B9\u5F0F\u6CA1\u5199\u5168\uFF0C\u53EA\u80FD\u81EA\u5DF1\u52A8\u624B";
1906
1893
  readonly "panels.market.empty": "\u6682\u65E0\u53EF\u7528\u6A21\u5757";
1907
- readonly "panels.market.installedSection": "\u5DF2\u5B89\u88C5";
1908
- readonly "panels.market.sectionLocal": "\u672C\u5730\u88C5\u7684";
1894
+ readonly "panels.market.sectionLocal": "\u672C\u5730\u6A21\u5757";
1909
1895
  readonly "panels.market.sectionUnlisted": "\u4E0D\u662F\u4ECE\u5E02\u573A\u88C5\u7684";
1910
1896
  readonly "panels.market.sectionPlugins": "\u5DF2\u5B89\u88C5 opencli \u63D2\u4EF6";
1911
1897
  readonly "panels.market.moduleOutdated": "\u6709\u65B0\u7248";
1912
1898
  readonly "panels.market.moduleRefused": "\u8FD9\u4E2A\u6A21\u5757\u662F\u7ED9\u65E7\u7248\u672C\u7684\u5DE5\u4F5C\u53F0\u5199\u7684\uFF0C\u73B0\u5728\u7528\u4E0D\u4E86\u3002\u66F4\u65B0\u5B83\uFF0C\u6216\u8005\u5378\u8F7D\u3002";
1913
1899
  readonly "panels.market.moduleRefusedDetail": "\u88C5\u4E0D\u4E0A\u7684\u539F\u56E0\uFF1A{reason}";
1914
1900
  readonly "panels.market.moduleRestartHint": "\u88C5\u597D\u4E86\u4F46\u8FD8\u6CA1\u751F\u6548 \u2014\u2014 \u91CD\u542F\u4E00\u6B21 dsh \u5C31\u4F1A\u51FA\u6765";
1915
- readonly "panels.market.pluginLocalNoUpdate": "\u672C\u5730\u88C5\u7684\uFF0C\u6CA1\u5730\u65B9\u67E5\u65B0\u7248\uFF0C\u6240\u4EE5\u53EA\u7ED9\u5378\u8F7D";
1916
1901
  readonly "panels.market.pluginKeptInUse": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A{names} \u8FD8\u8981\u7528\u5B83\u3002";
1917
1902
  readonly "panels.market.pluginKeptUnsure": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A\u8FD9\u53F0\u673A\u5668\u4E0A\u8FD8\u6709\u6A21\u5757\u770B\u4E0D\u51FA\u7528\u4E86\u4EC0\u4E48\uFF0C\u8BF4\u4E0D\u51C6\u8C01\u5728\u7528\u5B83\u3002";
1918
1903
  readonly "panels.market.pluginKeptHeld": "\u6587\u4EF6\u7559\u7740\uFF1A\u4F60\u81EA\u5DF1\u88C5\u7684\u90A3\u4E00\u4EFD\uFF0C\u6A21\u5757\u653E\u624B\u4E0D\u52A8\u5B83\u3002";
@@ -2137,7 +2122,7 @@ export declare const kit: {
2137
2122
  readonly "panel.conversation": "\u5BF9\u8BDD";
2138
2123
  readonly "panels.label": "\u5168\u5C40\u9762\u677F";
2139
2124
  };
2140
- en: Record<"time.now" | "time.minutes" | "time.hours" | "time.days" | "blocker.retry" | "blocker.copy" | "blocker.unknown.title" | "blocker.login.go" | "blocker.login.titleGeneric" | "blocker.login.title" | "blocker.login.manual" | "blocker.login.hint" | "blocker.forbidden.open" | "blocker.forbidden.titleGeneric" | "blocker.forbidden.title" | "blocker.forbidden.hint" | "blocker.timeout.hint" | "blocker.exec.hint" | "blocker.fix.install" | "blocker.fix.update" | "blocker.market.open" | "env.unit.failed" | "env.unit.failedHint" | "env.unit.missingPlugin" | "env.unit.hint" | "env.unit.missingCommands" | "env.unit.missingCommandsHint" | "env.unit.unchecked" | "env.unit.uncheckedHint" | "brand.name" | "toggle.open" | "toggle.collapse" | "project.label" | "workspace.section" | "project.none" | "project.empty" | "project.add" | "project.search.label" | "project.search.placeholder" | "project.search.empty" | "project.rename.row" | "project.rename.current" | "project.rename.title" | "project.rename.description" | "project.rename.field" | "project.rename.placeholder" | "project.rename.hint" | "project.rename.save" | "project.rename.saving" | "project.rename.cancel" | "project.rename.failed" | "session.new" | "session.new.label" | "session.empty" | "session.noProject" | "session.pinned" | "session.actions" | "status.idle" | "status.running" | "status.waitingApproval" | "status.planReview" | "status.waitingAnswer" | "status.completed" | "status.subagentsRunning.one" | "status.subagentsRunning.other" | "panels.title" | "panels.reset" | "panels.enabled" | "panels.disabled" | "panels.choose" | "panels.buildModule" | "panels.failed" | "panels.hintEffect" | "panels.dragHint" | "panels.unknownStep" | "panels.labelWithHint" | "panels.dep.failed" | "panels.dep.missingPlugin" | "panels.dep.missingCommands" | "panels.dep.unchecked" | "panels.tab.modules" | "panels.tab.market" | "panels.browseMarket" | "panels.noneInstalled" | "panels.noneInstalledHint" | "panels.market.installed" | "panels.market.outdated" | "panels.market.hasNew" | "panels.market.missing" | "panels.market.unchecked" | "panels.market.checking" | "panels.market.sectionInstalled" | "panels.market.sectionPending" | "panels.market.sectionShared" | "panels.market.sharedUsedBy" | "panels.market.sharedFoot" | "panels.market.listSeparator" | "panels.market.sharedMissing" | "panels.market.sharedOutdated" | "panels.market.sharedUnsatisfied" | "panels.market.sharedOk" | "panels.market.versionArrow" | "panels.market.lead" | "panels.market.install" | "panels.market.update" | "panels.market.uninstall" | "panels.market.uninstallLabel" | "panels.market.installing" | "panels.market.updating" | "panels.market.uninstalling" | "panels.market.confirmUninstallTitle" | "panels.market.confirmUninstallDetail" | "panels.market.confirmUninstallAck" | "panels.market.confirmYes" | "panels.market.confirmNo" | "panels.market.failed" | "panels.market.needEnv" | "panels.market.noSource" | "panels.market.badSource" | "panels.market.empty" | "panels.market.installedSection" | "panels.market.sectionLocal" | "panels.market.sectionUnlisted" | "panels.market.sectionPlugins" | "panels.market.moduleOutdated" | "panels.market.moduleRefused" | "panels.market.moduleRefusedDetail" | "panels.market.moduleRestartHint" | "panels.market.pluginLocalNoUpdate" | "panels.market.pluginKeptInUse" | "panels.market.pluginKeptUnsure" | "panels.market.pluginKeptHeld" | "panels.market.pluginKeptUnnamed" | "panels.market.pluginAlsoKnownAs" | "panels.market.pluginBroken" | "panels.market.restartNeeded" | "panels.market.foot" | "panels.market.recheck" | "panels.market.checkUpdates" | "panels.market.checkedAt" | "panels.market.justNow" | "panels.market.minutesAgo" | "panels.market.hoursAgo" | "panels.market.add.description" | "panels.market.add.specPlaceholder" | "panels.market.add.guideToggle" | "panels.market.add.guideHide" | "panels.market.add.guideIdTitle" | "panels.market.add.guideIdExample" | "panels.market.add.guideIdHint" | "panels.market.add.guideGitTitle" | "panels.market.add.guideGitExample" | "panels.market.add.guideGitHint" | "panels.market.add.guidePathTitle" | "panels.market.add.guidePathExample" | "panels.market.add.guidePathHint" | "panels.market.add.guideExampleLabel" | "panels.market.add.guideFill" | "panels.market.add.guideSafety" | "panels.market.add.registryLegend" | "panels.market.add.registryOfficial" | "panels.market.add.registryMirror" | "panels.market.add.registryWithHost" | "panels.market.add.registryToggle" | "panels.market.add.installVersion" | "panels.market.add.registryDefault" | "panels.market.add.registryCustom" | "panels.market.add.registryCustomPlaceholder" | "panels.market.add.registryCustomHint" | "panels.market.add.registryCustomInvalid" | "panels.market.add.run" | "panels.market.add.edit" | "panels.market.add.changeRegistry" | "panels.market.add.installingTitle" | "panels.market.add.installedTitle" | "panels.market.add.failedTitle" | "panels.market.add.cancelledTitle" | "panels.market.add.failureNetworkHost" | "panels.market.add.problemInvalid" | "panels.market.add.problemInstalled" | "panels.market.add.problemNotFound" | "panels.market.add.problemNotPackage" | "panels.market.add.problemNotBundle" | "panels.market.add.problemNotWorkbenchModule" | "panels.market.add.problemNotModuleOrPlugin" | "panels.market.add.failureNotModuleOrPlugin" | "panels.market.add.installedPlugin" | "panels.market.add.problemNetwork" | "panels.market.add.problemUnknown" | "panels.market.add.failureNetwork" | "panels.market.add.failureNotFound" | "panels.market.add.failureNoMatchingVersion" | "panels.market.add.failureDiskFull" | "panels.market.add.failurePermission" | "panels.market.add.failureBuildBlocked" | "panels.market.add.failureIntegrity" | "panels.market.add.failureTimeout" | "panels.market.add.failurePnpmMissing" | "panels.market.add.failureGeneric" | "panels.market.add.approveTitle" | "panels.market.add.approveCaution" | "panels.market.add.approveRun" | "panels.market.add.restart" | "panels.market.add.tookEffect" | "panels.market.add.details" | "panels.market.add.open" | "panels.market.add.title" | "panels.market.add.intro" | "panels.market.add.specLabel" | "panels.market.add.specHint" | "panels.market.add.exampleTitle" | "panels.market.add.exampleFill" | "panels.market.add.registryLabel" | "panels.market.add.registryProfile" | "panels.market.add.registryPnpm" | "panels.market.add.check" | "panels.market.add.checking" | "panels.market.add.classifying" | "panels.market.add.change" | "panels.market.add.previewTitle" | "panels.market.add.fieldName" | "panels.market.add.fieldVersion" | "panels.market.add.fieldDescription" | "panels.market.add.fieldSource" | "panels.market.add.install" | "panels.market.add.installing" | "panels.market.add.cancel" | "panels.market.add.close" | "panels.market.add.retry" | "panels.market.add.changeSource" | "panels.market.add.approveBuilds" | "panels.market.add.approveHint" | "panels.market.add.doneApplied" | "panels.market.add.doneRestart" | "panels.market.add.cancelled" | "panels.market.add.failed" | "panels.market.add.removed" | "panels.market.add.supplyPending" | "panels.market.add.supplyFailed" | "panels.market.add.notModule" | "panels.market.add.removedRestart" | "panels.market.add.remove" | "panels.market.add.problem.invalidSpec" | "panels.market.add.problem.alreadyInstalled" | "panels.market.add.problem.notFound" | "panels.market.add.problem.notAPackage" | "panels.market.add.problem.notABundle" | "panels.market.add.problem.network" | "panels.market.add.problem.unknown" | "panels.market.add.reason.invalidSpec" | "panels.market.add.reason.incompatible" | "panels.market.add.reason.notBundle" | "panels.market.add.reason.notRemovable" | "panels.market.add.reason.bundleInUse" | "panels.market.add.reason.stopProfile" | "panels.market.add.reason.staleApproval" | "panels.market.add.reason.operationError" | "panels.market.add.reason.buildBlocked" | "panels.market.add.reason.pnpmMissing" | "panels.market.add.reason.noMatchingVersion" | "panels.market.add.reason.diskFull" | "panels.market.add.reason.permission" | "panels.market.add.reason.integrity" | "panels.market.add.reason.timeout" | "panels.market.add.reason.network" | "panels.market.add.reason.notFound" | "panels.market.add.reason.unknown" | "blocker.fix.running" | "blocker.fix.failed" | "blocker.retry.running" | "panels.reading" | "panels.cardBroken" | "panels.cardRetry" | "panels.empty" | "panels.emptyHint" | "env.title" | "env.checking" | "env.installing" | "env.failed" | "env.elapsed" | "env.stepFailed.install" | "env.stepFailed.path" | "env.stepFailed.shell" | "env.bridge.ok" | "env.bridge.short" | "env.bridge.why" | "env.bridge.daemon" | "env.bridge.extension" | "env.bridge.extensionLink" | "env.bridge.profile" | "env.bridge.stale" | "env.bridge.unknown" | "env.fix.title" | "env.fix.why" | "env.fix.whyPath" | "env.fix.whyShell" | "env.fix.step" | "env.fix.stepPath" | "env.fix.stepShell" | "env.fix.permission" | "env.fix.network" | "env.fix.details" | "env.retry" | "env.copyCommand" | "env.copied" | "env.step.opencli" | "env.step.codingPlugin" | "env.step.bridge" | "env.step.warm" | "env.warm.done" | "env.warm.short" | "rightbar.label" | "rightbar.expand" | "rightbar.collapse" | "rightbar.column.label" | "rightbar.column.workbench" | "rightbar.column.dsh" | "rightbar.refresh" | "rightbar.refreshing" | "rightbar.updatedAt" | "rightbar.noProject" | "rightbar.openPlatform" | "coding.notARepo.title" | "error.unknown" | "board.title" | "panel.conversation" | "panels.label", string>;
2125
+ en: Record<"time.now" | "time.minutes" | "time.hours" | "time.days" | "blocker.retry" | "blocker.copy" | "blocker.unknown.title" | "blocker.login.go" | "blocker.login.titleGeneric" | "blocker.login.title" | "blocker.login.manual" | "blocker.login.hint" | "blocker.forbidden.open" | "blocker.forbidden.titleGeneric" | "blocker.forbidden.title" | "blocker.forbidden.hint" | "blocker.timeout.hint" | "blocker.exec.hint" | "blocker.fix.install" | "blocker.fix.update" | "blocker.market.open" | "env.unit.failed" | "env.unit.failedHint" | "env.unit.missingPlugin" | "env.unit.hint" | "env.unit.missingCommands" | "env.unit.missingCommandsHint" | "env.unit.unchecked" | "env.unit.uncheckedHint" | "brand.name" | "toggle.open" | "toggle.collapse" | "project.label" | "workspace.section" | "project.none" | "project.empty" | "project.add" | "project.search.label" | "project.search.placeholder" | "project.search.empty" | "project.rename.row" | "project.rename.current" | "project.rename.title" | "project.rename.description" | "project.rename.field" | "project.rename.placeholder" | "project.rename.hint" | "project.rename.save" | "project.rename.saving" | "project.rename.cancel" | "project.rename.failed" | "session.new" | "session.new.label" | "session.empty" | "session.noProject" | "session.pinned" | "session.actions" | "status.idle" | "status.running" | "status.waitingApproval" | "status.planReview" | "status.waitingAnswer" | "status.completed" | "status.subagentsRunning.one" | "status.subagentsRunning.other" | "panels.title" | "panels.reset" | "panels.enabled" | "panels.disabled" | "panels.choose" | "panels.buildModule" | "panels.failed" | "panels.hintEffect" | "panels.dragHint" | "panels.unknownStep" | "panels.labelWithHint" | "panels.dep.failed" | "panels.dep.missingPlugin" | "panels.dep.missingCommands" | "panels.dep.unchecked" | "panels.tab.modules" | "panels.tab.market" | "panels.browseMarket" | "panels.noneInstalled" | "panels.noneInstalledHint" | "panels.market.installed" | "panels.market.outdated" | "panels.market.hasNew" | "panels.market.missing" | "panels.market.unchecked" | "panels.market.checking" | "panels.market.sectionInstalled" | "panels.market.sectionPending" | "panels.market.sectionShared" | "panels.market.sharedUsedBy" | "panels.market.listSeparator" | "panels.market.sharedMissing" | "panels.market.sharedOutdated" | "panels.market.sharedUnsatisfied" | "panels.market.sharedOk" | "panels.market.versionArrow" | "panels.market.lead" | "panels.market.install" | "panels.market.update" | "panels.market.uninstall" | "panels.market.uninstallLabel" | "panels.market.installing" | "panels.market.updating" | "panels.market.uninstalling" | "panels.market.confirmUninstallTitle" | "panels.market.confirmUninstallDetail" | "panels.market.confirmUninstallAck" | "panels.market.confirmYes" | "panels.market.confirmNo" | "panels.market.failed" | "panels.market.needEnv" | "panels.market.noSource" | "panels.market.badSource" | "panels.market.empty" | "panels.market.sectionLocal" | "panels.market.sectionUnlisted" | "panels.market.sectionPlugins" | "panels.market.moduleOutdated" | "panels.market.moduleRefused" | "panels.market.moduleRefusedDetail" | "panels.market.moduleRestartHint" | "panels.market.pluginKeptInUse" | "panels.market.pluginKeptUnsure" | "panels.market.pluginKeptHeld" | "panels.market.pluginKeptUnnamed" | "panels.market.pluginAlsoKnownAs" | "panels.market.pluginBroken" | "panels.market.restartNeeded" | "panels.market.foot" | "panels.market.recheck" | "panels.market.checkUpdates" | "panels.market.checkedAt" | "panels.market.justNow" | "panels.market.minutesAgo" | "panels.market.hoursAgo" | "panels.market.add.description" | "panels.market.add.specPlaceholder" | "panels.market.add.guideToggle" | "panels.market.add.guideHide" | "panels.market.add.guideIdTitle" | "panels.market.add.guideIdExample" | "panels.market.add.guideIdHint" | "panels.market.add.guideGitTitle" | "panels.market.add.guideGitExample" | "panels.market.add.guideGitHint" | "panels.market.add.guidePathTitle" | "panels.market.add.guidePathExample" | "panels.market.add.guidePathHint" | "panels.market.add.guideExampleLabel" | "panels.market.add.guideFill" | "panels.market.add.guideSafety" | "panels.market.add.registryLegend" | "panels.market.add.registryOfficial" | "panels.market.add.registryMirror" | "panels.market.add.registryWithHost" | "panels.market.add.registryToggle" | "panels.market.add.installVersion" | "panels.market.add.registryDefault" | "panels.market.add.registryCustom" | "panels.market.add.registryCustomPlaceholder" | "panels.market.add.registryCustomHint" | "panels.market.add.registryCustomInvalid" | "panels.market.add.run" | "panels.market.add.edit" | "panels.market.add.changeRegistry" | "panels.market.add.installingTitle" | "panels.market.add.installedTitle" | "panels.market.add.failedTitle" | "panels.market.add.cancelledTitle" | "panels.market.add.failureNetworkHost" | "panels.market.add.problemInvalid" | "panels.market.add.problemInstalled" | "panels.market.add.problemNotFound" | "panels.market.add.problemNotPackage" | "panels.market.add.problemNotBundle" | "panels.market.add.problemNotWorkbenchModule" | "panels.market.add.problemNotModuleOrPlugin" | "panels.market.add.failureNotModuleOrPlugin" | "panels.market.add.installedPlugin" | "panels.market.add.problemNetwork" | "panels.market.add.problemUnknown" | "panels.market.add.failureNetwork" | "panels.market.add.failureNotFound" | "panels.market.add.failureNoMatchingVersion" | "panels.market.add.failureDiskFull" | "panels.market.add.failurePermission" | "panels.market.add.failureBuildBlocked" | "panels.market.add.failureIntegrity" | "panels.market.add.failureTimeout" | "panels.market.add.failurePnpmMissing" | "panels.market.add.failureGeneric" | "panels.market.add.approveTitle" | "panels.market.add.approveCaution" | "panels.market.add.approveRun" | "panels.market.add.restart" | "panels.market.add.tookEffect" | "panels.market.add.details" | "panels.market.add.open" | "panels.market.add.title" | "panels.market.add.intro" | "panels.market.add.specLabel" | "panels.market.add.specHint" | "panels.market.add.exampleTitle" | "panels.market.add.exampleFill" | "panels.market.add.registryLabel" | "panels.market.add.registryProfile" | "panels.market.add.registryPnpm" | "panels.market.add.check" | "panels.market.add.checking" | "panels.market.add.classifying" | "panels.market.add.change" | "panels.market.add.previewTitle" | "panels.market.add.fieldName" | "panels.market.add.fieldVersion" | "panels.market.add.fieldDescription" | "panels.market.add.fieldSource" | "panels.market.add.install" | "panels.market.add.installing" | "panels.market.add.cancel" | "panels.market.add.close" | "panels.market.add.retry" | "panels.market.add.changeSource" | "panels.market.add.approveBuilds" | "panels.market.add.approveHint" | "panels.market.add.doneApplied" | "panels.market.add.doneRestart" | "panels.market.add.cancelled" | "panels.market.add.failed" | "panels.market.add.removed" | "panels.market.add.supplyPending" | "panels.market.add.supplyFailed" | "panels.market.add.notModule" | "panels.market.add.removedRestart" | "panels.market.add.remove" | "panels.market.add.problem.invalidSpec" | "panels.market.add.problem.alreadyInstalled" | "panels.market.add.problem.notFound" | "panels.market.add.problem.notAPackage" | "panels.market.add.problem.notABundle" | "panels.market.add.problem.network" | "panels.market.add.problem.unknown" | "panels.market.add.reason.invalidSpec" | "panels.market.add.reason.incompatible" | "panels.market.add.reason.notBundle" | "panels.market.add.reason.notRemovable" | "panels.market.add.reason.bundleInUse" | "panels.market.add.reason.stopProfile" | "panels.market.add.reason.staleApproval" | "panels.market.add.reason.operationError" | "panels.market.add.reason.buildBlocked" | "panels.market.add.reason.pnpmMissing" | "panels.market.add.reason.noMatchingVersion" | "panels.market.add.reason.diskFull" | "panels.market.add.reason.permission" | "panels.market.add.reason.integrity" | "panels.market.add.reason.timeout" | "panels.market.add.reason.network" | "panels.market.add.reason.notFound" | "panels.market.add.reason.unknown" | "blocker.fix.running" | "blocker.fix.failed" | "blocker.retry.running" | "panels.reading" | "panels.cardBroken" | "panels.cardRetry" | "panels.empty" | "panels.emptyHint" | "env.title" | "env.checking" | "env.installing" | "env.failed" | "env.elapsed" | "env.stepFailed.install" | "env.stepFailed.path" | "env.stepFailed.shell" | "env.bridge.ok" | "env.bridge.short" | "env.bridge.why" | "env.bridge.daemon" | "env.bridge.extension" | "env.bridge.extensionLink" | "env.bridge.profile" | "env.bridge.stale" | "env.bridge.unknown" | "env.fix.title" | "env.fix.why" | "env.fix.whyPath" | "env.fix.whyShell" | "env.fix.step" | "env.fix.stepPath" | "env.fix.stepShell" | "env.fix.permission" | "env.fix.network" | "env.fix.details" | "env.retry" | "env.copyCommand" | "env.copied" | "env.step.opencli" | "env.step.codingPlugin" | "env.step.bridge" | "env.step.warm" | "env.warm.done" | "env.warm.short" | "rightbar.label" | "rightbar.expand" | "rightbar.collapse" | "rightbar.column.label" | "rightbar.column.workbench" | "rightbar.column.dsh" | "rightbar.refresh" | "rightbar.refreshing" | "rightbar.updatedAt" | "rightbar.noProject" | "rightbar.openPlatform" | "coding.notARepo.title" | "error.unknown" | "board.title" | "panel.conversation" | "panels.label", string>;
2141
2126
  };
2142
2127
  mergeMessages(base: apiModule.Dictionaries, contributions: readonly MessagesContribution[]): apiModule.Dictionaries;
2143
2128
  mergeMessagesSkipping(base: apiModule.Dictionaries, contributions: readonly MessagesContribution[]): apiModule.MessagesMerge;
@@ -2208,11 +2193,10 @@ export declare const kit: {
2208
2193
  readonly "panels.market.missing": "\u672A\u88C5";
2209
2194
  readonly "panels.market.unchecked": "\u72B6\u6001\u672A\u77E5";
2210
2195
  readonly "panels.market.checking": "\u68C0\u6D4B\u4E2D";
2211
- readonly "panels.market.sectionInstalled": "\u5DF2\u5B89\u88C5";
2196
+ readonly "panels.market.sectionInstalled": "\u5DF2\u5B89\u88C5\u6A21\u5757";
2212
2197
  readonly "panels.market.sectionPending": "\u672A\u5B89\u88C5";
2213
2198
  readonly "panels.market.sectionShared": "\u5171\u7528\u4F9D\u8D56";
2214
2199
  readonly "panels.market.sharedUsedBy": "\u4F9B {modules} \u4F7F\u7528";
2215
- readonly "panels.market.sharedFoot": "\u8FD9\u4E00\u6BB5\u4E0D\u7ED9\u5378\u8F7D\uFF1A\u5B83\u4EEC\u8DDF\u7740\u6A21\u5757\u6765\uFF0C\u5378\u6389\u4E5F\u4F1A\u88AB\u88C5\u56DE\u6765\u3002\u8981\u505C\u7528\u4E00\u4EFD\uFF0C\u5C31\u53BB\u5173\u6389\u6B63\u5728\u7528\u5B83\u7684\u90A3\u4E9B\u6A21\u5757\u3002";
2216
2200
  readonly "panels.market.listSeparator": "\u3001";
2217
2201
  readonly "panels.market.sharedMissing": "\u672A\u88C5";
2218
2202
  readonly "panels.market.sharedOutdated": "\u6709\u65B0\u7248";
@@ -2237,15 +2221,13 @@ export declare const kit: {
2237
2221
  readonly "panels.market.noSource": "\u8FD9\u4E2A\u6A21\u5757\u6CA1\u58F0\u660E\u600E\u4E48\u88C5\uFF0C\u53EA\u80FD\u81EA\u5DF1\u52A8\u624B";
2238
2222
  readonly "panels.market.badSource": "\u5B89\u88C5\u65B9\u5F0F\u6CA1\u5199\u5168\uFF0C\u53EA\u80FD\u81EA\u5DF1\u52A8\u624B";
2239
2223
  readonly "panels.market.empty": "\u6682\u65E0\u53EF\u7528\u6A21\u5757";
2240
- readonly "panels.market.installedSection": "\u5DF2\u5B89\u88C5";
2241
- readonly "panels.market.sectionLocal": "\u672C\u5730\u88C5\u7684";
2224
+ readonly "panels.market.sectionLocal": "\u672C\u5730\u6A21\u5757";
2242
2225
  readonly "panels.market.sectionUnlisted": "\u4E0D\u662F\u4ECE\u5E02\u573A\u88C5\u7684";
2243
2226
  readonly "panels.market.sectionPlugins": "\u5DF2\u5B89\u88C5 opencli \u63D2\u4EF6";
2244
2227
  readonly "panels.market.moduleOutdated": "\u6709\u65B0\u7248";
2245
2228
  readonly "panels.market.moduleRefused": "\u8FD9\u4E2A\u6A21\u5757\u662F\u7ED9\u65E7\u7248\u672C\u7684\u5DE5\u4F5C\u53F0\u5199\u7684\uFF0C\u73B0\u5728\u7528\u4E0D\u4E86\u3002\u66F4\u65B0\u5B83\uFF0C\u6216\u8005\u5378\u8F7D\u3002";
2246
2229
  readonly "panels.market.moduleRefusedDetail": "\u88C5\u4E0D\u4E0A\u7684\u539F\u56E0\uFF1A{reason}";
2247
2230
  readonly "panels.market.moduleRestartHint": "\u88C5\u597D\u4E86\u4F46\u8FD8\u6CA1\u751F\u6548 \u2014\u2014 \u91CD\u542F\u4E00\u6B21 dsh \u5C31\u4F1A\u51FA\u6765";
2248
- readonly "panels.market.pluginLocalNoUpdate": "\u672C\u5730\u88C5\u7684\uFF0C\u6CA1\u5730\u65B9\u67E5\u65B0\u7248\uFF0C\u6240\u4EE5\u53EA\u7ED9\u5378\u8F7D";
2249
2231
  readonly "panels.market.pluginKeptInUse": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A{names} \u8FD8\u8981\u7528\u5B83\u3002";
2250
2232
  readonly "panels.market.pluginKeptUnsure": "\u6587\u4EF6\u5148\u7559\u7740\uFF1A\u8FD9\u53F0\u673A\u5668\u4E0A\u8FD8\u6709\u6A21\u5757\u770B\u4E0D\u51FA\u7528\u4E86\u4EC0\u4E48\uFF0C\u8BF4\u4E0D\u51C6\u8C01\u5728\u7528\u5B83\u3002";
2251
2233
  readonly "panels.market.pluginKeptHeld": "\u6587\u4EF6\u7559\u7740\uFF1A\u4F60\u81EA\u5DF1\u88C5\u7684\u90A3\u4E00\u4EFD\uFF0C\u6A21\u5757\u653E\u624B\u4E0D\u52A8\u5B83\u3002";
@@ -6,6 +6,7 @@ export interface MarketFreshness {
6
6
  readonly checking: boolean;
7
7
  readonly checkedAt: number | null;
8
8
  }
9
+ export declare function marketSettled(freshness: MarketFreshness, installedRead: boolean | undefined): boolean;
9
10
  export declare function shouldProbeOnEnter(input: {
10
11
  readonly checkedAt: number | null;
11
12
  readonly now: number;
@@ -17,7 +17,7 @@ export interface MarketMockExpect {
17
17
  readonly plugins?: number;
18
18
  readonly pluginActions?: readonly MarketRowAction[];
19
19
  readonly pluginNote?: boolean;
20
- readonly pluginNoteKey?: 'panels.market.pluginLocalNoUpdate' | 'panels.market.pluginAlsoKnownAs' | 'panels.market.pluginBroken';
20
+ readonly pluginNoteKey?: 'panels.market.pluginAlsoKnownAs' | 'panels.market.pluginBroken';
21
21
  readonly notice?: boolean;
22
22
  }
23
23
  export interface MarketMock {
@@ -6,7 +6,7 @@ export type MarketState = 'checking' | 'installed' | 'outdated' | 'missing' | 'u
6
6
  export declare const MARKET_STATE_KEY: Readonly<Record<MarketState, string>>;
7
7
  export declare const MARKET_DOT: Readonly<Record<MarketState, 'ongoing' | 'done' | 'warning' | 'idle'>>;
8
8
  export interface MarketNote {
9
- readonly key: 'panels.market.needEnv' | 'panels.market.noSource' | 'panels.market.badSource' | 'panels.market.moduleRefused' | 'panels.market.moduleRestartHint' | 'panels.market.pluginLocalNoUpdate' | 'panels.market.pluginAlsoKnownAs' | 'panels.market.pluginBroken';
9
+ readonly key: 'panels.market.needEnv' | 'panels.market.noSource' | 'panels.market.badSource' | 'panels.market.moduleRefused' | 'panels.market.moduleRestartHint' | 'panels.market.pluginAlsoKnownAs' | 'panels.market.pluginBroken';
10
10
  readonly params: Readonly<Record<string, string>>;
11
11
  }
12
12
  export type MarketHintKey = 'panels.market.moduleRestartHint';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dsh-workbench/core",
3
- "version": "0.1.17",
3
+ "version": "0.1.18",
4
4
  "description": "个人工作台:Agent 工作台外壳(左栏 + 常驻对话 + 自研右侧数据面板)。",
5
5
  "type": "module",
6
6
  "icon": "./icon.svg",
@@ -87,7 +87,7 @@
87
87
  "access": "public"
88
88
  },
89
89
  "dependencies": {
90
- "@dsh-workbench/shared": "0.1.17"
90
+ "@dsh-workbench/shared": "0.1.18"
91
91
  },
92
92
  "scripts": {
93
93
  "build": "node scripts/build.mjs && node scripts/build-types.mjs",
@@ -5,13 +5,13 @@
5
5
 
6
6
  | 判据 | 它防的事故 | 红了的典型说法 | 怎么修 |
7
7
  |---|---|---|---|
8
- | `contracts` | dsh 组合阶段**不校验**你 `package.json` 里的声明 —— 错的 `external` 要到浏览器 `require` 那一刻才炸;清单与代码、底稿与清单之间漂了也没人拦 | `单元 id "x" 与 … 撞了` / `dsh.workbenchFaces.client 指的文件不存在` / `dsh.workbenchFaces.host 没声明` / `没有对 @dsh-workbench/core 的 peer 依赖` / `没有 typecheck 脚本` / `它不是 private,却既没声明 publishConfig.access=public…` / `dsh.workbench 声明的能力与代码真正注册的对不上` / `design.json 的能力行里有「x」,清单的 tools[] 里却没有它` | 按报的那一条改 `package.json`;`unit` 换个不撞的名字;`dsh.workbenchFaces` 补上两个**源码**入口;四个脚本补全;私有不发就保持 `private: true`。**工具只声明在清单里**(`dsh.workbench.tools`)且必须与 `mount()` 里 `registerTools()` 真正注册的**不重不漏**;写了 `design.json` 的话,它的 `capabilities[].name` 与清单的 `tools[].name` 也要不重不漏(U1c 的**键集合对账**,只对名字 —— 内容各写一处);`gate.deniedTools` 是可选的运行期收窄,门禁不再对它做声明对账(协议里的 `scope` 已删 —— 哪些工作区出现由用户的板决定) |
8
+ | `contracts` | dsh 组合阶段**不校验**你 `package.json` 里的声明 —— 错的 `external` 要到浏览器 `require` 那一刻才炸;清单与代码、底稿与清单之间漂了也没人拦 | `单元 id "x" 与 … 撞了` / `dsh.workbenchFaces.client 指的文件不存在` / `dsh.workbenchFaces.host 没声明` / `没有对 @dsh-workbench/core 的 peer 依赖` / `没有 typecheck 脚本` / `它不是 private,却既没声明 publishConfig.access=public…` / `src/declared-tools.ts 与清单对不上(生成物过期…)` / `工具名的字面量又写回了源码` / `…没有 key` / `dsh.workbench 声明的能力与代码真正注册的对不上` / `design.json 的能力行里有「x」,清单的 tools[] 里却没有它` | 按报的那一条改 `package.json`(生成物对不上就跑 `dsh-wb-module sync`;工具名的字面量只许留在清单里);`unit` 换个不撞的名字;`dsh.workbenchFaces` 补上两个**源码**入口;四个脚本补全;私有不发就保持 `private: true`。**工具只声明在清单里**(`dsh.workbench.tools`)且必须与 `mount()` 里 `registerTools()` 真正注册的**不重不漏**;写了 `design.json` 的话,它的 `capabilities[].name` 与清单的 `tools[].name` 也要不重不漏(U1c 的**键集合对账**,只对名字 —— 内容各写一处);`gate.deniedTools` 是可选的运行期收窄,门禁不再对它做声明对账(协议里的 `scope` 已删 —— 哪些工作区出现由用户的板决定) |
9
9
  | `protocol` | `dsh.workbench` 是外壳读你得懂的那份声明:缺版本、形状不对、**多一个键**、枚举值不认都要在装机前拦下来。多出来的键最阴 —— 外壳会**静默忽略**它(拼错一个键 = 那句话白写) | `没有 apiVersion` / `apiVersion 是 99,这份只认 1` / `声明了 apiVersion 就要把静态半写全 —— 缺 dsh.workbench.tools` / `dsh.workbench 里有协议 v1 不认识的键 "faces"` / `card 里有不认的键 "enabledByDefault"`(这个键连外壳里都没有了 —— A-3 删的,见 [ADR-0038](../../../../docs/adr/0038-module-declaration-protocol.md) §6.7) / `tools[0] 里有协议不认的键 "scopes"` / `tools[0] 里有不认的键 "scope"`(`scope` 自本轮更正起**不在协议里**:能力在哪些工作区出现由用户的板决定,见 [ADR-0038 §2.4 / §6.16](../../../../docs/adr/0038-module-declaration-protocol.md)) | 补 `"apiVersion": 1`;把 `unit` / `card` / `tools` / `host` 四个键写全(没卡片写 `"card": null`、没工具写 `"tools": []`、一个服务都不要写 `"host": { "inject": [] }`);删掉协议外的键(`faces` 自 A-2 起搬到 `dsh.workbenchFaces`,写回 `dsh.workbench` 里就是生字段);`scope` **不要写**(协议不认它,写了就是生字段)。字段清单见 `dsh-wb-module` 的 README「协议」那一节 |
10
10
  | `bundles` | 两个运行时互串:浏览器产物里带 node 内置、宿主产物里带 DOM / react | `浏览器产物里出现了 node 内置 …` / `宿主产物里出现了 react` | 宿主面别 import 浏览器侧的东西;浏览器面别 import `node:*`。两侧只通过服务名相接 |
11
11
  | `source` | 非种子词的 `@deepseek-ai/*`、宿主侧碰 dsh 的浏览器包、`@/` 指到工作台源码 | `…在宿主侧可达` / `不是平台种子词` | 宿主侧只用 Node 侧的东西;dsh 原语一律走 `kit`;`@/` 只指自己的 `src/` |
12
12
  | `primitives` | 声明了 `external` 却没有产物物证 ⇒ dsh 原语被**内联**成第二份实例 | `…用了却没声明 external` / `宿主产物里出现了` | 在 `dsh.client.external` 里显式声明它;确认产物里是 `require(...)` 而不是被打包进来 |
13
13
  | `kit` | 用了 peer 下限那份外壳**还没有**的 kit 成员 ⇒ 卡片首帧 `Element type is invalid`,整块面板被 React 卸掉 | `kit.components.X 在这份外壳里没有` / `peer 下限比 devDependency 还旧` | 只用 peer 范围里真有的成员;把 `peerDependencies` 的下限提到你实际用的那档 |
14
- | `cards` | 卡片拿**空数据**就抛 ⇒ 用户看到"卡片一直不出来 / 点一下白屏" | `空数据下卡片抛了` / `卡片只画出一个节点` / `卡片没套外壳的卡壳` | 让卡片在没数据时也画得出来(已有的加载 / 空 / 阻断态);外面套 `kit.components.Card` |
14
+ | `cards` | 卡片拿**空数据**就抛 ⇒ 用户看到"卡片一直不出来 / 点一下白屏" | `空数据下卡片抛了` / `卡片只画出一个节点` / `卡片没套外壳的卡壳` / `清单的 card.titleKey「x」在模块字典的 en 里没有` / `…没有落点` | 让卡片在没数据时也画得出来(已有的加载 / 空 / 阻断态);外面套 `kit.components.Card`;清单写了 `titleKey`,`registerUnit` 交的 `messages` 里 `zh` / `en` 都得有那一条(漏了面板上显示的是原始键名) |
15
15
  | `standalone` | "只有工作台源码在场才编得过" ⇒ 发布出去就散架 | `build 在外壳源码不在场时失败` / `typecheck 在外壳源码不在场时失败` | 别引用工作台源码;`tsconfig` 里 `paths` 的值必须是**相对路径**(`"./src/*"`,不是 `"src/*"`) |
16
16
  | `markers` | 内网域名 / 企业内部名泄进要公开发布的包 | `命中内网 npm 源` / `命中内网域名` | 那些值不该写进包里;要配就落到模块自己的配置面,或走用户自己声明的来源 |
17
17
  | `alias` | `@/` 伸进工作台源码 ⇒ 装的人手上没有那份源码 | `…指向外壳源码` | `@/` 只许指自己的 `src/`;跨包的东西走包名 |
@@ -79,7 +79,7 @@
79
79
  ### 6.1 写法(清单 + 两个函数;缺一个门禁就红)
80
80
 
81
81
  ```ts
82
- tools: [{ name: 'workbench_demo_rebuild', writes: true }],
82
+ tools: [{ name: 'workbench_demo_rebuild', writes: true, key: 'rebuild' }],
83
83
 
84
84
  needsApproval: (call) => ({
85
85
  kind: 'ask',
@@ -91,6 +91,9 @@ needsApproval: (call) => ({
91
91
  approvalDetail: async (call) => ({ zh: '会覆盖这 3 个模块的产物,不碰源码', en: '…' }),
92
92
  ```
93
93
 
94
+ * `key` 是代码里那个短名(lowerCamelCase)。给了它就 `dsh-wb-module sync` 一次,生成
95
+ `src/declared-tools.ts`,代码写 `DECLARED_TOOLS.rebuild.name` —— 工具名的字面量只剩清单这一处
96
+ (键写错是编译错;生成物过期、半写 key、源码里又写字面量,门禁都红)。一个 key 都不写也行(不适用那一档)。
94
97
  * `needsApproval` 回 `{ kind: 'read' }` = 这件不用问;回 `{ kind: 'ask', … }` = 要问;
95
98
  **清单写着 `writes: true` 却不认领,外壳当场 deny**("在套件的 needsApproval 里补一条审批")——
96
99
  但那条错误只有真跑一次才看得见,所以 `check --only contracts` 会替用户先看一遍:缺 `needsApproval`、