dsh-plugin 1.2.1 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/README.en.md +20 -15
  2. package/README.md +21 -16
  3. package/client/client.js +716 -445
  4. package/client/client.js.map +1 -1
  5. package/cordis.patch.yml +1 -1
  6. package/lib/http/routes.js +47 -3
  7. package/lib/index.js +1 -1
  8. package/lib/services/install/install-types.js +1 -1
  9. package/lib/services/install/npm-check.js +1 -1
  10. package/lib/services/install/npm-resolve.js +1 -1
  11. package/lib/services/install/preflight.js +1 -1
  12. package/lib/services/install/task-queue.js +1 -1
  13. package/lib/services/loader.js +1 -1
  14. package/lib/services/log.js +1 -1
  15. package/lib/services/probe.js +1 -1
  16. package/lib/services/profile/installed-versions.js +1 -1
  17. package/lib/services/profile/profile.js +6 -5
  18. package/lib/services/profile/progress.js +1 -1
  19. package/lib/services/settings.js +1 -1
  20. package/lib/types/index.d.ts +1 -1
  21. package/lib/types/services/install/install-types.d.ts +1 -1
  22. package/lib/types/services/install/install.d.ts +1 -1
  23. package/lib/types/services/profile/pending-restart.d.ts +1 -1
  24. package/lib/types/services/profile/progress.d.ts +1 -1
  25. package/package.json +2 -2
  26. package/src/client/components/PluginHubSection.tsx +98 -17
  27. package/src/client/components/catalog/CatalogList.tsx +1 -1
  28. package/src/client/components/catalog/PluginCard.tsx +1 -1
  29. package/src/client/components/layout/CatalogControls.tsx +1 -1
  30. package/src/client/components/layout/CatalogHeader.tsx +2 -2
  31. package/src/client/components/layout/CategoryTabs.tsx +1 -1
  32. package/src/client/components/layout/SectionTabs.tsx +1 -1
  33. package/src/client/components/modals/AboutModal.tsx +2 -2
  34. package/src/client/components/modals/HubUpdateModal.tsx +1 -1
  35. package/src/client/components/modals/InstalledDetailModal.tsx +1 -1
  36. package/src/client/components/modals/LogsModal.tsx +1 -1
  37. package/src/client/components/modals/LogsPathModal.tsx +1 -1
  38. package/src/client/components/modals/NotificationsModal.tsx +31 -14
  39. package/src/client/components/modals/ProgressView.tsx +1 -1
  40. package/src/client/components/modals/modals.tsx +1 -1
  41. package/src/client/components/ui/Dropdown.tsx +1 -1
  42. package/src/client/components/ui/Toggle.tsx +1 -1
  43. package/src/client/components/ui/icons.tsx +22 -1
  44. package/src/client/components/views/CustomInstallView.tsx +133 -44
  45. package/src/client/components/views/DiagnosticsView.tsx +2 -2
  46. package/src/client/components/views/InstalledView.tsx +1 -1
  47. package/src/client/components/views/LogsView.tsx +1 -1
  48. package/src/client/components/views/MarketView.tsx +1 -1
  49. package/src/client/components/views/SettingsView.tsx +1 -1
  50. package/src/client/data/catalog.ts +1 -1
  51. package/src/client/data/host.ts +1 -1
  52. package/src/client/data/hub.ts +12 -3
  53. package/src/client/hooks/useCatalog.ts +19 -6
  54. package/src/client/hooks/useIncrementalList.ts +1 -1
  55. package/src/client/hooks/useLanguage.ts +1 -1
  56. package/src/client/hooks/useSettings.ts +1 -1
  57. package/src/client/hooks/useTaskQueue.ts +1 -1
  58. package/src/client/index.tsx +1 -1
  59. package/src/client/locales.ts +50 -30
  60. package/src/client/logic/constants.ts +2 -2
  61. package/src/client/logic/failures.ts +48 -2
  62. package/src/client/logic/format.ts +1 -1
  63. package/src/client/logic/install-command.ts +1 -1
  64. package/src/client/logic/installed.ts +41 -2
  65. package/src/client/logic/normalize.ts +1 -1
  66. package/src/client/logic/renderMarkdown.ts +1 -1
  67. package/src/client/logic/urls.ts +2 -2
  68. package/src/client/styles/CustomInstallView.module.css +59 -1
  69. package/src/client/styles/DiagnosticsView.module.css +1 -1
  70. package/src/client/styles/Dropdown.module.css +1 -1
  71. package/src/client/styles/Header.module.css +1 -1
  72. package/src/client/styles/InstalledView.module.css +19 -6
  73. package/src/client/styles/List.module.css +11 -1
  74. package/src/client/styles/LogsView.module.css +1 -1
  75. package/src/client/styles/Modal.module.css +32 -1
  76. package/src/client/styles/SectionTabs.module.css +1 -1
  77. package/src/client/styles/SettingsView.module.css +1 -1
  78. package/src/client/styles/Toggle.module.css +1 -1
  79. package/src/client/styles/tokens.module.css +32 -5
  80. package/src/client/types.ts +1 -1
  81. package/src/server/http/routes.ts +54 -3
  82. package/src/server/index.ts +1 -1
  83. package/src/server/services/install/install-types.ts +1 -1
  84. package/src/server/services/install/install.ts +1 -1
  85. package/src/server/services/install/npm-check.ts +1 -1
  86. package/src/server/services/install/npm-resolve.ts +1 -1
  87. package/src/server/services/install/preflight.ts +1 -1
  88. package/src/server/services/install/task-queue.ts +1 -1
  89. package/src/server/services/loader.ts +1 -1
  90. package/src/server/services/log.ts +1 -1
  91. package/src/server/services/probe.ts +1 -1
  92. package/src/server/services/profile/installed-versions.ts +1 -1
  93. package/src/server/services/profile/pending-restart.ts +1 -1
  94. package/src/server/services/profile/profile.ts +6 -5
  95. package/src/server/services/profile/progress.ts +1 -1
  96. package/src/server/services/settings.ts +1 -1
package/client/client.js CHANGED
@@ -7,18 +7,18 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
7
7
  let react = require("react");
8
8
  //#region src/client/locales.ts
9
9
  /**
10
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
10
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
11
11
  * Website: https://dsh-plugin.org
12
12
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
13
13
  *
14
- * zh/en dictionaries for the DSH-Plugin Hub settings section.
14
+ * zh/en dictionaries for the DSH Plugin Hub settings section.
15
15
  */
16
16
  const zh = {
17
17
  nav: "插件中心",
18
- title: "DSH-Plugin Hub",
19
- tagline: "DSH-Plugin 插件中心:面向 DeepSeek Harness 插件收录平台,人工审验、来源可溯,免费安装",
18
+ title: "DSH Plugin Hub",
19
+ tagline: "DSH Plugin 插件中心:面向 DeepSeek Harness 插件收录平台,人工审验、来源可溯,免费安装",
20
20
  adBadge: "推荐",
21
- ad: "DSH-Plugin 插件中心:收录 {total} 款插件,{verified} 款人工精选验证,每日更新",
21
+ ad: "DSH Plugin 插件中心:收录 {total} 款插件,{verified} 款人工精选验证,每日更新",
22
22
  search: "搜索插件名称、描述、标签…",
23
23
  all: "全部",
24
24
  sortStars: "Star",
@@ -48,23 +48,29 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
48
48
  viewSettingsHint: "网络通道与偏好设置",
49
49
  installedEmpty: "还没有安装插件",
50
50
  installedEmptyDesc: "可以去「自定义安装」,手动安装 NPM 包或 GitHub 源码",
51
- npmInstallLabel: "NPM 包",
52
- npmInstallPlaceholder: "输入 npm 包名",
53
- npmInstallExample: "例如:lodash、@scope/pkg",
54
- npmInstallInvalid: "请输入 npm 包名,例如:lodash、@scope/pkg",
51
+ npmInstallLabel: "NPM 包 / 命令",
52
+ npmInstallPlaceholder: "npm install <包名> 或直接输包名",
53
+ npmInstallExample: "支持原生命令:npm install lodash、npm i lodash、pnpm add @scope/pkg",
54
+ npmInstallExample2: "全局安装 CLI:npm install -g @scope/cli;或直接输入包名 lodash",
55
+ npmInstallInvalid: "请输入 npm 包名(如 lodash、@scope/pkg),或原生安装命令(如 npm install lodash、npm i lodash、pnpm add @scope/pkg、npm install -g @scope/cli)",
55
56
  gitInstallLabel: "GitHub 源码",
56
57
  gitInstallPlaceholder: "输入仓库地址",
57
58
  gitInstallExample: "例如:owner/repo 或 https://github.com/owner/repo",
58
59
  gitInstallInvalid: "请输入 GitHub 仓库地址,例如:owner/repo 或 https://github.com/owner/repo",
59
60
  dshCmdLabel: "DeepSeek Harness 命令",
60
- dshCmdPlaceholder: "粘贴安装命令(npm install -g 或 dsh plugin add)",
61
- dshCmdExample: "例如:npm install -g @scope/cli 或 dsh plugin add github:owner/repo",
62
- dshCmdInvalid: "支持 npm install -g <包名> 全局安装,或完整 dsh plugin 命令。例如:npm install -g @scope/cli",
61
+ dshCmdPlaceholder: "粘贴官方 dsh plugin 命令",
62
+ dshCmdExample: "例如:dsh plugin --profile web add github:owner/repo",
63
+ dshCmdInvalid: "请输入官方 dsh plugin 安装命令(--profile 必填)。例如:dsh plugin --profile web add github:owner/repo",
64
+ installHelp: "帮助",
65
+ helpModalTitle: "支持的命令格式",
66
+ npmInstallHelp: "lodash、@scope/pkg 直接输入包名\nnpm install lodash\nnpm i lodash\npnpm add @scope/pkg\npnpm i @scope/pkg\nnpm install -g @scope/cli 全局安装 CLI 工具,不进「已安装」列表",
67
+ gitInstallHelp: "owner/repo\nhttps://github.com/owner/repo\ngithub:owner/repo\ngit+https://github.com/owner/repo.git\ngit@github.com:owner/repo.git",
68
+ dshCmdHelp: "dsh plugin --profile web add <目标>\ndsh plugin --profile=web add <目标>\n --profile 必填,官方 CLI 无 -p 简写;<目标> 可为 npm 包名或 github:owner/repo",
63
69
  globalNpmHint: "将全局安装 CLI 工具(npm install -g),不会出现在「已安装」列表,无需重启宿主",
64
70
  installCliBtn: "安装",
65
71
  channelDisabledHint: "该安装通道已关闭,请在「设置 → 安全信任」中打开开关",
66
72
  goToSettings: "前往设置",
67
- customViewDesc: "手动安装目录外的 NPM 包、GitHub 源码,或粘贴官方安装命令(npm install -g / dsh plugin add)。装完的条目会出现在「已安装」列表,并标记为自定义安装。",
73
+ customViewDesc: "手动安装目录外的 NPM 包、GitHub 源码,或粘贴官方 dsh plugin 命令。装完的条目会出现在「已安装」列表,并标记为自定义安装。",
68
74
  customLabel: "自定义安装",
69
75
  installedSearch: "搜索已安装的插件…",
70
76
  installedFilterCatalog: "目录插件",
@@ -189,6 +195,10 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
189
195
  updatesFound: "发现 {n} 个插件可更新,已加入通知中心",
190
196
  updateNoticeTitle: "发现新版本",
191
197
  updateNoticeGo: "去更新",
198
+ ignoreUpdateRun: "忽略本次更新",
199
+ ignoreUpdateConfirmTitle: "忽略本次更新?",
200
+ ignoreUpdateConfirmDetail: "忽略后本次版本不再提醒;待插件发布下一个新版本时,会再次通知你。",
201
+ ignoreUpdateConfirm: "确认忽略",
192
202
  uninstall: "卸载",
193
203
  uninstalling: "卸载中…",
194
204
  uninstallTitle: "确认卸载?",
@@ -274,8 +284,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
274
284
  update: "可更新",
275
285
  updateAvailable: "有更新",
276
286
  updateAvailableHint: "检测到更新:有版本号的仓库比对版本号,无版本号的仓库比对仓库最近更新时间",
277
- hubUpdateHint: "检测到 DSH-Plugin Hub 新版本,点击查看更新内容并更新",
278
- hubUpdateTitle: "DSH-Plugin Hub 有新版本",
287
+ hubUpdateHint: "检测到 DSH Plugin Hub 新版本,点击查看更新内容并更新",
288
+ hubUpdateTitle: "DSH Plugin Hub 有新版本",
279
289
  hubUpdateDesc: "v{version} 已发布,点击下方按钮即可更新,完成后需重启宿主生效。",
280
290
  hubUpdatePublished: "发布于",
281
291
  hubUpdateNotes: "更新记录",
@@ -286,7 +296,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
286
296
  hubUpToDate: "已是最新版本",
287
297
  followUs: "关注我们",
288
298
  aboutTitle: "关注我们",
289
- aboutDesc: "了解 DSH-Plugin Hub 是做什么的,加入用户反馈群随时交流。",
299
+ aboutDesc: "了解 DSH Plugin Hub 是做什么的,加入用户反馈群随时交流。",
290
300
  aboutEmpty: "内容暂未发布,敬请期待。",
291
301
  aboutUpdated: "更新于",
292
302
  empty: "该分类暂无插件",
@@ -294,10 +304,10 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
294
304
  };
295
305
  const en = {
296
306
  nav: "Plugin Hub",
297
- title: "DSH-Plugin Hub",
298
- tagline: "DSH-Plugin Hub: a human-verified, free marketplace for DeepSeek Harness plugins",
307
+ title: "DSH Plugin Hub",
308
+ tagline: "DSH Plugin Hub: a human-verified, free marketplace for DeepSeek Harness plugins",
299
309
  adBadge: "Featured",
300
- ad: "DSH-Plugin Hub: {total} plugins indexed, {verified} human-verified, updated daily",
310
+ ad: "DSH Plugin Hub: {total} plugins indexed, {verified} human-verified, updated daily",
301
311
  search: "Search plugins by name, description, tags…",
302
312
  all: "All",
303
313
  sortStars: "Stars",
@@ -328,23 +338,29 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
328
338
  viewSettingsHint: "Network sources and preferences",
329
339
  installedEmpty: "No plugins installed yet",
330
340
  installedEmptyDesc: "Go to Custom to add an npm package or GitHub source manually",
331
- npmInstallLabel: "npm package",
332
- npmInstallPlaceholder: "npm package name",
333
- npmInstallExample: "e.g. lodash or @scope/pkg",
334
- npmInstallInvalid: "Enter an npm package name, e.g. lodash or @scope/pkg",
341
+ npmInstallLabel: "npm package / command",
342
+ npmInstallPlaceholder: "npm install <pkg> or a bare package name",
343
+ npmInstallExample: "Native commands: npm install lodash, npm i lodash, pnpm add @scope/pkg",
344
+ npmInstallExample2: "Global CLI: npm install -g @scope/cli; or just type a package name like lodash",
345
+ npmInstallInvalid: "Enter an npm package name (e.g. lodash, @scope/pkg), or a native install command (e.g. npm install lodash, npm i lodash, pnpm add @scope/pkg, npm install -g @scope/cli)",
335
346
  gitInstallLabel: "GitHub source",
336
347
  gitInstallPlaceholder: "Repository address",
337
348
  gitInstallExample: "e.g. owner/repo or https://github.com/owner/repo",
338
349
  gitInstallInvalid: "Enter a GitHub repository address, e.g. owner/repo or https://github.com/owner/repo",
339
350
  dshCmdLabel: "DeepSeek Harness command",
340
- dshCmdPlaceholder: "Paste an install command (npm install -g or dsh plugin add)",
341
- dshCmdExample: "e.g. npm install -g @scope/cli or dsh plugin add github:owner/repo",
342
- dshCmdInvalid: "Paste a global npm install (npm install -g <pkgs>) or a full dsh plugin command, e.g. npm install -g @scope/cli",
351
+ dshCmdPlaceholder: "Paste an official dsh plugin command",
352
+ dshCmdExample: "e.g. dsh plugin --profile web add github:owner/repo",
353
+ dshCmdInvalid: "Paste an official dsh plugin install command (--profile required), e.g. dsh plugin --profile web add github:owner/repo",
354
+ installHelp: "Help",
355
+ helpModalTitle: "Supported command formats",
356
+ npmInstallHelp: "lodash or @scope/pkg just type the package name\nnpm install lodash\nnpm i lodash\npnpm add @scope/pkg\npnpm i @scope/pkg\nnpm install -g @scope/cli installs the CLI globally, not shown in Installed",
357
+ gitInstallHelp: "owner/repo\nhttps://github.com/owner/repo\ngithub:owner/repo\ngit+https://github.com/owner/repo.git\ngit@github.com:owner/repo.git",
358
+ dshCmdHelp: "dsh plugin --profile web add <target>\ndsh plugin --profile=web add <target>\n --profile is required and there is no -p shorthand; <target> can be an npm package or github:owner/repo",
343
359
  globalNpmHint: "This installs CLI tools globally (npm install -g). They won't appear in Installed and no host restart is needed.",
344
360
  installCliBtn: "Install",
345
361
  channelDisabledHint: "This install channel is disabled — enable it in Settings → Security & Trust",
346
362
  goToSettings: "Go to Settings",
347
- customViewDesc: "Manually install an npm package, a GitHub source, or paste an official install command (npm install -g / dsh plugin add). Finished installs appear in Installed, marked as custom.",
363
+ customViewDesc: "Manually install an npm package, a GitHub source, or paste an official dsh plugin command. Finished installs appear in Installed, marked as custom.",
348
364
  customLabel: "Custom install",
349
365
  installedSearch: "Search installed plugins…",
350
366
  installedFilterCatalog: "Catalog",
@@ -471,6 +487,10 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
471
487
  updatesFound: "{n} plugin(s) have updates — check the notification center",
472
488
  updateNoticeTitle: "Update available",
473
489
  updateNoticeGo: "Update",
490
+ ignoreUpdateRun: "Ignore this update",
491
+ ignoreUpdateConfirmTitle: "Ignore this update?",
492
+ ignoreUpdateConfirmDetail: "This version will no longer notify you. You will be alerted again when the next version is released.",
493
+ ignoreUpdateConfirm: "Ignore",
474
494
  uninstall: "Uninstall",
475
495
  uninstalling: "Removing…",
476
496
  uninstallTitle: "Confirm uninstall?",
@@ -557,8 +577,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
557
577
  update: "Update",
558
578
  updateAvailable: "Update available",
559
579
  updateAvailableHint: "An update was detected: repos with a release are compared by tag, repos without one by last push time",
560
- hubUpdateHint: "A new DSH-Plugin Hub version is available — click to view the changelog and update",
561
- hubUpdateTitle: "A new DSH-Plugin Hub version is available",
580
+ hubUpdateHint: "A new DSH Plugin Hub version is available — click to view the changelog and update",
581
+ hubUpdateTitle: "A new DSH Plugin Hub version is available",
562
582
  hubUpdateDesc: "v{version} has been released — click below to update, then restart the host to apply it.",
563
583
  hubUpdatePublished: "Published",
564
584
  hubUpdateNotes: "What's new",
@@ -569,7 +589,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
569
589
  hubUpToDate: "Up to date",
570
590
  followUs: "Follow us",
571
591
  aboutTitle: "Follow us",
572
- aboutDesc: "Learn what DSH-Plugin Hub does and join our user feedback group.",
592
+ aboutDesc: "Learn what DSH Plugin Hub does and join our user feedback group.",
573
593
  aboutEmpty: "Content not published yet — stay tuned.",
574
594
  aboutUpdated: "Updated",
575
595
  empty: "No plugins in this category yet",
@@ -587,42 +607,178 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
587
607
  document.head.appendChild(tag);
588
608
  }
