dsh-plugin 1.2.1 → 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 +668 -429
  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 +2 -2
  61. package/src/client/logic/failures.ts +48 -2
  62. package/src/client/logic/format.ts +1 -1
  63. package/src/client/logic/install-command.ts +1 -1
  64. package/src/client/logic/installed.ts +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
- "searchRow": "qikqja_searchRow",
591
- "taglineLink": "qikqja_taglineLink",
592
- "tabCount": "qikqja_tabCount",
593
- "sortGroup": "qikqja_sortGroup",
594
- "tab": "qikqja_tab",
595
- "segBtn": "qikqja_segBtn",
596
- "versionBtn": "qikqja_versionBtn",
597
- "resultSeg": "qikqja_resultSeg",
598
- "headerTitleRow": "qikqja_headerTitleRow",
599
- "header": "qikqja_header",
600
- "tabs": "qikqja_tabs",
601
- "resultCount": "qikqja_resultCount",
602
- "tabActive": "qikqja_tabActive",
603
- "adBanner": "qikqja_adBanner",
604
610
  "copyIcon": "qikqja_copyIcon",
605
- "controls": "qikqja_controls",
606
- "githubIcon": "qikqja_githubIcon",
607
611
  "hubUpdateBadge": "qikqja_hubUpdateBadge",
612
+ "adArrow": "qikqja_adArrow",
613
+ "githubLink": "qikqja_githubLink",
608
614
  "tagline": "qikqja_tagline",
609
- "adBadge": "qikqja_adBadge",
615
+ "controls": "qikqja_controls",
610
616
  "adText": "qikqja_adText",
611
- "search": "qikqja_search",
612
- "root": "qikqja_root",
617
+ "tabCount": "qikqja_tabCount",
613
618
  "tabsRow": "qikqja_tabsRow",
614
- "langBtn": "qikqja_langBtn",
615
619
  "logoIcon": "qikqja_logoIcon",
616
- "headerRight": "qikqja_headerRight",
617
- "title": "qikqja_title",
618
- "segLabel": "qikqja_segLabel",
620
+ "root": "qikqja_root",
621
+ "resultCount": "qikqja_resultCount",
619
622
  "version": "qikqja_version",
623
+ "segLabel": "qikqja_segLabel",
620
624
  "aboutBtn": "qikqja_aboutBtn",
625
+ "segBtn": "qikqja_segBtn",
626
+ "tabs": "qikqja_tabs",
627
+ "adBanner": "qikqja_adBanner",
621
628
  "segGroup": "qikqja_segGroup",
622
- "githubLink": "qikqja_githubLink",
629
+ "resultSeg": "qikqja_resultSeg",
630
+ "githubIcon": "qikqja_githubIcon",
631
+ "tab": "qikqja_tab",
632
+ "langBtn": "qikqja_langBtn",
623
633
  "brandTitle": "qikqja_brandTitle",
624
- "adArrow": "qikqja_adArrow",
625
- "segBtnActive": "qikqja_segBtnActive"
634
+ "taglineLink": "qikqja_taglineLink",
635
+ "search": "qikqja_search",
636
+ "searchRow": "qikqja_searchRow",
637
+ "segBtnActive": "qikqja_segBtnActive",
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
@@ -688,11 +844,11 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
688
844
  /** 接口中心「关注我们」内容(静态 JSON,由 api-center 的 about.md 构建生成,Markdown)。 */
689
845
  const HUB_ABOUT_URL = "https://api.dsh-plugin.org/about.json";
690
846
  /**
691
- * 插件当前版本号,供头部标题展示「DSH-Plugin Hub v0.1.1」。
847
+ * 插件当前版本号,供头部标题展示「DSH Plugin Hub v0.1.1」。
692
848
  * tsdown 构建时用 define 把 __PLUGIN_VERSION__ 替换成 package.json 的版本号;
693
849
  * node --test 直接 import 本模块时该标识符不存在,typeof 守卫兜底为空串。
694
850
  */
695
- const PLUGIN_VERSION = "1.2.1";
851
+ const PLUGIN_VERSION = "1.3.0";
696
852
  const CATEGORY_ORDER = [
697
853
  "interface",
698
854
  "session",
@@ -939,10 +1095,17 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
939
1095
  }
940
1096
  //#endregion
941
1097
  //#region src/client/data/hub.ts
1098
+ /** 版本接口是 Pages 静态文件,默认带 CDN 缓存(Cache-Control: public, max-age=43200,
1099
+ * 即 12 小时),客户端 no-store 管不到 CDN 边缘,会拿到旧公告。
1100
+ * 静态资产请求免费且无限,因此所有版本检查一律带时间戳 query:URL 每次不同 →
1101
+ * CDN 缓存 key 不同 → 强制回源拉到最新公告,无任何配额顾虑。 */
1102
+ function busted(url) {
1103
+ return `${url}${url.includes("?") ? "&" : "?"}_t=${Date.now()}`;
1104
+ }
942
1105
  /** Worker 版本控制中心:最新版本 + Markdown 变更记录;不可用返回 null。 */
