dsh-plugin 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/README.en.md +20 -15
  2. package/README.md +21 -16
  3. package/client/client.js +684 -446
  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 +83 -13
  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 +11 -2
  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 +8 -9
  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 +1 -1
  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
- "githubLink": "qikqja_githubLink",
591
- "adBanner": "qikqja_adBanner",
592
- "adArrow": "qikqja_adArrow",
610
+ "copyIcon": "qikqja_copyIcon",
593
611
  "hubUpdateBadge": "qikqja_hubUpdateBadge",
594
- "langBtn": "qikqja_langBtn",
612
+ "adArrow": "qikqja_adArrow",
613
+ "githubLink": "qikqja_githubLink",
614
+ "tagline": "qikqja_tagline",
615
+ "controls": "qikqja_controls",
616
+ "adText": "qikqja_adText",
617
+ "tabCount": "qikqja_tabCount",
595
618
  "tabsRow": "qikqja_tabsRow",
596
- "version": "qikqja_version",
597
- "githubIcon": "qikqja_githubIcon",
598
- "versionBtn": "qikqja_versionBtn",
599
- "taglineLink": "qikqja_taglineLink",
600
- "headerRight": "qikqja_headerRight",
619
+ "logoIcon": "qikqja_logoIcon",
601
620
  "root": "qikqja_root",
602
- "controls": "qikqja_controls",
603
- "resultSeg": "qikqja_resultSeg",
604
- "sortGroup": "qikqja_sortGroup",
605
- "segBtn": "qikqja_segBtn",
606
- "tab": "qikqja_tab",
607
- "adBadge": "qikqja_adBadge",
621
+ "resultCount": "qikqja_resultCount",
622
+ "version": "qikqja_version",
623
+ "segLabel": "qikqja_segLabel",
608
624
  "aboutBtn": "qikqja_aboutBtn",
609
- "header": "qikqja_header",
610
- "tagline": "qikqja_tagline",
625
+ "segBtn": "qikqja_segBtn",
611
626
  "tabs": "qikqja_tabs",
612
- "headerTitleRow": "qikqja_headerTitleRow",
613
- "search": "qikqja_search",
614
- "logoIcon": "qikqja_logoIcon",
627
+ "adBanner": "qikqja_adBanner",
628
+ "segGroup": "qikqja_segGroup",
629
+ "resultSeg": "qikqja_resultSeg",
630
+ "githubIcon": "qikqja_githubIcon",
631
+ "tab": "qikqja_tab",
632
+ "langBtn": "qikqja_langBtn",
615
633
  "brandTitle": "qikqja_brandTitle",
616
- "adText": "qikqja_adText",
634
+ "taglineLink": "qikqja_taglineLink",
635
+ "search": "qikqja_search",
617
636
  "searchRow": "qikqja_searchRow",
618
- "copyIcon": "qikqja_copyIcon",
619
- "tabActive": "qikqja_tabActive",
620
- "title": "qikqja_title",
621
- "segGroup": "qikqja_segGroup",
622
- "segLabel": "qikqja_segLabel",
623
637
  "segBtnActive": "qikqja_segBtnActive",
624
- "resultCount": "qikqja_resultCount",
625
- "tabCount": "qikqja_tabCount"
638
+ "title": "qikqja_title",
639
+ "sortGroup": "qikqja_sortGroup",
640
+ "header": "qikqja_header",
641
+ "tabActive": "qikqja_tabActive",
642
+ "headerRight": "qikqja_headerRight",
643
+ "versionBtn": "qikqja_versionBtn",
644
+ "headerTitleRow": "qikqja_headerTitleRow",
645
+ "adBadge": "qikqja_adBadge"
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
+ "resultDesc": "BiQ1zG_resultDesc",
660
+ "detailLabel": "BiQ1zG_detailLabel",
661
+ "errorModal": "BiQ1zG_errorModal",
662
+ "resultCheckIcon": "BiQ1zG_resultCheckIcon",
663
+ "progressText": "BiQ1zG_progressText",
664
+ "failRepo": "BiQ1zG_failRepo",
665
+ "pendingRowActions": "BiQ1zG_pendingRowActions",
666
+ "detailStatusText": "BiQ1zG_detailStatusText",
667
+ "overlayIn": "BiQ1zG_overlayIn",
668
+ "noticeBadgeFail": "BiQ1zG_noticeBadgeFail",
669
+ "errorHint": "BiQ1zG_errorHint",
670
+ "trustHint": "BiQ1zG_trustHint",
671
+ "stripCancel": "BiQ1zG_stripCancel",
672
+ "noticeHead": "BiQ1zG_noticeHead",
673
+ "queuedHint": "BiQ1zG_queuedHint",
674
+ "modalHead": "BiQ1zG_modalHead",
675
+ "uninstallConfirm": "BiQ1zG_uninstallConfirm",
676
+ "noticeRowUpdate": "BiQ1zG_noticeRowUpdate",
677
+ "aboutContent": "BiQ1zG_aboutContent",
678
+ "modalCmd": "BiQ1zG_modalCmd",
679
+ "aboutMeta": "BiQ1zG_aboutMeta",
680
+ "failCopy": "BiQ1zG_failCopy",
681
+ "queueRowBody": "BiQ1zG_queueRowBody",
682
+ "detailModal": "BiQ1zG_detailModal",
683
+ "modalRow": "BiQ1zG_modalRow",
684
+ "noticeVersion": "BiQ1zG_noticeVersion",
685
+ "failKindUninstall": "BiQ1zG_failKindUninstall",
686
+ "failedCopyHint": "BiQ1zG_failedCopyHint",
687
+ "overlay": "BiQ1zG_overlay",
688
+ "noticeRemove": "BiQ1zG_noticeRemove",
689
+ "hubUpdateMeta": "BiQ1zG_hubUpdateMeta",
690
+ "modalTitle": "BiQ1zG_modalTitle",
691
+ "noticeTextFail": "BiQ1zG_noticeTextFail",
692
+ "logModal": "BiQ1zG_logModal",
693
+ "detailLink": "BiQ1zG_detailLink",
694
+ "helpModal": "BiQ1zG_helpModal",
695
+ "modalValue": "BiQ1zG_modalValue",
696
+ "toastFail": "BiQ1zG_toastFail",
697
+ "detailStatusRunning": "BiQ1zG_detailStatusRunning",
698
+ "restartNow": "BiQ1zG_restartNow",
699
+ "modalTitleQueued": "BiQ1zG_modalTitleQueued",
700
+ "detailStars": "BiQ1zG_detailStars",
701
+ "noticeTime": "BiQ1zG_noticeTime",
702
+ "modalInstall": "BiQ1zG_modalInstall",
703
+ "detailPathBtn": "BiQ1zG_detailPathBtn",
704
+ "resultCheck": "BiQ1zG_resultCheck",
705
+ "queueRowTarget": "BiQ1zG_queueRowTarget",
706
+ "queueRowHead": "BiQ1zG_queueRowHead",
707
+ "progressTrack": "BiQ1zG_progressTrack",
708
+ "progressHead": "BiQ1zG_progressHead",
709
+ "failRow": "BiQ1zG_failRow",
710
+ "detailArrow": "BiQ1zG_detailArrow",
711
+ "result": "BiQ1zG_result",
712
+ "toast": "BiQ1zG_toast",
713
+ "failClear": "BiQ1zG_failClear",
714
+ "detailGrid": "BiQ1zG_detailGrid",
715
+ "detailPathActions": "BiQ1zG_detailPathActions",
716
+ "noticeFoot": "BiQ1zG_noticeFoot",
717
+ "progressFill": "BiQ1zG_progressFill",
718
+ "noticeTextOk": "BiQ1zG_noticeTextOk",
719
+ "cliOnlyHint": "BiQ1zG_cliOnlyHint",
720
+ "resultTitle": "BiQ1zG_resultTitle",
721
+ "noticeBadgeIcon": "BiQ1zG_noticeBadgeIcon",
722
+ "aboutModal": "BiQ1zG_aboutModal",
723
+ "modal": "BiQ1zG_modal",
724
+ "detailRow": "BiQ1zG_detailRow",
725
+ "queueRowDesc": "BiQ1zG_queueRowDesc",
726
+ "errorTitle": "BiQ1zG_errorTitle",
727
+ "failBigIssue": "BiQ1zG_failBigIssue",
728
+ "hubUpdateModal": "BiQ1zG_hubUpdateModal",
729
+ "modalLink": "BiQ1zG_modalLink",
730
+ "modalIn": "BiQ1zG_modalIn",
731
+ "modalActions": "BiQ1zG_modalActions",
732
+ "modalDesc": "BiQ1zG_modalDesc",
733
+ "toastIn": "BiQ1zG_toastIn",
734
+ "modalLabel": "BiQ1zG_modalLabel",
735
+ "errorBox": "BiQ1zG_errorBox",
736
+ "restartNowWarning": "BiQ1zG_restartNowWarning",
737
+ "hubUpdateMetaItem": "BiQ1zG_hubUpdateMetaItem",
738
+ "detailStatusPending": "BiQ1zG_detailStatusPending",
739
+ "modalWide": "BiQ1zG_modalWide",
740
+ "noticeRow": "BiQ1zG_noticeRow",
741
+ "noticeBadgeOk": "BiQ1zG_noticeBadgeOk",
742
+ "linkIcon": "BiQ1zG_linkIcon",
743
+ "failKindInstall": "BiQ1zG_failKindInstall",
744
+ "modalCmdText": "BiQ1zG_modalCmdText",
745
+ "detailUpdateHint": "BiQ1zG_detailUpdateHint",
746
+ "noticeMain": "BiQ1zG_noticeMain",
747
+ "modalCopy": "BiQ1zG_modalCopy",
748
+ "resultRestarting": "BiQ1zG_resultRestarting",
749
+ "modalCancel": "BiQ1zG_modalCancel",
750
+ "noticeUpdateGo": "BiQ1zG_noticeUpdateGo",
751
+ "detailValue": "BiQ1zG_detailValue",
752
+ "queueRowTrack": "BiQ1zG_queueRowTrack",
753
+ "progress": "BiQ1zG_progress",
754
+ "failEmpty": "BiQ1zG_failEmpty",
755
+ "hubUpdateNotes": "BiQ1zG_hubUpdateNotes",
756
+ "modalClose": "BiQ1zG_modalClose",
757
+ "queueRow": "BiQ1zG_queueRow",
758
+ "modalTitleBusy": "BiQ1zG_modalTitleBusy",
759
+ "progressFillFail": "BiQ1zG_progressFillFail",
760
+ "noticeRowMain": "BiQ1zG_noticeRowMain",
761
+ "noticeRowOk": "BiQ1zG_noticeRowOk",
762
+ "modalCloseIcon": "BiQ1zG_modalCloseIcon",
763
+ "detailMono": "BiQ1zG_detailMono",
764
+ "failPrepareHint": "BiQ1zG_failPrepareHint",
765
+ "failKind": "BiQ1zG_failKind",
766
+ "queueRowPct": "BiQ1zG_queueRowPct",
767
+ "queueRowStatus": "BiQ1zG_queueRowStatus",
768
+ "noticeList": "BiQ1zG_noticeList",
769
+ "detailPath": "BiQ1zG_detailPath",
770
+ "modalCmdCopy": "BiQ1zG_modalCmdCopy",
771
+ "modalBody": "BiQ1zG_modalBody",
772
+ "errorCopySoft": "BiQ1zG_errorCopySoft",
773
+ "restartLater": "BiQ1zG_restartLater",
774
+ "queueSection": "BiQ1zG_queueSection",
775
+ "noticeIgnore": "BiQ1zG_noticeIgnore",
776
+ "detailDim": "BiQ1zG_detailDim",
777
+ "detailPathText": "BiQ1zG_detailPathText",
778
+ "pendingRowStatus": "BiQ1zG_pendingRowStatus",
779
+ "failList": "BiQ1zG_failList",
780
+ "queueSectionTitle": "BiQ1zG_queueSectionTitle",
781
+ "failHead": "BiQ1zG_failHead"
626
782
  };