589
609
  var Header_module_css_default = {
590
- "searchRow": "qikqja_searchRow",
591
- "taglineLink": "qikqja_taglineLink",
592
- "tabCount": "qikqja_tabCount",
593
- "sortGroup": "qikqja_sortGroup",
594
- "tab": "qikqja_tab",
595
- "segBtn": "qikqja_segBtn",
596
- "versionBtn": "qikqja_versionBtn",
597
- "resultSeg": "qikqja_resultSeg",
598
- "headerTitleRow": "qikqja_headerTitleRow",
610
+ "root": "qikqja_root",
599
611
  "header": "qikqja_header",
600
- "tabs": "qikqja_tabs",
601
- "resultCount": "qikqja_resultCount",
602
- "tabActive": "qikqja_tabActive",
603
612
  "adBanner": "qikqja_adBanner",
613
+ "headerTitleRow": "qikqja_headerTitleRow",
614
+ "tabs": "qikqja_tabs",
615
+ "tab": "qikqja_tab",
604
616
  "copyIcon": "qikqja_copyIcon",
605
- "controls": "qikqja_controls",
606
- "githubIcon": "qikqja_githubIcon",
617
+ "search": "qikqja_search",
618
+ "tabCount": "qikqja_tabCount",
619
+ "segBtnActive": "qikqja_segBtnActive",
607
620
  "hubUpdateBadge": "qikqja_hubUpdateBadge",
608
- "tagline": "qikqja_tagline",
609
- "adBadge": "qikqja_adBadge",
621
+ "segGroup": "qikqja_segGroup",
622
+ "resultSeg": "qikqja_resultSeg",
610
623
  "adText": "qikqja_adText",
611
- "search": "qikqja_search",
612
- "root": "qikqja_root",
613
- "tabsRow": "qikqja_tabsRow",
614
- "langBtn": "qikqja_langBtn",
615
- "logoIcon": "qikqja_logoIcon",
624
+ "resultCount": "qikqja_resultCount",
625
+ "tagline": "qikqja_tagline",
626
+ "segBtn": "qikqja_segBtn",
616
627
  "headerRight": "qikqja_headerRight",
617
- "title": "qikqja_title",
618
- "segLabel": "qikqja_segLabel",
619
- "version": "qikqja_version",
628
+ "logoIcon": "qikqja_logoIcon",
629
+ "githubIcon": "qikqja_githubIcon",
620
630
  "aboutBtn": "qikqja_aboutBtn",
621
- "segGroup": "qikqja_segGroup",
631
+ "versionBtn": "qikqja_versionBtn",
632
+ "taglineLink": "qikqja_taglineLink",
633
+ "adArrow": "qikqja_adArrow",
634
+ "adBadge": "qikqja_adBadge",
635
+ "langBtn": "qikqja_langBtn",
636
+ "searchRow": "qikqja_searchRow",
637
+ "tabsRow": "qikqja_tabsRow",
638
+ "controls": "qikqja_controls",
622
639
  "githubLink": "qikqja_githubLink",
640
+ "version": "qikqja_version",
641
+ "tabActive": "qikqja_tabActive",
642
+ "title": "qikqja_title",
623
643
  "brandTitle": "qikqja_brandTitle",
624
- "adArrow": "qikqja_adArrow",
625
- "segBtnActive": "qikqja_segBtnActive"
644
+ "sortGroup": "qikqja_sortGroup",
645
+ "segLabel": "qikqja_segLabel"
646
+ };
647
+ //#endregion
648
+ //#region \0dsh-css:src/client/styles/Modal.module.css.mjs
649
+ const css$10 = ".BiQ1zG_overlay{z-index:998;-webkit-user-select:none;user-select:none;background:#00000061;justify-content:center;align-items:center;animation:.16s ease-out BiQ1zG_overlayIn;display:flex;position:fixed;top:0;bottom:0;left:0;right:0}.BiQ1zG_modal,.BiQ1zG_errorModal{background:var(--hub-bg-1);border:1px solid var(--hub-border-2);border-radius:10px;flex-direction:column;gap:10px;width:420px;max-width:calc(100vw - 32px);max-height:calc(100vh - 64px);padding:14px 16px;animation:.18s ease-out BiQ1zG_modalIn;display:flex;box-shadow:0 12px 40px #0000003d}.BiQ1zG_errorModal{width:640px;max-width:calc(100vw - 48px)}.BiQ1zG_modalWide{width:560px;max-width:calc(100vw - 48px)}.BiQ1zG_helpModal{width:720px;max-width:calc(100vw - 48px)}.BiQ1zG_logModal{width:780px;max-width:calc(100vw - 48px);height:min(540px,100vh - 64px)}.BiQ1zG_modalHead{flex-shrink:0;justify-content:space-between;align-items:center;gap:8px;display:flex}.BiQ1zG_modalTitle{color:var(--hub-text-primary);font-size:14px;font-weight:600;line-height:20px}.BiQ1zG_modalTitleBusy{color:var(--hub-brand)}.BiQ1zG_modalTitleQueued{color:var(--hub-warning)}.BiQ1zG_modalClose{width:24px;height:24px;color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;font-size:16px;line-height:1;display:inline-flex}.BiQ1zG_modalClose:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.BiQ1zG_modalCloseIcon{flex-shrink:0;width:14px;height:14px}.BiQ1zG_modalDesc{color:var(--hub-text-secondary);font-size:12px;line-height:18px}.BiQ1zG_trustHint{color:var(--hub-danger-text);background:var(--hub-danger-tint);border:1px solid var(--hub-danger-border-soft);border-radius:6px;padding:6px 10px;font-size:12px;font-weight:500;line-height:18px}.BiQ1zG_cliOnlyHint{color:var(--hub-text-secondary);background:var(--hub-bg-hover);border-radius:6px;padding:6px 10px;font-size:12px;line-height:18px}.BiQ1zG_failedCopyHint{color:var(--hub-danger-text);background:var(--hub-danger-tint);border:1px solid var(--hub-danger-border-soft);border-radius:6px;padding:6px 10px;font-size:12px;font-weight:500;line-height:18px}.BiQ1zG_modalRow{align-items:baseline;gap:8px;min-width:0;font-size:12px;line-height:18px;display:flex}.BiQ1zG_modalLabel{min-width:64px;color:var(--hub-text-tertiary);flex-shrink:0}.BiQ1zG_modalValue{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-text-primary);font-weight:500;overflow:hidden}.BiQ1zG_modalLink{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:4px;font-weight:500;text-decoration:none;transition:color .12s;display:inline-flex;overflow:hidden}.BiQ1zG_modalLink:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_linkIcon{flex-shrink:0}.BiQ1zG_modalCmd{color:var(--hub-text-primary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;justify-content:space-between;align-items:center;gap:8px;padding:6px 6px 6px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:18px;transition:border-color .12s,background .12s;display:flex}.BiQ1zG_modalCmd:hover{border-color:var(--hub-border-ghost);background:var(--hub-bg-3)}.BiQ1zG_modalCmdText{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.BiQ1zG_modalCmdCopy{color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:4px;flex-shrink:0;align-items:center;gap:3px;padding:1px 7px;font-family:inherit;font-size:11px;line-height:16px;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_modalCmdCopy:hover{color:var(--hub-brand-hover);background:var(--hub-bg-2)}.BiQ1zG_modalActions{justify-content:flex-end;align-items:center;gap:8px;margin-top:2px;display:flex}.BiQ1zG_modalBody{flex-direction:column;flex:auto;gap:10px;min-height:0;display:flex;overflow-y:auto}.BiQ1zG_toast{z-index:1000;background:var(--hub-btn-fill);color:var(--hub-text-on-fill);pointer-events:none;white-space:nowrap;border:none;border-radius:8px;padding:10px 16px;font-size:12px;font-weight:500;line-height:18px;animation:.22s ease-out BiQ1zG_toastIn;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:0 6px 24px #00000047}@keyframes BiQ1zG_toastIn{0%{opacity:0;transform:translate(-50%,-44%)}to{opacity:1;transform:translate(-50%,-50%)}}.BiQ1zG_toastFail{background:var(--hub-danger);color:#fff;border-color:#ffffff3d}.BiQ1zG_queueSection{flex-direction:column;gap:6px;display:flex}.BiQ1zG_queueSectionTitle{color:var(--hub-text-secondary);padding:4px 2px 0;font-size:12px;font-weight:600;line-height:18px}.BiQ1zG_pendingRowStatus{color:var(--hub-warn);flex-shrink:0;font-weight:500}.BiQ1zG_pendingRowActions{flex-shrink:0;gap:8px;margin-left:auto;display:flex}.BiQ1zG_queueRow{border:1px solid var(--hub-border-2);background:var(--hub-bg-2);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:8px;flex-direction:column;gap:5px;padding:8px 10px;font-size:12px;line-height:18px;transition:background .12s;display:flex}.BiQ1zG_queueRow:hover{background:var(--hub-brand-tint)}.BiQ1zG_queueRowHead{align-items:center;gap:10px;display:flex}.BiQ1zG_queueRowTarget{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-text-primary);flex:1;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;overflow:hidden}.BiQ1zG_queueRowDesc{color:var(--hub-text-tertiary);-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.BiQ1zG_queueRowBody{align-items:center;gap:8px;display:flex}.BiQ1zG_queueRowStatus{color:var(--hub-brand);flex-shrink:0;font-weight:500}.BiQ1zG_queueRowTrack{flex:1;min-width:0}.BiQ1zG_queueRowPct{color:var(--hub-text-tertiary);font-variant-numeric:tabular-nums;flex-shrink:0}.BiQ1zG_stripCancel{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;flex-shrink:0;padding:2px 10px;font-size:12px;line-height:18px;transition:background .12s,color .12s}.BiQ1zG_stripCancel:hover{background:var(--hub-danger-tint);color:var(--hub-danger-text)}.BiQ1zG_stripCancel:disabled{opacity:.45;cursor:default}.BiQ1zG_queuedHint{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);border-radius:6px;padding:5px 10px;font-size:12px;line-height:18px}.BiQ1zG_errorTitle{color:var(--hub-danger-text);font-size:14px;font-weight:600;line-height:20px}.BiQ1zG_errorBox{border:1px solid var(--hub-danger-border);background:var(--hub-danger-tint-weak);max-height:240px;color:var(--hub-text-primary);white-space:pre-wrap;word-break:break-word;-webkit-user-select:none;user-select:none;border-radius:6px;margin:0;padding:10px 12px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:17px;overflow:auto}.BiQ1zG_errorCopySoft{color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:4px;flex-shrink:0;align-items:center;padding:2px 8px;font-size:11px;line-height:16px;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_errorCopySoft:hover{color:var(--hub-text-secondary);background:var(--hub-bg-2)}.BiQ1zG_errorHint{color:var(--hub-text-tertiary);font-size:12px;line-height:18px}.BiQ1zG_modalCancel,.BiQ1zG_modalCopy{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;padding:5px 14px;font-size:12px;line-height:18px;transition:color .12s,background .12s}.BiQ1zG_modalCancel:hover,.BiQ1zG_modalCopy:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.BiQ1zG_modalInstall{color:var(--hub-text-on-fill);background:var(--hub-btn-fill);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_modalInstall:hover{background:var(--hub-btn-hover)}.BiQ1zG_modalCopy:disabled,.BiQ1zG_modalInstall:disabled,.BiQ1zG_modalCancel:disabled,.BiQ1zG_modalClose:disabled,.BiQ1zG_uninstallConfirm:disabled{opacity:.55;cursor:not-allowed;pointer-events:none}.BiQ1zG_uninstallConfirm{color:#fff;background:var(--hub-danger);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_uninstallConfirm:hover{background:var(--hub-danger-hover)}.BiQ1zG_result{text-align:center;flex-direction:column;align-items:center;gap:5px;padding:10px 0 2px;display:flex}.BiQ1zG_resultCheck{background:var(--hub-success-tint);width:40px;height:40px;color:var(--hub-success);border-radius:50%;justify-content:center;align-items:center;margin-bottom:3px;display:inline-flex}.BiQ1zG_resultCheckIcon{flex-shrink:0;width:20px;height:20px}.BiQ1zG_resultTitle{color:var(--hub-text-primary);font-size:13px;font-weight:600;line-height:20px}.BiQ1zG_resultDesc{color:var(--hub-text-secondary);font-size:12px;line-height:18px}.BiQ1zG_resultRestarting{color:var(--hub-text-tertiary);padding:12px 0 6px;font-size:12px;line-height:18px}.BiQ1zG_restartLater{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;padding:5px 14px;font-size:12px;line-height:18px;transition:color .12s,background .12s}.BiQ1zG_restartLater:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.BiQ1zG_restartNow{color:var(--hub-text-on-fill);background:var(--hub-btn-fill);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_restartNow:hover{background:var(--hub-btn-hover)}.BiQ1zG_restartNow:disabled{opacity:.55;cursor:not-allowed;pointer-events:none}.BiQ1zG_restartNowWarning{color:#fff;background:var(--hub-warning);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_restartNowWarning:hover{background:var(--hub-warning-hover)}.BiQ1zG_restartNowWarning:disabled{opacity:.55;cursor:not-allowed;pointer-events:none}.BiQ1zG_result .BiQ1zG_modalActions{justify-content:center;gap:10px;margin-top:0;padding:6px 0 2px}.BiQ1zG_result .BiQ1zG_modalActions .BiQ1zG_restartLater,.BiQ1zG_result .BiQ1zG_modalActions .BiQ1zG_restartNow,.BiQ1zG_result .BiQ1zG_modalActions .BiQ1zG_restartNowWarning{min-width:100px}.BiQ1zG_progress{margin:10px 0 2px}.BiQ1zG_progressHead{justify-content:flex-end;align-items:center;margin-bottom:3px;display:flex}.BiQ1zG_progressText{color:var(--hub-text-secondary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:14px}.BiQ1zG_progressTrack{background:var(--hub-border-2);border-radius:2px;height:4px;overflow:hidden}.BiQ1zG_progressFill{background:var(--hub-brand);border-radius:2px;height:100%;transition:width .32s}.BiQ1zG_progressFillFail{background:var(--hub-danger)}@keyframes BiQ1zG_overlayIn{0%{opacity:0}to{opacity:1}}@keyframes BiQ1zG_modalIn{0%{opacity:0;transform:translateY(6px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}.BiQ1zG_failList{flex-direction:column;gap:12px;padding-right:2px;display:flex}.BiQ1zG_failRow{border:1px solid var(--hub-border-2);background:var(--hub-bg-2);border-radius:8px;flex-direction:column;gap:8px;padding:10px 12px;display:flex}.BiQ1zG_failHead{align-items:center;gap:8px;min-width:0;display:flex}.BiQ1zG_noticeList{flex-direction:column;gap:10px;padding-right:2px;display:flex}.BiQ1zG_noticeRow{border:1px solid var(--hub-border-2);background:var(--hub-bg-2);border-radius:8px;flex-direction:column;align-items:stretch;gap:6px;padding:10px 12px;display:flex}.BiQ1zG_noticeRowMain{align-items:center;gap:10px;width:100%;min-width:0;display:flex}.BiQ1zG_noticeBadgeOk,.BiQ1zG_noticeBadgeFail{border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:28px;height:28px;display:inline-flex;box-shadow:0 2px 6px #0000002e}.BiQ1zG_noticeBadgeOk{background:var(--hub-success)}.BiQ1zG_noticeBadgeFail{background:var(--hub-danger)}.BiQ1zG_noticeBadgeIcon{flex-shrink:0;width:12px;height:12px}.BiQ1zG_noticeMain{flex-direction:column;flex:1;gap:8px;min-width:0;display:flex}.BiQ1zG_noticeHead{align-items:center;gap:8px;min-width:0;display:flex}.BiQ1zG_noticeTextOk{color:var(--hub-success);flex-shrink:0;font-size:12px;font-weight:600;line-height:18px}.BiQ1zG_noticeTextFail{color:var(--hub-danger-text);flex-shrink:0;font-size:12px;font-weight:600;line-height:18px}.BiQ1zG_noticeFoot{justify-content:flex-end;align-items:center;display:flex}.BiQ1zG_noticeTime{color:var(--hub-text-tertiary);font-variant-numeric:tabular-nums;flex-shrink:0;font-size:11px;line-height:16px}.BiQ1zG_noticeRemove{width:22px;height:22px;color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:5px;flex-shrink:0;justify-content:center;align-items:center;margin-left:auto;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_noticeRemove:hover{color:var(--hub-danger-text);background:var(--hub-danger-tint)}.BiQ1zG_noticeRowOk .BiQ1zG_noticeRemove{margin-left:0}.BiQ1zG_noticeRowOk .BiQ1zG_noticeTime{margin-left:auto}.BiQ1zG_noticeRowUpdate{cursor:pointer;transition:border-color .12s,background .12s}.BiQ1zG_noticeRowUpdate:hover{border-color:var(--hub-brand);background:var(--hub-brand-tint)}.BiQ1zG_noticeVersion{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border);font-variant-numeric:tabular-nums;border-radius:5px;flex-shrink:0;padding:0 6px;font-size:11px;font-weight:600;line-height:18px}.BiQ1zG_noticeUpdateGo{color:#fff;background:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:5px;flex-shrink:0;margin-left:2px;padding:2px 8px;font-size:11px;font-weight:600;line-height:16px;transition:background .12s}.BiQ1zG_noticeUpdateGo:hover{background:var(--hub-brand-hover)}.BiQ1zG_noticeIgnore{color:var(--hub-text-secondary);border:1px solid var(--hub-border-2);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border-radius:5px;flex-shrink:0;margin-left:2px;padding:1px 8px;font-size:11px;font-weight:500;line-height:16px;transition:color .12s,border-color .12s,background .12s}.BiQ1zG_noticeIgnore:hover{color:var(--hub-danger-text);border-color:var(--hub-danger-border);background:var(--hub-danger-tint)}.BiQ1zG_failKind{border:1px solid #0000;border-radius:4px;flex-shrink:0;padding:0 6px;font-size:10px;font-weight:500;line-height:16px}.BiQ1zG_failKindInstall{color:var(--hub-danger-text);border-color:var(--hub-danger-border);background:var(--hub-danger-tint)}.BiQ1zG_failKindUninstall{color:var(--hub-warn);border-color:var(--hub-warn-border);background:var(--hub-warn-tint)}.BiQ1zG_failRepo{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;flex:1;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:18px;text-decoration:none;overflow:hidden}.BiQ1zG_failRepo:hover{text-decoration:underline}.BiQ1zG_failCopy{color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:4px;flex-shrink:0;align-items:center;padding:2px 8px;font-size:11px;line-height:16px;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_failCopy:hover{color:var(--hub-text-secondary);background:var(--hub-bg-2)}.BiQ1zG_failEmpty{text-align:center;color:var(--hub-text-tertiary);padding:24px 0;font-size:12px;line-height:18px}.BiQ1zG_failClear{color:var(--hub-danger);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;padding:5px 14px;font-size:12px;line-height:18px;transition:color .12s,background .12s}.BiQ1zG_failClear:hover{color:#fff;background:var(--hub-danger)}.BiQ1zG_failBigIssue{box-sizing:border-box;text-align:center;color:#fff;background:var(--hub-danger);border:1px solid var(--hub-danger);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:8px;width:100%;margin-top:4px;padding:3px 16px;font-size:13px;font-weight:600;line-height:18px;text-decoration:none;transition:background .12s,border-color .12s,box-shadow .12s;display:block}.BiQ1zG_failBigIssue:hover{background:var(--hub-danger-hover);border-color:var(--hub-danger-hover);box-shadow:0 3px 10px #d1242f59}.BiQ1zG_failPrepareHint{color:var(--hub-warning);background:var(--hub-warning-tint);border:1px solid var(--hub-warning-border);border-radius:6px;margin-top:6px;padding:8px 12px;font-size:12px;line-height:18px}.BiQ1zG_aboutModal{width:460px;max-width:calc(100vw - 48px)}.BiQ1zG_aboutContent{min-height:0;max-height:340px;color:var(--hub-text-secondary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);border-radius:8px;flex:auto;padding:10px 12px;font-size:12px;line-height:18px;overflow-y:auto}.BiQ1zG_aboutContent>:first-child{margin-top:0}.BiQ1zG_aboutContent>:last-child{margin-bottom:0}.BiQ1zG_aboutContent h2,.BiQ1zG_aboutContent h3,.BiQ1zG_aboutContent h4,.BiQ1zG_aboutContent h5{color:var(--hub-text-primary);margin:10px 0 4px;font-size:13px;font-weight:600;line-height:20px}.BiQ1zG_aboutContent h2{font-size:14px}.BiQ1zG_aboutContent p{margin:4px 0}.BiQ1zG_aboutContent ul,.BiQ1zG_aboutContent ol{margin:4px 0;padding-left:18px}.BiQ1zG_aboutContent li{margin:2px 0}.BiQ1zG_aboutContent code{background:var(--hub-bg-hover);color:var(--hub-text-primary);border-radius:4px;padding:1px 4px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}.BiQ1zG_aboutContent pre{background:var(--hub-bg-1);border:1px solid var(--hub-border-2);border-radius:6px;margin:6px 0;padding:8px 10px;overflow-x:auto}.BiQ1zG_aboutContent pre code{background:0 0;border-radius:0;padding:0}.BiQ1zG_aboutContent blockquote{border-left:3px solid var(--hub-brand);background:var(--hub-bg-hover);color:var(--hub-text-tertiary);border-radius:0 6px 6px 0;margin:6px 0;padding:2px 10px}.BiQ1zG_aboutContent a{color:var(--hub-brand);text-decoration:none}.BiQ1zG_aboutContent a:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_aboutContent img{border-radius:8px;max-width:100%;max-height:220px;margin:8px auto;display:block;box-shadow:0 2px 8px #0000001f}.BiQ1zG_aboutMeta{color:var(--hub-text-tertiary);font-size:11px;line-height:16px}.BiQ1zG_hubUpdateModal{width:520px;max-width:calc(100vw - 48px)}.BiQ1zG_hubUpdateMeta{flex-wrap:wrap;align-items:center;gap:4px 14px;font-size:12px;line-height:18px;display:flex}.BiQ1zG_hubUpdateMetaItem{color:var(--hub-text-tertiary)}.BiQ1zG_hubUpdateNotes{min-height:0;max-height:300px;color:var(--hub-text-secondary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);border-radius:8px;flex:auto;padding:10px 12px;font-size:12px;line-height:18px;overflow-y:auto}.BiQ1zG_hubUpdateNotes>:first-child{margin-top:0}.BiQ1zG_hubUpdateNotes>:last-child{margin-bottom:0}.BiQ1zG_hubUpdateNotes h2,.BiQ1zG_hubUpdateNotes h3,.BiQ1zG_hubUpdateNotes h4,.BiQ1zG_hubUpdateNotes h5{color:var(--hub-text-primary);margin:10px 0 4px;font-size:13px;font-weight:600;line-height:20px}.BiQ1zG_hubUpdateNotes h2{font-size:14px}.BiQ1zG_hubUpdateNotes p{margin:4px 0}.BiQ1zG_hubUpdateNotes ul,.BiQ1zG_hubUpdateNotes ol{margin:4px 0;padding-left:18px}.BiQ1zG_hubUpdateNotes li{margin:2px 0}.BiQ1zG_hubUpdateNotes code{background:var(--hub-bg-hover);color:var(--hub-text-primary);border-radius:4px;padding:1px 4px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}.BiQ1zG_hubUpdateNotes pre{background:var(--hub-bg-1);border:1px solid var(--hub-border-2);border-radius:6px;margin:6px 0;padding:8px 10px;overflow-x:auto}.BiQ1zG_hubUpdateNotes pre code{background:0 0;border-radius:0;padding:0}.BiQ1zG_hubUpdateNotes blockquote{border-left:3px solid var(--hub-brand);background:var(--hub-bg-hover);color:var(--hub-text-tertiary);border-radius:0 6px 6px 0;margin:6px 0;padding:2px 10px}.BiQ1zG_hubUpdateNotes a{color:var(--hub-brand);text-decoration:none}.BiQ1zG_hubUpdateNotes a:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_detailModal{width:480px;max-width:calc(100vw - 48px)}.BiQ1zG_detailUpdateHint{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);border-radius:6px;padding:6px 10px;font-size:12px;line-height:18px}.BiQ1zG_detailGrid{flex-direction:column;gap:6px;display:flex}.BiQ1zG_detailRow{align-items:baseline;gap:10px;min-width:0;font-size:12px;line-height:20px;display:flex}.BiQ1zG_detailLabel{text-align:right;width:76px;color:var(--hub-text-tertiary);flex-shrink:0}.BiQ1zG_detailValue{min-width:0;color:var(--hub-text-primary);flex-wrap:wrap;flex:auto;align-items:baseline;gap:4px 6px;font-weight:500;display:flex}.BiQ1zG_detailMono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;font-weight:500}.BiQ1zG_detailArrow{color:var(--hub-text-tertiary);align-items:baseline;gap:4px;display:inline-flex}.BiQ1zG_detailDim{color:var(--hub-text-tertiary);font-size:11px;font-weight:400}.BiQ1zG_detailLink{min-width:0;color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:4px;font-weight:500;text-decoration:none;transition:color .12s;display:inline-flex}.BiQ1zG_detailLink:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_detailStars{color:#b45309;font-weight:600}.BiQ1zG_detailPath{min-width:0;color:var(--hub-text-primary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);border-radius:6px;flex:auto;justify-content:space-between;align-items:center;gap:6px;padding:3px 3px 3px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:18px;transition:border-color .12s,background .12s;display:flex}.BiQ1zG_detailPath:hover{border-color:var(--hub-border-ghost);background:var(--hub-bg-3)}.BiQ1zG_detailPathText{text-overflow:ellipsis;white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;min-width:0;overflow:hidden}.BiQ1zG_detailPathActions{flex-shrink:0;align-items:center;gap:4px;display:inline-flex}.BiQ1zG_detailPathBtn{width:28px;height:28px;color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;justify-content:center;align-items:center;transition:color .12s,background .12s,border-color .12s;display:inline-flex}.BiQ1zG_detailPathBtn svg{width:15px;height:15px}.BiQ1zG_detailPathBtn:hover{color:#fff;background:var(--hub-brand);border-color:var(--hub-brand)}.BiQ1zG_detailStatusRunning,.BiQ1zG_detailStatusPending{border-radius:50%;flex-shrink:0;align-self:center;width:8px;height:8px}.BiQ1zG_detailStatusRunning{background:var(--hub-success)}.BiQ1zG_detailStatusPending{background:var(--hub-warning)}.BiQ1zG_detailStatusText{font-weight:500}";
650
+ const tagId$10 = "dsh-plugin/Modal.module.css";
651
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$10) + "]") === null) {
652
+ const tag = document.createElement("style");
653
+ tag.dataset.plugin = "dsh-plugin";
654
+ tag.dataset.pluginCss = tagId$10;
655
+ tag.textContent = css$10;
656
+ document.head.appendChild(tag);
657
+ }
658
+ var Modal_module_css_default = {
659
+ "modalCloseIcon": "BiQ1zG_modalCloseIcon",
660
+ "detailPathText": "BiQ1zG_detailPathText",
661
+ "modalClose": "BiQ1zG_modalClose",
662
+ "modalTitle": "BiQ1zG_modalTitle",
663
+ "queueRowTrack": "BiQ1zG_queueRowTrack",
664
+ "failKindInstall": "BiQ1zG_failKindInstall",
665
+ "queueSection": "BiQ1zG_queueSection",
666
+ "failRepo": "BiQ1zG_failRepo",
667
+ "noticeTextFail": "BiQ1zG_noticeTextFail",
668
+ "noticeVersion": "BiQ1zG_noticeVersion",
669
+ "detailValue": "BiQ1zG_detailValue",
670
+ "queueRowHead": "BiQ1zG_queueRowHead",
671
+ "failClear": "BiQ1zG_failClear",
672
+ "queueSectionTitle": "BiQ1zG_queueSectionTitle",
673
+ "resultDesc": "BiQ1zG_resultDesc",
674
+ "restartNowWarning": "BiQ1zG_restartNowWarning",
675
+ "progress": "BiQ1zG_progress",
676
+ "queueRowBody": "BiQ1zG_queueRowBody",
677
+ "detailPath": "BiQ1zG_detailPath",
678
+ "queueRowPct": "BiQ1zG_queueRowPct",
679
+ "errorTitle": "BiQ1zG_errorTitle",
680
+ "noticeRowUpdate": "BiQ1zG_noticeRowUpdate",
681
+ "pendingRowStatus": "BiQ1zG_pendingRowStatus",
682
+ "modalValue": "BiQ1zG_modalValue",
683
+ "hubUpdateMetaItem": "BiQ1zG_hubUpdateMetaItem",
684
+ "failEmpty": "BiQ1zG_failEmpty",
685
+ "modalIn": "BiQ1zG_modalIn",
686
+ "detailStatusRunning": "BiQ1zG_detailStatusRunning",
687
+ "modalActions": "BiQ1zG_modalActions",
688
+ "resultCheckIcon": "BiQ1zG_resultCheckIcon",
689
+ "noticeBadgeIcon": "BiQ1zG_noticeBadgeIcon",
690
+ "hubUpdateNotes": "BiQ1zG_hubUpdateNotes",
691
+ "modalBody": "BiQ1zG_modalBody",
692
+ "overlayIn": "BiQ1zG_overlayIn",
693
+ "modalInstall": "BiQ1zG_modalInstall",
694
+ "progressHead": "BiQ1zG_progressHead",
695
+ "failList": "BiQ1zG_failList",
696
+ "errorBox": "BiQ1zG_errorBox",
697
+ "noticeTime": "BiQ1zG_noticeTime",
698
+ "queuedHint": "BiQ1zG_queuedHint",
699
+ "modalRow": "BiQ1zG_modalRow",
700
+ "modalCancel": "BiQ1zG_modalCancel",
701
+ "modalWide": "BiQ1zG_modalWide",
702
+ "detailPathBtn": "BiQ1zG_detailPathBtn",
703
+ "modalTitleBusy": "BiQ1zG_modalTitleBusy",
704
+ "failKindUninstall": "BiQ1zG_failKindUninstall",
705
+ "errorHint": "BiQ1zG_errorHint",
706
+ "modalCopy": "BiQ1zG_modalCopy",
707
+ "modalDesc": "BiQ1zG_modalDesc",
708
+ "detailArrow": "BiQ1zG_detailArrow",
709
+ "restartLater": "BiQ1zG_restartLater",
710
+ "failCopy": "BiQ1zG_failCopy",
711
+ "queueRow": "BiQ1zG_queueRow",
712
+ "detailGrid": "BiQ1zG_detailGrid",
713
+ "detailUpdateHint": "BiQ1zG_detailUpdateHint",
714
+ "aboutMeta": "BiQ1zG_aboutMeta",
715
+ "queueRowTarget": "BiQ1zG_queueRowTarget",
716
+ "modalCmdCopy": "BiQ1zG_modalCmdCopy",
717
+ "progressTrack": "BiQ1zG_progressTrack",
718
+ "resultCheck": "BiQ1zG_resultCheck",
719
+ "trustHint": "BiQ1zG_trustHint",
720
+ "detailLabel": "BiQ1zG_detailLabel",
721
+ "pendingRowActions": "BiQ1zG_pendingRowActions",
722
+ "errorCopySoft": "BiQ1zG_errorCopySoft",
723
+ "noticeRowMain": "BiQ1zG_noticeRowMain",
724
+ "noticeBadgeOk": "BiQ1zG_noticeBadgeOk",
725
+ "noticeRowOk": "BiQ1zG_noticeRowOk",
726
+ "aboutContent": "BiQ1zG_aboutContent",
727
+ "modalHead": "BiQ1zG_modalHead",
728
+ "noticeIgnore": "BiQ1zG_noticeIgnore",
729
+ "detailLink": "BiQ1zG_detailLink",
730
+ "modalCmd": "BiQ1zG_modalCmd",
731
+ "modalLabel": "BiQ1zG_modalLabel",
732
+ "aboutModal": "BiQ1zG_aboutModal",
733
+ "helpModal": "BiQ1zG_helpModal",
734
+ "noticeList": "BiQ1zG_noticeList",
735
+ "noticeHead": "BiQ1zG_noticeHead",
736
+ "modalTitleQueued": "BiQ1zG_modalTitleQueued",
737
+ "noticeTextOk": "BiQ1zG_noticeTextOk",
738
+ "failRow": "BiQ1zG_failRow",
739
+ "result": "BiQ1zG_result",
740
+ "restartNow": "BiQ1zG_restartNow",
741
+ "cliOnlyHint": "BiQ1zG_cliOnlyHint",
742
+ "overlay": "BiQ1zG_overlay",
743
+ "modal": "BiQ1zG_modal",
744
+ "noticeUpdateGo": "BiQ1zG_noticeUpdateGo",
745
+ "errorModal": "BiQ1zG_errorModal",
746
+ "failBigIssue": "BiQ1zG_failBigIssue",
747
+ "detailMono": "BiQ1zG_detailMono",
748
+ "hubUpdateModal": "BiQ1zG_hubUpdateModal",
749
+ "queueRowDesc": "BiQ1zG_queueRowDesc",
750
+ "queueRowStatus": "BiQ1zG_queueRowStatus",
751
+ "noticeFoot": "BiQ1zG_noticeFoot",
752
+ "failPrepareHint": "BiQ1zG_failPrepareHint",
753
+ "stripCancel": "BiQ1zG_stripCancel",
754
+ "progressFillFail": "BiQ1zG_progressFillFail",
755
+ "modalLink": "BiQ1zG_modalLink",
756
+ "toast": "BiQ1zG_toast",
757
+ "noticeRemove": "BiQ1zG_noticeRemove",
758
+ "failKind": "BiQ1zG_failKind",
759
+ "detailStatusPending": "BiQ1zG_detailStatusPending",
760
+ "linkIcon": "BiQ1zG_linkIcon",
761
+ "modalCmdText": "BiQ1zG_modalCmdText",
762
+ "detailStatusText": "BiQ1zG_detailStatusText",
763
+ "noticeBadgeFail": "BiQ1zG_noticeBadgeFail",
764
+ "progressFill": "BiQ1zG_progressFill",
765
+ "failedCopyHint": "BiQ1zG_failedCopyHint",
766
+ "failHead": "BiQ1zG_failHead",
767
+ "detailModal": "BiQ1zG_detailModal",
768
+ "detailPathActions": "BiQ1zG_detailPathActions",
769
+ "progressText": "BiQ1zG_progressText",
770
+ "resultRestarting": "BiQ1zG_resultRestarting",
771
+ "detailRow": "BiQ1zG_detailRow",
772
+ "toastFail": "BiQ1zG_toastFail",
773
+ "logModal": "BiQ1zG_logModal",
774
+ "uninstallConfirm": "BiQ1zG_uninstallConfirm",
775
+ "noticeMain": "BiQ1zG_noticeMain",
776
+ "detailDim": "BiQ1zG_detailDim",
777
+ "hubUpdateMeta": "BiQ1zG_hubUpdateMeta",
778
+ "noticeRow": "BiQ1zG_noticeRow",
779
+ "resultTitle": "BiQ1zG_resultTitle",
780
+ "detailStars": "BiQ1zG_detailStars",
781
+ "toastIn": "BiQ1zG_toastIn"
626
782
  };