943
1106
  async function fetchHubUpdate() {
944
1107
  try {
945
- const res = await fetch(HUB_UPDATE_URL, { cache: "no-store" });
1108
+ const res = await fetch(busted(HUB_UPDATE_URL), { cache: "no-store" });
946
1109
  if (!res.ok) return null;
947
1110
  const data = await res.json();
948
1111
  if (!data) return null;
@@ -960,7 +1123,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
960
1123
  /** Worker「关注我们」内容(平台介绍 + 反馈群二维码,Markdown);未推送返回 null。 */
961
1124
  async function fetchHubAbout() {
962
1125
  try {
963
- const res = await fetch(HUB_ABOUT_URL, { cache: "no-store" });
1126
+ const res = await fetch(busted(HUB_ABOUT_URL), { cache: "no-store" });
964
1127
  if (!res.ok) return null;
965
1128
  const data = await res.json();
966
1129
  if (!data || data.content === null || data.content === void 0) return null;
@@ -1095,7 +1258,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1095
1258
  //#endregion
1096
1259
  //#region src/client/hooks/useCatalog.ts
1097
1260
  /**
1098
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1261
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1099
1262
  * Website: https://dsh-plugin.org
1100
1263
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
1101
1264
  *
@@ -1105,7 +1268,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1105
1268
  * installed-plugin table, and the filter/search/sort/install-status view
1106
1269
  * state, exposing the derived visible list and per-category counts.
1107
1270
  */
1108
- /** 插件市场自身仓库:DSH-Plugin Hub 不显示在目录里(自己不进自己的插件列表) */
1271
+ /** 插件市场自身仓库:DSH Plugin Hub 不显示在目录里(自己不进自己的插件列表) */
1109
1272
  const SELF_REPO = "dshplugin/dsh-plugin-hub";
1110
1273
  /** 市场各排序的默认方向:全部按倒序(Star/Fork 多、更新/收录近的在前) */
1111
1274
  const SORT_DEFAULT_DIR$1 = {
@@ -1137,6 +1300,17 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1137
1300
  setSortDir(SORT_DEFAULT_DIR$1[key]);
1138
1301
  }
1139
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
+ };
1140
1314
  /** 当前 profile 已安装插件:npm 包名 -> manifest spec(来自宿主本地路由) */
1141
1315
  const [installed, setInstalled] = (0, react.useState)({});
1142
1316
  /** 安装时记录的目录信号:repo(小写) -> { version, updatedAt }(来自宿主本地路由);
@@ -1236,7 +1410,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1236
1410
  */
1237
1411
  const hubHasUpdate = (() => {
1238
1412
  if (!hubUpdateInfo) return false;
1239
- return hubUpdateInfo.version !== "1.2.1";
1413
+ return hubUpdateInfo.version !== "1.3.0";
1240
1414
  })();
1241
1415
  (0, react.useMemo)(() => {
1242
1416
  if (!plugins) return [];
@@ -1286,6 +1460,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1286
1460
  hubHasUpdate,
1287
1461
  hubUpdateInfo,
1288
1462
  hubAboutInfo,
1463
+ refreshHub,
1289
1464
  refreshInstalled,
1290
1465
  category,
1291
1466
  setCategory,
@@ -1355,14 +1530,50 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1355
1530
  message: ""
1356
1531
  });
1357
1532
  }
1358
- /** 记录一条「发现新版本」更新提醒:成功类轻量记录,携带目录新版本号供通知中心展示。 */
1533
+ /** 记录一条「发现新版本」更新提醒:成功类轻量记录,携带目录新版本号供通知中心展示。
1534
+ * 同一插件同一新版本已在通知中心时跳过:宿主重载会重新触发启动检查,不更新时
1535
+ * 通知里已有的提醒保持单条,不重复追加。 */
1359
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;
1360
1539
  return addNotification({
1361
1540
  ...record,
1362
1541
  ok: true,
1363
1542
  message: ""
1364
1543
  });
1365
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
+ }
1366
1577
  /** 清空全部通知记录,返回空列表。 */
1367
1578
  function clearNotifications() {
1368
1579
  save([]);
@@ -1483,7 +1694,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1483
1694
  `- Cause: ${reason}`,
1484
1695
  ...code ? [`- Key error: \`${code}\``] : [],
1485
1696
  "",
1486
- `## [DSH-Plugin 插件中心](${SITE_URL}) · 安装 Plugin 失败错误信息`,
1697
+ `## [DSH Plugin 插件中心](${SITE_URL}) · 安装 Plugin 失败错误信息`,
1487
1698
  `本错误信息由 [dsh-plugin-hub](${GITHUB_URL}) 插件中心的安装程序自动生成,随本次安装失败一并提交。`,
1488
1699
  `- 实际执行的安装命令:\`${command ?? `dsh plugin${env?.profile ? ` --profile ${env.profile}` : ""} add git+https://github.com/${repo}.git`}\``,
1489
1700
  `- 执行结果:安装失败,未能安装该插件。`,
@@ -1538,7 +1749,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1538
1749
  //#endregion
1539
1750
  //#region src/client/hooks/useLanguage.ts
1540
1751
  /**
1541
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1752
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1542
1753
  * Website: https://dsh-plugin.org
1543
1754
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
1544
1755
  *
@@ -1569,7 +1780,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1569
1780
  //#endregion
1570
1781
  //#region src/client/hooks/useSettings.ts
1571
1782
  /**
1572
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1783
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1573
1784
  * Website: https://dsh-plugin.org
1574
1785
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
1575
1786
  *
@@ -1645,7 +1856,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1645
1856
  //#endregion
1646
1857
  //#region src/client/hooks/useTaskQueue.ts
1647
1858
  /**
1648
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1859
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
1649
1860
  * Website: https://dsh-plugin.org
1650
1861
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
1651
1862
  *
@@ -2144,143 +2355,9 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2144
2355
  };
2145
2356
  }
2146
2357
  //#endregion
2147
- //#region \0dsh-css:src/client/styles/Modal.module.css.mjs
2148
- const css$10 = ".BiQ1zG_overlay{z-index:998;-webkit-user-select:none;user-select:none;background:#00000061;justify-content:center;align-items:center;animation:.16s ease-out BiQ1zG_overlayIn;display:flex;position:fixed;top:0;bottom:0;left:0;right:0}.BiQ1zG_modal,.BiQ1zG_errorModal{background:var(--hub-bg-1);border:1px solid var(--hub-border-2);border-radius:10px;flex-direction:column;gap:10px;width:420px;max-width:calc(100vw - 32px);max-height:calc(100vh - 64px);padding:14px 16px;animation:.18s ease-out BiQ1zG_modalIn;display:flex;box-shadow:0 12px 40px #0000003d}.BiQ1zG_errorModal{width:640px;max-width:calc(100vw - 48px)}.BiQ1zG_modalWide{width:560px;max-width:calc(100vw - 48px)}.BiQ1zG_logModal{width:780px;max-width:calc(100vw - 48px);height:min(540px,100vh - 64px)}.BiQ1zG_modalHead{flex-shrink:0;justify-content:space-between;align-items:center;gap:8px;display:flex}.BiQ1zG_modalTitle{color:var(--hub-text-primary);font-size:14px;font-weight:600;line-height:20px}.BiQ1zG_modalTitleBusy{color:var(--hub-brand)}.BiQ1zG_modalTitleQueued{color:var(--hub-warning)}.BiQ1zG_modalClose{width:24px;height:24px;color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;font-size:16px;line-height:1;display:inline-flex}.BiQ1zG_modalClose:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.BiQ1zG_modalCloseIcon{flex-shrink:0;width:14px;height:14px}.BiQ1zG_modalDesc{color:var(--hub-text-secondary);font-size:12px;line-height:18px}.BiQ1zG_trustHint{color:var(--hub-danger-text);background:var(--hub-danger-tint);border:1px solid var(--hub-danger-border-soft);border-radius:6px;padding:6px 10px;font-size:12px;font-weight:500;line-height:18px}.BiQ1zG_cliOnlyHint{color:var(--hub-text-secondary);background:var(--hub-bg-hover);border-radius:6px;padding:6px 10px;font-size:12px;line-height:18px}.BiQ1zG_failedCopyHint{color:var(--hub-danger-text);background:var(--hub-danger-tint);border:1px solid var(--hub-danger-border-soft);border-radius:6px;padding:6px 10px;font-size:12px;font-weight:500;line-height:18px}.BiQ1zG_modalRow{align-items:baseline;gap:8px;min-width:0;font-size:12px;line-height:18px;display:flex}.BiQ1zG_modalLabel{min-width:64px;color:var(--hub-text-tertiary);flex-shrink:0}.BiQ1zG_modalValue{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-text-primary);font-weight:500;overflow:hidden}.BiQ1zG_modalLink{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:4px;font-weight:500;text-decoration:none;transition:color .12s;display:inline-flex;overflow:hidden}.BiQ1zG_modalLink:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_linkIcon{flex-shrink:0}.BiQ1zG_modalCmd{color:var(--hub-text-primary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;justify-content:space-between;align-items:center;gap:8px;padding:6px 6px 6px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:18px;transition:border-color .12s,background .12s;display:flex}.BiQ1zG_modalCmd:hover{border-color:var(--hub-border-ghost);background:var(--hub-bg-3)}.BiQ1zG_modalCmdText{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.BiQ1zG_modalCmdCopy{color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:4px;flex-shrink:0;align-items:center;gap:3px;padding:1px 7px;font-family:inherit;font-size:11px;line-height:16px;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_modalCmdCopy:hover{color:var(--hub-brand-hover);background:var(--hub-bg-2)}.BiQ1zG_modalActions{justify-content:flex-end;align-items:center;gap:8px;margin-top:2px;display:flex}.BiQ1zG_modalBody{flex-direction:column;flex:auto;gap:10px;min-height:0;display:flex;overflow-y:auto}.BiQ1zG_toast{z-index:1000;background:var(--hub-btn-fill);color:var(--hub-text-on-fill);pointer-events:none;white-space:nowrap;border:none;border-radius:8px;padding:10px 16px;font-size:12px;font-weight:500;line-height:18px;animation:.22s ease-out BiQ1zG_toastIn;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:0 6px 24px #00000047}@keyframes BiQ1zG_toastIn{0%{opacity:0;transform:translate(-50%,-44%)}to{opacity:1;transform:translate(-50%,-50%)}}.BiQ1zG_toastFail{background:var(--hub-danger);color:#fff;border-color:#ffffff3d}.BiQ1zG_queueSection{flex-direction:column;gap:6px;display:flex}.BiQ1zG_queueSectionTitle{color:var(--hub-text-secondary);padding:4px 2px 0;font-size:12px;font-weight:600;line-height:18px}.BiQ1zG_pendingRowStatus{color:var(--hub-warn);flex-shrink:0;font-weight:500}.BiQ1zG_pendingRowActions{flex-shrink:0;gap:8px;margin-left:auto;display:flex}.BiQ1zG_queueRow{border:1px solid var(--hub-border-2);background:var(--hub-bg-2);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:8px;flex-direction:column;gap:5px;padding:8px 10px;font-size:12px;line-height:18px;transition:background .12s;display:flex}.BiQ1zG_queueRow:hover{background:var(--hub-brand-tint)}.BiQ1zG_queueRowHead{align-items:center;gap:10px;display:flex}.BiQ1zG_queueRowTarget{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-text-primary);flex:1;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;overflow:hidden}.BiQ1zG_queueRowDesc{color:var(--hub-text-tertiary);-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.BiQ1zG_queueRowBody{align-items:center;gap:8px;display:flex}.BiQ1zG_queueRowStatus{color:var(--hub-brand);flex-shrink:0;font-weight:500}.BiQ1zG_queueRowTrack{flex:1;min-width:0}.BiQ1zG_queueRowPct{color:var(--hub-text-tertiary);font-variant-numeric:tabular-nums;flex-shrink:0}.BiQ1zG_stripCancel{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;flex-shrink:0;padding:2px 10px;font-size:12px;line-height:18px;transition:background .12s,color .12s}.BiQ1zG_stripCancel:hover{background:var(--hub-danger-tint);color:var(--hub-danger-text)}.BiQ1zG_stripCancel:disabled{opacity:.45;cursor:default}.BiQ1zG_queuedHint{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);border-radius:6px;padding:5px 10px;font-size:12px;line-height:18px}.BiQ1zG_errorTitle{color:var(--hub-danger-text);font-size:14px;font-weight:600;line-height:20px}.BiQ1zG_errorBox{border:1px solid var(--hub-danger-border);background:var(--hub-danger-tint-weak);max-height:240px;color:var(--hub-text-primary);white-space:pre-wrap;word-break:break-word;-webkit-user-select:none;user-select:none;border-radius:6px;margin:0;padding:10px 12px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:17px;overflow:auto}.BiQ1zG_errorCopySoft{color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:4px;flex-shrink:0;align-items:center;padding:2px 8px;font-size:11px;line-height:16px;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_errorCopySoft:hover{color:var(--hub-text-secondary);background:var(--hub-bg-2)}.BiQ1zG_errorHint{color:var(--hub-text-tertiary);font-size:12px;line-height:18px}.BiQ1zG_modalCancel,.BiQ1zG_modalCopy{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;padding:5px 14px;font-size:12px;line-height:18px;transition:color .12s,background .12s}.BiQ1zG_modalCancel:hover,.BiQ1zG_modalCopy:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.BiQ1zG_modalInstall{color:var(--hub-text-on-fill);background:var(--hub-btn-fill);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_modalInstall:hover{background:var(--hub-btn-hover)}.BiQ1zG_modalCopy:disabled,.BiQ1zG_modalInstall:disabled,.BiQ1zG_modalCancel:disabled,.BiQ1zG_modalClose:disabled,.BiQ1zG_uninstallConfirm:disabled{opacity:.55;cursor:not-allowed;pointer-events:none}.BiQ1zG_uninstallConfirm{color:#fff;background:var(--hub-danger);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_uninstallConfirm:hover{background:var(--hub-danger-hover)}.BiQ1zG_result{text-align:center;flex-direction:column;align-items:center;gap:5px;padding:10px 0 2px;display:flex}.BiQ1zG_resultCheck{background:var(--hub-success-tint);width:40px;height:40px;color:var(--hub-success);border-radius:50%;justify-content:center;align-items:center;margin-bottom:3px;display:inline-flex}.BiQ1zG_resultCheckIcon{flex-shrink:0;width:20px;height:20px}.BiQ1zG_resultTitle{color:var(--hub-text-primary);font-size:13px;font-weight:600;line-height:20px}.BiQ1zG_resultDesc{color:var(--hub-text-secondary);font-size:12px;line-height:18px}.BiQ1zG_resultRestarting{color:var(--hub-text-tertiary);padding:12px 0 6px;font-size:12px;line-height:18px}.BiQ1zG_restartLater{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;padding:5px 14px;font-size:12px;line-height:18px;transition:color .12s,background .12s}.BiQ1zG_restartLater:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}.BiQ1zG_restartNow{color:var(--hub-text-on-fill);background:var(--hub-btn-fill);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_restartNow:hover{background:var(--hub-btn-hover)}.BiQ1zG_restartNow:disabled{opacity:.55;cursor:not-allowed;pointer-events:none}.BiQ1zG_restartNowWarning{color:#fff;background:var(--hub-warning);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:5px 14px;font-size:12px;font-weight:600;line-height:18px;transition:background .12s}.BiQ1zG_restartNowWarning:hover{background:var(--hub-warning-hover)}.BiQ1zG_restartNowWarning:disabled{opacity:.55;cursor:not-allowed;pointer-events:none}.BiQ1zG_result .BiQ1zG_modalActions{justify-content:center;gap:10px;margin-top:0;padding:6px 0 2px}.BiQ1zG_result .BiQ1zG_modalActions .BiQ1zG_restartLater,.BiQ1zG_result .BiQ1zG_modalActions .BiQ1zG_restartNow,.BiQ1zG_result .BiQ1zG_modalActions .BiQ1zG_restartNowWarning{min-width:100px}.BiQ1zG_progress{margin:10px 0 2px}.BiQ1zG_progressHead{justify-content:flex-end;align-items:center;margin-bottom:3px;display:flex}.BiQ1zG_progressText{color:var(--hub-text-secondary);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:14px}.BiQ1zG_progressTrack{background:var(--hub-border-2);border-radius:2px;height:4px;overflow:hidden}.BiQ1zG_progressFill{background:var(--hub-brand);border-radius:2px;height:100%;transition:width .32s}.BiQ1zG_progressFillFail{background:var(--hub-danger)}@keyframes BiQ1zG_overlayIn{0%{opacity:0}to{opacity:1}}@keyframes BiQ1zG_modalIn{0%{opacity:0;transform:translateY(6px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}.BiQ1zG_failList{flex-direction:column;gap:12px;padding-right:2px;display:flex}.BiQ1zG_failRow{border:1px solid var(--hub-border-2);background:var(--hub-bg-2);border-radius:8px;flex-direction:column;gap:8px;padding:10px 12px;display:flex}.BiQ1zG_failHead{align-items:center;gap:8px;min-width:0;display:flex}.BiQ1zG_noticeList{flex-direction:column;gap:10px;padding-right:2px;display:flex}.BiQ1zG_noticeRow{border:1px solid var(--hub-border-2);background:var(--hub-bg-2);border-radius:8px;flex-direction:column;align-items:stretch;gap:6px;padding:10px 12px;display:flex}.BiQ1zG_noticeRowMain{align-items:center;gap:10px;width:100%;min-width:0;display:flex}.BiQ1zG_noticeBadgeOk,.BiQ1zG_noticeBadgeFail{border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:28px;height:28px;display:inline-flex;box-shadow:0 2px 6px #0000002e}.BiQ1zG_noticeBadgeOk{background:var(--hub-success)}.BiQ1zG_noticeBadgeFail{background:var(--hub-danger)}.BiQ1zG_noticeBadgeIcon{flex-shrink:0;width:12px;height:12px}.BiQ1zG_noticeMain{flex-direction:column;flex:1;gap:8px;min-width:0;display:flex}.BiQ1zG_noticeHead{align-items:center;gap:8px;min-width:0;display:flex}.BiQ1zG_noticeTextOk{color:var(--hub-success);flex-shrink:0;font-size:12px;font-weight:600;line-height:18px}.BiQ1zG_noticeTextFail{color:var(--hub-danger-text);flex-shrink:0;font-size:12px;font-weight:600;line-height:18px}.BiQ1zG_noticeFoot{justify-content:flex-end;align-items:center;display:flex}.BiQ1zG_noticeTime{color:var(--hub-text-tertiary);font-variant-numeric:tabular-nums;flex-shrink:0;font-size:11px;line-height:16px}.BiQ1zG_noticeRemove{width:22px;height:22px;color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:5px;flex-shrink:0;justify-content:center;align-items:center;margin-left:auto;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_noticeRemove:hover{color:var(--hub-danger-text);background:var(--hub-danger-tint)}.BiQ1zG_noticeRowOk .BiQ1zG_noticeRemove{margin-left:0}.BiQ1zG_noticeRowOk .BiQ1zG_noticeTime{margin-left:auto}.BiQ1zG_noticeRowUpdate{cursor:pointer;transition:border-color .12s,background .12s}.BiQ1zG_noticeRowUpdate:hover{border-color:var(--hub-brand);background:var(--hub-brand-tint)}.BiQ1zG_noticeVersion{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border);font-variant-numeric:tabular-nums;border-radius:5px;flex-shrink:0;padding:0 6px;font-size:11px;font-weight:600;line-height:18px}.BiQ1zG_noticeUpdateGo{color:#fff;background:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:5px;flex-shrink:0;margin-left:2px;padding:2px 8px;font-size:11px;font-weight:600;line-height:16px;transition:background .12s}.BiQ1zG_noticeUpdateGo:hover{background:var(--hub-brand-hover)}.BiQ1zG_failKind{border:1px solid #0000;border-radius:4px;flex-shrink:0;padding:0 6px;font-size:10px;font-weight:500;line-height:16px}.BiQ1zG_failKindInstall{color:var(--hub-danger-text);border-color:var(--hub-danger-border);background:var(--hub-danger-tint)}.BiQ1zG_failKindUninstall{color:var(--hub-warn);border-color:var(--hub-warn-border);background:var(--hub-warn-tint)}.BiQ1zG_failRepo{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;flex:1;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;line-height:18px;text-decoration:none;overflow:hidden}.BiQ1zG_failRepo:hover{text-decoration:underline}.BiQ1zG_failCopy{color:var(--hub-text-tertiary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:4px;flex-shrink:0;align-items:center;padding:2px 8px;font-size:11px;line-height:16px;transition:color .12s,background .12s;display:inline-flex}.BiQ1zG_failCopy:hover{color:var(--hub-text-secondary);background:var(--hub-bg-2)}.BiQ1zG_failEmpty{text-align:center;color:var(--hub-text-tertiary);padding:24px 0;font-size:12px;line-height:18px}.BiQ1zG_failClear{color:var(--hub-danger);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;padding:5px 14px;font-size:12px;line-height:18px;transition:color .12s,background .12s}.BiQ1zG_failClear:hover{color:#fff;background:var(--hub-danger)}.BiQ1zG_failBigIssue{box-sizing:border-box;text-align:center;color:#fff;background:var(--hub-danger);border:1px solid var(--hub-danger);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:8px;width:100%;margin-top:4px;padding:3px 16px;font-size:13px;font-weight:600;line-height:18px;text-decoration:none;transition:background .12s,border-color .12s,box-shadow .12s;display:block}.BiQ1zG_failBigIssue:hover{background:var(--hub-danger-hover);border-color:var(--hub-danger-hover);box-shadow:0 3px 10px #d1242f59}.BiQ1zG_failPrepareHint{color:var(--hub-warning);background:var(--hub-warning-tint);border:1px solid var(--hub-warning-border);border-radius:6px;margin-top:6px;padding:8px 12px;font-size:12px;line-height:18px}.BiQ1zG_aboutModal{width:460px;max-width:calc(100vw - 48px)}.BiQ1zG_aboutContent{min-height:0;max-height:340px;color:var(--hub-text-secondary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);border-radius:8px;flex:auto;padding:10px 12px;font-size:12px;line-height:18px;overflow-y:auto}.BiQ1zG_aboutContent>:first-child{margin-top:0}.BiQ1zG_aboutContent>:last-child{margin-bottom:0}.BiQ1zG_aboutContent h2,.BiQ1zG_aboutContent h3,.BiQ1zG_aboutContent h4,.BiQ1zG_aboutContent h5{color:var(--hub-text-primary);margin:10px 0 4px;font-size:13px;font-weight:600;line-height:20px}.BiQ1zG_aboutContent h2{font-size:14px}.BiQ1zG_aboutContent p{margin:4px 0}.BiQ1zG_aboutContent ul,.BiQ1zG_aboutContent ol{margin:4px 0;padding-left:18px}.BiQ1zG_aboutContent li{margin:2px 0}.BiQ1zG_aboutContent code{background:var(--hub-bg-hover);color:var(--hub-text-primary);border-radius:4px;padding:1px 4px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}.BiQ1zG_aboutContent pre{background:var(--hub-bg-1);border:1px solid var(--hub-border-2);border-radius:6px;margin:6px 0;padding:8px 10px;overflow-x:auto}.BiQ1zG_aboutContent pre code{background:0 0;border-radius:0;padding:0}.BiQ1zG_aboutContent blockquote{border-left:3px solid var(--hub-brand);background:var(--hub-bg-hover);color:var(--hub-text-tertiary);border-radius:0 6px 6px 0;margin:6px 0;padding:2px 10px}.BiQ1zG_aboutContent a{color:var(--hub-brand);text-decoration:none}.BiQ1zG_aboutContent a:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_aboutContent img{border-radius:8px;max-width:100%;max-height:220px;margin:8px auto;display:block;box-shadow:0 2px 8px #0000001f}.BiQ1zG_aboutMeta{color:var(--hub-text-tertiary);font-size:11px;line-height:16px}.BiQ1zG_hubUpdateModal{width:520px;max-width:calc(100vw - 48px)}.BiQ1zG_hubUpdateMeta{flex-wrap:wrap;align-items:center;gap:4px 14px;font-size:12px;line-height:18px;display:flex}.BiQ1zG_hubUpdateMetaItem{color:var(--hub-text-tertiary)}.BiQ1zG_hubUpdateNotes{min-height:0;max-height:300px;color:var(--hub-text-secondary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);border-radius:8px;flex:auto;padding:10px 12px;font-size:12px;line-height:18px;overflow-y:auto}.BiQ1zG_hubUpdateNotes>:first-child{margin-top:0}.BiQ1zG_hubUpdateNotes>:last-child{margin-bottom:0}.BiQ1zG_hubUpdateNotes h2,.BiQ1zG_hubUpdateNotes h3,.BiQ1zG_hubUpdateNotes h4,.BiQ1zG_hubUpdateNotes h5{color:var(--hub-text-primary);margin:10px 0 4px;font-size:13px;font-weight:600;line-height:20px}.BiQ1zG_hubUpdateNotes h2{font-size:14px}.BiQ1zG_hubUpdateNotes p{margin:4px 0}.BiQ1zG_hubUpdateNotes ul,.BiQ1zG_hubUpdateNotes ol{margin:4px 0;padding-left:18px}.BiQ1zG_hubUpdateNotes li{margin:2px 0}.BiQ1zG_hubUpdateNotes code{background:var(--hub-bg-hover);color:var(--hub-text-primary);border-radius:4px;padding:1px 4px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px}.BiQ1zG_hubUpdateNotes pre{background:var(--hub-bg-1);border:1px solid var(--hub-border-2);border-radius:6px;margin:6px 0;padding:8px 10px;overflow-x:auto}.BiQ1zG_hubUpdateNotes pre code{background:0 0;border-radius:0;padding:0}.BiQ1zG_hubUpdateNotes blockquote{border-left:3px solid var(--hub-brand);background:var(--hub-bg-hover);color:var(--hub-text-tertiary);border-radius:0 6px 6px 0;margin:6px 0;padding:2px 10px}.BiQ1zG_hubUpdateNotes a{color:var(--hub-brand);text-decoration:none}.BiQ1zG_hubUpdateNotes a:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_detailModal{width:480px;max-width:calc(100vw - 48px)}.BiQ1zG_detailUpdateHint{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);border-radius:6px;padding:6px 10px;font-size:12px;line-height:18px}.BiQ1zG_detailGrid{flex-direction:column;gap:6px;display:flex}.BiQ1zG_detailRow{align-items:baseline;gap:10px;min-width:0;font-size:12px;line-height:20px;display:flex}.BiQ1zG_detailLabel{text-align:right;width:76px;color:var(--hub-text-tertiary);flex-shrink:0}.BiQ1zG_detailValue{min-width:0;color:var(--hub-text-primary);flex-wrap:wrap;flex:auto;align-items:baseline;gap:4px 6px;font-weight:500;display:flex}.BiQ1zG_detailMono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;font-weight:500}.BiQ1zG_detailArrow{color:var(--hub-text-tertiary);align-items:baseline;gap:4px;display:inline-flex}.BiQ1zG_detailDim{color:var(--hub-text-tertiary);font-size:11px;font-weight:400}.BiQ1zG_detailLink{min-width:0;color:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:4px;font-weight:500;text-decoration:none;transition:color .12s;display:inline-flex}.BiQ1zG_detailLink:hover{color:var(--hub-brand-hover);text-decoration:underline}.BiQ1zG_detailStars{color:#b45309;font-weight:600}.BiQ1zG_detailPath{min-width:0;color:var(--hub-text-primary);background:var(--hub-bg-2);border:1px solid var(--hub-border-2);border-radius:6px;flex:auto;justify-content:space-between;align-items:center;gap:6px;padding:3px 3px 3px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:18px;transition:border-color .12s,background .12s;display:flex}.BiQ1zG_detailPath:hover{border-color:var(--hub-border-ghost);background:var(--hub-bg-3)}.BiQ1zG_detailPathText{text-overflow:ellipsis;white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;min-width:0;overflow:hidden}.BiQ1zG_detailPathActions{flex-shrink:0;align-items:center;gap:4px;display:inline-flex}.BiQ1zG_detailPathBtn{width:28px;height:28px;color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;justify-content:center;align-items:center;transition:color .12s,background .12s,border-color .12s;display:inline-flex}.BiQ1zG_detailPathBtn svg{width:15px;height:15px}.BiQ1zG_detailPathBtn:hover{color:#fff;background:var(--hub-brand);border-color:var(--hub-brand)}.BiQ1zG_detailStatusRunning,.BiQ1zG_detailStatusPending{border-radius:50%;flex-shrink:0;align-self:center;width:8px;height:8px}.BiQ1zG_detailStatusRunning{background:var(--hub-success)}.BiQ1zG_detailStatusPending{background:var(--hub-warning)}.BiQ1zG_detailStatusText{font-weight:500}";
2149
- const tagId$10 = "dsh-plugin/Modal.module.css";
2150
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$10) + "]") === null) {
2151
- const tag = document.createElement("style");
2152
- tag.dataset.plugin = "dsh-plugin";
2153
- tag.dataset.pluginCss = tagId$10;
2154
- tag.textContent = css$10;
2155
- document.head.appendChild(tag);
2156
- }
2157
- var Modal_module_css_default = {
2158
- "modal": "BiQ1zG_modal",
2159
- "queueSectionTitle": "BiQ1zG_queueSectionTitle",
2160
- "detailModal": "BiQ1zG_detailModal",
2161
- "cliOnlyHint": "BiQ1zG_cliOnlyHint",
2162
- "pendingRowActions": "BiQ1zG_pendingRowActions",
2163
- "queueRowStatus": "BiQ1zG_queueRowStatus",
2164
- "modalCopy": "BiQ1zG_modalCopy",
2165
- "modalInstall": "BiQ1zG_modalInstall",
2166
- "modalWide": "BiQ1zG_modalWide",
2167
- "hubUpdateNotes": "BiQ1zG_hubUpdateNotes",
2168
- "errorTitle": "BiQ1zG_errorTitle",
2169
- "noticeBadgeIcon": "BiQ1zG_noticeBadgeIcon",
2170
- "modalCmd": "BiQ1zG_modalCmd",
2171
- "noticeVersion": "BiQ1zG_noticeVersion",
2172
- "failKind": "BiQ1zG_failKind",
2173
- "detailValue": "BiQ1zG_detailValue",
2174
- "noticeList": "BiQ1zG_noticeList",
2175
- "modalValue": "BiQ1zG_modalValue",
2176
- "detailMono": "BiQ1zG_detailMono",
2177
- "overlayIn": "BiQ1zG_overlayIn",
2178
- "noticeBadgeOk": "BiQ1zG_noticeBadgeOk",
2179
- "resultCheck": "BiQ1zG_resultCheck",
2180
- "failKindUninstall": "BiQ1zG_failKindUninstall",
2181
- "detailPath": "BiQ1zG_detailPath",
2182
- "restartNowWarning": "BiQ1zG_restartNowWarning",
2183
- "queueRowTarget": "BiQ1zG_queueRowTarget",
2184
- "modalTitle": "BiQ1zG_modalTitle",
2185
- "toast": "BiQ1zG_toast",
2186
- "progressTrack": "BiQ1zG_progressTrack",
2187
- "errorHint": "BiQ1zG_errorHint",
2188
- "detailUpdateHint": "BiQ1zG_detailUpdateHint",
2189
- "detailPathActions": "BiQ1zG_detailPathActions",
2190
- "aboutModal": "BiQ1zG_aboutModal",
2191
- "noticeFoot": "BiQ1zG_noticeFoot",
2192
- "result": "BiQ1zG_result",
2193
- "noticeBadgeFail": "BiQ1zG_noticeBadgeFail",
2194
- "modalIn": "BiQ1zG_modalIn",
2195
- "modalCloseIcon": "BiQ1zG_modalCloseIcon",
2196
- "modalActions": "BiQ1zG_modalActions",
2197
- "errorCopySoft": "BiQ1zG_errorCopySoft",
2198
- "modalCancel": "BiQ1zG_modalCancel",
2199
- "modalDesc": "BiQ1zG_modalDesc",
2200
- "resultCheckIcon": "BiQ1zG_resultCheckIcon",
2201
- "modalTitleQueued": "BiQ1zG_modalTitleQueued",
2202
- "trustHint": "BiQ1zG_trustHint",
2203
- "detailArrow": "BiQ1zG_detailArrow",
2204
- "overlay": "BiQ1zG_overlay",
2205
- "progressFillFail": "BiQ1zG_progressFillFail",
2206
- "noticeRowUpdate": "BiQ1zG_noticeRowUpdate",
2207
- "errorBox": "BiQ1zG_errorBox",
2208
- "queuedHint": "BiQ1zG_queuedHint",
2209
- "restartLater": "BiQ1zG_restartLater",
2210
- "failHead": "BiQ1zG_failHead",
2211
- "failBigIssue": "BiQ1zG_failBigIssue",
2212
- "detailGrid": "BiQ1zG_detailGrid",
2213
- "detailRow": "BiQ1zG_detailRow",
2214
- "progressHead": "BiQ1zG_progressHead",
2215
- "detailStatusRunning": "BiQ1zG_detailStatusRunning",
2216
- "hubUpdateModal": "BiQ1zG_hubUpdateModal",
2217
- "queueRowDesc": "BiQ1zG_queueRowDesc",
2218
- "noticeTime": "BiQ1zG_noticeTime",
2219
- "detailPathText": "BiQ1zG_detailPathText",
2220
- "failEmpty": "BiQ1zG_failEmpty",
2221
- "progress": "BiQ1zG_progress",
2222
- "failRepo": "BiQ1zG_failRepo",
2223
- "aboutMeta": "BiQ1zG_aboutMeta",
2224
- "queueRowTrack": "BiQ1zG_queueRowTrack",
2225
- "noticeMain": "BiQ1zG_noticeMain",
2226
- "detailDim": "BiQ1zG_detailDim",
2227
- "stripCancel": "BiQ1zG_stripCancel",
2228
- "resultTitle": "BiQ1zG_resultTitle",
2229
- "detailLabel": "BiQ1zG_detailLabel",
2230
- "noticeHead": "BiQ1zG_noticeHead",
2231
- "noticeRemove": "BiQ1zG_noticeRemove",
2232
- "failList": "BiQ1zG_failList",
2233
- "queueRow": "BiQ1zG_queueRow",
2234
- "modalCmdCopy": "BiQ1zG_modalCmdCopy",
2235
- "detailStars": "BiQ1zG_detailStars",
2236
- "failKindInstall": "BiQ1zG_failKindInstall",
2237
- "noticeRow": "BiQ1zG_noticeRow",
2238
- "noticeTextFail": "BiQ1zG_noticeTextFail",
2239
- "pendingRowStatus": "BiQ1zG_pendingRowStatus",
2240
- "logModal": "BiQ1zG_logModal",
2241
- "hubUpdateMeta": "BiQ1zG_hubUpdateMeta",
2242
- "modalLink": "BiQ1zG_modalLink",
2243
- "queueSection": "BiQ1zG_queueSection",
2244
- "uninstallConfirm": "BiQ1zG_uninstallConfirm",
2245
- "modalRow": "BiQ1zG_modalRow",
2246
- "detailStatusText": "BiQ1zG_detailStatusText",
2247
- "modalBody": "BiQ1zG_modalBody",
2248
- "progressText": "BiQ1zG_progressText",
2249
- "resultDesc": "BiQ1zG_resultDesc",
2250
- "noticeRowMain": "BiQ1zG_noticeRowMain",
2251
- "modalCmdText": "BiQ1zG_modalCmdText",
2252
- "modalLabel": "BiQ1zG_modalLabel",
2253
- "hubUpdateMetaItem": "BiQ1zG_hubUpdateMetaItem",
2254
- "modalClose": "BiQ1zG_modalClose",
2255
- "resultRestarting": "BiQ1zG_resultRestarting",
2256
- "modalHead": "BiQ1zG_modalHead",
2257
- "linkIcon": "BiQ1zG_linkIcon",
2258
- "toastFail": "BiQ1zG_toastFail",
2259
- "queueRowPct": "BiQ1zG_queueRowPct",
2260
- "progressFill": "BiQ1zG_progressFill",
2261
- "failRow": "BiQ1zG_failRow",
2262
- "failPrepareHint": "BiQ1zG_failPrepareHint",
2263
- "aboutContent": "BiQ1zG_aboutContent",
2264
- "noticeUpdateGo": "BiQ1zG_noticeUpdateGo",
2265
- "noticeTextOk": "BiQ1zG_noticeTextOk",
2266
- "errorModal": "BiQ1zG_errorModal",
2267
- "toastIn": "BiQ1zG_toastIn",
2268
- "detailPathBtn": "BiQ1zG_detailPathBtn",
2269
- "noticeRowOk": "BiQ1zG_noticeRowOk",
2270
- "restartNow": "BiQ1zG_restartNow",
2271
- "modalTitleBusy": "BiQ1zG_modalTitleBusy",
2272
- "failedCopyHint": "BiQ1zG_failedCopyHint",
2273
- "detailStatusPending": "BiQ1zG_detailStatusPending",
2274
- "failCopy": "BiQ1zG_failCopy",
2275
- "detailLink": "BiQ1zG_detailLink",
2276
- "failClear": "BiQ1zG_failClear",
2277
- "queueRowHead": "BiQ1zG_queueRowHead",
2278
- "queueRowBody": "BiQ1zG_queueRowBody"
2279
- };
2280
- //#endregion
2281
2358
  //#region src/client/components/ui/icons.tsx
2282
2359
  /**
2283
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
2360
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
2284
2361
  * Website: https://dsh-plugin.org
2285
2362
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
2286
2363
  *
@@ -2326,6 +2403,32 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2326
2403
  strokeLinejoin: "round"
2327
2404
  }));
2328
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
+ }
2329
2432
  /** 品牌 logo 图标:蓝紫渐变圆角方块 + 白色拼图块(2x2 错落),标题左侧的品牌标识。 */
2330
2433
  function LogoIcon() {
2331
2434
  return (0, react.createElement)("svg", {
@@ -2667,7 +2770,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2667
2770
  //#endregion
2668
2771
  //#region src/client/components/modals/ProgressView.tsx
2669
2772
  /**
2670
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
2773
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
2671
2774
  * Website: https://dsh-plugin.org
2672
2775
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
2673
2776
  *
@@ -2685,7 +2788,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2685
2788
  //#endregion
2686
2789
  //#region src/client/components/modals/modals.tsx
2687
2790
  /**
2688
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
2791
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
2689
2792
  * Website: https://dsh-plugin.org
2690
2793
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
2691
2794
  *
@@ -2923,7 +3026,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2923
3026
  //#endregion
2924
3027
  //#region src/client/logic/renderMarkdown.ts
2925
3028
  /**
2926
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3029
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
2927
3030
  * Website: https://dsh-plugin.org
2928
3031
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
2929
3032
  *
@@ -3014,11 +3117,11 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3014
3117
  //#endregion
3015
3118
  //#region src/client/components/modals/AboutModal.tsx
3016
3119
  /**
3017
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3120
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3018
3121
  * Website: https://dsh-plugin.org
3019
3122
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3020
3123
  *
3021
- * 头部「关注我们」弹窗:介绍 DSH-Plugin Hub 的功能定位 + 用户反馈群二维码。
3124
+ * 头部「关注我们」弹窗:介绍 DSH Plugin Hub 的功能定位 + 用户反馈群二维码。
3022
3125
  * 内容以 Markdown 形式由 dsh-update Worker 的 /about 接口下发(key = hub:about),
3023
3126
  * 客户端按接口返回渲染,不内置固定文案。
3024
3127
  * 图片(反馈群二维码)经 renderMarkdown 的 ![](url) 语法嵌入,居中、最大高度受控。
@@ -3055,7 +3158,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3055
3158
  //#endregion
3056
3159
  //#region src/client/components/modals/HubUpdateModal.tsx
3057
3160
  /**
3058
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3161
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3059
3162
  * Website: https://dsh-plugin.org
3060
3163
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3061
3164
  *
@@ -3122,7 +3225,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3122
3225
  //#endregion
3123
3226
  //#region src/client/components/modals/InstalledDetailModal.tsx
3124
3227
  /**
3125
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3228
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3126
3229
  * Website: https://dsh-plugin.org
3127
3230
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3128
3231
  *
@@ -3204,7 +3307,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3204
3307
  //#endregion
3205
3308
  //#region src/client/components/modals/NotificationsModal.tsx
3206
3309
  /**
3207
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3310
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3208
3311
  * Website: https://dsh-plugin.org
3209
3312
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3210
3313
  *
@@ -3246,7 +3349,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3246
3349
  strokeLinecap: "round"
3247
3350
  }));
3248
3351
  }
3249
- 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 }) {
3250
3353
  return (0, react.createElement)("div", {
3251
3354
  className: Modal_module_css_default.overlay,
3252
3355
  onClick: (e) => {
@@ -3329,7 +3432,13 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3329
3432
  e.stopPropagation();
3330
3433
  onUpdate(r.repo);
3331
3434
  }
3332
- }, 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", {
3333
3442
  className: Modal_module_css_default.noticeRemove,
3334
3443
  "aria-label": t("removeNotification"),
3335
3444
  title: t("removeNotification"),
@@ -3372,7 +3481,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3372
3481
  //#endregion
3373
3482
  //#region src/client/components/layout/CatalogHeader.tsx
3374
3483
  /**
3375
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3484
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3376
3485
  * Website: https://dsh-plugin.org
3377
3486
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3378
3487
  *
@@ -3434,7 +3543,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3434
3543
  //#endregion
3435
3544
  //#region src/client/components/layout/CategoryTabs.tsx
3436
3545
  /**
3437
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3546
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3438
3547
  * Website: https://dsh-plugin.org
3439
3548
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3440
3549
  *
@@ -3456,7 +3565,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3456
3565
  //#endregion
3457
3566
  //#region src/client/components/layout/CatalogControls.tsx
3458
3567
  /**
3459
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3568
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3460
3569
  * Website: https://dsh-plugin.org
3461
3570
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3462
3571
  *
@@ -3500,7 +3609,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3500
3609
  }
3501
3610
  //#endregion
3502
3611
  //#region \0dsh-css:src/client/styles/List.module.css.mjs
3503
- const css$9 = "._3XaZHa_body{flex-direction:column;flex:1;min-height:0;display:flex}._3XaZHa_list{flex-direction:column;flex:1;gap:6px;min-height:0;padding:2px 4px 4px 2px;display:flex;overflow-y:auto}._3XaZHa_moreSentinel{flex-shrink:0;height:1px}._3XaZHa_card{border:1px solid var(--hub-border-2);background:var(--hub-bg-1);border-radius:8px;justify-content:space-between;align-items:stretch;gap:12px;padding:9px 12px;transition:border-color .12s,background .12s;display:flex}._3XaZHa_card:hover{border-color:var(--hub-brand);background:var(--hub-bg-2)}._3XaZHa_cardMain{flex-direction:column;gap:4px;min-width:0;display:flex}._3XaZHa_cardHead{align-items:center;gap:6px;min-width:0;display:flex}._3XaZHa_cardTitle{white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:600;line-height:18px;overflow:hidden}._3XaZHa_categoryBadge,._3XaZHa_verified,._3XaZHa_versionBadge,._3XaZHa_updateBadge{border:1px solid #0000;border-radius:4px;flex-shrink:0;padding:0 6px;font-size:10px;line-height:16px}._3XaZHa_categoryBadge{color:var(--hub-brand);border-color:var(--hub-border-ghost)}._3XaZHa_verified{color:var(--hub-success);border-color:var(--hub-success-border)}._3XaZHa_versionBadge{color:var(--hub-text-secondary);border-color:var(--hub-border-input)}._3XaZHa_updateBadge{color:var(--hub-warn);border-color:var(--hub-warn-border);background:var(--hub-warn-tint)}._3XaZHa_desc{color:var(--hub-text-secondary);-webkit-line-clamp:2;-webkit-box-orient:vertical;margin:0;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}._3XaZHa_topics{flex-wrap:wrap;align-items:center;gap:4px;min-width:0;display:flex}._3XaZHa_topic{color:var(--hub-text-tertiary);background:var(--hub-bg-3);white-space:nowrap;border-radius:4px;flex-shrink:0;padding:0 6px;font-size:10px;line-height:16px}._3XaZHa_cardSide{flex-direction:column;flex-shrink:0;justify-content:space-between;align-items:flex-end;gap:6px;display:flex}._3XaZHa_stats{flex-direction:column;align-items:flex-end;gap:1px;display:flex}._3XaZHa_star{color:var(--hub-warn);white-space:nowrap;font-size:11px;line-height:16px}._3XaZHa_fork{color:var(--hub-text-tertiary);white-space:nowrap;font-size:11px;line-height:16px}._3XaZHa_date{color:var(--hub-text-tertiary);white-space:nowrap;font-size:10px;line-height:14px}._3XaZHa_installBtn,._3XaZHa_installBtnCopied,._3XaZHa_installBtnInstalled,._3XaZHa_installBtnUpdate,._3XaZHa_uninstallBtn,._3XaZHa_detailBtn{cursor:pointer;border-radius:6px;padding:2px 10px;font-size:11px;line-height:18px;transition:color .12s,border-color .12s,background .12s}._3XaZHa_installBtnInstalled{color:var(--hub-success);background:var(--hub-success-tint);cursor:default;-webkit-user-select:none;user-select:none;border:none}._3XaZHa_installBtnUpdate{color:#fff;background:var(--hub-warn);-webkit-user-select:none;user-select:none;border:none;font-weight:500}._3XaZHa_installBtnUpdate:hover{background:var(--hub-warn-strong)}._3XaZHa_uninstallBtn{color:var(--hub-danger);background:var(--hub-danger-tint);-webkit-user-select:none;user-select:none;border:none}._3XaZHa_uninstallBtn:hover{color:#fff;background:var(--hub-danger-hover)}._3XaZHa_installBtn{color:var(--hub-text-on-fill);background:var(--hub-btn-fill);-webkit-user-select:none;user-select:none;border:none;font-weight:500}._3XaZHa_installBtn:hover{background:var(--hub-btn-hover)}._3XaZHa_detailBtn{color:var(--hub-text-secondary);-webkit-user-select:none;user-select:none;background:0 0;border:none;align-items:center;text-decoration:none;display:inline-flex}._3XaZHa_detailBtn:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}._3XaZHa_actions{align-items:center;gap:6px;display:flex}._3XaZHa_installBtnCopied{color:var(--hub-success);background:var(--hub-success-tint);-webkit-user-select:none;user-select:none;border:none}._3XaZHa_state{text-align:center;min-height:160px;color:var(--hub-text-tertiary);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:8px;padding:24px;font-size:12px;line-height:18px;display:flex}._3XaZHa_stateTitle{color:var(--hub-text-primary);font-size:13px;font-weight:600}._3XaZHa_stateDesc{max-width:420px}._3XaZHa_retryBtn{color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border:none;border-radius:6px;margin-top:4px;padding:4px 12px;font-size:12px;line-height:18px}._3XaZHa_retryBtn:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}._3XaZHa_footer{border-top:1px solid var(--hub-border-1);flex-shrink:0;justify-content:flex-end;align-items:center;gap:8px;padding:6px 4px 0;display:flex}._3XaZHa_footLink{color:var(--hub-brand);white-space:nowrap;-webkit-user-select:none;user-select:none;font-size:11px;line-height:16px;text-decoration:none}._3XaZHa_footLink:hover{text-decoration:underline}";
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}";
3504
3613
  const tagId$9 = "dsh-plugin/List.module.css";
3505
3614
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$9) + "]") === null) {
3506
3615
  const tag = document.createElement("style");
@@ -3510,43 +3619,43 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3510
3619
  document.head.appendChild(tag);
3511
3620
  }
3512
3621
  var List_module_css_default = {
3513
- "installBtnCopied": "_3XaZHa_installBtnCopied",
3514
- "date": "_3XaZHa_date",
3515
- "state": "_3XaZHa_state",
3516
3622
  "fork": "_3XaZHa_fork",
3517
- "cardHead": "_3XaZHa_cardHead",
3518
- "moreSentinel": "_3XaZHa_moreSentinel",
3519
- "desc": "_3XaZHa_desc",
3520
- "footer": "_3XaZHa_footer",
3521
- "list": "_3XaZHa_list",
3522
- "body": "_3XaZHa_body",
3523
- "card": "_3XaZHa_card",
3524
- "cardTitle": "_3XaZHa_cardTitle",
3525
- "verified": "_3XaZHa_verified",
3623
+ "installBtn": "_3XaZHa_installBtn",
3526
3624
  "detailBtn": "_3XaZHa_detailBtn",
3527
- "retryBtn": "_3XaZHa_retryBtn",
3528
- "uninstallBtn": "_3XaZHa_uninstallBtn",
3529
- "stateDesc": "_3XaZHa_stateDesc",
3530
- "installBtnUpdate": "_3XaZHa_installBtnUpdate",
3531
- "topic": "_3XaZHa_topic",
3532
- "actions": "_3XaZHa_actions",
3625
+ "moreSentinel": "_3XaZHa_moreSentinel",
3626
+ "cardMain": "_3XaZHa_cardMain",
3533
3627
  "cardSide": "_3XaZHa_cardSide",
3628
+ "star": "_3XaZHa_star",
3629
+ "card": "_3XaZHa_card",
3630
+ "installBtnCopied": "_3XaZHa_installBtnCopied",
3534
3631
  "categoryBadge": "_3XaZHa_categoryBadge",
3632
+ "body": "_3XaZHa_body",
3535
3633
  "versionBadge": "_3XaZHa_versionBadge",
3536
- "star": "_3XaZHa_star",
3537
- "footLink": "_3XaZHa_footLink",
3538
- "stateTitle": "_3XaZHa_stateTitle",
3539
- "cardMain": "_3XaZHa_cardMain",
3540
3634
  "topics": "_3XaZHa_topics",
3635
+ "installBtnUpdate": "_3XaZHa_installBtnUpdate",
3636
+ "stateDesc": "_3XaZHa_stateDesc",
3637
+ "desc": "_3XaZHa_desc",
3638
+ "cardHead": "_3XaZHa_cardHead",
3639
+ "list": "_3XaZHa_list",
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",
3541
3647
  "stats": "_3XaZHa_stats",
3648
+ "retryBtn": "_3XaZHa_retryBtn",
3649
+ "cardTitle": "_3XaZHa_cardTitle",
3650
+ "date": "_3XaZHa_date",
3542
3651
  "installBtnInstalled": "_3XaZHa_installBtnInstalled",
3543
- "installBtn": "_3XaZHa_installBtn",
3544
- "updateBadge": "_3XaZHa_updateBadge"
3652
+ "verified": "_3XaZHa_verified",
3653
+ "stateTitle": "_3XaZHa_stateTitle"
3545
3654
  };
3546
3655
  //#endregion
3547
3656
  //#region src/client/hooks/useIncrementalList.ts
3548
3657
  /**
3549
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3658
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3550
3659
  * Website: https://dsh-plugin.org
3551
3660
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3552
3661
  *
@@ -3584,7 +3693,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3584
3693
  //#endregion
3585
3694
  //#region src/client/components/catalog/PluginCard.tsx
3586
3695
  /**
3587
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3696
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3588
3697
  * Website: https://dsh-plugin.org
3589
3698
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3590
3699
  *
@@ -3635,7 +3744,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3635
3744
  //#endregion
3636
3745
  //#region src/client/components/catalog/CatalogList.tsx
3637
3746
  /**
3638
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3747
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3639
3748
  * Website: https://dsh-plugin.org
3640
3749
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3641
3750
  *
@@ -3684,7 +3793,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3684
3793
  //#endregion
3685
3794
  //#region src/client/components/views/MarketView.tsx
3686
3795
  /**
3687
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3796
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3688
3797
  * Website: https://dsh-plugin.org
3689
3798
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3690
3799
  *
@@ -3738,20 +3847,20 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3738
3847
  document.head.appendChild(tag);
3739
3848
  }
3740
3849
  var SectionTabs_module_css_default = {
3741
- "tabActive": "_7tvizq_tabActive",
3742
- "tabCount": "_7tvizq_tabCount",
3743
3850
  "noticeBtn": "_7tvizq_noticeBtn",
3744
- "noticeCount": "_7tvizq_noticeCount",
3745
3851
  "root": "_7tvizq_root",
3746
- "tabCountActive": "_7tvizq_tabCountActive",
3747
3852
  "tab": "_7tvizq_tab",
3853
+ "tabCount": "_7tvizq_tabCount",
3748
3854
  "tabIcon": "_7tvizq_tabIcon",
3749
- "noticeIcon": "_7tvizq_noticeIcon"
3855
+ "noticeIcon": "_7tvizq_noticeIcon",
3856
+ "tabActive": "_7tvizq_tabActive",
3857
+ "noticeCount": "_7tvizq_noticeCount",
3858
+ "tabCountActive": "_7tvizq_tabCountActive"
3750
3859
  };
3751
3860
  //#endregion
3752
3861
  //#region src/client/components/layout/SectionTabs.tsx
3753
3862
  /**
3754
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3863
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3755
3864
  * Website: https://dsh-plugin.org
3756
3865
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3757
3866
  *
@@ -3808,7 +3917,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3808
3917
  }
3809
3918
  //#endregion
3810
3919
  //#region \0dsh-css:src/client/styles/InstalledView.module.css.mjs
3811
- const css$7 = "._1nXeGW_root{flex-direction:column;gap:8px;min-width:0;display:flex}._1nXeGW_toolbar{border-bottom:1px solid var(--hub-border-1);flex-direction:column;flex-shrink:0;gap:8px;padding:0 2px 10px;display:flex}._1nXeGW_searchWrap{width:100%;min-width:0;height:28px}._1nXeGW_searchInput{width:100%;height:28px;color:var(--hub-text-primary);border:1px solid var(--hub-border-2);background:0 0;border-radius:6px;outline:none;padding:0 9px;font-size:12px;line-height:26px;transition:border-color .12s}._1nXeGW_searchInput::placeholder{color:var(--hub-text-tertiary)}._1nXeGW_searchInput:focus{border-color:var(--hub-brand)}._1nXeGW_segRow{align-items:center;gap:8px;min-width:0;display:flex}._1nXeGW_segLabel{color:var(--hub-text-tertiary);flex-shrink:0;font-size:11px;line-height:16px}._1nXeGW_segGroup{border:1px solid var(--hub-border-2);border-radius:6px;flex-shrink:0;align-items:center;display:inline-flex;overflow:hidden}._1nXeGW_segBtn{height:24px;color:var(--hub-text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;background:0 0;border:none;justify-content:center;align-items:center;gap:4px;padding:0 10px;font-family:inherit;font-size:12px;line-height:24px;transition:color .12s,background .12s;display:inline-flex}._1nXeGW_segBtn svg{flex-shrink:0;display:block}._1nXeGW_segBtn+._1nXeGW_segBtn{border-left:1px solid var(--hub-border-2)}._1nXeGW_segBtn:hover{color:var(--hub-text-primary);background:var(--hub-bg-hover)}._1nXeGW_segBtnActive,._1nXeGW_segBtnActive:hover{color:#fff;background:var(--hub-brand)}._1nXeGW_empty{color:var(--hub-text-tertiary);text-align:center;border:1px dashed var(--hub-border-2);border-radius:8px;flex-direction:column;align-items:center;gap:4px;padding:36px 12px;font-size:12px;line-height:18px;display:flex}._1nXeGW_emptyTitle{color:var(--hub-text-secondary);font-size:13px;font-weight:600}._1nXeGW_emptyDesc{color:var(--hub-text-tertiary)}._1nXeGW_list{border:1px solid var(--hub-border-1);border-radius:8px;flex-direction:column;margin:0;padding:0;list-style:none;display:flex;overflow:hidden}._1nXeGW_row{background:var(--hub-bg-1);cursor:pointer;-webkit-user-select:none;user-select:none;flex-direction:column;gap:4px;padding:8px 10px;transition:background .12s;display:flex}._1nXeGW_row+._1nXeGW_row{border-top:1px solid var(--hub-border-1)}._1nXeGW_row:hover{background:var(--hub-bg-2)}._1nXeGW_rowTitleLine{align-items:center;gap:8px;min-width:0;display:flex}._1nXeGW_rowDesc{color:var(--hub-text-tertiary);white-space:nowrap;text-overflow:ellipsis;min-width:0;padding-left:16px;font-size:11px;line-height:16px;overflow:hidden}._1nXeGW_statusDot{background:var(--hub-success);border-radius:50%;flex-shrink:0;width:8px;height:8px}._1nXeGW_statusDot._1nXeGW_statusPending{background:var(--hub-warning)}._1nXeGW_statusDot._1nXeGW_statusInactive{background:var(--hub-text-tertiary)}._1nXeGW_rowMain{flex:auto;align-items:baseline;gap:6px;min-width:0;display:flex}._1nXeGW_rowTitle{color:var(--hub-text-primary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-size:12px;font-weight:600;line-height:18px;overflow:hidden}._1nXeGW_versionBadge{color:var(--hub-text-tertiary);background:var(--hub-bg-hover);border-radius:4px;flex-shrink:0;padding:0 5px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:16px}._1nXeGW_updateBadge{color:var(--hub-brand);background:var(--hub-brand-tint-strong);border-radius:4px;flex-shrink:0;padding:0 5px;font-size:11px;font-weight:500;line-height:16px}._1nXeGW_rowSourceTag{box-sizing:border-box;text-align:center;white-space:nowrap;text-overflow:ellipsis;border-radius:4px;flex-shrink:0;width:60px;padding:0 4px;font-size:11px;font-weight:500;line-height:16px;overflow:hidden}._1nXeGW_rowSourceTagHub{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft)}._1nXeGW_rowSourceTagManual{color:var(--hub-warning);background:var(--hub-warning-tint);border:1px solid var(--hub-warning-border)}._1nXeGW_exampleBadge{color:var(--hub-brand);background:var(--hub-brand-tint);border:1px solid var(--hub-brand-border-soft);border-radius:4px;flex-shrink:0;padding:0 5px;font-size:11px;font-weight:500;line-height:16px}._1nXeGW_exampleRow{align-items:center;min-width:0;padding-left:16px;display:flex}._1nXeGW_rowMeta{align-items:center;gap:8px;min-width:0;padding-left:16px;display:flex;overflow:hidden}._1nXeGW_rowRepo{color:var(--hub-text-tertiary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11px;line-height:16px;overflow:hidden}._1nXeGW_rowCategory{color:var(--hub-text-tertiary);background:var(--hub-bg-hover);border-radius:4px;flex-shrink:0;padding:0 6px;font-size:11px;line-height:16px}._1nXeGW_rowActions{flex-shrink:0;align-items:center;gap:4px;display:flex}._1nXeGW_rowDetail{color:var(--hub-text-secondary);border:1px solid var(--hub-border-2);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border-radius:6px;padding:2px 10px;font-family:inherit;font-size:12px;line-height:18px;transition:color .12s,background .12s,border-color .12s}._1nXeGW_rowDetail:hover{color:var(--hub-text-primary);border-color:var(--hub-border-ghost);background:var(--hub-bg-hover)}._1nXeGW_rowRestart{color:var(--hub-warning);background:var(--hub-warning-tint);border:1px solid var(--hub-warning-border);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:6px;padding:2px 10px;font-family:inherit;font-size:12px;font-weight:500;line-height:18px;transition:color .12s,background .12s,border-color .12s}._1nXeGW_rowRestart:hover{color:#fff;background:var(--hub-warning);border-color:var(--hub-warning)}._1nXeGW_rowUpdate{color:#fff;background:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;padding:3px 10px;font-family:inherit;font-size:12px;font-weight:500;line-height:18px;transition:background .12s}._1nXeGW_rowUpdate:hover{background:var(--hub-brand-hover)}._1nXeGW_rowUninstall{color:var(--hub-danger);border:1px solid var(--hub-danger-border-soft);cursor:pointer;-webkit-user-select:none;user-select:none;background:0 0;border-radius:6px;padding:2px 10px;font-family:inherit;font-size:12px;line-height:18px;transition:color .12s,background .12s,border-color .12s}._1nXeGW_rowUninstall:hover{color:#fff;background:var(--hub-danger);border-color:var(--hub-danger)}";
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)}";
3812
3921
  const tagId$7 = "dsh-plugin/InstalledView.module.css";
3813
3922
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$7) + "]") === null) {
3814
3923
  const tag = document.createElement("style");
@@ -3818,47 +3927,47 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3818
3927
  document.head.appendChild(tag);
3819
3928
  }
3820
3929
  var InstalledView_module_css_default = {
3821
- "list": "_1nXeGW_list",
3822
- "rowUpdate": "_1nXeGW_rowUpdate",
3823
- "rowSourceTagHub": "_1nXeGW_rowSourceTagHub",
3824
- "rowUninstall": "_1nXeGW_rowUninstall",
3825
- "statusPending": "_1nXeGW_statusPending",
3826
- "versionBadge": "_1nXeGW_versionBadge",
3827
- "searchInput": "_1nXeGW_searchInput",
3828
- "rowRepo": "_1nXeGW_rowRepo",
3829
- "rowActions": "_1nXeGW_rowActions",
3830
- "segRow": "_1nXeGW_segRow",
3930
+ "exampleRow": "_1nXeGW_exampleRow",
3931
+ "segBtn": "_1nXeGW_segBtn",
3932
+ "rowSourceTagManual": "_1nXeGW_rowSourceTagManual",
3933
+ "searchWrap": "_1nXeGW_searchWrap",
3831
3934
  "updateBadge": "_1nXeGW_updateBadge",
3935
+ "rowSourceTag": "_1nXeGW_rowSourceTag",
3832
3936
  "segLabel": "_1nXeGW_segLabel",
3833
- "rowTitleLine": "_1nXeGW_rowTitleLine",
3834
- "rowDesc": "_1nXeGW_rowDesc",
3835
- "rowRestart": "_1nXeGW_rowRestart",
3836
- "rowDetail": "_1nXeGW_rowDetail",
3837
- "emptyTitle": "_1nXeGW_emptyTitle",
3838
- "empty": "_1nXeGW_empty",
3839
- "rowMeta": "_1nXeGW_rowMeta",
3937
+ "rowSourceTagHub": "_1nXeGW_rowSourceTagHub",
3840
3938
  "segGroup": "_1nXeGW_segGroup",
3841
- "rowTitle": "_1nXeGW_rowTitle",
3939
+ "toolbar": "_1nXeGW_toolbar",
3940
+ "segRow": "_1nXeGW_segRow",
3941
+ "rowMeta": "_1nXeGW_rowMeta",
3942
+ "rowCategory": "_1nXeGW_rowCategory",
3842
3943
  "exampleBadge": "_1nXeGW_exampleBadge",
3843
- "rowSourceTagManual": "_1nXeGW_rowSourceTagManual",
3844
- "statusDot": "_1nXeGW_statusDot",
3845
- "row": "_1nXeGW_row",
3846
- "searchWrap": "_1nXeGW_searchWrap",
3847
- "root": "_1nXeGW_root",
3944
+ "versionBadge": "_1nXeGW_versionBadge",
3945
+ "rowRepo": "_1nXeGW_rowRepo",
3946
+ "rowUpdate": "_1nXeGW_rowUpdate",
3947
+ "rowUninstall": "_1nXeGW_rowUninstall",
3948
+ "rowRestart": "_1nXeGW_rowRestart",
3949
+ "searchInput": "_1nXeGW_searchInput",
3950
+ "list": "_1nXeGW_list",
3848
3951
  "statusInactive": "_1nXeGW_statusInactive",
3849
3952
  "rowMain": "_1nXeGW_rowMain",
3850
- "rowSourceTag": "_1nXeGW_rowSourceTag",
3851
- "exampleRow": "_1nXeGW_exampleRow",
3852
- "toolbar": "_1nXeGW_toolbar",
3953
+ "rowActions": "_1nXeGW_rowActions",
3853
3954
  "segBtnActive": "_1nXeGW_segBtnActive",
3854
- "rowCategory": "_1nXeGW_rowCategory",
3955
+ "rowTitleLine": "_1nXeGW_rowTitleLine",
3855
3956
  "emptyDesc": "_1nXeGW_emptyDesc",
3856
- "segBtn": "_1nXeGW_segBtn"
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"
3857
3966
  };
3858
3967
  //#endregion
3859
3968
  //#region src/client/components/views/InstalledView.tsx
3860
3969
  /**
3861
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3970
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
3862
3971
  * Website: https://dsh-plugin.org
3863
3972
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
3864
3973
  *
@@ -4084,7 +4193,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4084
4193
  }
4085
4194
  //#endregion
4086
4195
  //#region \0dsh-css:src/client/styles/CustomInstallView.module.css.mjs
4087
- const css$6 = ".zISxCG_root{flex-direction:column;gap:10px;min-width:0;max-width:560px;display:flex}.zISxCG_desc{color:var(--hub-text-tertiary);margin:0;font-size:12px;line-height:18px}.zISxCG_installCards{flex-direction:column;flex-shrink:0;gap:10px;min-width:0;display:flex}.zISxCG_installCard{background:var(--hub-bg-1);border:1px solid var(--hub-border-1);border-radius:8px;flex-direction:column;gap:8px;min-width:0;padding:10px 12px;display:flex}.zISxCG_installCardHead{align-items:center;min-width:0;display:flex}.zISxCG_installLabel{color:var(--hub-text-primary);font-size:12px;font-weight:600;line-height:18px}.zISxCG_installExample{color:var(--hub-text-tertiary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-size:11px;line-height:16px;overflow:hidden}.zISxCG_installRow{align-items:center;gap:8px;min-width:0;display:flex}.zISxCG_installInput{min-width:0;height:28px;color:var(--hub-text-primary);border:1px solid var(--hub-border-2);background:0 0;border-radius:6px;outline:none;flex:auto;padding:0 9px;font-size:12px;line-height:26px;transition:border-color .12s}.zISxCG_installInput::placeholder{color:var(--hub-text-tertiary)}.zISxCG_installInput:focus{border-color:var(--hub-brand)}.zISxCG_installInputError,.zISxCG_installInputError:focus{border-color:var(--hub-danger-text)}.zISxCG_installBtn{color:#fff;background:var(--hub-brand);cursor:pointer;-webkit-user-select:none;user-select:none;border:none;border-radius:6px;flex-shrink:0;padding:5px 14px;font-family:inherit;font-size:12px;font-weight:500;line-height:18px;transition:background .12s,opacity .12s}.zISxCG_installBtn:hover{background:var(--hub-brand-hover)}.zISxCG_installBtn:disabled{opacity:.45;cursor:default}.zISxCG_installCardDisabled{opacity:.8}.zISxCG_channelOff{min-width:0;color:var(--hub-warn);background:var(--hub-warn-tint);border:1px solid var(--hub-warn-border);border-radius:6px;justify-content:space-between;align-items:center;gap:8px;padding:6px 9px;font-size:12px;line-height:16px;display:flex}.zISxCG_channelOffText{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.zISxCG_channelOffBtn{color:var(--hub-warn-strong);border:1px solid var(--hub-warn-border);cursor:pointer;white-space:nowrap;background:0 0;border-radius:6px;flex-shrink:0;padding:3px 10px;font-family:inherit;font-size:12px;font-weight:500;line-height:18px;transition:background .12s,color .12s}.zISxCG_channelOffBtn:hover{background:var(--hub-warn-tint);color:var(--hub-warn)}.zISxCG_installError{color:var(--hub-danger-text);background:var(--hub-danger-tint);border:1px solid var(--hub-danger-border);border-radius:6px;padding:5px 8px;font-size:12px;line-height:16px}";
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}";
4088
4197
  const tagId$6 = "dsh-plugin/CustomInstallView.module.css";
4089
4198
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$6) + "]") === null) {
4090
4199
  const tag = document.createElement("style");
@@ -4094,38 +4203,43 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4094
4203
  document.head.appendChild(tag);
4095
4204
  }
4096
4205
  var CustomInstallView_module_css_default = {
4206
+ "root": "zISxCG_root",
4207
+ "helpBody": "zISxCG_helpBody",
4208
+ "installHelpBtn": "zISxCG_installHelpBtn",
4209
+ "installRow": "zISxCG_installRow",
4210
+ "installCardHead": "zISxCG_installCardHead",
4211
+ "helpCmd": "zISxCG_helpCmd",
4212
+ "helpNote": "zISxCG_helpNote",
4213
+ "helpLine": "zISxCG_helpLine",
4214
+ "installExample": "zISxCG_installExample",
4097
4215
  "installCardDisabled": "zISxCG_installCardDisabled",
4216
+ "desc": "zISxCG_desc",
4098
4217
  "installCard": "zISxCG_installCard",
4099
- "installLabel": "zISxCG_installLabel",
4100
- "installExample": "zISxCG_installExample",
4101
4218
  "channelOff": "zISxCG_channelOff",
4102
- "desc": "zISxCG_desc",
4103
- "channelOffText": "zISxCG_channelOffText",
4104
- "installInput": "zISxCG_installInput",
4105
- "installRow": "zISxCG_installRow",
4106
- "installCards": "zISxCG_installCards",
4107
- "root": "zISxCG_root",
4108
- "installBtn": "zISxCG_installBtn",
4109
- "installCardHead": "zISxCG_installCardHead",
4219
+ "installError": "zISxCG_installError",
4110
4220
  "installInputError": "zISxCG_installInputError",
4111
4221
  "channelOffBtn": "zISxCG_channelOffBtn",
4112
- "installError": "zISxCG_installError"
4222
+ "installInput": "zISxCG_installInput",
4223
+ "installBtn": "zISxCG_installBtn",
4224
+ "channelOffText": "zISxCG_channelOffText",
4225
+ "installCards": "zISxCG_installCards",
4226
+ "installLabel": "zISxCG_installLabel"
4113
4227
  };
4114
4228
  //#endregion
4115
4229
  //#region src/client/components/views/CustomInstallView.tsx
4116
4230
  /**
4117
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4231
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4118
4232
  * Website: https://dsh-plugin.org
4119
4233
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
4120
4234
  *
4121
4235
  * Custom install view: a standalone top-level section for manually
4122
4236
  * installing npm packages or GitHub sources outside the catalog. Three
4123
- * installer cards, one per channel — npm package, GitHub source and a raw
4124
- * install command (a `dsh plugin ... add <target>` or the official global
4125
- * `npm install -g <pkgs>`) — each with a placeholder example above the
4126
- * input and its own format check. The cards stay separate so a user never
4127
- * has to guess which format goes where. Finished installs surface in the
4128
- * Installed view, marked as custom.
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.
4129
4243
  *
4130
4244
  * Pure presentational: owns only the three local input/error states; the
4131
4245
  * actual install (custom source, gated by the security toggles) bubbles up
@@ -4137,35 +4251,76 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4137
4251
  const GITHUB_BARE_RE = /^[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+$/;
4138
4252
  /** npm 包名(含 @scope/pkg) */
4139
4253
  const NPM_PACKAGE_RE = /^(?:@[a-z0-9._-]+\/)?[a-z0-9._-]+$/;
4140
- /** DSH 命令行前缀(`dsh plugin [--profile|-p <p>] add <target>`)—— 提取其中的安装目标;
4141
- * 命令大小写不敏感,支持 `-p` 简写与 `--profile=web` 等号形式,与 server 端 installTargetOf 口径一致。 */
4142
- const DSH_PLUGIN_CMD_RE = /^dsh\s+plugin\s+(?:(?:--profile|-p)(?:=|\s+)\S+\s*)?add\s+(.+)$/i;
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;
4143
4258
  /** npm 全局安装命令(官方 README 格式,如 `npm install -g @deepseek-ai/dsh @deepseek-harness-tui/dsh-tui`)——
4144
4259
  * 提取 -g 之后的包列表;任一包名非法返回 null(交给格式错误提示)。与 server 端 globalNpmPackagesOf 口径一致。 */
4145
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;
4146
4264
  function installTargetOf(raw) {
4147
4265
  const input = raw.trim();
4148
4266
  const match = DSH_PLUGIN_CMD_RE.exec(input);
4149
4267
  return match !== null ? match[1].trim() : input;
4150
4268
  }
4151
- function parseNpmGlobalPackages(raw) {
4152
- const input = raw.trim();
4153
- const match = NPM_GLOBAL_CMD_RE.exec(input);
4154
- if (match === null) return null;
4155
- const packages = match[1].trim().split(/\s+/).filter((p) => p !== "");
4269
+ /** 空格分隔的包列表:逐个按 npm 包名语法校验 + 拒绝以 - 开头的 token(npm 会把 --xxx 当参数而非包名),
4270
+ * 任一非法返回 null(交给格式错误提示)。与 server 端 globalNpmPackagesOf 同口径。 */
4271
+ function splitPackages(raw) {
4272
+ const packages = raw.trim().split(/\s+/).filter((p) => p !== "");
4156
4273
  if (packages.length === 0 || packages.some((p) => !NPM_PACKAGE_RE.test(p) || p.startsWith("-"))) return null;
4157
4274
  return packages;
4158
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
+ }
4159
4302
  function isGitHubInput(raw) {
4160
4303
  const input = raw.trim();
4161
4304
  return GITHUB_URL_RE.test(input) || GITHUB_BARE_RE.test(input);
4162
4305
  }
4163
- function isNpmInput(raw) {
4164
- return NPM_PACKAGE_RE.test(raw.trim());
4165
- }
4166
4306
  function isDshCommand(raw) {
4167
4307
  return DSH_PLUGIN_CMD_RE.test(raw.trim());
4168
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
+ };
4169
4324
  function CustomInstallView({ t, onInstallCustom, enableNpm, enableGit, enableDsh, onOpenSettings }) {
4170
4325
  /** 自定义安装:NPM 包输入与格式错误('' = 无错误) */
4171
4326
  const [npmQuery, setNpmQuery] = (0, react.useState)("");
@@ -4176,6 +4331,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4176
4331
  /** 自定义安装:DSH 命令输入与格式错误('' = 无错误) */
4177
4332
  const [cmdQuery, setCmdQuery] = (0, react.useState)("");
4178
4333
  const [cmdError, setCmdError] = (0, react.useState)("");
4334
+ /** 卡片标题旁「帮助」弹窗:null = 未打开;'npm' | 'git' | 'cmd' = 打开对应卡片的格式清单 */
4335
+ const [helpFor, setHelpFor] = (0, react.useState)(null);
4179
4336
  /** 通道关闭提示行:开关关掉后替代示例与输入行,引导去设置打开 */
4180
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", {
4181
4338
  type: "button",
@@ -4183,13 +4340,15 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4183
4340
  onClick: onOpenSettings
4184
4341
  }, t("goToSettings")));
4185
4342
  const submitNpm = () => {
4186
- const target = npmQuery.trim();
4187
- if (!target) return;
4188
- if (!isNpmInput(target)) {
4343
+ const raw = npmQuery.trim();
4344
+ if (!raw) return;
4345
+ const parsed = parseNpmInput(raw);
4346
+ if (parsed === null) {
4189
4347
  setNpmError(t("npmInstallInvalid"));
4190
4348
  return;
4191
4349
  }
4192
- onInstallCustom(target);
4350
+ if (parsed.kind === "global") onInstallCustom(raw, { globalNpm: parsed.pkgs });
4351
+ else onInstallCustom(parsed.target);
4193
4352
  setNpmQuery("");
4194
4353
  setNpmError("");
4195
4354
  };
@@ -4207,13 +4366,6 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4207
4366
  const submitCmd = () => {
4208
4367
  const raw = cmdQuery.trim();
4209
4368
  if (!raw) return;
4210
- const globalPkgs = parseNpmGlobalPackages(raw);
4211
- if (globalPkgs !== null) {
4212
- onInstallCustom(raw, { globalNpm: globalPkgs });
4213
- setCmdQuery("");
4214
- setCmdError("");
4215
- return;
4216
- }
4217
4369
  if (!isDshCommand(raw)) {
4218
4370
  setCmdError(t("dshCmdInvalid"));
4219
4371
  return;
@@ -4222,8 +4374,14 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4222
4374
  setCmdQuery("");
4223
4375
  setCmdError("");
4224
4376
  };
4225
- return (0, react.createElement)("div", { className: CustomInstallView_module_css_default.root }, (0, react.createElement)("p", { className: CustomInstallView_module_css_default.desc }, t("customViewDesc")), (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installCards }, (0, react.createElement)("div", { className: enableNpm ? CustomInstallView_module_css_default.installCard : `${CustomInstallView_module_css_default.installCard} ${CustomInstallView_module_css_default.installCardDisabled}` }, (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installCardHead }, (0, react.createElement)("span", { className: CustomInstallView_module_css_default.installLabel }, t("npmInstallLabel"))), !enableNpm ? channelOffRow : [
4226
- (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installExample }, t("npmInstallExample")),
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")),
4227
4385
  (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installRow }, (0, react.createElement)("input", {
4228
4386
  className: npmError ? `${CustomInstallView_module_css_default.installInput} ${CustomInstallView_module_css_default.installInputError}` : CustomInstallView_module_css_default.installInput,
4229
4387
  type: "text",
@@ -4244,7 +4402,13 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4244
4402
  onClick: submitNpm
4245
4403
  }, t("installCliBtn"))),
4246
4404
  npmError ? (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installError }, npmError) : null
4247
- ]), (0, react.createElement)("div", { className: enableGit ? CustomInstallView_module_css_default.installCard : `${CustomInstallView_module_css_default.installCard} ${CustomInstallView_module_css_default.installCardDisabled}` }, (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installCardHead }, (0, react.createElement)("span", { className: CustomInstallView_module_css_default.installLabel }, t("gitInstallLabel"))), !enableGit ? channelOffRow : [
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 : [
4248
4412
  (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installExample }, t("gitInstallExample")),
4249
4413
  (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installRow }, (0, react.createElement)("input", {
4250
4414
  className: gitError ? `${CustomInstallView_module_css_default.installInput} ${CustomInstallView_module_css_default.installInputError}` : CustomInstallView_module_css_default.installInput,
@@ -4266,7 +4430,13 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4266
4430
  onClick: submitGit
4267
4431
  }, t("installCliBtn"))),
4268
4432
  gitError ? (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installError }, gitError) : null
4269
- ]), (0, react.createElement)("div", { className: enableDsh ? CustomInstallView_module_css_default.installCard : `${CustomInstallView_module_css_default.installCard} ${CustomInstallView_module_css_default.installCardDisabled}` }, (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installCardHead }, (0, react.createElement)("span", { className: CustomInstallView_module_css_default.installLabel }, t("dshCmdLabel"))), !enableDsh ? channelOffRow : [
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 : [
4270
4440
  (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installExample }, t("dshCmdExample")),
4271
4441
  (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installRow }, (0, react.createElement)("input", {
4272
4442
  className: cmdError ? `${CustomInstallView_module_css_default.installInput} ${CustomInstallView_module_css_default.installInputError}` : CustomInstallView_module_css_default.installInput,
@@ -4288,7 +4458,26 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4288
4458
  onClick: submitCmd
4289
4459
  }, t("installCliBtn"))),
