dsh-plugin 1.6.5 → 1.6.7

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 (53) hide show
  1. package/README.en.md +11 -11
  2. package/README.md +11 -11
  3. package/client/client.js +421 -390
  4. package/client/client.js.map +1 -1
  5. package/lib/http/catalog.js +132 -0
  6. package/lib/http/diagnostics.js +201 -0
  7. package/lib/http/install.js +399 -0
  8. package/lib/http/logs.js +164 -0
  9. package/lib/http/routes.js +19 -1263
  10. package/lib/http/settings.js +77 -0
  11. package/lib/http/shared.js +169 -0
  12. package/lib/http/task.js +208 -0
  13. package/lib/services/install/install.js +1 -1
  14. package/lib/services/install/package-entry.js +59 -8
  15. package/lib/services/install/preflight.js +47 -17
  16. package/lib/services/install/task-queue.js +75 -31
  17. package/lib/services/probe.js +1 -1
  18. package/lib/types/http/catalog.d.ts +10 -0
  19. package/lib/types/http/diagnostics.d.ts +4 -0
  20. package/lib/types/http/install.d.ts +11 -0
  21. package/lib/types/http/logs.d.ts +2 -0
  22. package/lib/types/http/routes.d.ts +15 -20
  23. package/lib/types/http/settings.d.ts +2 -0
  24. package/lib/types/http/shared.d.ts +44 -0
  25. package/lib/types/http/task.d.ts +3 -0
  26. package/lib/types/services/install/install.d.ts +1 -1
  27. package/lib/types/services/install/package-entry.d.ts +42 -10
  28. package/lib/types/services/install/preflight.d.ts +9 -1
  29. package/lib/types/services/install/task-queue.d.ts +6 -4
  30. package/package.json +1 -1
  31. package/src/client/components/PluginHubSection.tsx +3 -0
  32. package/src/client/components/modals/NotificationsModal.tsx +34 -18
  33. package/src/client/components/modals/modals.tsx +38 -28
  34. package/src/client/components/views/InstalledView.tsx +23 -11
  35. package/src/client/hooks/useCatalog.ts +1 -1
  36. package/src/client/locales.ts +28 -12
  37. package/src/client/logic/failures.ts +36 -157
  38. package/src/client/logic/urls.ts +75 -4
  39. package/src/client/types.ts +1 -1
  40. package/src/server/http/catalog.ts +143 -0
  41. package/src/server/http/diagnostics.ts +193 -0
  42. package/src/server/http/install.ts +391 -0
  43. package/src/server/http/logs.ts +149 -0
  44. package/src/server/http/routes.ts +22 -1222
  45. package/src/server/http/settings.ts +73 -0
  46. package/src/server/http/shared.ts +191 -0
  47. package/src/server/http/task.ts +194 -0
  48. package/src/server/services/install/install-types.ts +9 -1
  49. package/src/server/services/install/install.ts +11 -1
  50. package/src/server/services/install/package-entry.ts +72 -9
  51. package/src/server/services/install/preflight.ts +47 -18
  52. package/src/server/services/install/task-queue.ts +73 -34
  53. package/src/server/services/probe.ts +1 -1
package/client/client.js CHANGED
@@ -35,7 +35,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
35
35
  failedDescProxy: "你的网络似乎不通,或设置里的 HTTP 代理地址不可达,无法获取插件目录数据。请检查代理设置与网络连接后重试;或点击右上角按钮在浏览器中打开插件市场。",
36
36
  retry: "重试",
37
37
  install: "安装",
38
- cliOnlyHint: "此插件可能需命令行辅助,失败时复制上方命令到 dsh 终端",
38
+ cliOnlyHint: "此插件需在命令行安装(网页端无法代执行),请复制上方命令到终端运行",
39
39
  failedCopyHint: "安装失败。请复制上方安装命令到 dsh 终端手动执行(原生依赖构建脚本可能需要人工放行,如 pnpm approve-builds)",
40
40
  toastCopied: "安装命令已复制,去 dsh 终端粘贴即可安装",
41
41
  installed: "已安装",
@@ -90,6 +90,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
90
90
  statusLabel: "安装状态",
91
91
  statusRunning: "运行中",
92
92
  statusPending: "待重启",
93
+ statusInactive: "未激活(宿主加载失败,可能不是有效的 dsh 插件)",
93
94
  exampleLabel: "DeepSeek Harness 内置示例项目",
94
95
  exampleHint: "DeepSeek Harness 内置示例项目:不是插件市场的 dsh 插件,宿主不会加载它,无需重启",
95
96
  restart: "重启",
@@ -288,9 +289,12 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
288
289
  failCopy: "复制完整错误信息",
289
290
  failIssueHint: "带着错误日志去作者仓库一键提交 Issue(正文含官网收录链接)",
290
291
  failIssueBig: "一键提交 BUG 到 GitHub Issue 为开源作贡献",
292
+ failHubIssueHint: "此失败已被判定为环境或插件中心自身问题(非插件作者问题),带着错误日志到插件中心仓库一键提交 Issue",
293
+ failHubIssueBig: "反馈给插件中心排查",
294
+ failUnclassifiedHint: "安装失败,原因未能自动识别。这通常不是插件自身的问题(可能与本机环境或插件中心有关),请将错误信息反馈给插件中心,由维护者排查。",
291
295
  failPrepareHint: "该插件安装时的构建脚本执行失败(git 分发常缺失子模块或构建产物),属插件打包分发问题。请向作者仓库提交 Issue 反馈。",
292
- failPackagingHint: "该插件不支持官方默认安装方式:其 git 分发缺少构建产物(package.json 声明的入口文件在仓库中不存在),说明作者未适配官方安装流程。请到作者仓库提交 Issue 反馈,请其提交构建产物、改用预构建 release `.tgz` 直链(`releases/download/<tag>/<asset>.tgz`),或发布完整的 npm 版。",
293
- failIgnoredBuild: "该插件或其依赖需要执行构建脚本,被 pnpm 的安全白名单(allowBuilds)默认拦截导致安装失败(如原生模块 node-pty、或 git 安装时插件的 prepare 脚本)—— 其他插件不受影响,属该插件的依赖/打包问题。建议向作者仓库一键反馈,请作者改用预编译版本(如 node-pty-prebuilt-multiarch)或移除安装期构建。",
296
+ failPackagingHint: "该插件不支持官方默认安装方式:其 git 分发缺少它需要的文件(`main` / `exports` 声明的入口、补丁按本包名 mount 的入口,或 `dsh.bundle.patch` 声明的补丁),说明作者未适配官方安装流程。请到作者仓库提交 Issue 反馈,请其提交构建产物、改用预构建 release `.tgz` 直链(`releases/download/<tag>/<asset>.tgz`),或发布完整的 npm 版。",
297
+ failIgnoredBuild: "该插件或其依赖需要执行构建脚本,被 pnpm 的安全白名单(allowBuilds)默认拦截导致安装失败(如原生模块 node-pty、或 git 安装时插件的 prepare 脚本)。这不一定是插件自身的问题(也可能是插件中心反查失败后回退到 git 安装所致),请先反馈给插件中心排查;若确认为插件依赖问题,可建议作者改用预编译版本(如 node-pty-prebuilt-multiarch)或移除安装期构建。",
294
298
  failNpmTooLow: "怀疑本机 npm 版本过低:npm 解析插件依赖时内部崩溃(这是 npm 自身的已知缺陷,不是插件问题)。请升级 npm 后重试:npm install -g npm@latest",
295
299
  failNpmTooLowV: "本机 npm 版本过低(当前 v{v}):npm 解析插件依赖时内部崩溃(这是 npm 自身的已知缺陷,不是插件问题)。请升级 npm 后重试:npm install -g npm@latest",
296
300
  failNetworkHint: "安装前检测到网络不通:无法连接到安装源(可能是断网、DNS 解析失败、被防火墙拦截,或代理配置有问题)。这不是插件本身的问题 —— 请检查网络连接,或到「设置」里确认 HTTP 代理配置,再到「系统诊断」运行一次连通性检测,然后重试。",
@@ -306,6 +310,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
306
310
  failPnpmUnusedPatchHint: "安装器调用 pnpm 时报「有些补丁没有被使用」(ERR_PNPM_UNUSED_PATCH):你的 profile 里留着一条指向旧版本 dsh-plugin 的补丁声明(例如 dsh-plugin@1.4.2),而本次安装解析到的版本已经不是它,pnpm 出于安全直接中止整次安装,因此任何插件都装不进来。这不是插件本身的问题——请在 profile 目录(~/.dsh/profiles/<profile>)的 pnpm-workspace.yaml(pnpm 11 及以上)或 package.json 的 pnpm.patchedDependencies(pnpm 10)里删除该 dsh-plugin 补丁条目后重试。",
307
311
  failPnpmMissingDepTarget: "{pkg} 在 npm registry 上不存在(404)",
308
312
  failPnpmMissingDepHint: "安装器调用 pnpm 时报「包不存在」(ERR_PNPM_FETCH_404):你的 profile 里留着一条指向 registry 上未发布包的依赖,pnpm 每次解析依赖都会先卡在它上面,因此任何插件都装不进来。这不是插件本身的问题——请在 profile 目录(~/.dsh/profiles/<profile>)的 package.json 里删除该依赖条目(同时删掉对应的 pnpm-lock.yaml 条目或整个锁文件)后重试。",
313
+ failRegistryVersionStaleHint: "安装器调用 pnpm 时报「找不到匹配的版本」(ERR_PNPM_NO_MATCHING_VERSION):要装的这个版本在实际执行安装的 npm 源里查不到。常见原因是你设置的 npmRegistry 与本机 ~/.npmrc 用的不是同一个源——官方源刚发布、镜像还没同步上来(快则几分钟、慢则几小时),也可能只是版本号写错了。这不是插件本身的问题。可在插件市场设置里把 npmRegistry 改成与本机 ~/.npmrc 一致(或反过来),或那一次显式走官方源(https://registry.npmjs.org)、改用离线包后重试;若该版本刚发布不久,等镜像同步后重试即可。",
314
+ failPnpmLinkedDirMissingHint: "安装器调用 pnpm 时报「要安装的目录不存在」(ERR_PNPM_LINKED_PKG_DIR_NOT_FOUND):你的 profile 里留着一条指向本机不存在目录的本地依赖(link: / file: 形式,例如用 dsh plugin add <本地路径> 装过开发中的插件,之后那个目录被删除或移动了)。pnpm 每次解析 profile 依赖都会先卡在它上面,因此任何插件都装不进来。这不是插件本身的问题——请在 profile 目录(~/.dsh/profiles/<profile>)的 package.json 里删除该本地依赖条目(同时删掉对应的 pnpm-lock.yaml 条目或整个锁文件),或把该目录恢复回原路径后重试。",
309
315
  failFileLockedHint: "安装过程中 pnpm 无法替换 profile 里的文件:有程序正占用着它(Windows 常见报错 os error 32「另一个程序正在使用此文件」)。通常是 DeepSeek Harness 自身或杀毒软件的实时扫描持有文件句柄。这不是插件本身的问题——请完全退出 DeepSeek Harness(Windows 可在任务管理器确认进程已结束,必要时临时关闭杀毒软件实时防护)后重试。",
310
316
  failAccessDeniedHint: "安装过程中 pnpm 写入 profile 里的文件被系统拒绝访问(Windows 常见报错 os error 5「拒绝访问」,英文为 Access is denied;Node 下的 EPERM / EACCES 同理)。常见原因是该文件或目录正被其他进程占用、文件带只读属性、目录权限受限,或杀毒软件实时防护拦截了写入——这与「文件正被占用」(os error 32)同属本机文件系统问题,任何插件装进该目录都会一样失败,不是插件本身的问题。请完全退出 DeepSeek Harness(Windows 可在任务管理器确认进程已结束,必要时临时关闭杀毒软件实时防护)后重试;若仍然失败,请检查 profile 目录及其文件是否被设为只读,并以管理员身份重新运行。",
311
317
  failFsUnavailableHint: "安装过程中 pnpm 无法把文件写进本机磁盘(这类报错与装哪个插件无关,任何插件装在同一目录都会失败,不是插件本身的问题)。请按报错对号入座:① 磁盘空间不足(ENOSPC / no space left on device,Windows 为 os error 112)——请清理 profile 所在磁盘的剩余空间后重试;② 磁盘或挂载点只读、带写保护(EROFS / read-only file system,Windows 为 os error 19)——请确认 profile 目录所在磁盘可写(外接盘/U 盘、带写保护的移动盘或只读挂载的分区都会触发),必要时把插件目录换到系统盘的可写位置;③ 进程可用的文件句柄被耗尽(EMFILE / ENFILE / too many open files)——请关闭占用大量文件的程序并重启 DeepSeek Harness 后重试。",
@@ -376,7 +382,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
376
382
  failedDescProxy: "Your network seems unreachable, or the HTTP proxy in Settings is unreachable, so the plugin catalog could not be loaded. Please check the proxy address and your connection, then retry; or open the hub in your browser with the button above.",
377
383
  retry: "Retry",
378
384
  install: "Install",
379
- cliOnlyHint: "This plugin may need command-line help; if it fails, copy the command above and run it in your dsh terminal",
385
+ cliOnlyHint: "This plugin must be installed from the command line (it cannot be run from the web UI) — copy the command above and run it in your terminal",
380
386
  failedCopyHint: "Install failed. Copy the command above and run it manually in your dsh terminal (native build scripts may need manual approval, e.g. pnpm approve-builds)",
381
387
  toastCopied: "Install command copied — paste it in your dsh terminal",