627
783
  //#endregion
628
784
  //#region src/client/logic/install-command.ts
@@ -688,11 +844,11 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
688
844
  /** 接口中心「关注我们」内容(静态 JSON,由 api-center 的 about.md 构建生成,Markdown)。 */
689
845
  const HUB_ABOUT_URL = "https://api.dsh-plugin.org/about.json";
690
846
  /**
691
- * 插件当前版本号,供头部标题展示「DSH-Plugin Hub v0.1.1」。
847
+ * 插件当前版本号,供头部标题展示「DSH Plugin Hub v0.1.1」。
692
848
  * tsdown 构建时用 define 把 __PLUGIN_VERSION__ 替换成 package.json 的版本号;
693
849
  * node --test 直接 import 本模块时该标识符不存在,typeof 守卫兜底为空串。
694
850
  */
695
- const PLUGIN_VERSION = "1.2.1";
851
+ const PLUGIN_VERSION = "1.3.1";
696
852
  const CATEGORY_ORDER = [
697
853
  "interface",
698
854
  "session",
@@ -939,10 +1095,17 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
939
1095
  }
940
1096
  //#endregion
941
1097
  //#region src/client/data/hub.ts
1098
+ /** 版本接口是 Pages 静态文件,默认带 CDN 缓存(Cache-Control: public, max-age=43200,
1099
+ * 即 12 小时),客户端 no-store 管不到 CDN 边缘,会拿到旧公告。
1100
+ * 静态资产请求免费且无限,因此所有版本检查一律带时间戳 query:URL 每次不同 →
1101
+ * CDN 缓存 key 不同 → 强制回源拉到最新公告,无任何配额顾虑。 */
1102
+ function busted(url) {
1103
+ return `${url}${url.includes("?") ? "&" : "?"}_t=${Date.now()}`;
1104
+ }
942
1105
  /** Worker 版本控制中心:最新版本 + Markdown 变更记录;不可用返回 null。 */