4290
4460
  cmdError ? (0, react.createElement)("div", { className: CustomInstallView_module_css_default.installError }, cmdError) : null
4291
- ])));
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);
4292
4481
  }
4293
4482
  //#endregion
4294
4483
  //#region \0dsh-css:src/client/styles/SettingsView.module.css.mjs
@@ -4302,26 +4491,26 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4302
4491
  document.head.appendChild(tag);
4303
4492
  }
4304
4493
  var SettingsView_module_css_default = {
4305
- "settingControlStack": "_506LLG_settingControlStack",
4494
+ "pageTitle": "_506LLG_pageTitle",
4495
+ "settingControl": "_506LLG_settingControl",
4496
+ "settingRowStack": "_506LLG_settingRowStack",
4497
+ "navItem": "_506LLG_navItem",
4306
4498
  "pageDesc": "_506LLG_pageDesc",
4499
+ "settingControlStack": "_506LLG_settingControlStack",
4307
4500
  "navIcon": "_506LLG_navIcon",
4308
- "navItem": "_506LLG_navItem",
4309
- "settingTitle": "_506LLG_settingTitle",
4501
+ "resetBtn": "_506LLG_resetBtn",
4502
+ "root": "_506LLG_root",
4503
+ "sidebar": "_506LLG_sidebar",
4310
4504
  "settingLabel": "_506LLG_settingLabel",
4311
4505
  "card": "_506LLG_card",
4506
+ "settingDesc": "_506LLG_settingDesc",
4312
4507
  "textInput": "_506LLG_textInput",
4313
- "navItemActive": "_506LLG_navItemActive",
4314
- "settingControl": "_506LLG_settingControl",
4315
- "settingRowStack": "_506LLG_settingRowStack",
4316
- "pageTitle": "_506LLG_pageTitle",
4317
- "content": "_506LLG_content",
4318
- "resetBtn": "_506LLG_resetBtn",
4319
- "sidebar": "_506LLG_sidebar",
4508
+ "pageHeader": "_506LLG_pageHeader",
4320
4509
  "settingRow": "_506LLG_settingRow",
4510
+ "content": "_506LLG_content",
4511
+ "settingTitle": "_506LLG_settingTitle",
4321
4512
  "controlDropdown": "_506LLG_controlDropdown",
4322
- "root": "_506LLG_root",
4323
- "pageHeader": "_506LLG_pageHeader",
4324
- "settingDesc": "_506LLG_settingDesc"
4513
+ "navItemActive": "_506LLG_navItemActive"
4325
4514
  };