627
783
  //#endregion
628
784
  //#region src/client/logic/install-command.ts
@@ -679,21 +835,20 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
679
835
  /** 插件中心源码仓库:头部右上角 GitHub 图标的跳转地址 */
680
836
  const GITHUB_URL = "https://github.com/dshplugin/dsh-plugin-hub";
681
837
  /**
682
- * Hub 自我更新版本控制中心(接口中心 Pages:api.dsh-plugin.org,原 dsh-update Worker)。
683
- * 发新版后向接口中心管理接口写入最新版本 + Markdown 变更记录(见
684
- * api-center 的 POST /admin/hub),所有已装用户的「可更新」徽标即时出现,
685
- * 不再依赖主站目录数据管道(每日刷新 + 重建站点)。
838
+ * Hub 自我更新版本控制(接口中心 Pages:api.dsh-plugin.org,静态 JSON 发布)。
839
+ * 发新版 = 在 api-center 的 releases/ 写发版记录 + 重新部署,hub.json 随之更新,
840
+ * 所有已装用户的「可更新」徽标即可见,不再依赖主站目录数据管道。
686
841
  * 响应:{ version: string | null, publishedAt: string | null, notes: string | {zh,en} | null }
687
842
  */
688
- const HUB_UPDATE_URL = "https://api.dsh-plugin.org/hub";
689
- /** 接口中心「关注我们」内容接口(同项目 Pages,key = hub:about,Markdown 推送非写死)。 */
690
- const HUB_ABOUT_URL = "https://api.dsh-plugin.org/about";
843
+ const HUB_UPDATE_URL = "https://api.dsh-plugin.org/hub.json";
844
+ /** 接口中心「关注我们」内容(静态 JSON,由 api-center 的 about.md 构建生成,Markdown)。 */
845
+ const HUB_ABOUT_URL = "https://api.dsh-plugin.org/about.json";
691
846
  /**
692
- * 插件当前版本号,供头部标题展示「DSH-Plugin Hub v0.1.1」。
847
+ * 插件当前版本号,供头部标题展示「DSH Plugin Hub v0.1.1」。
693
848
  * tsdown 构建时用 define 把 __PLUGIN_VERSION__ 替换成 package.json 的版本号;
694
849
  * node --test 直接 import 本模块时该标识符不存在,typeof 守卫兜底为空串。
695
850
  */
696
- const PLUGIN_VERSION = "1.2.0";
851
+ const PLUGIN_VERSION = "1.3.0";
697
852
  const CATEGORY_ORDER = [
698
853
  "interface",
699
854
  "session",
@@ -940,10 +1095,17 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
940
1095
  }
941
1096
  //#endregion
942
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
+ }
943
1105
  /** Worker 版本控制中心:最新版本 + Markdown 变更记录;不可用返回 null。 */