943
1106
  async function fetchHubUpdate() {
944
1107
  try {
945
- const res = await fetch(HUB_UPDATE_URL, { cache: "no-store" });
1108
+ const res = await fetch(busted(HUB_UPDATE_URL), { cache: "no-store" });
946
1109
  if (!res.ok) return null;
947
1110
  const data = await res.json();
948
1111
  if (!data) return null;
@@ -960,7 +1123,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
960
1123
  /** Worker「关注我们」内容(平台介绍 + 反馈群二维码,Markdown);未推送返回 null。 */
961
1124
  async function fetchHubAbout() {
962
1125
  try {
963
- const res = await fetch(HUB_ABOUT_URL, { cache: "no-store" });
1126
+ const res = await fetch(busted(HUB_ABOUT_URL), { cache: "no-store" });
964
1127
  if (!res.ok) return null;
965
1128
  const data = await res.json();
966
1129
  if (!data || data.content === null || data.content === void 0) return null;
@@ -1019,6 +1182,33 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1019
1182
  function isRepoLike(value) {
1020
1183
  return /^[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+$/.test(value);
1021
1184
  }
1185
+ /**
1186
+ * 提 Issue 的仓库身份解析:失败目标可能是 owner/repo 也可能是 npm 包名(含 @scope/pkg、
1187
+ * 可带 @version,如 dsh-plugin、@scope/pkg@1.2.3)。
1188
+ * - 目标本身就能解析出 owner/repo → 直接用;
1189
+ * - npm 包名 → 反查仓库身份:先查已安装表(该包名的条目若带仓库身份即命中),再查目录插件
1190
+ * (source.npmPackage 与包名一致,取目录收录的仓库身份)。
1191
+ * 反查到才返回,查不到返回 null —— 调用方据此不显示「一键提 Issue」按钮,避免把 Issue
1192
+ * 提到错误的地址(别人发的 npm 包名不是 GitHub 仓库,直接拼 github.com/<包名> 是打不开的)。
1193
+ */
1194
+ function issueRepoOf(target, installedItems, plugins) {
1195
+ const input = target.trim();
1196
+ if (!input) return null;
1197
+ const parsed = repoFromInstallTarget(input);
1198
+ if (isRepoLike(parsed)) return parsed;
1199
+ const pkg = parsed.replace(/@[^@]*$/, "").toLowerCase();
1200
+ for (const item of installedItems) {
1201
+ if (item.name.toLowerCase() !== pkg) continue;
1202
+ if (item.repo) return item.repo;
1203
+ const repo = repoFromInstallTarget(item.spec);
1204
+ if (isRepoLike(repo)) return repo;
1205
+ }
1206
+ for (const p of plugins ?? []) {
1207
+ const pkgName = (p.source?.npmPackage ?? "").trim();
1208
+ if (pkgName !== "" && pkgName.toLowerCase() === pkg && p.source?.repo) return p.source.repo;
1209
+ }
1210
+ return null;
1211
+ }
1022
1212
  /** 已安装项 → 弹窗可用的伪插件对象:卸载确认弹窗只读名称/来源行,
1023
1213
  * 自定义安装(目录外)没有完整目录数据,用它把 InstalledItem 适配成 HubPlugin。 */
1024
1214
  function pluginOfItem(item) {
@@ -1041,7 +1231,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1041
1231
  if (name !== "dsh-plugin") return false;
1042
1232
  if (spec.startsWith("file:") || spec.startsWith("link:")) return true;
1043
1233
  const repo = repoFromInstallTarget(spec);
1044
- return isRepoLike(repo) && repo.toLowerCase() === "dshplugin/dsh-plugin-hub".toLowerCase();
1234
+ if (isRepoLike(repo) && repo.toLowerCase() === "dshplugin/dsh-plugin-hub".toLowerCase()) return true;
1235
+ return !isRepoLike(repo);
1045
1236
  }
1046
1237
  /**
1047
1238
  * 构建已安装项列表:目录插件按命中关系合并(拥有完整元数据),
@@ -1095,7 +1286,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1095
1286
  //#endregion
1096
1287
  //#region src/client/hooks/useCatalog.ts
1097
1288
  /**
1098
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1289
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1099
1290
  * Website: https://dsh-plugin.org
1100
1291
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
1101
1292
  *
@@ -1105,7 +1296,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1105
1296
  * installed-plugin table, and the filter/search/sort/install-status view
1106
1297
  * state, exposing the derived visible list and per-category counts.
1107
1298
  */
1108
- /** 插件市场自身仓库:DSH-Plugin Hub 不显示在目录里(自己不进自己的插件列表) */
1299
+ /** 插件市场自身仓库:DSH Plugin Hub 不显示在目录里(自己不进自己的插件列表) */
1109
1300
  const SELF_REPO = "dshplugin/dsh-plugin-hub";
1110
1301
  /** 市场各排序的默认方向:全部按倒序(Star/Fork 多、更新/收录近的在前) */
1111
1302
  const SORT_DEFAULT_DIR$1 = {
@@ -1137,6 +1328,17 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1137
1328
  setSortDir(SORT_DEFAULT_DIR$1[key]);
1138
1329
  }
1139
1330
  }
1331
+ /**
1332
+ * 强制刷新 Hub 版本与「关注我们」信息:点击头部版本号/徽标时触发。
1333
+ * 挂载期的 useEffect 只在进入/reload 时拉一次,发版后已打开的界面点版本号
1334
+ * 仍显示旧数据;此处重新拉接口中心,最新版本与变更记录点击即见。
1335
+ * 失败静默为 null(弹窗兜底展示当前版本号),与挂载期拉取口径一致。
1336
+ */
1337
+ const refreshHub = async () => {
1338
+ const [info, about] = await Promise.all([fetchHubUpdate(), fetchHubAbout()]);
1339
+ setHubUpdateInfo(info);
1340
+ setHubAboutInfo(about);
1341
+ };
1140
1342
  /** 当前 profile 已安装插件:npm 包名 -> manifest spec(来自宿主本地路由) */
1141
1343
  const [installed, setInstalled] = (0, react.useState)({});
1142
1344
  /** 安装时记录的目录信号:repo(小写) -> { version, updatedAt }(来自宿主本地路由);
@@ -1236,7 +1438,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1236
1438
  */
1237
1439
  const hubHasUpdate = (() => {
1238
1440
  if (!hubUpdateInfo) return false;
1239
- return hubUpdateInfo.version !== "1.2.1";
1441
+ return hubUpdateInfo.version !== "1.3.1";
1240
1442
  })();
1241
1443
  (0, react.useMemo)(() => {
1242
1444
  if (!plugins) return [];
@@ -1286,6 +1488,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1286
1488
  hubHasUpdate,
1287
1489
  hubUpdateInfo,
1288
1490
  hubAboutInfo,
1491
+ refreshHub,
1289
1492
  refreshInstalled,
1290
1493
  category,
1291
1494
  setCategory,
@@ -1355,14 +1558,50 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1355
1558
  message: ""
1356
1559
  });
1357
1560
  }
1358
- /** 记录一条「发现新版本」更新提醒:成功类轻量记录,携带目录新版本号供通知中心展示。 */
1561
+ /** 记录一条「发现新版本」更新提醒:成功类轻量记录,携带目录新版本号供通知中心展示。
1562
+ * 同一插件同一新版本已在通知中心时跳过:宿主重载会重新触发启动检查,不更新时
1563
+ * 通知里已有的提醒保持单条,不重复追加。 */
1359
1564
  function addUpdateNotice(record) {
1565
+ const prev = loadNotifications();
1566
+ if (prev.some((r) => r.kind === "update" && r.repo === record.repo && (r.version ?? void 0) === (record.version ?? void 0))) return prev;
1360
1567
  return addNotification({
1361
1568
  ...record,
1362
1569
  ok: true,
1363
1570
  message: ""
1364
1571
  });
1365
1572
  }
1573
+ /** 已忽略的更新提醒持久化 key:`owner/repo@version` 字符串数组。 */
1574
+ const IGNORE_KEY = "gro.ngilp-hsd.ignored-updates";
1575
+ /** 读取已忽略的更新提醒(`owner/repo@version` 字符串集合);损坏/不可用时返回空集合。 */
1576
+ function loadIgnoredUpdates() {
1577
+ try {
1578
+ const raw = storage()?.getItem(IGNORE_KEY);
1579
+ if (!raw) return /* @__PURE__ */ new Set();
1580
+ const list = JSON.parse(raw);
1581
+ if (!Array.isArray(list)) return /* @__PURE__ */ new Set();
1582
+ return new Set(list.filter((x) => typeof x === "string"));
1583
+ } catch {
1584
+ return /* @__PURE__ */ new Set();
1585
+ }
1586
+ }
1587
+ function saveIgnoredUpdates(ignored) {
1588
+ try {
1589
+ storage()?.setItem(IGNORE_KEY, JSON.stringify([...ignored]));
1590
+ } catch {}
1591
+ }
1592
+ /** 忽略某插件本次更新(repo+version 持久化入忽略集):本次版本不再提醒,直到下一个新版本发布。 */
1593
+ function ignoreUpdate(repo, version) {
1594
+ const next = loadIgnoredUpdates();
1595
+ next.add(`${repo}@${version ?? ""}`);
1596
+ saveIgnoredUpdates(next);
1597
+ return next;
1598
+ }
1599
+ /** 移除某插件某版本的更新提醒记录(忽略本次更新时一并清理通知),返回更新后的列表。 */
1600
+ function removeUpdateNotice(repo, version) {
1601
+ const next = loadNotifications().filter((r) => !(r.kind === "update" && r.repo === repo && (r.version ?? void 0) === (version ?? void 0)));
1602
+ save(next);
1603
+ return next;
1604
+ }
1366
1605
  /** 清空全部通知记录,返回空列表。 */
1367
1606
  function clearNotifications() {
1368
1607
  save([]);
@@ -1483,7 +1722,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1483
1722
  `- Cause: ${reason}`,
1484
1723
  ...code ? [`- Key error: \`${code}\``] : [],
1485
1724
  "",
1486
- `## [DSH-Plugin 插件中心](${SITE_URL}) · 安装 Plugin 失败错误信息`,
1725
+ `## [DSH Plugin 插件中心](${SITE_URL}) · 安装 Plugin 失败错误信息`,
1487
1726
  `本错误信息由 [dsh-plugin-hub](${GITHUB_URL}) 插件中心的安装程序自动生成,随本次安装失败一并提交。`,
1488
1727
  `- 实际执行的安装命令:\`${command ?? `dsh plugin${env?.profile ? ` --profile ${env.profile}` : ""} add git+https://github.com/${repo}.git`}\``,
1489
1728
  `- 执行结果:安装失败,未能安装该插件。`,
@@ -1538,7 +1777,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1538
1777
  //#endregion
1539
1778
  //#region src/client/hooks/useLanguage.ts
1540
1779
  /**
1541
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1780
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1542
1781
  * Website: https://dsh-plugin.org
1543
1782
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
1544
1783
  *
@@ -1569,7 +1808,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1569
1808
  //#endregion
1570
1809
  //#region src/client/hooks/useSettings.ts
1571
1810
  /**
1572
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1811
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1573
1812
  * Website: https://dsh-plugin.org
1574
1813
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
1575
1814
  *
@@ -1645,7 +1884,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1645
1884
  //#endregion
1646
1885
  //#region src/client/hooks/useTaskQueue.ts
1647
1886
  /**
1648
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1887
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1649
1888
  * Website: https://dsh-plugin.org
1650
1889
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
1651
1890
  *
@@ -2144,143 +2383,9 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2144
2383
  };
2145
2384
  }
2146
2385
  //#endregion
2147
- //#region \0dsh-css:src/client/styles/Modal.module.css.mjs
2148
- const css$10 = ".BiQ1zG_overlay{z-index:998;-webkit-user-select:none;user-select:none;background:#00000061;justify-content:center;align-items:center;animation:.16s ease-out BiQ1zG_overlayIn;display:flex;position:fixed;top:0;bottom:0;left:0;right:0}.BiQ1zG_modal,.BiQ1zG_errorModal{background:var(--hub-bg-1);border:1px solid var(--hub-border-2);border-radius:10px;flex-direction:column;gap:10px;width:420px;max-width:calc(100vw - 32px);max-height:calc(100vh - 64px);padding:14px 16px;animation:.18s ease-out BiQ1zG_modalIn;display:flex;box-shadow:0 12px 40px #0000003d}.BiQ1zG_errorModal{width:640px;max-width:calc(100vw - 48px)}.BiQ1zG_modalWide{width:560px;max-width:calc(100vw - 48px)}.BiQ1zG_logModal{width:780px;max-width:calc(100vw - 48px);height:min(540px,100vh - 64px)}.BiQ1zG_modalHead{flex-shrink:0;justify-content:space-between;align-items:center;gap:8px;display:flex}.BiQ1zG_modalTitle{color:var(--hub-text-primary);font-size:14px;font-weight:600;line-height:20px}.BiQ1zG_modalTitleBusy{color:var(--hub-brand)}.BiQ1zG_modalTitleQueued{color:var(--hub-warning)}.BiQ1zG_modalClose{width:24px;height:24px;color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;font-size:16px;line-height:1;display:inline-flex}.BiQ1zG_modalClose:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.BiQ1zG_modalCloseIcon{flex-shrink:0;width:14px;height:14px}.BiQ1zG_modalDesc{color:var(--hub-text-secondary);font-size:12px;line-height:18px}.BiQ1zG_trustHint{color:var(--hub-danger-text);background:var(--hub-danger-tint);border:1px solid var(--hub-danger-border-soft);border-radius:6px;padding:6px 10px;font-size:12px;font-weight:500;line-height:18px}.BiQ1zG_cliOnlyHint{color:var(--hub-text-secondary);background:var(--hub-bg-hover);border-radius:6px;padding:6px 10px;font-size:12px;line-height:18px}.BiQ1zG_failedCopyHint{color:var(--hub-danger-text);background:var(--hub-danger-tint);border:1px solid var(--hub-danger-border-soft);border-radius:6px;padding:6px 10px;font-size:12px;font-weight:500;line-height:18px}.BiQ1zG_modalRow{align-items:baseline;gap:8px;min-width:0;font-size:12px;line-height:18px;display:flex}.BiQ1zG_modalLabel{min-width:64px;color:var(--hub-text-tertiary);flex-shrink:0}.BiQ1zG_modalValue{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-text-primary);font-weight:500;overflow:hidden}.BiQ1zG_modalLink{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:4px;font-weight:500;text-decoration:none;transition:color .12s;display:inline-flex;overflow:hidden}.BiQ1zG_modalLink:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_linkIcon{flex-shrink:0}.BiQ1zG_modalCmd{color:var(--hub-text-primary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;justify-content:space-between;align-items:center;gap:8px;padding:6px 6px 6px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:18px;transition:border-color .12s,background .12s;display:flex}.BiQ1zG_modalCmd:hover{border-color:var(--hub-border-ghost);background:var(--hub-bg-3)}.BiQ1zG_modalCmdText{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.BiQ1zG_modalCmdCopy{color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:4px;flex-shrink:0;align-items:center;gap:3px;padding:1px 7px;font-family:inherit;font-size:11px;line-height:16px;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_modalCmdCopy:hover{color:var(--hub-brand-hover);background:var(--hub-bg-2)}.BiQ1zG_modalActions{justify-content:flex-end;align-items:center;gap:8px;margin-top:2px;display:flex}.BiQ1zG_modalBody{flex-direction:column;flex:auto;gap:10px;min-height:0;display:flex;overflow-y:auto}.BiQ1zG_toast{z-index:1000;background:var(--hub-btn-fill);color:var(--hub-text-on-fill);pointer-events:none;white-space:nowrap;border:none;border-radius:8px;padding:10px 16px;font-size:12px;font-weight:500;line-height:18px;animation:.22s ease-out BiQ1zG_toastIn;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:0 6px 24px #00000047}@keyframes BiQ1zG_toastIn{0%{opacity:0;transform:translate(-50%,-44%)}to{opacity:1;transform:translate(-50%,-50%)}}.BiQ1zG_toastFail{background:var(--hub-danger);color:#fff;border-color:#ffffff3d}.BiQ1zG_queueSection{flex-direction:column;gap:6px;display:flex}.BiQ1zG_queueSectionTitle{color:var(--hub-text-secondary);padding:4px 2px 0;font-size:12px;font-weight:600;line-height:18px}.BiQ1zG_pendingRowStatus{color:var(--hub-warn);flex-shrink:0;font-weight:500}.BiQ1zG_pendingRowActions{flex-shrink:0;gap:8px;margin-left:auto;display:flex}.BiQ1zG_queueRow{border:1px solid var(--hub-border-2);background:var(--hub-bg-2);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:8px;flex-direction:column;gap:5px;padding:8px 10px;font-size:12px;line-height:18px;transition:background .12s;display:flex}.BiQ1zG_queueRow:hover{background:var(--hub-brand-tint)}.BiQ1zG_queueRowHead{align-items:center;gap:10px;display:flex}.BiQ1zG_queueRowTarget{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-text-primary);flex:1;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;overflow:hidden}.BiQ1zG_queueRowDesc{color:var(--hub-text-tertiary);-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.BiQ1zG_queueRowBody{align-items:center;gap:8px;display:flex}.BiQ1zG_queueRowStatus{color:var(--hub-brand);flex-shrink:0;font-weight:500}.BiQ1zG_queueRowTrack{flex:1;min-width:0}.BiQ1zG_queueRowPct{color:var(--hub-text-tertiary);font-variant-numeric:tabular-nums;flex-shrink:0}.BiQ1zG_stripCancel{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;flex-shrink:0;padding:2px 10px;font-size:12px;line-height:18px;transition:background .12s,color .12s}.BiQ1zG_stripCancel:hover{background:var(--hub-danger-tint);color:var(--hub-danger-text)}.BiQ1zG_stripCancel:disabled{opacity:.45;cursor:default}.BiQ1zG_queuedHint{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);border-radius:6px;padding:5px 10px;font-size:12px;line-height:18px}.BiQ1zG_errorTitle{color:var(--hub-danger-text);font-size:14px;font-weight:600;line-height:20px}.BiQ1zG_errorBox{border:1px solid var(--hub-danger-border);background:var(--hub-danger-tint-weak);max-height:240px;color:var(--hub-text-primary);white-space:pre-wrap;word-break:break-word;-webkit-user-select:none;user-select:none;border-radius:6px;margin:0;padding:10px 12px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:17px;overflow:auto}.BiQ1zG_errorCopySoft{color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:4px;flex-shrink:0;align-items:center;padding:2px 8px;font-size:11px;line-height:16px;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_errorCopySoft:hover{color:var(--hub-text-secondary);background:var(--hub-bg-2)}.BiQ1zG_errorHint{color:var(--hub-text-tertiary);font-size:12px;line-height:18px}.BiQ1zG_modalCancel,.BiQ1zG_modalCopy{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;padding:5px 14px;font-size:12px;line-height:18px;transition:color .12s,background .12s}.BiQ1zG_modalCancel:hover,.BiQ1zG_modalCopy:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.BiQ1zG_modalInstall{color:var(--hub-text-on-fill);background:var(--hub-btn-fill);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_modalInstall:hover{background:var(--hub-btn-hover)}.BiQ1zG_modalCopy:disabled,.BiQ1zG_modalInstall:disabled,.BiQ1zG_modalCancel:disabled,.BiQ1zG_modalClose:disabled,.BiQ1zG_uninstallConfirm:disabled{opacity:.55;cursor:not-allowed;pointer-events:none}.BiQ1zG_uninstallConfirm{color:#fff;background:var(--hub-danger);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_uninstallConfirm:hover{background:var(--hub-danger-hover)}.BiQ1zG_result{text-align:center;flex-direction:column;align-items:center;gap:5px;padding:10px 0 2px;display:flex}.BiQ1zG_resultCheck{background:var(--hub-success-tint);width:40px;height:40px;color:var(--hub-success);border-radius:50%;justify-content:center;align-items:center;margin-bottom:3px;display:inline-flex}.BiQ1zG_resultCheckIcon{flex-shrink:0;width:20px;height:20px}.BiQ1zG_resultTitle{color:var(--hub-text-primary);font-size:13px;font-weight:600;line-height:20px}.BiQ1zG_resultDesc{color:var(--hub-text-secondary);font-size:12px;line-height:18px}.BiQ1zG_resultRestarting{color:var(--hub-text-tertiary);padding:12px 0 6px;font-size:12px;line-height:18px}.BiQ1zG_restartLater{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;padding:5px 14px;font-size:12px;line-height:18px;transition:color .12s,background .12s}.BiQ1zG_restartLater:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.BiQ1zG_restartNow{color:var(--hub-text-on-fill);background:var(--hub-btn-fill);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_restartNow:hover{background:var(--hub-btn-hover)}.BiQ1zG_restartNow:disabled{opacity:.55;cursor:not-allowed;pointer-events:none}.BiQ1zG_restartNowWarning{color:#fff;background:var(--hub-warning);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_restartNowWarning:hover{background:var(--hub-warning-hover)}.BiQ1zG_restartNowWarning:disabled{opacity:.55;cursor:not-allowed;pointer-events:none}.BiQ1zG_result .BiQ1zG_modalActions{justify-content:center;gap:10px;margin-top:0;padding:6px 0 2px}.BiQ1zG_result .BiQ1zG_modalActions .BiQ1zG_restartLater,.BiQ1zG_result .BiQ1zG_modalActions .BiQ1zG_restartNow,.BiQ1zG_result .BiQ1zG_modalActions .BiQ1zG_restartNowWarning{min-width:100px}.BiQ1zG_progress{margin:10px 0 2px}.BiQ1zG_progressHead{justify-content:flex-end;align-items:center;margin-bottom:3px;display:flex}.BiQ1zG_progressText{color:var(--hub-text-secondary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:14px}.BiQ1zG_progressTrack{background:var(--hub-border-2);border-radius:2px;height:4px;overflow:hidden}.BiQ1zG_progressFill{background:var(--hub-brand);border-radius:2px;height:100%;transition:width .32s}.BiQ1zG_progressFillFail{background:var(--hub-danger)}@keyframes BiQ1zG_overlayIn{0%{opacity:0}to{opacity:1}}@keyframes BiQ1zG_modalIn{0%{opacity:0;transform:translateY(6px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}.BiQ1zG_failList{flex-direction:column;gap:12px;padding-right:2px;display:flex}.BiQ1zG_failRow{border:1px solid var(--hub-border-2);background:var(--hub-bg-2);border-radius:8px;flex-direction:column;gap:8px;padding:10px 12px;display:flex}.BiQ1zG_failHead{align-items:center;gap:8px;min-width:0;display:flex}.BiQ1zG_noticeList{flex-direction:column;gap:10px;padding-right:2px;display:flex}.BiQ1zG_noticeRow{border:1px solid var(--hub-border-2);background:var(--hub-bg-2);border-radius:8px;flex-direction:column;align-items:stretch;gap:6px;padding:10px 12px;display:flex}.BiQ1zG_noticeRowMain{align-items:center;gap:10px;width:100%;min-width:0;display:flex}.BiQ1zG_noticeBadgeOk,.BiQ1zG_noticeBadgeFail{border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:28px;height:28px;display:inline-flex;box-shadow:0 2px 6px #0000002e}.BiQ1zG_noticeBadgeOk{background:var(--hub-success)}.BiQ1zG_noticeBadgeFail{background:var(--hub-danger)}.BiQ1zG_noticeBadgeIcon{flex-shrink:0;width:12px;height:12px}.BiQ1zG_noticeMain{flex-direction:column;flex:1;gap:8px;min-width:0;display:flex}.BiQ1zG_noticeHead{align-items:center;gap:8px;min-width:0;display:flex}.BiQ1zG_noticeTextOk{color:var(--hub-success);flex-shrink:0;font-size:12px;font-weight:600;line-height:18px}.BiQ1zG_noticeTextFail{color:var(--hub-danger-text);flex-shrink:0;font-size:12px;font-weight:600;line-height:18px}.BiQ1zG_noticeFoot{justify-content:flex-end;align-items:center;display:flex}.BiQ1zG_noticeTime{color:var(--hub-text-tertiary);font-variant-numeric:tabular-nums;flex-shrink:0;font-size:11px;line-height:16px}.BiQ1zG_noticeRemove{width:22px;height:22px;color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:5px;flex-shrink:0;justify-content:center;align-items:center;margin-left:auto;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_noticeRemove:hover{color:var(--hub-danger-text);background:var(--hub-danger-tint)}.BiQ1zG_noticeRowOk .BiQ1zG_noticeRemove{margin-left:0}.BiQ1zG_noticeRowOk .BiQ1zG_noticeTime{margin-left:auto}.BiQ1zG_noticeRowUpdate{cursor:pointer;transition:border-color .12s,background .12s}.BiQ1zG_noticeRowUpdate:hover{border-color:var(--hub-brand);background:var(--hub-brand-tint)}.BiQ1zG_noticeVersion{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border);font-variant-numeric:tabular-nums;border-radius:5px;flex-shrink:0;padding:0 6px;font-size:11px;font-weight:600;line-height:18px}.BiQ1zG_noticeUpdateGo{color:#fff;background:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:5px;flex-shrink:0;margin-left:2px;padding:2px 8px;font-size:11px;font-weight:600;line-height:16px;transition:background .12s}.BiQ1zG_noticeUpdateGo:hover{background:var(--hub-brand-hover)}.BiQ1zG_failKind{border:1px solid #0000;border-radius:4px;flex-shrink:0;padding:0 6px;font-size:10px;font-weight:500;line-height:16px}.BiQ1zG_failKindInstall{color:var(--hub-danger-text);border-color:var(--hub-danger-border);background:var(--hub-danger-tint)}.BiQ1zG_failKindUninstall{color:var(--hub-warn);border-color:var(--hub-warn-border);background:var(--hub-warn-tint)}.BiQ1zG_failRepo{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;flex:1;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:18px;text-decoration:none;overflow:hidden}.BiQ1zG_failRepo:hover{text-decoration:underline}.BiQ1zG_failCopy{color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:4px;flex-shrink:0;align-items:center;padding:2px 8px;font-size:11px;line-height:16px;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_failCopy:hover{color:var(--hub-text-secondary);background:var(--hub-bg-2)}.BiQ1zG_failEmpty{text-align:center;color:var(--hub-text-tertiary);padding:24px 0;font-size:12px;line-height:18px}.BiQ1zG_failClear{color:var(--hub-danger);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;padding:5px 14px;font-size:12px;line-height:18px;transition:color .12s,background .12s}.BiQ1zG_failClear:hover{color:#fff;background:var(--hub-danger)}.BiQ1zG_failBigIssue{box-sizing:border-box;text-align:center;color:#fff;background:var(--hub-danger);border:1px solid var(--hub-danger);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:8px;width:100%;margin-top:4px;padding:3px 16px;font-size:13px;font-weight:600;line-height:18px;text-decoration:none;transition:background .12s,border-color .12s,box-shadow .12s;display:block}.BiQ1zG_failBigIssue:hover{background:var(--hub-danger-hover);border-color:var(--hub-danger-hover);box-shadow:0 3px 10px #d1242f59}.BiQ1zG_failPrepareHint{color:var(--hub-warning);background:var(--hub-warning-tint);border:1px solid var(--hub-warning-border);border-radius:6px;margin-top:6px;padding:8px 12px;font-size:12px;line-height:18px}.BiQ1zG_aboutModal{width:460px;max-width:calc(100vw - 48px)}.BiQ1zG_aboutContent{min-height:0;max-height:340px;color:var(--hub-text-secondary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);border-radius:8px;flex:auto;padding:10px 12px;font-size:12px;line-height:18px;overflow-y:auto}.BiQ1zG_aboutContent>:first-child{margin-top:0}.BiQ1zG_aboutContent>:last-child{margin-bottom:0}.BiQ1zG_aboutContent h2,.BiQ1zG_aboutContent h3,.BiQ1zG_aboutContent h4,.BiQ1zG_aboutContent h5{color:var(--hub-text-primary);margin:10px 0 4px;font-size:13px;font-weight:600;line-height:20px}.BiQ1zG_aboutContent h2{font-size:14px}.BiQ1zG_aboutContent p{margin:4px 0}.BiQ1zG_aboutContent ul,.BiQ1zG_aboutContent ol{margin:4px 0;padding-left:18px}.BiQ1zG_aboutContent li{margin:2px 0}.BiQ1zG_aboutContent code{background:var(--hub-bg-hover);color:var(--hub-text-primary);border-radius:4px;padding:1px 4px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}.BiQ1zG_aboutContent pre{background:var(--hub-bg-1);border:1px solid var(--hub-border-2);border-radius:6px;margin:6px 0;padding:8px 10px;overflow-x:auto}.BiQ1zG_aboutContent pre code{background:0 0;border-radius:0;padding:0}.BiQ1zG_aboutContent blockquote{border-left:3px solid var(--hub-brand);background:var(--hub-bg-hover);color:var(--hub-text-tertiary);border-radius:0 6px 6px 0;margin:6px 0;padding:2px 10px}.BiQ1zG_aboutContent a{color:var(--hub-brand);text-decoration:none}.BiQ1zG_aboutContent a:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_aboutContent img{border-radius:8px;max-width:100%;max-height:220px;margin:8px auto;display:block;box-shadow:0 2px 8px #0000001f}.BiQ1zG_aboutMeta{color:var(--hub-text-tertiary);font-size:11px;line-height:16px}.BiQ1zG_hubUpdateModal{width:520px;max-width:calc(100vw - 48px)}.BiQ1zG_hubUpdateMeta{flex-wrap:wrap;align-items:center;gap:4px 14px;font-size:12px;line-height:18px;display:flex}.BiQ1zG_hubUpdateMetaItem{color:var(--hub-text-tertiary)}.BiQ1zG_hubUpdateNotes{min-height:0;max-height:300px;color:var(--hub-text-secondary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);border-radius:8px;flex:auto;padding:10px 12px;font-size:12px;line-height:18px;overflow-y:auto}.BiQ1zG_hubUpdateNotes>:first-child{margin-top:0}.BiQ1zG_hubUpdateNotes>:last-child{margin-bottom:0}.BiQ1zG_hubUpdateNotes h2,.BiQ1zG_hubUpdateNotes h3,.BiQ1zG_hubUpdateNotes h4,.BiQ1zG_hubUpdateNotes h5{color:var(--hub-text-primary);margin:10px 0 4px;font-size:13px;font-weight:600;line-height:20px}.BiQ1zG_hubUpdateNotes h2{font-size:14px}.BiQ1zG_hubUpdateNotes p{margin:4px 0}.BiQ1zG_hubUpdateNotes ul,.BiQ1zG_hubUpdateNotes ol{margin:4px 0;padding-left:18px}.BiQ1zG_hubUpdateNotes li{margin:2px 0}.BiQ1zG_hubUpdateNotes code{background:var(--hub-bg-hover);color:var(--hub-text-primary);border-radius:4px;padding:1px 4px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}.BiQ1zG_hubUpdateNotes pre{background:var(--hub-bg-1);border:1px solid var(--hub-border-2);border-radius:6px;margin:6px 0;padding:8px 10px;overflow-x:auto}.BiQ1zG_hubUpdateNotes pre code{background:0 0;border-radius:0;padding:0}.BiQ1zG_hubUpdateNotes blockquote{border-left:3px solid var(--hub-brand);background:var(--hub-bg-hover);color:var(--hub-text-tertiary);border-radius:0 6px 6px 0;margin:6px 0;padding:2px 10px}.BiQ1zG_hubUpdateNotes a{color:var(--hub-brand);text-decoration:none}.BiQ1zG_hubUpdateNotes a:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_detailModal{width:480px;max-width:calc(100vw - 48px)}.BiQ1zG_detailUpdateHint{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);border-radius:6px;padding:6px 10px;font-size:12px;line-height:18px}.BiQ1zG_detailGrid{flex-direction:column;gap:6px;display:flex}.BiQ1zG_detailRow{align-items:baseline;gap:10px;min-width:0;font-size:12px;line-height:20px;display:flex}.BiQ1zG_detailLabel{text-align:right;width:76px;color:var(--hub-text-tertiary);flex-shrink:0}.BiQ1zG_detailValue{min-width:0;color:var(--hub-text-primary);flex-wrap:wrap;flex:auto;align-items:baseline;gap:4px 6px;font-weight:500;display:flex}.BiQ1zG_detailMono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;font-weight:500}.BiQ1zG_detailArrow{color:var(--hub-text-tertiary);align-items:baseline;gap:4px;display:inline-flex}.BiQ1zG_detailDim{color:var(--hub-text-tertiary);font-size:11px;font-weight:400}.BiQ1zG_detailLink{min-width:0;color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:4px;font-weight:500;text-decoration:none;transition:color .12s;display:inline-flex}.BiQ1zG_detailLink:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_detailStars{color:#b45309;font-weight:600}.BiQ1zG_detailPath{min-width:0;color:var(--hub-text-primary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);border-radius:6px;flex:auto;justify-content:space-between;align-items:center;gap:6px;padding:3px 3px 3px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:18px;transition:border-color .12s,background .12s;display:flex}.BiQ1zG_detailPath:hover{border-color:var(--hub-border-ghost);background:var(--hub-bg-3)}.BiQ1zG_detailPathText{text-overflow:ellipsis;white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;min-width:0;overflow:hidden}.BiQ1zG_detailPathActions{flex-shrink:0;align-items:center;gap:4px;display:inline-flex}.BiQ1zG_detailPathBtn{width:28px;height:28px;color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;justify-content:center;align-items:center;transition:color .12s,background .12s,border-color .12s;display:inline-flex}.BiQ1zG_detailPathBtn svg{width:15px;height:15px}.BiQ1zG_detailPathBtn:hover{color:#fff;background:var(--hub-brand);border-color:var(--hub-brand)}.BiQ1zG_detailStatusRunning,.BiQ1zG_detailStatusPending{border-radius:50%;flex-shrink:0;align-self:center;width:8px;height:8px}.BiQ1zG_detailStatusRunning{background:var(--hub-success)}.BiQ1zG_detailStatusPending{background:var(--hub-warning)}.BiQ1zG_detailStatusText{font-weight:500}";
2149
- const tagId$10 = "dsh-plugin/Modal.module.css";
2150
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$10) + "]") === null) {
2151
- const tag = document.createElement("style");
2152
- tag.dataset.plugin = "dsh-plugin";
2153
- tag.dataset.pluginCss = tagId$10;
2154
- tag.textContent = css$10;
2155
- document.head.appendChild(tag);
2156
- }
2157
- var Modal_module_css_default = {
2158
- "modal": "BiQ1zG_modal",
2159
- "queueSectionTitle": "BiQ1zG_queueSectionTitle",
2160
- "detailModal": "BiQ1zG_detailModal",
2161
- "cliOnlyHint": "BiQ1zG_cliOnlyHint",
2162
- "pendingRowActions": "BiQ1zG_pendingRowActions",
2163
- "queueRowStatus": "BiQ1zG_queueRowStatus",
2164
- "modalCopy": "BiQ1zG_modalCopy",
2165
- "modalInstall": "BiQ1zG_modalInstall",
2166
- "modalWide": "BiQ1zG_modalWide",
2167
- "hubUpdateNotes": "BiQ1zG_hubUpdateNotes",
2168
- "errorTitle": "BiQ1zG_errorTitle",
2169
- "noticeBadgeIcon": "BiQ1zG_noticeBadgeIcon",
2170
- "modalCmd": "BiQ1zG_modalCmd",
2171
- "noticeVersion": "BiQ1zG_noticeVersion",
2172
- "failKind": "BiQ1zG_failKind",
2173
- "detailValue": "BiQ1zG_detailValue",
2174
- "noticeList": "BiQ1zG_noticeList",
2175
- "modalValue": "BiQ1zG_modalValue",
2176
- "detailMono": "BiQ1zG_detailMono",
2177
- "overlayIn": "BiQ1zG_overlayIn",
2178
- "noticeBadgeOk": "BiQ1zG_noticeBadgeOk",
2179
- "resultCheck": "BiQ1zG_resultCheck",
2180
- "failKindUninstall": "BiQ1zG_failKindUninstall",
2181
- "detailPath": "BiQ1zG_detailPath",
2182
- "restartNowWarning": "BiQ1zG_restartNowWarning",
2183
- "queueRowTarget": "BiQ1zG_queueRowTarget",
2184
- "modalTitle": "BiQ1zG_modalTitle",
2185
- "toast": "BiQ1zG_toast",
2186
- "progressTrack": "BiQ1zG_progressTrack",
2187
- "errorHint": "BiQ1zG_errorHint",
2188
- "detailUpdateHint": "BiQ1zG_detailUpdateHint",
2189
- "detailPathActions": "BiQ1zG_detailPathActions",
2190
- "aboutModal": "BiQ1zG_aboutModal",
2191
- "noticeFoot": "BiQ1zG_noticeFoot",
2192
- "result": "BiQ1zG_result",
2193
- "noticeBadgeFail": "BiQ1zG_noticeBadgeFail",
2194
- "modalIn": "BiQ1zG_modalIn",
2195
- "modalCloseIcon": "BiQ1zG_modalCloseIcon",
2196
- "modalActions": "BiQ1zG_modalActions",
2197
- "errorCopySoft": "BiQ1zG_errorCopySoft",
2198
- "modalCancel": "BiQ1zG_modalCancel",
2199
- "modalDesc": "BiQ1zG_modalDesc",
2200
- "resultCheckIcon": "BiQ1zG_resultCheckIcon",
2201
- "modalTitleQueued": "BiQ1zG_modalTitleQueued",
2202
- "trustHint": "BiQ1zG_trustHint",
2203
- "detailArrow": "BiQ1zG_detailArrow",
2204
- "overlay": "BiQ1zG_overlay",
2205
- "progressFillFail": "BiQ1zG_progressFillFail",
2206
- "noticeRowUpdate": "BiQ1zG_noticeRowUpdate",
2207
- "errorBox": "BiQ1zG_errorBox",
2208
- "queuedHint": "BiQ1zG_queuedHint",
2209
- "restartLater": "BiQ1zG_restartLater",
2210
- "failHead": "BiQ1zG_failHead",
2211
- "failBigIssue": "BiQ1zG_failBigIssue",
2212
- "detailGrid": "BiQ1zG_detailGrid",
2213
- "detailRow": "BiQ1zG_detailRow",
2214
- "progressHead": "BiQ1zG_progressHead",
2215
- "detailStatusRunning": "BiQ1zG_detailStatusRunning",
2216
- "hubUpdateModal": "BiQ1zG_hubUpdateModal",
2217
- "queueRowDesc": "BiQ1zG_queueRowDesc",
2218
- "noticeTime": "BiQ1zG_noticeTime",
2219
- "detailPathText": "BiQ1zG_detailPathText",
2220
- "failEmpty": "BiQ1zG_failEmpty",
2221
- "progress": "BiQ1zG_progress",
2222
- "failRepo": "BiQ1zG_failRepo",
2223
- "aboutMeta": "BiQ1zG_aboutMeta",
2224
- "queueRowTrack": "BiQ1zG_queueRowTrack",
2225
- "noticeMain": "BiQ1zG_noticeMain",
2226
- "detailDim": "BiQ1zG_detailDim",
2227
- "stripCancel": "BiQ1zG_stripCancel",
2228
- "resultTitle": "BiQ1zG_resultTitle",
2229
- "detailLabel": "BiQ1zG_detailLabel",
2230
- "noticeHead": "BiQ1zG_noticeHead",
2231
- "noticeRemove": "BiQ1zG_noticeRemove",
2232
- "failList": "BiQ1zG_failList",
2233
- "queueRow": "BiQ1zG_queueRow",
2234
- "modalCmdCopy": "BiQ1zG_modalCmdCopy",
2235
- "detailStars": "BiQ1zG_detailStars",
2236
- "failKindInstall": "BiQ1zG_failKindInstall",
2237
- "noticeRow": "BiQ1zG_noticeRow",
2238
- "noticeTextFail": "BiQ1zG_noticeTextFail",
2239
- "pendingRowStatus": "BiQ1zG_pendingRowStatus",
2240
- "logModal": "BiQ1zG_logModal",
2241
- "hubUpdateMeta": "BiQ1zG_hubUpdateMeta",
2242
- "modalLink": "BiQ1zG_modalLink",
2243
- "queueSection": "BiQ1zG_queueSection",
2244
- "uninstallConfirm": "BiQ1zG_uninstallConfirm",
2245
- "modalRow": "BiQ1zG_modalRow",
2246
- "detailStatusText": "BiQ1zG_detailStatusText",
2247
- "modalBody": "BiQ1zG_modalBody",
2248
- "progressText": "BiQ1zG_progressText",
2249
- "resultDesc": "BiQ1zG_resultDesc",
2250
- "noticeRowMain": "BiQ1zG_noticeRowMain",
2251
- "modalCmdText": "BiQ1zG_modalCmdText",
2252
- "modalLabel": "BiQ1zG_modalLabel",
2253
- "hubUpdateMetaItem": "BiQ1zG_hubUpdateMetaItem",
2254
- "modalClose": "BiQ1zG_modalClose",
2255
- "resultRestarting": "BiQ1zG_resultRestarting",
2256
- "modalHead": "BiQ1zG_modalHead",
2257
- "linkIcon": "BiQ1zG_linkIcon",
2258
- "toastFail": "BiQ1zG_toastFail",
2259
- "queueRowPct": "BiQ1zG_queueRowPct",
2260
- "progressFill": "BiQ1zG_progressFill",
2261
- "failRow": "BiQ1zG_failRow",
2262
- "failPrepareHint": "BiQ1zG_failPrepareHint",
2263
- "aboutContent": "BiQ1zG_aboutContent",
2264
- "noticeUpdateGo": "BiQ1zG_noticeUpdateGo",
2265
- "noticeTextOk": "BiQ1zG_noticeTextOk",
2266
- "errorModal": "BiQ1zG_errorModal",
2267
- "toastIn": "BiQ1zG_toastIn",
2268
- "detailPathBtn": "BiQ1zG_detailPathBtn",
2269
- "noticeRowOk": "BiQ1zG_noticeRowOk",
2270
- "restartNow": "BiQ1zG_restartNow",
2271
- "modalTitleBusy": "BiQ1zG_modalTitleBusy",
2272
- "failedCopyHint": "BiQ1zG_failedCopyHint",
2273
- "detailStatusPending": "BiQ1zG_detailStatusPending",
2274
- "failCopy": "BiQ1zG_failCopy",
2275
- "detailLink": "BiQ1zG_detailLink",
2276
- "failClear": "BiQ1zG_failClear",
2277
- "queueRowHead": "BiQ1zG_queueRowHead",
2278
- "queueRowBody": "BiQ1zG_queueRowBody"
2279
- };
2280
- //#endregion
2281
2386
  //#region src/client/components/ui/icons.tsx
2282
2387
  /**
2283
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
2388
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
2284
2389
  * Website: https://dsh-plugin.org
2285
2390
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
2286
2391
  *
@@ -2326,6 +2431,32 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2326
2431
  strokeLinejoin: "round"
2327
2432
  }));
2328
2433
  }
2434
+ /** 帮助图标:圆圈 + 问号(stroke 继承 currentColor),自定义安装卡片标题旁的「帮助」按钮用。 */
2435
+ function HelpIcon() {
2436
+ return (0, react.createElement)("svg", {
2437
+ viewBox: "0 0 16 16",
2438
+ width: 13,
2439
+ height: 13,
2440
+ fill: "none",
2441
+ "aria-hidden": "true"
2442
+ }, (0, react.createElement)("circle", {
2443
+ cx: 8,
2444
+ cy: 8,
2445
+ r: 6.3,
2446
+ stroke: "currentColor",
2447
+ strokeWidth: 1.4
2448
+ }), (0, react.createElement)("path", {
2449
+ d: "M6.3 6.5a1.9 1.9 0 1 1 2.7 1.7c-.7.3-1 .8-1 1.4",
2450
+ stroke: "currentColor",
2451
+ strokeWidth: 1.4,
2452
+ strokeLinecap: "round"
2453
+ }), (0, react.createElement)("circle", {
2454
+ cx: 8,
2455
+ cy: 11.6,
2456
+ r: .95,
2457
+ fill: "currentColor"
2458
+ }));
2459
+ }
2329
2460
  /** 品牌 logo 图标:蓝紫渐变圆角方块 + 白色拼图块(2x2 错落),标题左侧的品牌标识。 */
2330
2461
  function LogoIcon() {
2331
2462
  return (0, react.createElement)("svg", {
@@ -2667,7 +2798,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2667
2798
  //#endregion
2668
2799
  //#region src/client/components/modals/ProgressView.tsx
2669
2800
  /**
2670
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
2801
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
2671
2802
  * Website: https://dsh-plugin.org
2672
2803
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
2673
2804
  *
@@ -2685,7 +2816,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2685
2816
  //#endregion
2686
2817
  //#region src/client/components/modals/modals.tsx
2687
2818
  /**
2688
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
2819
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
2689
2820
  * Website: https://dsh-plugin.org
2690
2821
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
2691
2822
  *
@@ -2923,7 +3054,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2923
3054
  //#endregion
2924
3055
  //#region src/client/logic/renderMarkdown.ts
2925
3056
  /**
2926
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3057
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
2927
3058
  * Website: https://dsh-plugin.org
2928
3059
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
2929
3060
  *
@@ -3014,11 +3145,11 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3014
3145
  //#endregion
3015
3146
  //#region src/client/components/modals/AboutModal.tsx
3016
3147
  /**
3017
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3148
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3018
3149
  * Website: https://dsh-plugin.org
3019
3150
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3020
3151
  *
3021
- * 头部「关注我们」弹窗:介绍 DSH-Plugin Hub 的功能定位 + 用户反馈群二维码。
3152
+ * 头部「关注我们」弹窗:介绍 DSH Plugin Hub 的功能定位 + 用户反馈群二维码。
3022
3153
  * 内容以 Markdown 形式由 dsh-update Worker 的 /about 接口下发(key = hub:about),
3023
3154
  * 客户端按接口返回渲染,不内置固定文案。
3024
3155
  * 图片(反馈群二维码)经 renderMarkdown 的 ![](url) 语法嵌入,居中、最大高度受控。
@@ -3055,7 +3186,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3055
3186
  //#endregion
3056
3187
  //#region src/client/components/modals/HubUpdateModal.tsx
3057
3188
  /**
3058
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3189
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3059
3190
  * Website: https://dsh-plugin.org
3060
3191
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3061
3192
  *
@@ -3122,7 +3253,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3122
3253
  //#endregion
3123
3254
  //#region src/client/components/modals/InstalledDetailModal.tsx
3124
3255
  /**
3125
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3256
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3126
3257
  * Website: https://dsh-plugin.org
3127
3258
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3128
3259
  *
@@ -3204,7 +3335,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3204
3335
  //#endregion
3205
3336
  //#region src/client/components/modals/NotificationsModal.tsx
3206
3337
  /**
3207
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3338
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3208
3339
  * Website: https://dsh-plugin.org
3209
3340
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3210
3341
  *
@@ -3246,7 +3377,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3246
3377
  strokeLinecap: "round"
3247
3378
  }));
3248
3379
  }
3249
- function NotificationsModal({ records, tasks, pendingRestarts, t, env, onClose, onCopy, onClear, onRemove, onUpdate, cancelTask, restarting, onRestart }) {
3380
+ function NotificationsModal({ records, tasks, pendingRestarts, t, env, onClose, onCopy, onClear, onRemove, onUpdate, onIgnoreUpdate, cancelTask, restarting, onRestart, resolveRepo }) {
3250
3381
  return (0, react.createElement)("div", {
3251
3382
  className: Modal_module_css_default.overlay,
3252
3383
  onClick: (e) => {
@@ -3298,6 +3429,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3298
3429
  style: { width: `${q.progress}%` }
3299
3430
  })), (0, react.createElement)("span", { className: Modal_module_css_default.queueRowPct }, `${q.progress}%`))))) : null]) : null, records.length === 0 ? (0, react.createElement)("div", { className: Modal_module_css_default.failEmpty }, t("notificationsEmpty")) : (0, react.createElement)("div", { className: Modal_module_css_default.noticeList }, records.map((r) => {
3300
3431
  const isUpdate = r.kind === "update";
3432
+ const shownRepo = resolveRepo ? resolveRepo(r.repo) ?? "" : r.repo;
3301
3433
  return (0, react.createElement)("div", {
3302
3434
  key: r.id,
3303
3435
  className: r.ok ? `${Modal_module_css_default.noticeRow} ${Modal_module_css_default.noticeRowOk}${isUpdate ? ` ${Modal_module_css_default.noticeRowUpdate}` : ""}` : Modal_module_css_default.noticeRow,
@@ -3311,13 +3443,13 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3311
3443
  }, `v${r.version}`) : null, r.repo ? isUpdate ? (0, react.createElement)("span", {
3312
3444
  className: Modal_module_css_default.failRepo,
3313
3445
  title: r.repo
3314
- }, r.repo) : (0, react.createElement)("a", {
3446
+ }, r.repo) : shownRepo ? (0, react.createElement)("a", {
3315
3447
  className: Modal_module_css_default.failRepo,
3316
- href: pluginSiteUrl(r.repo),
3448
+ href: pluginSiteUrl(shownRepo),
3317
3449
  target: "_blank",
3318
3450
  rel: "noopener noreferrer",
3319
- title: r.repo
3320
- }, r.repo) : null, !r.ok && (0, react.createElement)("button", {
3451
+ title: shownRepo
3452
+ }, shownRepo) : null : null, !r.ok && (0, react.createElement)("button", {
3321
3453
  className: Modal_module_css_default.failCopy,
3322
3454
  onClick: () => onCopy(r.message)
3323
3455
  }, t("failCopy")), r.ok ? (0, react.createElement)("span", {
@@ -3329,7 +3461,13 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3329
3461
  e.stopPropagation();
3330
3462
  onUpdate(r.repo);
3331
3463
  }
3332
- }, t("updateNoticeGo")) : null, (0, react.createElement)("button", {
3464
+ }, t("updateNoticeGo")) : null, isUpdate ? (0, react.createElement)("button", {
3465
+ className: Modal_module_css_default.noticeIgnore,
3466
+ onClick: (e) => {
3467
+ e.stopPropagation();
3468
+ onIgnoreUpdate(r.repo, r.version);
3469
+ }
3470
+ }, t("ignoreUpdateRun")) : null, (0, react.createElement)("button", {
3333
3471
  className: Modal_module_css_default.noticeRemove,
3334
3472
  "aria-label": t("removeNotification"),
3335
3473
  title: t("removeNotification"),
@@ -3343,16 +3481,16 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3343
3481
  const v = npmTooLowVersion(r.message);
3344
3482
  return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t(v ? "failNpmTooLowV" : "failNpmTooLow", v ? { v } : void 0));
3345
3483
  }
3346
- if (kind === "pluginPrepare" || kind === "pnpmIgnoredBuild") return (0, react.createElement)("div", null, [(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, kind === "pnpmIgnoredBuild" ? t("failIgnoredBuild") : /\[packaging\]/i.test(r.message) ? t("failPackagingHint") : t("failPrepareHint")), r.repo ? (0, react.createElement)("a", {
3484
+ if (kind === "pluginPrepare" || kind === "pnpmIgnoredBuild") return (0, react.createElement)("div", null, [(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, kind === "pnpmIgnoredBuild" ? t("failIgnoredBuild") : /\[packaging\]/i.test(r.message) ? t("failPackagingHint") : t("failPrepareHint")), r.repo && shownRepo ? (0, react.createElement)("a", {
3347
3485
  className: Modal_module_css_default.failBigIssue,
3348
- href: pluginIssueUrl(r.repo, r.message, env, r.command, r.attempts),
3486
+ href: pluginIssueUrl(shownRepo, r.message, env, r.command, r.attempts),
3349
3487
  target: "_blank",
3350
3488
  rel: "noopener noreferrer",
3351
3489
  title: t("failIssueHint")
3352
3490
  }, t("failIssueBig")) : null]);
3353
- return r.repo ? (0, react.createElement)("a", {
3491
+ return r.repo && shownRepo ? (0, react.createElement)("a", {
3354
3492
  className: Modal_module_css_default.failBigIssue,
3355
- href: pluginIssueUrl(r.repo, r.message, env, r.command, r.attempts),
3493
+ href: pluginIssueUrl(shownRepo, r.message, env, r.command, r.attempts),
3356
3494
  target: "_blank",
3357
3495
  rel: "noopener noreferrer",
3358
3496
  title: t("failIssueHint")
@@ -3372,7 +3510,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3372
3510
  //#endregion
3373
3511
  //#region src/client/components/layout/CatalogHeader.tsx
3374
3512
  /**
3375
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3513
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3376
3514
  * Website: https://dsh-plugin.org
3377
3515
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3378
3516
  *
@@ -3434,7 +3572,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3434
3572
  //#endregion
3435
3573
  //#region src/client/components/layout/CategoryTabs.tsx
3436
3574
  /**
3437
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3575
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3438
3576
  * Website: https://dsh-plugin.org
3439
3577
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3440
3578
  *
@@ -3456,7 +3594,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3456
3594
  //#endregion
3457
3595
  //#region src/client/components/layout/CatalogControls.tsx
3458
3596
  /**
3459
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3597
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3460
3598
  * Website: https://dsh-plugin.org
3461
3599
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3462
3600
  *
@@ -3500,7 +3638,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3500
3638
  }
3501
3639
  //#endregion
3502
3640
  //#region \0dsh-css:src/client/styles/List.module.css.mjs
3503
- const css$9 = "._3XaZHa_body{flex-direction:column;flex:1;min-height:0;display:flex}._3XaZHa_list{flex-direction:column;flex:1;gap:6px;min-height:0;padding:2px 4px 4px 2px;display:flex;overflow-y:auto}._3XaZHa_moreSentinel{flex-shrink:0;height:1px}._3XaZHa_card{border:1px solid var(--hub-border-2);background:var(--hub-bg-1);border-radius:8px;justify-content:space-between;align-items:stretch;gap:12px;padding:9px 12px;transition:border-color .12s,background .12s;display:flex}._3XaZHa_card:hover{border-color:var(--hub-brand);background:var(--hub-bg-2)}._3XaZHa_cardMain{flex-direction:column;gap:4px;min-width:0;display:flex}._3XaZHa_cardHead{align-items:center;gap:6px;min-width:0;display:flex}._3XaZHa_cardTitle{white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:600;line-height:18px;overflow:hidden}._3XaZHa_categoryBadge,._3XaZHa_verified,._3XaZHa_versionBadge,._3XaZHa_updateBadge{border:1px solid #0000;border-radius:4px;flex-shrink:0;padding:0 6px;font-size:10px;line-height:16px}._3XaZHa_categoryBadge{color:var(--hub-brand);border-color:var(--hub-border-ghost)}._3XaZHa_verified{color:var(--hub-success);border-color:var(--hub-success-border)}._3XaZHa_versionBadge{color:var(--hub-text-secondary);border-color:var(--hub-border-input)}._3XaZHa_updateBadge{color:var(--hub-warn);border-color:var(--hub-warn-border);background:var(--hub-warn-tint)}._3XaZHa_desc{color:var(--hub-text-secondary);-webkit-line-clamp:2;-webkit-box-orient:vertical;margin:0;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}._3XaZHa_topics{flex-wrap:wrap;align-items:center;gap:4px;min-width:0;display:flex}._3XaZHa_topic{color:var(--hub-text-tertiary);background:var(--hub-bg-3);white-space:nowrap;border-radius:4px;flex-shrink:0;padding:0 6px;font-size:10px;line-height:16px}._3XaZHa_cardSide{flex-direction:column;flex-shrink:0;justify-content:space-between;align-items:flex-end;gap:6px;display:flex}._3XaZHa_stats{flex-direction:column;align-items:flex-end;gap:1px;display:flex}._3XaZHa_star{color:var(--hub-warn);white-space:nowrap;font-size:11px;line-height:16px}._3XaZHa_fork{color:var(--hub-text-tertiary);white-space:nowrap;font-size:11px;line-height:16px}._3XaZHa_date{color:var(--hub-text-tertiary);white-space:nowrap;font-size:10px;line-height:14px}._3XaZHa_installBtn,._3XaZHa_installBtnCopied,._3XaZHa_installBtnInstalled,._3XaZHa_installBtnUpdate,._3XaZHa_uninstallBtn,._3XaZHa_detailBtn{cursor:pointer;border-radius:6px;padding:2px 10px;font-size:11px;line-height:18px;transition:color .12s,border-color .12s,background .12s}._3XaZHa_installBtnInstalled{color:var(--hub-success);background:var(--hub-success-tint);cursor:default;-webkit-user-select:none;user-select:none;border:none}._3XaZHa_installBtnUpdate{color:#fff;background:var(--hub-warn);-webkit-user-select:none;user-select:none;border:none;font-weight:500}._3XaZHa_installBtnUpdate:hover{background:var(--hub-warn-strong)}._3XaZHa_uninstallBtn{color:var(--hub-danger);background:var(--hub-danger-tint);-webkit-user-select:none;user-select:none;border:none}._3XaZHa_uninstallBtn:hover{color:#fff;background:var(--hub-danger-hover)}._3XaZHa_installBtn{color:var(--hub-text-on-fill);background:var(--hub-btn-fill);-webkit-user-select:none;user-select:none;border:none;font-weight:500}._3XaZHa_installBtn:hover{background:var(--hub-btn-hover)}._3XaZHa_detailBtn{color:var(--hub-text-secondary);-webkit-user-select:none;user-select:none;background:0 0;border:none;align-items:center;text-decoration:none;display:inline-flex}._3XaZHa_detailBtn:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}._3XaZHa_actions{align-items:center;gap:6px;display:flex}._3XaZHa_installBtnCopied{color:var(--hub-success);background:var(--hub-success-tint);-webkit-user-select:none;user-select:none;border:none}._3XaZHa_state{text-align:center;min-height:160px;color:var(--hub-text-tertiary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:24px;font-size:12px;line-height:18px;display:flex}._3XaZHa_stateTitle{color:var(--hub-text-primary);font-size:13px;font-weight:600}._3XaZHa_stateDesc{max-width:420px}._3XaZHa_retryBtn{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;margin-top:4px;padding:4px 12px;font-size:12px;line-height:18px}._3XaZHa_retryBtn:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}._3XaZHa_footer{border-top:1px solid var(--hub-border-1);flex-shrink:0;justify-content:flex-end;align-items:center;gap:8px;padding:6px 4px 0;display:flex}._3XaZHa_footLink{color:var(--hub-brand);white-space:nowrap;-webkit-user-select:none;user-select:none;font-size:11px;line-height:16px;text-decoration:none}._3XaZHa_footLink:hover{text-decoration:underline}";
3641
+ const css$9 = "._3XaZHa_body{flex-direction:column;flex:1;min-height:0;display:flex}._3XaZHa_list{flex-direction:column;flex:1;gap:6px;min-height:0;padding:2px 4px 4px 2px;display:flex;overflow-y:auto}._3XaZHa_moreSentinel{flex-shrink:0;height:1px}._3XaZHa_card{border:1px solid var(--hub-border-2);background:var(--hub-bg-1);border-radius:8px;justify-content:space-between;align-items:stretch;gap:12px;padding:9px 12px;transition:border-color .12s,background .12s;display:flex}._3XaZHa_card:hover{border-color:var(--hub-brand);background:var(--hub-bg-2)}._3XaZHa_cardMain{flex-direction:column;gap:4px;min-width:0;display:flex}._3XaZHa_cardHead{align-items:center;gap:6px;min-width:0;display:flex}._3XaZHa_cardTitle{white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:600;line-height:18px;overflow:hidden}._3XaZHa_categoryBadge,._3XaZHa_verified,._3XaZHa_versionBadge,._3XaZHa_updateBadge{border:1px solid #0000;border-radius:4px;flex-shrink:0;padding:0 6px;font-size:10px;line-height:16px}._3XaZHa_categoryBadge{color:var(--hub-brand);border-color:var(--hub-border-ghost)}._3XaZHa_verified{color:var(--hub-success);border-color:var(--hub-success-border)}._3XaZHa_versionBadge{color:var(--hub-text-secondary);border-color:var(--hub-border-input)}._3XaZHa_updateBadge{color:var(--hub-warn);border-color:var(--hub-warn-border);background:var(--hub-warn-tint)}._3XaZHa_desc{color:var(--hub-text-secondary);-webkit-line-clamp:2;-webkit-box-orient:vertical;margin:0;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}._3XaZHa_topics{flex-wrap:wrap;align-items:center;gap:4px;min-width:0;display:flex}._3XaZHa_topic{color:var(--hub-text-tertiary);background:var(--hub-bg-3);white-space:nowrap;border-radius:4px;flex-shrink:0;padding:0 6px;font-size:10px;line-height:16px}._3XaZHa_cardSide{flex-direction:column;flex-shrink:0;justify-content:space-between;align-items:flex-end;gap:6px;display:flex}._3XaZHa_stats{flex-direction:column;align-items:flex-end;gap:1px;display:flex}._3XaZHa_star{color:var(--hub-warn);white-space:nowrap;font-size:11px;line-height:16px}._3XaZHa_fork{color:var(--hub-text-tertiary);white-space:nowrap;font-size:11px;line-height:16px}._3XaZHa_date{color:var(--hub-text-tertiary);white-space:nowrap;font-size:10px;line-height:14px}._3XaZHa_installBtn,._3XaZHa_installBtnCopied,._3XaZHa_installBtnInstalled,._3XaZHa_installBtnUpdate,._3XaZHa_uninstallBtn,._3XaZHa_detailBtn{cursor:pointer;border-radius:6px;padding:2px 10px;font-size:11px;line-height:18px;transition:color .12s,border-color .12s,background .12s}._3XaZHa_installBtnInstalled{color:var(--hub-success);background:var(--hub-success-tint);cursor:default;-webkit-user-select:none;user-select:none;border:none}._3XaZHa_installBtnUpdate{color:#fff;background:var(--hub-warn);-webkit-user-select:none;user-select:none;border:none;font-weight:500}._3XaZHa_installBtnUpdate:hover{background:var(--hub-warn-strong)}._3XaZHa_uninstallBtn{color:var(--hub-danger);background:var(--hub-danger-tint);-webkit-user-select:none;user-select:none;border:none}._3XaZHa_uninstallBtn:hover{color:#fff;background:var(--hub-danger-hover)}body[data-ds-dark-theme] ._3XaZHa_uninstallBtn{color:#fff;background:var(--hub-danger)}body[data-ds-dark-theme] ._3XaZHa_uninstallBtn:hover{background:var(--hub-danger-hover)}._3XaZHa_installBtn{color:var(--hub-text-on-fill);background:var(--hub-btn-fill);-webkit-user-select:none;user-select:none;border:none;font-weight:500}._3XaZHa_installBtn:hover{background:var(--hub-btn-hover)}._3XaZHa_detailBtn{color:var(--hub-text-secondary);-webkit-user-select:none;user-select:none;background:0 0;border:none;align-items:center;text-decoration:none;display:inline-flex}._3XaZHa_detailBtn:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}._3XaZHa_actions{align-items:center;gap:6px;display:flex}._3XaZHa_installBtnCopied{color:var(--hub-success);background:var(--hub-success-tint);-webkit-user-select:none;user-select:none;border:none}._3XaZHa_state{text-align:center;min-height:160px;color:var(--hub-text-tertiary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:24px;font-size:12px;line-height:18px;display:flex}._3XaZHa_stateTitle{color:var(--hub-text-primary);font-size:13px;font-weight:600}._3XaZHa_stateDesc{max-width:420px}._3XaZHa_retryBtn{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;margin-top:4px;padding:4px 12px;font-size:12px;line-height:18px}._3XaZHa_retryBtn:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}._3XaZHa_footer{border-top:1px solid var(--hub-border-1);flex-shrink:0;justify-content:flex-end;align-items:center;gap:8px;padding:6px 4px 0;display:flex}._3XaZHa_footLink{color:var(--hub-brand);white-space:nowrap;-webkit-user-select:none;user-select:none;font-size:11px;line-height:16px;text-decoration:none}._3XaZHa_footLink:hover{text-decoration:underline}";
3504
3642
  const tagId$9 = "dsh-plugin/List.module.css";
3505
3643
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$9) + "]") === null) {
3506
3644
  const tag = document.createElement("style");
@@ -3510,43 +3648,43 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3510
3648
  document.head.appendChild(tag);
3511
3649
  }
3512
3650
  var List_module_css_default = {
3513
- "installBtnCopied": "_3XaZHa_installBtnCopied",
3514
- "date": "_3XaZHa_date",
3515
- "state": "_3XaZHa_state",
3651
+ "installBtnUpdate": "_3XaZHa_installBtnUpdate",
3516
3652
  "fork": "_3XaZHa_fork",
3517
- "cardHead": "_3XaZHa_cardHead",
3518
- "moreSentinel": "_3XaZHa_moreSentinel",
3653
+ "body": "_3XaZHa_body",
3654
+ "categoryBadge": "_3XaZHa_categoryBadge",
3519
3655
  "desc": "_3XaZHa_desc",
3520
- "footer": "_3XaZHa_footer",
3656
+ "stateTitle": "_3XaZHa_stateTitle",
3521
3657
  "list": "_3XaZHa_list",
3522
- "body": "_3XaZHa_body",
3523
- "card": "_3XaZHa_card",
3524
- "cardTitle": "_3XaZHa_cardTitle",
3525
- "verified": "_3XaZHa_verified",
3526
- "detailBtn": "_3XaZHa_detailBtn",
3527
- "retryBtn": "_3XaZHa_retryBtn",
3528
- "uninstallBtn": "_3XaZHa_uninstallBtn",
3529
- "stateDesc": "_3XaZHa_stateDesc",
3530
- "installBtnUpdate": "_3XaZHa_installBtnUpdate",
3531
3658
  "topic": "_3XaZHa_topic",
3659
+ "footLink": "_3XaZHa_footLink",
3660
+ "state": "_3XaZHa_state",
3661
+ "installBtn": "_3XaZHa_installBtn",
3662
+ "moreSentinel": "_3XaZHa_moreSentinel",
3663
+ "stats": "_3XaZHa_stats",
3532
3664
  "actions": "_3XaZHa_actions",
3665
+ "date": "_3XaZHa_date",
3666
+ "installBtnInstalled": "_3XaZHa_installBtnInstalled",
3667
+ "cardTitle": "_3XaZHa_cardTitle",
3668
+ "stateDesc": "_3XaZHa_stateDesc",
3533
3669
  "cardSide": "_3XaZHa_cardSide",
3534
- "categoryBadge": "_3XaZHa_categoryBadge",
3670
+ "footer": "_3XaZHa_footer",
3671
+ "detailBtn": "_3XaZHa_detailBtn",
3535
3672
  "versionBadge": "_3XaZHa_versionBadge",
3536
- "star": "_3XaZHa_star",
3537
- "footLink": "_3XaZHa_footLink",
3538
- "stateTitle": "_3XaZHa_stateTitle",
3539
3673
  "cardMain": "_3XaZHa_cardMain",
3540
3674
  "topics": "_3XaZHa_topics",
3541
- "stats": "_3XaZHa_stats",
3542
- "installBtnInstalled": "_3XaZHa_installBtnInstalled",
3543
- "installBtn": "_3XaZHa_installBtn",
3544
- "updateBadge": "_3XaZHa_updateBadge"
3675
+ "verified": "_3XaZHa_verified",
3676
+ "installBtnCopied": "_3XaZHa_installBtnCopied",
3677
+ "cardHead": "_3XaZHa_cardHead",
3678
+ "updateBadge": "_3XaZHa_updateBadge",
3679
+ "retryBtn": "_3XaZHa_retryBtn",
3680
+ "card": "_3XaZHa_card",
3681
+ "star": "_3XaZHa_star",
3682
+ "uninstallBtn": "_3XaZHa_uninstallBtn"
3545
3683
  };
3546
3684
  //#endregion
3547
3685
  //#region src/client/hooks/useIncrementalList.ts
3548
3686
  /**
3549
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3687
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3550
3688
  * Website: https://dsh-plugin.org
3551
3689
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3552
3690
  *
@@ -3584,7 +3722,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3584
3722
  //#endregion
3585
3723
  //#region src/client/components/catalog/PluginCard.tsx
3586
3724
  /**
3587
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3725
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3588
3726
  * Website: https://dsh-plugin.org
3589
3727
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3590
3728
  *
@@ -3635,7 +3773,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3635
3773
  //#endregion
3636
3774
  //#region src/client/components/catalog/CatalogList.tsx
3637
3775
  /**
3638
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3776
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3639
3777
  * Website: https://dsh-plugin.org
3640
3778
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3641
3779
  *
@@ -3684,7 +3822,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3684
3822
  //#endregion
3685
3823
  //#region src/client/components/views/MarketView.tsx
3686
3824
  /**
3687
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3825
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3688
3826
  * Website: https://dsh-plugin.org
3689
3827
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3690
3828
  *
@@ -3738,20 +3876,20 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3738
3876
  document.head.appendChild(tag);
3739
3877
  }
3740
3878
  var SectionTabs_module_css_default = {
3879
+ "noticeIcon": "_7tvizq_noticeIcon",
3880
+ "tabIcon": "_7tvizq_tabIcon",
3881
+ "tab": "_7tvizq_tab",
3741
3882
  "tabActive": "_7tvizq_tabActive",
3742
- "tabCount": "_7tvizq_tabCount",
3743
- "noticeBtn": "_7tvizq_noticeBtn",
3744
3883
  "noticeCount": "_7tvizq_noticeCount",
3745
- "root": "_7tvizq_root",
3746
3884
  "tabCountActive": "_7tvizq_tabCountActive",
3747
- "tab": "_7tvizq_tab",
3748
- "tabIcon": "_7tvizq_tabIcon",
3749
- "noticeIcon": "_7tvizq_noticeIcon"
3885
+ "tabCount": "_7tvizq_tabCount",
3886
+ "root": "_7tvizq_root",
3887
+ "noticeBtn": "_7tvizq_noticeBtn"
3750
3888
  };
3751
3889
  //#endregion
3752
3890
  //#region src/client/components/layout/SectionTabs.tsx
3753
3891
  /**
3754
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3892
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3755
3893
  * Website: https://dsh-plugin.org
3756
3894
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3757
3895
  *
@@ -3808,7 +3946,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3808
3946
  }
3809
3947
  //#endregion
3810
3948
  //#region \0dsh-css:src/client/styles/InstalledView.module.css.mjs
3811
- const css$7 = "._1nXeGW_root{flex-direction:column;gap:8px;min-width:0;display:flex}._1nXeGW_toolbar{border-bottom:1px solid var(--hub-border-1);flex-direction:column;flex-shrink:0;gap:8px;padding:0 2px 10px;display:flex}._1nXeGW_searchWrap{width:100%;min-width:0;height:28px}._1nXeGW_searchInput{width:100%;height:28px;color:var(--hub-text-primary);border:1px solid var(--hub-border-2);background:0 0;border-radius:6px;outline:none;padding:0 9px;font-size:12px;line-height:26px;transition:border-color .12s}._1nXeGW_searchInput::placeholder{color:var(--hub-text-tertiary)}._1nXeGW_searchInput:focus{border-color:var(--hub-brand)}._1nXeGW_segRow{align-items:center;gap:8px;min-width:0;display:flex}._1nXeGW_segLabel{color:var(--hub-text-tertiary);flex-shrink:0;font-size:11px;line-height:16px}._1nXeGW_segGroup{border:1px solid var(--hub-border-2);border-radius:6px;flex-shrink:0;align-items:center;display:inline-flex;overflow:hidden}._1nXeGW_segBtn{height:24px;color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;background:0 0;border:none;justify-content:center;align-items:center;gap:4px;padding:0 10px;font-family:inherit;font-size:12px;line-height:24px;transition:color .12s,background .12s;display:inline-flex}._1nXeGW_segBtn svg{flex-shrink:0;display:block}._1nXeGW_segBtn+._1nXeGW_segBtn{border-left:1px solid var(--hub-border-2)}._1nXeGW_segBtn:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}._1nXeGW_segBtnActive,._1nXeGW_segBtnActive:hover{color:#fff;background:var(--hub-brand)}._1nXeGW_empty{color:var(--hub-text-tertiary);text-align:center;border:1px dashed var(--hub-border-2);border-radius:8px;flex-direction:column;align-items:center;gap:4px;padding:36px 12px;font-size:12px;line-height:18px;display:flex}._1nXeGW_emptyTitle{color:var(--hub-text-secondary);font-size:13px;font-weight:600}._1nXeGW_emptyDesc{color:var(--hub-text-tertiary)}._1nXeGW_list{border:1px solid var(--hub-border-1);border-radius:8px;flex-direction:column;margin:0;padding:0;list-style:none;display:flex;overflow:hidden}._1nXeGW_row{background:var(--hub-bg-1);cursor:pointer;-webkit-user-select:none;user-select:none;flex-direction:column;gap:4px;padding:8px 10px;transition:background .12s;display:flex}._1nXeGW_row+._1nXeGW_row{border-top:1px solid var(--hub-border-1)}._1nXeGW_row:hover{background:var(--hub-bg-2)}._1nXeGW_rowTitleLine{align-items:center;gap:8px;min-width:0;display:flex}._1nXeGW_rowDesc{color:var(--hub-text-tertiary);white-space:nowrap;text-overflow:ellipsis;min-width:0;padding-left:16px;font-size:11px;line-height:16px;overflow:hidden}._1nXeGW_statusDot{background:var(--hub-success);border-radius:50%;flex-shrink:0;width:8px;height:8px}._1nXeGW_statusDot._1nXeGW_statusPending{background:var(--hub-warning)}._1nXeGW_statusDot._1nXeGW_statusInactive{background:var(--hub-text-tertiary)}._1nXeGW_rowMain{flex:auto;align-items:baseline;gap:6px;min-width:0;display:flex}._1nXeGW_rowTitle{color:var(--hub-text-primary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-size:12px;font-weight:600;line-height:18px;overflow:hidden}._1nXeGW_versionBadge{color:var(--hub-text-tertiary);background:var(--hub-bg-hover);border-radius:4px;flex-shrink:0;padding:0 5px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:16px}._1nXeGW_updateBadge{color:var(--hub-brand);background:var(--hub-brand-tint-strong);border-radius:4px;flex-shrink:0;padding:0 5px;font-size:11px;font-weight:500;line-height:16px}._1nXeGW_rowSourceTag{box-sizing:border-box;text-align:center;white-space:nowrap;text-overflow:ellipsis;border-radius:4px;flex-shrink:0;width:60px;padding:0 4px;font-size:11px;font-weight:500;line-height:16px;overflow:hidden}._1nXeGW_rowSourceTagHub{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft)}._1nXeGW_rowSourceTagManual{color:var(--hub-warning);background:var(--hub-warning-tint);border:1px solid var(--hub-warning-border)}._1nXeGW_exampleBadge{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);border-radius:4px;flex-shrink:0;padding:0 5px;font-size:11px;font-weight:500;line-height:16px}._1nXeGW_exampleRow{align-items:center;min-width:0;padding-left:16px;display:flex}._1nXeGW_rowMeta{align-items:center;gap:8px;min-width:0;padding-left:16px;display:flex;overflow:hidden}._1nXeGW_rowRepo{color:var(--hub-text-tertiary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:16px;overflow:hidden}._1nXeGW_rowCategory{color:var(--hub-text-tertiary);background:var(--hub-bg-hover);border-radius:4px;flex-shrink:0;padding:0 6px;font-size:11px;line-height:16px}._1nXeGW_rowActions{flex-shrink:0;align-items:center;gap:4px;display:flex}._1nXeGW_rowDetail{color:var(--hub-text-secondary);border:1px solid var(--hub-border-2);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border-radius:6px;padding:2px 10px;font-family:inherit;font-size:12px;line-height:18px;transition:color .12s,background .12s,border-color .12s}._1nXeGW_rowDetail:hover{color:var(--hub-text-primary);border-color:var(--hub-border-ghost);background:var(--hub-bg-hover)}._1nXeGW_rowRestart{color:var(--hub-warning);background:var(--hub-warning-tint);border:1px solid var(--hub-warning-border);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;padding:2px 10px;font-family:inherit;font-size:12px;font-weight:500;line-height:18px;transition:color .12s,background .12s,border-color .12s}._1nXeGW_rowRestart:hover{color:#fff;background:var(--hub-warning);border-color:var(--hub-warning)}._1nXeGW_rowUpdate{color:#fff;background:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:3px 10px;font-family:inherit;font-size:12px;font-weight:500;line-height:18px;transition:background .12s}._1nXeGW_rowUpdate:hover{background:var(--hub-brand-hover)}._1nXeGW_rowUninstall{color:var(--hub-danger);border:1px solid var(--hub-danger-border-soft);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border-radius:6px;padding:2px 10px;font-family:inherit;font-size:12px;line-height:18px;transition:color .12s,background .12s,border-color .12s}._1nXeGW_rowUninstall:hover{color:#fff;background:var(--hub-danger);border-color:var(--hub-danger)}";
3949
+ const css$7 = "._1nXeGW_root{flex-direction:column;gap:8px;min-width:0;display:flex}._1nXeGW_toolbar{border-bottom:1px solid var(--hub-border-1);flex-direction:column;flex-shrink:0;gap:8px;padding:0 2px 10px;display:flex}._1nXeGW_searchWrap{width:100%;min-width:0;height:28px}._1nXeGW_searchInput{width:100%;height:28px;color:var(--hub-text-primary);border:1px solid var(--hub-border-2);background:0 0;border-radius:6px;outline:none;padding:0 9px;font-size:12px;line-height:26px;transition:border-color .12s}._1nXeGW_searchInput::placeholder{color:var(--hub-text-tertiary)}._1nXeGW_searchInput:focus{border-color:var(--hub-brand)}._1nXeGW_segRow{align-items:center;gap:8px;min-width:0;display:flex}._1nXeGW_segLabel{color:var(--hub-text-tertiary);flex-shrink:0;font-size:11px;line-height:16px}._1nXeGW_segGroup{border:1px solid var(--hub-border-2);border-radius:6px;flex-shrink:0;align-items:center;display:inline-flex;overflow:hidden}._1nXeGW_segBtn{height:24px;color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;background:0 0;border:none;justify-content:center;align-items:center;gap:4px;padding:0 10px;font-family:inherit;font-size:12px;line-height:24px;transition:color .12s,background .12s;display:inline-flex}._1nXeGW_segBtn svg{flex-shrink:0;display:block}._1nXeGW_segBtn+._1nXeGW_segBtn{border-left:1px solid var(--hub-border-2)}._1nXeGW_segBtn:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}._1nXeGW_segBtnActive,._1nXeGW_segBtnActive:hover{color:#fff;background:var(--hub-brand)}._1nXeGW_empty{color:var(--hub-text-tertiary);text-align:center;border:1px dashed var(--hub-border-2);border-radius:8px;flex-direction:column;align-items:center;gap:4px;padding:36px 12px;font-size:12px;line-height:18px;display:flex}._1nXeGW_emptyTitle{color:var(--hub-text-secondary);font-size:13px;font-weight:600}._1nXeGW_emptyDesc{color:var(--hub-text-tertiary)}._1nXeGW_list{border:1px solid var(--hub-border-1);border-radius:8px;flex-direction:column;margin:0;padding:0;list-style:none;display:flex;overflow:hidden}._1nXeGW_row{background:var(--hub-bg-1);cursor:pointer;-webkit-user-select:none;user-select:none;flex-direction:column;gap:4px;padding:8px 10px;transition:background .12s;display:flex}._1nXeGW_row+._1nXeGW_row{border-top:1px solid var(--hub-border-1)}._1nXeGW_row:hover{background:var(--hub-bg-2)}._1nXeGW_rowTitleLine{align-items:center;gap:8px;min-width:0;display:flex}._1nXeGW_rowDesc{color:var(--hub-text-tertiary);white-space:nowrap;text-overflow:ellipsis;min-width:0;padding-left:16px;font-size:11px;line-height:16px;overflow:hidden}._1nXeGW_statusDot{background:var(--hub-success);border-radius:50%;flex-shrink:0;width:8px;height:8px}._1nXeGW_statusDot._1nXeGW_statusPending{background:var(--hub-warning)}._1nXeGW_statusDot._1nXeGW_statusInactive{background:var(--hub-text-tertiary)}._1nXeGW_rowMain{flex:auto;align-items:baseline;gap:6px;min-width:0;display:flex}._1nXeGW_rowTitle{color:var(--hub-text-primary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-size:12px;font-weight:600;line-height:18px;overflow:hidden}._1nXeGW_versionBadge{color:var(--hub-text-tertiary);background:var(--hub-bg-hover);border-radius:4px;flex-shrink:0;padding:0 5px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:16px}._1nXeGW_updateBadge{color:var(--hub-warn);background:var(--hub-warn-tint);border:1px solid var(--hub-warn-border);border-radius:4px;flex-shrink:0;padding:0 5px;font-size:11px;font-weight:500;line-height:16px}._1nXeGW_rowSourceTag{box-sizing:border-box;text-align:center;white-space:nowrap;text-overflow:ellipsis;border-radius:4px;flex-shrink:0;width:60px;padding:0 4px;font-size:11px;font-weight:500;line-height:16px;overflow:hidden}._1nXeGW_rowSourceTagHub{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft)}._1nXeGW_rowSourceTagManual{color:var(--hub-warning);background:var(--hub-warning-tint);border:1px solid var(--hub-warning-border)}._1nXeGW_exampleBadge{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);border-radius:4px;flex-shrink:0;padding:0 5px;font-size:11px;font-weight:500;line-height:16px}._1nXeGW_exampleRow{align-items:center;min-width:0;padding-left:16px;display:flex}._1nXeGW_rowMeta{align-items:center;gap:8px;min-width:0;padding-left:16px;display:flex;overflow:hidden}._1nXeGW_rowRepo{color:var(--hub-text-tertiary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:16px;overflow:hidden}._1nXeGW_rowCategory{color:var(--hub-text-tertiary);background:var(--hub-bg-hover);border-radius:4px;flex-shrink:0;padding:0 6px;font-size:11px;line-height:16px}._1nXeGW_rowActions{flex-shrink:0;align-items:center;gap:4px;display:flex}._1nXeGW_rowDetail{color:var(--hub-text-secondary);border:1px solid var(--hub-border-2);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border-radius:6px;padding:2px 10px;font-family:inherit;font-size:12px;line-height:18px;transition:color .12s,background .12s,border-color .12s}._1nXeGW_rowDetail:hover{color:var(--hub-text-primary);border-color:var(--hub-border-ghost);background:var(--hub-bg-hover)}._1nXeGW_rowRestart{color:var(--hub-warning);background:var(--hub-warning-tint);border:1px solid var(--hub-warning-border);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;padding:2px 10px;font-family:inherit;font-size:12px;font-weight:500;line-height:18px;transition:color .12s,background .12s,border-color .12s}._1nXeGW_rowRestart:hover{color:#fff;background:var(--hub-warning);border-color:var(--hub-warning)}._1nXeGW_rowUpdate{color:#fff;background:var(--hub-warn);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:3px 10px;font-family:inherit;font-size:12px;font-weight:500;line-height:18px;transition:background .12s}._1nXeGW_rowUpdate:hover{background:var(--hub-warn-strong)}._1nXeGW_rowUninstall{color:var(--hub-danger);border:1px solid var(--hub-danger-border-soft);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border-radius:6px;padding:2px 10px;font-family:inherit;font-size:12px;line-height:18px;transition:color .12s,background .12s,border-color .12s}._1nXeGW_rowUninstall:hover,body[data-ds-dark-theme] ._1nXeGW_rowUninstall{color:#fff;background:var(--hub-danger);border-color:var(--hub-danger)}body[data-ds-dark-theme] ._1nXeGW_rowUninstall:hover{background:var(--hub-danger-hover);border-color:var(--hub-danger-hover)}";
3812
3950
  const tagId$7 = "dsh-plugin/InstalledView.module.css";
3813
3951
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$7) + "]") === null) {
3814
3952
  const tag = document.createElement("style");
@@ -3818,47 +3956,47 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3818
3956
  document.head.appendChild(tag);
3819
3957
  }
3820
3958
  var InstalledView_module_css_default = {
3821
- "list": "_1nXeGW_list",
3959
+ "statusDot": "_1nXeGW_statusDot",
3960
+ "emptyTitle": "_1nXeGW_emptyTitle",
3961
+ "rowTitleLine": "_1nXeGW_rowTitleLine",
3962
+ "rowMain": "_1nXeGW_rowMain",
3963
+ "rowCategory": "_1nXeGW_rowCategory",
3822
3964
  "rowUpdate": "_1nXeGW_rowUpdate",
3965
+ "rowMeta": "_1nXeGW_rowMeta",
3966
+ "versionBadge": "_1nXeGW_versionBadge",
3967
+ "segLabel": "_1nXeGW_segLabel",
3968
+ "toolbar": "_1nXeGW_toolbar",
3969
+ "segBtn": "_1nXeGW_segBtn",
3970
+ "row": "_1nXeGW_row",
3971
+ "rowSourceTag": "_1nXeGW_rowSourceTag",
3972
+ "rowSourceTagManual": "_1nXeGW_rowSourceTagManual",
3973
+ "list": "_1nXeGW_list",
3974
+ "rowUninstall": "_1nXeGW_rowUninstall",
3975
+ "searchWrap": "_1nXeGW_searchWrap",
3976
+ "segGroup": "_1nXeGW_segGroup",
3977
+ "emptyDesc": "_1nXeGW_emptyDesc",
3823
3978
  "rowSourceTagHub": "_1nXeGW_rowSourceTagHub",
3824
- "rowUninstall": "_1nXeGW_rowUninstall",
3825
- "statusPending": "_1nXeGW_statusPending",
3826
- "versionBadge": "_1nXeGW_versionBadge",
3827
- "searchInput": "_1nXeGW_searchInput",
3828
- "rowRepo": "_1nXeGW_rowRepo",
3979
+ "exampleBadge": "_1nXeGW_exampleBadge",
3829
3980
  "rowActions": "_1nXeGW_rowActions",
3981
+ "statusPending": "_1nXeGW_statusPending",
3982
+ "statusInactive": "_1nXeGW_statusInactive",
3830
3983
  "segRow": "_1nXeGW_segRow",
3831
3984
  "updateBadge": "_1nXeGW_updateBadge",
3832
- "segLabel": "_1nXeGW_segLabel",
3833
- "rowTitleLine": "_1nXeGW_rowTitleLine",
3834
- "rowDesc": "_1nXeGW_rowDesc",
3835
- "rowRestart": "_1nXeGW_rowRestart",
3985
+ "rowRepo": "_1nXeGW_rowRepo",
3986
+ "searchInput": "_1nXeGW_searchInput",
3836
3987
  "rowDetail": "_1nXeGW_rowDetail",
3837
- "emptyTitle": "_1nXeGW_emptyTitle",
3838
- "empty": "_1nXeGW_empty",
3839
- "rowMeta": "_1nXeGW_rowMeta",
3840
- "segGroup": "_1nXeGW_segGroup",
3841
3988
  "rowTitle": "_1nXeGW_rowTitle",
3842
- "exampleBadge": "_1nXeGW_exampleBadge",
3843
- "rowSourceTagManual": "_1nXeGW_rowSourceTagManual",
3844
- "statusDot": "_1nXeGW_statusDot",
3845
- "row": "_1nXeGW_row",
3846
- "searchWrap": "_1nXeGW_searchWrap",
3847
- "root": "_1nXeGW_root",
3848
- "statusInactive": "_1nXeGW_statusInactive",
3849
- "rowMain": "_1nXeGW_rowMain",
3850
- "rowSourceTag": "_1nXeGW_rowSourceTag",
3989
+ "empty": "_1nXeGW_empty",
3851
3990
  "exampleRow": "_1nXeGW_exampleRow",
3852
- "toolbar": "_1nXeGW_toolbar",
3853
- "segBtnActive": "_1nXeGW_segBtnActive",
3854
- "rowCategory": "_1nXeGW_rowCategory",
3855
- "emptyDesc": "_1nXeGW_emptyDesc",
3856
- "segBtn": "_1nXeGW_segBtn"
3991
+ "rowDesc": "_1nXeGW_rowDesc",
3992
+ "root": "_1nXeGW_root",
3993
+ "rowRestart": "_1nXeGW_rowRestart",
3994
+ "segBtnActive": "_1nXeGW_segBtnActive"
3857
3995
  };
3858
3996
  //#endregion
3859
3997
  //#region src/client/components/views/InstalledView.tsx
3860
3998
  /**
3861
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3999
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3862
4000
  * Website: https://dsh-plugin.org
3863
4001
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3864
4002
  *
@@ -4084,7 +4222,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4084
4222
  }
4085
4223
  //#endregion
4086
4224
  //#region \0dsh-css:src/client/styles/CustomInstallView.module.css.mjs
4087
- const css$6 = ".zISxCG_root{flex-direction:column;gap:10px;min-width:0;max-width:560px;display:flex}.zISxCG_desc{color:var(--hub-text-tertiary);margin:0;font-size:12px;line-height:18px}.zISxCG_installCards{flex-direction:column;flex-shrink:0;gap:10px;min-width:0;display:flex}.zISxCG_installCard{background:var(--hub-bg-1);border:1px solid var(--hub-border-1);border-radius:8px;flex-direction:column;gap:8px;min-width:0;padding:10px 12px;display:flex}.zISxCG_installCardHead{align-items:center;min-width:0;display:flex}.zISxCG_installLabel{color:var(--hub-text-primary);font-size:12px;font-weight:600;line-height:18px}.zISxCG_installExample{color:var(--hub-text-tertiary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-size:11px;line-height:16px;overflow:hidden}.zISxCG_installRow{align-items:center;gap:8px;min-width:0;display:flex}.zISxCG_installInput{min-width:0;height:28px;color:var(--hub-text-primary);border:1px solid var(--hub-border-2);background:0 0;border-radius:6px;outline:none;flex:auto;padding:0 9px;font-size:12px;line-height:26px;transition:border-color .12s}.zISxCG_installInput::placeholder{color:var(--hub-text-tertiary)}.zISxCG_installInput:focus{border-color:var(--hub-brand)}.zISxCG_installInputError,.zISxCG_installInputError:focus{border-color:var(--hub-danger-text)}.zISxCG_installBtn{color:#fff;background:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;flex-shrink:0;padding:5px 14px;font-family:inherit;font-size:12px;font-weight:500;line-height:18px;transition:background .12s,opacity .12s}.zISxCG_installBtn:hover{background:var(--hub-brand-hover)}.zISxCG_installBtn:disabled{opacity:.45;cursor:default}.zISxCG_installCardDisabled{opacity:.8}.zISxCG_channelOff{min-width:0;color:var(--hub-warn);background:var(--hub-warn-tint);border:1px solid var(--hub-warn-border);border-radius:6px;justify-content:space-between;align-items:center;gap:8px;padding:6px 9px;font-size:12px;line-height:16px;display:flex}.zISxCG_channelOffText{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.zISxCG_channelOffBtn{color:var(--hub-warn-strong);border:1px solid var(--hub-warn-border);cursor:pointer;white-space:nowrap;background:0 0;border-radius:6px;flex-shrink:0;padding:3px 10px;font-family:inherit;font-size:12px;font-weight:500;line-height:18px;transition:background .12s,color .12s}.zISxCG_channelOffBtn:hover{background:var(--hub-warn-tint);color:var(--hub-warn)}.zISxCG_installError{color:var(--hub-danger-text);background:var(--hub-danger-tint);border:1px solid var(--hub-danger-border);border-radius:6px;padding:5px 8px;font-size:12px;line-height:16px}";
4225
+ const css$6 = ".zISxCG_root{flex-direction:column;gap:10px;min-width:0;max-width:560px;display:flex}.zISxCG_desc{color:var(--hub-text-tertiary);margin:0;font-size:12px;line-height:18px}.zISxCG_installCards{flex-direction:column;flex-shrink:0;gap:10px;min-width:0;display:flex}.zISxCG_installCard{background:var(--hub-bg-1);border:1px solid var(--hub-border-1);border-radius:8px;flex-direction:column;gap:8px;min-width:0;padding:10px 12px;display:flex}.zISxCG_installCardHead{align-items:center;min-width:0;display:flex}.zISxCG_installLabel{color:var(--hub-text-primary);font-size:12px;font-weight:600;line-height:18px}.zISxCG_installHelpBtn{width:18px;height:18px;color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:1px solid #0000;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;margin-left:6px;padding:0;transition:color .12s,background .12s,border-color .12s;display:inline-flex}.zISxCG_installHelpBtn:hover{color:var(--hub-brand);background:var(--hub-brand-tint);border-color:var(--hub-brand-border-soft)}.zISxCG_installExample{color:var(--hub-text-tertiary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-size:11px;line-height:16px;overflow:hidden}.zISxCG_installRow{align-items:center;gap:8px;min-width:0;display:flex}.zISxCG_installInput{min-width:0;height:28px;color:var(--hub-text-primary);border:1px solid var(--hub-border-2);background:0 0;border-radius:6px;outline:none;flex:auto;padding:0 9px;font-size:12px;line-height:26px;transition:border-color .12s}.zISxCG_installInput::placeholder{color:var(--hub-text-tertiary)}.zISxCG_installInput:focus{border-color:var(--hub-brand)}.zISxCG_installInputError,.zISxCG_installInputError:focus{border-color:var(--hub-danger-text)}.zISxCG_installBtn{color:#fff;background:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;flex-shrink:0;padding:5px 14px;font-family:inherit;font-size:12px;font-weight:500;line-height:18px;transition:background .12s,opacity .12s}.zISxCG_installBtn:hover{background:var(--hub-brand-hover)}.zISxCG_installBtn:disabled{opacity:.45;cursor:default}.zISxCG_installCardDisabled{opacity:.8}.zISxCG_channelOff{min-width:0;color:var(--hub-warn);background:var(--hub-warn-tint);border:1px solid var(--hub-warn-border);border-radius:6px;justify-content:space-between;align-items:center;gap:8px;padding:6px 9px;font-size:12px;line-height:16px;display:flex}.zISxCG_channelOffText{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.zISxCG_channelOffBtn{color:var(--hub-warn-strong);border:1px solid var(--hub-warn-border);cursor:pointer;white-space:nowrap;background:0 0;border-radius:6px;flex-shrink:0;padding:3px 10px;font-family:inherit;font-size:12px;font-weight:500;line-height:18px;transition:background .12s,color .12s}.zISxCG_channelOffBtn:hover{background:var(--hub-warn-tint);color:var(--hub-warn)}.zISxCG_installError{color:var(--hub-danger-text);background:var(--hub-danger-tint);border:1px solid var(--hub-danger-border);border-radius:6px;padding:5px 8px;font-size:12px;line-height:16px}.zISxCG_helpBody{flex-direction:column;gap:7px;padding:4px 2px;display:flex}.zISxCG_helpLine{align-items:baseline;gap:12px;min-width:0;font-size:12px;line-height:20px;display:flex}.zISxCG_helpCmd{color:var(--hub-text-primary);white-space:nowrap;flex-shrink:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}.zISxCG_helpNote{min-width:0;color:var(--hub-text-tertiary);font-size:11px}";
4088
4226
  const tagId$6 = "dsh-plugin/CustomInstallView.module.css";
4089
4227
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$6) + "]") === null) {
4090
4228
  const tag = document.createElement("style");
@@ -4094,38 +4232,43 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4094
4232
  document.head.appendChild(tag);
4095
4233
  }
4096
4234
  var CustomInstallView_module_css_default = {
4097
- "installCardDisabled": "zISxCG_installCardDisabled",
4098
- "installCard": "zISxCG_installCard",
4099
- "installLabel": "zISxCG_installLabel",
4235
+ "installCardHead": "zISxCG_installCardHead",
4236
+ "installError": "zISxCG_installError",
4237
+ "helpBody": "zISxCG_helpBody",
4238
+ "helpLine": "zISxCG_helpLine",
4239
+ "root": "zISxCG_root",
4100
4240
  "installExample": "zISxCG_installExample",
4101
- "channelOff": "zISxCG_channelOff",
4102
- "desc": "zISxCG_desc",
4103
- "channelOffText": "zISxCG_channelOffText",
4104
4241
  "installInput": "zISxCG_installInput",
4105
- "installRow": "zISxCG_installRow",
4106
- "installCards": "zISxCG_installCards",
4107
- "root": "zISxCG_root",
4242
+ "channelOffBtn": "zISxCG_channelOffBtn",
4243
+ "helpCmd": "zISxCG_helpCmd",
4244
+ "installHelpBtn": "zISxCG_installHelpBtn",
4245
+ "desc": "zISxCG_desc",
4246
+ "channelOff": "zISxCG_channelOff",
4247
+ "helpNote": "zISxCG_helpNote",
4248
+ "installLabel": "zISxCG_installLabel",
4249
+ "installCardDisabled": "zISxCG_installCardDisabled",
4250
+ "installCard": "zISxCG_installCard",
4108
4251
  "installBtn": "zISxCG_installBtn",
4109
- "installCardHead": "zISxCG_installCardHead",
4252
+ "installRow": "zISxCG_installRow",
4253
+ "channelOffText": "zISxCG_channelOffText",
4110
4254
  "installInputError": "zISxCG_installInputError",
4111
- "channelOffBtn": "zISxCG_channelOffBtn",
4112
- "installError": "zISxCG_installError"
4255
+ "installCards": "zISxCG_installCards"
4113
4256
  };
4114
4257
  //#endregion
4115
4258
  //#region src/client/components/views/CustomInstallView.tsx
4116
4259
  /**
4117
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4260
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4118
4261
  * Website: https://dsh-plugin.org
4119
4262
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
4120
4263
  *
4121
4264
  * Custom install view: a standalone top-level section for manually
4122
4265
  * installing npm packages or GitHub sources outside the catalog. Three
4123
- * installer cards, one per channel — npm package, GitHub source and a raw
4124
- * install command (a `dsh plugin ... add <target>` or the official global
4125
- * `npm install -g <pkgs>`) — each with a placeholder example above the
4126
- * input and its own format check. The cards stay separate so a user never
4127
- * has to guess which format goes where. Finished installs surface in the
4128
- * Installed view, marked as custom.
4266
+ * installer cards, one per channel — npm package (bare name or a full
4267
+ * npm/pnpm install command, including the official global `npm install -g`),
4268
+ * GitHub source and the official `dsh plugin ... add <target>` command —
4269
+ * each with a placeholder example above the input and its own format check.
4270
+ * The cards stay separate so a user never has to guess which format goes
4271
+ * where. Finished installs surface in the Installed view, marked as custom.
4129
4272
  *
4130
4273
  * Pure presentational: owns only the three local input/error states; the
4131
4274
  * actual install (custom source, gated by the security toggles) bubbles up
@@ -4137,35 +4280,76 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4137
4280
  const GITHUB_BARE_RE = /^[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+$/;
4138
4281
  /** npm 包名(含 @scope/pkg) */
4139
4282
  const NPM_PACKAGE_RE = /^(?:@[a-z0-9._-]+\/)?[a-z0-9._-]+$/;
4140
- /** DSH 命令行前缀(`dsh plugin [--profile|-p <p>] add <target>`)—— 提取其中的安装目标;
4141
- * 命令大小写不敏感,支持 `-p` 简写与 `--profile=web` 等号形式,与 server 端 installTargetOf 口径一致。 */
4142
- const DSH_PLUGIN_CMD_RE = /^dsh\s+plugin\s+(?:(?:--profile|-p)(?:=|\s+)\S+\s*)?add\s+(.+)$/i;
4283
+ /** DSH 命令行前缀(官方唯一形式 `dsh plugin --profile <name> add <target>`)—— 提取其中的安装目标。
4284
+ * 官方 CLI(apps/cli/src/args.ts,commander):--profile 为必填长选项(无 -p 简写,省略即报错),
4285
+ * 支持 `--profile=<name>` 等号形式;命令大小写不敏感。与 server 端 installTargetOf 口径一致。 */
4286
+ const DSH_PLUGIN_CMD_RE = /^dsh\s+plugin\s+--profile(?:\s+|=)\S+\s+add\s+(.+)$/i;
4143
4287
  /** npm 全局安装命令(官方 README 格式,如 `npm install -g @deepseek-ai/dsh @deepseek-harness-tui/dsh-tui`)——
4144
4288
  * 提取 -g 之后的包列表;任一包名非法返回 null(交给格式错误提示)。与 server 端 globalNpmPackagesOf 口径一致。 */
4145
4289
  const NPM_GLOBAL_CMD_RE = /^npm\s+(?:install|i)\s+(?:-g|--global)\s+(.+)$/i;
4290
+ /** 常规 npm/pnpm 安装命令(装进当前 profile,如 `npm install lodash`、`pnpm add @scope/pkg`)——
4291
+ * 提取命令后的包列表;包列表在 splitPackages 里逐个校验。 */
4292
+ const NPM_INSTALL_CMD_RE = /^(?:npm\s+(?:install|i)|pnpm\s+(?:add|i|install))\s+(.+)$/i;
4146
4293
  function installTargetOf(raw) {
4147
4294
  const input = raw.trim();
4148
4295
  const match = DSH_PLUGIN_CMD_RE.exec(input);
4149
4296
  return match !== null ? match[1].trim() : input;
4150
4297
  }
4151
- function parseNpmGlobalPackages(raw) {
4152
- const input = raw.trim();
4153
- const match = NPM_GLOBAL_CMD_RE.exec(input);
4154
- if (match === null) return null;
4155
- const packages = match[1].trim().split(/\s+/).filter((p) => p !== "");
4298
+ /** 空格分隔的包列表:逐个按 npm 包名语法校验 + 拒绝以 - 开头的 token(npm 会把 --xxx 当参数而非包名),
4299
+ * 任一非法返回 null(交给格式错误提示)。与 server 端 globalNpmPackagesOf 同口径。 */
4300
+ function splitPackages(raw) {
4301
+ const packages = raw.trim().split(/\s+/).filter((p) => p !== "");
4156
4302
  if (packages.length === 0 || packages.some((p) => !NPM_PACKAGE_RE.test(p) || p.startsWith("-"))) return null;
4157
4303
  return packages;
4158
4304
  }
4305
+ function parseNpmInput(raw) {
4306
+ const input = raw.trim();
4307
+ if (NPM_PACKAGE_RE.test(input)) return {
4308
+ kind: "pkg",
4309
+ target: input
4310
+ };
4311
+ const global = NPM_GLOBAL_CMD_RE.exec(input);
4312
+ if (global !== null) {
4313
+ const pkgs = splitPackages(global[1]);
4314
+ if (pkgs !== null) return {
4315
+ kind: "global",
4316
+ pkgs
4317
+ };
4318
+ return null;
4319
+ }
4320
+ const install = NPM_INSTALL_CMD_RE.exec(input);
4321
+ if (install !== null) {
4322
+ const pkgs = splitPackages(install[1]);
4323
+ if (pkgs !== null && pkgs.length === 1) return {
4324
+ kind: "pkg",
4325
+ target: pkgs[0]
4326
+ };
4327
+ return null;
4328
+ }
4329
+ return null;
4330
+ }
4159
4331
  function isGitHubInput(raw) {
4160
4332
  const input = raw.trim();
4161
4333
  return GITHUB_URL_RE.test(input) || GITHUB_BARE_RE.test(input);
4162
4334
  }
4163
- function isNpmInput(raw) {
4164
- return NPM_PACKAGE_RE.test(raw.trim());
4165
- }
4166
4335
  function isDshCommand(raw) {
4167
4336
  return DSH_PLUGIN_CMD_RE.test(raw.trim());
4168
4337
  }
4338
+ /** 卡片标题旁的「帮助」弹窗:三块卡片各自的标题与格式清单语言包 key。 */
4339
+ const HELP_CARDS = {
4340
+ npm: {
4341
+ titleKey: "npmInstallLabel",
4342
+ contentKey: "npmInstallHelp"
4343
+ },
4344
+ git: {
4345
+ titleKey: "gitInstallLabel",
4346
+ contentKey: "gitInstallHelp"
4347
+ },
4348
+ cmd: {
4349
+ titleKey: "dshCmdLabel",
4350
+ contentKey: "dshCmdHelp"
4351
+ }
4352
+ };
4169
4353
  function CustomInstallView({ t, onInstallCustom, enableNpm, enableGit, enableDsh, onOpenSettings }) {
4170
4354
  /** 自定义安装:NPM 包输入与格式错误('' = 无错误) */
4171
4355
  const [npmQuery, setNpmQuery] = (0, react.useState)("");
@@ -4176,6 +4360,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4176
4360
  /** 自定义安装:DSH 命令输入与格式错误('' = 无错误) */
4177
4361
  const [cmdQuery, setCmdQuery] = (0, react.useState)("");
4178
4362
  const [cmdError, setCmdError] = (0, react.useState)("");
4363
+ /** 卡片标题旁「帮助」弹窗:null = 未打开;'npm' | 'git' | 'cmd' = 打开对应卡片的格式清单 */
4364
+ const [helpFor, setHelpFor] = (0, react.useState)(null);
4179
4365
  /** 通道关闭提示行:开关关掉后替代示例与输入行,引导去设置打开 */
4180
4366
  const channelOffRow = (0, react.createElement)("div", { className: CustomInstallView_module_css_default.channelOff }, (0, react.createElement)("span", { className: CustomInstallView_module_css_default.channelOffText }, t("channelDisabledHint")), (0, react.createElement)("button", {
4181
4367
  type: "button",
@@ -4183,13 +4369,15 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4183
4369
  onClick: onOpenSettings
4184
4370
  }, t("goToSettings")));
4185
4371
  const submitNpm = () => {
4186
- const target = npmQuery.trim();
4187
- if (!target) return;
4188
- if (!isNpmInput(target)) {
4372
+ const raw = npmQuery.trim();
4373
+ if (!raw) return;
4374
+ const parsed = parseNpmInput(raw);
4375
+ if (parsed === null) {
4189
4376
  setNpmError(t("npmInstallInvalid"));
4190
4377
  return;
4191
4378
  }
4192
- onInstallCustom(target);
4379
+ if (parsed.kind === "global") onInstallCustom(raw, { globalNpm: parsed.pkgs });
4380
+ else onInstallCustom(parsed.target);
4193
4381
  setNpmQuery("");
4194
4382
  setNpmError("");
4195
4383
  };
@@ -4207,13 +4395,6 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4207
4395
  const submitCmd = () => {
4208
4396
  const raw = cmdQuery.trim();
4209
4397
  if (!raw) return;
4210
- const globalPkgs = parseNpmGlobalPackages(raw);
4211
- if (globalPkgs !== null) {
4212
- onInstallCustom(raw, { globalNpm: globalPkgs });
4213
- setCmdQuery("");
4214
- setCmdError("");
4215
- return;
4216
- }
4217
4398
  if (!isDshCommand(raw)) {
4218
4399
  setCmdError(t("dshCmdInvalid"));
4219
4400
  return;
@@ -4222,8 +4403,14 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4222
4403
  setCmdQuery("");
4223
4404
  setCmdError("");
4224
4405
  };
4225
- return (0, react.createElement)("div", { className: CustomInstallView_module_css_default.root }, (0, react.createElement)("p", { className: CustomInstallView_module_css_default.desc }, t("customViewDesc")), (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installCards }, (0, react.createElement)("div", { className: enableNpm ? CustomInstallView_module_css_default.installCard : `${CustomInstallView_module_css_default.installCard} ${CustomInstallView_module_css_default.installCardDisabled}` }, (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installCardHead }, (0, react.createElement)("span", { className: CustomInstallView_module_css_default.installLabel }, t("npmInstallLabel"))), !enableNpm ? channelOffRow : [
4226
- (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installExample }, t("npmInstallExample")),
4406
+ return (0, react.createElement)("div", { className: CustomInstallView_module_css_default.root }, (0, react.createElement)("p", { className: CustomInstallView_module_css_default.desc }, t("customViewDesc")), (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installCards }, (0, react.createElement)("div", { className: enableNpm ? CustomInstallView_module_css_default.installCard : `${CustomInstallView_module_css_default.installCard} ${CustomInstallView_module_css_default.installCardDisabled}` }, (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installCardHead }, (0, react.createElement)("span", { className: CustomInstallView_module_css_default.installLabel }, t("npmInstallLabel")), (0, react.createElement)("button", {
4407
+ type: "button",
4408
+ className: CustomInstallView_module_css_default.installHelpBtn,
4409
+ title: t("installHelp"),
4410
+ "aria-label": t("installHelp"),
4411
+ onClick: () => setHelpFor("npm")
4412
+ }, (0, react.createElement)(HelpIcon))), !enableNpm ? channelOffRow : [
4413
+ (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installExample }, t("npmInstallExample"), (0, react.createElement)("br"), t("npmInstallExample2")),
4227
4414
  (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installRow }, (0, react.createElement)("input", {
4228
4415
  className: npmError ? `${CustomInstallView_module_css_default.installInput} ${CustomInstallView_module_css_default.installInputError}` : CustomInstallView_module_css_default.installInput,
4229
4416
  type: "text",
@@ -4244,7 +4431,13 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4244
4431
  onClick: submitNpm
4245
4432
  }, t("installCliBtn"))),
4246
4433
  npmError ? (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installError }, npmError) : null
4247
- ]), (0, react.createElement)("div", { className: enableGit ? CustomInstallView_module_css_default.installCard : `${CustomInstallView_module_css_default.installCard} ${CustomInstallView_module_css_default.installCardDisabled}` }, (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installCardHead }, (0, react.createElement)("span", { className: CustomInstallView_module_css_default.installLabel }, t("gitInstallLabel"))), !enableGit ? channelOffRow : [
4434
+ ]), (0, react.createElement)("div", { className: enableGit ? CustomInstallView_module_css_default.installCard : `${CustomInstallView_module_css_default.installCard} ${CustomInstallView_module_css_default.installCardDisabled}` }, (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installCardHead }, (0, react.createElement)("span", { className: CustomInstallView_module_css_default.installLabel }, t("gitInstallLabel")), (0, react.createElement)("button", {
4435
+ type: "button",
4436
+ className: CustomInstallView_module_css_default.installHelpBtn,
4437
+ title: t("installHelp"),
4438
+ "aria-label": t("installHelp"),
4439
+ onClick: () => setHelpFor("git")
4440
+ }, (0, react.createElement)(HelpIcon))), !enableGit ? channelOffRow : [
4248
4441
  (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installExample }, t("gitInstallExample")),
4249
4442
  (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installRow }, (0, react.createElement)("input", {
4250
4443
  className: gitError ? `${CustomInstallView_module_css_default.installInput} ${CustomInstallView_module_css_default.installInputError}` : CustomInstallView_module_css_default.installInput,
@@ -4266,7 +4459,13 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4266
4459
  onClick: submitGit
4267
4460
  }, t("installCliBtn"))),
4268
4461
  gitError ? (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installError }, gitError) : null
4269
- ]), (0, react.createElement)("div", { className: enableDsh ? CustomInstallView_module_css_default.installCard : `${CustomInstallView_module_css_default.installCard} ${CustomInstallView_module_css_default.installCardDisabled}` }, (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installCardHead }, (0, react.createElement)("span", { className: CustomInstallView_module_css_default.installLabel }, t("dshCmdLabel"))), !enableDsh ? channelOffRow : [
4462
+ ]), (0, react.createElement)("div", { className: enableDsh ? CustomInstallView_module_css_default.installCard : `${CustomInstallView_module_css_default.installCard} ${CustomInstallView_module_css_default.installCardDisabled}` }, (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installCardHead }, (0, react.createElement)("span", { className: CustomInstallView_module_css_default.installLabel }, t("dshCmdLabel")), (0, react.createElement)("button", {
4463
+ type: "button",
4464
+ className: CustomInstallView_module_css_default.installHelpBtn,
4465
+ title: t("installHelp"),
4466
+ "aria-label": t("installHelp"),
4467
+ onClick: () => setHelpFor("cmd")
4468
+ }, (0, react.createElement)(HelpIcon))), !enableDsh ? channelOffRow : [
4270
4469
  (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installExample }, t("dshCmdExample")),
4271
4470
  (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installRow }, (0, react.createElement)("input", {
4272
4471
  className: cmdError ? `${CustomInstallView_module_css_default.installInput} ${CustomInstallView_module_css_default.installInputError}` : CustomInstallView_module_css_default.installInput,
@@ -4288,7 +4487,26 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4288
4487
  onClick: submitCmd
4289
4488
  }, t("installCliBtn"))),
4290
4489
  cmdError ? (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installError }, cmdError) : null
4291
- ])));
4490
+ ])), helpFor !== null ? (0, react.createElement)("div", {
4491
+ className: Modal_module_css_default.overlay,
4492
+ onClick: (e) => {
4493
+ if (e.target === e.currentTarget) setHelpFor(null);
4494
+ }
4495
+ }, (0, react.createElement)("div", {
4496
+ className: `${Modal_module_css_default.errorModal} ${Modal_module_css_default.helpModal}`,
4497
+ role: "dialog",
4498
+ "aria-modal": "true"
4499
+ }, (0, react.createElement)("div", { className: Modal_module_css_default.modalHead }, (0, react.createElement)("div", { className: Modal_module_css_default.modalTitle }, `${t(HELP_CARDS[helpFor].titleKey)} · ${t("helpModalTitle")}`), (0, react.createElement)("button", {
4500
+ className: Modal_module_css_default.modalClose,
4501
+ "aria-label": t("errorClose"),
4502
+ onClick: () => setHelpFor(null)
4503
+ }, (0, react.createElement)(CloseIcon))), (0, react.createElement)("div", { className: Modal_module_css_default.modalBody }, (0, react.createElement)("div", { className: CustomInstallView_module_css_default.helpBody }, t(HELP_CARDS[helpFor].contentKey).split("\n").map((line, i) => {
4504
+ const [cmd, note] = line.split(" ");
4505
+ return (0, react.createElement)("div", {
4506
+ key: i,
4507
+ className: CustomInstallView_module_css_default.helpLine
4508
+ }, cmd !== "" ? (0, react.createElement)("span", { className: CustomInstallView_module_css_default.helpCmd }, cmd) : null, note !== void 0 ? (0, react.createElement)("span", { className: CustomInstallView_module_css_default.helpNote }, note) : null);
4509
+ }))))) : null);
4292
4510
  }
