dsh-plugin 2.3.2 → 2.3.4

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 (84) hide show
  1. package/README.en.md +3 -9
  2. package/README.md +3 -9
  3. package/client/client.js +371 -364
  4. package/client/client.js.map +1 -1
  5. package/lib/http/catalog.js +4 -4
  6. package/lib/http/diagnostics.js +4 -4
  7. package/lib/http/install.js +13 -13
  8. package/lib/http/npm-release-age.js +3 -3
  9. package/lib/http/shared.js +1 -1
  10. package/lib/services/host-version.js +2 -2
  11. package/lib/services/install/dsh-compat.js +1 -1
  12. package/lib/services/install/npm-resolve.js +1 -1
  13. package/lib/services/install/operation-log.js +3 -3
  14. package/lib/services/install/preflight.js +1 -1
  15. package/lib/services/install/registry-fallback.js +3 -3
  16. package/lib/services/install/release-target.js +2 -2
  17. package/lib/services/install/task-queue.js +35 -20
  18. package/lib/services/loader.js +8 -8
  19. package/lib/services/npm-release-age.js +8 -8
  20. package/lib/services/probe.js +12 -12
  21. package/lib/services/profile/installed-versions.js +2 -2
  22. package/lib/services/profile/profile.js +2 -2
  23. package/lib/types/services/host-version.d.ts +1 -1
  24. package/lib/types/services/install/install-types.d.ts +5 -5
  25. package/lib/types/services/install/operation-log.d.ts +1 -1
  26. package/lib/types/services/install/preflight.d.ts +1 -1
  27. package/lib/types/services/install/registry-fallback.d.ts +1 -1
  28. package/lib/types/services/install/release-target.d.ts +1 -1
  29. package/lib/types/services/install/task-queue.d.ts +10 -7
  30. package/lib/types/services/loader.d.ts +5 -5
  31. package/lib/types/services/npm-release-age.d.ts +5 -5
  32. package/lib/types/services/probe.d.ts +4 -4
  33. package/package.json +1 -1
  34. package/src/client/components/PluginHubSection.tsx +29 -29
  35. package/src/client/components/catalog/CatalogList.tsx +1 -1
  36. package/src/client/components/catalog/PluginCard.tsx +3 -3
  37. package/src/client/components/modals/AboutModal.tsx +2 -2
  38. package/src/client/components/modals/ConfirmDialog.tsx +2 -2
  39. package/src/client/components/modals/HubUpdateModal.tsx +3 -3
  40. package/src/client/components/modals/InstalledDetailModal.tsx +1 -1
  41. package/src/client/components/modals/LogsPathModal.tsx +1 -1
  42. package/src/client/components/modals/NotificationsModal.tsx +2 -2
  43. package/src/client/components/modals/modals.tsx +10 -10
  44. package/src/client/components/views/CustomInstallView.tsx +2 -2
  45. package/src/client/components/views/InstalledView.tsx +2 -2
  46. package/src/client/components/views/SettingsView.tsx +3 -3
  47. package/src/client/data/catalog.ts +1 -1
  48. package/src/client/data/host.ts +2 -2
  49. package/src/client/data/hub.ts +3 -3
  50. package/src/client/hooks/useCatalog.ts +14 -14
  51. package/src/client/hooks/useSettings.ts +2 -2
  52. package/src/client/hooks/useTaskQueue.ts +30 -23
  53. package/src/client/locales.ts +15 -15
  54. package/src/client/logic/constants.ts +1 -1
  55. package/src/client/logic/ensure-plugin-css.ts +2 -2
  56. package/src/client/logic/failures.ts +9 -9
  57. package/src/client/logic/install-command.ts +1 -2
  58. package/src/client/logic/installed.ts +1 -1
  59. package/src/client/logic/release-age.ts +10 -10
  60. package/src/client/logic/urls.ts +6 -4
  61. package/src/client/styles/Header.module.css +1 -1
  62. package/src/client/styles/Modal.module.css +2 -2
  63. package/src/client/styles/SectionTabs.module.css +1 -1
  64. package/src/client/styles/tokens.module.css +1 -1
  65. package/src/client/types.ts +4 -4
  66. package/src/server/http/catalog.ts +4 -4
  67. package/src/server/http/diagnostics.ts +4 -4
  68. package/src/server/http/install.ts +13 -13
  69. package/src/server/http/npm-release-age.ts +3 -3
  70. package/src/server/http/shared.ts +1 -1
  71. package/src/server/services/host-version.ts +2 -2
  72. package/src/server/services/install/dsh-compat.ts +1 -1
  73. package/src/server/services/install/install-types.ts +5 -5
  74. package/src/server/services/install/npm-resolve.ts +1 -1
  75. package/src/server/services/install/operation-log.ts +3 -3
  76. package/src/server/services/install/preflight.ts +1 -1
  77. package/src/server/services/install/registry-fallback.ts +3 -3
  78. package/src/server/services/install/release-target.ts +2 -2
  79. package/src/server/services/install/task-queue.ts +40 -26
  80. package/src/server/services/loader.ts +10 -10
  81. package/src/server/services/npm-release-age.ts +10 -10
  82. package/src/server/services/probe.ts +12 -12
  83. package/src/server/services/profile/installed-versions.ts +2 -2
  84. package/src/server/services/profile/profile.ts +2 -2
package/client/client.js CHANGED
@@ -57,7 +57,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
57
57
  npmInstallPlaceholder: "npm install <包名> 或直接输包名",
58
58
  npmInstallExample: "支持原生命令:npm install lodash、npm i lodash、pnpm add @scope/pkg",
59
59
  npmInstallExample2: "全局安装 CLI:npm install -g @scope/cli;或直接输入包名 lodash",
60
- npmInstallInvalid: "请输入 npm 包名(如 lodash、@scope/pkg),或原生安装命令(如 npm install lodash、npm i lodash、pnpm add @scope/pkg、npm install -g @scope/cli)",
60
+ npmInstallInvalid: "请输入 npm 包名(如 lodash、@scope/pkg),或原生安装命令(如 npm install lodash、npm i lodash、pnpm add @scope/pkg、npm install -g @scope/cli);不支持 GitHub 源码地址,请改用该插件的 npm 包名",
61
61
  installHelp: "帮助",
62
62
  helpModalTitle: "支持的命令格式",
63
63
  npmInstallHelp: "lodash、@scope/pkg 直接输入包名\nnpm install lodash\nnpm i lodash\npnpm add @scope/pkg\npnpm i @scope/pkg\nnpm install -g @scope/cli 全局安装 CLI 工具,不进「已安装」列表",
@@ -442,7 +442,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
442
442
  updateAvailable: "有更新",
443
443
  updateAvailableHint: "检测到更新:有版本号的仓库比对版本号,无版本号的仓库比对仓库最近更新时间",
444
444
  updatePending: "暂缓到 {time} 后可更新",
445
- updatePendingHint: "新版本发布未满 24 小时,pnpm 供应链门禁会拦下;到时间后再更新即可",
445
+ updatePendingHint: "新版本发布还不满 24 小时,pnpm 暂时不让安装;到时间后再更新即可",
446
446
  hubUpdateHint: "检测到 DSH Plugin Hub 新版本,点击查看更新内容并更新",
447
447
  hubUpdateTitle: "DSH Plugin Hub 有新版本",
448
448
  hubUpdateDesc: "点击下方按钮即可更新,完成后需重启宿主生效。",
@@ -455,7 +455,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
455
455
  hubVersionStateAvailable: "可更新",
456
456
  hubVersionStatePending: "暂缓提示",
457
457
  close: "关闭",
458
- hubPendingDesc: "最新版已发布,但发布尚未满 24 小时:此时更新会被 pnpm 静默回退到旧版本,因此暂不提示。稍后这里会自动出现更新入口。",
458
+ hubPendingDesc: "最新版已发布,但发布尚未满 24 小时:此时更新会被 pnpm 不提示地回退到旧版本,因此暂不提示。稍后这里会自动出现更新入口。",
459
459
  followUs: "关注我们",
460
460
  aboutTitle: "关注我们",
461
461
  aboutDesc: "了解 DSH Plugin Hub 是做什么的,访问主站浏览插件,或到 GitHub 提交 Issue。",
@@ -508,7 +508,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
508
508
  npmInstallPlaceholder: "npm install <pkg> or a bare package name",
509
509
  npmInstallExample: "Native commands: npm install lodash, npm i lodash, pnpm add @scope/pkg",
510
510
  npmInstallExample2: "Global CLI: npm install -g @scope/cli; or just type a package name like lodash",
511
- 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)",
511
+ 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); GitHub source URLs are not supported — use the plugin's npm package name instead",
512
512
  installHelp: "Help",
513
513
  helpModalTitle: "Supported command formats",
514
514
  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",
@@ -932,42 +932,42 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
932
932
  css: css$11
933
933
  });
934
934
  var Header_module_css_default = {
935
- "adBadge": "qikqja_adBadge",
936
- "adText": "qikqja_adText",
937
- "adArrow": "qikqja_adArrow",
935
+ "githubIcon": "qikqja_githubIcon",
938
936
  "root": "qikqja_root",
939
- "segBtnActive": "qikqja_segBtnActive",
940
- "header": "qikqja_header",
941
- "versionBtn": "qikqja_versionBtn",
942
937
  "hubUpdateBadge": "qikqja_hubUpdateBadge",
943
- "langBtn": "qikqja_langBtn",
944
- "githubIcon": "qikqja_githubIcon",
945
- "resultCount": "qikqja_resultCount",
946
- "search": "qikqja_search",
947
- "controls": "qikqja_controls",
948
- "tabs": "qikqja_tabs",
938
+ "adText": "qikqja_adText",
949
939
  "segGroup": "qikqja_segGroup",
940
+ "adBadge": "qikqja_adBadge",
941
+ "versionBtn": "qikqja_versionBtn",
942
+ "headerRight": "qikqja_headerRight",
950
943
  "segBtn": "qikqja_segBtn",
944
+ "tabCount": "qikqja_tabCount",
951
945
  "resultSeg": "qikqja_resultSeg",
952
- "segLabel": "qikqja_segLabel",
946
+ "brandTitle": "qikqja_brandTitle",
947
+ "resultCount": "qikqja_resultCount",
953
948
  "version": "qikqja_version",
954
- "tagline": "qikqja_tagline",
955
949
  "searchRow": "qikqja_searchRow",
956
- "tabActive": "qikqja_tabActive",
957
- "title": "qikqja_title",
958
- "tab": "qikqja_tab",
959
- "tabCount": "qikqja_tabCount",
960
- "aboutBtn": "qikqja_aboutBtn",
961
- "brandTitle": "qikqja_brandTitle",
950
+ "langBtn": "qikqja_langBtn",
951
+ "controls": "qikqja_controls",
952
+ "githubLink": "qikqja_githubLink",
953
+ "tagline": "qikqja_tagline",
954
+ "segLabel": "qikqja_segLabel",
955
+ "segBtnActive": "qikqja_segBtnActive",
962
956
  "sortGroup": "qikqja_sortGroup",
957
+ "adArrow": "qikqja_adArrow",
958
+ "search": "qikqja_search",
959
+ "logoIcon": "qikqja_logoIcon",
960
+ "copyIcon": "qikqja_copyIcon",
963
961
  "adBanner": "qikqja_adBanner",
964
- "taglineLink": "qikqja_taglineLink",
965
- "githubLink": "qikqja_githubLink",
966
- "headerRight": "qikqja_headerRight",
967
962
  "tabsRow": "qikqja_tabsRow",
963
+ "tabs": "qikqja_tabs",
964
+ "title": "qikqja_title",
965
+ "tabActive": "qikqja_tabActive",
966
+ "tab": "qikqja_tab",
967
+ "header": "qikqja_header",
968
968
  "headerTitleRow": "qikqja_headerTitleRow",
969
- "logoIcon": "qikqja_logoIcon",
970
- "copyIcon": "qikqja_copyIcon"
969
+ "aboutBtn": "qikqja_aboutBtn",
970
+ "taglineLink": "qikqja_taglineLink"
971
971
  };