382
388
  installed: "Installed",
@@ -431,6 +437,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
431
437
  statusLabel: "Status",
432
438
  statusRunning: "Running",
433
439
  statusPending: "Restart pending",
440
+ statusInactive: "Not active (the host failed to load it — possibly not a valid dsh plugin)",
434
441
  exampleLabel: "DeepSeek Harness built-in example",
435
442
  exampleHint: "DeepSeek Harness built-in example — not a marketplace dsh plugin, the host does not load it, no restart needed",
436
443
  restart: "Restart",
@@ -632,9 +639,12 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
632
639
  failCopy: "Copy full log",
633
640
  failIssueHint: "Open a pre-filled issue on the author repo with this error log (includes catalog links)",
634
641
  failIssueBig: "Report this bug to GitHub — contribute to open source",
642
+ failHubIssueHint: "This failure was classified as an environment or Plugin Hub issue (not a plugin-author issue). Open a pre-filled issue on the Plugin Hub repo with this error log.",
643
+ failHubIssueBig: "Report to the Plugin Hub for triage",
644
+ failUnclassifiedHint: "The install failed and the cause could not be identified automatically. This is usually not the plugin itself (it may relate to your local environment or the Plugin Hub). Please report the error to the Plugin Hub so the maintainers can triage it.",
635
645
  failPrepareHint: "This plugin failed while running its build scripts during install (git tarballs often miss submodules or build output). This is a packaging issue of the plugin itself — please report it to the author repository.",
636
- failPackagingHint: "This plugin does not support the official default install method: its git distribution lacks the build output (the entry file declared in package.json is not in the repository), so it has not been adapted to the official install flow. Please file an Issue on the author's repo asking for committed build output, a prebuilt release `.tgz` (`releases/download/<tag>/<asset>.tgz`), or a complete npm release.",
637
- failIgnoredBuild: "This plugin (or its dependencies) needs to run build scripts, which pnpm blocks by default via its allowBuilds allowlist, so the install fails (e.g. native modules like node-pty, or the plugin's own prepare script on git installs) — other plugins are unaffected. This is a dependency/packaging issue of the plugin itself. Please report it to the author repository and ask the author to ship a prebuilt variant (e.g. node-pty-prebuilt-multiarch) or drop install-time builds.",
646
+ failPackagingHint: "This plugin does not support the official default install method: its git distribution lacks a file the package needs (the entry from `main` / `exports`, an entry its own patch mounts by name, or the patch declared by `dsh.bundle.patch`), so it has not been adapted to the official install flow. Please file an Issue on the author's repo asking for committed build output, a prebuilt release `.tgz` (`releases/download/<tag>/<asset>.tgz`), or a complete npm release.",
647
+ failIgnoredBuild: "This plugin (or its dependencies) needs to run build scripts, which pnpm blocks by default via its allowBuilds allowlist, so the install fails (e.g. native modules like node-pty, or the plugin's own prepare script on git installs). This is not necessarily the plugin itself (it may be caused by the hub falling back to a git install after npm lookup failed). Please report it to the Plugin Hub first; if it turns out to be a plugin dependency issue, the author can ship a prebuilt variant (e.g. node-pty-prebuilt-multiarch) or drop install-time builds.",
638
648
  failNpmTooLow: "Your local npm may be too old: npm crashed internally while resolving the plugin's dependencies (a known npm bug — not a plugin issue). Please upgrade npm and retry: npm install -g npm@latest",
639
649
  failNpmTooLowV: "Your local npm is too old (v{v}): npm crashed internally while resolving the plugin's dependencies (a known npm bug — not a plugin issue). Please upgrade npm and retry: npm install -g npm@latest",
640
650
  failNetworkHint: "The network could not be reached before install: the install source is unreachable (offline, DNS failure, firewall block, or a misconfigured proxy). This is not a problem with the plugin itself — please check your connection, confirm the HTTP proxy in Settings, run a connectivity check under System Diagnostics, then retry.",
@@ -650,6 +660,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
650
660
  failPnpmUnusedPatchHint: "pnpm reported that some patches were not used (ERR_PNPM_UNUSED_PATCH): your profile still holds a patch entry for an older dsh-plugin version (for example dsh-plugin@1.4.2), while this install resolved a different version, so pnpm aborts the whole install for safety — no plugin can be installed into that profile. This is not a problem with the plugin itself. Remove that dsh-plugin patch entry from pnpm-workspace.yaml (pnpm 11+) or from pnpm.patchedDependencies in package.json (pnpm 10) inside the profile directory (~/.dsh/profiles/<profile>), then retry.",
651
661
  failPnpmMissingDepTarget: "{pkg} was not found on the npm registry (404)",
652
662
  failPnpmMissingDepHint: "pnpm reported that a package does not exist on the npm registry (ERR_PNPM_FETCH_404): your profile keeps a dependency on a package that was never published, and pnpm hits it every time it resolves dependencies — no plugin can be installed into that profile. This is not a problem with the plugin itself. Remove that dependency from package.json inside the profile directory (~/.dsh/profiles/<profile>) — along with its entry in pnpm-lock.yaml, or the lockfile itself — then retry.",
663
+ failRegistryVersionStaleHint: "pnpm reported that no matching version was found (ERR_PNPM_NO_MATCHING_VERSION): the version being installed does not exist in the npm registry that actually performs the install. This usually means the npmRegistry configured in the hub differs from the source in your local ~/.npmrc — the official registry has published it but the mirror has not synced yet (it can take minutes to hours) — or the version number was simply mistyped. This is not a problem with the plugin itself. Align the hub's npmRegistry with your local ~/.npmrc (or the other way round), or explicitly use the official registry (https://registry.npmjs.org) for that one install, or use an offline package, then retry; if the version was published only recently, waiting for the mirror to sync is enough.",
664
+ failPnpmLinkedDirMissingHint: "pnpm reported that a directory it needs to install from does not exist (ERR_PNPM_LINKED_PKG_DIR_NOT_FOUND): your profile keeps a local dependency (a link: / file: entry, e.g. from `dsh plugin add <local path>`) whose target directory has since been deleted or moved. pnpm hits it every time it resolves profile dependencies, so no plugin can be installed into that profile. This is not a problem with the plugin itself. Remove that local dependency from package.json inside the profile directory (~/.dsh/profiles/<profile>) — along with its entry in pnpm-lock.yaml, or the lockfile itself — or restore the directory to its original path, then retry.",
653
665
  failFileLockedHint: "During install, pnpm could not replace a file inside the profile because another program is holding it (on Windows this shows as os error 32, \"the process cannot access the file because it is being used by another process\"). Usually DeepSeek Harness itself or a real-time antivirus scan holds the handle. This is not a problem with the plugin itself — fully quit DeepSeek Harness (on Windows, confirm in Task Manager that the process has ended, and temporarily disable real-time antivirus protection if needed), then retry.",
654
666
  failAccessDeniedHint: "During install, Windows denied pnpm access to a file inside the profile (this shows as os error 5, \"Access is denied\"; on Node the equivalent codes are EPERM / EACCES). Typical causes: the file or directory is held by another process, the file is marked read-only, the directory permissions are restricted, or a real-time antivirus scan blocked the write. This is the same class of local file-system problem as a locked file (os error 32) — no plugin can be installed into that directory, so it is not a problem with the plugin itself. Fully quit DeepSeek Harness (on Windows, confirm in Task Manager that the process has ended, and temporarily disable real-time antivirus protection if needed), then retry. If it still fails, check whether the profile directory or its files are read-only and run as administrator.",
655
667
  failFsUnavailableHint: "During install, pnpm could not write files to the local disk — this has nothing to do with which plugin you are installing: any plugin installed into the same directory would fail the same way, so it is not a problem with the plugin itself. Match the error you see: ① Out of space (ENOSPC / no space left on device, os error 112 on Windows) — free up space on the drive that holds the profile and retry. ② Read-only or write-protected volume (EROFS / read-only file system, os error 19 on Windows) — make sure the drive holding the profile directory is writable (external or USB drives, write-protected media, and read-only mounts all trigger this); move the plugin directory to a writable location on the system drive if needed. ③ File handles exhausted (EMFILE / ENFILE / too many open files) — close programs that hold many files open, restart DeepSeek Harness, then retry.",
@@ -714,42 +726,42 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
714
726
  css: css$11
715
727
  });
716
728
  var Header_module_css_default = {
717
- "adText": "qikqja_adText",
718
- "version": "qikqja_version",
719
- "adBanner": "qikqja_adBanner",
720
- "segLabel": "qikqja_segLabel",
721
- "segBtnActive": "qikqja_segBtnActive",
722
- "controls": "qikqja_controls",
723
- "searchRow": "qikqja_searchRow",
724
- "langBtn": "qikqja_langBtn",
725
- "headerTitleRow": "qikqja_headerTitleRow",
726
- "title": "qikqja_title",
727
- "segGroup": "qikqja_segGroup",
728
- "hubUpdateBadge": "qikqja_hubUpdateBadge",
729
+ "segBtn": "qikqja_segBtn",
729
730
  "taglineLink": "qikqja_taglineLink",
730
- "logoIcon": "qikqja_logoIcon",
731
- "versionBtn": "qikqja_versionBtn",
732
- "tagline": "qikqja_tagline",
733
- "tabs": "qikqja_tabs",
734
- "sortGroup": "qikqja_sortGroup",
735
- "tab": "qikqja_tab",
736
- "headerRight": "qikqja_headerRight",
731
+ "version": "qikqja_version",
732
+ "adBadge": "qikqja_adBadge",
733
+ "root": "qikqja_root",
734
+ "aboutBtn": "qikqja_aboutBtn",
737
735
  "tabActive": "qikqja_tabActive",
736
+ "tab": "qikqja_tab",
738
737
  "tabCount": "qikqja_tabCount",
738
+ "headerTitleRow": "qikqja_headerTitleRow",
739
739
  "tabsRow": "qikqja_tabsRow",
740
- "githubIcon": "qikqja_githubIcon",
741
- "adArrow": "qikqja_adArrow",
742
- "aboutBtn": "qikqja_aboutBtn",
743
- "segBtn": "qikqja_segBtn",
744
- "adBadge": "qikqja_adBadge",
745
740
  "copyIcon": "qikqja_copyIcon",
746
- "search": "qikqja_search",
741
+ "githubLink": "qikqja_githubLink",
742
+ "title": "qikqja_title",
743
+ "controls": "qikqja_controls",
744
+ "hubUpdateBadge": "qikqja_hubUpdateBadge",
745
+ "langBtn": "qikqja_langBtn",
747
746
  "brandTitle": "qikqja_brandTitle",
748
- "root": "qikqja_root",
749
- "resultSeg": "qikqja_resultSeg",
747
+ "adText": "qikqja_adText",
750
748
  "resultCount": "qikqja_resultCount",
749
+ "tabs": "qikqja_tabs",
750
+ "githubIcon": "qikqja_githubIcon",
751
+ "segGroup": "qikqja_segGroup",
751
752
  "header": "qikqja_header",
752
- "githubLink": "qikqja_githubLink"
753
+ "sortGroup": "qikqja_sortGroup",
754
+ "search": "qikqja_search",
755
+ "adBanner": "qikqja_adBanner",
756
+ "searchRow": "qikqja_searchRow",
757
+ "segLabel": "qikqja_segLabel",
758
+ "logoIcon": "qikqja_logoIcon",
759
+ "versionBtn": "qikqja_versionBtn",
760
+ "adArrow": "qikqja_adArrow",
761
+ "segBtnActive": "qikqja_segBtnActive",
762
+ "headerRight": "qikqja_headerRight",
763
+ "tagline": "qikqja_tagline",
764
+ "resultSeg": "qikqja_resultSeg"
753
765
  };
754
766
  //#endregion
755
767
  //#region \0dsh-css:src/client/styles/Modal.module.css.mjs
@@ -768,136 +780,136 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
768
780
  css: css$10
769
781
  });