4326
4515
  //#endregion
4327
4516
  //#region \0dsh-css:src/client/styles/Dropdown.module.css.mjs
@@ -4335,22 +4524,22 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4335
4524
  document.head.appendChild(tag);
4336
4525
  }
4337
4526
  var Dropdown_module_css_default = {
4527
+ "dropdownCountActive": "B_Gxsq_dropdownCountActive",
4338
4528
  "dropdownItem": "B_Gxsq_dropdownItem",
4339
- "dropdownLabel": "B_Gxsq_dropdownLabel",
4340
- "dropdownItemActive": "B_Gxsq_dropdownItemActive",
4341
4529
  "dropdownCount": "B_Gxsq_dropdownCount",
4530
+ "dropdownItemActive": "B_Gxsq_dropdownItemActive",
4531
+ "dropdownBtn": "B_Gxsq_dropdownBtn",
4342
4532
  "dropdownPanel": "B_Gxsq_dropdownPanel",
4343
- "dropdown": "B_Gxsq_dropdown",
4344
4533
  "dropdownItemLabel": "B_Gxsq_dropdownItemLabel",
4345
- "dropdownCountActive": "B_Gxsq_dropdownCountActive",
4346
4534
  "dropdownArrow": "B_Gxsq_dropdownArrow",
4535
+ "dropdown": "B_Gxsq_dropdown",
4347
4536
  "dropdownArrowOpen": "B_Gxsq_dropdownArrowOpen",
4348
- "dropdownBtn": "B_Gxsq_dropdownBtn"
4537
+ "dropdownLabel": "B_Gxsq_dropdownLabel"
4349
4538
  };