972
972
  //#endregion
973
973
  //#region \0dsh-css:src/client/styles/Modal.module.css.mjs
@@ -986,151 +986,151 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
986
986
  css: css$10
987
987
  });
988
988
  var Modal_module_css_default = {
989
+ "progressText": "BiQ1zG_progressText",
990
+ "failedCopyHint": "BiQ1zG_failedCopyHint",
991
+ "linkIcon": "BiQ1zG_linkIcon",
992
+ "noticeRow": "BiQ1zG_noticeRow",
993
+ "modalHead": "BiQ1zG_modalHead",
989
994
  "resultTitle": "BiQ1zG_resultTitle",
990
995
  "detailPathBtn": "BiQ1zG_detailPathBtn",
991
- "noticeHead": "BiQ1zG_noticeHead",
992
- "detailStatusText": "BiQ1zG_detailStatusText",
993
- "detailArrow": "BiQ1zG_detailArrow",
994
- "detailPathActions": "BiQ1zG_detailPathActions",
995
- "progressHead": "BiQ1zG_progressHead",
996
- "failCopy": "BiQ1zG_failCopy",
997
- "noticeTextFail": "BiQ1zG_noticeTextFail",
998
- "noticeTextOk": "BiQ1zG_noticeTextOk",
999
- "hubStateLatest": "BiQ1zG_hubStateLatest",
996
+ "toast": "BiQ1zG_toast",
997
+ "noticeRowMain": "BiQ1zG_noticeRowMain",
998
+ "detailStatusRunning": "BiQ1zG_detailStatusRunning",
1000
999
  "restartNow": "BiQ1zG_restartNow",
1001
- "confirmPrimary": "BiQ1zG_confirmPrimary",
1000
+ "noticeRemove": "BiQ1zG_noticeRemove",
1001
+ "detailStatusPending": "BiQ1zG_detailStatusPending",
1002
+ "noticeList": "BiQ1zG_noticeList",
1003
+ "detailArrow": "BiQ1zG_detailArrow",
1004
+ "progressFillFail": "BiQ1zG_progressFillFail",
1005
+ "modalValue": "BiQ1zG_modalValue",
1002
1006
  "logModal": "BiQ1zG_logModal",
1003
1007
  "modalDesc": "BiQ1zG_modalDesc",
1004
- "noticeRemove": "BiQ1zG_noticeRemove",
1005
- "detailDim": "BiQ1zG_detailDim",
1006
- "noticeRowMain": "BiQ1zG_noticeRowMain",
1007
- "failKind": "BiQ1zG_failKind",
1008
- "noticeRow": "BiQ1zG_noticeRow",
1009
- "noticeTime": "BiQ1zG_noticeTime",
1010
- "failedCopyHint": "BiQ1zG_failedCopyHint",
1011
- "cliOnlyHint": "BiQ1zG_cliOnlyHint",
1012
- "modalCmdCopy": "BiQ1zG_modalCmdCopy",
1013
1008
  "modalCloseIcon": "BiQ1zG_modalCloseIcon",
1009
+ "queueRowHead": "BiQ1zG_queueRowHead",
1010
+ "helpModal": "BiQ1zG_helpModal",
1011
+ "aboutMeta": "BiQ1zG_aboutMeta",
1012
+ "errorTitle": "BiQ1zG_errorTitle",
1013
+ "resultCheckIcon": "BiQ1zG_resultCheckIcon",
1014
+ "modalCmdCopy": "BiQ1zG_modalCmdCopy",
1015
+ "pendingRowStatus": "BiQ1zG_pendingRowStatus",
1016
+ "detailUpdateHint": "BiQ1zG_detailUpdateHint",
1017
+ "pendingRowActions": "BiQ1zG_pendingRowActions",
1018
+ "progressFill": "BiQ1zG_progressFill",
1014
1019
  "queueRowDesc": "BiQ1zG_queueRowDesc",
1015
- "hubStateAvailable": "BiQ1zG_hubStateAvailable",
1016
- "detailRow": "BiQ1zG_detailRow",
1017
- "hubVersionNumber": "BiQ1zG_hubVersionNumber",
1018
- "detailPathText": "BiQ1zG_detailPathText",
1019
- "hubUpdateModal": "BiQ1zG_hubUpdateModal",
1020
- "progressFillFail": "BiQ1zG_progressFillFail",
1021
- "noticeBadgeFail": "BiQ1zG_noticeBadgeFail",
1022
- "detailStatusPending": "BiQ1zG_detailStatusPending",
1023
- "errorModal": "BiQ1zG_errorModal",
1024
- "failList": "BiQ1zG_failList",
1025
- "aboutModal": "BiQ1zG_aboutModal",
1026
- "progress": "BiQ1zG_progress",
1027
- "failMisjudgeLink": "BiQ1zG_failMisjudgeLink",
1028
- "failEmpty": "BiQ1zG_failEmpty",
1029
- "detailGrid": "BiQ1zG_detailGrid",
1030
- "trustHint": "BiQ1zG_trustHint",
1031
- "errorCopySoft": "BiQ1zG_errorCopySoft",
1032
- "modalTitle": "BiQ1zG_modalTitle",
1033
- "result": "BiQ1zG_result",
1034
- "modalBody": "BiQ1zG_modalBody",
1035
- "modalTitleQueued": "BiQ1zG_modalTitleQueued",
1036
- "modalCmd": "BiQ1zG_modalCmd",
1020
+ "overlayIn": "BiQ1zG_overlayIn",
1021
+ "resultDesc": "BiQ1zG_resultDesc",
1022
+ "queueRowTarget": "BiQ1zG_queueRowTarget",
1023
+ "noticeBadgeOk": "BiQ1zG_noticeBadgeOk",
1024
+ "failClear": "BiQ1zG_failClear",
1025
+ "progressHead": "BiQ1zG_progressHead",
1037
1026
  "noticeRowUpdate": "BiQ1zG_noticeRowUpdate",
1038
- "modalClose": "BiQ1zG_modalClose",
1039
- "aboutContent": "BiQ1zG_aboutContent",
1027
+ "bundleDeselectedHint": "BiQ1zG_bundleDeselectedHint",
1028
+ "queueRowTrack": "BiQ1zG_queueRowTrack",
1029
+ "noticeMain": "BiQ1zG_noticeMain",
1030
+ "hubVersionBar": "BiQ1zG_hubVersionBar",
1031
+ "detailValue": "BiQ1zG_detailValue",
1040
1032
  "modalActions": "BiQ1zG_modalActions",
1033
+ "noticeRowOk": "BiQ1zG_noticeRowOk",
1034
+ "noticeBadgeFail": "BiQ1zG_noticeBadgeFail",
1035
+ "hubVersionNumber": "BiQ1zG_hubVersionNumber",
1036
+ "aboutContent": "BiQ1zG_aboutContent",
1037
+ "detailMono": "BiQ1zG_detailMono",
1038
+ "failRow": "BiQ1zG_failRow",
1041
1039
  "confirmIconWrap": "BiQ1zG_confirmIconWrap",
1042
- "aboutMeta": "BiQ1zG_aboutMeta",
1043
- "failKindInstall": "BiQ1zG_failKindInstall",
1044
- "modalLabel": "BiQ1zG_modalLabel",
1045
- "noticeBadgeOk": "BiQ1zG_noticeBadgeOk",
1046
- "detailPath": "BiQ1zG_detailPath",
1040
+ "modalCmdText": "BiQ1zG_modalCmdText",
1041
+ "failRepoLabel": "BiQ1zG_failRepoLabel",
1042
+ "confirmPrimary": "BiQ1zG_confirmPrimary",
1043
+ "queueRow": "BiQ1zG_queueRow",
1044
+ "result": "BiQ1zG_result",
1045
+ "hubUpdateModal": "BiQ1zG_hubUpdateModal",
1046
+ "confirmIconDanger": "BiQ1zG_confirmIconDanger",
1047
+ "failDiagBtn": "BiQ1zG_failDiagBtn",
1048
+ "hubStateLatest": "BiQ1zG_hubStateLatest",
1049
+ "detailGrid": "BiQ1zG_detailGrid",
1047
1050
  "detailStars": "BiQ1zG_detailStars",
1051
+ "noticeVersion": "BiQ1zG_noticeVersion",
1052
+ "restartNowWarning": "BiQ1zG_restartNowWarning",
1053
+ "cliOnlyHint": "BiQ1zG_cliOnlyHint",
1054
+ "modalLink": "BiQ1zG_modalLink",
1055
+ "hubStateAvailable": "BiQ1zG_hubStateAvailable",
1056
+ "failBigIssue": "BiQ1zG_failBigIssue",
1057
+ "errorHint": "BiQ1zG_errorHint",
1058
+ "trustHint": "BiQ1zG_trustHint",
1059
+ "queueRowStatus": "BiQ1zG_queueRowStatus",
1060
+ "queuedHint": "BiQ1zG_queuedHint",
1048
1061
  "uninstallConfirm": "BiQ1zG_uninstallConfirm",
1049
- "noticeList": "BiQ1zG_noticeList",
1062
+ "errorBox": "BiQ1zG_errorBox",
1063
+ "noticeUpdateGo": "BiQ1zG_noticeUpdateGo",
1064
+ "failCopy": "BiQ1zG_failCopy",
1065
+ "failMisjudgeLink": "BiQ1zG_failMisjudgeLink",
1066
+ "modalTitleQueued": "BiQ1zG_modalTitleQueued",
1050
1067
  "queueRowPct": "BiQ1zG_queueRowPct",
1051
- "resultDesc": "BiQ1zG_resultDesc",
1052
- "dangerConfirm": "BiQ1zG_dangerConfirm",
1053
- "queuedHint": "BiQ1zG_queuedHint",
1054
- "restartLater": "BiQ1zG_restartLater",
1055
- "noticeIgnore": "BiQ1zG_noticeIgnore",
1056
- "toastIn": "BiQ1zG_toastIn",
1057
- "modalHead": "BiQ1zG_modalHead",
1068
+ "progress": "BiQ1zG_progress",
1058
1069
  "hubStateChip": "BiQ1zG_hubStateChip",
1059
- "failReason": "BiQ1zG_failReason",
1060
- "progressTrack": "BiQ1zG_progressTrack",
1061
- "noticeUpdateGo": "BiQ1zG_noticeUpdateGo",
1062
- "toast": "BiQ1zG_toast",
1063
- "modalCopy": "BiQ1zG_modalCopy",
1064
- "progressText": "BiQ1zG_progressText",
1065
- "failClear": "BiQ1zG_failClear",
1066
- "hubVersionBar": "BiQ1zG_hubVersionBar",
1067
- "pendingRowStatus": "BiQ1zG_pendingRowStatus",
1070
+ "noticeFoot": "BiQ1zG_noticeFoot",
1068
1071
  "hubVersionDate": "BiQ1zG_hubVersionDate",
1069
- "detailLabel": "BiQ1zG_detailLabel",
1070
- "detailModal": "BiQ1zG_detailModal",
1071
- "hubStatePending": "BiQ1zG_hubStatePending",
1072
- "confirmIconDanger": "BiQ1zG_confirmIconDanger",
1073
- "errorTitle": "BiQ1zG_errorTitle",
1072
+ "noticeHead": "BiQ1zG_noticeHead",
1073
+ "modalClose": "BiQ1zG_modalClose",
1074
+ "failEmpty": "BiQ1zG_failEmpty",
1075
+ "failRepoUrl": "BiQ1zG_failRepoUrl",
1074
1076
  "overlay": "BiQ1zG_overlay",
1075
- "helpModal": "BiQ1zG_helpModal",
1076
- "noticeRowOk": "BiQ1zG_noticeRowOk",
1077
- "modalTitleBusy": "BiQ1zG_modalTitleBusy",
1078
- "modalLink": "BiQ1zG_modalLink",
1079
- "noticeVersion": "BiQ1zG_noticeVersion",
1080
- "queueRowTrack": "BiQ1zG_queueRowTrack",
1081
- "confirmIcon": "BiQ1zG_confirmIcon",
1082
- "errorHint": "BiQ1zG_errorHint",
1083
- "modalRow": "BiQ1zG_modalRow",
1077
+ "hubStatePending": "BiQ1zG_hubStatePending",
1078
+ "detailModal": "BiQ1zG_detailModal",
1079
+ "failRepo": "BiQ1zG_failRepo",
1080
+ "queueRowBody": "BiQ1zG_queueRowBody",
1081
+ "failKindUninstall": "BiQ1zG_failKindUninstall",
1082
+ "modalBody": "BiQ1zG_modalBody",
1084
1083
  "resultRestarting": "BiQ1zG_resultRestarting",
1085
- "failHead": "BiQ1zG_failHead",
1086
- "failRepoUrl": "BiQ1zG_failRepoUrl",
1087
- "detailLink": "BiQ1zG_detailLink",
1088
- "detailStatusRunning": "BiQ1zG_detailStatusRunning",
1089
1084
  "queueSection": "BiQ1zG_queueSection",
1090
- "modalCancel": "BiQ1zG_modalCancel",
1091
- "resultCheck": "BiQ1zG_resultCheck",
1092
- "overlayIn": "BiQ1zG_overlayIn",
1093
- "detailMono": "BiQ1zG_detailMono",
1094
- "queueRowBody": "BiQ1zG_queueRowBody",
1095
- "failKindTitle": "BiQ1zG_failKindTitle",
1096
- "failPrepareHint": "BiQ1zG_failPrepareHint",
1097
- "modalIn": "BiQ1zG_modalIn",
1098
- "queueRowStatus": "BiQ1zG_queueRowStatus",
1099
- "resultCheckIcon": "BiQ1zG_resultCheckIcon",
1100
- "hubUpdateNotes": "BiQ1zG_hubUpdateNotes",
1101
- "failNetworkTarget": "BiQ1zG_failNetworkTarget",
1102
- "modalValue": "BiQ1zG_modalValue",
1103
- "toastFail": "BiQ1zG_toastFail",
1104
- "stripCancel": "BiQ1zG_stripCancel",
1105
- "bundleDeselectedHint": "BiQ1zG_bundleDeselectedHint",
1106
- "failRepo": "BiQ1zG_failRepo",
1107
- "failDiagBtn": "BiQ1zG_failDiagBtn",
1108
- "failRepoLabel": "BiQ1zG_failRepoLabel",
1109
- "failBigIssue": "BiQ1zG_failBigIssue",
1110
- "detailValue": "BiQ1zG_detailValue",
1111
- "restartNowWarning": "BiQ1zG_restartNowWarning",
1112
- "errorBox": "BiQ1zG_errorBox",
1113
- "modalInstall": "BiQ1zG_modalInstall",
1114
1085
  "modalWide": "BiQ1zG_modalWide",
1086
+ "toastIn": "BiQ1zG_toastIn",
1087
+ "noticeTime": "BiQ1zG_noticeTime",
1088
+ "detailPathText": "BiQ1zG_detailPathText",
1089
+ "noticeBadgeIcon": "BiQ1zG_noticeBadgeIcon",
1090
+ "failList": "BiQ1zG_failList",
1115
1091
  "modal": "BiQ1zG_modal",
1116
- "progressFill": "BiQ1zG_progressFill",
1117
- "detailUpdateHint": "BiQ1zG_detailUpdateHint",
1118
- "linkIcon": "BiQ1zG_linkIcon",
1119
- "noticeMain": "BiQ1zG_noticeMain",
1092
+ "errorModal": "BiQ1zG_errorModal",
1093
+ "modalRow": "BiQ1zG_modalRow",
1094
+ "hubUpdateNotes": "BiQ1zG_hubUpdateNotes",
1095
+ "detailDim": "BiQ1zG_detailDim",
1096
+ "detailPathActions": "BiQ1zG_detailPathActions",
1097
+ "modalCmd": "BiQ1zG_modalCmd",
1098
+ "stripCancel": "BiQ1zG_stripCancel",
1099
+ "modalCopy": "BiQ1zG_modalCopy",
1100
+ "errorCopySoft": "BiQ1zG_errorCopySoft",
1101
+ "detailLink": "BiQ1zG_detailLink",
1120
1102
  "queueSectionTitle": "BiQ1zG_queueSectionTitle",
1121
- "pendingRowActions": "BiQ1zG_pendingRowActions",
1122
- "failKindUninstall": "BiQ1zG_failKindUninstall",
1123
- "queueRowHead": "BiQ1zG_queueRowHead",
1124
- "noticeFoot": "BiQ1zG_noticeFoot",
1125
- "queueRowTarget": "BiQ1zG_queueRowTarget",
1126
- "noticeBadgeIcon": "BiQ1zG_noticeBadgeIcon",
1127
- "modalCmdText": "BiQ1zG_modalCmdText",
1128
- "failRow": "BiQ1zG_failRow",
1129
- "queueRow": "BiQ1zG_queueRow"
1103
+ "detailRow": "BiQ1zG_detailRow",
1104
+ "progressTrack": "BiQ1zG_progressTrack",
1105
+ "resultCheck": "BiQ1zG_resultCheck",
1106
+ "failKindInstall": "BiQ1zG_failKindInstall",
1107
+ "detailPath": "BiQ1zG_detailPath",
1108
+ "dangerConfirm": "BiQ1zG_dangerConfirm",
1109
+ "failHead": "BiQ1zG_failHead",
1110
+ "toastFail": "BiQ1zG_toastFail",
1111
+ "modalTitleBusy": "BiQ1zG_modalTitleBusy",
1112
+ "confirmIcon": "BiQ1zG_confirmIcon",
1113
+ "modalIn": "BiQ1zG_modalIn",
1114
+ "modalCancel": "BiQ1zG_modalCancel",
1115
+ "aboutModal": "BiQ1zG_aboutModal",
1116
+ "modalTitle": "BiQ1zG_modalTitle",
1117
+ "failReason": "BiQ1zG_failReason",
1118
+ "modalLabel": "BiQ1zG_modalLabel",
1119
+ "restartLater": "BiQ1zG_restartLater",
1120
+ "noticeTextFail": "BiQ1zG_noticeTextFail",
1121
+ "failKind": "BiQ1zG_failKind",
1122
+ "failKindTitle": "BiQ1zG_failKindTitle",
1123
+ "modalInstall": "BiQ1zG_modalInstall",
1124
+ "noticeIgnore": "BiQ1zG_noticeIgnore",
1125
+ "detailStatusText": "BiQ1zG_detailStatusText",
1126
+ "detailLabel": "BiQ1zG_detailLabel",
1127
+ "failPrepareHint": "BiQ1zG_failPrepareHint",
1128
+ "noticeTextOk": "BiQ1zG_noticeTextOk",
1129
+ "failNetworkTarget": "BiQ1zG_failNetworkTarget"
1130
1130
  };