944
1106
  async function fetchHubUpdate() {
945
1107
  try {
946
- const res = await fetch(HUB_UPDATE_URL, { cache: "no-store" });
1108
+ const res = await fetch(busted(HUB_UPDATE_URL), { cache: "no-store" });
947
1109
  if (!res.ok) return null;
948
1110
  const data = await res.json();
949
1111
  if (!data) return null;
@@ -961,7 +1123,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
961
1123
  /** Worker「关注我们」内容(平台介绍 + 反馈群二维码,Markdown);未推送返回 null。 */
962
1124
  async function fetchHubAbout() {
963
1125
  try {
964
- const res = await fetch(HUB_ABOUT_URL, { cache: "no-store" });
1126
+ const res = await fetch(busted(HUB_ABOUT_URL), { cache: "no-store" });
965
1127
  if (!res.ok) return null;
966
1128
  const data = await res.json();
967
1129
  if (!data || data.content === null || data.content === void 0) return null;
@@ -1096,7 +1258,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1096
1258
  //#endregion
1097
1259
  //#region src/client/hooks/useCatalog.ts
1098
1260
  /**
1099
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1261
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1100
1262
  * Website: https://dsh-plugin.org
1101
1263
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
1102
1264
  *
@@ -1106,7 +1268,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1106
1268
  * installed-plugin table, and the filter/search/sort/install-status view
1107
1269
  * state, exposing the derived visible list and per-category counts.
1108
1270
  */
1109
- /** 插件市场自身仓库:DSH-Plugin Hub 不显示在目录里(自己不进自己的插件列表) */
1271
+ /** 插件市场自身仓库:DSH Plugin Hub 不显示在目录里(自己不进自己的插件列表) */
1110
1272
  const SELF_REPO = "dshplugin/dsh-plugin-hub";
1111
1273
  /** 市场各排序的默认方向:全部按倒序(Star/Fork 多、更新/收录近的在前) */
1112
1274
  const SORT_DEFAULT_DIR$1 = {
@@ -1138,6 +1300,17 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1138
1300
  setSortDir(SORT_DEFAULT_DIR$1[key]);
1139
1301
  }
1140
1302
  }
1303
+ /**
1304
+ * 强制刷新 Hub 版本与「关注我们」信息:点击头部版本号/徽标时触发。
1305
+ * 挂载期的 useEffect 只在进入/reload 时拉一次,发版后已打开的界面点版本号
1306
+ * 仍显示旧数据;此处重新拉接口中心,最新版本与变更记录点击即见。
1307
+ * 失败静默为 null(弹窗兜底展示当前版本号),与挂载期拉取口径一致。
1308
+ */
1309
+ const refreshHub = async () => {
1310
+ const [info, about] = await Promise.all([fetchHubUpdate(), fetchHubAbout()]);
1311
+ setHubUpdateInfo(info);
1312
+ setHubAboutInfo(about);
1313
+ };
1141
1314
  /** 当前 profile 已安装插件:npm 包名 -> manifest spec(来自宿主本地路由) */
1142
1315
  const [installed, setInstalled] = (0, react.useState)({});
1143
1316
  /** 安装时记录的目录信号:repo(小写) -> { version, updatedAt }(来自宿主本地路由);
@@ -1237,7 +1410,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1237
1410
  */
1238
1411
  const hubHasUpdate = (() => {
1239
1412
  if (!hubUpdateInfo) return false;
1240
- return hubUpdateInfo.version !== "1.2.0";
1413
+ return hubUpdateInfo.version !== "1.3.0";
1241
1414
  })();
1242
1415
  (0, react.useMemo)(() => {
1243
1416
  if (!plugins) return [];
@@ -1287,6 +1460,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1287
1460
  hubHasUpdate,
1288
1461
  hubUpdateInfo,
1289
1462
  hubAboutInfo,
1463
+ refreshHub,
1290
1464
  refreshInstalled,
1291
1465
  category,
1292
1466
  setCategory,
@@ -1356,14 +1530,50 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1356
1530
  message: ""
1357
1531
  });
1358
1532
  }
1359
- /** 记录一条「发现新版本」更新提醒:成功类轻量记录,携带目录新版本号供通知中心展示。 */
1533
+ /** 记录一条「发现新版本」更新提醒:成功类轻量记录,携带目录新版本号供通知中心展示。
1534
+ * 同一插件同一新版本已在通知中心时跳过:宿主重载会重新触发启动检查,不更新时
1535
+ * 通知里已有的提醒保持单条,不重复追加。 */
1360
1536
  function addUpdateNotice(record) {
1537
+ const prev = loadNotifications();
1538
+ if (prev.some((r) => r.kind === "update" && r.repo === record.repo && (r.version ?? void 0) === (record.version ?? void 0))) return prev;
1361
1539
  return addNotification({
1362
1540
  ...record,
1363
1541
  ok: true,
1364
1542
  message: ""
1365
1543
  });
1366
1544
  }
1545
+ /** 已忽略的更新提醒持久化 key:`owner/repo@version` 字符串数组。 */
1546
+ const IGNORE_KEY = "gro.ngilp-hsd.ignored-updates";
1547
+ /** 读取已忽略的更新提醒(`owner/repo@version` 字符串集合);损坏/不可用时返回空集合。 */
1548
+ function loadIgnoredUpdates() {
1549
+ try {
1550
+ const raw = storage()?.getItem(IGNORE_KEY);
1551
+ if (!raw) return /* @__PURE__ */ new Set();
1552
+ const list = JSON.parse(raw);
1553
+ if (!Array.isArray(list)) return /* @__PURE__ */ new Set();
1554
+ return new Set(list.filter((x) => typeof x === "string"));
1555
+ } catch {
1556
+ return /* @__PURE__ */ new Set();
1557
+ }
1558
+ }
1559
+ function saveIgnoredUpdates(ignored) {
1560
+ try {
1561
+ storage()?.setItem(IGNORE_KEY, JSON.stringify([...ignored]));
1562
+ } catch {}
1563
+ }
1564
+ /** 忽略某插件本次更新(repo+version 持久化入忽略集):本次版本不再提醒,直到下一个新版本发布。 */
1565
+ function ignoreUpdate(repo, version) {
1566
+ const next = loadIgnoredUpdates();
1567
+ next.add(`${repo}@${version ?? ""}`);
1568
+ saveIgnoredUpdates(next);
1569
+ return next;
1570
+ }
1571
+ /** 移除某插件某版本的更新提醒记录(忽略本次更新时一并清理通知),返回更新后的列表。 */
1572
+ function removeUpdateNotice(repo, version) {
1573
+ const next = loadNotifications().filter((r) => !(r.kind === "update" && r.repo === repo && (r.version ?? void 0) === (version ?? void 0)));
1574
+ save(next);
1575
+ return next;
1576
+ }
1367
1577
  /** 清空全部通知记录,返回空列表。 */
1368
1578
  function clearNotifications() {
1369
1579
  save([]);
@@ -1484,7 +1694,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1484
1694
  `- Cause: ${reason}`,
1485
1695
  ...code ? [`- Key error: \`${code}\``] : [],
1486
1696
  "",
1487
- `## [DSH-Plugin 插件中心](${SITE_URL}) · 安装 Plugin 失败错误信息`,
1697
+ `## [DSH Plugin 插件中心](${SITE_URL}) · 安装 Plugin 失败错误信息`,
1488
1698
  `本错误信息由 [dsh-plugin-hub](${GITHUB_URL}) 插件中心的安装程序自动生成,随本次安装失败一并提交。`,
1489
1699
  `- 实际执行的安装命令:\`${command ?? `dsh plugin${env?.profile ? ` --profile ${env.profile}` : ""} add git+https://github.com/${repo}.git`}\``,
1490
1700
  `- 执行结果:安装失败,未能安装该插件。`,
@@ -1539,7 +1749,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1539
1749
  //#endregion
1540
1750
  //#region src/client/hooks/useLanguage.ts
1541
1751
  /**
1542
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1752
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1543
1753
  * Website: https://dsh-plugin.org
1544
1754
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
1545
1755
  *
@@ -1570,7 +1780,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1570
1780
  //#endregion
1571
1781
  //#region src/client/hooks/useSettings.ts
1572
1782
  /**
1573
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1783
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1574
1784
  * Website: https://dsh-plugin.org
1575
1785
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
1576
1786
  *
@@ -1646,7 +1856,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1646
1856
  //#endregion
1647
1857
  //#region src/client/hooks/useTaskQueue.ts
1648
1858
  /**
1649
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1859
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1650
1860
  * Website: https://dsh-plugin.org
1651
1861
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
1652
1862
  *
@@ -2145,143 +2355,9 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2145
2355
  };
2146
2356
  }
2147
2357
  //#endregion
2148
- //#region \0dsh-css:src/client/styles/Modal.module.css.mjs
2149
- 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}";
2150
- const tagId$10 = "dsh-plugin/Modal.module.css";
2151
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$10) + "]") === null) {
2152
- const tag = document.createElement("style");
2153
- tag.dataset.plugin = "dsh-plugin";
2154
- tag.dataset.pluginCss = tagId$10;
2155
- tag.textContent = css$10;
2156
- document.head.appendChild(tag);
2157
- }
2158
- var Modal_module_css_default = {
2159
- "noticeBadgeIcon": "BiQ1zG_noticeBadgeIcon",
2160
- "pendingRowStatus": "BiQ1zG_pendingRowStatus",
2161
- "modalLabel": "BiQ1zG_modalLabel",
2162
- "modalRow": "BiQ1zG_modalRow",
2163
- "overlayIn": "BiQ1zG_overlayIn",
2164
- "detailGrid": "BiQ1zG_detailGrid",
2165
- "detailPathText": "BiQ1zG_detailPathText",
2166
- "detailMono": "BiQ1zG_detailMono",
2167
- "noticeTextFail": "BiQ1zG_noticeTextFail",
2168
- "modalTitleBusy": "BiQ1zG_modalTitleBusy",
2169
- "modalValue": "BiQ1zG_modalValue",
2170
- "queueRowPct": "BiQ1zG_queueRowPct",
2171
- "hubUpdateMetaItem": "BiQ1zG_hubUpdateMetaItem",
2172
- "detailStatusPending": "BiQ1zG_detailStatusPending",
2173
- "modalInstall": "BiQ1zG_modalInstall",
2174
- "toastIn": "BiQ1zG_toastIn",
2175
- "modalIn": "BiQ1zG_modalIn",
2176
- "noticeTextOk": "BiQ1zG_noticeTextOk",
2177
- "linkIcon": "BiQ1zG_linkIcon",
2178
- "restartLater": "BiQ1zG_restartLater",
2179
- "noticeUpdateGo": "BiQ1zG_noticeUpdateGo",
2180
- "toast": "BiQ1zG_toast",
2181
- "detailDim": "BiQ1zG_detailDim",
2182
- "modalTitle": "BiQ1zG_modalTitle",
2183
- "progressFillFail": "BiQ1zG_progressFillFail",
2184
- "noticeRowMain": "BiQ1zG_noticeRowMain",
2185
- "noticeHead": "BiQ1zG_noticeHead",
2186
- "failList": "BiQ1zG_failList",
2187
- "noticeBadgeFail": "BiQ1zG_noticeBadgeFail",
2188
- "failEmpty": "BiQ1zG_failEmpty",
2189
- "noticeRemove": "BiQ1zG_noticeRemove",
2190
- "noticeRow": "BiQ1zG_noticeRow",
2191
- "detailPathActions": "BiQ1zG_detailPathActions",
2192
- "progress": "BiQ1zG_progress",
2193
- "failKind": "BiQ1zG_failKind",
2194
- "resultCheckIcon": "BiQ1zG_resultCheckIcon",
2195
- "noticeRowOk": "BiQ1zG_noticeRowOk",
2196
- "failCopy": "BiQ1zG_failCopy",
2197
- "overlay": "BiQ1zG_overlay",
2198
- "logModal": "BiQ1zG_logModal",
2199
- "progressHead": "BiQ1zG_progressHead",
2200
- "hubUpdateMeta": "BiQ1zG_hubUpdateMeta",
2201
- "detailLink": "BiQ1zG_detailLink",
2202
- "progressText": "BiQ1zG_progressText",
2203
- "errorModal": "BiQ1zG_errorModal",
2204
- "restartNowWarning": "BiQ1zG_restartNowWarning",
2205
- "errorHint": "BiQ1zG_errorHint",
2206
- "modalCmdText": "BiQ1zG_modalCmdText",
2207
- "queueSectionTitle": "BiQ1zG_queueSectionTitle",
2208
- "detailArrow": "BiQ1zG_detailArrow",
2209
- "queueRowBody": "BiQ1zG_queueRowBody",
2210
- "errorCopySoft": "BiQ1zG_errorCopySoft",
2211
- "modalWide": "BiQ1zG_modalWide",
2212
- "modalClose": "BiQ1zG_modalClose",
2213
- "uninstallConfirm": "BiQ1zG_uninstallConfirm",
2214
- "progressFill": "BiQ1zG_progressFill",
2215
- "noticeMain": "BiQ1zG_noticeMain",
2216
- "detailPathBtn": "BiQ1zG_detailPathBtn",
2217
- "modalDesc": "BiQ1zG_modalDesc",
2218
- "detailValue": "BiQ1zG_detailValue",
2219
- "restartNow": "BiQ1zG_restartNow",
2220
- "queueRowDesc": "BiQ1zG_queueRowDesc",
2221
- "modalLink": "BiQ1zG_modalLink",
2222
- "modalTitleQueued": "BiQ1zG_modalTitleQueued",
2223
- "noticeFoot": "BiQ1zG_noticeFoot",
2224
- "stripCancel": "BiQ1zG_stripCancel",
2225
- "failBigIssue": "BiQ1zG_failBigIssue",
2226
- "pendingRowActions": "BiQ1zG_pendingRowActions",
2227
- "queueRowTrack": "BiQ1zG_queueRowTrack",
2228
- "trustHint": "BiQ1zG_trustHint",
2229
- "failKindInstall": "BiQ1zG_failKindInstall",
2230
- "resultTitle": "BiQ1zG_resultTitle",
2231
- "noticeTime": "BiQ1zG_noticeTime",
2232
- "modalHead": "BiQ1zG_modalHead",
2233
- "detailUpdateHint": "BiQ1zG_detailUpdateHint",
2234
- "detailRow": "BiQ1zG_detailRow",
2235
- "noticeVersion": "BiQ1zG_noticeVersion",
2236
- "modal": "BiQ1zG_modal",
2237
- "resultDesc": "BiQ1zG_resultDesc",
2238
- "queueRowStatus": "BiQ1zG_queueRowStatus",
2239
- "failRow": "BiQ1zG_failRow",
2240
- "detailStatusRunning": "BiQ1zG_detailStatusRunning",
2241
- "queueRow": "BiQ1zG_queueRow",
2242
- "modalBody": "BiQ1zG_modalBody",
2243
- "queueRowHead": "BiQ1zG_queueRowHead",
2244
- "failPrepareHint": "BiQ1zG_failPrepareHint",
2245
- "hubUpdateNotes": "BiQ1zG_hubUpdateNotes",
2246
- "errorTitle": "BiQ1zG_errorTitle",
2247
- "detailStatusText": "BiQ1zG_detailStatusText",
2248
- "resultRestarting": "BiQ1zG_resultRestarting",
2249
- "modalCmd": "BiQ1zG_modalCmd",
2250
- "aboutModal": "BiQ1zG_aboutModal",
2251
- "failKindUninstall": "BiQ1zG_failKindUninstall",
2252
- "result": "BiQ1zG_result",
2253
- "resultCheck": "BiQ1zG_resultCheck",
2254
- "detailLabel": "BiQ1zG_detailLabel",
2255
- "detailModal": "BiQ1zG_detailModal",
2256
- "noticeBadgeOk": "BiQ1zG_noticeBadgeOk",
2257
- "failClear": "BiQ1zG_failClear",
2258
- "detailPath": "BiQ1zG_detailPath",
2259
- "errorBox": "BiQ1zG_errorBox",
2260
- "queuedHint": "BiQ1zG_queuedHint",
2261
- "modalCopy": "BiQ1zG_modalCopy",
2262
- "noticeList": "BiQ1zG_noticeList",
2263
- "aboutContent": "BiQ1zG_aboutContent",
2264
- "modalCancel": "BiQ1zG_modalCancel",
2265
- "failedCopyHint": "BiQ1zG_failedCopyHint",
2266
- "modalActions": "BiQ1zG_modalActions",
2267
- "queueSection": "BiQ1zG_queueSection",
2268
- "modalCloseIcon": "BiQ1zG_modalCloseIcon",
2269
- "hubUpdateModal": "BiQ1zG_hubUpdateModal",
2270
- "failRepo": "BiQ1zG_failRepo",
2271
- "failHead": "BiQ1zG_failHead",
2272
- "detailStars": "BiQ1zG_detailStars",
2273
- "noticeRowUpdate": "BiQ1zG_noticeRowUpdate",
2274
- "toastFail": "BiQ1zG_toastFail",
2275
- "modalCmdCopy": "BiQ1zG_modalCmdCopy",
2276
- "cliOnlyHint": "BiQ1zG_cliOnlyHint",
2277
- "aboutMeta": "BiQ1zG_aboutMeta",
2278
- "queueRowTarget": "BiQ1zG_queueRowTarget",
2279
- "progressTrack": "BiQ1zG_progressTrack"
2280
- };
2281
- //#endregion
2282
2358
  //#region src/client/components/ui/icons.tsx
2283
2359
  /**
2284
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
2360
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
2285
2361
  * Website: https://dsh-plugin.org
2286
2362
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
2287
2363
  *
@@ -2327,6 +2403,32 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2327
2403
  strokeLinejoin: "round"
2328
2404
  }));
2329
2405
  }
2406
+ /** 帮助图标:圆圈 + 问号(stroke 继承 currentColor),自定义安装卡片标题旁的「帮助」按钮用。 */
2407
+ function HelpIcon() {
2408
+ return (0, react.createElement)("svg", {
2409
+ viewBox: "0 0 16 16",
2410
+ width: 13,
2411
+ height: 13,
2412
+ fill: "none",
2413
+ "aria-hidden": "true"
2414
+ }, (0, react.createElement)("circle", {
2415
+ cx: 8,
2416
+ cy: 8,
2417
+ r: 6.3,
2418
+ stroke: "currentColor",
2419
+ strokeWidth: 1.4
2420
+ }), (0, react.createElement)("path", {
2421
+ d: "M6.3 6.5a1.9 1.9 0 1 1 2.7 1.7c-.7.3-1 .8-1 1.4",
2422
+ stroke: "currentColor",
2423
+ strokeWidth: 1.4,
2424
+ strokeLinecap: "round"
2425
+ }), (0, react.createElement)("circle", {
2426
+ cx: 8,
2427
+ cy: 11.6,
2428
+ r: .95,
2429
+ fill: "currentColor"
2430
+ }));
2431
+ }
2330
2432
  /** 品牌 logo 图标:蓝紫渐变圆角方块 + 白色拼图块(2x2 错落),标题左侧的品牌标识。 */
2331
2433
  function LogoIcon() {
2332
2434
  return (0, react.createElement)("svg", {
@@ -2668,7 +2770,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2668
2770
  //#endregion
2669
2771
  //#region src/client/components/modals/ProgressView.tsx
2670
2772
  /**
2671
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
2773
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
2672
2774
  * Website: https://dsh-plugin.org
2673
2775
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
2674
2776
  *
@@ -2686,7 +2788,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2686
2788
  //#endregion
2687
2789
  //#region src/client/components/modals/modals.tsx
2688
2790
  /**
2689
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
2791
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
2690
2792
  * Website: https://dsh-plugin.org
2691
2793
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
2692
2794
  *
@@ -2924,7 +3026,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2924
3026
  //#endregion
2925
3027
  //#region src/client/logic/renderMarkdown.ts
2926
3028
  /**
2927
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3029
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
2928
3030
  * Website: https://dsh-plugin.org
2929
3031
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
2930
3032
  *
@@ -3015,11 +3117,11 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3015
3117
  //#endregion
3016
3118
  //#region src/client/components/modals/AboutModal.tsx
3017
3119
  /**
3018
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3120
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3019
3121
  * Website: https://dsh-plugin.org
3020
3122
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3021
3123
  *
3022
- * 头部「关注我们」弹窗:介绍 DSH-Plugin Hub 的功能定位 + 用户反馈群二维码。
3124
+ * 头部「关注我们」弹窗:介绍 DSH Plugin Hub 的功能定位 + 用户反馈群二维码。
3023
3125
  * 内容以 Markdown 形式由 dsh-update Worker 的 /about 接口下发(key = hub:about),
3024
3126
  * 客户端按接口返回渲染,不内置固定文案。
3025
3127
  * 图片(反馈群二维码)经 renderMarkdown 的 ![](url) 语法嵌入,居中、最大高度受控。
@@ -3056,7 +3158,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3056
3158
  //#endregion
3057
3159
  //#region src/client/components/modals/HubUpdateModal.tsx
3058
3160
  /**
3059
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3161
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3060
3162
  * Website: https://dsh-plugin.org
3061
3163
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3062
3164
  *
@@ -3123,7 +3225,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3123
3225
  //#endregion
3124
3226
  //#region src/client/components/modals/InstalledDetailModal.tsx
3125
3227
  /**
3126
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3228
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3127
3229
  * Website: https://dsh-plugin.org
3128
3230
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3129
3231
  *
@@ -3205,7 +3307,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3205
3307
  //#endregion
3206
3308
  //#region src/client/components/modals/NotificationsModal.tsx
3207
3309
  /**
3208
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3310
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3209
3311
  * Website: https://dsh-plugin.org
3210
3312
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3211
3313
  *
@@ -3247,7 +3349,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3247
3349
  strokeLinecap: "round"
3248
3350
  }));
3249
3351
  }
3250
- function NotificationsModal({ records, tasks, pendingRestarts, t, env, onClose, onCopy, onClear, onRemove, onUpdate, cancelTask, restarting, onRestart }) {
3352
+ function NotificationsModal({ records, tasks, pendingRestarts, t, env, onClose, onCopy, onClear, onRemove, onUpdate, onIgnoreUpdate, cancelTask, restarting, onRestart }) {
3251
3353
  return (0, react.createElement)("div", {
3252
3354
  className: Modal_module_css_default.overlay,
3253
3355
  onClick: (e) => {
@@ -3330,7 +3432,13 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3330
3432
  e.stopPropagation();
3331
3433
  onUpdate(r.repo);
3332
3434
  }
3333
- }, t("updateNoticeGo")) : null, (0, react.createElement)("button", {
3435
+ }, t("updateNoticeGo")) : null, isUpdate ? (0, react.createElement)("button", {
3436
+ className: Modal_module_css_default.noticeIgnore,
3437
+ onClick: (e) => {
3438
+ e.stopPropagation();
3439
+ onIgnoreUpdate(r.repo, r.version);
3440
+ }
3441
+ }, t("ignoreUpdateRun")) : null, (0, react.createElement)("button", {
3334
3442
  className: Modal_module_css_default.noticeRemove,
3335
3443
  "aria-label": t("removeNotification"),
3336
3444
  title: t("removeNotification"),
@@ -3373,7 +3481,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3373
3481
  //#endregion
3374
3482
  //#region src/client/components/layout/CatalogHeader.tsx
3375
3483
  /**
3376
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3484
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3377
3485
  * Website: https://dsh-plugin.org
3378
3486
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3379
3487
  *
@@ -3435,7 +3543,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3435
3543
  //#endregion
3436
3544
  //#region src/client/components/layout/CategoryTabs.tsx
3437
3545
  /**
3438
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3546
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3439
3547
  * Website: https://dsh-plugin.org
3440
3548
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3441
3549
  *
@@ -3457,7 +3565,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3457
3565
  //#endregion
3458
3566
  //#region src/client/components/layout/CatalogControls.tsx
3459
3567
  /**
3460
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3568
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3461
3569
  * Website: https://dsh-plugin.org
3462
3570
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3463
3571
  *
@@ -3501,7 +3609,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3501
3609
  }
3502
3610
  //#endregion
3503
3611
  //#region \0dsh-css:src/client/styles/List.module.css.mjs
3504
- 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}";
3612
+ 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}";
3505
3613
  const tagId$9 = "dsh-plugin/List.module.css";
3506
3614
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$9) + "]") === null) {
3507
3615
  const tag = document.createElement("style");
@@ -3511,43 +3619,43 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3511
3619
  document.head.appendChild(tag);
3512
3620
  }
3513
3621
  var List_module_css_default = {
3514
- "cardTitle": "_3XaZHa_cardTitle",
3515
- "topic": "_3XaZHa_topic",
3516
- "verified": "_3XaZHa_verified",
3622
+ "fork": "_3XaZHa_fork",
3623
+ "installBtn": "_3XaZHa_installBtn",
3624
+ "detailBtn": "_3XaZHa_detailBtn",
3625
+ "moreSentinel": "_3XaZHa_moreSentinel",
3517
3626
  "cardMain": "_3XaZHa_cardMain",
3518
- "retryBtn": "_3XaZHa_retryBtn",
3519
- "star": "_3XaZHa_star",
3520
3627
  "cardSide": "_3XaZHa_cardSide",
3521
- "actions": "_3XaZHa_actions",
3522
- "installBtnUpdate": "_3XaZHa_installBtnUpdate",
3523
- "list": "_3XaZHa_list",
3524
- "stats": "_3XaZHa_stats",
3525
- "categoryBadge": "_3XaZHa_categoryBadge",
3526
- "stateTitle": "_3XaZHa_stateTitle",
3527
- "installBtnCopied": "_3XaZHa_installBtnCopied",
3528
- "uninstallBtn": "_3XaZHa_uninstallBtn",
3529
- "stateDesc": "_3XaZHa_stateDesc",
3530
- "topics": "_3XaZHa_topics",
3531
- "date": "_3XaZHa_date",
3628
+ "star": "_3XaZHa_star",
3532
3629
  "card": "_3XaZHa_card",
3533
- "cardHead": "_3XaZHa_cardHead",
3534
- "installBtn": "_3XaZHa_installBtn",
3535
- "footer": "_3XaZHa_footer",
3630
+ "installBtnCopied": "_3XaZHa_installBtnCopied",
3631
+ "categoryBadge": "_3XaZHa_categoryBadge",
3536
3632
  "body": "_3XaZHa_body",
3537
- "state": "_3XaZHa_state",
3538
- "footLink": "_3XaZHa_footLink",
3539
- "fork": "_3XaZHa_fork",
3540
- "detailBtn": "_3XaZHa_detailBtn",
3541
- "moreSentinel": "_3XaZHa_moreSentinel",
3542
3633
  "versionBadge": "_3XaZHa_versionBadge",
3634
+ "topics": "_3XaZHa_topics",
3635
+ "installBtnUpdate": "_3XaZHa_installBtnUpdate",
3636
+ "stateDesc": "_3XaZHa_stateDesc",
3637
+ "desc": "_3XaZHa_desc",
3638
+ "cardHead": "_3XaZHa_cardHead",
3639
+ "list": "_3XaZHa_list",
3543
3640
  "updateBadge": "_3XaZHa_updateBadge",
3641
+ "actions": "_3XaZHa_actions",
3642
+ "footLink": "_3XaZHa_footLink",
3643
+ "uninstallBtn": "_3XaZHa_uninstallBtn",
3644
+ "state": "_3XaZHa_state",
3645
+ "topic": "_3XaZHa_topic",
3646
+ "footer": "_3XaZHa_footer",
3647
+ "stats": "_3XaZHa_stats",
3648
+ "retryBtn": "_3XaZHa_retryBtn",
3649
+ "cardTitle": "_3XaZHa_cardTitle",
3650
+ "date": "_3XaZHa_date",
3544
3651
  "installBtnInstalled": "_3XaZHa_installBtnInstalled",
3545
- "desc": "_3XaZHa_desc"
3652
+ "verified": "_3XaZHa_verified",
3653
+ "stateTitle": "_3XaZHa_stateTitle"
3546
3654
  };
3547
3655
  //#endregion
3548
3656
  //#region src/client/hooks/useIncrementalList.ts
3549
3657
  /**
3550
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3658
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3551
3659
  * Website: https://dsh-plugin.org
3552
3660
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3553
3661
  *
@@ -3585,7 +3693,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3585
3693
  //#endregion
3586
3694
  //#region src/client/components/catalog/PluginCard.tsx
3587
3695
  /**
3588
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3696
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3589
3697
  * Website: https://dsh-plugin.org
3590
3698
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3591
3699
  *
@@ -3636,7 +3744,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3636
3744
  //#endregion
3637
3745
  //#region src/client/components/catalog/CatalogList.tsx
3638
3746
  /**
3639
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3747
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3640
3748
  * Website: https://dsh-plugin.org
3641
3749
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3642
3750
  *
@@ -3685,7 +3793,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3685
3793
  //#endregion
3686
3794
  //#region src/client/components/views/MarketView.tsx
3687
3795
  /**
3688
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3796
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3689
3797
  * Website: https://dsh-plugin.org
3690
3798
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3691
3799
  *
@@ -3739,20 +3847,20 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3739
3847
  document.head.appendChild(tag);
3740
3848
  }
3741
3849
  var SectionTabs_module_css_default = {
3742
- "tabActive": "_7tvizq_tabActive",
3850
+ "noticeBtn": "_7tvizq_noticeBtn",
3743
3851
  "root": "_7tvizq_root",
3744
3852
  "tab": "_7tvizq_tab",
3745
3853
  "tabCount": "_7tvizq_tabCount",
3746
- "tabCountActive": "_7tvizq_tabCountActive",
3747
- "noticeBtn": "_7tvizq_noticeBtn",
3854
+ "tabIcon": "_7tvizq_tabIcon",
3748
3855
  "noticeIcon": "_7tvizq_noticeIcon",
3856
+ "tabActive": "_7tvizq_tabActive",
3749
3857
  "noticeCount": "_7tvizq_noticeCount",
3750
- "tabIcon": "_7tvizq_tabIcon"
3858
+ "tabCountActive": "_7tvizq_tabCountActive"
3751
3859
  };
3752
3860
  //#endregion
3753
3861
  //#region src/client/components/layout/SectionTabs.tsx
3754
3862
  /**
3755
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3863
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3756
3864
  * Website: https://dsh-plugin.org
3757
3865
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3758
3866
  *
@@ -3809,7 +3917,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3809
3917
  }
3810
3918
  //#endregion
3811
3919
  //#region \0dsh-css:src/client/styles/InstalledView.module.css.mjs
3812
- 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)}";
3920
+ 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)}";
3813
3921
  const tagId$7 = "dsh-plugin/InstalledView.module.css";
3814
3922
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$7) + "]") === null) {
3815
3923
  const tag = document.createElement("style");
@@ -3817,49 +3925,49 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3817
3925
  tag.dataset.pluginCss = tagId$7;
3818
3926
  tag.textContent = css$7;
3819
3927
  document.head.appendChild(tag);
3820
- }
3821
- var InstalledView_module_css_default = {
3822
- "searchWrap": "_1nXeGW_searchWrap",
3823
- "emptyTitle": "_1nXeGW_emptyTitle",
3824
- "toolbar": "_1nXeGW_toolbar",
3825
- "segRow": "_1nXeGW_segRow",
3826
- "empty": "_1nXeGW_empty",
3827
- "rowDesc": "_1nXeGW_rowDesc",
3828
- "statusDot": "_1nXeGW_statusDot",
3829
- "statusInactive": "_1nXeGW_statusInactive",
3830
- "versionBadge": "_1nXeGW_versionBadge",
3831
- "rowActions": "_1nXeGW_rowActions",
3832
- "list": "_1nXeGW_list",
3833
- "searchInput": "_1nXeGW_searchInput",
3834
- "segLabel": "_1nXeGW_segLabel",
3835
- "rowRestart": "_1nXeGW_rowRestart",
3836
- "rowUpdate": "_1nXeGW_rowUpdate",
3837
- "segBtnActive": "_1nXeGW_segBtnActive",
3838
- "row": "_1nXeGW_row",
3839
- "rowTitle": "_1nXeGW_rowTitle",
3840
- "rowTitleLine": "_1nXeGW_rowTitleLine",
3841
- "exampleBadge": "_1nXeGW_exampleBadge",
3842
- "rowSourceTagHub": "_1nXeGW_rowSourceTagHub",
3843
- "rowMain": "_1nXeGW_rowMain",
3844
- "rowSourceTag": "_1nXeGW_rowSourceTag",
3845
- "root": "_1nXeGW_root",
3846
- "rowDetail": "_1nXeGW_rowDetail",
3928
+ }
3929
+ var InstalledView_module_css_default = {
3847
3930
  "exampleRow": "_1nXeGW_exampleRow",
3848
3931
  "segBtn": "_1nXeGW_segBtn",
3849
- "statusPending": "_1nXeGW_statusPending",
3850
3932
  "rowSourceTagManual": "_1nXeGW_rowSourceTagManual",
3933
+ "searchWrap": "_1nXeGW_searchWrap",
3934
+ "updateBadge": "_1nXeGW_updateBadge",
3935
+ "rowSourceTag": "_1nXeGW_rowSourceTag",
3936
+ "segLabel": "_1nXeGW_segLabel",
3937
+ "rowSourceTagHub": "_1nXeGW_rowSourceTagHub",
3938
+ "segGroup": "_1nXeGW_segGroup",
3939
+ "toolbar": "_1nXeGW_toolbar",
3940
+ "segRow": "_1nXeGW_segRow",
3851
3941
  "rowMeta": "_1nXeGW_rowMeta",
3852
- "rowUninstall": "_1nXeGW_rowUninstall",
3942
+ "rowCategory": "_1nXeGW_rowCategory",
3943
+ "exampleBadge": "_1nXeGW_exampleBadge",
3944
+ "versionBadge": "_1nXeGW_versionBadge",
3853
3945
  "rowRepo": "_1nXeGW_rowRepo",
3946
+ "rowUpdate": "_1nXeGW_rowUpdate",
3947
+ "rowUninstall": "_1nXeGW_rowUninstall",
3948
+ "rowRestart": "_1nXeGW_rowRestart",
3949
+ "searchInput": "_1nXeGW_searchInput",
3950
+ "list": "_1nXeGW_list",
3951
+ "statusInactive": "_1nXeGW_statusInactive",
3952
+ "rowMain": "_1nXeGW_rowMain",
3953
+ "rowActions": "_1nXeGW_rowActions",
3954
+ "segBtnActive": "_1nXeGW_segBtnActive",
3955
+ "rowTitleLine": "_1nXeGW_rowTitleLine",
3854
3956
  "emptyDesc": "_1nXeGW_emptyDesc",
3855
- "segGroup": "_1nXeGW_segGroup",
3856
- "rowCategory": "_1nXeGW_rowCategory",
3857
- "updateBadge": "_1nXeGW_updateBadge"
3957
+ "row": "_1nXeGW_row",
3958
+ "rowDesc": "_1nXeGW_rowDesc",
3959
+ "statusPending": "_1nXeGW_statusPending",
3960
+ "rowTitle": "_1nXeGW_rowTitle",
3961
+ "emptyTitle": "_1nXeGW_emptyTitle",
3962
+ "rowDetail": "_1nXeGW_rowDetail",
3963
+ "root": "_1nXeGW_root",
3964
+ "statusDot": "_1nXeGW_statusDot",
3965
+ "empty": "_1nXeGW_empty"
3858
3966
  };
3859
3967
  //#endregion
3860
3968
  //#region src/client/components/views/InstalledView.tsx
3861
3969
  /**
3862
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3970
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3863
3971
  * Website: https://dsh-plugin.org
3864
3972
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3865
3973
  *
@@ -4085,7 +4193,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4085
4193
  }
4086
4194
  //#endregion
4087
4195
  //#region \0dsh-css:src/client/styles/CustomInstallView.module.css.mjs
4088
- 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}";
4196
+ 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}";
4089
4197
  const tagId$6 = "dsh-plugin/CustomInstallView.module.css";
4090
4198
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$6) + "]") === null) {
4091
4199
  const tag = document.createElement("style");
@@ -4095,38 +4203,43 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4095
4203
  document.head.appendChild(tag);
4096
4204
  }
4097
4205
  var CustomInstallView_module_css_default = {
4098
- "channelOffBtn": "zISxCG_channelOffBtn",
4099
- "installLabel": "zISxCG_installLabel",
4100
- "installInput": "zISxCG_installInput",
4101
- "installExample": "zISxCG_installExample",
4206
+ "root": "zISxCG_root",
4207
+ "helpBody": "zISxCG_helpBody",
4208
+ "installHelpBtn": "zISxCG_installHelpBtn",
4209
+ "installRow": "zISxCG_installRow",
4102
4210
  "installCardHead": "zISxCG_installCardHead",
4103
- "installBtn": "zISxCG_installBtn",
4104
- "channelOff": "zISxCG_channelOff",
4211
+ "helpCmd": "zISxCG_helpCmd",
4212
+ "helpNote": "zISxCG_helpNote",
4213
+ "helpLine": "zISxCG_helpLine",
4214
+ "installExample": "zISxCG_installExample",
4215
+ "installCardDisabled": "zISxCG_installCardDisabled",
4216
+ "desc": "zISxCG_desc",
4105
4217
  "installCard": "zISxCG_installCard",
4106
- "channelOffText": "zISxCG_channelOffText",
4218
+ "channelOff": "zISxCG_channelOff",
4107
4219
  "installError": "zISxCG_installError",
4108
- "installCardDisabled": "zISxCG_installCardDisabled",
4109
4220
  "installInputError": "zISxCG_installInputError",
4221
+ "channelOffBtn": "zISxCG_channelOffBtn",
4222
+ "installInput": "zISxCG_installInput",
4223
+ "installBtn": "zISxCG_installBtn",
4224
+ "channelOffText": "zISxCG_channelOffText",
4110
4225
  "installCards": "zISxCG_installCards",
4111
- "root": "zISxCG_root",
4112
- "installRow": "zISxCG_installRow",
4113
- "desc": "zISxCG_desc"
4226
+ "installLabel": "zISxCG_installLabel"
4114
4227
  };
4115
4228
  //#endregion
4116
4229
  //#region src/client/components/views/CustomInstallView.tsx
4117
4230
  /**
4118
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4231
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4119
4232
  * Website: https://dsh-plugin.org
4120
4233
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
4121
4234
  *
4122
4235
  * Custom install view: a standalone top-level section for manually
4123
4236
  * installing npm packages or GitHub sources outside the catalog. Three
4124
- * installer cards, one per channel — npm package, GitHub source and a raw
4125
- * install command (a `dsh plugin ... add <target>` or the official global
4126
- * `npm install -g <pkgs>`) — each with a placeholder example above the
4127
- * input and its own format check. The cards stay separate so a user never
4128
- * has to guess which format goes where. Finished installs surface in the
4129
- * Installed view, marked as custom.
4237
+ * installer cards, one per channel — npm package (bare name or a full
4238
+ * npm/pnpm install command, including the official global `npm install -g`),
4239
+ * GitHub source and the official `dsh plugin ... add <target>` command —
4240
+ * each with a placeholder example above the input and its own format check.
4241
+ * The cards stay separate so a user never has to guess which format goes
4242
+ * where. Finished installs surface in the Installed view, marked as custom.
4130
4243
  *
4131
4244
  * Pure presentational: owns only the three local input/error states; the
4132
4245
  * actual install (custom source, gated by the security toggles) bubbles up
@@ -4138,35 +4251,76 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4138
4251
  const GITHUB_BARE_RE = /^[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+$/;
4139
4252
  /** npm 包名(含 @scope/pkg) */
4140
4253
  const NPM_PACKAGE_RE = /^(?:@[a-z0-9._-]+\/)?[a-z0-9._-]+$/;
4141
- /** DSH 命令行前缀(`dsh plugin [--profile|-p <p>] add <target>`)—— 提取其中的安装目标;
4142
- * 命令大小写不敏感,支持 `-p` 简写与 `--profile=web` 等号形式,与 server 端 installTargetOf 口径一致。 */
4143
- const DSH_PLUGIN_CMD_RE = /^dsh\s+plugin\s+(?:(?:--profile|-p)(?:=|\s+)\S+\s*)?add\s+(.+)$/i;
4254
+ /** DSH 命令行前缀(官方唯一形式 `dsh plugin --profile <name> add <target>`)—— 提取其中的安装目标。
4255
+ * 官方 CLI(apps/cli/src/args.ts,commander):--profile 为必填长选项(无 -p 简写,省略即报错),
4256
+ * 支持 `--profile=<name>` 等号形式;命令大小写不敏感。与 server 端 installTargetOf 口径一致。 */
4257
+ const DSH_PLUGIN_CMD_RE = /^dsh\s+plugin\s+--profile(?:\s+|=)\S+\s+add\s+(.+)$/i;
4144
4258
  /** npm 全局安装命令(官方 README 格式,如 `npm install -g @deepseek-ai/dsh @deepseek-harness-tui/dsh-tui`)——
4145
4259
  * 提取 -g 之后的包列表;任一包名非法返回 null(交给格式错误提示)。与 server 端 globalNpmPackagesOf 口径一致。 */
4146
4260
  const NPM_GLOBAL_CMD_RE = /^npm\s+(?:install|i)\s+(?:-g|--global)\s+(.+)$/i;
4261
+ /** 常规 npm/pnpm 安装命令(装进当前 profile,如 `npm install lodash`、`pnpm add @scope/pkg`)——
4262
+ * 提取命令后的包列表;包列表在 splitPackages 里逐个校验。 */
4263
+ const NPM_INSTALL_CMD_RE = /^(?:npm\s+(?:install|i)|pnpm\s+(?:add|i|install))\s+(.+)$/i;
4147
4264
  function installTargetOf(raw) {
4148
4265
  const input = raw.trim();
4149
4266
  const match = DSH_PLUGIN_CMD_RE.exec(input);
4150
4267
  return match !== null ? match[1].trim() : input;
4151
4268
  }
4152
- function parseNpmGlobalPackages(raw) {
4153
- const input = raw.trim();
4154
- const match = NPM_GLOBAL_CMD_RE.exec(input);
4155
- if (match === null) return null;
4156
- const packages = match[1].trim().split(/\s+/).filter((p) => p !== "");
4269
+ /** 空格分隔的包列表:逐个按 npm 包名语法校验 + 拒绝以 - 开头的 token(npm 会把 --xxx 当参数而非包名),
4270
+ * 任一非法返回 null(交给格式错误提示)。与 server 端 globalNpmPackagesOf 同口径。 */
4271
+ function splitPackages(raw) {
4272
+ const packages = raw.trim().split(/\s+/).filter((p) => p !== "");
4157
4273
  if (packages.length === 0 || packages.some((p) => !NPM_PACKAGE_RE.test(p) || p.startsWith("-"))) return null;
4158
4274
  return packages;
4159
4275
  }
4276
+ function parseNpmInput(raw) {
4277
+ const input = raw.trim();
4278
+ if (NPM_PACKAGE_RE.test(input)) return {
4279
+ kind: "pkg",
4280
+ target: input
4281
+ };
4282
+ const global = NPM_GLOBAL_CMD_RE.exec(input);
4283
+ if (global !== null) {
4284
+ const pkgs = splitPackages(global[1]);
4285
+ if (pkgs !== null) return {
4286
+ kind: "global",
4287
+ pkgs
4288
+ };
4289
+ return null;
4290
+ }
4291
+ const install = NPM_INSTALL_CMD_RE.exec(input);
4292
+ if (install !== null) {
4293
+ const pkgs = splitPackages(install[1]);
4294
+ if (pkgs !== null && pkgs.length === 1) return {
4295
+ kind: "pkg",
4296
+ target: pkgs[0]
4297
+ };
4298
+ return null;
4299
+ }
4300
+ return null;
4301
+ }
4160
4302
  function isGitHubInput(raw) {
4161
4303
  const input = raw.trim();
4162
4304
  return GITHUB_URL_RE.test(input) || GITHUB_BARE_RE.test(input);
4163
4305
  }
4164
- function isNpmInput(raw) {
4165
- return NPM_PACKAGE_RE.test(raw.trim());
4166
- }
4167
4306
  function isDshCommand(raw) {
4168
4307
  return DSH_PLUGIN_CMD_RE.test(raw.trim());
4169
4308
  }
4309
+ /** 卡片标题旁的「帮助」弹窗:三块卡片各自的标题与格式清单语言包 key。 */
4310
+ const HELP_CARDS = {
4311
+ npm: {
4312
+ titleKey: "npmInstallLabel",
4313
+ contentKey: "npmInstallHelp"
4314
+ },
4315
+ git: {
4316
+ titleKey: "gitInstallLabel",
4317
+ contentKey: "gitInstallHelp"
4318
+ },
4319
+ cmd: {
4320
+ titleKey: "dshCmdLabel",
4321
+ contentKey: "dshCmdHelp"
4322
+ }
4323
+ };
4170
4324
  function CustomInstallView({ t, onInstallCustom, enableNpm, enableGit, enableDsh, onOpenSettings }) {
4171
4325
  /** 自定义安装:NPM 包输入与格式错误('' = 无错误) */
4172
4326
  const [npmQuery, setNpmQuery] = (0, react.useState)("");
@@ -4177,6 +4331,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4177
4331
  /** 自定义安装:DSH 命令输入与格式错误('' = 无错误) */
4178
4332
  const [cmdQuery, setCmdQuery] = (0, react.useState)("");
4179
4333
  const [cmdError, setCmdError] = (0, react.useState)("");
4334
+ /** 卡片标题旁「帮助」弹窗:null = 未打开;'npm' | 'git' | 'cmd' = 打开对应卡片的格式清单 */
4335
+ const [helpFor, setHelpFor] = (0, react.useState)(null);
4180
4336
  /** 通道关闭提示行:开关关掉后替代示例与输入行,引导去设置打开 */
4181
4337
  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", {
4182
4338
  type: "button",
@@ -4184,13 +4340,15 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4184
4340
  onClick: onOpenSettings
4185
4341
  }, t("goToSettings")));
4186
4342
  const submitNpm = () => {
4187
- const target = npmQuery.trim();
4188
- if (!target) return;
4189
- if (!isNpmInput(target)) {
4343
+ const raw = npmQuery.trim();
4344
+ if (!raw) return;
4345
+ const parsed = parseNpmInput(raw);
4346
+ if (parsed === null) {
4190
4347
  setNpmError(t("npmInstallInvalid"));
4191
4348
  return;
4192
4349
  }
4193
- onInstallCustom(target);
4350
+ if (parsed.kind === "global") onInstallCustom(raw, { globalNpm: parsed.pkgs });
4351
+ else onInstallCustom(parsed.target);
4194
4352
  setNpmQuery("");
4195
4353
  setNpmError("");
4196
4354
  };
@@ -4208,13 +4366,6 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4208
4366
  const submitCmd = () => {
4209
4367
  const raw = cmdQuery.trim();
4210
4368
  if (!raw) return;
4211
- const globalPkgs = parseNpmGlobalPackages(raw);
4212
- if (globalPkgs !== null) {
4213
- onInstallCustom(raw, { globalNpm: globalPkgs });
4214
- setCmdQuery("");
4215
- setCmdError("");
4216
- return;
4217
- }
4218
4369
  if (!isDshCommand(raw)) {
4219
4370
  setCmdError(t("dshCmdInvalid"));
4220
4371
  return;
@@ -4223,8 +4374,14 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4223
4374
  setCmdQuery("");
4224
4375
  setCmdError("");
4225
4376
  };
4226
- 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 : [
4227
- (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installExample }, t("npmInstallExample")),
4377
+ 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", {
4378
+ type: "button",
4379
+ className: CustomInstallView_module_css_default.installHelpBtn,
4380
+ title: t("installHelp"),
4381
+ "aria-label": t("installHelp"),
4382
+ onClick: () => setHelpFor("npm")
4383
+ }, (0, react.createElement)(HelpIcon))), !enableNpm ? channelOffRow : [
4384
+ (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installExample }, t("npmInstallExample"), (0, react.createElement)("br"), t("npmInstallExample2")),
4228
4385
  (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installRow }, (0, react.createElement)("input", {
4229
4386
  className: npmError ? `${CustomInstallView_module_css_default.installInput} ${CustomInstallView_module_css_default.installInputError}` : CustomInstallView_module_css_default.installInput,
4230
4387
  type: "text",
@@ -4245,7 +4402,13 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4245
4402
  onClick: submitNpm
4246
4403
  }, t("installCliBtn"))),
4247
4404
  npmError ? (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installError }, npmError) : null
4248
- ]), (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 : [
4405
+ ]), (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", {
4406
+ type: "button",
4407
+ className: CustomInstallView_module_css_default.installHelpBtn,
4408
+ title: t("installHelp"),
4409
+ "aria-label": t("installHelp"),
4410
+ onClick: () => setHelpFor("git")
4411
+ }, (0, react.createElement)(HelpIcon))), !enableGit ? channelOffRow : [
4249
4412
  (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installExample }, t("gitInstallExample")),