4350
4539
  //#endregion
4351
4540
  //#region src/client/components/ui/Dropdown.tsx
4352
4541
  /**
4353
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4542
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4354
4543
  * Website: https://dsh-plugin.org
4355
4544
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
4356
4545
  *
@@ -4418,14 +4607,14 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4418
4607
  document.head.appendChild(tag);
4419
4608
  }
4420
4609
  var Toggle_module_css_default = {
4610
+ "toggle": "k-cD4G_toggle",
4421
4611
  "toggleOn": "k-cD4G_toggleOn",
4422
- "knob": "k-cD4G_knob",
4423
- "toggle": "k-cD4G_toggle"
4612
+ "knob": "k-cD4G_knob"
4424
4613
  };
4425
4614
  //#endregion
4426
4615
  //#region src/client/components/ui/Toggle.tsx
4427
4616
  /**
4428
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4617
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4429
4618
  * Website: https://dsh-plugin.org
4430
4619
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
4431
4620
  *
@@ -4456,34 +4645,34 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4456
4645
  document.head.appendChild(tag);
4457
4646
  }
4458
4647
  var DiagnosticsView_module_css_default = {
4459
- "name": "k9eRya_name",
4648
+ "head": "k9eRya_head",
4649
+ "headHint": "k9eRya_headHint",
4460
4650
  "meta": "k9eRya_meta",
4461
- "summaryRunning": "k9eRya_summaryRunning",
4651
+ "summaryOk": "k9eRya_summaryOk",
4652
+ "envTitle": "k9eRya_envTitle",
4653
+ "summaryFail": "k9eRya_summaryFail",
4654
+ "badgeRunning": "k9eRya_badgeRunning",
4655
+ "badgeIdle": "k9eRya_badgeIdle",
4656
+ "badge": "k9eRya_badge",
4657
+ "panel": "k9eRya_panel",
4462
4658
  "envLabel": "k9eRya_envLabel",
4463
- "envCopyBtn": "k9eRya_envCopyBtn",
4464
- "headHint": "k9eRya_headHint",
4465
4659
  "display": "k9eRya_display",
4466
- "head": "k9eRya_head",
4467
- "runBtn": "k9eRya_runBtn",
4468
- "badge": "k9eRya_badge",
4469
4660
  "summary": "k9eRya_summary",
4470
- "summaryFail": "k9eRya_summaryFail",
4471
- "panel": "k9eRya_panel",
4472
- "row": "k9eRya_row",
4661
+ "badgeFail": "k9eRya_badgeFail",
4662
+ "summaryRunning": "k9eRya_summaryRunning",
4663
+ "runBtn": "k9eRya_runBtn",
4664
+ "name": "k9eRya_name",
4665
+ "envCopyBtn": "k9eRya_envCopyBtn",
4473
4666
  "badgeOk": "k9eRya_badgeOk",
4474
- "summaryOk": "k9eRya_summaryOk",
4475
- "diagPulse": "k9eRya_diagPulse",
4476
- "badgeRunning": "k9eRya_badgeRunning",
4477
- "envRow": "k9eRya_envRow",
4478
4667
  "envDesc": "k9eRya_envDesc",
4479
- "badgeFail": "k9eRya_badgeFail",
4480
- "badgeIdle": "k9eRya_badgeIdle",
4481
- "envTitle": "k9eRya_envTitle"
4668
+ "row": "k9eRya_row",
4669
+ "diagPulse": "k9eRya_diagPulse",
4670
+ "envRow": "k9eRya_envRow"
4482
4671
  };
4483
4672
  //#endregion
4484
4673
  //#region src/client/components/views/DiagnosticsView.tsx
4485
4674
  /**
4486
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4675
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4487
4676
  * Website: https://dsh-plugin.org
4488
4677
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
4489
4678
  *
@@ -4497,7 +4686,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4497
4686
  /** 系统版本文本:提交 Issue 时粘贴到正文,方便作者复现。 */