1131
1131
  //#endregion
1132
1132
  //#region src/server/services/install/release-target.ts
1133
- /** 完整命令前缀:`dsh plugin --profile <p> add|update <target>`(与 profile.ts installTargetOf 同口径)。 */
1133
+ /** 完整命令前缀:`dsh plugin --profile <p> add|update <target>`(与 profile.ts installTargetOf 同一套规则)。 */
1134
1134
  const DSH_PLUGIN_CMD_RE = /^dsh[ \t]+plugin[ \t]+--profile(?:[ \t]+|=)[A-Za-z0-9_-]+[ \t]+(?:add|update)[ \t]+(.+)$/i;
1135
1135
  /** 固定形态的 release .tgz 直链:主机、路径段与扩展名全部锁死。 */
1136
1136
  const RELEASE_URL_RE = /^https:\/\/github\.com\/([A-Za-z0-9._-]+)\/([A-Za-z0-9._-]+)\/releases\/download\/([A-Za-z0-9._+-]+)\/([A-Za-z0-9._+-]+\.tgz)$/;
@@ -1172,8 +1172,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1172
1172
  /** 展示用安装命令(复制/弹窗):目录下发的权威命令优先(CLI-only 插件如 dsh-tui
1173
1173
  * 需专属 profile(--profile dsh-tui),无法从 npm 包名推断,必须用官方命令);
1174
1174
  * 常规插件无目录命令时用 npm 包名回退生成。
1175
- * version 为已过供应链门禁的版本:带上它,手抄命令与原位安装的执行结果一致,
1176
- * 不会因 pnpm 门禁静默回退到很旧的版本。 */
1175
+ * version 为已过发布冷却期的版本:带上它,手抄命令与一键安装的执行结果一致。 */
1177
1176
  function installCommandOf(p, withProfile = false, version) {
1178
1177
  const cmd = p.install?.command;
1179
1178
  if (cmd) return cmd;
@@ -1218,9 +1217,9 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1218
1217
  /**
1219
1218
  * 插件当前版本号,供头部标题展示「DSH Plugin Hub v0.1.1」。
1220
1219
  * tsdown 构建时用 define 把 __PLUGIN_VERSION__ 替换成 package.json 的版本号;
1221
- * node --test 直接 import 本模块时该标识符不存在,typeof 守卫兜底为空串。
1220
+ * node --test 直接 import 本模块时该标识符不存在,typeof 守卫缺省为空串。
1222
1221
  */
1223
- const PLUGIN_VERSION = "2.3.2";
1222
+ const PLUGIN_VERSION = "2.3.4";
1224
1223
  const CATEGORY_ORDER = [
1225
1224
  "interface",
1226
1225
  "session",
@@ -1373,7 +1372,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1373
1372
  return null;
1374
1373
  }
1375
1374
  }
1376
- /** 批量查询已安装插件 npm 包的最新版本发布时间(供应链门禁用);失败返回 null(调用方按原逻辑照常提示)。 */
1375
+ /** 批量查询已安装插件 npm 包的最新版本发布时间(发布冷却期用);失败返回 null(调用方按原逻辑照常提示)。 */
1377
1376
  async function fetchNpmReleaseAge(packages) {
1378
1377
  if (packages.length === 0) return {};
1379
1378
  try {
@@ -1514,7 +1513,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1514
1513
  return `${url}${url.includes("?") ? "&" : "?"}_t=${Date.now()}`;
1515
1514
  }
1516
1515
  /** 归一化接口下发的 recentVersions:只保留带版本号的条目,其余字段按类型补。
1517
- * 这条数据是「最新版还在 24.5h 门禁内时回退到更早的已过门槛版本」的唯一依据;
1516
+ * 这条数据是「最新版还在 24.5h 冷却期内时回退到更早的已过冷却期版本」的唯一依据;
1518
1517
  * 入口处漏传会让候选只剩最新版,整体变成 pending —— 用户就永远看不到更新入口。 */
1519
1518
  function recentVersionsOf(value) {
1520
1519
  if (!Array.isArray(value)) return [];
@@ -1531,7 +1530,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1531
1530
  }
1532
1531
  return list;
1533
1532
  }