4250
4413
  (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installRow }, (0, react.createElement)("input", {
4251
4414
  className: gitError ? `${CustomInstallView_module_css_default.installInput} ${CustomInstallView_module_css_default.installInputError}` : CustomInstallView_module_css_default.installInput,
@@ -4267,7 +4430,13 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4267
4430
  onClick: submitGit
4268
4431
  }, t("installCliBtn"))),
4269
4432
  gitError ? (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installError }, gitError) : null
4270
- ]), (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 : [
4433
+ ]), (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", {
4434
+ type: "button",
4435
+ className: CustomInstallView_module_css_default.installHelpBtn,
4436
+ title: t("installHelp"),
4437
+ "aria-label": t("installHelp"),
4438
+ onClick: () => setHelpFor("cmd")
4439
+ }, (0, react.createElement)(HelpIcon))), !enableDsh ? channelOffRow : [
4271
4440
  (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installExample }, t("dshCmdExample")),
4272
4441
  (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installRow }, (0, react.createElement)("input", {
4273
4442
  className: cmdError ? `${CustomInstallView_module_css_default.installInput} ${CustomInstallView_module_css_default.installInputError}` : CustomInstallView_module_css_default.installInput,
@@ -4289,7 +4458,26 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4289
4458
  onClick: submitCmd
4290
4459
  }, t("installCliBtn"))),