770
782
  var Modal_module_css_default = {
771
- "failBigIssue": "BiQ1zG_failBigIssue",
772
- "modalActions": "BiQ1zG_modalActions",
773
- "noticeIgnore": "BiQ1zG_noticeIgnore",
774
- "queueRow": "BiQ1zG_queueRow",
775
- "uninstallConfirm": "BiQ1zG_uninstallConfirm",
783
+ "noticeHead": "BiQ1zG_noticeHead",
784
+ "modalTitle": "BiQ1zG_modalTitle",
785
+ "cliOnlyHint": "BiQ1zG_cliOnlyHint",
786
+ "modalCmd": "BiQ1zG_modalCmd",
787
+ "restartNowWarning": "BiQ1zG_restartNowWarning",
788
+ "queuedHint": "BiQ1zG_queuedHint",
776
789
  "stripCancel": "BiQ1zG_stripCancel",
777
- "dangerConfirm": "BiQ1zG_dangerConfirm",
778
- "detailPathBtn": "BiQ1zG_detailPathBtn",
790
+ "noticeTextOk": "BiQ1zG_noticeTextOk",
791
+ "noticeTime": "BiQ1zG_noticeTime",
792
+ "modalLink": "BiQ1zG_modalLink",
779
793
  "errorCopySoft": "BiQ1zG_errorCopySoft",
780
- "noticeTextFail": "BiQ1zG_noticeTextFail",
781
- "pendingRowStatus": "BiQ1zG_pendingRowStatus",
782
- "modalTitleQueued": "BiQ1zG_modalTitleQueued",
783
- "noticeVersion": "BiQ1zG_noticeVersion",
784
- "detailLabel": "BiQ1zG_detailLabel",
785
- "noticeHead": "BiQ1zG_noticeHead",
786
- "modalCloseIcon": "BiQ1zG_modalCloseIcon",
787
- "noticeBadgeFail": "BiQ1zG_noticeBadgeFail",
788
- "modalHead": "BiQ1zG_modalHead",
789
- "queueRowStatus": "BiQ1zG_queueRowStatus",
790
794
  "failedCopyHint": "BiQ1zG_failedCopyHint",
791
- "errorModal": "BiQ1zG_errorModal",
792
- "queuedHint": "BiQ1zG_queuedHint",
795
+ "modalTitleBusy": "BiQ1zG_modalTitleBusy",
796
+ "modalBody": "BiQ1zG_modalBody",
797
+ "hubUpdateMeta": "BiQ1zG_hubUpdateMeta",
798
+ "modalInstall": "BiQ1zG_modalInstall",
799
+ "confirmIcon": "BiQ1zG_confirmIcon",
800
+ "modalWide": "BiQ1zG_modalWide",
801
+ "toast": "BiQ1zG_toast",
802
+ "failEmpty": "BiQ1zG_failEmpty",
803
+ "detailRow": "BiQ1zG_detailRow",
793
804
  "progressTrack": "BiQ1zG_progressTrack",
794
- "noticeRowOk": "BiQ1zG_noticeRowOk",
795
- "aboutModal": "BiQ1zG_aboutModal",
805
+ "result": "BiQ1zG_result",
806
+ "modalClose": "BiQ1zG_modalClose",
807
+ "helpModal": "BiQ1zG_helpModal",
808
+ "resultCheckIcon": "BiQ1zG_resultCheckIcon",
809
+ "modalActions": "BiQ1zG_modalActions",
810
+ "pendingRowActions": "BiQ1zG_pendingRowActions",
796
811
  "overlay": "BiQ1zG_overlay",
797
- "trustHint": "BiQ1zG_trustHint",
798
- "detailArrow": "BiQ1zG_detailArrow",
799
- "modalDesc": "BiQ1zG_modalDesc",
800
- "detailGrid": "BiQ1zG_detailGrid",
801
- "modalInstall": "BiQ1zG_modalInstall",
802
- "progressFill": "BiQ1zG_progressFill",
803
- "detailPathActions": "BiQ1zG_detailPathActions",
804
- "noticeBadgeOk": "BiQ1zG_noticeBadgeOk",
805
- "detailModal": "BiQ1zG_detailModal",
806
- "queueSection": "BiQ1zG_queueSection",
807
- "confirmIconWrap": "BiQ1zG_confirmIconWrap",
812
+ "noticeMain": "BiQ1zG_noticeMain",
813
+ "errorHint": "BiQ1zG_errorHint",
814
+ "dangerConfirm": "BiQ1zG_dangerConfirm",
815
+ "noticeRowUpdate": "BiQ1zG_noticeRowUpdate",
816
+ "errorModal": "BiQ1zG_errorModal",
817
+ "logModal": "BiQ1zG_logModal",
818
+ "failNetworkTarget": "BiQ1zG_failNetworkTarget",
808
819
  "queueRowTarget": "BiQ1zG_queueRowTarget",
809
- "restartLater": "BiQ1zG_restartLater",
810
- "hubUpdateModal": "BiQ1zG_hubUpdateModal",
811
- "modalLink": "BiQ1zG_modalLink",
820
+ "resultDesc": "BiQ1zG_resultDesc",
821
+ "resultRestarting": "BiQ1zG_resultRestarting",
822
+ "queueRow": "BiQ1zG_queueRow",
812
823
  "detailStars": "BiQ1zG_detailStars",
813
- "failKindUninstall": "BiQ1zG_failKindUninstall",
814
- "restartNow": "BiQ1zG_restartNow",
824
+ "detailPathActions": "BiQ1zG_detailPathActions",
825
+ "queueRowTrack": "BiQ1zG_queueRowTrack",
826
+ "detailStatusRunning": "BiQ1zG_detailStatusRunning",
827
+ "modalRow": "BiQ1zG_modalRow",
815
828
  "queueRowPct": "BiQ1zG_queueRowPct",
816
- "modalBody": "BiQ1zG_modalBody",
817
- "resultCheckIcon": "BiQ1zG_resultCheckIcon",
818
- "modalTitle": "BiQ1zG_modalTitle",
819
- "noticeList": "BiQ1zG_noticeList",
820
- "noticeUpdateGo": "BiQ1zG_noticeUpdateGo",
821
- "failRepo": "BiQ1zG_failRepo",
822
- "modalCopy": "BiQ1zG_modalCopy",
823
- "helpModal": "BiQ1zG_helpModal",
824
- "confirmIconDanger": "BiQ1zG_confirmIconDanger",
825
- "detailLink": "BiQ1zG_detailLink",
829
+ "hubUpdateNotes": "BiQ1zG_hubUpdateNotes",
826
830
  "modalCmdCopy": "BiQ1zG_modalCmdCopy",
827
- "failNetworkTarget": "BiQ1zG_failNetworkTarget",
828
- "errorTitle": "BiQ1zG_errorTitle",
829
- "aboutContent": "BiQ1zG_aboutContent",
830
- "noticeTextOk": "BiQ1zG_noticeTextOk",
831
- "detailRow": "BiQ1zG_detailRow",
832
- "hubUpdateMeta": "BiQ1zG_hubUpdateMeta",
833
- "detailStatusPending": "BiQ1zG_detailStatusPending",
834
- "detailMono": "BiQ1zG_detailMono",
835
- "queueRowTrack": "BiQ1zG_queueRowTrack",
836
- "resultCheck": "BiQ1zG_resultCheck",
837
- "noticeTime": "BiQ1zG_noticeTime",
838
- "failKind": "BiQ1zG_failKind",
839
- "confirmIcon": "BiQ1zG_confirmIcon",
840
- "queueRowBody": "BiQ1zG_queueRowBody",
831
+ "noticeUpdateGo": "BiQ1zG_noticeUpdateGo",
841
832
  "modalLabel": "BiQ1zG_modalLabel",
833
+ "toastIn": "BiQ1zG_toastIn",
834
+ "modalCancel": "BiQ1zG_modalCancel",
835
+ "failList": "BiQ1zG_failList",
836
+ "noticeRow": "BiQ1zG_noticeRow",
837
+ "noticeRowMain": "BiQ1zG_noticeRowMain",
838
+ "pendingRowStatus": "BiQ1zG_pendingRowStatus",
839
+ "detailPath": "BiQ1zG_detailPath",
840
+ "queueRowStatus": "BiQ1zG_queueRowStatus",
841
+ "modalDesc": "BiQ1zG_modalDesc",
842
+ "uninstallConfirm": "BiQ1zG_uninstallConfirm",
843
+ "restartLater": "BiQ1zG_restartLater",
844
+ "queueRowHead": "BiQ1zG_queueRowHead",
845
+ "noticeBadgeOk": "BiQ1zG_noticeBadgeOk",
842
846
  "resultTitle": "BiQ1zG_resultTitle",
843
- "detailStatusRunning": "BiQ1zG_detailStatusRunning",
847
+ "resultCheck": "BiQ1zG_resultCheck",
848
+ "progressHead": "BiQ1zG_progressHead",
849
+ "detailValue": "BiQ1zG_detailValue",
850
+ "detailMono": "BiQ1zG_detailMono",
851
+ "noticeVersion": "BiQ1zG_noticeVersion",
852
+ "aboutContent": "BiQ1zG_aboutContent",
853
+ "modal": "BiQ1zG_modal",
854
+ "modalValue": "BiQ1zG_modalValue",
855
+ "errorBox": "BiQ1zG_errorBox",
856
+ "failDiagBtn": "BiQ1zG_failDiagBtn",
857
+ "detailGrid": "BiQ1zG_detailGrid",
844
858
  "noticeBadgeIcon": "BiQ1zG_noticeBadgeIcon",
845
- "errorHint": "BiQ1zG_errorHint",
846
859
  "detailUpdateHint": "BiQ1zG_detailUpdateHint",
847
- "queueRowHead": "BiQ1zG_queueRowHead",
860
+ "detailLink": "BiQ1zG_detailLink",
848
861
  "modalCmdText": "BiQ1zG_modalCmdText",
862
+ "noticeRemove": "BiQ1zG_noticeRemove",
863
+ "progressFill": "BiQ1zG_progressFill",
864
+ "noticeFoot": "BiQ1zG_noticeFoot",
865
+ "failKind": "BiQ1zG_failKind",
866
+ "detailDim": "BiQ1zG_detailDim",
867
+ "queueRowBody": "BiQ1zG_queueRowBody",
868
+ "queueSection": "BiQ1zG_queueSection",
869
+ "linkIcon": "BiQ1zG_linkIcon",
870
+ "noticeRowOk": "BiQ1zG_noticeRowOk",
871
+ "detailModal": "BiQ1zG_detailModal",
872
+ "failCopy": "BiQ1zG_failCopy",
873
+ "failPrepareHint": "BiQ1zG_failPrepareHint",
874
+ "detailStatusText": "BiQ1zG_detailStatusText",
849
875
  "confirmPrimary": "BiQ1zG_confirmPrimary",
876
+ "restartNow": "BiQ1zG_restartNow",
877
+ "detailLabel": "BiQ1zG_detailLabel",
878
+ "detailArrow": "BiQ1zG_detailArrow",
879
+ "progress": "BiQ1zG_progress",
850
880
  "progressFillFail": "BiQ1zG_progressFillFail",
851
- "modalCancel": "BiQ1zG_modalCancel",
852
- "failEmpty": "BiQ1zG_failEmpty",
853
- "queueSectionTitle": "BiQ1zG_queueSectionTitle",
854
- "detailDim": "BiQ1zG_detailDim",
855
- "noticeRow": "BiQ1zG_noticeRow",
856
- "resultDesc": "BiQ1zG_resultDesc",
857
881
  "progressText": "BiQ1zG_progressText",
882
+ "modalCloseIcon": "BiQ1zG_modalCloseIcon",
883
+ "noticeIgnore": "BiQ1zG_noticeIgnore",
884
+ "noticeList": "BiQ1zG_noticeList",
885
+ "failKindUninstall": "BiQ1zG_failKindUninstall",
886
+ "queueSectionTitle": "BiQ1zG_queueSectionTitle",
887
+ "confirmIconDanger": "BiQ1zG_confirmIconDanger",
888
+ "noticeTextFail": "BiQ1zG_noticeTextFail",
889
+ "failRepo": "BiQ1zG_failRepo",
890
+ "aboutModal": "BiQ1zG_aboutModal",
858
891
  "overlayIn": "BiQ1zG_overlayIn",
859
- "modalClose": "BiQ1zG_modalClose",
860
- "hubUpdateNotes": "BiQ1zG_hubUpdateNotes",
861
- "result": "BiQ1zG_result",
862
- "detailPath": "BiQ1zG_detailPath",
863
- "modalIn": "BiQ1zG_modalIn",
864
- "aboutMeta": "BiQ1zG_aboutMeta",
865
- "noticeRowMain": "BiQ1zG_noticeRowMain",
866
- "errorBox": "BiQ1zG_errorBox",
867
- "modalCmd": "BiQ1zG_modalCmd",
868
- "toastIn": "BiQ1zG_toastIn",
869
- "noticeMain": "BiQ1zG_noticeMain",
870
- "cliOnlyHint": "BiQ1zG_cliOnlyHint",
871
- "failDiagBtn": "BiQ1zG_failDiagBtn",
872
- "restartNowWarning": "BiQ1zG_restartNowWarning",
873
- "detailStatusText": "BiQ1zG_detailStatusText",
874
- "modalTitleBusy": "BiQ1zG_modalTitleBusy",
875
- "modalWide": "BiQ1zG_modalWide",
876
- "pendingRowActions": "BiQ1zG_pendingRowActions",
877
- "noticeRowUpdate": "BiQ1zG_noticeRowUpdate",
878
- "detailValue": "BiQ1zG_detailValue",
892
+ "queueRowDesc": "BiQ1zG_queueRowDesc",
893
+ "failBigIssue": "BiQ1zG_failBigIssue",
894
+ "confirmIconWrap": "BiQ1zG_confirmIconWrap",
879
895
  "failClear": "BiQ1zG_failClear",
880
- "failPrepareHint": "BiQ1zG_failPrepareHint",
881
- "linkIcon": "BiQ1zG_linkIcon",
882
- "progressHead": "BiQ1zG_progressHead",
883
- "noticeFoot": "BiQ1zG_noticeFoot",
896
+ "modalTitleQueued": "BiQ1zG_modalTitleQueued",
884
897
  "detailPathText": "BiQ1zG_detailPathText",
885
- "logModal": "BiQ1zG_logModal",
886
- "modalValue": "BiQ1zG_modalValue",
887
- "modalRow": "BiQ1zG_modalRow",
888
- "resultRestarting": "BiQ1zG_resultRestarting",
889
- "failCopy": "BiQ1zG_failCopy",
898
+ "aboutMeta": "BiQ1zG_aboutMeta",
890
899
  "hubUpdateMetaItem": "BiQ1zG_hubUpdateMetaItem",
891
- "noticeRemove": "BiQ1zG_noticeRemove",
892
- "failHead": "BiQ1zG_failHead",
900
+ "modalIn": "BiQ1zG_modalIn",
893
901
  "failKindInstall": "BiQ1zG_failKindInstall",
894
- "toast": "BiQ1zG_toast",
895
- "queueRowDesc": "BiQ1zG_queueRowDesc",
896
- "modal": "BiQ1zG_modal",
902
+ "modalCopy": "BiQ1zG_modalCopy",
903
+ "toastFail": "BiQ1zG_toastFail",
904
+ "detailStatusPending": "BiQ1zG_detailStatusPending",
897
905
  "failRow": "BiQ1zG_failRow",
898
- "failList": "BiQ1zG_failList",
899
- "progress": "BiQ1zG_progress",
900
- "toastFail": "BiQ1zG_toastFail"
906
+ "hubUpdateModal": "BiQ1zG_hubUpdateModal",
907
+ "modalHead": "BiQ1zG_modalHead",
908
+ "trustHint": "BiQ1zG_trustHint",
909
+ "errorTitle": "BiQ1zG_errorTitle",
910
+ "noticeBadgeFail": "BiQ1zG_noticeBadgeFail",
911
+ "detailPathBtn": "BiQ1zG_detailPathBtn",
912
+ "failHead": "BiQ1zG_failHead"
901
913
  };