1534
- /** 版本控制中心:最新版本 + Markdown 变更记录 + 最近发版(门禁回退用);不可用返回 null。 */
1533
+ /** 版本控制中心:最新版本 + Markdown 变更记录 + 最近发版(冷却期回退用);不可用返回 null。 */
1535
1534
  async function fetchHubUpdate() {
1536
1535
  try {
1537
1536
  const res = await fetch(busted(HUB_UPDATE_URL), { cache: "no-store" });
@@ -1569,9 +1568,9 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1569
1568
  }
1570
1569
  //#endregion
1571
1570
  //#region src/client/logic/release-age.ts
1572
- /** pnpm 供应链门禁:dsh profile 默认 minimumReleaseAge=1440(分钟);+30 分钟缓冲抵消网络/CDN 边缘时间偏差。 */
1571
+ /** pnpm 发布冷却期:dsh profile 默认 minimumReleaseAge=1440(分钟);+30 分钟缓冲抵消网络/CDN 边缘时间偏差。 */
1573
1572
  const MIN_RELEASE_AGE_MS = 882e5;
1574
- /** 发布时间是否仍在门禁窗口内(太新 → 暂缓提示);无值/解析不出返回 false(不拦真实更新)。 */
1573
+ /** 发布时间是否仍在冷却期内(太新 → 暂缓提示);无值/解析不出返回 false(不拦真实更新)。 */
1575
1574
  function isReleaseTooFresh(publishedAt, now) {
1576
1575
  if (typeof publishedAt !== "string" || publishedAt === "") return false;
1577
1576
  const ms = Date.parse(publishedAt);
@@ -1614,12 +1613,12 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1614
1613
  return 0;
1615
1614
  }
1616
1615
  /**
1617
- * 是否值得提示「可更新」:npm 上最新可安装版本确实比已装版本新,且已过供应链门禁。
1616
+ * 是否值得提示「可更新」:npm 上最新可安装版本确实比已装版本新,且已过发布冷却期。
1618
1617
  *
1619
1618
  * 更新命令执行的是 `pkg@latest`,所以「目录里标的版本」不是最终能装上的版本:
1620
1619
  * 作者可能只打了 GitHub release 没发 npm —— 此时提示会变成永远点不掉的循环。
1621
1620
  * 任一信息缺失(查不到发布信息 / 没有已装版本记录)返回 offered,交回调用方原有判定:
1622
- * 宁可提示,也不因为一次查询失败把真实更新吃掉。
1621
+ * 宁可提示,也不因为一次查询失败漏掉真实更新。
1623
1622
  */
1624
1623
  function updateDecision(release, installedVersion, now) {
1625
1624
  if (release === null) return {
@@ -1645,8 +1644,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1645
1644
  /**
1646
1645
  * 选出本次真正该提示的更新版本。
1647
1646
  *
1648
- * 只看最新版会漏更新:连续发版时间隔小于供应链门禁时,最新版永远「太新」,
1649
- * 提示被整体跳过。这里把最新版与 recentVersions 一起当候选,取「高于当前版本且已过门禁」
1647
+ * 只看最新版会漏更新:连续发版时间隔小于发布冷却期时,最新版永远「太新」,
1648
+ * 提示被整体跳过。这里把最新版与 recentVersions 一起当候选,取「高于当前版本且已过冷却期」
1650
1649
  * 的最高版本;一个都没有但仍存在更高版本 → pending(暂缓,不谎称已是最新)。
1651
1650
  */
1652
1651
  function pickHubUpdate(info, currentVersion, now) {
@@ -1885,7 +1884,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1885
1884
  * 界面停在「正在加载插件数据…」假死 —— 超时自动重拉,最多自动重试 2 次后转失败态;
1886
1885
  * 用户手动刷新(reload)时清零重新计数。 */
1887
1886
  const loadRetriesRef = (0, react.useRef)(0);
1888
- /** 目录加载超时阈值:超过即判定挂起,强制刷新一次(服务端代理 curl 上限 60s,客户端 30s 先兜底) */
1887
+ /** 目录加载超时阈值:超过即判定挂起,强制刷新一次(服务端代理 curl 上限 60s,客户端 30s 先超时) */
1889
1888
  const LOAD_TIMEOUT_MS = 3e4;
1890
1889
  /** 挂起后最多自动重试次数:避免代理持续不通时无限循环刷新(每次重试仍 30s,2 次后转失败界面可手动重试) */
1891
1890
  const MAX_LOAD_RETRIES = 2;
@@ -1903,7 +1902,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1903
1902
  * 强制刷新 Hub 版本与「关注我们」信息:点击头部版本号/徽标时触发。
1904
1903
  * 挂载期的 useEffect 只在进入/reload 时拉一次,发版后已打开的界面点版本号
1905
1904
  * 仍显示旧数据;此处重新拉接口中心,最新版本与变更记录点击即见。
1906
- * 失败静默为 null(弹窗兜底展示当前版本号),与挂载期拉取口径一致。
1905
+ * 失败时返回 null(弹窗退回展示当前版本号),与挂载期拉取规则一致。
1907
1906
  */
1908
1907
  const refreshHub = async () => {
1909
1908
  const [info, about] = await Promise.all([fetchHubUpdate(), fetchHubAbout()]);
@@ -1967,7 +1966,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1967
1966
  controller.abort();
1968
1967
  };
1969
1968
  }, [reloadKey, lang]);
1970
- /** 刷新当前 profile 已安装插件表;宿主未挂本地路由时静默降级为空表。 */
1969
+ /** 刷新当前 profile 已安装插件表;宿主未挂本地路由时降级为空表。 */
1971
1970
  const refreshInstalled = async () => {
1972
1971
  const data = await fetchInstalled();
1973
1972
  if (data === null) return;
@@ -2066,7 +2065,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2066
2065
  const releaseAgeReady = releaseAgeKey === releaseAge.key;
2067
2066
  /**
2068
2067
  * 不能提示更新的包:
2069
- * - npm 上最新版还没过供应链门禁(发布不满 24h,pnpm 会静默回退,点了也装不上);
2068
+ * - npm 上最新版还没过发布冷却期(发布不满 24h,pnpm 会不提示地回退,点了也装不上);
2070
2069
  * - npm 上最新版并不高于已装版本 —— 更新走的是 `pkg@latest`,此时无论目录标到哪个 tag,
2071
2070
  * 都不可能装上(作者可能只打了 GitHub release 没发 npm),提示只会变成永远点不掉的循环。
2072
2071
  */
@@ -2099,7 +2098,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2099
2098
  if (pkg === null) return true;
2100
2099
  return releaseAgeReady && !updateBlocked.has(pkg);
2101
2100
  };
2102
- /** 更新被门禁暂缓时的可重试时刻(毫秒);未安装/无更新/非门禁原因 → null。 */
2101
+ /** 更新被冷却期未到时的可重试时刻(毫秒);未安装/无更新/非冷却期原因 → null。 */
2103
2102
  const updatePendingUntil = (p) => {
2104
2103
  if (!hasUpdateOf(p, installed, versions)) return null;
2105
2104
  const pkg = npmPackageOf(p, versions);
@@ -2107,7 +2106,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2107
2106
  return updateDecisions.get(pkg)?.pendingUntil ?? null;
2108
2107
  };
2109
2108
  /** 已安装项统一列表(目录元数据 + 运行时信息合并):校验未就绪/被拦下的去掉更新标记、
2110
- * 门禁暂缓的带上可重试时刻,驱动「已安装」tab。 */
2109
+ * 冷却期未到的带上可重试时刻,驱动「已安装」tab。 */
2111
2110
  const installedItems = (0, react.useMemo)(() => {
2112
2111
  return rawInstalledItems.map((item) => {
2113
2112
  if (!item.hasUpdate || !item.plugin) return item;
@@ -2136,12 +2135,12 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2136
2135
  * 构建时注入的 PLUGIN_VERSION 是运行 bundle 的真实版本;测试/异常场景缺失时
2137
2136
  * 回退到安装时记录的版本。版本号不等即新版(版本号只在发版时变更,绝无降级场景)。
2138
2137
  *
2139
- * 另加 pnpm 供应链安全门槛:新版本发布还不满 24 小时(+30 分钟缓冲)时,pnpm 会静默
2138
+ * 另加 pnpm 发布冷却期:新版本发布还不满 24 小时(+30 分钟缓冲)时,pnpm 会不提示地
2140
2139
  * 回退到旧版本,此时若提示「可更新」用户点了也更新不到。publishedAt 由接口中心按 npm
2141
- * registry 真实发布时间下发(同源),据此判断最准。门槛命中要单列成 `pending` 而不是
2140
+ * registry 真实发布时间下发(同源),据此判断最准。冷却期命中要单列成 `pending` 而不是
2142
2141
  * 落回「无更新」——回落会让弹窗在本机版本落后时谎称「已是最新」。
2143
2142
  */
2144
- const hubCurrentVersion = "2.3.2";
2143
+ const hubCurrentVersion = "2.3.4";
2145
2144
  const hubUpdateResult = hubUpdateInfo === null ? {
2146
2145
  state: "none",
2147
2146
  target: null
@@ -2345,7 +2344,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2345
2344
  function actionWordZh(action) {
2346
2345
  return action === "uninstall" ? "卸载" : action === "update" ? "更新" : "安装";
2347
2346
  }
2348
- /** 记录的动作:老记录只有 kind,按 kind 兜底。 */
2347
+ /** 记录的动作:老记录只有 kind,按 kind 归类。 */
2349
2348
  function actionOfRecord(rec) {
2350
2349
  if (rec.action !== void 0) return rec.action;
2351
2350
  return rec.kind === "uninstall" ? "uninstall" : rec.kind === "update" ? "update" : "install";
@@ -2443,7 +2442,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2443
2442
  if (LOCAL_ENV_RE.test(message)) return "localEnv";
2444
2443
  return "hub";
2445
2444
  }
2446
- /** 「特征指向本机环境但说不清具体哪一类」的兜底判据:系统调用错误码(权限/路径过长/设备异常)、
2445
+ /** 「特征指向本机环境但说不清具体哪一类」的最后的判断规则:系统调用错误码(权限/路径过长/设备异常)、
2447
2446
  * 证书与代理校验失败、本地配置文件(~/.npmrc、profile 的 package.json)损坏。
2448
2447
  * 只做排除用:命中它表示「不是插件侧问题」,不代表我们已经定位到原因。 */
2449
2448
  const LOCAL_ENV_RE = /os error \d{1,3}\b|ERROR_[A-Z_]{4,}|\bE(?:ACCES|PERM|NOENT|NAMETOOLONG|INVAL|PROTO|ISDIR|NOTDIR|EXIST|BADF|NOTEMPTY|JSONPARSE|NOMEM)\b|JavaScript heap out of memory|Unexpected token .{0,60}in JSON|SELF_SIGNED_CERT_IN_CHAIN|UNABLE_TO_VERIFY_LEAF_SIGNATURE|ERR_TLS_CERT_ALTNAME_INVALID|unable to verify the first certificate|self[- ]signed certificate|ERR_INVALID_URL|invalid registry|proxy authentication|407 Proxy/i;
@@ -2472,7 +2471,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2472
2471
  /** 摘要里单行上限:允许构建 key 等长行也被截短。 */
2473
2472
  const MAX_LINE_CHARS = 400;
2474
2473
  /**
2475
- * 展示用格式化:宿主门禁消息里的 peerDependencies 是压缩成一行的 JSON,
2474
+ * 展示用格式化:宿主兼容性提示里的 peerDependencies 是压缩成一行的 JSON,
2476
2475
  * 直接展示像一团乱码;展开成缩进格式,解析失败则原样返回。
2477
2476
  */
2478
2477
  function formatFailureMessage(message) {
@@ -2655,9 +2654,11 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2655
2654
  /**
2656
2655
  * 失败弹窗里仓库地址的跳转目标:官网详情页(含插件收录信息),
2657
2656
  * 与 issue 正文的 Catalog 链接同一形式(单级 /plugins/{repo})。
2657
+ * 官网静态导出只生成全小写路径,GitHub 仓库名大小写不敏感,这里统一转小写,
2658
+ * 否则 HuaGuoXingKong/dsh-prompt-rewriter 这类仓库的链接会落到 404。
2658
2659
  */
2659
2660
  function pluginSiteUrl(repo) {
2660
- return siteUrl(`plugins/${repo}`);
2661
+ return siteUrl(`plugins/${repo.toLowerCase()}`);
2661
2662
  }
2662
2663
  /** 错误原因标题(对外英文):点明问题出在哪一侧,便于 issue 列表分流;
2663
2664
  * 动作级原因(未分类/超时…)带动作词,卸载失败不写成 install failed。 */
@@ -2975,7 +2976,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2975
2976
  /** 待重启列表(服务端内存态 + 本地展示信息补齐);与 queue 一样以 ref 为唯一事实来源。 */
2976
2977
  const [pendingRestarts, setPendingRestarts] = (0, react.useState)([]);
2977
2978
  const pendingRef = (0, react.useRef)([]);
2978
- /** 本次会话内安装成功插件的展示信息(目标 → 简介/版本):轮询合并待重启列表时补齐,刷新后由 resolvePending 兜底。 */
2979
+ /** 本次会话内安装成功插件的展示信息(目标 → 简介/版本):轮询合并待重启列表时补齐,刷新后由 resolvePending 补上。 */
2979
2980
  const pendingInfoRef = (0, react.useRef)(/* @__PURE__ */ new Map());
2980
2981
  /** 保持最新的 resolvePending:轮询闭包捕获的是调用那一刻的目录状态,目录晚加载时也能补齐。 */
2981
2982
  const resolvePendingRef = (0, react.useRef)(resolvePending);
@@ -2986,12 +2987,12 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
2986
2987
  const settlingRef = (0, react.useRef)(/* @__PURE__ */ new Set());
2987
2988
  /** 轮询定时器句柄(队列清空/组件卸载时清理) */
2988
2989
  const pollRef = (0, react.useRef)(null);
2989
- /** 请求在途的目标集合(同步防重):双击安装/卸载时第二击直接忽略。
2990
+ /** 请求还没返回的目标集合(同步防重):双击安装/卸载时第二击直接忽略。
2990
2991
  * 本地队列任务要等 fetch 返回后才入队,仅靠 queueRef 检查拦不住请求窗口内的重复点击。 */
2991
2992
  const submittingRef = (0, react.useRef)(/* @__PURE__ */ new Set());
2992
2993
  /** 乐观入队临时 id 计数器:递减产生唯一负数,与服务端自增正数 id 永不冲突。 */
2993
2994
  const tempIdRef = (0, react.useRef)(0);
2994
- /** 请求在途标记:弹窗据此禁用确认按钮,避免等待响应期间被再次点击。 */
2995
+ /** 请求进行中标记:弹窗据此禁用确认按钮,避免等待响应期间被再次点击。 */
2995
2996
  const [submitting, setSubmitting] = (0, react.useState)(false);
2996
2997
  /** 停止后台任务轮询(任务结束或组件卸载时清理)。 */
2997
2998
  const stopPoll = () => {
@@ -3131,7 +3132,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3131
3132
  }
3132
3133
  }, stepMs);
3133
3134
  };
3134
- /** 任务在 /active 中消失 = 已结束:查 /status 拿终态并收尾(cancelled 静默移除)。 */
3135
+ /** 任务在 /active 中消失 = 已结束:查 /status 拿终态并收尾(cancelled 直接移除)。 */
3135
3136
  const settleTask = async (q) => {
3136
3137
  let status = "failed";
3137
3138
  let lines = [];
@@ -3369,8 +3370,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3369
3370
  /** 命令行安装:用户手输 npm 包名,走 custom 源(受安全开关控制)。
3370
3371
  * update=true 时对已安装目标放行覆盖重装(与目录插件「更新」同一语义)。
3371
3372
  * channel=入口渠道(NPM 包卡片):上报服务端落日志,失败弹窗/通知据此精准溯源。
3372
- * 队列展示/防重一律用归一化身份:与服务端 /active 合并、弹窗目标匹配同口径,
3373
- * npm 包名透传不受影响。 */
3373
+ * 队列展示/防重一律用归一化身份:与服务端 /active 合并、弹窗目标匹配同一套规则,
3374
+ * npm 包名原样传递不受影响。 */
3374
3375
  const installCustom = async (raw, opts) => {
3375
3376
  const target = raw.trim();
3376
3377
  if (!target) return;
@@ -3385,7 +3386,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3385
3386
  });
3386
3387
  };
3387
3388
  /** 全局 npm 安装(官方 README 的 `npm install -g <pkgs>`):不进任何 profile、无需宿主重启。
3388
- * 队列展示/防重用包列表空格拼接的身份(与服务端 target 同口径);入口渠道固定为 npm(NPM 包卡片)。 */
3389
+ * 队列展示/防重用包列表空格拼接的身份(与服务端 target 同一套规则);入口渠道固定为 npm(NPM 包卡片)。 */
3389
3390
  const installGlobalNpm = async (pkgs, opts) => {
3390
3391
  const list = (pkgs ?? []).map((p) => p.trim()).filter((p) => p !== "");
3391
3392
  if (list.length === 0) return;
@@ -3421,6 +3422,12 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
3421
3422
  });
3422
3423
  const data = await res.json();
3423
3424
  if (!data.ok || typeof data.task !== "number") {
3425
+ if (res.status === 400 && data.error === "plugin is not installed") {
3426
+ refreshInstalled();
3427
+ clearInstalledVersion(repo);
3428
+ onUninstallDone(false, repo, false, false);
3429
+ return;
3430
+ }
3424
3431
  onError(data.error || `HTTP ${res.status}`, repo, "uninstall");
3425
3432
  return;
3426
3433
  }
@@ -4014,9 +4021,9 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4014
4021
  */
4015
4022
  /** 完成结果视图:绿色对勾 + 标题/描述;
4016
4023
  * 终态只有两种:
4017
- * - needsRestart=true(刷新解决不了:热挂载失败 / 非 dsh 插件 / 更新)→ 仅一个「立即重启」
4024
+ * - needsRestart=true(刷新解决不了:热加载失败 / 非 dsh 插件 / 更新)→ 仅一个「立即重启」
4018
4025
  * 按钮(重启会中断进行中的任务,故仍需用户确认),关闭即放弃;
4019
- * - 其余(含 needsReload=true 的「已热挂载、仅剩客户端 UI」)→ 仅「完成」按钮:关闭结果弹窗时
4026
+ * - 其余(含 needsReload=true 的「已热加载、仅剩客户端 UI」)→ 仅「完成」按钮:关闭结果弹窗时
4020
4027
  * 上层自动刷新页面让插件生效,不再给「稍后/立即刷新」手动选择。 */
4021
4028
  function ResultView({ title, desc, t, restarting, needsRestart, needsReload, bundleDeselected, onRestart, onClose }) {
4022
4029
  return (0, react.createElement)("div", { className: Modal_module_css_default.result }, (0, react.createElement)("div", { className: Modal_module_css_default.resultCheck }, (0, react.createElement)("svg", {
@@ -4510,8 +4517,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4510
4517
  * - 有更新(state='available'):标题「有新版本」,展示新版本号、发布时间与 Worker 下发的
4511
4518
  * Markdown 变更记录(renderMarkdown 渲染,双语言按界面语言取 {zh,en} 对象),
4512
4519
  * 按钮「稍后再说 / 直接更新」,确认后进入安装弹窗执行覆盖重装。
4513
- * - 暂缓提示(state='pending'):远端确有新版本,但发布未满供应链安全门槛,pnpm 此时会
4514
- * 静默回退到旧版本 —— 仍按「有新版本」展示,只给「稍后再说」,并说明稍后会自动提示。
4520
+ * - 暂缓提示(state='pending'):远端确有新版本,但发布还不满冷却期,pnpm 此时会
4521
+ * 不提示地回退到旧版本 —— 仍按「有新版本」展示,只给「稍后再说」,并说明稍后会自动提示。
4515
4522
  * - 无更新 / 信息缺失(state='latest' / 'none'):标题「当前版本」,版本号与本机版本取自
4516
4523
  * currentVersion(构建注入的 PLUGIN_VERSION),**不得**用远端最新版号冒充本机版本。
4517
4524
  * 点击头部版本号(或「可更新」徽标)打开 —— 无论有无更新都能看到更新内容。
@@ -5213,42 +5220,42 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5213
5220
  css: css$9
5214
5221
  });
5215
5222
  var List_module_css_default = {
5223
+ "topics": "_3XaZHa_topics",
5224
+ "card": "_3XaZHa_card",
5225
+ "cardMain": "_3XaZHa_cardMain",
5226
+ "body": "_3XaZHa_body",
5216
5227
  "cardBadgeRow": "_3XaZHa_cardBadgeRow",
5217
- "fork": "_3XaZHa_fork",
5218
5228
  "detailBtn": "_3XaZHa_detailBtn",
5219
- "installBtnCopied": "_3XaZHa_installBtnCopied",
5220
- "diagBtn": "_3XaZHa_diagBtn",
5229
+ "stateTitle": "_3XaZHa_stateTitle",
5230
+ "retryBtn": "_3XaZHa_retryBtn",
5231
+ "moreSentinel": "_3XaZHa_moreSentinel",
5232
+ "cardSide": "_3XaZHa_cardSide",
5221
5233
  "footLink": "_3XaZHa_footLink",
5234
+ "star": "_3XaZHa_star",
5235
+ "installBtnUpdate": "_3XaZHa_installBtnUpdate",
5236
+ "state": "_3XaZHa_state",
5237
+ "cardTitle": "_3XaZHa_cardTitle",
5222
5238
  "verified": "_3XaZHa_verified",
5239
+ "diagBtn": "_3XaZHa_diagBtn",
5240
+ "actions": "_3XaZHa_actions",
5241
+ "updateBadge": "_3XaZHa_updateBadge",
5223
5242
  "desc": "_3XaZHa_desc",
5224
- "cardTitle": "_3XaZHa_cardTitle",
5225
- "cardMain": "_3XaZHa_cardMain",
5243
+ "authorBadge": "_3XaZHa_authorBadge",
5244
+ "topic": "_3XaZHa_topic",
5245
+ "installBtnCopied": "_3XaZHa_installBtnCopied",
5226
5246
  "versionBadge": "_3XaZHa_versionBadge",
5227
- "card": "_3XaZHa_card",
5228
- "body": "_3XaZHa_body",
5229
- "installBtn": "_3XaZHa_installBtn",
5230
- "installBtnInstalled": "_3XaZHa_installBtnInstalled",
5231
- "installBtnUpdate": "_3XaZHa_installBtnUpdate",
5232
- "uninstallBtn": "_3XaZHa_uninstallBtn",
5247
+ "list": "_3XaZHa_list",
5248
+ "cardTitleRow": "_3XaZHa_cardTitleRow",
5233
5249
  "footer": "_3XaZHa_footer",
5234
- "topic": "_3XaZHa_topic",
5235
5250
  "categoryBadge": "_3XaZHa_categoryBadge",
5236
- "topics": "_3XaZHa_topics",
5237
- "state": "_3XaZHa_state",
5238
- "cardTitleRow": "_3XaZHa_cardTitleRow",
5239
- "authorBadge": "_3XaZHa_authorBadge",
5251
+ "installBtn": "_3XaZHa_installBtn",
5240
5252
  "stateActions": "_3XaZHa_stateActions",
5241
- "cardSide": "_3XaZHa_cardSide",
5253
+ "installBtnInstalled": "_3XaZHa_installBtnInstalled",
5254
+ "stateDesc": "_3XaZHa_stateDesc",
5242
5255
  "date": "_3XaZHa_date",
5243
- "updateBadge": "_3XaZHa_updateBadge",
5256
+ "fork": "_3XaZHa_fork",
5244
5257
  "stats": "_3XaZHa_stats",
5245
- "stateTitle": "_3XaZHa_stateTitle",
5246
- "stateDesc": "_3XaZHa_stateDesc",
5247
- "star": "_3XaZHa_star",
5248
- "retryBtn": "_3XaZHa_retryBtn",
5249
- "moreSentinel": "_3XaZHa_moreSentinel",
5250
- "actions": "_3XaZHa_actions",
5251
- "list": "_3XaZHa_list"
5258
+ "uninstallBtn": "_3XaZHa_uninstallBtn"
5252
5259
  };
5253
5260
  //#endregion
5254
5261
  //#region src/client/hooks/useIncrementalList.ts
@@ -5469,16 +5476,16 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5469
5476
  css: css$8
5470
5477
  });
5471
5478
  var SectionTabs_module_css_default = {
5479
+ "noticeIcon": "_7tvizq_noticeIcon",
5480
+ "noticeCount": "_7tvizq_noticeCount",
5481
+ "noticeBtn": "_7tvizq_noticeBtn",
5482
+ "tabCountActive": "_7tvizq_tabCountActive",
5472
5483
  "tabLabel": "_7tvizq_tabLabel",
5473
5484
  "tab": "_7tvizq_tab",
5485
+ "tabActive": "_7tvizq_tabActive",
5474
5486
  "root": "_7tvizq_root",
5475
5487
  "tabIcon": "_7tvizq_tabIcon",
5476
- "tabCount": "_7tvizq_tabCount",
5477
- "tabActive": "_7tvizq_tabActive",
5478
- "noticeBtn": "_7tvizq_noticeBtn",
5479
- "noticeIcon": "_7tvizq_noticeIcon",
5480
- "noticeCount": "_7tvizq_noticeCount",
5481
- "tabCountActive": "_7tvizq_tabCountActive"
5488
+ "tabCount": "_7tvizq_tabCount"
5482
5489
  };
5483
5490
  //#endregion
5484
5491
  //#region src/client/components/layout/SectionTabs.tsx
@@ -5554,46 +5561,46 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5554
5561
  css: css$7
5555
5562
  });
5556
5563
  var InstalledView_module_css_default = {
5564
+ "searchWrap": "_1nXeGW_searchWrap",
5565
+ "rowRepo": "_1nXeGW_rowRepo",
5566
+ "list": "_1nXeGW_list",
5567
+ "row": "_1nXeGW_row",
5557
5568
  "exampleBadge": "_1nXeGW_exampleBadge",
5558
- "statusInactive": "_1nXeGW_statusInactive",
5569
+ "segGroup": "_1nXeGW_segGroup",
5559
5570
  "rowDesc": "_1nXeGW_rowDesc",
5560
- "emptyDesc": "_1nXeGW_emptyDesc",
5561
- "statusDot": "_1nXeGW_statusDot",
5562
- "segRow": "_1nXeGW_segRow",
5563
5571
  "rowMain": "_1nXeGW_rowMain",
5564
- "emptyTitle": "_1nXeGW_emptyTitle",
5565
- "rowStats": "_1nXeGW_rowStats",
5566
- "list": "_1nXeGW_list",
5567
- "rowFork": "_1nXeGW_rowFork",
5572
+ "versionBadge": "_1nXeGW_versionBadge",
5573
+ "statusInactive": "_1nXeGW_statusInactive",
5574
+ "rowDetail": "_1nXeGW_rowDetail",
5575
+ "exampleRow": "_1nXeGW_exampleRow",
5576
+ "rowSourceTag": "_1nXeGW_rowSourceTag",
5577
+ "statusDot": "_1nXeGW_statusDot",
5578
+ "rowTitle": "_1nXeGW_rowTitle",
5579
+ "rowMeta": "_1nXeGW_rowMeta",
5568
5580
  "rowSourceTagHub": "_1nXeGW_rowSourceTagHub",
5569
- "rowCategory": "_1nXeGW_rowCategory",
5570
- "toolbar": "_1nXeGW_toolbar",
5571
- "searchInput": "_1nXeGW_searchInput",
5572
- "row": "_1nXeGW_row",
5573
- "rowSourceTagManual": "_1nXeGW_rowSourceTagManual",
5574
5581
  "segBtnActive": "_1nXeGW_segBtnActive",
5575
- "updateBadge": "_1nXeGW_updateBadge",
5576
- "rowActions": "_1nXeGW_rowActions",
5577
5582
  "rowRestart": "_1nXeGW_rowRestart",
5578
- "statusPending": "_1nXeGW_statusPending",
5579
- "searchWrap": "_1nXeGW_searchWrap",
5580
- "root": "_1nXeGW_root",
5581
- "rowTitleLine": "_1nXeGW_rowTitleLine",
5582
- "rowTitle": "_1nXeGW_rowTitle",
5583
- "rowActionLine": "_1nXeGW_rowActionLine",
5583
+ "segLabel": "_1nXeGW_segLabel",
5584
+ "rowStats": "_1nXeGW_rowStats",
5585
+ "rowActions": "_1nXeGW_rowActions",
5584
5586
  "segBtn": "_1nXeGW_segBtn",
5585
- "rowRepo": "_1nXeGW_rowRepo",
5586
- "rowSourceTag": "_1nXeGW_rowSourceTag",
5587
- "versionBadge": "_1nXeGW_versionBadge",
5588
- "empty": "_1nXeGW_empty",
5589
- "rowMeta": "_1nXeGW_rowMeta",
5587
+ "toolbar": "_1nXeGW_toolbar",
5588
+ "emptyDesc": "_1nXeGW_emptyDesc",
5590
5589
  "rowStar": "_1nXeGW_rowStar",
5591
- "segLabel": "_1nXeGW_segLabel",
5592
- "segGroup": "_1nXeGW_segGroup",
5593
- "rowDetail": "_1nXeGW_rowDetail",
5590
+ "root": "_1nXeGW_root",
5591
+ "emptyTitle": "_1nXeGW_emptyTitle",
5592
+ "updateBadge": "_1nXeGW_updateBadge",
5593
+ "statusPending": "_1nXeGW_statusPending",
5594
+ "rowSourceTagManual": "_1nXeGW_rowSourceTagManual",
5595
+ "segRow": "_1nXeGW_segRow",
5596
+ "rowActionLine": "_1nXeGW_rowActionLine",
5597
+ "rowCategory": "_1nXeGW_rowCategory",
5594
5598
  "rowUpdate": "_1nXeGW_rowUpdate",
5599
+ "rowFork": "_1nXeGW_rowFork",
5600
+ "searchInput": "_1nXeGW_searchInput",
5601
+ "empty": "_1nXeGW_empty",
5595
5602
  "rowUninstall": "_1nXeGW_rowUninstall",
5596
- "exampleRow": "_1nXeGW_exampleRow"
5603
+ "rowTitleLine": "_1nXeGW_rowTitleLine"
5597
5604
  };
5598
5605
  //#endregion
5599
5606
  //#region src/client/components/views/InstalledView.tsx
@@ -5862,27 +5869,27 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5862
5869
  css: css$6
5863
5870
  });