4291
4460
  cmdError ? (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installError }, cmdError) : null
4292
- ])));
4461
+ ])), helpFor !== null ? (0, react.createElement)("div", {
4462
+ className: Modal_module_css_default.overlay,
4463
+ onClick: (e) => {
4464
+ if (e.target === e.currentTarget) setHelpFor(null);
4465
+ }
4466
+ }, (0, react.createElement)("div", {
4467
+ className: `${Modal_module_css_default.errorModal} ${Modal_module_css_default.helpModal}`,
4468
+ role: "dialog",
4469
+ "aria-modal": "true"
4470
+ }, (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", {
4471
+ className: Modal_module_css_default.modalClose,
4472
+ "aria-label": t("errorClose"),
4473
+ onClick: () => setHelpFor(null)
4474
+ }, (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) => {
4475
+ const [cmd, note] = line.split(" ");
4476
+ return (0, react.createElement)("div", {
4477
+ key: i,
4478
+ className: CustomInstallView_module_css_default.helpLine
4479
+ }, 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);
4480
+ }))))) : null);
4293
4481
  }
4294
4482
  //#endregion
4295
4483
  //#region \0dsh-css:src/client/styles/SettingsView.module.css.mjs
@@ -4303,26 +4491,26 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4303
4491
  document.head.appendChild(tag);