4293
4511
  //#endregion
4294
4512
  //#region \0dsh-css:src/client/styles/SettingsView.module.css.mjs
@@ -4302,26 +4520,26 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4302
4520
  document.head.appendChild(tag);
4303
4521
  }
4304
4522
  var SettingsView_module_css_default = {
4305
- "settingControlStack": "_506LLG_settingControlStack",
4306
- "pageDesc": "_506LLG_pageDesc",
4307
- "navIcon": "_506LLG_navIcon",
4523
+ "settingRow": "_506LLG_settingRow",
4524
+ "textInput": "_506LLG_textInput",
4525
+ "content": "_506LLG_content",
4308
4526
  "navItem": "_506LLG_navItem",
4527
+ "settingControlStack": "_506LLG_settingControlStack",
4528
+ "sidebar": "_506LLG_sidebar",
4529
+ "controlDropdown": "_506LLG_controlDropdown",
4309
4530
  "settingTitle": "_506LLG_settingTitle",
4310
4531
  "settingLabel": "_506LLG_settingLabel",
4311
4532
  "card": "_506LLG_card",
4312
- "textInput": "_506LLG_textInput",
4313
- "navItemActive": "_506LLG_navItemActive",
4314
- "settingControl": "_506LLG_settingControl",
4315
- "settingRowStack": "_506LLG_settingRowStack",
4533
+ "root": "_506LLG_root",
4316
4534
  "pageTitle": "_506LLG_pageTitle",
4317
- "content": "_506LLG_content",
4535
+ "pageDesc": "_506LLG_pageDesc",
4536
+ "navItemActive": "_506LLG_navItemActive",
4318
4537
  "resetBtn": "_506LLG_resetBtn",
4319
- "sidebar": "_506LLG_sidebar",
4320
- "settingRow": "_506LLG_settingRow",
4321
- "controlDropdown": "_506LLG_controlDropdown",
4322
- "root": "_506LLG_root",
4538
+ "settingControl": "_506LLG_settingControl",
4323
4539
  "pageHeader": "_506LLG_pageHeader",
4324
- "settingDesc": "_506LLG_settingDesc"
4540
+ "settingDesc": "_506LLG_settingDesc",
4541
+ "navIcon": "_506LLG_navIcon",
4542
+ "settingRowStack": "_506LLG_settingRowStack"
4325
4543
  };