5864
5871
  var CustomInstallView_module_css_default = {
5872
+ "helpLine": "zISxCG_helpLine",
5873
+ "installInput": "zISxCG_installInput",
5874
+ "installCard": "zISxCG_installCard",
5875
+ "installInputError": "zISxCG_installInputError",
5876
+ "installCardDisabled": "zISxCG_installCardDisabled",
5877
+ "installRow": "zISxCG_installRow",
5878
+ "channelOffText": "zISxCG_channelOffText",
5879
+ "helpCmd": "zISxCG_helpCmd",
5880
+ "root": "zISxCG_root",
5865
5881
  "installHelpBtn": "zISxCG_installHelpBtn",
5866
5882
  "installBtn": "zISxCG_installBtn",
5883
+ "channelOffBtn": "zISxCG_channelOffBtn",
5884
+ "helpBody": "zISxCG_helpBody",
5867
5885
  "installCards": "zISxCG_installCards",
5868
- "installInputError": "zISxCG_installInputError",
5869
- "installCard": "zISxCG_installCard",
5870
- "installInput": "zISxCG_installInput",
5871
- "installError": "zISxCG_installError",
5872
5886
  "desc": "zISxCG_desc",
5887
+ "installError": "zISxCG_installError",
5888
+ "helpNote": "zISxCG_helpNote",
5873
5889
  "channelOff": "zISxCG_channelOff",
5874
- "channelOffText": "zISxCG_channelOffText",
5875
- "root": "zISxCG_root",
5876
- "installCardHead": "zISxCG_installCardHead",
5877
5890
  "installLabel": "zISxCG_installLabel",
5878
- "helpBody": "zISxCG_helpBody",
5879
- "helpLine": "zISxCG_helpLine",
5880
- "channelOffBtn": "zISxCG_channelOffBtn",
5881
- "helpNote": "zISxCG_helpNote",
5882
- "installRow": "zISxCG_installRow",
5883
- "installCardDisabled": "zISxCG_installCardDisabled",
5884
- "helpCmd": "zISxCG_helpCmd",
5885
- "installExample": "zISxCG_installExample"
5891
+ "installExample": "zISxCG_installExample",
5892
+ "installCardHead": "zISxCG_installCardHead"
5886
5893
  };