4304
4492
  }
4305
4493
  var SettingsView_module_css_default = {
4306
- "card": "_506LLG_card",
4307
- "navItemActive": "_506LLG_navItemActive",
4494
+ "pageTitle": "_506LLG_pageTitle",
4495
+ "settingControl": "_506LLG_settingControl",
4496
+ "settingRowStack": "_506LLG_settingRowStack",
4497
+ "navItem": "_506LLG_navItem",
4498
+ "pageDesc": "_506LLG_pageDesc",
4499
+ "settingControlStack": "_506LLG_settingControlStack",
4500
+ "navIcon": "_506LLG_navIcon",
4308
4501
  "resetBtn": "_506LLG_resetBtn",
4309
- "controlDropdown": "_506LLG_controlDropdown",
4310
4502
  "root": "_506LLG_root",
4311
- "settingRow": "_506LLG_settingRow",
4312
- "settingControlStack": "_506LLG_settingControlStack",
4313
4503
  "sidebar": "_506LLG_sidebar",
4314
- "pageTitle": "_506LLG_pageTitle",
4504
+ "settingLabel": "_506LLG_settingLabel",
4505
+ "card": "_506LLG_card",
4315
4506
  "settingDesc": "_506LLG_settingDesc",
4316
- "pageDesc": "_506LLG_pageDesc",
4317
- "settingControl": "_506LLG_settingControl",
4318
- "settingRowStack": "_506LLG_settingRowStack",
4507
+ "textInput": "_506LLG_textInput",
4508
+ "pageHeader": "_506LLG_pageHeader",
4509
+ "settingRow": "_506LLG_settingRow",
4319
4510
  "content": "_506LLG_content",
4320
4511
  "settingTitle": "_506LLG_settingTitle",
4321
- "settingLabel": "_506LLG_settingLabel",
4322
- "navIcon": "_506LLG_navIcon",
4323
- "pageHeader": "_506LLG_pageHeader",
4324
- "textInput": "_506LLG_textInput",
4325
- "navItem": "_506LLG_navItem"
4512
+ "controlDropdown": "_506LLG_controlDropdown",
4513
+ "navItemActive": "_506LLG_navItemActive"
4326
4514
  };