902
914
  //#endregion
903
915
  //#region src/server/services/install/release-target.ts
@@ -995,6 +1007,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
995
1007
  const SITE_URL = "https://dsh-plugin.org/";
996
1008
  /** 插件市场源码仓库:头部右上角 GitHub 图标的跳转地址 */
997
1009
  const GITHUB_URL = "https://github.com/dshplugin/dsh-plugin-hub";
1010
+ /** Hub 自身在目录数据里的仓库标识:头部版本号旁的「可更新」徽标按它定位自己。 */
1011
+ const HUB_REPO = "dshplugin/dsh-plugin-hub";
998
1012
  /**
999
1013
  * Hub 自我更新版本控制(接口中心 Pages:api.dsh-plugin.org,静态 JSON 发布)。
1000
1014
  * 发新版 = 在 api-center 的 releases/ 写发版记录 + 重新部署,hub.json 随之更新,
@@ -1009,7 +1023,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1009
1023
  * tsdown 构建时用 define 把 __PLUGIN_VERSION__ 替换成 package.json 的版本号;
1010
1024
  * node --test 直接 import 本模块时该标识符不存在,typeof 守卫兜底为空串。
1011
1025
  */
1012
- const PLUGIN_VERSION = "1.6.5";
1026
+ const PLUGIN_VERSION = "1.6.7";
1013
1027
  const CATEGORY_ORDER = [
1014
1028
  "interface",
1015
1029
  "session",
@@ -1643,9 +1657,9 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1643
1657
  * 另加 pnpm 供应链安全门槛:新版本发布还不满 24 小时(+30 分钟缓冲)时,pnpm 会静默
1644
1658
  * 回退到旧版本,此时若提示「可更新」用户点了也更新不到。publishedAt 由接口中心按 npm
1645
1659
  * registry 真实发布时间下发(同源),据此判断最准。门槛命中要单列成 `pending` 而不是
1646
- * 落回「无更新」——回落会让弹窗在本机版本落后时谎称「已是最新」(issue #145)。
1660
+ * 落回「无更新」——回落会让弹窗在本机版本落后时谎称「已是最新」。
1647
1661
  */
1648
- const hubCurrentVersion = "1.6.5";
1662
+ const hubCurrentVersion = "1.6.7";
1649
1663
  const hubUpdateState = (() => {
1650
1664
  if (!hubUpdateInfo) return "none";
1651
1665
  if (hubUpdateInfo.version === hubCurrentVersion) return "latest";
@@ -1856,7 +1870,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1856
1870
  */
1857
1871
  function pnpmPolicyHintOf(message) {
1858
1872
  if (missingTarballIntegrity(message)) return "failPnpmTarballIntegrityHint";
1859
- if (/ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION|Minimum release age/i.test(message) && releaseAgeRetryAfter(message) !== null) return "failPnpmReleaseAgeHint";
1873
+ if (/ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION|ERR_PNPM_NO_MATURE_MATCHING_VERSION|Minimum release age|minimumReleaseAge/i.test(message) && releaseAgeRetryAfter(message) !== null) return "failPnpmReleaseAgeHint";
1860
1874
  return "failPnpmPolicyHint";
1861
1875
  }
1862
1876
  /** 与 pnpmPolicyHintOf 配套的文案参数:release-age 场景给出可重试时刻({time})。 */
@@ -1864,73 +1878,9 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1864
1878
  return { time: releaseAgeRetryAfter(message) ?? "" };
1865
1879
  }
1866
1880
  /**
1867
- * 失败归类:把安装输出归到具体成因,供弹窗文案、是否引导提 Issue 与 issue 预填原因使用。
1868
- * 分界是「本机环境问题」(装任何插件都会同样失败 → 不引导提 Issue)与
1869
- * 「插件分发/依赖问题」(只影响这个插件 → 引导去仓库提 Issue);各分支的判定顺序有依赖,
1870
- * 原因见 classifyFailure 内注释。
1871
- *
1872
- * 本机环境问题:
1873
- * - npmTooOld:本机 npm 版本过低或自身缺陷 —— npm arborist 解 peer 依赖时抛 `edgesOut`
1874
- * (build-ideal-tree.js 内部报错),或服务端已核实版本低于阈值并打了 `[npm-too-low]` 标记
1875
- * → 引导升级 npm
1876
- * - dshMissing:安装器 spawn 的 `dsh` 命令找不到(Windows cmd「不是内部或外部命令」/ POSIX
1877
- * 「command not found」/ spawn ENOENT)→ 提示检查 PATH / 重装 DSH
1878
- * - gitMissing:安装器调用 `git` 时找不到可执行文件(Windows cmd「'git' is not recognized」/
1879
- * POSIX「git: command not found」/ spawn ENOENT)→ 提示安装 Git / 加入 PATH
1880
- * - pnpmMissing:dsh 存在但调用的 `pnpm` 找不到(dsh 报 `pnpm not found on PATH` / POSIX
1881
- * 「pnpm: command not found」/ spawn ENOENT)—— dsh 用 pnpm 管理 profile 插件
1882
- * → 提示安装 / 开启 pnpm
1883
- * - npmMissing:全局 npm 安装通道(`npm install -g …`)spawn 的 `npm` 命令找不到,形态同上
1884
- * → 提示安装 npm(Node.js 自带)/ 加入 PATH
1885
- * - pnpmStore:pnpm 报 store / virtual store 位置不匹配(`ERR_PNPM_UNEXPECTED_STORE` /
1886
- * `ERR_PNPM_UNEXPECTED_VIRTUAL_STORE` / `Unexpected store location`)—— profile 目录里的依赖
1887
- * 是另一个大版本的 pnpm 生成的(或 profile 目录被复制/移动、virtual-store-dir 配置变化),
1888
- * 当前 pnpm 出于安全不认 → 提示清理 profile 依赖目录后用当前 pnpm 重建
1889
- * - pnpmWorkspace:pnpm 拒绝在 workspace 根目录下安装(`ERR_PNPM_ADDING_TO_ROOT`)—— profile
1890
- * 目录含 pnpm-workspace.yaml 即被 pnpm 视为 workspace 根,宿主调 `pnpm add` 时未声明在根
1891
- * 操作(缺 `-w`/`--workspace-root`),整条命令被拒 → 提示在 profile 的 .npmrc 里加
1892
- * `ignore-workspace-root-check=true` 或升级宿主
1893
- * - originRejected:请求的来源没通过本地 hub 服务的校验(服务端 403,正文是裸的
1894
- * `untrusted origin`)—— 请求在进入安装流程前就被拒,与 pnpm 无关;常见于用非 localhost 的
1895
- * 地址(如局域网 IP)打开市场页面,或宿主页面的 origin 未被识别 → 提示从本机地址打开市场后重试
1896
- * - pnpmPolicy:pnpm 的供应链安全策略拒绝安装(缺少 tarball integrity、`ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION` /
1897
- * `Minimum release age` —— 锁文件里包的发布时间还不满 24 小时被拒;`untrusted origin` ——
1898
- * 依赖来源未被本机 pnpm 信任)→ 提示按子场景给解法(发布未满 24 小时 → `minimumReleaseAge: 0`
1899
- * 豁免或等满 24 小时;untrusted origin → 删除 profile 的 node_modules + pnpm-lock.yaml 清掉
1900
- * 不受信任来源后重装)
1901
- * - pnpmUnusedPatch:profile 里留着指向旧版本 dsh-plugin 的 patch 声明,本次安装解析到的版本
1902
- * 已经不是它(`ERR_PNPM_UNUSED_PATCH` / `The following patches were not used: dsh-plugin@1.4.2`)
1903
- * —— pnpm 发现补丁没被用上即中止整次安装 → 提示删掉该条目后重试
1904
- * - pnpmMissingDep:profile 里留着一条指向 registry 上不存在的包的依赖,pnpm 解析时收到 404
1905
- * (`ERR_PNPM_FETCH_404` / `Not Found - 404`)—— 该 profile 的任何安装都会先卡在这条依赖上
1906
- * → 提示按包名删掉该条目后重试(404 的包通常不是正在安装的插件,故不引导提 Issue)
1907
- * - fileLocked:pnpm 无法替换 profile 里被其他进程占用的文件(Windows `os error 32`
1908
- * 「另一个程序正在使用此文件」/ `EBUSY` / `resource busy or locked`)—— 通常是宿主进程或
1909
- * 杀毒软件实时扫描持有句柄 → 提示完全退出宿主后重试
1910
- * - accessDenied:pnpm 在 profile 里替换文件时被系统拒绝写入(Windows `os error 5`
1911
- * 「拒绝访问」= ERROR_ACCESS_DENIED / Node 的 `EPERM` `EACCES` / `Access is denied`)——
1912
- * 文件/目录被其他进程占用、只读属性、目录 ACL 受限,或杀毒软件实时防护拦截写入
1913
- * → 提示退出宿主 / 关杀软后重试,仍失败则检查只读属性并以管理员身份运行
1914
- * - fsUnavailable:本机文件系统层面根本写不进去 —— 磁盘/分区空间耗尽(`ENOSPC` /
1915
- * `no space left on device`,Windows 为 `os error 112`)、目标分卷或挂载点为只读
1916
- * (`EROFS` / `read-only file system`,Windows 写保护为 `os error 19`)、进程可用的文件句柄
1917
- * 被耗尽(`EMFILE` / `ENFILE` / `too many open files`),都发生在 pnpm 落盘阶段
1918
- * → 提示按报错代码对号入座(清空间 / 换可写目录 / 重启宿主释放句柄)
1919
- * - network:安装前连通性预检拦截(服务端 `[network]` 标记)、底层连接失败
1920
- * (ERR_PNPM_GIT_FETCH_FAILED / ETIMEDOUT / DNS 解析 / TLS 握手 / 代理拒绝),或
1921
- * registry tarball 拉取失败(`fetch failed` / `GET …/-/…tgz error (n)` —— 常见于本机
1922
- * npm/pnpm 的 registry 被指向内网/自定义源,该源取不到包),或界面请求压根没送达宿主服务
1923
- * (浏览器 fetch 的 `Failed to fetch` —— 宿主未就绪/正在重启,或本地代理拦了回环地址)
1924
- * → 提示检查网络,registry 指向自定义源时给出换源指引
1925
- *
1926
- * 插件分发/依赖问题(引导去仓库提 Issue):
1927
- * - pnpmIgnoredBuild:插件自身或依赖的构建脚本被 pnpm 安全白名单(allowBuilds)默认拦截
1928
- * (`ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED` / `ERR_PNPM_IGNORED_BUILDS`)—— 只影响带安装期
1929
- * 构建的插件 → 建议改用预编译版本或关闭安装期构建
1930
- * - pluginPrepare:插件的 prepare/构建脚本实际执行失败(git tarball 常因缺失子模块或构建产物
1931
- * 导致),或装后校验发现 package.json 声明的入口文件不在发布物里(服务端 `[packaging]` 标记)
1932
- * —— 属插件打包/分发问题
1933
- * - repo:其余失败,默认按插件仓库问题处理
1881
+ * 失败归类:把安装输出归到具体成因,供弹窗文案与是否引导提 Issue 使用。
1882
+ * 分界是「本机环境问题」(装任何插件都会同样失败 → 不引导提 Issue)与「插件分发问题」
1883
+ * (只影响这个插件 → 才引导提 Issue)。各分支判定顺序有依赖,见函数内注释。
1934
1884
  */
1935
1885
  function classifyFailure(message) {
1936
1886
  if (/\[npm-too-low\]|edgesOut/i.test(message)) return "npmTooOld";
@@ -1941,7 +1891,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1941
1891
  if (/ERR_PNPM_UNEXPECTED_(VIRTUAL_)?STORE|Unexpected (virtual )?store location/i.test(message)) return "pnpmStore";
1942
1892
  if (/ERR_PNPM_ADDING_TO_ROOT|add the dependency to the workspace root/i.test(message)) return "pnpmWorkspace";
1943
1893
  if (/(^|\n)untrusted origin\s*$/.test(message)) return "originRejected";
1944
- if (missingTarballIntegrity(message) || /ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION|Minimum release age|untrusted origin/i.test(message)) return "pnpmPolicy";
1894
+ if (missingTarballIntegrity(message) || /ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION|ERR_PNPM_NO_MATURE_MATCHING_VERSION|Minimum release age|minimumReleaseAge|untrusted origin/i.test(message)) return "pnpmPolicy";
1945
1895
  if (/ERR_PNPM_UNUSED_PATCH|patches were not used/i.test(message)) return "pnpmUnusedPatch";
1946
1896
  if (/os error 32|EBUSY|resource busy or locked|being used by another process/i.test(message)) return "fileLocked";
1947
1897
  if (/os error 5\b|ERROR_ACCESS_DENIED|\bEPERM\b|\bEACCES\b|access is denied/i.test(message)) return "accessDenied";
@@ -1950,8 +1900,10 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1950
1900
  if (/\[network\]|ERR_PNPM_GIT_FETCH_FAILED|ETIMEDOUT|ECONNREFUSED|ECONNRESET|ENOTFOUND|EAI_AGAIN|EPIPE|EHOSTUNREACH|ENETUNREACH|getaddrinfo|Could not connect|Could not resolve host|Network unreachable|Failed to connect|socket hang up|CERT_HAS_EXPIRED|SSL certificate problem|\bTLS\b|\bSSL\b|fetch failed|failed to fetch|\bGET https?:\/\/\S+\.tgz\s+error \(\d+\)/i.test(message)) return "network";
1951
1901
  if (/\[packaging\]|entry file missing/i.test(message)) return "pluginPrepare";
1952
1902
  if (/ERR_PNPM_FETCH_404|404 Not Found|Not Found - 404/i.test(message)) return "pnpmMissingDep";
1903
+ if (/\bERR_PNPM_NO_MATCHING_VERSION\b|\bETARGET\b|No matching version found/i.test(message)) return "registryVersionStale";
1904
+ if (/\bERR_PNPM_LINKED_PKG_DIR_NOT_FOUND\b|Could not install from .+ as it does not exist/i.test(message)) return "pnpmLinkedDirMissing";
1953
1905
  if (/ERR_PNPM_PREPARE_PACKAGE|ELIFECYCLE|prepare-guard/i.test(message) || /Command failed/.test(message)) return "pluginPrepare";
1954
- return "repo";
1906
+ return "hub";
1955
1907
  }
1956
1908
  /** 从服务端 `[npm-too-low]` 标记行提取本机 npm 版本(如 `[npm-too-low] npm@11.3.0` → "11.3.0");
1957
1909
  * 历史记录无标记时返回 null,前端据此决定提示文案是否带具体版本。 */
@@ -2093,12 +2045,15 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2093
2045
  case "pnpmPolicy": return "pnpm supply-chain policy blocked the install on the user machine";
2094
2046
  case "pnpmUnusedPatch": return "stale pnpm patch entry on the user machine";
2095
2047
  case "pnpmMissingDep": return "dependency not found on the npm registry on the user machine";
2048
+ case "registryVersionStale": return "requested version not available on the npm registry in use on the user machine";
2049
+ case "pnpmLinkedDirMissing": return "dangling local (link:) dependency in the user profile";
2096
2050
  case "fileLocked": return "file locked by another process on the user machine";
2097
2051
  case "accessDenied": return "file write access denied on the user machine";
2098
2052
  case "fsUnavailable": return "local file system unavailable on the user machine";
2099
2053
  case "pnpmIgnoredBuild": return "build scripts blocked by pnpm allowlist";
2100
2054
  case "pluginPrepare": return "plugin distribution incomplete";
2101
2055
  case "network": return "network failure on the user side";
2056
+ case "hub": return "install failed (cause unclassified)";
2102
2057
  default: return "plugin install failed";
2103
2058
  }
2104
2059
  }
@@ -2115,7 +2070,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2115
2070
  const kind = classifyFailure(message);
2116
2071
  const executed = executedCommandOf(command, attempts);
2117
2072
  const title = `[dsh-plugin.org | dsh-plugin-hub] ${reasonTitleOf(kind)}: ${repo}`;
2118
- const reason = /\[packaging\]/i.test(message) ? "plugin distribution is incomplete — the entry file declared in package.json is missing from the published package (github tarball or npm package); please commit build output or publish a complete package" : kind === "network" ? "network connectivity issue on the user side (DNS, proxy, firewall, or a blocked connection)" : kind === "pluginPrepare" ? "plugin prepare/build script failed during install (packaging/distribution issue)" : kind === "pnpmIgnoredBuild" ? "plugin depends on a native module whose build script pnpm blocks by default (use a prebuilt variant)" : kind === "originRejected" ? "the request never reached the install flow — the local service rejected its origin (local environment issue)" : kind === "pnpmPolicy" ? pnpmPolicyHintOf(message) === "failPnpmTarballIntegrityHint" ? "pnpm rejected a lockfile entry without tarball integrity; inspect and back up the profile lockfile before resolving it again, keeping integrity checks enabled" : "the pnpm supply-chain policy on the user machine blocked the install (minimum release age for freshly published packages / untrusted origin)" : kind === "pnpmUnusedPatch" ? "the profile keeps a pnpm patch entry for an older dsh-plugin version, so pnpm aborted the install (local config issue)" : kind === "fileLocked" ? "a file in the profile is locked by another process on the user machine (local environment issue)" : kind === "accessDenied" ? "the system denied write access to a file in the profile on the user machine (local environment issue)" : kind === "fsUnavailable" ? "the local file system could not accept the write — no space left, read-only volume, or too many open file handles on the user machine (local environment issue)" : "plugin-side install failure";
2073
+ const reason = /\[packaging\]/i.test(message) ? "plugin distribution is incomplete — a file the package needs (its entry from main / exports, an entry a bundled patch mounts, or the patch declared by dsh.bundle.patch) is missing from the published package (github tarball or npm package); please commit build output or publish a complete package" : kind === "network" ? "network connectivity issue on the user side (DNS, proxy, firewall, or a blocked connection)" : kind === "pluginPrepare" ? "plugin prepare/build script failed during install (packaging/distribution issue)" : kind === "pnpmIgnoredBuild" ? "plugin depends on a native module whose build script pnpm blocks by default (use a prebuilt variant)" : kind === "originRejected" ? "the request never reached the install flow — the local service rejected its origin (local environment issue)" : kind === "pnpmPolicy" ? pnpmPolicyHintOf(message) === "failPnpmTarballIntegrityHint" ? "pnpm rejected a lockfile entry without tarball integrity; inspect and back up the profile lockfile before resolving it again, keeping integrity checks enabled" : "the pnpm supply-chain policy on the user machine blocked the install (minimum release age for freshly published packages / untrusted origin)" : kind === "pnpmUnusedPatch" ? "the profile keeps a pnpm patch entry for an older dsh-plugin version, so pnpm aborted the install (local config issue)" : kind === "fileLocked" ? "a file in the profile is locked by another process on the user machine (local environment issue)" : kind === "accessDenied" ? "the system denied write access to a file in the profile on the user machine (local environment issue)" : kind === "fsUnavailable" ? "the local file system could not accept the write — no space left, read-only volume, or too many open file handles on the user machine (local environment issue)" : "plugin-side install failure";
2119
2074
  const code = coreErrorCode(message);
2120
2075
  const build = (coreChars) => {
2121
2076
  const body = [
@@ -2135,7 +2090,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2135
2090
  .../\[packaging\]/i.test(message) ? [
2136
2091
  "",
2137
2092
  "## 安装方式说明",
2138
- "DSH 插件支持三种官方安装通道:`dsh plugin add <npm-package>`(npm 分发,需发布完整构建产物)、`dsh plugin add git+https://github.com/owner/repo.git`(Git 直装,仓库需提交构建产物),以及预构建 release 包 `dsh plugin add https://github.com/owner/repo/releases/download/<tag>/<asset>.tgz`(仓库不便提交构建产物时的推荐方式)。注意:pnpm ≥10 默认拦截依赖构建脚本,Git 直装不会执行包内 `prepare`,请勿依赖它生成产物。当前插件的分发物缺少 package.json 声明的入口文件,请提交构建产物、改用 release `.tgz` 直链,或发布完整的 npm 包。"
2093
+ "DSH 插件支持三种官方安装通道:`dsh plugin add <npm-package>`(npm 分发,需发布完整构建产物)、`dsh plugin add git+https://github.com/owner/repo.git`(Git 直装,仓库需提交构建产物),以及预构建 release 包 `dsh plugin add https://github.com/owner/repo/releases/download/<tag>/<asset>.tgz`(仓库不便提交构建产物时的推荐方式)。注意:pnpm ≥10 默认拦截依赖构建脚本,Git 直装不会执行包内 `prepare`,请勿依赖它生成产物。当前插件的分发物缺少它需要的文件(`main` / `exports` 声明的入口、补丁按本包名 mount 的入口,或 `dsh.bundle.patch` 声明的补丁),请提交构建产物、改用 release `.tgz` 直链,或发布完整的 npm 包。"
2139
2094
  ] : [],
2140
2095
  "",
2141
2096
  "## Environment",
@@ -2179,6 +2134,76 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2179
2134
  }
2180
2135
  return url;
2181
2136
  }
2137
+ /**
2138
+ * 插件中心自身仓库的预填 Issue 链接:用于「非插件侧」失败(无法识别的未知原因、
2139
+ * 以及 pnpm allowBuilds 拦截这类不再归到插件作者的情形)。正文带上目标插件与完整
2140
+ * 错误摘要,供插件中心维护者分诊 —— 不再把环境问题/插件中心自身问题误投给插件作者。
2141
+ */
2142
+ function hubIssueUrl(pluginRepo, message, env, command, attempts) {
2143
+ const kind = classifyFailure(message);
2144
+ const executed = executedCommandOf(command, attempts);
2145
+ const repo = pluginRepo && pluginRepo.trim() !== "" ? pluginRepo.trim() : "unknown";
2146
+ const title = `[dsh-plugin-hub] ${reasonTitleOf(kind)}: ${repo}`;
2147
+ const code = coreErrorCode(message);
2148
+ const build = (coreChars) => {
2149
+ const body = [
2150
+ "## Summary",
2151
+ `- Auto-classified cause: ${reasonTitleOf(kind)}`,
2152
+ `- Target plugin: \`${repo}\``,
2153
+ ...code ? [`- Key error: \`${code}\``] : [],
2154
+ "- Why filed here: the installer only routes a failure to the plugin repo when there is positive evidence the plugin build itself failed (pluginPrepare). This failure does not match that, so it is routed here for triage.",
2155
+ "",
2156
+ `## [DSH Plugin 插件市场](${SITE_URL}) · 安装 Plugin 失败错误信息`,
2157
+ `本错误信息由 [dsh-plugin-hub](${GITHUB_URL}) 插件市场的安装程序自动生成,随本次安装失败一并提交。`,
2158
+ `- 实际执行的安装命令:${executed ? `\`${executed}\`` : "unknown (no executed command recorded)"}`,
2159
+ `- 执行结果:安装失败,未能安装该插件。`,
2160
+ ...attempts && attempts.length > 0 ? [
2161
+ "",
2162
+ "## Attempted install channels(已尝试的安装方式)",
2163
+ ...attempts.map((a) => `- ${a}`)
2164
+ ] : [],
2165
+ "",
2166
+ "## Environment",
2167
+ `- Plugin: \`${repo}\``,
2168
+ ...env ? [
2169
+ `- DSH: ${env.dshVersion ? `v${env.dshVersion}` : "unknown"}`,
2170
+ `- Plugin Hub: v${PLUGIN_VERSION}`,
2171
+ `- Node: ${env.nodeVersion}`,
2172
+ `- pnpm: ${env.pnpmVersion ? `v${env.pnpmVersion}` : "unknown"}`,
2173
+ `- npm: ${env.npmVersion ? `v${env.npmVersion}` : "unknown"}`,
2174
+ `- git: ${env.gitVersion ? `v${env.gitVersion}` : "unknown"}`,
2175
+ `- OS: ${env.platform} ${env.arch} (${env.release})`,
2176
+ `- Profile: \`${env.profile}\``,
2177
+ `- DSH Home: \`${env.dshHome}\``,
2178
+ `- Full log: \`~/.dsh/profiles/${env.profile}/hub.log\` (paste or attach for the full output)`
2179
+ ] : [],
2180
+ ...repo !== "unknown" ? [`- Catalog: [${pluginSiteUrl(repo)}](${pluginSiteUrl(repo)})`] : [],
2181
+ "",
2182
+ "## Error (core)",
2183
+ "",
2184
+ "```",
2185
+ summarizeError(message, coreChars),
2186
+ "```",
2187
+ "",
2188
+ "---",
2189
+ `This error was produced by the [dsh-plugin-hub](${GITHUB_URL}) installer bundled with DeepSeek Harness.`
2190
+ ].join("\n");
2191
+ return `https://github.com/${HUB_REPO}/issues/new?title=${encodeURIComponent(title)}&body=${encodeURIComponent(body)}`;
2192
+ };
2193
+ const MAX_URL_CHARS = 7600;
2194
+ let url = build(MAX_CORE_CHARS);
2195
+ if (url.length > MAX_URL_CHARS) for (const budget of [
2196
+ 4e3,
2197
+ 2500,
2198
+ 1400,
2199
+ 800,
2200
+ 400
2201
+ ]) {
2202
+ url = build(budget);
2203
+ if (url.length <= MAX_URL_CHARS) break;
2204
+ }
2205
+ return url;
2206
+ }
2182
2207
  //#endregion