5887
5894
  //#endregion
5888
5895
  //#region src/client/components/views/CustomInstallView.tsx
@@ -5901,13 +5908,13 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5901
5908
  /** npm 包名(含 @scope/pkg) */
5902
5909
  const NPM_PACKAGE_RE = /^(?:@[a-z0-9._-]+\/)?[a-z0-9._-]+$/;
5903
5910
  /** npm 全局安装命令(官方 README 格式,如 `npm install -g @deepseek-ai/dsh @deepseek-harness-tui/dsh-tui`)——
5904
- * 提取 -g 之后的包列表;任一包名非法返回 null(交给格式错误提示)。与 server 端 globalNpmPackagesOf 口径一致。 */
5911
+ * 提取 -g 之后的包列表;任一包名非法返回 null(交给格式错误提示)。与 server 端 globalNpmPackagesOf 规则一致。 */
5905
5912
  const NPM_GLOBAL_CMD_RE = /^npm\s+(?:install|i)\s+(?:-g|--global)\s+(.+)$/i;
5906
5913
  /** 常规 npm/pnpm 安装命令(装进当前 profile,如 `npm install lodash`、`pnpm add @scope/pkg`)——
5907
5914
  * 提取命令后的包列表;包列表在 splitPackages 里逐个校验。 */