4327
4515
  //#endregion
4328
4516
  //#region \0dsh-css:src/client/styles/Dropdown.module.css.mjs
@@ -4336,22 +4524,22 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4336
4524
  document.head.appendChild(tag);
4337
4525
  }
4338
4526
  var Dropdown_module_css_default = {
4527
+ "dropdownCountActive": "B_Gxsq_dropdownCountActive",
4528
+ "dropdownItem": "B_Gxsq_dropdownItem",
4339
4529
  "dropdownCount": "B_Gxsq_dropdownCount",
4530
+ "dropdownItemActive": "B_Gxsq_dropdownItemActive",
4340
4531
  "dropdownBtn": "B_Gxsq_dropdownBtn",
4532
+ "dropdownPanel": "B_Gxsq_dropdownPanel",
4341
4533
  "dropdownItemLabel": "B_Gxsq_dropdownItemLabel",
4342
- "dropdownItem": "B_Gxsq_dropdownItem",
4343
- "dropdownItemActive": "B_Gxsq_dropdownItemActive",
4534
+ "dropdownArrow": "B_Gxsq_dropdownArrow",
4344
4535
  "dropdown": "B_Gxsq_dropdown",
4345
- "dropdownCountActive": "B_Gxsq_dropdownCountActive",
4346
- "dropdownLabel": "B_Gxsq_dropdownLabel",
4347
4536
  "dropdownArrowOpen": "B_Gxsq_dropdownArrowOpen",
4348
- "dropdownArrow": "B_Gxsq_dropdownArrow",
4349
- "dropdownPanel": "B_Gxsq_dropdownPanel"
4537
+ "dropdownLabel": "B_Gxsq_dropdownLabel"
4350
4538
  };
4351
4539
  //#endregion
4352
4540
  //#region src/client/components/ui/Dropdown.tsx
4353
4541
  /**
4354
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4542
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4355
4543
  * Website: https://dsh-plugin.org
4356
4544
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
4357
4545
  *
@@ -4420,13 +4608,13 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4420
4608
  }
4421
4609
  var Toggle_module_css_default = {
4422
4610
  "toggle": "k-cD4G_toggle",
4423
- "knob": "k-cD4G_knob",
4424
- "toggleOn": "k-cD4G_toggleOn"
4611
+ "toggleOn": "k-cD4G_toggleOn",
4612
+ "knob": "k-cD4G_knob"
4425
4613
  };
4426
4614
  //#endregion
4427
4615
  //#region src/client/components/ui/Toggle.tsx
4428
4616
  /**
4429
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4617
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4430
4618
  * Website: https://dsh-plugin.org
4431
4619
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
4432
4620
  *
@@ -4457,34 +4645,34 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4457
4645
  document.head.appendChild(tag);
4458
4646
  }
4459
4647
  var DiagnosticsView_module_css_default = {
4460
- "envRow": "k9eRya_envRow",
4461
- "envDesc": "k9eRya_envDesc",
4462
- "envLabel": "k9eRya_envLabel",
4463
- "badge": "k9eRya_badge",
4464
4648
  "head": "k9eRya_head",
4465
- "badgeFail": "k9eRya_badgeFail",
4649
+ "headHint": "k9eRya_headHint",
4466
4650
  "meta": "k9eRya_meta",
4467
- "badgeIdle": "k9eRya_badgeIdle",
4468
- "summaryFail": "k9eRya_summaryFail",
4651
+ "summaryOk": "k9eRya_summaryOk",
4469
4652
  "envTitle": "k9eRya_envTitle",
4653
+ "summaryFail": "k9eRya_summaryFail",
4654
+ "badgeRunning": "k9eRya_badgeRunning",
4655
+ "badgeIdle": "k9eRya_badgeIdle",
4656
+ "badge": "k9eRya_badge",
4657
+ "panel": "k9eRya_panel",
4658
+ "envLabel": "k9eRya_envLabel",
4470
4659
  "display": "k9eRya_display",
4471
- "summaryRunning": "k9eRya_summaryRunning",
4472
- "badgeOk": "k9eRya_badgeOk",
4473
- "diagPulse": "k9eRya_diagPulse",
4474
- "envCopyBtn": "k9eRya_envCopyBtn",
4475
4660
  "summary": "k9eRya_summary",
4661
+ "badgeFail": "k9eRya_badgeFail",
4662
+ "summaryRunning": "k9eRya_summaryRunning",
4476
4663
  "runBtn": "k9eRya_runBtn",
4477
- "badgeRunning": "k9eRya_badgeRunning",
4478
- "summaryOk": "k9eRya_summaryOk",
4479
4664
  "name": "k9eRya_name",
4480
- "panel": "k9eRya_panel",
4481
- "headHint": "k9eRya_headHint",
4482
- "row": "k9eRya_row"
4665
+ "envCopyBtn": "k9eRya_envCopyBtn",
4666
+ "badgeOk": "k9eRya_badgeOk",
4667
+ "envDesc": "k9eRya_envDesc",
4668
+ "row": "k9eRya_row",
4669
+ "diagPulse": "k9eRya_diagPulse",
4670
+ "envRow": "k9eRya_envRow"
4483
4671
  };
4484
4672
  //#endregion
4485
4673
  //#region src/client/components/views/DiagnosticsView.tsx
4486
4674
  /**
4487
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4675
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4488
4676
  * Website: https://dsh-plugin.org
4489
4677
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
4490
4678
  *
@@ -4498,7 +4686,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4498
4686
  /** 系统版本文本:提交 Issue 时粘贴到正文,方便作者复现。 */
4499
4687
  function formatEnv(env) {
4500
4688
  return [
4501
- `DSH-Plugin Hub ${PLUGIN_VERSION}`,
4689
+ `DSH Plugin Hub ${PLUGIN_VERSION}`,
4502
4690
  `DSH ${env.dshVersion ?? "unknown"}`,
4503
4691
  `Node ${env.nodeVersion}`,
4504
4692
  `${env.platform} ${env.arch} (${env.release})`,
@@ -4637,61 +4825,61 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4637
4825
  document.head.appendChild(tag);
4638
4826
  }
4639
4827
  var LogsView_module_css_default = {
4640
- "pathRow": "_3j77BW_pathRow",
4641
- "footPath": "_3j77BW_footPath",
4642
- "time": "_3j77BW_time",
4643
- "btnPrimary": "_3j77BW_btnPrimary",
4828
+ "pathDialogHint": "_3j77BW_pathDialogHint",
4829
+ "actions": "_3j77BW_actions",
4830
+ "message": "_3j77BW_message",
4831
+ "pathDraft": "_3j77BW_pathDraft",
4644
4832
  "pathDialogDesc": "_3j77BW_pathDialogDesc",
4645
- "searchInput": "_3j77BW_searchInput",
4646
- "linkBtn": "_3j77BW_linkBtn",
4833
+ "head": "_3j77BW_head",
4834
+ "filterChip": "_3j77BW_filterChip",
4647
4835
  "search": "_3j77BW_search",
4648
- "foot": "_3j77BW_foot",
4649
- "pathDialogReset": "_3j77BW_pathDialogReset",
4650
- "catBadge": "_3j77BW_catBadge",
4651
- "pathText": "_3j77BW_pathText",
4652
- "catUpdate": "_3j77BW_catUpdate",
4653
- "logList": "_3j77BW_logList",
4654
- "headHint": "_3j77BW_headHint",
4655
- "pathDialogFoot": "_3j77BW_pathDialogFoot",
4656
- "badgeDebug": "_3j77BW_badgeDebug",
4657
4836
  "more": "_3j77BW_more",
4658
- "pathDialogRow": "_3j77BW_pathDialogRow",
4659
- "filterBar": "_3j77BW_filterBar",
4660
- "footCount": "_3j77BW_footCount",
4661
- "moreEnd": "_3j77BW_moreEnd",
4662
4837
  "badgeError": "_3j77BW_badgeError",
4663
- "footFail": "_3j77BW_footFail",
4664
- "btn": "_3j77BW_btn",
4838
+ "catInstall": "_3j77BW_catInstall",
4665
4839
  "event": "_3j77BW_event",
4666
- "previewRow": "_3j77BW_previewRow",
4667
- "message": "_3j77BW_message",
4668
- "head": "_3j77BW_head",
4669
- "filterChip": "_3j77BW_filterChip",
4670
- "footActions": "_3j77BW_footActions",
4671
- "catDiagnostics": "_3j77BW_catDiagnostics",
4672
- "pathDialog": "_3j77BW_pathDialog",
4673
- "panel": "_3j77BW_panel",
4674
- "pathDialogHint": "_3j77BW_pathDialogHint",
4675
- "entry": "_3j77BW_entry",
4676
- "badgeWarn": "_3j77BW_badgeWarn",
4677
4840
  "badge": "_3j77BW_badge",
4678
- "catInstall": "_3j77BW_catInstall",
4679
- "actions": "_3j77BW_actions",
4680
- "catSettings": "_3j77BW_catSettings",
4681
- "list": "_3j77BW_list",
4682
- "catUninstall": "_3j77BW_catUninstall",
4841
+ "catUpdate": "_3j77BW_catUpdate",
4842
+ "badgeInfo": "_3j77BW_badgeInfo",
4843
+ "footCount": "_3j77BW_footCount",
4683
4844
  "catSystem": "_3j77BW_catSystem",
4684
- "pathDraft": "_3j77BW_pathDraft",
4845
+ "time": "_3j77BW_time",
4846
+ "filterBar": "_3j77BW_filterBar",
4847
+ "badgeWarn": "_3j77BW_badgeWarn",
4848
+ "foot": "_3j77BW_foot",
4849
+ "btnPrimary": "_3j77BW_btnPrimary",
4850
+ "footFail": "_3j77BW_footFail",
4851
+ "footActions": "_3j77BW_footActions",
4852
+ "btn": "_3j77BW_btn",
4853
+ "badgeDebug": "_3j77BW_badgeDebug",
4854
+ "linkBtn": "_3j77BW_linkBtn",
4855
+ "pathDialog": "_3j77BW_pathDialog",
4856
+ "footPath": "_3j77BW_footPath",
4857
+ "badgeSuccess": "_3j77BW_badgeSuccess",
4685
4858
  "pathLabel": "_3j77BW_pathLabel",
4859
+ "catBadge": "_3j77BW_catBadge",
4860
+ "headHint": "_3j77BW_headHint",
4861
+ "logList": "_3j77BW_logList",
4686
4862
  "filterChipActive": "_3j77BW_filterChipActive",
4687
- "badgeSuccess": "_3j77BW_badgeSuccess",
4688
- "empty": "_3j77BW_empty",
4689
- "badgeInfo": "_3j77BW_badgeInfo"
4863
+ "catUninstall": "_3j77BW_catUninstall",
4864
+ "moreEnd": "_3j77BW_moreEnd",
4865
+ "list": "_3j77BW_list",
4866
+ "entry": "_3j77BW_entry",
4867
+ "pathDialogFoot": "_3j77BW_pathDialogFoot",
4868
+ "pathDialogReset": "_3j77BW_pathDialogReset",
4869
+ "pathDialogRow": "_3j77BW_pathDialogRow",
4870
+ "searchInput": "_3j77BW_searchInput",
4871
+ "catSettings": "_3j77BW_catSettings",
4872
+ "panel": "_3j77BW_panel",
4873
+ "pathRow": "_3j77BW_pathRow",
4874
+ "pathText": "_3j77BW_pathText",
4875
+ "catDiagnostics": "_3j77BW_catDiagnostics",
4876
+ "previewRow": "_3j77BW_previewRow",
4877
+ "empty": "_3j77BW_empty"
4690
4878
  };
4691
4879
  //#endregion
4692
4880
  //#region src/client/components/modals/LogsModal.tsx
4693
4881
  /**
4694
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4882
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4695
4883
  * Website: https://dsh-plugin.org
4696
4884
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
4697
4885
  *
@@ -4964,7 +5152,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4964
5152
  //#endregion
4965
5153
  //#region src/client/components/modals/LogsPathModal.tsx
4966
5154
  /**
4967
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
5155
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4968
5156
  * Website: https://dsh-plugin.org
4969
5157
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
4970
5158
  *
@@ -5079,7 +5267,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5079
5267
  //#endregion
5080
5268
  //#region src/client/components/views/LogsView.tsx
5081
5269
  /**
5082
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
5270
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
5083
5271
  * Website: https://dsh-plugin.org
5084
5272
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
5085
5273
  *
@@ -5203,7 +5391,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5203
5391
  //#endregion
5204
5392
  //#region src/client/components/views/SettingsView.tsx
5205
5393
  /**
5206
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
5394
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
5207
5395
  * Website: https://dsh-plugin.org
5208
5396
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
5209
5397
  *
@@ -5419,7 +5607,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5419
5607
  //#endregion
5420
5608
  //#region src/client/components/PluginHubSection.tsx
5421
5609
  /**
5422
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
5610
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
5423
5611
  * Website: https://dsh-plugin.org
5424
5612
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
5425
5613
  *
@@ -5477,6 +5665,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5477
5665
  const [notifications, setNotifications] = (0, react.useState)(() => loadNotifications());
5478
5666
  /** 通知中心弹窗:一级导航「设置」tab 后边的铃铛入口按钮打开 */
5479
5667
  const [showNotifications, setShowNotifications] = (0, react.useState)(false);
5668
+ /** 「忽略本次更新」确认弹窗:{ repo, version };null = 关闭 */
5669
+ const [ignoreTarget, setIgnoreTarget] = (0, react.useState)(null);
5480
5670
  /** 宿主机器环境快照:提交 bug 的 issue 正文附带;取不到为 null(链接少环境段,不阻塞) */
5481
5671
  const [env, setEnv] = (0, react.useState)(null);
5482
5672
  (0, react.useEffect)(() => {
@@ -5545,24 +5735,35 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5545
5735
  } : null;
5546
5736
  }
5547
5737
  });