4326
4544
  //#endregion
4327
4545
  //#region \0dsh-css:src/client/styles/Dropdown.module.css.mjs
@@ -4335,22 +4553,22 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4335
4553
  document.head.appendChild(tag);
4336
4554
  }
4337
4555
  var Dropdown_module_css_default = {
4338
- "dropdownItem": "B_Gxsq_dropdownItem",
4556
+ "dropdownItemLabel": "B_Gxsq_dropdownItemLabel",
4339
4557
  "dropdownLabel": "B_Gxsq_dropdownLabel",
4558
+ "dropdownBtn": "B_Gxsq_dropdownBtn",
4559
+ "dropdownPanel": "B_Gxsq_dropdownPanel",
4560
+ "dropdownArrowOpen": "B_Gxsq_dropdownArrowOpen",
4561
+ "dropdownArrow": "B_Gxsq_dropdownArrow",
4340
4562
  "dropdownItemActive": "B_Gxsq_dropdownItemActive",
4563
+ "dropdownCountActive": "B_Gxsq_dropdownCountActive",
4341
4564
  "dropdownCount": "B_Gxsq_dropdownCount",
4342
- "dropdownPanel": "B_Gxsq_dropdownPanel",
4343
4565
  "dropdown": "B_Gxsq_dropdown",
4344
- "dropdownItemLabel": "B_Gxsq_dropdownItemLabel",
4345
- "dropdownCountActive": "B_Gxsq_dropdownCountActive",
4346
- "dropdownArrow": "B_Gxsq_dropdownArrow",
4347
- "dropdownArrowOpen": "B_Gxsq_dropdownArrowOpen",
4348
- "dropdownBtn": "B_Gxsq_dropdownBtn"
4566
+ "dropdownItem": "B_Gxsq_dropdownItem"
4349
4567
  };