5908
5915
  const NPM_INSTALL_CMD_RE = /^(?:npm\s+(?:install|i)|pnpm\s+(?:add|i|install))\s+(.+)$/i;
5909
5916
  /** 空格分隔的包列表:逐个按 npm 包名语法校验 + 拒绝以 - 开头的 token(npm 会把 --xxx 当参数而非包名),
5910
- * 任一非法返回 null(交给格式错误提示)。与 server 端 globalNpmPackagesOf 同口径。 */
5917
+ * 任一非法返回 null(交给格式错误提示)。与 server 端 globalNpmPackagesOf 同一套规则。 */
5911
5918
  function splitPackages(raw) {
5912
5919
  const packages = raw.trim().split(/\s+/).filter((p) => p !== "");
5913
5920
  if (packages.length === 0 || packages.some((p) => !NPM_PACKAGE_RE.test(p) || p.startsWith("-"))) return null;
@@ -6038,30 +6045,30 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6038
6045
  css: css$5
6039
6046
  });
6040
6047
  var SettingsView_module_css_default = {
6041
- "pageTitle": "_506LLG_pageTitle",
6042
- "proxyHint": "_506LLG_proxyHint",
6043
- "settingDesc": "_506LLG_settingDesc",
6044
- "card": "_506LLG_card",
6048
+ "content": "_506LLG_content",
6049
+ "settingControl": "_506LLG_settingControl",
6050
+ "pageDesc": "_506LLG_pageDesc",
6051
+ "sidebar": "_506LLG_sidebar",
6045
6052
  "pageHeader": "_506LLG_pageHeader",
6053
+ "navIcon": "_506LLG_navIcon",
6054
+ "settingLabel": "_506LLG_settingLabel",
6046
6055
  "settingControlStack": "_506LLG_settingControlStack",
6056
+ "settingRow": "_506LLG_settingRow",
6057
+ "pageTitle": "_506LLG_pageTitle",
6058
+ "navItemActive": "_506LLG_navItemActive",
6059
+ "root": "_506LLG_root",
6047
6060
  "textInput": "_506LLG_textInput",
6061
+ "navItem": "_506LLG_navItem",
6048
6062
  "proxyControl": "_506LLG_proxyControl",
6049
- "sidebar": "_506LLG_sidebar",
6050
6063
  "proxyHintFail": "_506LLG_proxyHintFail",
6051
- "settingRowStack": "_506LLG_settingRowStack",
6052
- "settingTitle": "_506LLG_settingTitle",
6053
- "settingControl": "_506LLG_settingControl",
6054
- "resetBtn": "_506LLG_resetBtn",
6055
- "content": "_506LLG_content",
6056
6064
  "controlDropdown": "_506LLG_controlDropdown",
6057
- "navIcon": "_506LLG_navIcon",
6058
- "navItemActive": "_506LLG_navItemActive",
6059
- "navItem": "_506LLG_navItem",
6060
- "pageDesc": "_506LLG_pageDesc",
6061
- "settingRow": "_506LLG_settingRow",
6062
- "root": "_506LLG_root",
6063
- "settingLabel": "_506LLG_settingLabel",
6064
- "proxyHintOk": "_506LLG_proxyHintOk"
6065
+ "resetBtn": "_506LLG_resetBtn",
6066
+ "settingTitle": "_506LLG_settingTitle",
6067
+ "card": "_506LLG_card",
6068
+ "settingRowStack": "_506LLG_settingRowStack",
6069
+ "proxyHint": "_506LLG_proxyHint",
6070
+ "proxyHintOk": "_506LLG_proxyHintOk",
6071
+ "settingDesc": "_506LLG_settingDesc"
6065
6072
  };
6066
6073
  //#endregion
6067
6074
  //#region \0dsh-css:src/client/styles/Dropdown.module.css.mjs
@@ -6080,18 +6087,18 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6080
6087
  css: css$4
6081
6088
  });
6082
6089
  var Dropdown_module_css_default = {
6090
+ "dropdownLabel": "B_Gxsq_dropdownLabel",
6091
+ "dropdownArrowOpen": "B_Gxsq_dropdownArrowOpen",
6083
6092
  "dropdownFill": "B_Gxsq_dropdownFill",
6084
- "dropdownArrow": "B_Gxsq_dropdownArrow",
6085
- "dropdownPanel": "B_Gxsq_dropdownPanel",
6093
+ "dropdownBtn": "B_Gxsq_dropdownBtn",
6094
+ "dropdownCount": "B_Gxsq_dropdownCount",
6086
6095
  "dropdownItemActive": "B_Gxsq_dropdownItemActive",
6087
- "dropdownLabel": "B_Gxsq_dropdownLabel",
6088
6096
  "dropdown": "B_Gxsq_dropdown",
6097
+ "dropdownArrow": "B_Gxsq_dropdownArrow",
6098
+ "dropdownItem": "B_Gxsq_dropdownItem",
6089
6099
  "dropdownItemLabel": "B_Gxsq_dropdownItemLabel",
6090
- "dropdownCount": "B_Gxsq_dropdownCount",
6091
6100
  "dropdownCountActive": "B_Gxsq_dropdownCountActive",
6092
- "dropdownItem": "B_Gxsq_dropdownItem",
6093
- "dropdownArrowOpen": "B_Gxsq_dropdownArrowOpen",
6094
- "dropdownBtn": "B_Gxsq_dropdownBtn"
6101
+ "dropdownPanel": "B_Gxsq_dropdownPanel"
6095
6102
  };
6096
6103
  //#endregion
6097
6104
  //#region \0dsh-css:src/client/styles/Toggle.module.css.mjs
@@ -6110,9 +6117,9 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6110
6117
  css: css$3
6111
6118
  });
6112
6119
  var Toggle_module_css_default = {
6120
+ "toggle": "k-cD4G_toggle",
6113
6121
  "toggleOn": "k-cD4G_toggleOn",
6114
- "knob": "k-cD4G_knob",
6115
- "toggle": "k-cD4G_toggle"
6122
+ "knob": "k-cD4G_knob"
6116
6123
  };
6117
6124
  //#endregion
6118
6125
  //#region src/client/components/ui/Toggle.tsx
@@ -6209,29 +6216,29 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6209
6216
  css: css$2
6210
6217
  });
6211
6218
  var DiagnosticsView_module_css_default = {
6212
- "badgeIdle": "k9eRya_badgeIdle",
6213
- "head": "k9eRya_head",
6214
- "summary": "k9eRya_summary",
6219
+ "envLabel": "k9eRya_envLabel",
6220
+ "headHint": "k9eRya_headHint",
6221
+ "badgeRunning": "k9eRya_badgeRunning",
6222
+ "summaryRunning": "k9eRya_summaryRunning",
6223
+ "display": "k9eRya_display",
6224
+ "badge": "k9eRya_badge",
6225
+ "envCopyBtn": "k9eRya_envCopyBtn",
6226
+ "envTitle": "k9eRya_envTitle",
6215
6227
  "runBtn": "k9eRya_runBtn",
6216
6228
  "envRow": "k9eRya_envRow",
6217
- "display": "k9eRya_display",
6218
6229
  "envDesc": "k9eRya_envDesc",
6219
- "summaryRunning": "k9eRya_summaryRunning",
6220
- "meta": "k9eRya_meta",
6221
- "badge": "k9eRya_badge",
6222
- "row": "k9eRya_row",
6223
6230
  "name": "k9eRya_name",
6224
- "badgeFail": "k9eRya_badgeFail",
6231
+ "badgeOk": "k9eRya_badgeOk",
6225
6232
  "diagPulse": "k9eRya_diagPulse",
6226
- "summaryOk": "k9eRya_summaryOk",
6227
- "summaryFail": "k9eRya_summaryFail",
6228
- "envCopyBtn": "k9eRya_envCopyBtn",
6229
- "headHint": "k9eRya_headHint",
6230
- "envLabel": "k9eRya_envLabel",
6233
+ "meta": "k9eRya_meta",
6231
6234
  "panel": "k9eRya_panel",
6232
- "envTitle": "k9eRya_envTitle",
6233
- "badgeOk": "k9eRya_badgeOk",
6234
- "badgeRunning": "k9eRya_badgeRunning"
6235
+ "badgeFail": "k9eRya_badgeFail",
6236
+ "head": "k9eRya_head",
6237
+ "summary": "k9eRya_summary",
6238
+ "badgeIdle": "k9eRya_badgeIdle",
6239
+ "row": "k9eRya_row",
6240
+ "summaryFail": "k9eRya_summaryFail",
6241
+ "summaryOk": "k9eRya_summaryOk"
6235
6242
  };
6236
6243
  //#endregion
6237
6244
  //#region src/client/components/views/DiagnosticsView.tsx
@@ -6406,57 +6413,57 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6406
6413
  css: css$1
6407
6414
  });