2183
2208
  //#region src/client/hooks/useLanguage.ts
2184
2209
  /**
@@ -3412,7 +3437,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3412
3437
  className: Modal_module_css_default.modalCopy,
3413
3438
  disabled: busy,
3414
3439
  onClick: onCopy
3415
- }, t("copyInstallCommand")), (0, react.createElement)("button", {
3440
+ }, t("copyInstallCommand")), cliOnly ? null : (0, react.createElement)("button", {
3416
3441
  className: Modal_module_css_default.modalInstall,
3417
3442
  disabled: busy,
3418
3443
  onClick: onInstall
@@ -3504,7 +3529,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3504
3529
  }, t("errorCopy"))), (0, react.createElement)("pre", { className: Modal_module_css_default.errorBox }, message), failureKind === "npmTooOld" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t(npmVersion ? "failNpmTooLowV" : "failNpmTooLow", npmVersion ? { v: npmVersion } : void 0)) : failureKind === "dshMissing" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failDshMissingHint")) : failureKind === "gitMissing" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failGitMissingHint")) : failureKind === "pnpmMissing" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmMissingHint")) : failureKind === "npmMissing" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failNpmMissingHint")) : failureKind === "pnpmWorkspace" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmWorkspaceHint")) : failureKind === "pnpmStore" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmStoreHint")) : failureKind === "pnpmPolicy" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t(pnpmPolicyHintOf(message), pnpmPolicyHintParams(message))) : failureKind === "pnpmUnusedPatch" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmUnusedPatchHint")) : failureKind === "pnpmMissingDep" ? (0, react.createElement)("div", null, [(() => {
3505
3530
  const pkg = missingRegistryPackageOf(message);
3506
3531
  return pkg ? (0, react.createElement)("div", { className: Modal_module_css_default.failNetworkTarget }, t("failPnpmMissingDepTarget", { pkg })) : null;
3507
- })(), (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmMissingDepHint"))]) : failureKind === "fileLocked" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failFileLockedHint")) : failureKind === "accessDenied" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failAccessDeniedHint")) : failureKind === "fsUnavailable" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failFsUnavailableHint")) : failureKind === "originRejected" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failOriginRejectedHint", { profile: env?.profile ?? "<profile>" })) : failureKind === "network" ? (0, react.createElement)("div", null, [
3532
+ })(), (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmMissingDepHint"))]) : failureKind === "registryVersionStale" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failRegistryVersionStaleHint")) : failureKind === "pnpmLinkedDirMissing" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmLinkedDirMissingHint")) : failureKind === "fileLocked" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failFileLockedHint")) : failureKind === "accessDenied" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failAccessDeniedHint")) : failureKind === "fsUnavailable" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failFsUnavailableHint")) : failureKind === "originRejected" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failOriginRejectedHint", { profile: env?.profile ?? "<profile>" })) : failureKind === "network" ? (0, react.createElement)("div", null, [
3508
3533
  (() => {
3509
3534
  const target = unreachableTargetOf(message);
3510
3535
  return target ? (0, react.createElement)("div", { className: Modal_module_css_default.failNetworkTarget }, t("failNetworkTarget", { url: target })) : null;
@@ -3518,19 +3543,19 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3518
3543
  className: Modal_module_css_default.failDiagBtn,
3519
3544
  onClick: onRunDiagnostics
3520
3545
  }, t("failNetworkRunDiag")) : null
3521
- ]) : failureKind === "pluginPrepare" || failureKind === "pnpmIgnoredBuild" ? (0, react.createElement)("div", null, [(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, failureKind === "pnpmIgnoredBuild" ? t("failIgnoredBuild") : /\[packaging\]/i.test(message) ? t("failPackagingHint") : t("failPrepareHint")), repo ? (0, react.createElement)("a", {
3546
+ ]) : failureKind === "pluginPrepare" ? (0, react.createElement)("div", null, [(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, /\[packaging\]/i.test(message) ? t("failPackagingHint") : t("failPrepareHint")), repo ? (0, react.createElement)("a", {
3522
3547
  className: Modal_module_css_default.failBigIssue,
3523
3548
  href: pluginIssueUrl(repo, message, env, command, attempts),
3524
3549
  target: "_blank",
3525
3550
  rel: "noopener noreferrer",
3526
3551
  title: t("failIssueHint")
3527
- }, t("failIssueBig")) : null]) : repo ? (0, react.createElement)("a", {
3552
+ }, t("failIssueBig")) : null]) : (0, react.createElement)("div", null, [failureKind === "pnpmIgnoredBuild" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failIgnoredBuild")) : (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failUnclassifiedHint")), (0, react.createElement)("a", {
3528
3553
  className: Modal_module_css_default.failBigIssue,
3529
- href: pluginIssueUrl(repo, message, env, command, attempts),
3554
+ href: hubIssueUrl(repo, message, env, command, attempts),
3530
3555
  target: "_blank",
3531
3556
  rel: "noopener noreferrer",
3532
- title: t("failIssueHint")
3533
- }, t("failIssueBig")) : null), (0, react.createElement)("div", { className: Modal_module_css_default.modalActions }, (0, react.createElement)("button", {
3557
+ title: t("failHubIssueHint")
3558
+ }, t("failHubIssueBig"))])), (0, react.createElement)("div", { className: Modal_module_css_default.modalActions }, (0, react.createElement)("button", {
3534
3559
  className: Modal_module_css_default.restartLater,
3535
3560
  onClick: onClose
3536
3561
  }, t("errorClose"))))));
@@ -4078,6 +4103,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4078
4103
  const pkg = missingRegistryPackageOf(r.message);
4079
4104
  return (0, react.createElement)("div", null, [pkg ? (0, react.createElement)("div", { className: Modal_module_css_default.failNetworkTarget }, t("failPnpmMissingDepTarget", { pkg })) : null, (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmMissingDepHint"))]);
4080
4105
  }
4106
+ if (kind === "registryVersionStale") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failRegistryVersionStaleHint"));
4107
+ if (kind === "pnpmLinkedDirMissing") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failPnpmLinkedDirMissingHint"));
4081
4108
  if (kind === "fileLocked") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failFileLockedHint"));
4082
4109
  if (kind === "accessDenied") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failAccessDeniedHint"));
4083
4110
  if (kind === "fsUnavailable") return (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failFsUnavailableHint"));
@@ -4097,20 +4124,20 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4097
4124
  onClick: onRunDiagnostics
4098
4125
  }, t("failNetworkRunDiag")) : null
4099
4126
  ]);
4100
- if (kind === "pluginPrepare" || kind === "pnpmIgnoredBuild") return (0, react.createElement)("div", null, [(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, kind === "pnpmIgnoredBuild" ? t("failIgnoredBuild") : /\[packaging\]/i.test(r.message) ? t("failPackagingHint") : t("failPrepareHint")), r.repo && shownRepo ? (0, react.createElement)("a", {
4127
+ if (kind === "pluginPrepare") return (0, react.createElement)("div", null, [(0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, /\[packaging\]/i.test(r.message) ? t("failPackagingHint") : t("failPrepareHint")), r.repo && shownRepo ? (0, react.createElement)("a", {
4101
4128
  className: Modal_module_css_default.failBigIssue,
4102
4129
  href: pluginIssueUrl(shownRepo, r.message, env, r.command, r.attempts),
4103
4130
  target: "_blank",
4104
4131
  rel: "noopener noreferrer",
4105
4132
  title: t("failIssueHint")
4106
4133
  }, t("failIssueBig")) : null]);
4107
- return r.repo && shownRepo ? (0, react.createElement)("a", {
4134
+ return (0, react.createElement)("div", null, [kind === "pnpmIgnoredBuild" ? (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failIgnoredBuild")) : (0, react.createElement)("div", { className: Modal_module_css_default.failPrepareHint }, t("failUnclassifiedHint")), (0, react.createElement)("a", {
4108
4135
  className: Modal_module_css_default.failBigIssue,
4109
- href: pluginIssueUrl(shownRepo, r.message, env, r.command, r.attempts),
4136
+ href: hubIssueUrl(shownRepo || r.repo, r.message, env, r.command, r.attempts),
4110
4137
  target: "_blank",
4111
4138
  rel: "noopener noreferrer",
4112
- title: t("failIssueHint")
4113
- }, t("failIssueBig")) : null;
4139
+ title: t("failHubIssueHint")
4140
+ }, t("failHubIssueBig"))]);
4114
4141
  })())), !r.ok ? (0, react.createElement)("div", { className: Modal_module_css_default.noticeFoot }, (0, react.createElement)("span", {
4115
4142
  className: Modal_module_css_default.noticeTime,
4116
4143
  title: new Date(r.at).toLocaleString()
@@ -4291,40 +4318,40 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4291
4318
  css: css$9
4292
4319
  });
4293
4320
  var List_module_css_default = {
4294
- "cardMain": "_3XaZHa_cardMain",
4295
- "topic": "_3XaZHa_topic",
4296
- "star": "_3XaZHa_star",
4297
4321
  "cardTitle": "_3XaZHa_cardTitle",
4322
+ "footer": "_3XaZHa_footer",
4323
+ "versionBadge": "_3XaZHa_versionBadge",
4324
+ "stateTitle": "_3XaZHa_stateTitle",
4325
+ "state": "_3XaZHa_state",
4326
+ "body": "_3XaZHa_body",
4327
+ "list": "_3XaZHa_list",
4328
+ "categoryBadge": "_3XaZHa_categoryBadge",
4329
+ "installBtnUpdate": "_3XaZHa_installBtnUpdate",
4330
+ "detailBtn": "_3XaZHa_detailBtn",
4331
+ "stats": "_3XaZHa_stats",
4332
+ "cardMain": "_3XaZHa_cardMain",
4333
+ "cardSide": "_3XaZHa_cardSide",
4334
+ "stateActions": "_3XaZHa_stateActions",
4335
+ "footLink": "_3XaZHa_footLink",
4336
+ "uninstallBtn": "_3XaZHa_uninstallBtn",
4337
+ "installBtnInstalled": "_3XaZHa_installBtnInstalled",
4298
4338
  "verified": "_3XaZHa_verified",
4299
- "installBtnUpdate": "_3XaZHa_installBtnUpdate",
4339
+ "installBtn": "_3XaZHa_installBtn",
4340
+ "card": "_3XaZHa_card",
4300
4341
  "diagBtn": "_3XaZHa_diagBtn",
4301
- "installBtnInstalled": "_3XaZHa_installBtnInstalled",
4302
- "uninstallBtn": "_3XaZHa_uninstallBtn",
4303
- "stats": "_3XaZHa_stats",
4304
- "list": "_3XaZHa_list",
4305
- "detailBtn": "_3XaZHa_detailBtn",
4306
- "actions": "_3XaZHa_actions",
4307
- "state": "_3XaZHa_state",
4308
4342
  "stateDesc": "_3XaZHa_stateDesc",
4309
- "stateActions": "_3XaZHa_stateActions",
4343
+ "star": "_3XaZHa_star",
4344
+ "actions": "_3XaZHa_actions",
4310
4345
  "topics": "_3XaZHa_topics",
4311
- "retryBtn": "_3XaZHa_retryBtn",
4312
- "stateTitle": "_3XaZHa_stateTitle",
4313
- "footer": "_3XaZHa_footer",
4314
- "cardSide": "_3XaZHa_cardSide",
4315
- "versionBadge": "_3XaZHa_versionBadge",
4316
- "installBtn": "_3XaZHa_installBtn",
4317
- "updateBadge": "_3XaZHa_updateBadge",
4318
4346
  "cardHead": "_3XaZHa_cardHead",
4319
- "body": "_3XaZHa_body",
4320
- "footLink": "_3XaZHa_footLink",
4321
- "categoryBadge": "_3XaZHa_categoryBadge",
4347
+ "fork": "_3XaZHa_fork",
4348
+ "retryBtn": "_3XaZHa_retryBtn",
4349
+ "topic": "_3XaZHa_topic",
4350
+ "installBtnCopied": "_3XaZHa_installBtnCopied",
4322
4351
  "desc": "_3XaZHa_desc",
4352
+ "updateBadge": "_3XaZHa_updateBadge",
4323
4353
  "moreSentinel": "_3XaZHa_moreSentinel",
4324
- "card": "_3XaZHa_card",
4325
- "fork": "_3XaZHa_fork",
4326
- "date": "_3XaZHa_date",
4327
- "installBtnCopied": "_3XaZHa_installBtnCopied"
4354
+ "date": "_3XaZHa_date"
4328
4355
  };
4329
4356
  //#endregion
4330
4357
  //#region src/client/hooks/useIncrementalList.ts
@@ -4531,15 +4558,15 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4531
4558
  css: css$8
4532
4559
  });
4533
4560
  var SectionTabs_module_css_default = {
4534
- "noticeIcon": "_7tvizq_noticeIcon",
4535
4561
  "noticeCount": "_7tvizq_noticeCount",
4536
- "tab": "_7tvizq_tab",
4562
+ "tabIcon": "_7tvizq_tabIcon",
4563
+ "root": "_7tvizq_root",
4564
+ "tabCountActive": "_7tvizq_tabCountActive",
4537
4565
  "tabCount": "_7tvizq_tabCount",
4538
4566
  "noticeBtn": "_7tvizq_noticeBtn",
4539
- "root": "_7tvizq_root",
4540
- "tabActive": "_7tvizq_tabActive",
4541
- "tabIcon": "_7tvizq_tabIcon",
4542
- "tabCountActive": "_7tvizq_tabCountActive"
4567
+ "noticeIcon": "_7tvizq_noticeIcon",
4568
+ "tab": "_7tvizq_tab",
4569
+ "tabActive": "_7tvizq_tabActive"
4543
4570
  };
4544
4571
  //#endregion
4545
4572
  //#region src/client/components/layout/SectionTabs.tsx
@@ -4616,42 +4643,42 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4616
4643
  css: css$7
4617
4644
  });
4618
4645
  var InstalledView_module_css_default = {
4619
- "segBtnActive": "_1nXeGW_segBtnActive",
4620
- "rowDesc": "_1nXeGW_rowDesc",
4621
- "rowMeta": "_1nXeGW_rowMeta",
4622
- "emptyTitle": "_1nXeGW_emptyTitle",
4623
- "root": "_1nXeGW_root",
4624
- "empty": "_1nXeGW_empty",
4625
- "statusPending": "_1nXeGW_statusPending",
4626
- "rowMain": "_1nXeGW_rowMain",
4627
4646
  "rowRestart": "_1nXeGW_rowRestart",
4628
- "rowSourceTag": "_1nXeGW_rowSourceTag",
4629
- "emptyDesc": "_1nXeGW_emptyDesc",
4647
+ "rowUpdate": "_1nXeGW_rowUpdate",
4648
+ "exampleRow": "_1nXeGW_exampleRow",
4649
+ "exampleBadge": "_1nXeGW_exampleBadge",
4650
+ "list": "_1nXeGW_list",
4630
4651
  "rowTitle": "_1nXeGW_rowTitle",
4631
- "toolbar": "_1nXeGW_toolbar",
4632
- "rowActions": "_1nXeGW_rowActions",
4652
+ "segRow": "_1nXeGW_segRow",
4653
+ "rowRepo": "_1nXeGW_rowRepo",
4654
+ "rowSourceTagManual": "_1nXeGW_rowSourceTagManual",
4655
+ "statusPending": "_1nXeGW_statusPending",
4656
+ "rowSourceTagHub": "_1nXeGW_rowSourceTagHub",
4633
4657
  "rowUninstall": "_1nXeGW_rowUninstall",
4634
- "searchInput": "_1nXeGW_searchInput",
4635
- "list": "_1nXeGW_list",
4636
4658
  "segLabel": "_1nXeGW_segLabel",
4637
- "statusInactive": "_1nXeGW_statusInactive",
4659
+ "segBtnActive": "_1nXeGW_segBtnActive",
4660
+ "versionBadge": "_1nXeGW_versionBadge",
4661
+ "toolbar": "_1nXeGW_toolbar",
4662
+ "emptyTitle": "_1nXeGW_emptyTitle",
4663
+ "rowDesc": "_1nXeGW_rowDesc",
4664
+ "emptyDesc": "_1nXeGW_emptyDesc",
4665
+ "empty": "_1nXeGW_empty",
4666
+ "statusDot": "_1nXeGW_statusDot",
4638
4667
  "rowTitleLine": "_1nXeGW_rowTitleLine",
4639
- "segRow": "_1nXeGW_segRow",
4640
- "rowSourceTagHub": "_1nXeGW_rowSourceTagHub",
4641
- "segGroup": "_1nXeGW_segGroup",
4642
- "rowSourceTagManual": "_1nXeGW_rowSourceTagManual",
4643
- "exampleBadge": "_1nXeGW_exampleBadge",
4644
4668
  "rowCategory": "_1nXeGW_rowCategory",
4645
- "rowUpdate": "_1nXeGW_rowUpdate",
4646
- "updateBadge": "_1nXeGW_updateBadge",
4647
- "versionBadge": "_1nXeGW_versionBadge",
4648
- "exampleRow": "_1nXeGW_exampleRow",
4669
+ "searchInput": "_1nXeGW_searchInput",
4670
+ "segGroup": "_1nXeGW_segGroup",
4649
4671
  "segBtn": "_1nXeGW_segBtn",
4650
- "rowRepo": "_1nXeGW_rowRepo",
4672
+ "rowActions": "_1nXeGW_rowActions",
4651
4673
  "rowDetail": "_1nXeGW_rowDetail",
4674
+ "rowMain": "_1nXeGW_rowMain",
4675
+ "updateBadge": "_1nXeGW_updateBadge",
4676
+ "root": "_1nXeGW_root",
4677
+ "rowSourceTag": "_1nXeGW_rowSourceTag",
4678
+ "rowMeta": "_1nXeGW_rowMeta",
4652
4679
  "row": "_1nXeGW_row",
4653
- "searchWrap": "_1nXeGW_searchWrap",
4654
- "statusDot": "_1nXeGW_statusDot"
4680
+ "statusInactive": "_1nXeGW_statusInactive",
4681
+ "searchWrap": "_1nXeGW_searchWrap"
4655
4682
  };
4656
4683
  //#endregion
4657
4684
  //#region src/client/components/views/InstalledView.tsx
@@ -4696,7 +4723,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4696
4723
  onClick
4697
4724
  }, label, icon);
4698
4725
  }
4699
- function InstalledRow({ item, t, langKey, canReveal, revealLabel, onOpenDetail, onReveal, onUpdate, onUninstall, onRestart }) {
4726
+ function InstalledRow({ item, t, langKey, canReveal, revealLabel, pendingRestart, onOpenDetail, onReveal, onUpdate, onUninstall, onRestart }) {
4700
4727
  const name = item.plugin?.displayName ?? item.name;
4701
4728
  const repo = item.repo;
4702
4729
  const category = item.plugin?.category;
@@ -4715,9 +4742,9 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4715
4742
  }
4716
4743
  }
4717
4744
  }, (0, react.createElement)("div", { className: InstalledView_module_css_default.rowTitleLine }, (0, react.createElement)("span", {
4718
- className: item.loaded ? InstalledView_module_css_default.statusDot : item.dshCapable ? `${InstalledView_module_css_default.statusDot} ${InstalledView_module_css_default.statusPending}` : `${InstalledView_module_css_default.statusDot} ${InstalledView_module_css_default.statusInactive}`,
4719
- title: item.loaded ? t("statusRunning") : item.dshCapable ? t("statusPending") : t("exampleHint"),
4720
- "aria-label": item.loaded ? t("statusRunning") : item.dshCapable ? t("statusPending") : t("exampleHint")
4745
+ className: item.loaded ? InstalledView_module_css_default.statusDot : item.dshCapable && pendingRestart ? `${InstalledView_module_css_default.statusDot} ${InstalledView_module_css_default.statusPending}` : `${InstalledView_module_css_default.statusDot} ${InstalledView_module_css_default.statusInactive}`,
4746
+ title: item.loaded ? t("statusRunning") : item.dshCapable && pendingRestart ? t("statusPending") : item.dshCapable ? t("statusInactive") : t("exampleHint"),
4747
+ "aria-label": item.loaded ? t("statusRunning") : item.dshCapable && pendingRestart ? t("statusPending") : item.dshCapable ? t("statusInactive") : t("exampleHint")
4721
4748
  }), (0, react.createElement)("div", { className: InstalledView_module_css_default.rowMain }, (0, react.createElement)("span", { className: InstalledView_module_css_default.rowTitle }, name), item.installedVersion ? (0, react.createElement)("span", {
4722
4749
  className: InstalledView_module_css_default.versionBadge,
4723
4750
  title: t("installedVersionLabel")
@@ -4727,7 +4754,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4727
4754
  }, t("updateAvailable")) : null), (0, react.createElement)("span", {
4728
4755
  className: isCustom ? `${InstalledView_module_css_default.rowSourceTag} ${InstalledView_module_css_default.rowSourceTagManual}` : `${InstalledView_module_css_default.rowSourceTag} ${InstalledView_module_css_default.rowSourceTagHub}`,
4729
4756
  title: isCustom ? t("manualInstallHint") : t("hubInstallHint")
4730
- }, isCustom ? t("manualInstall") : t("hubInstall")), (0, react.createElement)("div", { className: InstalledView_module_css_default.rowActions }, !item.loaded && item.dshCapable ? (0, react.createElement)("button", {
4757
+ }, isCustom ? t("manualInstall") : t("hubInstall")), (0, react.createElement)("div", { className: InstalledView_module_css_default.rowActions }, !item.loaded && item.dshCapable && pendingRestart ? (0, react.createElement)("button", {
4731
4758
  className: InstalledView_module_css_default.rowRestart,
4732
4759
  type: "button",
4733
4760
  title: t("restartPendingHint"),
@@ -4766,7 +4793,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4766
4793
  }, desc) : null);
4767
4794
  }
4768
4795
  /** 行列表:单个已安装列表(自定义安装与目录插件混排,靠徽标区分)。 */