4498
4687
  function formatEnv(env) {
4499
4688
  return [
4500
- `DSH-Plugin Hub ${PLUGIN_VERSION}`,
4689
+ `DSH Plugin Hub ${PLUGIN_VERSION}`,
4501
4690
  `DSH ${env.dshVersion ?? "unknown"}`,
4502
4691
  `Node ${env.nodeVersion}`,
4503
4692
  `${env.platform} ${env.arch} (${env.release})`,
@@ -4636,61 +4825,61 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4636
4825
  document.head.appendChild(tag);
4637
4826
  }
4638
4827
  var LogsView_module_css_default = {
4639
- "filterChipActive": "_3j77BW_filterChipActive",
4640
- "pathText": "_3j77BW_pathText",
4828
+ "pathDialogHint": "_3j77BW_pathDialogHint",
4641
4829
  "actions": "_3j77BW_actions",
4642
- "pathDialogFoot": "_3j77BW_pathDialogFoot",
4643
- "badgeDebug": "_3j77BW_badgeDebug",
4644
- "empty": "_3j77BW_empty",
4645
- "pathDialogDesc": "_3j77BW_pathDialogDesc",
4646
- "catUninstall": "_3j77BW_catUninstall",
4647
4830
  "message": "_3j77BW_message",
4648
- "entry": "_3j77BW_entry",
4649
- "more": "_3j77BW_more",
4831
+ "pathDraft": "_3j77BW_pathDraft",
4832
+ "pathDialogDesc": "_3j77BW_pathDialogDesc",
4650
4833
  "head": "_3j77BW_head",
4651
- "searchInput": "_3j77BW_searchInput",
4834
+ "filterChip": "_3j77BW_filterChip",
4835
+ "search": "_3j77BW_search",
4836
+ "more": "_3j77BW_more",
4837
+ "badgeError": "_3j77BW_badgeError",
4838
+ "catInstall": "_3j77BW_catInstall",
4839
+ "event": "_3j77BW_event",
4652
4840
  "badge": "_3j77BW_badge",
4653
- "catDiagnostics": "_3j77BW_catDiagnostics",
4654
- "logList": "_3j77BW_logList",
4655
- "badgeWarn": "_3j77BW_badgeWarn",
4656
- "pathDialogHint": "_3j77BW_pathDialogHint",
4841
+ "catUpdate": "_3j77BW_catUpdate",
4842
+ "badgeInfo": "_3j77BW_badgeInfo",
4843
+ "footCount": "_3j77BW_footCount",
4844
+ "catSystem": "_3j77BW_catSystem",
4657
4845
  "time": "_3j77BW_time",
4658
- "event": "_3j77BW_event",
4659
- "pathDialogReset": "_3j77BW_pathDialogReset",
4660
- "moreEnd": "_3j77BW_moreEnd",
4846
+ "filterBar": "_3j77BW_filterBar",
4847
+ "badgeWarn": "_3j77BW_badgeWarn",
4661
4848
  "foot": "_3j77BW_foot",
4662
- "badgeSuccess": "_3j77BW_badgeSuccess",
4663
- "catBadge": "_3j77BW_catBadge",
4849
+ "btnPrimary": "_3j77BW_btnPrimary",
4850
+ "footFail": "_3j77BW_footFail",
4664
4851
  "footActions": "_3j77BW_footActions",
4665
4852
  "btn": "_3j77BW_btn",
4666
- "btnPrimary": "_3j77BW_btnPrimary",
4667
- "filterChip": "_3j77BW_filterChip",
4853
+ "badgeDebug": "_3j77BW_badgeDebug",
4854
+ "linkBtn": "_3j77BW_linkBtn",
4855
+ "pathDialog": "_3j77BW_pathDialog",
4856
+ "footPath": "_3j77BW_footPath",
4857
+ "badgeSuccess": "_3j77BW_badgeSuccess",
4858
+ "pathLabel": "_3j77BW_pathLabel",
4859
+ "catBadge": "_3j77BW_catBadge",
4668
4860
  "headHint": "_3j77BW_headHint",
4669
- "catInstall": "_3j77BW_catInstall",
4670
- "panel": "_3j77BW_panel",
4671
- "catSettings": "_3j77BW_catSettings",
4672
- "badgeInfo": "_3j77BW_badgeInfo",
4673
- "badgeError": "_3j77BW_badgeError",
4674
- "pathDraft": "_3j77BW_pathDraft",
4675
- "filterBar": "_3j77BW_filterBar",
4861
+ "logList": "_3j77BW_logList",
4862
+ "filterChipActive": "_3j77BW_filterChipActive",
4863
+ "catUninstall": "_3j77BW_catUninstall",
4864
+ "moreEnd": "_3j77BW_moreEnd",
4676
4865
  "list": "_3j77BW_list",
4677
- "footFail": "_3j77BW_footFail",
4866
+ "entry": "_3j77BW_entry",
4867
+ "pathDialogFoot": "_3j77BW_pathDialogFoot",
4868
+ "pathDialogReset": "_3j77BW_pathDialogReset",
4678
4869
  "pathDialogRow": "_3j77BW_pathDialogRow",
4679
- "catUpdate": "_3j77BW_catUpdate",
4680
- "pathDialog": "_3j77BW_pathDialog",
4681
- "previewRow": "_3j77BW_previewRow",
4870
+ "searchInput": "_3j77BW_searchInput",
4871
+ "catSettings": "_3j77BW_catSettings",
4872
+ "panel": "_3j77BW_panel",
4682
4873
  "pathRow": "_3j77BW_pathRow",
4683
- "linkBtn": "_3j77BW_linkBtn",
4684
- "footPath": "_3j77BW_footPath",
4685
- "pathLabel": "_3j77BW_pathLabel",
4686
- "footCount": "_3j77BW_footCount",
4687
- "catSystem": "_3j77BW_catSystem",
4688
- "search": "_3j77BW_search"
4874
+ "pathText": "_3j77BW_pathText",
4875
+ "catDiagnostics": "_3j77BW_catDiagnostics",
4876
+ "previewRow": "_3j77BW_previewRow",
4877
+ "empty": "_3j77BW_empty"
4689
4878
  };
4690
4879
  //#endregion
4691
4880
  //#region src/client/components/modals/LogsModal.tsx
4692
4881
  /**
4693
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4882
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4694
4883
  * Website: https://dsh-plugin.org
4695
4884
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
4696
4885
  *
@@ -4963,7 +5152,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4963
5152
  //#endregion
4964
5153
  //#region src/client/components/modals/LogsPathModal.tsx
4965
5154
  /**
4966
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
5155
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
4967
5156
  * Website: https://dsh-plugin.org
4968
5157
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
4969
5158
  *
@@ -5078,7 +5267,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5078
5267
  //#endregion
5079
5268
  //#region src/client/components/views/LogsView.tsx
5080
5269
  /**
5081
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
5270
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
5082
5271
  * Website: https://dsh-plugin.org
5083
5272
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
5084
5273
  *
@@ -5202,7 +5391,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5202
5391
  //#endregion
5203
5392
  //#region src/client/components/views/SettingsView.tsx
5204
5393
  /**
5205
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
5394
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
5206
5395
  * Website: https://dsh-plugin.org
5207
5396
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
5208
5397
  *
@@ -5418,7 +5607,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5418
5607
  //#endregion
5419
5608
  //#region src/client/components/PluginHubSection.tsx
5420
5609
  /**
5421
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
5610
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
5422
5611
  * Website: https://dsh-plugin.org
5423
5612
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
5424
5613
  *
@@ -5476,6 +5665,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5476
5665
  const [notifications, setNotifications] = (0, react.useState)(() => loadNotifications());
5477
5666
  /** 通知中心弹窗:一级导航「设置」tab 后边的铃铛入口按钮打开 */
5478
5667
  const [showNotifications, setShowNotifications] = (0, react.useState)(false);
5668
+ /** 「忽略本次更新」确认弹窗:{ repo, version };null = 关闭 */
5669
+ const [ignoreTarget, setIgnoreTarget] = (0, react.useState)(null);
5479
5670
  /** 宿主机器环境快照:提交 bug 的 issue 正文附带;取不到为 null(链接少环境段,不阻塞) */
5480
5671
  const [env, setEnv] = (0, react.useState)(null);
5481
5672
  (0, react.useEffect)(() => {
@@ -5544,24 +5735,35 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5544
5735
  } : null;
5545
5736
  }
5546
5737
  });