5548
- const startupCheckedRef = (0, react.useRef)(false);
5549
- (0, react.useEffect)(() => {
5550
- if (startupCheckedRef.current) return;
5551
- if (!settingsReady || catalog.plugins === null || catalog.failed) return;
5552
- startupCheckedRef.current = true;
5553
- if (!hubSettings.checkUpdatesOnStart) return;
5738
+ /** 补齐更新提醒:把「当前有更新但通知中心还没有」的插件补写进通知(repo+version 去重)。
5739
+ * 返回本次实际新增的条数(0 = 无可更新或全部已提示过)。启动检查与打开通知中心共用,
5740
+ * 保证通知中心始终反映可更新状态:同一版本只一条、清空/删除后重开恢复、更新完成后消失。 */
5741
+ const syncUpdateNotices = () => {
5554
5742
  const updatable = catalog.installedItems.filter((i) => i.hasUpdate && i.plugin);
5555
- if (updatable.length === 0) return;
5556
- for (const item of updatable) if (item.repo) addUpdateNotice({
5743
+ if (updatable.length === 0) return 0;
5744
+ const known = new Set(loadIgnoredUpdates());
5745
+ for (const r of loadNotifications()) if (r.kind === "update") known.add(`${r.repo}@${r.version ?? ""}`);
5746
+ const fresh = updatable.filter((item) => item.repo !== null && !known.has(`${item.repo}@${item.catalogVersion ?? ""}`));
5747
+ if (fresh.length === 0) return 0;
5748
+ for (const item of fresh) if (item.repo) addUpdateNotice({
5557
5749
  kind: "update",
5558
5750
  repo: item.repo,
5559
5751
  version: item.catalogVersion ?? void 0
5560
5752
  });
5561
5753
  setNotifications(loadNotifications());
5562
- setToast({
5754
+ return fresh.length;
5755
+ };
5756
+ const startupCheckedRef = (0, react.useRef)(false);
5757
+ (0, react.useEffect)(() => {
5758
+ if (startupCheckedRef.current) return;
5759
+ if (!settingsReady || catalog.plugins === null || catalog.failed) return;
5760
+ startupCheckedRef.current = true;
5761
+ if (!hubSettings.checkUpdatesOnStart) return;
5762
+ const added = syncUpdateNotices();
5763
+ if (added > 0) setToast({
5563
5764
  id: Date.now(),
5564
5765
  kind: "updates",
5565
- n: updatable.length
5766
+ n: added
5566
5767
  });
5567
5768
  }, [
5568
5769
  settingsReady,
@@ -5573,7 +5774,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5573
5774
  queue
5574
5775
  ]);
5575
5776
  (0, react.useEffect)(() => {
5576
- if (!confirmPlugin && !confirmCustomTarget && !confirmGlobalNpm && !uninstallPlugin && !uninstallItem && !detailItem && !showHubUpdate && !showAbout && !showNotifications) return;
5777
+ if (!confirmPlugin && !confirmCustomTarget && !confirmGlobalNpm && !uninstallPlugin && !uninstallItem && !detailItem && !showHubUpdate && !showAbout && !showNotifications && !ignoreTarget) return;
5577
5778
  const onKey = (e) => {
5578
5779
  if (e.key === "Escape") {
5579
5780
  setConfirmPlugin(null);
@@ -5586,6 +5787,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5586
5787
  setShowHubUpdate(false);
5587
5788
  setShowAbout(false);
5588
5789
  setShowNotifications(false);
5790
+ setIgnoreTarget(null);
5589
5791
  }
5590
5792
  };
5591
5793
  window.addEventListener("keydown", onKey);
@@ -5598,7 +5800,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5598
5800
  detailItem,
5599
5801
  showHubUpdate,
5600
5802
  showAbout,
5601
- showNotifications
5803
+ showNotifications,
5804
+ ignoreTarget
5602
5805
  ]);
5603
5806
  (0, react.useEffect)(() => {
5604
5807
  if (!toast) return;
@@ -5712,7 +5915,9 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5712
5915
  statsVerified,
5713
5916
  onToggleLang: toggleLang,
5714
5917
  hubUpdate: catalog.hubHasUpdate,
5715
- onVersionClick: () => setShowHubUpdate(true),
5918
+ onVersionClick: () => {
5919
+ catalog.refreshHub().then(() => setShowHubUpdate(true));
5920
+ },
5716
5921
  onAboutClick: () => setShowAbout(true)
5717
5922
  }), (0, react.createElement)("div", { className: Header_module_css_default.tabsRow }, (0, react.createElement)(SectionTabs, {
5718
5923
  view,
@@ -5720,7 +5925,10 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5720
5925
  installedCount: catalog.installedItems.length,
5721
5926
  t,
5722
5927
  noticeCount: notifications.length + queue.queue.length + queue.pendingRestarts.length,
5723
- onOpenNotifications: () => setShowNotifications(true)
5928
+ onOpenNotifications: () => {
5929
+ if (hubSettings.checkUpdatesOnStart) syncUpdateNotices();
5930
+ setShowNotifications(true);
5931
+ }
5724
5932
  })), view === "market" ? (0, react.createElement)(MarketView, {
5725
5933
  catalog,
5726
5934
  t,
@@ -5801,7 +6009,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5801
6009
  });
5802
6010
  }
5803
6011
  }), showHubUpdate && (0, react.createElement)(HubUpdateModal, {
5804
- info: catalog.hubUpdateInfo ?? { version: "1.2.0" },
6012
+ info: catalog.hubUpdateInfo ?? { version: "1.3.0" },
5805
6013
  lang,
5806
6014
  t,
5807
6015
  hasUpdate: catalog.hubHasUpdate,
@@ -5845,12 +6053,42 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5845
6053
  queue.clearModalTask();
5846
6054
  setConfirmPlugin(plugin);
5847
6055
  },
6056
+ onIgnoreUpdate: (repo, version) => setIgnoreTarget({
6057
+ repo,
6058
+ version
6059
+ }),
5848
6060
  cancelTask: queue.cancelTask,
5849
6061
  restarting,
5850
6062
  onRestart: () => {
5851
6063
  requestRestart();
5852
6064
  }
5853
- }), confirmPlugin && (0, react.createElement)(InstallModal, {
6065
+ }), ignoreTarget && (0, react.createElement)("div", {
6066
+ className: Modal_module_css_default.overlay,
6067
+ onClick: (e) => {
6068
+ if (e.target === e.currentTarget) setIgnoreTarget(null);
6069
+ }
6070
+ }, (0, react.createElement)("div", {
6071
+ className: Modal_module_css_default.modal,
6072
+ role: "dialog",
6073
+ "aria-modal": "true"
6074
+ }, (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", {
6075
+ className: Modal_module_css_default.modalClose,
6076
+ type: "button",
6077
+ "aria-label": t("errorClose"),
6078
+ onClick: () => setIgnoreTarget(null)
6079
+ }, (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", {
6080
+ className: Modal_module_css_default.restartLater,
6081
+ type: "button",
6082
+ onClick: () => setIgnoreTarget(null)
6083
+ }, t("confirmCancel")), (0, react.createElement)("button", {
6084
+ className: Modal_module_css_default.restartNow,
6085
+ type: "button",
6086
+ onClick: () => {
6087
+ ignoreUpdate(ignoreTarget.repo, ignoreTarget.version);
6088
+ setNotifications(removeUpdateNotice(ignoreTarget.repo, ignoreTarget.version));
6089
+ setIgnoreTarget(null);
6090
+ }
6091
+ }, t("ignoreUpdateConfirm")))))), confirmPlugin && (0, react.createElement)(InstallModal, {
5854
6092
  plugin: confirmPlugin,
5855
6093
  done: installDone,
5856
6094
  task: queue.installModalTask,
@@ -6008,7 +6246,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6008
6246
  }
6009
6247
  //#endregion
6010
6248
  //#region \0dsh-css:src/client/styles/tokens.module.css.mjs
6011
- 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}";
6249
+ 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}";
6012
6250
  const tagId = "dsh-plugin/tokens.module.css";
6013
6251
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
6014
6252
  const tag = document.createElement("style");
@@ -6020,7 +6258,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6020
6258
  //#endregion
6021
6259
  //#region src/client/index.tsx
6022
6260
  /**
6023
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
6261
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
6024
6262
  * Website: https://dsh-plugin.org
6025
6263
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
6026
6264
  *