4769
- function RowList({ items, t, langKey, canReveal, revealLabel, onOpenDetail, onReveal, onUpdate, onUninstall, onRestart }) {
4796
+ function RowList({ items, t, langKey, canReveal, revealLabel, pendingRestarts, onOpenDetail, onReveal, onUpdate, onUninstall, onRestart }) {
4797
+ const pendingSet = new Set(pendingRestarts.map((r) => r.toLowerCase()));
4770
4798
  return (0, react.createElement)("ul", { className: InstalledView_module_css_default.list }, items.map((item) => (0, react.createElement)(InstalledRow, {
4771
4799
  key: item.name,
4772
4800
  item,
@@ -4774,6 +4802,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4774
4802
  langKey,
4775
4803
  canReveal,
4776
4804
  revealLabel,
4805
+ pendingRestart: item.repo !== null && pendingSet.has(item.repo.toLowerCase()),
4777
4806
  onOpenDetail,
4778
4807
  onReveal,
4779
4808
  onUpdate,
@@ -4781,7 +4810,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4781
4810
  onRestart
4782
4811
  })));
4783
4812
  }
4784
- function InstalledView({ items, t, langKey, platform, onOpenDetail, onReveal, onUpdate, onUninstall, onRestart }) {
4813
+ function InstalledView({ items, t, langKey, platform, pendingRestarts, onOpenDetail, onReveal, onUpdate, onUninstall, onRestart }) {
4785
4814
  const [query, setQuery] = (0, react.useState)("");
4786
4815
  /** 默认按「最近安装」排序(最新在前);点其他排序按钮用该排序的默认方向(Star/Fork 最多在前、名称正序) */
4787
4816
  const [sort, setSort] = (0, react.useState)("sortInstalledAt");
@@ -4836,6 +4865,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4836
4865
  langKey,
4837
4866
  canReveal: platform === "darwin" || platform === "win32" || platform === "linux",
4838
4867
  revealLabel: platform === "darwin" ? t("revealFolder") : t("openFolder"),
4868
+ pendingRestarts,
4839
4869
  onOpenDetail,
4840
4870
  onReveal,
4841
4871
  onUpdate,
@@ -4897,28 +4927,28 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4897
4927
  css: css$6
4898
4928
  });
4899
4929
  var CustomInstallView_module_css_default = {
4900
- "channelOffBtn": "zISxCG_channelOffBtn",
4901
- "helpCmd": "zISxCG_helpCmd",
4902
- "installCardDisabled": "zISxCG_installCardDisabled",
4903
- "installCardHead": "zISxCG_installCardHead",
4904
4930
  "installLabel": "zISxCG_installLabel",
4905
- "installBtn": "zISxCG_installBtn",
4906
- "installExample": "zISxCG_installExample",
4907
- "helpNote": "zISxCG_helpNote",
4931
+ "desc": "zISxCG_desc",
4932
+ "installCardHead": "zISxCG_installCardHead",
4908
4933
  "installHelpBtn": "zISxCG_installHelpBtn",
4909
- "installInputError": "zISxCG_installInputError",
4910
4934
  "helpBody": "zISxCG_helpBody",
4911
- "installInsertBtn": "zISxCG_installInsertBtn",
4912
4935
  "installCards": "zISxCG_installCards",
4913
- "channelOff": "zISxCG_channelOff",
4914
- "installRow": "zISxCG_installRow",
4915
- "channelOffText": "zISxCG_channelOffText",
4916
4936
  "helpLine": "zISxCG_helpLine",
4937
+ "helpNote": "zISxCG_helpNote",
4938
+ "installBtn": "zISxCG_installBtn",
4939
+ "installInsertBtn": "zISxCG_installInsertBtn",
4917
4940
  "root": "zISxCG_root",
4941
+ "channelOffText": "zISxCG_channelOffText",
4942
+ "channelOffBtn": "zISxCG_channelOffBtn",
4943
+ "helpCmd": "zISxCG_helpCmd",
4944
+ "installExample": "zISxCG_installExample",
4945
+ "channelOff": "zISxCG_channelOff",
4946
+ "installCardDisabled": "zISxCG_installCardDisabled",
4947
+ "installRow": "zISxCG_installRow",
4948
+ "installInputError": "zISxCG_installInputError",
4949
+ "installCard": "zISxCG_installCard",
4918
4950
  "installError": "zISxCG_installError",
4919
- "desc": "zISxCG_desc",
4920
- "installInput": "zISxCG_installInput",
4921
- "installCard": "zISxCG_installCard"
4951
+ "installInput": "zISxCG_installInput"
4922
4952
  };
4923
4953
  //#endregion
4924
4954
  //#region src/client/components/views/CustomInstallView.tsx
@@ -5209,29 +5239,29 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5209
5239
  });