6408
6415
  var LogsView_module_css_default = {
6416
+ "btn": "_3j77BW_btn",
6417
+ "head": "_3j77BW_head",
6418
+ "foot": "_3j77BW_foot",
6419
+ "previewRow": "_3j77BW_previewRow",
6420
+ "catBadge": "_3j77BW_catBadge",
6421
+ "catUninstall": "_3j77BW_catUninstall",
6422
+ "message": "_3j77BW_message",
6423
+ "pathDialogDesc": "_3j77BW_pathDialogDesc",
6424
+ "pathDialogReset": "_3j77BW_pathDialogReset",
6425
+ "pathDialogHint": "_3j77BW_pathDialogHint",
6409
6426
  "filterChipActive": "_3j77BW_filterChipActive",
6410
- "headActions": "_3j77BW_headActions",
6411
- "pathLabel": "_3j77BW_pathLabel",
6412
- "actions": "_3j77BW_actions",
6427
+ "footCount": "_3j77BW_footCount",
6428
+ "catUpdate": "_3j77BW_catUpdate",
6413
6429
  "pathDraft": "_3j77BW_pathDraft",
6414
- "btn": "_3j77BW_btn",
6430
+ "filterBar": "_3j77BW_filterBar",
6431
+ "headHint": "_3j77BW_headHint",
6432
+ "badge": "_3j77BW_badge",
6433
+ "footActions": "_3j77BW_footActions",
6434
+ "pathRow": "_3j77BW_pathRow",
6435
+ "catInstall": "_3j77BW_catInstall",
6436
+ "panel": "_3j77BW_panel",
6437
+ "pathDialogFoot": "_3j77BW_pathDialogFoot",
6438
+ "search": "_3j77BW_search",
6439
+ "searchInput": "_3j77BW_searchInput",
6440
+ "pathDialog": "_3j77BW_pathDialog",
6441
+ "badgeInfo": "_3j77BW_badgeInfo",
6442
+ "catSystem": "_3j77BW_catSystem",
6443
+ "empty": "_3j77BW_empty",
6415
6444
  "list": "_3j77BW_list",
6416
- "entry": "_3j77BW_entry",
6417
6445
  "footFail": "_3j77BW_footFail",
6446
+ "badgeWarn": "_3j77BW_badgeWarn",
6418
6447
  "filterChip": "_3j77BW_filterChip",
6448
+ "clearBtn": "_3j77BW_clearBtn",
6449
+ "actions": "_3j77BW_actions",
6450
+ "time": "_3j77BW_time",
6451
+ "event": "_3j77BW_event",
6452
+ "footPath": "_3j77BW_footPath",
6453
+ "logList": "_3j77BW_logList",
6454
+ "pathText": "_3j77BW_pathText",
6419
6455
  "more": "_3j77BW_more",
6420
- "moreEnd": "_3j77BW_moreEnd",
6421
- "pathDialogReset": "_3j77BW_pathDialogReset",
6422
- "footCount": "_3j77BW_footCount",
6423
6456
  "badgeSuccess": "_3j77BW_badgeSuccess",
6424
- "pathDialogDesc": "_3j77BW_pathDialogDesc",
6425
6457
  "badgeError": "_3j77BW_badgeError",
6426
- "badgeWarn": "_3j77BW_badgeWarn",
6427
- "head": "_3j77BW_head",
6428
- "logList": "_3j77BW_logList",
6429
- "badgeDebug": "_3j77BW_badgeDebug",
6430
- "catSettings": "_3j77BW_catSettings",
6431
- "badge": "_3j77BW_badge",
6432
- "empty": "_3j77BW_empty",
6433
- "headHint": "_3j77BW_headHint",
6434
- "pathRow": "_3j77BW_pathRow",
6458
+ "pathLabel": "_3j77BW_pathLabel",
6435
6459
  "pathDialogRow": "_3j77BW_pathDialogRow",
6436
- "time": "_3j77BW_time",
6437
- "event": "_3j77BW_event",
6438
- "footPath": "_3j77BW_footPath",
6439
6460
  "catDiagnostics": "_3j77BW_catDiagnostics",
6440
- "badgeInfo": "_3j77BW_badgeInfo",
6441
- "panel": "_3j77BW_panel",
6442
- "catInstall": "_3j77BW_catInstall",
6443
- "catSystem": "_3j77BW_catSystem",
6444
- "catUpdate": "_3j77BW_catUpdate",
6461
+ "moreEnd": "_3j77BW_moreEnd",
6462
+ "badgeDebug": "_3j77BW_badgeDebug",
6463
+ "entry": "_3j77BW_entry",
6445
6464
  "linkBtn": "_3j77BW_linkBtn",
6446
- "pathDialogFoot": "_3j77BW_pathDialogFoot",
6447
- "message": "_3j77BW_message",
6448
- "filterBar": "_3j77BW_filterBar",
6449
- "footActions": "_3j77BW_footActions",
6450
- "search": "_3j77BW_search",
6451
- "previewRow": "_3j77BW_previewRow",
6452
- "catBadge": "_3j77BW_catBadge",
6453
- "clearBtn": "_3j77BW_clearBtn",
6454
- "catUninstall": "_3j77BW_catUninstall",
6455
- "foot": "_3j77BW_foot",
6456
- "searchInput": "_3j77BW_searchInput",
6457
- "pathText": "_3j77BW_pathText",
6458
- "pathDialog": "_3j77BW_pathDialog",
6459
- "pathDialogHint": "_3j77BW_pathDialogHint"
6465
+ "catSettings": "_3j77BW_catSettings",
6466
+ "headActions": "_3j77BW_headActions"
6460
6467
  };
6461
6468
  //#endregion
6462
6469
  //#region src/client/components/modals/LogsModal.tsx
@@ -6817,7 +6824,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6817
6824
  setSaving(false);
6818
6825
  }
6819
6826
  };
6820
- /** 选择目录:系统对话框从默认位置打开,选中路径回填输入框(仍可手改)。 */
6827
+ /** 选择目录:系统对话框从默认位置打开,选中路径填入输入框(仍可手改)。 */
6821
6828
  const browse = async () => {
6822
6829
  if (browsing) return;
6823
6830
  setBrowsing(true);
@@ -7015,7 +7022,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
7015
7022
  *
7016
7023
  * 各分组对应本地服务端实际强制的行为:
7017
7024
  * 更新与源 —— 启动检查更新 / npm 镜像 / HTTP 代理(都接进安装命令链路)
7018
- * 安全与信任 —— 受限的自定义安装(服务端 403 门禁)
7025
+ * 安全与信任 —— 受限的自定义安装(服务端 403 拦截)
7019
7026
  * 诊断 —— 实时连通性探测 + 环境快照
7020
7027
  * 日志 —— 系统日志查看器 + 存放位置
7021
7028
  */
@@ -7295,10 +7302,10 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
7295
7302
  const [confirmPlugin, setConfirmPlugin] = (0, react.useState)(null);
7296
7303
  /** 弹窗动作是否为「更新」:已安装插件点「更新」→ 走同一条 add 命令原位覆盖重装,文案区分安装/更新 */
7297
7304
  const [confirmIsUpdate, setConfirmIsUpdate] = (0, react.useState)(false);
7298
- /** 安装要钉住的精确版本:Hub 连续发版时提示的旧一版、以及新安装的「已过供应链门禁」版本,
7299
- * 都必须钉住,否则 @latest 会被 pnpm 门禁带回门禁内的版本或静默回退到很旧的版本。 */
7305
+ /** 安装要锁定的精确版本:自我更新提示的版本、新安装的已过冷却期版本都要锁定,
7306
+ * 否则 @latest 会被 pnpm 带回冷却期内的旧版。 */
7300
7307
  const [confirmPinVersion, setConfirmPinVersion] = (0, react.useState)(null);
7301
- /** 门禁版本查询的在途序号:只采用最后一次弹窗的查询结果,避免切换插件后旧结果覆盖 */
7308
+ /** 冷却期查询的进行中序号:只采用最后一次弹窗的查询结果,避免切换插件后旧结果覆盖 */
7302
7309
  const installPinSeq = (0, react.useRef)(0);
7303
7310
  /** 命令行安装确认弹窗:记录待安装的裸目标(npm 包名)——
7304
7311
  * 与应用商店同一套确认/进度/结果弹窗,提供时 plugin 传 null 走 customTarget 模式 */
@@ -7325,12 +7332,12 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
7325
7332
  /** 安装/卸载完成后的结果视图:停留弹窗内,点「完成」关闭 */
7326
7333
  const [installDone, setInstallDone] = (0, react.useState)(false);
7327
7334
  const [uninstallDone, setUninstallDone] = (0, react.useState)(false);
7328
- /** 结果视图是否给「立即重启」:服务端任务终态带出。仅刷新解决不了的兜底场景
7329
- * (热挂载失败 / 非 dsh 插件 / 更新)为 true;其余(热挂载成功、卸载已即时停用)为 false,
7335
+ /** 结果视图是否给「立即重启」:服务端任务终态带出。仅刷新解决不了的例外场景
7336
+ * (热加载失败 / 非 dsh 插件 / 更新)为 true;其余(热加载成功、卸载已即时停用)为 false,
7330
7337
  * 结果视图只给「完成」,关闭时自动刷新页面生效 */
7331
7338
  const [installNeedsRestart, setInstallNeedsRestart] = (0, react.useState)(false);
7332
7339
  const [uninstallNeedsRestart, setUninstallNeedsRestart] = (0, react.useState)(false);
7333
- /** 结果视图是否显示「关闭后自动刷新」说明:插件已热挂进运行中 loader(安装)、或卸载后
7340
+ /** 结果视图是否显示「关闭后自动刷新」说明:插件已热加载进运行中 loader(安装)、或卸载后
7334
7341
  * 插件面板仍残留在当前页面(卸载)。关闭弹窗即整页刷新,不给手动刷新按钮。 */
7335
7342
  const [installNeedsReload, setInstallNeedsReload] = (0, react.useState)(false);
7336
7343
  /** 市场自更新成功、但 profile 的 bundle 列表里已不含 dsh-plugin:结果页提示重新勾选 */
@@ -7420,7 +7427,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
7420
7427
  });
7421
7428
  setNotifications(addFailure({
7422
7429
  kind,
7423
- action: update ? "update" : "install",
7430
+ action: update ? "update" : kind === "uninstall" ? "uninstall" : "install",
7424
7431
  repo: repo ?? "",
7425
7432
  message,
7426
7433
  command,
@@ -7512,7 +7519,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
7512
7519
  const timer = window.setTimeout(() => setToast(null), 2400);
7513
7520
  return () => window.clearTimeout(timer);
7514
7521
  }, [toast]);
7515
- /** 复制文本到剪贴板,返回是否成功(Clipboard API + 隐藏 textarea 兜底)。 */
7522
+ /** 复制文本到剪贴板,返回是否成功(Clipboard API + 隐藏 textarea 作为后备)。 */
7516
7523
  const doCopy = async (text) => {
7517
7524
  try {
7518
7525
  await navigator.clipboard.writeText(text);
@@ -7534,7 +7541,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
7534
7541
  return ok;
7535
7542
  }
7536
7543
  };
7537
- /** 命令行安装目标是否已安装(与服务端 already 判定同口径):GitHub 地址按仓库身份匹配
7544
+ /** 命令行安装目标是否已安装(与服务端 already 判定同一套规则):GitHub 地址按仓库身份匹配
7538
7545
  * (归一化后比对已装项的 repo/spec),npm 包名按依赖 key 直查。命中 → 弹窗转「更新」语义
7539
7546
  * (mode=update 放行覆盖重装),避免重复点击撞 409 报错。 */
7540
7547
  const customTargetInstalled = (raw) => {
@@ -7561,8 +7568,8 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
7561
7568
  }
7562
7569
  setConfirmPlugin(null);
7563
7570
  };
7564
- /** 新安装先查「已过 pnpm 供应链门禁」的版本:命令条与执行都钉住它,
7565
- * 否则 pnpm 会把发布未满 24h 的最新版静默回退成很旧的版本。查不到则不钉,由服务端兜底解析。 */
7571
+ /** 新安装先查「已过 pnpm 发布冷却期」的版本:命令条与执行都锁定它,
7572
+ * 否则 pnpm 会把发布未满 24h 的最新版不提示地回退成很旧的版本。查不到则不锁定,由服务端再解析一次。 */
7566
7573
  const resolveInstallPin = (p) => {
7567
7574
  if (p.install?.command !== void 0 && p.install.command !== "") return;
7568
7575
  const pkg = installTargetOf(p);
@@ -7592,7 +7599,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
7592
7599
  });
7593
7600
  };
7594
7601
  /** 「立即重启」:POST 同源 /restart,宿主进程自杀重启;随后轮询服务恢复后整页刷新。
7595
- * 只在刷新解决不了的兜底场景(热挂载失败 / 非 dsh 插件 / 更新)出现。
7602
+ * 只在刷新解决不了的例外场景(热加载失败 / 非 dsh 插件 / 更新)出现。
7596
7603
  * 桌面端宿主归应用壳管(服务端回 `desktop: true` 且不重启):不轮询,改提示退出重开。 */
7597
7604
  const requestRestart = async () => {
7598
7605
  if (restarting) return;
@@ -7749,7 +7756,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
7749
7756
  openSection: settingsSection,
7750
7757
  onConsumedOpenSection: () => setSettingsSection(null)
7751
7758
  }), showHubUpdate && (0, react.createElement)(HubUpdateModal, {
7752
- info: catalog.hubUpdateTarget ?? catalog.hubUpdateInfo ?? { version: "2.3.2" },
7759
+ info: catalog.hubUpdateTarget ?? catalog.hubUpdateInfo ?? { version: "2.3.4" },
7753
7760
  state: catalog.hubUpdateState,
7754
7761
  currentVersion: catalog.hubCurrentVersion,
7755
7762
  lang,