4350
4568
  //#endregion
4351
4569
  //#region src/client/components/ui/Dropdown.tsx
4352
4570
  /**
4353
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4571
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4354
4572
  * Website: https://dsh-plugin.org
4355
4573
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
4356
4574
  *
@@ -4418,14 +4636,14 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4418
4636
  document.head.appendChild(tag);
4419
4637
  }
4420
4638
  var Toggle_module_css_default = {
4639
+ "toggle": "k-cD4G_toggle",
4421
4640
  "toggleOn": "k-cD4G_toggleOn",
4422
- "knob": "k-cD4G_knob",
4423
- "toggle": "k-cD4G_toggle"
4641
+ "knob": "k-cD4G_knob"
4424
4642
  };
4425
4643
  //#endregion
4426
4644
  //#region src/client/components/ui/Toggle.tsx
4427
4645
  /**
4428
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4646
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4429
4647
  * Website: https://dsh-plugin.org
4430
4648
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
4431
4649
  *
@@ -4456,34 +4674,34 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4456
4674
  document.head.appendChild(tag);
4457
4675
  }
4458
4676
  var DiagnosticsView_module_css_default = {
4459
- "name": "k9eRya_name",
4677
+ "badgeRunning": "k9eRya_badgeRunning",
4460
4678
  "meta": "k9eRya_meta",
4461
- "summaryRunning": "k9eRya_summaryRunning",
4462
4679
  "envLabel": "k9eRya_envLabel",
4463
- "envCopyBtn": "k9eRya_envCopyBtn",
4464
- "headHint": "k9eRya_headHint",
4465
- "display": "k9eRya_display",
4466
- "head": "k9eRya_head",
4680
+ "summaryOk": "k9eRya_summaryOk",
4467
4681
  "runBtn": "k9eRya_runBtn",
4682
+ "head": "k9eRya_head",
4468
4683
  "badge": "k9eRya_badge",
4469
- "summary": "k9eRya_summary",
4470
- "summaryFail": "k9eRya_summaryFail",
4684
+ "badgeOk": "k9eRya_badgeOk",
4685
+ "badgeFail": "k9eRya_badgeFail",
4471
4686
  "panel": "k9eRya_panel",
4687
+ "display": "k9eRya_display",
4688
+ "envCopyBtn": "k9eRya_envCopyBtn",
4689
+ "summaryFail": "k9eRya_summaryFail",
4472
4690
  "row": "k9eRya_row",
4473
- "badgeOk": "k9eRya_badgeOk",
4474
- "summaryOk": "k9eRya_summaryOk",
4475
- "diagPulse": "k9eRya_diagPulse",
4476
- "badgeRunning": "k9eRya_badgeRunning",
4691
+ "badgeIdle": "k9eRya_badgeIdle",
4477
4692
  "envRow": "k9eRya_envRow",
4693
+ "envTitle": "k9eRya_envTitle",
4694
+ "diagPulse": "k9eRya_diagPulse",
4695
+ "summary": "k9eRya_summary",
4696
+ "summaryRunning": "k9eRya_summaryRunning",
4478
4697
  "envDesc": "k9eRya_envDesc",
4479
- "badgeFail": "k9eRya_badgeFail",
4480
- "badgeIdle": "k9eRya_badgeIdle",
4481
- "envTitle": "k9eRya_envTitle"
4698
+ "headHint": "k9eRya_headHint",
4699
+ "name": "k9eRya_name"
4482
4700
  };
4483
4701
  //#endregion
4484
4702
  //#region src/client/components/views/DiagnosticsView.tsx
4485
4703
  /**
4486
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4704
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4487
4705
  * Website: https://dsh-plugin.org
4488
4706
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
4489
4707
  *
@@ -4497,7 +4715,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4497
4715
  /** 系统版本文本:提交 Issue 时粘贴到正文,方便作者复现。 */