5547
- const startupCheckedRef = (0, react.useRef)(false);
5548
- (0, react.useEffect)(() => {
5549
- if (startupCheckedRef.current) return;
5550
- if (!settingsReady || catalog.plugins === null || catalog.failed) return;
5551
- startupCheckedRef.current = true;
5552
- if (!hubSettings.checkUpdatesOnStart) return;
5738
+ /** 补齐更新提醒:把「当前有更新但通知中心还没有」的插件补写进通知(repo+version 去重)。
5739
+ * 返回本次实际新增的条数(0 = 无可更新或全部已提示过)。启动检查与打开通知中心共用,
5740
+ * 保证通知中心始终反映可更新状态:同一版本只一条、清空/删除后重开恢复、更新完成后消失。 */
5741
+ const syncUpdateNotices = () => {
5553
5742
  const updatable = catalog.installedItems.filter((i) => i.hasUpdate && i.plugin);
5554
- if (updatable.length === 0) return;
5555
- for (const item of updatable) if (item.repo) addUpdateNotice({
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({
5556
5749
  kind: "update",
5557
5750
  repo: item.repo,
5558
5751
  version: item.catalogVersion ?? void 0
5559
5752
  });
5560
5753
  setNotifications(loadNotifications());
5561
- 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({
5562
5764
  id: Date.now(),
5563
5765
  kind: "updates",
5564
- n: updatable.length
5766
+ n: added
5565
5767
  });
5566
5768
  }, [
5567
5769
  settingsReady,
@@ -5572,7 +5774,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5572
5774
  queue
5573
5775
  ]);
5574
5776
  (0, react.useEffect)(() => {
5575
- if (!confirmPlugin && !confirmCustomTarget && !confirmGlobalNpm && !uninstallPlugin && !uninstallItem && !detailItem && !showHubUpdate && !showAbout && !showNotifications) return;
5777
+ if (!confirmPlugin && !confirmCustomTarget && !confirmGlobalNpm && !uninstallPlugin && !uninstallItem && !detailItem && !showHubUpdate && !showAbout && !showNotifications && !ignoreTarget) return;
5576
5778
  const onKey = (e) => {
5577
5779
  if (e.key === "Escape") {
5578
5780
  setConfirmPlugin(null);
@@ -5585,6 +5787,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5585
5787
  setShowHubUpdate(false);
5586
5788
  setShowAbout(false);
5587
5789
  setShowNotifications(false);
5790
+ setIgnoreTarget(null);
5588
5791
  }
5589
5792
  };
5590
5793
  window.addEventListener("keydown", onKey);
@@ -5597,7 +5800,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5597
5800
  detailItem,
5598
5801
  showHubUpdate,
5599
5802
  showAbout,
5600
- showNotifications
5803
+ showNotifications,
5804
+ ignoreTarget
5601
5805
  ]);
5602
5806
  (0, react.useEffect)(() => {
5603
5807
  if (!toast) return;
@@ -5711,7 +5915,9 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5711
5915
  statsVerified,
5712
5916
  onToggleLang: toggleLang,
5713
5917
  hubUpdate: catalog.hubHasUpdate,
5714
- onVersionClick: () => setShowHubUpdate(true),
5918
+ onVersionClick: () => {
5919
+ catalog.refreshHub().then(() => setShowHubUpdate(true));
5920
+ },
5715
5921
  onAboutClick: () => setShowAbout(true)
5716
5922
  }), (0, react.createElement)("div", { className: Header_module_css_default.tabsRow }, (0, react.createElement)(SectionTabs, {
5717
5923
  view,
@@ -5719,7 +5925,10 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5719
5925
  installedCount: catalog.installedItems.length,
5720
5926
  t,
5721
5927
  noticeCount: notifications.length + queue.queue.length + queue.pendingRestarts.length,
5722
- onOpenNotifications: () => setShowNotifications(true)
5928
+ onOpenNotifications: () => {
5929
+ if (hubSettings.checkUpdatesOnStart) syncUpdateNotices();
5930
+ setShowNotifications(true);
5931
+ }
5723
5932
  })), view === "market" ? (0, react.createElement)(MarketView, {
5724
5933
  catalog,
5725
5934
  t,
@@ -5800,7 +6009,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5800
6009
  });
5801
6010
  }
5802
6011
  }), showHubUpdate && (0, react.createElement)(HubUpdateModal, {
5803
- info: catalog.hubUpdateInfo ?? { version: "1.2.1" },
6012
+ info: catalog.hubUpdateInfo ?? { version: "1.3.0" },
5804
6013
  lang,
5805
6014
  t,
5806
6015
  hasUpdate: catalog.hubHasUpdate,
@@ -5844,12 +6053,42 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5844
6053
  queue.clearModalTask();
5845
6054
  setConfirmPlugin(plugin);
5846
6055
  },
6056
+ onIgnoreUpdate: (repo, version) => setIgnoreTarget({
6057
+ repo,
6058
+ version
6059
+ }),
5847
6060
  cancelTask: queue.cancelTask,
5848
6061
  restarting,
5849
6062
  onRestart: () => {
5850
6063
  requestRestart();
5851
6064
  }
5852
- }), 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, {
5853
6092
  plugin: confirmPlugin,
5854
6093
  done: installDone,
5855
6094
  task: queue.installModalTask,
@@ -6007,7 +6246,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6007
6246
  }