5210
5240
  var SettingsView_module_css_default = {
5211
5241
  "settingLabel": "_506LLG_settingLabel",
5212
- "sidebar": "_506LLG_sidebar",
5213
- "settingRowStack": "_506LLG_settingRowStack",
5242
+ "textInput": "_506LLG_textInput",
5243
+ "navItem": "_506LLG_navItem",
5244
+ "pageDesc": "_506LLG_pageDesc",
5245
+ "proxyHintOk": "_506LLG_proxyHintOk",
5214
5246
  "pageHeader": "_506LLG_pageHeader",
5215
5247
  "content": "_506LLG_content",
5216
- "pageDesc": "_506LLG_pageDesc",
5217
- "card": "_506LLG_card",
5218
- "settingControlStack": "_506LLG_settingControlStack",
5219
- "textInput": "_506LLG_textInput",
5220
- "proxyHintFail": "_506LLG_proxyHintFail",
5221
- "resetBtn": "_506LLG_resetBtn",
5222
- "settingControl": "_506LLG_settingControl",
5223
5248
  "proxyHint": "_506LLG_proxyHint",
5224
- "proxyHintOk": "_506LLG_proxyHintOk",
5225
- "pageTitle": "_506LLG_pageTitle",
5226
- "settingDesc": "_506LLG_settingDesc",
5227
- "navItemActive": "_506LLG_navItemActive",
5228
- "settingRow": "_506LLG_settingRow",
5229
5249
  "proxyControl": "_506LLG_proxyControl",
5250
+ "settingRowStack": "_506LLG_settingRowStack",
5251
+ "sidebar": "_506LLG_sidebar",
5252
+ "settingTitle": "_506LLG_settingTitle",
5253
+ "settingRow": "_506LLG_settingRow",
5230
5254
  "controlDropdown": "_506LLG_controlDropdown",
5231
- "navItem": "_506LLG_navItem",
5255
+ "settingControlStack": "_506LLG_settingControlStack",
5232
5256
  "root": "_506LLG_root",
5233
- "settingTitle": "_506LLG_settingTitle",
5234
- "navIcon": "_506LLG_navIcon"
5257
+ "settingDesc": "_506LLG_settingDesc",
5258
+ "navItemActive": "_506LLG_navItemActive",
5259
+ "card": "_506LLG_card",
5260
+ "proxyHintFail": "_506LLG_proxyHintFail",
5261
+ "pageTitle": "_506LLG_pageTitle",
5262
+ "navIcon": "_506LLG_navIcon",
5263
+ "settingControl": "_506LLG_settingControl",
5264
+ "resetBtn": "_506LLG_resetBtn"
5235
5265
  };