4498
4716
  function formatEnv(env) {
4499
4717
  return [
4500
- `DSH-Plugin Hub ${PLUGIN_VERSION}`,
4718
+ `DSH Plugin Hub ${PLUGIN_VERSION}`,
4501
4719
  `DSH ${env.dshVersion ?? "unknown"}`,
4502
4720
  `Node ${env.nodeVersion}`,
4503
4721
  `${env.platform} ${env.arch} (${env.release})`,
@@ -4636,61 +4854,61 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4636
4854
  document.head.appendChild(tag);
4637
4855
  }
4638
4856
  var LogsView_module_css_default = {
4639
- "filterChipActive": "_3j77BW_filterChipActive",
4640
- "pathText": "_3j77BW_pathText",
4641
- "actions": "_3j77BW_actions",
4642
- "pathDialogFoot": "_3j77BW_pathDialogFoot",
4857
+ "filterBar": "_3j77BW_filterBar",
4858
+ "pathDialog": "_3j77BW_pathDialog",
4859
+ "search": "_3j77BW_search",
4860
+ "logList": "_3j77BW_logList",
4861
+ "badgeError": "_3j77BW_badgeError",
4862
+ "pathLabel": "_3j77BW_pathLabel",
4863
+ "btnPrimary": "_3j77BW_btnPrimary",
4864
+ "head": "_3j77BW_head",
4643
4865
  "badgeDebug": "_3j77BW_badgeDebug",
4644
- "empty": "_3j77BW_empty",
4645
- "pathDialogDesc": "_3j77BW_pathDialogDesc",
4646
- "catUninstall": "_3j77BW_catUninstall",
4647
4866
  "message": "_3j77BW_message",
4648
- "entry": "_3j77BW_entry",
4649
- "more": "_3j77BW_more",
4650
- "head": "_3j77BW_head",
4867
+ "filterChip": "_3j77BW_filterChip",
4868
+ "pathText": "_3j77BW_pathText",
4869
+ "pathDialogDesc": "_3j77BW_pathDialogDesc",
4870
+ "pathDialogFoot": "_3j77BW_pathDialogFoot",
4871
+ "linkBtn": "_3j77BW_linkBtn",
4651
4872
  "searchInput": "_3j77BW_searchInput",
4652
- "badge": "_3j77BW_badge",
4873
+ "footCount": "_3j77BW_footCount",
4874
+ "catBadge": "_3j77BW_catBadge",
4875
+ "catInstall": "_3j77BW_catInstall",
4876
+ "catUninstall": "_3j77BW_catUninstall",
4653
4877
  "catDiagnostics": "_3j77BW_catDiagnostics",
4654
- "logList": "_3j77BW_logList",
4655
- "badgeWarn": "_3j77BW_badgeWarn",
4656
- "pathDialogHint": "_3j77BW_pathDialogHint",
4657
- "time": "_3j77BW_time",
4658
- "event": "_3j77BW_event",
4659
- "pathDialogReset": "_3j77BW_pathDialogReset",
4660
- "moreEnd": "_3j77BW_moreEnd",
4661
- "foot": "_3j77BW_foot",
4878
+ "footPath": "_3j77BW_footPath",
4879
+ "footFail": "_3j77BW_footFail",
4662
4880
  "badgeSuccess": "_3j77BW_badgeSuccess",
4663
- "catBadge": "_3j77BW_catBadge",
4664
4881
  "footActions": "_3j77BW_footActions",
4665
- "btn": "_3j77BW_btn",
4666
- "btnPrimary": "_3j77BW_btnPrimary",
4667
- "filterChip": "_3j77BW_filterChip",
4668
- "headHint": "_3j77BW_headHint",
4669
- "catInstall": "_3j77BW_catInstall",
4670
- "panel": "_3j77BW_panel",
4671
- "catSettings": "_3j77BW_catSettings",
4672
- "badgeInfo": "_3j77BW_badgeInfo",
4673
- "badgeError": "_3j77BW_badgeError",
4674
- "pathDraft": "_3j77BW_pathDraft",
4675
- "filterBar": "_3j77BW_filterBar",
4882
+ "entry": "_3j77BW_entry",
4883
+ "more": "_3j77BW_more",
4676
4884
  "list": "_3j77BW_list",
4677
- "footFail": "_3j77BW_footFail",
4885
+ "pathRow": "_3j77BW_pathRow",
4886
+ "time": "_3j77BW_time",
4678
4887
  "pathDialogRow": "_3j77BW_pathDialogRow",
4888
+ "pathDialogHint": "_3j77BW_pathDialogHint",
4889
+ "foot": "_3j77BW_foot",
4890
+ "badge": "_3j77BW_badge",
4891
+ "btn": "_3j77BW_btn",
4892
+ "badgeWarn": "_3j77BW_badgeWarn",
4679
4893
  "catUpdate": "_3j77BW_catUpdate",
4680
- "pathDialog": "_3j77BW_pathDialog",
4681
- "previewRow": "_3j77BW_previewRow",
4682
- "pathRow": "_3j77BW_pathRow",
4683
- "linkBtn": "_3j77BW_linkBtn",
4684
- "footPath": "_3j77BW_footPath",
4685
- "pathLabel": "_3j77BW_pathLabel",
4686
- "footCount": "_3j77BW_footCount",
4687
4894
  "catSystem": "_3j77BW_catSystem",
4688
- "search": "_3j77BW_search"
4895
+ "empty": "_3j77BW_empty",
4896
+ "pathDialogReset": "_3j77BW_pathDialogReset",
4897
+ "actions": "_3j77BW_actions",
4898
+ "panel": "_3j77BW_panel",
4899
+ "previewRow": "_3j77BW_previewRow",
4900
+ "event": "_3j77BW_event",
4901
+ "pathDraft": "_3j77BW_pathDraft",
4902
+ "badgeInfo": "_3j77BW_badgeInfo",
4903
+ "headHint": "_3j77BW_headHint",
4904
+ "filterChipActive": "_3j77BW_filterChipActive",
4905
+ "moreEnd": "_3j77BW_moreEnd",
4906
+ "catSettings": "_3j77BW_catSettings"
4689
4907
  };
4690
4908
  //#endregion
4691
4909
  //#region src/client/components/modals/LogsModal.tsx
4692
4910
  /**
4693
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4911
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4694
4912
  * Website: https://dsh-plugin.org
4695
4913
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
4696
4914
  *
@@ -4963,7 +5181,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4963
5181
  //#endregion
4964
5182
  //#region src/client/components/modals/LogsPathModal.tsx
4965
5183
  /**
4966
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
5184
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4967
5185
  * Website: https://dsh-plugin.org
4968
5186
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
4969
5187
  *
@@ -5078,7 +5296,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5078
5296
  //#endregion
5079
5297
  //#region src/client/components/views/LogsView.tsx
5080
5298
  /**
5081
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
5299
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
5082
5300
  * Website: https://dsh-plugin.org
5083
5301
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
5084
5302
  *
@@ -5202,7 +5420,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5202
5420
  //#endregion
5203
5421
  //#region src/client/components/views/SettingsView.tsx
5204
5422
  /**
5205
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
5423
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
5206
5424
  * Website: https://dsh-plugin.org
5207
5425
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
5208
5426
  *
@@ -5418,7 +5636,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5418
5636
  //#endregion
5419
5637
  //#region src/client/components/PluginHubSection.tsx
5420
5638
  /**
5421
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
5639
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
5422
5640
  * Website: https://dsh-plugin.org
5423
5641
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
5424
5642
  *
@@ -5476,6 +5694,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5476
5694
  const [notifications, setNotifications] = (0, react.useState)(() => loadNotifications());
5477
5695
  /** 通知中心弹窗:一级导航「设置」tab 后边的铃铛入口按钮打开 */
5478
5696
  const [showNotifications, setShowNotifications] = (0, react.useState)(false);
5697
+ /** 「忽略本次更新」确认弹窗:{ repo, version };null = 关闭 */
5698
+ const [ignoreTarget, setIgnoreTarget] = (0, react.useState)(null);
5479
5699
  /** 宿主机器环境快照:提交 bug 的 issue 正文附带;取不到为 null(链接少环境段,不阻塞) */
5480
5700
  const [env, setEnv] = (0, react.useState)(null);
5481
5701
  (0, react.useEffect)(() => {
@@ -5515,16 +5735,17 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5515
5735
  }));
5516
5736
  },
5517
5737
  onError: (message, repo, kind, command, attempts) => {
5738
+ const issueRepo = issueRepoOf(repo ?? "", catalog.installedItems, catalog.plugins);
5518
5739
  setErrorMsg({
5519
5740
  message,
5520
- repo,
5741
+ repo: issueRepo,
5521
5742
  kind,
5522
5743
  command,
5523
5744
  attempts
5524
5745
  });
5525
5746
  setNotifications(addFailure({
5526
5747
  kind,
5527
- repo: repo ?? "",
5748
+ repo: issueRepo ?? "",
5528
5749
  message,
5529
5750
  command,
5530
5751
  attempts
@@ -5544,24 +5765,35 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5544
5765
  } : null;
5545
5766
  }
5546
5767
  });
5547
- const startupCheckedRef = (0, react.useRef)(false);
5548
- (0, react.useEffect)(() => {
5549
- if (startupCheckedRef.current) return;
5550
- if (!settingsReady || catalog.plugins === null || catalog.failed) return;
5551
- startupCheckedRef.current = true;
5552
- if (!hubSettings.checkUpdatesOnStart) return;
5768
+ /** 补齐更新提醒:把「当前有更新但通知中心还没有」的插件补写进通知(repo+version 去重)。
5769
+ * 返回本次实际新增的条数(0 = 无可更新或全部已提示过)。启动检查与打开通知中心共用,
5770
+ * 保证通知中心始终反映可更新状态:同一版本只一条、清空/删除后重开恢复、更新完成后消失。 */
5771
+ const syncUpdateNotices = () => {
5553
5772
  const updatable = catalog.installedItems.filter((i) => i.hasUpdate && i.plugin);
5554
- if (updatable.length === 0) return;
5555
- for (const item of updatable) if (item.repo) addUpdateNotice({
5773
+ if (updatable.length === 0) return 0;
5774
+ const known = new Set(loadIgnoredUpdates());
5775
+ for (const r of loadNotifications()) if (r.kind === "update") known.add(`${r.repo}@${r.version ?? ""}`);
5776
+ const fresh = updatable.filter((item) => item.repo !== null && !known.has(`${item.repo}@${item.catalogVersion ?? ""}`));
5777
+ if (fresh.length === 0) return 0;
5778
+ for (const item of fresh) if (item.repo) addUpdateNotice({
5556
5779
  kind: "update",
5557
5780
  repo: item.repo,
5558
5781
  version: item.catalogVersion ?? void 0
5559
5782
  });
5560
5783
  setNotifications(loadNotifications());
5561
- setToast({
5784
+ return fresh.length;
5785
+ };
5786
+ const startupCheckedRef = (0, react.useRef)(false);
5787
+ (0, react.useEffect)(() => {
5788
+ if (startupCheckedRef.current) return;
5789
+ if (!settingsReady || catalog.plugins === null || catalog.failed) return;
5790
+ startupCheckedRef.current = true;
5791
+ if (!hubSettings.checkUpdatesOnStart) return;
5792
+ const added = syncUpdateNotices();
5793
+ if (added > 0) setToast({
5562
5794
  id: Date.now(),
5563
5795
  kind: "updates",
5564
- n: updatable.length
5796
+ n: added
5565
5797
  });
5566
5798
  }, [
5567
5799
  settingsReady,
@@ -5572,7 +5804,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5572
5804
  queue
5573
5805
  ]);
5574
5806
  (0, react.useEffect)(() => {
5575
- if (!confirmPlugin && !confirmCustomTarget && !confirmGlobalNpm && !uninstallPlugin && !uninstallItem && !detailItem && !showHubUpdate && !showAbout && !showNotifications) return;
5807
+ if (!confirmPlugin && !confirmCustomTarget && !confirmGlobalNpm && !uninstallPlugin && !uninstallItem && !detailItem && !showHubUpdate && !showAbout && !showNotifications && !ignoreTarget) return;
5576
5808
  const onKey = (e) => {
5577
5809
  if (e.key === "Escape") {
5578
5810
  setConfirmPlugin(null);
@@ -5585,6 +5817,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5585
5817
  setShowHubUpdate(false);
5586
5818
  setShowAbout(false);
5587
5819
  setShowNotifications(false);
5820
+ setIgnoreTarget(null);
5588
5821
  }
5589
5822
  };
5590
5823
  window.addEventListener("keydown", onKey);
@@ -5597,7 +5830,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5597
5830
  detailItem,
5598
5831
  showHubUpdate,
5599
5832
  showAbout,
5600
- showNotifications
5833
+ showNotifications,
5834
+ ignoreTarget
5601
5835
  ]);
5602
5836
  (0, react.useEffect)(() => {
5603
5837
  if (!toast) return;
@@ -5637,7 +5871,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5637
5871
  const needle = repo.toLowerCase();
5638
5872
  return catalog.installedItems.some((i) => i.repo !== null && i.repo.toLowerCase() === needle || repoFromInstallTarget(i.spec).toLowerCase() === needle);
5639
5873
  }
5640
- return catalog.installedItems.some((i) => i.name === target);
5874
+ const pkg = repo.replace(/@[^@]*$/, "").toLowerCase();
5875
+ return catalog.installedItems.some((i) => i.name.toLowerCase() === pkg) || Object.keys(catalog.installed).some((k) => k.toLowerCase() === pkg);
5641
5876
  };
5642
5877
  /** 弹窗动作一:复制安装命令到剪贴板,引导去终端粘贴执行(npm 通道显示包名命令)。 */
5643
5878
  const copyCommand = async (p) => {
@@ -5711,7 +5946,9 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5711
5946
  statsVerified,
5712
5947
  onToggleLang: toggleLang,
5713
5948
  hubUpdate: catalog.hubHasUpdate,
5714
- onVersionClick: () => setShowHubUpdate(true),
5949
+ onVersionClick: () => {
5950
+ catalog.refreshHub().then(() => setShowHubUpdate(true));
5951
+ },
5715
5952
  onAboutClick: () => setShowAbout(true)
5716
5953
  }), (0, react.createElement)("div", { className: Header_module_css_default.tabsRow }, (0, react.createElement)(SectionTabs, {
5717
5954
  view,
@@ -5719,7 +5956,10 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5719
5956
  installedCount: catalog.installedItems.length,
5720
5957
  t,
5721
5958
  noticeCount: notifications.length + queue.queue.length + queue.pendingRestarts.length,
5722
- onOpenNotifications: () => setShowNotifications(true)
5959
+ onOpenNotifications: () => {
5960
+ if (hubSettings.checkUpdatesOnStart) syncUpdateNotices();
5961
+ setShowNotifications(true);
5962
+ }
5723
5963
  })), view === "market" ? (0, react.createElement)(MarketView, {
5724
5964
  catalog,
5725
5965
  t,
@@ -5800,7 +6040,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5800
6040
  });
5801
6041
  }
5802
6042
  }), showHubUpdate && (0, react.createElement)(HubUpdateModal, {
5803
- info: catalog.hubUpdateInfo ?? { version: "1.2.1" },
6043
+ info: catalog.hubUpdateInfo ?? { version: "1.3.1" },
5804
6044
  lang,
5805
6045
  t,
5806
6046
  hasUpdate: catalog.hubHasUpdate,
@@ -5844,12 +6084,43 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5844
6084
  queue.clearModalTask();
5845
6085
  setConfirmPlugin(plugin);
5846
6086
  },
6087
+ onIgnoreUpdate: (repo, version) => setIgnoreTarget({
6088
+ repo,
6089
+ version
6090
+ }),
5847
6091
  cancelTask: queue.cancelTask,
5848
6092
  restarting,
5849
6093
  onRestart: () => {
5850
6094
  requestRestart();
6095
+ },
6096
+ resolveRepo: (repo) => issueRepoOf(repo, catalog.installedItems, catalog.plugins)
6097
+ }), ignoreTarget && (0, react.createElement)("div", {
6098
+ className: Modal_module_css_default.overlay,
6099
+ onClick: (e) => {
6100
+ if (e.target === e.currentTarget) setIgnoreTarget(null);
6101
+ }
6102
+ }, (0, react.createElement)("div", {
6103
+ className: Modal_module_css_default.modal,
6104
+ role: "dialog",
6105
+ "aria-modal": "true"
6106
+ }, (0, react.createElement)("div", { className: Modal_module_css_default.modalHead }, (0, react.createElement)("div", { className: Modal_module_css_default.modalTitle }, t("ignoreUpdateConfirmTitle")), (0, react.createElement)("button", {
6107
+ className: Modal_module_css_default.modalClose,
6108
+ type: "button",
6109
+ "aria-label": t("errorClose"),
6110
+ onClick: () => setIgnoreTarget(null)
6111
+ }, (0, react.createElement)(CloseIcon))), (0, react.createElement)("div", { className: Modal_module_css_default.modalBody }, (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("ignoreUpdateConfirmDetail")), (0, react.createElement)("div", { className: Modal_module_css_default.modalActions }, (0, react.createElement)("button", {
6112
+ className: Modal_module_css_default.restartLater,
6113
+ type: "button",
6114
+ onClick: () => setIgnoreTarget(null)
6115
+ }, t("confirmCancel")), (0, react.createElement)("button", {
6116
+ className: Modal_module_css_default.restartNow,
6117
+ type: "button",
6118
+ onClick: () => {
6119
+ ignoreUpdate(ignoreTarget.repo, ignoreTarget.version);
6120
+ setNotifications(removeUpdateNotice(ignoreTarget.repo, ignoreTarget.version));
6121
+ setIgnoreTarget(null);
5851
6122
  }
5852
- }), confirmPlugin && (0, react.createElement)(InstallModal, {
6123
+ }, t("ignoreUpdateConfirm")))))), confirmPlugin && (0, react.createElement)(InstallModal, {
5853
6124
  plugin: confirmPlugin,
5854
6125
  done: installDone,
5855
6126
  task: queue.installModalTask,
@@ -6007,7 +6278,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6007
6278
  }
6008
6279
  //#endregion
6009
6280
  //#region \0dsh-css:src/client/styles/tokens.module.css.mjs
6010
- const css = ":root,body[data-ds-dark-theme]{--hub-text-primary:var(--dsw-alias-label-primary,#1f2328);--hub-text-secondary:var(--dsw-alias-label-secondary,#6b7280);--hub-text-tertiary:var(--dsw-alias-label-tertiary,#8b93a1);--hub-text-disabled:var(--dsw-alias-label-disabled,#aab1bd);--hub-text-on-fill:var(--dsw-alias-label-primary-foreground,#fff);--hub-bg-1:var(--dsw-alias-bg-layer-1,#fff);--hub-bg-2:var(--dsw-alias-bg-layer-2,#80808014);--hub-bg-3:#8080801a;--hub-bg-btn:#8080801f;--hub-bg-hover:var(--dsw-alias-interactive-bg-hover,#80808029);--hub-bg-on-fill:#80808038;--hub-border-1:var(--dsw-alias-border-l1,#eceef1);--hub-border-2:var(--dsw-alias-border-l2,#e5e7eb);--hub-border-ghost:var(--dsw-alias-button-ghost-active-border,#4f6ef740);--hub-border-input:var(--dsw-alias-input-border,#6b728040);--hub-brand:var(--dsw-alias-state-business-primary,#4f6ef7);--hub-brand-hover:#3b5bdb;--hub-brand-tint:#4f6ef70f;--hub-brand-tint-strong:#4f6ef71f;--hub-brand-border:#4f6ef759;--hub-brand-border-soft:#4f6ef738;--hub-purple-1:#4f46e5;--hub-purple-2:#7c3aed;--hub-purple-border:#8b5cf68c;--hub-purple-tint:#4f46e514;--hub-purple-shadow:#4f46e547;--hub-purple-shadow-strong:#7c3aed6b;--hub-btn-fill:var(--dsw-alias-button-primary-fill,#1f2328);--hub-btn-hover:var(--dsw-alias-button-primary-hover,#43454a);--hub-success:#16a34a;--hub-success-tint:#16a34a1f;--hub-success-border:#16a34a4d;--hub-warn:var(--dsw-alias-state-warn-primary,#b8860b);--hub-warn-tint:#b8860b14;--hub-warn-border:#b8860b59;--hub-warn-strong:#b8860bd9;--hub-warning:var(--dsw-alias-state-warning-primary,#b45309);--hub-warning-hover:#92400e;--hub-warning-tint:#b4530914;--hub-warning-border:#b453094d;--hub-danger:var(--dsw-alias-state-danger-primary,#d1242f);--hub-danger-hover:var(--dsw-alias-state-danger-hover,#b91c1c);--hub-danger-strong:#b0202a;--hub-danger-text:#e5484d;--hub-danger-tint:#e5484d14;--hub-danger-tint-weak:#e5484d0d;--hub-danger-border:#e5484d59;--hub-danger-border-soft:#e5484d47;--hub-danger-soft:#d1242f14}body[data-ds-dark-theme]{--hub-bg-btn:#ffffff1f;--hub-success:#22c55e;--hub-success-tint:#22c55e29;--hub-success-border:#22c55e59}";
6281
+ const css = ":root,body[data-ds-dark-theme]{--hub-text-primary:var(--dsw-alias-label-primary,#1f2328);--hub-text-secondary:var(--dsw-alias-label-secondary,#6b7280);--hub-text-tertiary:var(--dsw-alias-label-tertiary,#8b93a1);--hub-text-disabled:var(--dsw-alias-label-disabled,#aab1bd);--hub-text-on-fill:var(--dsw-alias-label-primary-foreground,#fff);--hub-bg-1:var(--dsw-alias-bg-layer-1,#fff);--hub-bg-2:var(--dsw-alias-bg-layer-2,#80808014);--hub-bg-3:#8080801a;--hub-bg-btn:#8080801f;--hub-bg-hover:var(--dsw-alias-interactive-bg-hover,#80808029);--hub-bg-on-fill:#80808038;--hub-border-1:var(--dsw-alias-border-l1,#eceef1);--hub-border-2:var(--dsw-alias-border-l2,#e5e7eb);--hub-border-ghost:var(--dsw-alias-button-ghost-active-border,#4f6ef740);--hub-border-input:var(--dsw-alias-input-border,#6b728040);--hub-brand:var(--dsw-alias-state-business-primary,#4f6ef7);--hub-brand-hover:#3b5bdb;--hub-brand-tint:#4f6ef70f;--hub-brand-tint-strong:#4f6ef71f;--hub-brand-border:#4f6ef759;--hub-brand-border-soft:#4f6ef738;--hub-purple-1:#4f46e5;--hub-purple-2:#7c3aed;--hub-purple-border:#8b5cf68c;--hub-purple-tint:#4f46e514;--hub-purple-shadow:#4f46e547;--hub-purple-shadow-strong:#7c3aed6b;--hub-btn-fill:var(--dsw-alias-button-primary-fill,#1f2328);--hub-btn-hover:var(--dsw-alias-button-primary-hover,#43454a);--hub-success:#16a34a;--hub-success-tint:#16a34a1f;--hub-success-border:#16a34a4d;--hub-warn:var(--dsw-alias-state-warn-primary,#b8860b);--hub-warn-tint:#b8860b14;--hub-warn-border:#b8860b59;--hub-warn-strong:#b8860bd9;--hub-warning:var(--dsw-alias-state-warning-primary,#b45309);--hub-warning-hover:#92400e;--hub-warning-tint:#b4530914;--hub-warning-border:#b453094d;--hub-danger:var(--dsw-alias-state-danger-primary,#d1242f);--hub-danger-hover:var(--dsw-alias-state-danger-hover,#b91c1c);--hub-danger-strong:#b0202a;--hub-danger-text:#e5484d;--hub-danger-tint:#e5484d14;--hub-danger-tint-weak:#e5484d0d;--hub-danger-border:#e5484d59;--hub-danger-border-soft:#e5484d47;--hub-danger-soft:#d1242f14}body[data-ds-dark-theme]{--hub-bg-btn:#ffffff1f;--hub-brand:#6b6b76;--hub-brand-hover:#7d7d88;--hub-brand-tint:#ffffff14;--hub-brand-tint-strong:#ffffff21;--hub-brand-border:#ffffff4d;--hub-brand-border-soft:#fff3;--hub-purple-1:#6b6b76;--hub-purple-2:#7d7d88;--hub-purple-border:#ffffff59;--hub-purple-tint:#ffffff14;--hub-purple-shadow:#00000059;--hub-purple-shadow-strong:#00000080;--hub-warn:#6b6b76;--hub-warn-tint:#ffffff14;--hub-warn-border:#ffffff4d;--hub-warn-strong:#7d7d88;--hub-warning:#6b6b76;--hub-warning-hover:#7d7d88;--hub-warning-tint:#ffffff14;--hub-warning-border:#ffffff4d;--hub-success:#9a9aa4;--hub-success-tint:#ffffff1a;--hub-success-border:#ffffff4d}";
6011
6282
  const tagId = "dsh-plugin/tokens.module.css";
6012
6283
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
6013
6284
  const tag = document.createElement("style");
@@ -6019,7 +6290,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6019
6290
  //#endregion
6020
6291
  //#region src/client/index.tsx
6021
6292
  /**
6022
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
6293
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
6023
6294
  * Website: https://dsh-plugin.org
6024
6295
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
6025
6296
  *