6008
6247
  //#endregion
6009
6248
  //#region \0dsh-css:src/client/styles/tokens.module.css.mjs
6010
- const css = ":root,body[data-ds-dark-theme]{--hub-text-primary:var(--dsw-alias-label-primary,#1f2328);--hub-text-secondary:var(--dsw-alias-label-secondary,#6b7280);--hub-text-tertiary:var(--dsw-alias-label-tertiary,#8b93a1);--hub-text-disabled:var(--dsw-alias-label-disabled,#aab1bd);--hub-text-on-fill:var(--dsw-alias-label-primary-foreground,#fff);--hub-bg-1:var(--dsw-alias-bg-layer-1,#fff);--hub-bg-2:var(--dsw-alias-bg-layer-2,#80808014);--hub-bg-3:#8080801a;--hub-bg-btn:#8080801f;--hub-bg-hover:var(--dsw-alias-interactive-bg-hover,#80808029);--hub-bg-on-fill:#80808038;--hub-border-1:var(--dsw-alias-border-l1,#eceef1);--hub-border-2:var(--dsw-alias-border-l2,#e5e7eb);--hub-border-ghost:var(--dsw-alias-button-ghost-active-border,#4f6ef740);--hub-border-input:var(--dsw-alias-input-border,#6b728040);--hub-brand:var(--dsw-alias-state-business-primary,#4f6ef7);--hub-brand-hover:#3b5bdb;--hub-brand-tint:#4f6ef70f;--hub-brand-tint-strong:#4f6ef71f;--hub-brand-border:#4f6ef759;--hub-brand-border-soft:#4f6ef738;--hub-purple-1:#4f46e5;--hub-purple-2:#7c3aed;--hub-purple-border:#8b5cf68c;--hub-purple-tint:#4f46e514;--hub-purple-shadow:#4f46e547;--hub-purple-shadow-strong:#7c3aed6b;--hub-btn-fill:var(--dsw-alias-button-primary-fill,#1f2328);--hub-btn-hover:var(--dsw-alias-button-primary-hover,#43454a);--hub-success:#16a34a;--hub-success-tint:#16a34a1f;--hub-success-border:#16a34a4d;--hub-warn:var(--dsw-alias-state-warn-primary,#b8860b);--hub-warn-tint:#b8860b14;--hub-warn-border:#b8860b59;--hub-warn-strong:#b8860bd9;--hub-warning:var(--dsw-alias-state-warning-primary,#b45309);--hub-warning-hover:#92400e;--hub-warning-tint:#b4530914;--hub-warning-border:#b453094d;--hub-danger:var(--dsw-alias-state-danger-primary,#d1242f);--hub-danger-hover:var(--dsw-alias-state-danger-hover,#b91c1c);--hub-danger-strong:#b0202a;--hub-danger-text:#e5484d;--hub-danger-tint:#e5484d14;--hub-danger-tint-weak:#e5484d0d;--hub-danger-border:#e5484d59;--hub-danger-border-soft:#e5484d47;--hub-danger-soft:#d1242f14}body[data-ds-dark-theme]{--hub-bg-btn:#ffffff1f;--hub-success:#22c55e;--hub-success-tint:#22c55e29;--hub-success-border:#22c55e59}";
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}";
6011
6250
  const tagId = "dsh-plugin/tokens.module.css";
6012
6251
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
6013
6252
  const tag = document.createElement("style");
@@ -6019,7 +6258,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6019
6258
  //#endregion
6020
6259
  //#region src/client/index.tsx
6021
6260
  /**
6022
- * DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
6261
+ * DSH Plugin Hub — the community plugin marketplace for DeepSeek Harness.
6023
6262
  * Website: https://dsh-plugin.org
6024
6263
  * GitHub: https://github.com/dshplugin/dsh-plugin-hub
6025
6264
  *