5236
5266
  //#endregion
5237
5267
  //#region \0dsh-css:src/client/styles/Dropdown.module.css.mjs
@@ -5250,18 +5280,18 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5250
5280
  css: css$4
5251
5281
  });
5252
5282
  var Dropdown_module_css_default = {
5253
- "dropdownBtn": "B_Gxsq_dropdownBtn",
5254
- "dropdownLabel": "B_Gxsq_dropdownLabel",
5255
- "dropdownItemLabel": "B_Gxsq_dropdownItemLabel",
5256
5283
  "dropdownArrow": "B_Gxsq_dropdownArrow",
5257
- "dropdownFill": "B_Gxsq_dropdownFill",
5258
5284
  "dropdownItem": "B_Gxsq_dropdownItem",
5259
- "dropdownItemActive": "B_Gxsq_dropdownItemActive",
5260
- "dropdown": "B_Gxsq_dropdown",
5261
5285
  "dropdownCount": "B_Gxsq_dropdownCount",
5262
- "dropdownArrowOpen": "B_Gxsq_dropdownArrowOpen",
5263
5286
  "dropdownCountActive": "B_Gxsq_dropdownCountActive",
5264
- "dropdownPanel": "B_Gxsq_dropdownPanel"
5287
+ "dropdownArrowOpen": "B_Gxsq_dropdownArrowOpen",
5288
+ "dropdownItemActive": "B_Gxsq_dropdownItemActive",
5289
+ "dropdown": "B_Gxsq_dropdown",
5290
+ "dropdownFill": "B_Gxsq_dropdownFill",
5291
+ "dropdownItemLabel": "B_Gxsq_dropdownItemLabel",
5292
+ "dropdownPanel": "B_Gxsq_dropdownPanel",
5293
+ "dropdownBtn": "B_Gxsq_dropdownBtn",
5294
+ "dropdownLabel": "B_Gxsq_dropdownLabel"
5265
5295
  };
5266
5296
  //#endregion
5267
5297
  //#region \0dsh-css:src/client/styles/Toggle.module.css.mjs
@@ -5280,9 +5310,9 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5280
5310
  css: css$3
5281
5311
  });
5282
5312
  var Toggle_module_css_default = {
5283
- "toggle": "k-cD4G_toggle",
5284
5313
  "toggleOn": "k-cD4G_toggleOn",
5285
- "knob": "k-cD4G_knob"
5314
+ "knob": "k-cD4G_knob",
5315
+ "toggle": "k-cD4G_toggle"
5286
5316
  };
5287
5317
  //#endregion
5288
5318
  //#region src/client/components/ui/Toggle.tsx
@@ -5382,29 +5412,29 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5382
5412
  css: css$2
5383
5413
  });
5384
5414
  var DiagnosticsView_module_css_default = {
5385
- "meta": "k9eRya_meta",
5415
+ "summaryFail": "k9eRya_summaryFail",
5386
5416
  "envLabel": "k9eRya_envLabel",
5417
+ "badgeOk": "k9eRya_badgeOk",
5387
5418
  "panel": "k9eRya_panel",
5388
- "envDesc": "k9eRya_envDesc",
5389
- "badgeIdle": "k9eRya_badgeIdle",
5390
- "envRow": "k9eRya_envRow",
5391
5419
  "runBtn": "k9eRya_runBtn",
5392
- "summaryOk": "k9eRya_summaryOk",
5393
- "summaryFail": "k9eRya_summaryFail",
5420
+ "diagPulse": "k9eRya_diagPulse",
5421
+ "envRow": "k9eRya_envRow",
5422
+ "display": "k9eRya_display",
5394
5423
  "summaryRunning": "k9eRya_summaryRunning",
5424
+ "badgeFail": "k9eRya_badgeFail",
5425
+ "head": "k9eRya_head",
5395
5426
  "badge": "k9eRya_badge",
5396
- "envTitle": "k9eRya_envTitle",
5397
- "display": "k9eRya_display",
5427
+ "badgeIdle": "k9eRya_badgeIdle",
5398
5428
  "headHint": "k9eRya_headHint",
5399
- "badgeRunning": "k9eRya_badgeRunning",
5429
+ "envDesc": "k9eRya_envDesc",
5430
+ "envTitle": "k9eRya_envTitle",
5431
+ "row": "k9eRya_row",
5432
+ "summaryOk": "k9eRya_summaryOk",
5433
+ "name": "k9eRya_name",
5400
5434
  "summary": "k9eRya_summary",
5435
+ "meta": "k9eRya_meta",
5401
5436
  "envCopyBtn": "k9eRya_envCopyBtn",
5402
- "diagPulse": "k9eRya_diagPulse",
5403
- "name": "k9eRya_name",
5404
- "row": "k9eRya_row",
5405
- "head": "k9eRya_head",
5406
- "badgeOk": "k9eRya_badgeOk",
5407
- "badgeFail": "k9eRya_badgeFail"
5437
+ "badgeRunning": "k9eRya_badgeRunning"
5408
5438
  };
5409
5439
  //#endregion
5410
5440
  //#region src/client/components/views/DiagnosticsView.tsx
@@ -5582,57 +5612,57 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5582
5612
  css: css$1
5583
5613
  });
5584
5614
  var LogsView_module_css_default = {
5585
- "btn": "_3j77BW_btn",
5586
- "pathLabel": "_3j77BW_pathLabel",
5587
- "foot": "_3j77BW_foot",
5588
- "badge": "_3j77BW_badge",
5589
- "pathDialogRow": "_3j77BW_pathDialogRow",
5590
- "badgeInfo": "_3j77BW_badgeInfo",
5591
- "headHint": "_3j77BW_headHint",
5592
- "pathDialogDesc": "_3j77BW_pathDialogDesc",
5593
- "filterBar": "_3j77BW_filterBar",
5594
- "linkBtn": "_3j77BW_linkBtn",
5595
5615
  "badgeDebug": "_3j77BW_badgeDebug",
5596
- "pathDialog": "_3j77BW_pathDialog",
5597
- "message": "_3j77BW_message",
5598
- "catDiagnostics": "_3j77BW_catDiagnostics",
5599
- "searchInput": "_3j77BW_searchInput",
5600
- "pathDialogFoot": "_3j77BW_pathDialogFoot",
5616
+ "previewRow": "_3j77BW_previewRow",
5617
+ "pathRow": "_3j77BW_pathRow",
5618
+ "pathLabel": "_3j77BW_pathLabel",
5601
5619
  "time": "_3j77BW_time",
5602
- "filterChipActive": "_3j77BW_filterChipActive",
5603
- "filterChip": "_3j77BW_filterChip",
5604
- "head": "_3j77BW_head",
5605
- "search": "_3j77BW_search",
5606
- "clearBtn": "_3j77BW_clearBtn",
5620
+ "pathDraft": "_3j77BW_pathDraft",
5621
+ "more": "_3j77BW_more",
5607
5622
  "entry": "_3j77BW_entry",
5608
- "footCount": "_3j77BW_footCount",
5609
- "catBadge": "_3j77BW_catBadge",
5623
+ "footPath": "_3j77BW_footPath",
5624
+ "searchInput": "_3j77BW_searchInput",
5610
5625
  "event": "_3j77BW_event",
5611
- "list": "_3j77BW_list",
5612
- "previewRow": "_3j77BW_previewRow",
5613
- "actions": "_3j77BW_actions",
5626
+ "head": "_3j77BW_head",
5627
+ "badge": "_3j77BW_badge",
5614
5628
  "badgeWarn": "_3j77BW_badgeWarn",
5629
+ "pathDialogHint": "_3j77BW_pathDialogHint",
5630
+ "btn": "_3j77BW_btn",
5631
+ "foot": "_3j77BW_foot",
5632
+ "pathDialog": "_3j77BW_pathDialog",
5615
5633
  "catInstall": "_3j77BW_catInstall",
5616
- "catUninstall": "_3j77BW_catUninstall",
5617
- "catUpdate": "_3j77BW_catUpdate",
5618
- "logList": "_3j77BW_logList",
5619
- "footPath": "_3j77BW_footPath",
5634
+ "message": "_3j77BW_message",
5635
+ "footFail": "_3j77BW_footFail",
5636
+ "headActions": "_3j77BW_headActions",
5637
+ "footCount": "_3j77BW_footCount",
5620
5638
  "catSystem": "_3j77BW_catSystem",
5639
+ "badgeInfo": "_3j77BW_badgeInfo",
5640
+ "pathDialogRow": "_3j77BW_pathDialogRow",
5641
+ "clearBtn": "_3j77BW_clearBtn",
5621
5642
  "empty": "_3j77BW_empty",
5622
5643
  "pathText": "_3j77BW_pathText",
5623
5644
  "moreEnd": "_3j77BW_moreEnd",
5645
+ "headHint": "_3j77BW_headHint",
5646
+ "catSettings": "_3j77BW_catSettings",
5647
+ "catBadge": "_3j77BW_catBadge",
5648
+ "pathDialogFoot": "_3j77BW_pathDialogFoot",
5624
5649
  "badgeSuccess": "_3j77BW_badgeSuccess",
5650
+ "catUninstall": "_3j77BW_catUninstall",
5651
+ "catUpdate": "_3j77BW_catUpdate",
5652
+ "catDiagnostics": "_3j77BW_catDiagnostics",
5653
+ "list": "_3j77BW_list",
5654
+ "footActions": "_3j77BW_footActions",
5625
5655
  "badgeError": "_3j77BW_badgeError",
5626
- "panel": "_3j77BW_panel",
5627
- "pathRow": "_3j77BW_pathRow",
5656
+ "filterChipActive": "_3j77BW_filterChipActive",
5657
+ "linkBtn": "_3j77BW_linkBtn",
5628
5658
  "pathDialogReset": "_3j77BW_pathDialogReset",
5629
- "pathDraft": "_3j77BW_pathDraft",
5630
- "pathDialogHint": "_3j77BW_pathDialogHint",
5631
- "more": "_3j77BW_more",
5632
- "headActions": "_3j77BW_headActions",
5633
- "footFail": "_3j77BW_footFail",
5634
- "footActions": "_3j77BW_footActions",
5635
- "catSettings": "_3j77BW_catSettings"
5659
+ "pathDialogDesc": "_3j77BW_pathDialogDesc",
5660
+ "logList": "_3j77BW_logList",
5661
+ "filterChip": "_3j77BW_filterChip",
5662
+ "panel": "_3j77BW_panel",
5663
+ "actions": "_3j77BW_actions",
5664
+ "filterBar": "_3j77BW_filterBar",
5665
+ "search": "_3j77BW_search"
5636
5666
  };
5637
5667
  //#endregion
5638
5668
  //#region src/client/components/modals/LogsModal.tsx
@@ -6846,6 +6876,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6846
6876
  langKey,
6847
6877
  t,
6848
6878
  platform: env?.platform ?? "",
6879
+ pendingRestarts: queue.pendingRestarts.map((p) => p.target),
6849
6880
  onOpenDetail: (item) => setDetailItem(item),
6850
6881
  onReveal: (item) => {
6851
6882
  revealFolder(item);
@@ -6908,7 +6939,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6908
6939
  openSection: settingsSection,
6909
6940
  onConsumedOpenSection: () => setSettingsSection(null)
6910
6941
  }), showHubUpdate && (0, react.createElement)(HubUpdateModal, {
6911
- info: catalog.hubUpdateInfo ?? { version: "1.6.5" },
6942
+ info: catalog.hubUpdateInfo ?? { version: "1.6.7" },
6912
6943
  state: catalog.hubUpdateState,
6913
6944
  currentVersion: catalog.hubCurrentVersion,
6914
6945
  lang,