dsh-plugin 1.4.10 → 1.4.11

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.
package/client/client.js CHANGED
@@ -698,42 +698,42 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
698
698
  css: css$11
699
699
  });
700
700
  var Header_module_css_default = {
701
- "title": "qikqja_title",
701
+ "logoIcon": "qikqja_logoIcon",
702
+ "segBtn": "qikqja_segBtn",
703
+ "aboutBtn": "qikqja_aboutBtn",
704
+ "brandTitle": "qikqja_brandTitle",
705
+ "versionBtn": "qikqja_versionBtn",
706
+ "sortGroup": "qikqja_sortGroup",
702
707
  "segGroup": "qikqja_segGroup",
703
- "tabActive": "qikqja_tabActive",
704
708
  "search": "qikqja_search",
705
- "copyIcon": "qikqja_copyIcon",
706
- "headerTitleRow": "qikqja_headerTitleRow",
707
- "taglineLink": "qikqja_taglineLink",
708
- "resultSeg": "qikqja_resultSeg",
709
- "aboutBtn": "qikqja_aboutBtn",
710
- "adText": "qikqja_adText",
711
- "tab": "qikqja_tab",
712
709
  "tabCount": "qikqja_tabCount",
710
+ "searchRow": "qikqja_searchRow",
711
+ "githubIcon": "qikqja_githubIcon",
712
+ "controls": "qikqja_controls",
713
+ "headerRight": "qikqja_headerRight",
714
+ "tab": "qikqja_tab",
715
+ "langBtn": "qikqja_langBtn",
713
716
  "adBadge": "qikqja_adBadge",
714
- "githubLink": "qikqja_githubLink",
715
- "sortGroup": "qikqja_sortGroup",
716
- "segBtnActive": "qikqja_segBtnActive",
717
- "versionBtn": "qikqja_versionBtn",
717
+ "segLabel": "qikqja_segLabel",
718
718
  "tabsRow": "qikqja_tabsRow",
719
- "root": "qikqja_root",
720
- "searchRow": "qikqja_searchRow",
721
- "version": "qikqja_version",
722
- "logoIcon": "qikqja_logoIcon",
723
- "resultCount": "qikqja_resultCount",
724
- "brandTitle": "qikqja_brandTitle",
725
- "hubUpdateBadge": "qikqja_hubUpdateBadge",
726
- "tabs": "qikqja_tabs",
727
- "adArrow": "qikqja_adArrow",
719
+ "adText": "qikqja_adText",
728
720
  "tagline": "qikqja_tagline",
729
- "segLabel": "qikqja_segLabel",
730
- "langBtn": "qikqja_langBtn",
731
- "headerRight": "qikqja_headerRight",
721
+ "headerTitleRow": "qikqja_headerTitleRow",
722
+ "hubUpdateBadge": "qikqja_hubUpdateBadge",
732
723
  "adBanner": "qikqja_adBanner",
724
+ "title": "qikqja_title",
725
+ "adArrow": "qikqja_adArrow",
726
+ "version": "qikqja_version",
727
+ "root": "qikqja_root",
728
+ "tabs": "qikqja_tabs",
729
+ "tabActive": "qikqja_tabActive",
730
+ "resultCount": "qikqja_resultCount",
731
+ "taglineLink": "qikqja_taglineLink",
732
+ "githubLink": "qikqja_githubLink",
733
733
  "header": "qikqja_header",
734
- "githubIcon": "qikqja_githubIcon",
735
- "controls": "qikqja_controls",
736
- "segBtn": "qikqja_segBtn"
734
+ "copyIcon": "qikqja_copyIcon",
735
+ "resultSeg": "qikqja_resultSeg",
736
+ "segBtnActive": "qikqja_segBtnActive"
737
737
  };
738
738
  //#endregion
739
739
  //#region \0dsh-css:src/client/styles/Modal.module.css.mjs
@@ -752,136 +752,136 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
752
752
  css: css$10
753
753
  });
754
754
  var Modal_module_css_default = {
755
- "noticeTime": "BiQ1zG_noticeTime",
756
- "detailStatusText": "BiQ1zG_detailStatusText",
755
+ "detailStatusPending": "BiQ1zG_detailStatusPending",
757
756
  "modalCmd": "BiQ1zG_modalCmd",
757
+ "progressTrack": "BiQ1zG_progressTrack",
758
+ "modalCancel": "BiQ1zG_modalCancel",
759
+ "linkIcon": "BiQ1zG_linkIcon",
760
+ "errorHint": "BiQ1zG_errorHint",
761
+ "noticeMain": "BiQ1zG_noticeMain",
762
+ "noticeRemove": "BiQ1zG_noticeRemove",
763
+ "uninstallConfirm": "BiQ1zG_uninstallConfirm",
764
+ "detailStatusText": "BiQ1zG_detailStatusText",
765
+ "failRow": "BiQ1zG_failRow",
766
+ "detailGrid": "BiQ1zG_detailGrid",
767
+ "confirmIconDanger": "BiQ1zG_confirmIconDanger",
768
+ "queueRowBody": "BiQ1zG_queueRowBody",
769
+ "noticeFoot": "BiQ1zG_noticeFoot",
770
+ "noticeHead": "BiQ1zG_noticeHead",
771
+ "queueSection": "BiQ1zG_queueSection",
772
+ "restartNow": "BiQ1zG_restartNow",
773
+ "detailStatusRunning": "BiQ1zG_detailStatusRunning",
774
+ "detailPathText": "BiQ1zG_detailPathText",
775
+ "queueRowTrack": "BiQ1zG_queueRowTrack",
776
+ "noticeTextOk": "BiQ1zG_noticeTextOk",
777
+ "failEmpty": "BiQ1zG_failEmpty",
778
+ "modalActions": "BiQ1zG_modalActions",
779
+ "noticeRowOk": "BiQ1zG_noticeRowOk",
780
+ "noticeRowMain": "BiQ1zG_noticeRowMain",
781
+ "failNetworkTarget": "BiQ1zG_failNetworkTarget",
782
+ "restartLater": "BiQ1zG_restartLater",
783
+ "dangerConfirm": "BiQ1zG_dangerConfirm",
784
+ "hubUpdateModal": "BiQ1zG_hubUpdateModal",
785
+ "pendingRowStatus": "BiQ1zG_pendingRowStatus",
786
+ "modalIn": "BiQ1zG_modalIn",
787
+ "resultCheckIcon": "BiQ1zG_resultCheckIcon",
788
+ "modalTitleBusy": "BiQ1zG_modalTitleBusy",
789
+ "modalInstall": "BiQ1zG_modalInstall",
790
+ "failBigIssue": "BiQ1zG_failBigIssue",
758
791
  "aboutModal": "BiQ1zG_aboutModal",
759
- "modalCloseIcon": "BiQ1zG_modalCloseIcon",
760
- "modalRow": "BiQ1zG_modalRow",
761
- "aboutContent": "BiQ1zG_aboutContent",
762
- "pendingRowActions": "BiQ1zG_pendingRowActions",
792
+ "detailLink": "BiQ1zG_detailLink",
793
+ "noticeBadgeIcon": "BiQ1zG_noticeBadgeIcon",
794
+ "modalCmdCopy": "BiQ1zG_modalCmdCopy",
795
+ "queueRowPct": "BiQ1zG_queueRowPct",
796
+ "modalValue": "BiQ1zG_modalValue",
797
+ "failList": "BiQ1zG_failList",
798
+ "modalBody": "BiQ1zG_modalBody",
799
+ "helpModal": "BiQ1zG_helpModal",
763
800
  "detailDim": "BiQ1zG_detailDim",
764
- "detailMono": "BiQ1zG_detailMono",
765
- "noticeVersion": "BiQ1zG_noticeVersion",
766
- "modalTitleBusy": "BiQ1zG_modalTitleBusy",
767
- "toast": "BiQ1zG_toast",
768
- "linkIcon": "BiQ1zG_linkIcon",
769
- "failCopy": "BiQ1zG_failCopy",
770
801
  "failedCopyHint": "BiQ1zG_failedCopyHint",
771
- "modalLink": "BiQ1zG_modalLink",
772
- "stripCancel": "BiQ1zG_stripCancel",
773
- "failKindInstall": "BiQ1zG_failKindInstall",
774
- "trustHint": "BiQ1zG_trustHint",
775
- "modalDesc": "BiQ1zG_modalDesc",
776
- "pendingRowStatus": "BiQ1zG_pendingRowStatus",
777
- "cliOnlyHint": "BiQ1zG_cliOnlyHint",
802
+ "errorCopySoft": "BiQ1zG_errorCopySoft",
803
+ "modalHead": "BiQ1zG_modalHead",
804
+ "queuedHint": "BiQ1zG_queuedHint",
805
+ "hubUpdateMetaItem": "BiQ1zG_hubUpdateMetaItem",
806
+ "failKind": "BiQ1zG_failKind",
807
+ "modalCopy": "BiQ1zG_modalCopy",
808
+ "confirmPrimary": "BiQ1zG_confirmPrimary",
809
+ "failRepo": "BiQ1zG_failRepo",
810
+ "overlayIn": "BiQ1zG_overlayIn",
778
811
  "result": "BiQ1zG_result",
812
+ "detailModal": "BiQ1zG_detailModal",
813
+ "detailLabel": "BiQ1zG_detailLabel",
814
+ "modalCloseIcon": "BiQ1zG_modalCloseIcon",
815
+ "modalLabel": "BiQ1zG_modalLabel",
816
+ "aboutContent": "BiQ1zG_aboutContent",
817
+ "toastIn": "BiQ1zG_toastIn",
818
+ "failKindInstall": "BiQ1zG_failKindInstall",
819
+ "progress": "BiQ1zG_progress",
779
820
  "confirmIcon": "BiQ1zG_confirmIcon",
821
+ "failKindUninstall": "BiQ1zG_failKindUninstall",
780
822
  "failHead": "BiQ1zG_failHead",
781
- "noticeRowOk": "BiQ1zG_noticeRowOk",
782
- "detailModal": "BiQ1zG_detailModal",
783
- "failPrepareHint": "BiQ1zG_failPrepareHint",
784
- "modalCmdText": "BiQ1zG_modalCmdText",
785
- "hubUpdateMeta": "BiQ1zG_hubUpdateMeta",
786
- "failNetworkTarget": "BiQ1zG_failNetworkTarget",
787
- "modalInstall": "BiQ1zG_modalInstall",
788
- "overlay": "BiQ1zG_overlay",
823
+ "restartNowWarning": "BiQ1zG_restartNowWarning",
824
+ "progressText": "BiQ1zG_progressText",
825
+ "modalTitleQueued": "BiQ1zG_modalTitleQueued",
826
+ "failClear": "BiQ1zG_failClear",
827
+ "resultDesc": "BiQ1zG_resultDesc",
828
+ "queueRowStatus": "BiQ1zG_queueRowStatus",
829
+ "detailPath": "BiQ1zG_detailPath",
789
830
  "noticeRowUpdate": "BiQ1zG_noticeRowUpdate",
790
- "overlayIn": "BiQ1zG_overlayIn",
791
- "failEmpty": "BiQ1zG_failEmpty",
792
- "queueSection": "BiQ1zG_queueSection",
793
- "modalIn": "BiQ1zG_modalIn",
831
+ "trustHint": "BiQ1zG_trustHint",
832
+ "noticeIgnore": "BiQ1zG_noticeIgnore",
833
+ "noticeTime": "BiQ1zG_noticeTime",
834
+ "noticeVersion": "BiQ1zG_noticeVersion",
794
835
  "queueRowHead": "BiQ1zG_queueRowHead",
795
- "detailLabel": "BiQ1zG_detailLabel",
796
- "queueRowPct": "BiQ1zG_queueRowPct",
836
+ "modalRow": "BiQ1zG_modalRow",
837
+ "cliOnlyHint": "BiQ1zG_cliOnlyHint",
797
838
  "noticeRow": "BiQ1zG_noticeRow",
798
- "resultRestarting": "BiQ1zG_resultRestarting",
799
- "progressFillFail": "BiQ1zG_progressFillFail",
800
- "failBigIssue": "BiQ1zG_failBigIssue",
801
839
  "detailPathActions": "BiQ1zG_detailPathActions",
802
- "detailPath": "BiQ1zG_detailPath",
803
- "restartNowWarning": "BiQ1zG_restartNowWarning",
804
- "noticeUpdateGo": "BiQ1zG_noticeUpdateGo",
840
+ "stripCancel": "BiQ1zG_stripCancel",
805
841
  "failDiagBtn": "BiQ1zG_failDiagBtn",
806
- "failClear": "BiQ1zG_failClear",
807
- "modalCmdCopy": "BiQ1zG_modalCmdCopy",
808
- "noticeRowMain": "BiQ1zG_noticeRowMain",
809
- "failRow": "BiQ1zG_failRow",
810
- "noticeBadgeFail": "BiQ1zG_noticeBadgeFail",
811
- "hubUpdateNotes": "BiQ1zG_hubUpdateNotes",
812
- "progressTrack": "BiQ1zG_progressTrack",
813
- "confirmPrimary": "BiQ1zG_confirmPrimary",
814
- "logModal": "BiQ1zG_logModal",
815
- "toastIn": "BiQ1zG_toastIn",
816
- "modalCancel": "BiQ1zG_modalCancel",
817
- "modalActions": "BiQ1zG_modalActions",
818
842
  "confirmIconWrap": "BiQ1zG_confirmIconWrap",
819
- "detailPathText": "BiQ1zG_detailPathText",
820
- "modal": "BiQ1zG_modal",
821
- "toastFail": "BiQ1zG_toastFail",
822
- "queueRowTrack": "BiQ1zG_queueRowTrack",
823
- "detailUpdateHint": "BiQ1zG_detailUpdateHint",
824
- "errorTitle": "BiQ1zG_errorTitle",
825
- "confirmIconDanger": "BiQ1zG_confirmIconDanger",
826
- "queueRowBody": "BiQ1zG_queueRowBody",
827
- "modalCopy": "BiQ1zG_modalCopy",
828
- "restartLater": "BiQ1zG_restartLater",
829
- "restartNow": "BiQ1zG_restartNow",
830
- "noticeBadgeIcon": "BiQ1zG_noticeBadgeIcon",
831
- "resultTitle": "BiQ1zG_resultTitle",
832
- "helpModal": "BiQ1zG_helpModal",
843
+ "errorBox": "BiQ1zG_errorBox",
844
+ "detailRow": "BiQ1zG_detailRow",
845
+ "queueRowTarget": "BiQ1zG_queueRowTarget",
846
+ "noticeTextFail": "BiQ1zG_noticeTextFail",
847
+ "detailValue": "BiQ1zG_detailValue",
848
+ "detailArrow": "BiQ1zG_detailArrow",
849
+ "resultCheck": "BiQ1zG_resultCheck",
833
850
  "modalClose": "BiQ1zG_modalClose",
834
- "failList": "BiQ1zG_failList",
835
- "noticeMain": "BiQ1zG_noticeMain",
836
- "failKind": "BiQ1zG_failKind",
837
- "detailGrid": "BiQ1zG_detailGrid",
838
- "uninstallConfirm": "BiQ1zG_uninstallConfirm",
839
- "queueRow": "BiQ1zG_queueRow",
840
- "errorModal": "BiQ1zG_errorModal",
851
+ "hubUpdateMeta": "BiQ1zG_hubUpdateMeta",
852
+ "modalTitle": "BiQ1zG_modalTitle",
853
+ "modalCmdText": "BiQ1zG_modalCmdText",
841
854
  "progressFill": "BiQ1zG_progressFill",
842
- "dangerConfirm": "BiQ1zG_dangerConfirm",
843
- "queueRowDesc": "BiQ1zG_queueRowDesc",
844
- "hubUpdateModal": "BiQ1zG_hubUpdateModal",
845
- "detailArrow": "BiQ1zG_detailArrow",
846
- "detailStatusPending": "BiQ1zG_detailStatusPending",
847
- "queueRowTarget": "BiQ1zG_queueRowTarget",
848
- "errorCopySoft": "BiQ1zG_errorCopySoft",
849
- "modalLabel": "BiQ1zG_modalLabel",
850
- "modalWide": "BiQ1zG_modalWide",
851
- "noticeList": "BiQ1zG_noticeList",
852
- "noticeIgnore": "BiQ1zG_noticeIgnore",
853
- "failKindUninstall": "BiQ1zG_failKindUninstall",
854
- "detailStars": "BiQ1zG_detailStars",
855
- "resultDesc": "BiQ1zG_resultDesc",
856
- "detailRow": "BiQ1zG_detailRow",
857
- "modalValue": "BiQ1zG_modalValue",
855
+ "failCopy": "BiQ1zG_failCopy",
858
856
  "noticeBadgeOk": "BiQ1zG_noticeBadgeOk",
859
- "modalTitle": "BiQ1zG_modalTitle",
860
- "noticeRemove": "BiQ1zG_noticeRemove",
861
- "modalTitleQueued": "BiQ1zG_modalTitleQueued",
862
- "queuedHint": "BiQ1zG_queuedHint",
863
- "noticeTextFail": "BiQ1zG_noticeTextFail",
864
- "detailStatusRunning": "BiQ1zG_detailStatusRunning",
865
- "progressText": "BiQ1zG_progressText",
866
- "noticeTextOk": "BiQ1zG_noticeTextOk",
867
- "noticeHead": "BiQ1zG_noticeHead",
857
+ "modalDesc": "BiQ1zG_modalDesc",
858
+ "modalLink": "BiQ1zG_modalLink",
859
+ "toastFail": "BiQ1zG_toastFail",
860
+ "noticeUpdateGo": "BiQ1zG_noticeUpdateGo",
868
861
  "progressHead": "BiQ1zG_progressHead",
869
- "hubUpdateMetaItem": "BiQ1zG_hubUpdateMetaItem",
870
- "detailLink": "BiQ1zG_detailLink",
862
+ "failPrepareHint": "BiQ1zG_failPrepareHint",
863
+ "modal": "BiQ1zG_modal",
864
+ "detailMono": "BiQ1zG_detailMono",
865
+ "modalWide": "BiQ1zG_modalWide",
871
866
  "detailPathBtn": "BiQ1zG_detailPathBtn",
872
- "detailValue": "BiQ1zG_detailValue",
873
- "modalHead": "BiQ1zG_modalHead",
874
- "errorBox": "BiQ1zG_errorBox",
875
- "errorHint": "BiQ1zG_errorHint",
867
+ "queueRow": "BiQ1zG_queueRow",
876
868
  "queueSectionTitle": "BiQ1zG_queueSectionTitle",
877
- "failRepo": "BiQ1zG_failRepo",
878
- "aboutMeta": "BiQ1zG_aboutMeta",
879
- "resultCheckIcon": "BiQ1zG_resultCheckIcon",
880
- "queueRowStatus": "BiQ1zG_queueRowStatus",
881
- "modalBody": "BiQ1zG_modalBody",
882
- "progress": "BiQ1zG_progress",
883
- "noticeFoot": "BiQ1zG_noticeFoot",
884
- "resultCheck": "BiQ1zG_resultCheck"
869
+ "overlay": "BiQ1zG_overlay",
870
+ "pendingRowActions": "BiQ1zG_pendingRowActions",
871
+ "errorModal": "BiQ1zG_errorModal",
872
+ "errorTitle": "BiQ1zG_errorTitle",
873
+ "noticeBadgeFail": "BiQ1zG_noticeBadgeFail",
874
+ "queueRowDesc": "BiQ1zG_queueRowDesc",
875
+ "progressFillFail": "BiQ1zG_progressFillFail",
876
+ "resultTitle": "BiQ1zG_resultTitle",
877
+ "detailUpdateHint": "BiQ1zG_detailUpdateHint",
878
+ "hubUpdateNotes": "BiQ1zG_hubUpdateNotes",
879
+ "logModal": "BiQ1zG_logModal",
880
+ "toast": "BiQ1zG_toast",
881
+ "resultRestarting": "BiQ1zG_resultRestarting",
882
+ "detailStars": "BiQ1zG_detailStars",
883
+ "noticeList": "BiQ1zG_noticeList",
884
+ "aboutMeta": "BiQ1zG_aboutMeta"
885
885
  };
886
886
  //#endregion
887
887
  //#region src/client/logic/install-command.ts
@@ -951,7 +951,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
951
951
  * tsdown 构建时用 define 把 __PLUGIN_VERSION__ 替换成 package.json 的版本号;
952
952
  * node --test 直接 import 本模块时该标识符不存在,typeof 守卫兜底为空串。
953
953
  */
954
- const PLUGIN_VERSION = "1.4.10";
954
+ const PLUGIN_VERSION = "1.4.11";
955
955
  const CATEGORY_ORDER = [
956
956
  "interface",
957
957
  "session",
@@ -1588,7 +1588,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
1588
1588
  */
1589
1589
  const hubHasUpdate = (() => {
1590
1590
  if (!hubUpdateInfo) return false;
1591
- if (hubUpdateInfo.version === "1.4.10") return false;
1591
+ if (hubUpdateInfo.version === "1.4.11") return false;
1592
1592
  const publishedAt = hubUpdateInfo.publishedAt;
1593
1593
  if (publishedAt) {
1594
1594
  const publishedMs = Date.parse(publishedAt);
@@ -4167,40 +4167,40 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4167
4167
  css: css$9
4168
4168
  });
4169
4169
  var List_module_css_default = {
4170
- "cardSide": "_3XaZHa_cardSide",
4171
- "updateBadge": "_3XaZHa_updateBadge",
4172
- "topic": "_3XaZHa_topic",
4173
- "retryBtn": "_3XaZHa_retryBtn",
4174
- "stateActions": "_3XaZHa_stateActions",
4175
- "categoryBadge": "_3XaZHa_categoryBadge",
4176
- "stateTitle": "_3XaZHa_stateTitle",
4177
- "list": "_3XaZHa_list",
4178
- "installBtnUpdate": "_3XaZHa_installBtnUpdate",
4170
+ "date": "_3XaZHa_date",
4171
+ "installBtnInstalled": "_3XaZHa_installBtnInstalled",
4172
+ "fork": "_3XaZHa_fork",
4179
4173
  "stateDesc": "_3XaZHa_stateDesc",
4180
- "diagBtn": "_3XaZHa_diagBtn",
4181
- "footer": "_3XaZHa_footer",
4182
- "uninstallBtn": "_3XaZHa_uninstallBtn",
4183
- "detailBtn": "_3XaZHa_detailBtn",
4184
4174
  "cardMain": "_3XaZHa_cardMain",
4175
+ "cardHead": "_3XaZHa_cardHead",
4176
+ "diagBtn": "_3XaZHa_diagBtn",
4177
+ "star": "_3XaZHa_star",
4178
+ "verified": "_3XaZHa_verified",
4179
+ "categoryBadge": "_3XaZHa_categoryBadge",
4180
+ "versionBadge": "_3XaZHa_versionBadge",
4185
4181
  "state": "_3XaZHa_state",
4186
- "date": "_3XaZHa_date",
4187
4182
  "actions": "_3XaZHa_actions",
4183
+ "cardTitle": "_3XaZHa_cardTitle",
4184
+ "topics": "_3XaZHa_topics",
4185
+ "moreSentinel": "_3XaZHa_moreSentinel",
4186
+ "desc": "_3XaZHa_desc",
4187
+ "uninstallBtn": "_3XaZHa_uninstallBtn",
4188
+ "detailBtn": "_3XaZHa_detailBtn",
4189
+ "retryBtn": "_3XaZHa_retryBtn",
4190
+ "footer": "_3XaZHa_footer",
4191
+ "list": "_3XaZHa_list",
4188
4192
  "installBtn": "_3XaZHa_installBtn",
4189
- "versionBadge": "_3XaZHa_versionBadge",
4193
+ "cardSide": "_3XaZHa_cardSide",
4194
+ "topic": "_3XaZHa_topic",
4195
+ "body": "_3XaZHa_body",
4196
+ "stateTitle": "_3XaZHa_stateTitle",
4190
4197
  "card": "_3XaZHa_card",
4191
- "verified": "_3XaZHa_verified",
4192
- "star": "_3XaZHa_star",
4198
+ "stats": "_3XaZHa_stats",
4199
+ "stateActions": "_3XaZHa_stateActions",
4200
+ "updateBadge": "_3XaZHa_updateBadge",
4193
4201
  "installBtnCopied": "_3XaZHa_installBtnCopied",
4194
- "desc": "_3XaZHa_desc",
4195
- "body": "_3XaZHa_body",
4196
- "topics": "_3XaZHa_topics",
4197
- "fork": "_3XaZHa_fork",
4198
4202
  "footLink": "_3XaZHa_footLink",
4199
- "stats": "_3XaZHa_stats",
4200
- "cardHead": "_3XaZHa_cardHead",
4201
- "cardTitle": "_3XaZHa_cardTitle",
4202
- "installBtnInstalled": "_3XaZHa_installBtnInstalled",
4203
- "moreSentinel": "_3XaZHa_moreSentinel"
4203
+ "installBtnUpdate": "_3XaZHa_installBtnUpdate"
4204
4204
  };
4205
4205
  //#endregion
4206
4206
  //#region src/client/hooks/useIncrementalList.ts
@@ -4407,15 +4407,15 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4407
4407
  css: css$8
4408
4408
  });
4409
4409
  var SectionTabs_module_css_default = {
4410
- "tabIcon": "_7tvizq_tabIcon",
4411
- "tab": "_7tvizq_tab",
4412
- "tabCount": "_7tvizq_tabCount",
4410
+ "tabCountActive": "_7tvizq_tabCountActive",
4411
+ "noticeCount": "_7tvizq_noticeCount",
4413
4412
  "noticeIcon": "_7tvizq_noticeIcon",
4414
4413
  "noticeBtn": "_7tvizq_noticeBtn",
4415
- "noticeCount": "_7tvizq_noticeCount",
4414
+ "tabCount": "_7tvizq_tabCount",
4415
+ "tabIcon": "_7tvizq_tabIcon",
4416
+ "tabActive": "_7tvizq_tabActive",
4416
4417
  "root": "_7tvizq_root",
4417
- "tabCountActive": "_7tvizq_tabCountActive",
4418
- "tabActive": "_7tvizq_tabActive"
4418
+ "tab": "_7tvizq_tab"
4419
4419
  };
4420
4420
  //#endregion
4421
4421
  //#region src/client/components/layout/SectionTabs.tsx
@@ -4492,42 +4492,42 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4492
4492
  css: css$7
4493
4493
  });
4494
4494
  var InstalledView_module_css_default = {
4495
- "segBtn": "_1nXeGW_segBtn",
4495
+ "updateBadge": "_1nXeGW_updateBadge",
4496
4496
  "rowDetail": "_1nXeGW_rowDetail",
4497
- "rowUninstall": "_1nXeGW_rowUninstall",
4498
- "emptyTitle": "_1nXeGW_emptyTitle",
4499
- "rowDesc": "_1nXeGW_rowDesc",
4500
- "rowMain": "_1nXeGW_rowMain",
4501
- "versionBadge": "_1nXeGW_versionBadge",
4502
- "rowTitle": "_1nXeGW_rowTitle",
4503
4497
  "toolbar": "_1nXeGW_toolbar",
4504
- "rowRepo": "_1nXeGW_rowRepo",
4498
+ "rowDesc": "_1nXeGW_rowDesc",
4499
+ "rowUninstall": "_1nXeGW_rowUninstall",
4505
4500
  "rowSourceTag": "_1nXeGW_rowSourceTag",
4506
- "rowActions": "_1nXeGW_rowActions",
4507
- "list": "_1nXeGW_list",
4508
- "statusInactive": "_1nXeGW_statusInactive",
4509
- "rowRestart": "_1nXeGW_rowRestart",
4510
- "searchInput": "_1nXeGW_searchInput",
4511
- "root": "_1nXeGW_root",
4512
- "row": "_1nXeGW_row",
4513
- "segBtnActive": "_1nXeGW_segBtnActive",
4514
- "rowMeta": "_1nXeGW_rowMeta",
4515
- "rowTitleLine": "_1nXeGW_rowTitleLine",
4516
4501
  "segLabel": "_1nXeGW_segLabel",
4517
- "searchWrap": "_1nXeGW_searchWrap",
4518
- "rowSourceTagManual": "_1nXeGW_rowSourceTagManual",
4502
+ "rowUpdate": "_1nXeGW_rowUpdate",
4503
+ "statusInactive": "_1nXeGW_statusInactive",
4519
4504
  "segRow": "_1nXeGW_segRow",
4505
+ "rowMain": "_1nXeGW_rowMain",
4520
4506
  "exampleBadge": "_1nXeGW_exampleBadge",
4507
+ "segGroup": "_1nXeGW_segGroup",
4508
+ "searchInput": "_1nXeGW_searchInput",
4509
+ "segBtn": "_1nXeGW_segBtn",
4510
+ "rowRepo": "_1nXeGW_rowRepo",
4511
+ "emptyTitle": "_1nXeGW_emptyTitle",
4512
+ "versionBadge": "_1nXeGW_versionBadge",
4513
+ "rowRestart": "_1nXeGW_rowRestart",
4521
4514
  "statusDot": "_1nXeGW_statusDot",
4522
- "rowUpdate": "_1nXeGW_rowUpdate",
4523
4515
  "empty": "_1nXeGW_empty",
4524
- "emptyDesc": "_1nXeGW_emptyDesc",
4525
- "exampleRow": "_1nXeGW_exampleRow",
4526
- "segGroup": "_1nXeGW_segGroup",
4516
+ "root": "_1nXeGW_root",
4517
+ "segBtnActive": "_1nXeGW_segBtnActive",
4518
+ "rowTitleLine": "_1nXeGW_rowTitleLine",
4527
4519
  "statusPending": "_1nXeGW_statusPending",
4528
- "rowCategory": "_1nXeGW_rowCategory",
4529
4520
  "rowSourceTagHub": "_1nXeGW_rowSourceTagHub",
4530
- "updateBadge": "_1nXeGW_updateBadge"
4521
+ "exampleRow": "_1nXeGW_exampleRow",
4522
+ "rowActions": "_1nXeGW_rowActions",
4523
+ "searchWrap": "_1nXeGW_searchWrap",
4524
+ "rowMeta": "_1nXeGW_rowMeta",
4525
+ "list": "_1nXeGW_list",
4526
+ "rowTitle": "_1nXeGW_rowTitle",
4527
+ "emptyDesc": "_1nXeGW_emptyDesc",
4528
+ "row": "_1nXeGW_row",
4529
+ "rowSourceTagManual": "_1nXeGW_rowSourceTagManual",
4530
+ "rowCategory": "_1nXeGW_rowCategory"
4531
4531
  };
4532
4532
  //#endregion
4533
4533
  //#region src/client/components/views/InstalledView.tsx
@@ -4773,28 +4773,28 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
4773
4773
  css: css$6
4774
4774
  });
4775
4775
  var CustomInstallView_module_css_default = {
4776
- "installCards": "zISxCG_installCards",
4777
- "installLabel": "zISxCG_installLabel",
4778
- "installInsertBtn": "zISxCG_installInsertBtn",
4779
- "installExample": "zISxCG_installExample",
4780
- "installRow": "zISxCG_installRow",
4781
- "channelOffBtn": "zISxCG_channelOffBtn",
4782
4776
  "helpCmd": "zISxCG_helpCmd",
4777
+ "installExample": "zISxCG_installExample",
4778
+ "installHelpBtn": "zISxCG_installHelpBtn",
4779
+ "desc": "zISxCG_desc",
4783
4780
  "channelOffText": "zISxCG_channelOffText",
4784
- "installInput": "zISxCG_installInput",
4785
- "channelOff": "zISxCG_channelOff",
4786
- "installCard": "zISxCG_installCard",
4781
+ "installInsertBtn": "zISxCG_installInsertBtn",
4787
4782
  "root": "zISxCG_root",
4788
- "helpLine": "zISxCG_helpLine",
4789
- "installCardDisabled": "zISxCG_installCardDisabled",
4790
- "desc": "zISxCG_desc",
4791
- "installInputError": "zISxCG_installInputError",
4792
4783
  "installCardHead": "zISxCG_installCardHead",
4784
+ "installInputError": "zISxCG_installInputError",
4785
+ "installRow": "zISxCG_installRow",
4786
+ "installCardDisabled": "zISxCG_installCardDisabled",
4787
+ "installInput": "zISxCG_installInput",
4788
+ "channelOffBtn": "zISxCG_channelOffBtn",
4789
+ "installLabel": "zISxCG_installLabel",
4793
4790
  "helpBody": "zISxCG_helpBody",
4794
- "helpNote": "zISxCG_helpNote",
4795
4791
  "installError": "zISxCG_installError",
4796
- "installBtn": "zISxCG_installBtn",
4797
- "installHelpBtn": "zISxCG_installHelpBtn"
4792
+ "helpNote": "zISxCG_helpNote",
4793
+ "installCard": "zISxCG_installCard",
4794
+ "helpLine": "zISxCG_helpLine",
4795
+ "channelOff": "zISxCG_channelOff",
4796
+ "installCards": "zISxCG_installCards",
4797
+ "installBtn": "zISxCG_installBtn"
4798
4798
  };
4799
4799
  //#endregion
4800
4800
  //#region src/client/components/views/CustomInstallView.tsx
@@ -5084,30 +5084,30 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5084
5084
  css: css$5
5085
5085
  });
5086
5086
  var SettingsView_module_css_default = {
5087
- "card": "_506LLG_card",
5088
- "pageHeader": "_506LLG_pageHeader",
5087
+ "settingLabel": "_506LLG_settingLabel",
5089
5088
  "settingRowStack": "_506LLG_settingRowStack",
5090
- "textInput": "_506LLG_textInput",
5091
5089
  "navIcon": "_506LLG_navIcon",
5092
- "proxyControl": "_506LLG_proxyControl",
5090
+ "proxyHintFail": "_506LLG_proxyHintFail",
5093
5091
  "pageTitle": "_506LLG_pageTitle",
5094
- "navItem": "_506LLG_navItem",
5092
+ "settingControlStack": "_506LLG_settingControlStack",
5093
+ "controlDropdown": "_506LLG_controlDropdown",
5094
+ "settingTitle": "_506LLG_settingTitle",
5095
+ "navItemActive": "_506LLG_navItemActive",
5096
+ "pageHeader": "_506LLG_pageHeader",
5097
+ "card": "_506LLG_card",
5095
5098
  "root": "_506LLG_root",
5099
+ "textInput": "_506LLG_textInput",
5100
+ "proxyControl": "_506LLG_proxyControl",
5096
5101
  "sidebar": "_506LLG_sidebar",
5097
- "settingTitle": "_506LLG_settingTitle",
5098
- "settingLabel": "_506LLG_settingLabel",
5099
- "settingRow": "_506LLG_settingRow",
5100
- "settingControlStack": "_506LLG_settingControlStack",
5101
- "proxyHint": "_506LLG_proxyHint",
5102
- "settingDesc": "_506LLG_settingDesc",
5103
5102
  "proxyHintOk": "_506LLG_proxyHintOk",
5104
- "resetBtn": "_506LLG_resetBtn",
5105
- "pageDesc": "_506LLG_pageDesc",
5106
- "proxyHintFail": "_506LLG_proxyHintFail",
5107
- "navItemActive": "_506LLG_navItemActive",
5103
+ "settingDesc": "_506LLG_settingDesc",
5104
+ "proxyHint": "_506LLG_proxyHint",
5108
5105
  "content": "_506LLG_content",
5106
+ "resetBtn": "_506LLG_resetBtn",
5107
+ "settingRow": "_506LLG_settingRow",
5109
5108
  "settingControl": "_506LLG_settingControl",
5110
- "controlDropdown": "_506LLG_controlDropdown"
5109
+ "pageDesc": "_506LLG_pageDesc",
5110
+ "navItem": "_506LLG_navItem"
5111
5111
  };
5112
5112
  //#endregion
5113
5113
  //#region \0dsh-css:src/client/styles/Dropdown.module.css.mjs
@@ -5126,18 +5126,18 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5126
5126
  css: css$4
5127
5127
  });
5128
5128
  var Dropdown_module_css_default = {
5129
- "dropdownCountActive": "B_Gxsq_dropdownCountActive",
5130
- "dropdownPanel": "B_Gxsq_dropdownPanel",
5131
- "dropdownItemActive": "B_Gxsq_dropdownItemActive",
5132
- "dropdownFill": "B_Gxsq_dropdownFill",
5129
+ "dropdownArrowOpen": "B_Gxsq_dropdownArrowOpen",
5130
+ "dropdownLabel": "B_Gxsq_dropdownLabel",
5133
5131
  "dropdownCount": "B_Gxsq_dropdownCount",
5132
+ "dropdownFill": "B_Gxsq_dropdownFill",
5133
+ "dropdown": "B_Gxsq_dropdown",
5134
+ "dropdownPanel": "B_Gxsq_dropdownPanel",
5134
5135
  "dropdownItemLabel": "B_Gxsq_dropdownItemLabel",
5135
- "dropdownArrowOpen": "B_Gxsq_dropdownArrowOpen",
5136
+ "dropdownCountActive": "B_Gxsq_dropdownCountActive",
5137
+ "dropdownArrow": "B_Gxsq_dropdownArrow",
5136
5138
  "dropdownBtn": "B_Gxsq_dropdownBtn",
5137
- "dropdown": "B_Gxsq_dropdown",
5138
- "dropdownLabel": "B_Gxsq_dropdownLabel",
5139
5139
  "dropdownItem": "B_Gxsq_dropdownItem",
5140
- "dropdownArrow": "B_Gxsq_dropdownArrow"
5140
+ "dropdownItemActive": "B_Gxsq_dropdownItemActive"
5141
5141
  };
5142
5142
  //#endregion
5143
5143
  //#region \0dsh-css:src/client/styles/Toggle.module.css.mjs
@@ -5258,29 +5258,29 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5258
5258
  css: css$2
5259
5259
  });
5260
5260
  var DiagnosticsView_module_css_default = {
5261
+ "headHint": "k9eRya_headHint",
5262
+ "envCopyBtn": "k9eRya_envCopyBtn",
5263
+ "envRow": "k9eRya_envRow",
5264
+ "envLabel": "k9eRya_envLabel",
5265
+ "display": "k9eRya_display",
5261
5266
  "envDesc": "k9eRya_envDesc",
5267
+ "runBtn": "k9eRya_runBtn",
5268
+ "badgeFail": "k9eRya_badgeFail",
5269
+ "diagPulse": "k9eRya_diagPulse",
5262
5270
  "badgeIdle": "k9eRya_badgeIdle",
5263
- "summary": "k9eRya_summary",
5264
5271
  "envTitle": "k9eRya_envTitle",
5265
- "badgeOk": "k9eRya_badgeOk",
5266
- "runBtn": "k9eRya_runBtn",
5267
- "head": "k9eRya_head",
5268
- "badgeRunning": "k9eRya_badgeRunning",
5269
5272
  "summaryRunning": "k9eRya_summaryRunning",
5270
- "diagPulse": "k9eRya_diagPulse",
5273
+ "badgeRunning": "k9eRya_badgeRunning",
5274
+ "row": "k9eRya_row",
5271
5275
  "badge": "k9eRya_badge",
5272
- "envCopyBtn": "k9eRya_envCopyBtn",
5273
- "badgeFail": "k9eRya_badgeFail",
5274
- "envLabel": "k9eRya_envLabel",
5276
+ "badgeOk": "k9eRya_badgeOk",
5275
5277
  "summaryOk": "k9eRya_summaryOk",
5276
- "display": "k9eRya_display",
5278
+ "name": "k9eRya_name",
5277
5279
  "meta": "k9eRya_meta",
5280
+ "summary": "k9eRya_summary",
5278
5281
  "summaryFail": "k9eRya_summaryFail",
5279
- "headHint": "k9eRya_headHint",
5280
- "row": "k9eRya_row",
5281
5282
  "panel": "k9eRya_panel",
5282
- "name": "k9eRya_name",
5283
- "envRow": "k9eRya_envRow"
5283
+ "head": "k9eRya_head"
5284
5284
  };
5285
5285
  //#endregion
5286
5286
  //#region src/client/components/views/DiagnosticsView.tsx
@@ -5458,57 +5458,57 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
5458
5458
  css: css$1
5459
5459
  });
5460
5460
  var LogsView_module_css_default = {
5461
- "headHint": "_3j77BW_headHint",
5461
+ "head": "_3j77BW_head",
5462
+ "logList": "_3j77BW_logList",
5462
5463
  "event": "_3j77BW_event",
5463
- "pathLabel": "_3j77BW_pathLabel",
5464
- "filterChip": "_3j77BW_filterChip",
5465
- "search": "_3j77BW_search",
5466
- "message": "_3j77BW_message",
5467
- "footFail": "_3j77BW_footFail",
5468
- "pathDialogRow": "_3j77BW_pathDialogRow",
5469
- "entry": "_3j77BW_entry",
5470
- "searchInput": "_3j77BW_searchInput",
5464
+ "headHint": "_3j77BW_headHint",
5471
5465
  "foot": "_3j77BW_foot",
5472
- "badgeError": "_3j77BW_badgeError",
5473
- "previewRow": "_3j77BW_previewRow",
5474
- "catInstall": "_3j77BW_catInstall",
5475
- "panel": "_3j77BW_panel",
5476
- "head": "_3j77BW_head",
5477
- "btn": "_3j77BW_btn",
5478
- "filterBar": "_3j77BW_filterBar",
5479
- "badgeDebug": "_3j77BW_badgeDebug",
5480
- "catUninstall": "_3j77BW_catUninstall",
5481
- "catSystem": "_3j77BW_catSystem",
5482
- "badge": "_3j77BW_badge",
5483
- "list": "_3j77BW_list",
5466
+ "badgeWarn": "_3j77BW_badgeWarn",
5467
+ "pathDialogFoot": "_3j77BW_pathDialogFoot",
5468
+ "catDiagnostics": "_3j77BW_catDiagnostics",
5469
+ "catUpdate": "_3j77BW_catUpdate",
5470
+ "filterChip": "_3j77BW_filterChip",
5484
5471
  "empty": "_3j77BW_empty",
5485
5472
  "more": "_3j77BW_more",
5486
- "badgeInfo": "_3j77BW_badgeInfo",
5487
5473
  "footPath": "_3j77BW_footPath",
5488
- "catDiagnostics": "_3j77BW_catDiagnostics",
5489
- "footActions": "_3j77BW_footActions",
5490
- "time": "_3j77BW_time",
5491
- "pathDraft": "_3j77BW_pathDraft",
5492
- "pathDialogDesc": "_3j77BW_pathDialogDesc",
5493
- "pathDialogHint": "_3j77BW_pathDialogHint",
5494
5474
  "footCount": "_3j77BW_footCount",
5495
- "pathDialogReset": "_3j77BW_pathDialogReset",
5475
+ "pathDialogHint": "_3j77BW_pathDialogHint",
5496
5476
  "headActions": "_3j77BW_headActions",
5497
- "pathDialogFoot": "_3j77BW_pathDialogFoot",
5498
- "filterChipActive": "_3j77BW_filterChipActive",
5499
- "clearBtn": "_3j77BW_clearBtn",
5500
- "logList": "_3j77BW_logList",
5501
- "moreEnd": "_3j77BW_moreEnd",
5502
- "badgeSuccess": "_3j77BW_badgeSuccess",
5503
5477
  "linkBtn": "_3j77BW_linkBtn",
5504
- "badgeWarn": "_3j77BW_badgeWarn",
5505
- "catBadge": "_3j77BW_catBadge",
5506
- "catUpdate": "_3j77BW_catUpdate",
5507
- "catSettings": "_3j77BW_catSettings",
5478
+ "time": "_3j77BW_time",
5479
+ "pathRow": "_3j77BW_pathRow",
5508
5480
  "pathText": "_3j77BW_pathText",
5481
+ "search": "_3j77BW_search",
5482
+ "moreEnd": "_3j77BW_moreEnd",
5483
+ "filterBar": "_3j77BW_filterBar",
5484
+ "btn": "_3j77BW_btn",
5485
+ "badgeSuccess": "_3j77BW_badgeSuccess",
5486
+ "pathDialogReset": "_3j77BW_pathDialogReset",
5487
+ "badgeError": "_3j77BW_badgeError",
5488
+ "catInstall": "_3j77BW_catInstall",
5489
+ "pathDialogDesc": "_3j77BW_pathDialogDesc",
5490
+ "pathDialogRow": "_3j77BW_pathDialogRow",
5509
5491
  "pathDialog": "_3j77BW_pathDialog",
5492
+ "badgeInfo": "_3j77BW_badgeInfo",
5493
+ "catUninstall": "_3j77BW_catUninstall",
5494
+ "catSystem": "_3j77BW_catSystem",
5495
+ "badge": "_3j77BW_badge",
5496
+ "catBadge": "_3j77BW_catBadge",
5497
+ "badgeDebug": "_3j77BW_badgeDebug",
5498
+ "footActions": "_3j77BW_footActions",
5499
+ "message": "_3j77BW_message",
5510
5500
  "actions": "_3j77BW_actions",
5511
- "pathRow": "_3j77BW_pathRow"
5501
+ "entry": "_3j77BW_entry",
5502
+ "clearBtn": "_3j77BW_clearBtn",
5503
+ "catSettings": "_3j77BW_catSettings",
5504
+ "pathDraft": "_3j77BW_pathDraft",
5505
+ "footFail": "_3j77BW_footFail",
5506
+ "panel": "_3j77BW_panel",
5507
+ "pathLabel": "_3j77BW_pathLabel",
5508
+ "searchInput": "_3j77BW_searchInput",
5509
+ "list": "_3j77BW_list",
5510
+ "previewRow": "_3j77BW_previewRow",
5511
+ "filterChipActive": "_3j77BW_filterChipActive"
5512
5512
  };
5513
5513
  //#endregion
5514
5514
  //#region src/client/components/modals/LogsModal.tsx
@@ -6757,7 +6757,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
6757
6757
  openSection: settingsSection,
6758
6758
  onConsumedOpenSection: () => setSettingsSection(null)
6759
6759
  }), showHubUpdate && (0, react.createElement)(HubUpdateModal, {
6760
- info: catalog.hubUpdateInfo ?? { version: "1.4.10" },
6760
+ info: catalog.hubUpdateInfo ?? { version: "1.4.11" },
6761
6761
  lang,
6762
6762
  t,
6763
6763
  hasUpdate: catalog.hubHasUpdate,
@@ -851,10 +851,27 @@ export function mountPluginHubRoutes(webServer, profile, loader) {
851
851
  ? settings.proxy
852
852
  : (systemProxy() ?? process.env.HTTPS_PROXY ?? process.env.https_proxy ?? '');
853
853
  const isGitChannel = repoTarget !== null && target === repoTarget;
854
- const probeTarget = isGitChannel
855
- ? 'https://github.com/'
856
- : `${(settings.npmRegistry.replace(/\/+$/, '') || 'https://registry.npmjs.org')}/`;
857
- const net = await probeUrl(probeTarget, effectiveProxy, 6000);
854
+ const npmProbeTarget = `${(settings.npmRegistry.replace(/\/+$/, '') || 'https://registry.npmjs.org')}/`;
855
+ // git 通道的探针换成克隆握手本身:git ls-remote 走的就是 pnpm 克隆前的同一套
856
+ // https 传输。curl 打 github.com 主页会被按协议/端口区分的防火墙与 TLS 复检
857
+ // 拦截(能 git 克隆、打不开网页),把可装的仓库误判成 [network] 而中止
858
+ // (见 issue #71)。握手失败时再用 curl 复核一次主页连通性:只有两者都不通
859
+ // 才判「网络不通」;仅握手失败(仓库不存在、私有仓库、需要凭据)放行,
860
+ // 交给后续预检与真实安装给出准确原因。
861
+ const gitProbeTarget = repoTarget === null ? null : repoTarget.replace(/^git\+/, '');
862
+ let net;
863
+ if (gitProbeTarget !== null) {
864
+ net = await gitLsRemote(gitProbeTarget, effectiveProxy, 6000);
865
+ if (!net.ok) {
866
+ const reachable = await probeUrl('https://github.com/', effectiveProxy, 6000);
867
+ if (reachable.ok)
868
+ net = reachable;
869
+ }
870
+ }
871
+ else {
872
+ net = await probeUrl(npmProbeTarget, effectiveProxy, 6000);
873
+ }
874
+ const probeTarget = gitProbeTarget ?? npmProbeTarget;
858
875
  if (!net.ok) {
859
876
  // 错误消息按客户端界面语言提示:中文界面给中文、英文界面给英文,
860
877
  // 让用户一眼看懂是网络问题而非插件问题
@@ -9,7 +9,7 @@
9
9
  */
10
10
  import { spawn, spawnSync } from 'node:child_process';
11
11
  import { resolvePackageEntry } from './package-entry.js';
12
- import { readFileSync, statSync } from 'node:fs';
12
+ import { existsSync, readFileSync, statSync } from 'node:fs';
13
13
  import { dirname, join, resolve } from 'node:path';
14
14
  import { CAPTURE_LIMIT_BYTES, MAX_TASKS, MAX_TASK_LINES } from './install-types.js';
15
15
  import { npmTooLowMarker } from './npm-check.js';
@@ -112,19 +112,55 @@ function pushLine(task, line) {
112
112
  task.progress = Math.max(task.progress, 6 + Math.min(79, task.lines.length * 2));
113
113
  }
114
114
  }
115
- function cliInvocation() {
115
+ function cliInvocation(profile) {
116
116
  const entry = process.argv[1];
117
- if (entry !== undefined && /[\\/](?:bin\.(?:js|ts)|dsh)$/.test(entry)) {
118
- const absoluteEntry = resolve(entry);
119
- return {
120
- file: process.execPath,
121
- prefixArgs: [...process.execArgv, absoluteEntry],
122
- cwd: dirname(absoluteEntry),
123
- useShell: false,
124
- };
117
+ if (entry !== undefined) {
118
+ // 打包桌面端(Electron):宿主入口在 app.asar 内,机器上根本没有 `dsh` 可执行文件
119
+ //(Windows 那条 dsh.cmd shim 只存在于宿主进程自己的 PATH 里),直接回退 PATH 必然
120
+ // 报 [dsh-missing](见 issue #71)。这里改用应用自己的 CLI 引导脚本调起同一份打包
121
+ // CLI:Electron 可执行文件 + --expose-internals + desktop-cli.js,与内置终端、
122
+ // 官方插件页安装完全同一条路径 —— desktop profile 由应用独占管理的授权也在其中。
123
+ const bootstrap = desktopCliBootstrap(entry);
124
+ if (bootstrap !== null) {
125
+ return {
126
+ file: process.execPath,
127
+ prefixArgs: ['--expose-internals', bootstrap],
128
+ // 工作目录用 profile 目录(真实存在的目录):asar 内的路径不能作为 spawn 的 cwd
129
+ cwd: profileDirectory(profile),
130
+ useShell: false,
131
+ // Electron 可执行文件只有带这个变量才按 Node 运行引导脚本
132
+ env: { ELECTRON_RUN_AS_NODE: '1' },
133
+ };
134
+ }
135
+ if (/[\\/](?:bin\.(?:js|ts)|dsh)$/.test(entry)) {
136
+ const absoluteEntry = resolve(entry);
137
+ return {
138
+ file: process.execPath,
139
+ prefixArgs: [...process.execArgv, absoluteEntry],
140
+ cwd: dirname(absoluteEntry),
141
+ useShell: false,
142
+ };
143
+ }
125
144
  }
126
145
  return { file: 'dsh', prefixArgs: [], cwd: process.cwd(), useShell: process.platform === 'win32' };
127
146
  }
147
+ /**
148
+ * 打包桌面端宿主的 CLI 引导脚本路径(`<asar 根>/lib/desktop-cli.js`,即应用内
149
+ * pnpm 服务的 dshBootstrapPath)。宿主入口落在 app.asar 内时按 asar 根反推候选路径,
150
+ * 命中存在的那个才采用;布局不认识(官方改版)时返回 null,调用方回退原逻辑。
151
+ * 导出供单测覆盖路径推导。
152
+ */
153
+ export function desktopCliBootstrap(entry) {
154
+ const marker = /[\\/]app\.asar(?=[\\/]|$)/i.exec(entry);
155
+ if (marker === null)
156
+ return null;
157
+ const root = entry.slice(0, marker.index + marker[0].length);
158
+ for (const candidate of [join(root, 'lib', 'desktop-cli.js'), join(root, 'dsh', 'lib', 'desktop-cli.js')]) {
159
+ if (existsSync(candidate))
160
+ return candidate;
161
+ }
162
+ return null;
163
+ }
128
164
  /**
129
165
  * dsh 命令存在性探测:which/where 找 PATH 里的 dsh。
130
166
  * Windows shell 模式命令缺失时 cmd 只输出 GBK 乱码「不是内部或外部命令」(UTF-8 解码后
@@ -286,7 +322,7 @@ function spawnMutation(options) {
286
322
  const isGlobalNpm = (globalNpm ?? []).length > 0;
287
323
  const invocation = isGlobalNpm
288
324
  ? { file: 'npm', prefixArgs: [], cwd: process.cwd(), useShell: process.platform === 'win32' }
289
- : cliInvocation();
325
+ : cliInvocation(profile);
290
326
  // 更新已安装的 npm 包:显式指定 @latest。pnpm add <pkg>(无版本)对已存在依赖
291
327
  // (尤其精确 spec 如 "1.3.0")是幂等的 —— 输出 "Already up to date" 且不改 package.json,
292
328
  // 导致「更新成功」但实际仍停留在旧版本;git 地址与全局安装不受此影响。
@@ -334,7 +370,9 @@ function spawnMutation(options) {
334
370
  }
335
371
  child = spawn(invocation.file, attemptArgs, {
336
372
  cwd: invocation.cwd,
337
- env,
373
+ // invocation.env 是「必须叠加」的变量(打包桌面端的 ELECTRON_RUN_AS_NODE):
374
+ // 没有它时保持 env 原样透传,有它时必须基于完整环境叠加,否则子进程会丢掉 PATH。
375
+ env: invocation.env === undefined ? env : { ...(env ?? process.env), ...invocation.env },
338
376
  shell: invocation.useShell,
339
377
  // detached 使子进程成为独立进程组组长:取消时能整组清理(见 stopChild),
340
378
  // 且宿主进程崩溃后安装任务不会被连带误杀
@@ -30,6 +30,8 @@ export function curlTlsArgs() {
30
30
  export function curlRevokeFlagUnsupported(code, stderr) {
31
31
  return code === 2 && /ssl-revoke-best-effort/i.test(stderr) && /unknown|unrecognized/i.test(stderr);
32
32
  }
33
+ /** 彻底关闭证书吊销检查的兜底参数(curl ≥ 7.19),比降级参数覆盖更老的 Windows curl。 */
34
+ const NO_REVOKE_ARG = '--ssl-no-revoke';
33
35
  /** stderr 是否指向 Schannel 取不到证书吊销信息(据此归因为环境 TLS 问题,而非网络不通)。 */
34
36
  export function tlsRevocationBlocked(stderr) {
35
37
  return /CRYPT_E_NO_REVOCATION_CHECK|CRYPT_E_REVOCATION_OFFLINE|0x80092012/i.test(stderr);
@@ -135,13 +137,24 @@ function runCurl(args, env, timeoutMs) {
135
137
  });
136
138
  }
137
139
  /** 带 TLS 兜底的 curl 调用:先按平台参数跑(Windows 带吊销检查降级),
138
- * 若本机 curl 不认这个参数(curl < 7.70)则去掉参数重跑一次,保证老版本不因此直接失败。 */
140
+ * 若本机 curl 不认这个参数(curl < 7.70)则去掉参数重跑一次,保证老版本不因此直接失败;
141
+ * 降级后仍被吊销检查拦死(CRYPT_E_NO_REVOCATION_CHECK)时,再用 --ssl-no-revoke
142
+ * 彻底关掉吊销检查跑一次 —— 该参数 curl ≥ 7.19 即存在,覆盖面比降级参数更广,
143
+ * 否则「能上网但取不到 CRL」的 Windows 机器会把所有通道误报成不可达(见 issue #71)。
144
+ * 吊销检查只影响本次探测自身的信任判断,不改变系统 TLS 配置。 */
139
145
  async function curlWithTlsFallback(args, env, timeoutMs) {
140
146
  const tlsArgs = curlTlsArgs();
141
- const first = await runCurl([...tlsArgs, ...args], env, timeoutMs);
142
- if (tlsArgs.length === 0 || !curlRevokeFlagUnsupported(first.code, first.stderr))
143
- return first;
144
- return runCurl(args, env, timeoutMs);
147
+ let run = await runCurl([...tlsArgs, ...args], env, timeoutMs);
148
+ if (tlsArgs.length > 0 && curlRevokeFlagUnsupported(run.code, run.stderr)) {
149
+ run = await runCurl(args, env, timeoutMs);
150
+ }
151
+ if (tlsArgs.length > 0 && tlsRevocationBlocked(run.stderr)) {
152
+ const retry = await runCurl([NO_REVOKE_ARG, ...args], env, timeoutMs);
153
+ // 只在兜底本身跑起来(非「不认识该参数」)时采用其结果,否则保留原始失败线索
154
+ if (retry.code !== null && !curlRevokeFlagUnsupported(retry.code, retry.stderr))
155
+ run = retry;
156
+ }
157
+ return run;
145
158
  }
146
159
  /**
147
160
  * curl 子进程探测:spawn curl -s -w '%{http_code}' 并注入代理 env。
@@ -46,6 +46,8 @@ export interface Invocation {
46
46
  prefixArgs: string[];
47
47
  cwd: string;
48
48
  useShell: boolean;
49
+ /** 必须叠加到子进程环境上的变量(打包桌面端要带 ELECTRON_RUN_AS_NODE) */
50
+ env?: NodeJS.ProcessEnv;
49
51
  }
50
52
  /** 排队中的变更任务及其启动参数。 */
51
53
  export interface QueueItem {
@@ -33,6 +33,13 @@ export declare function hasQueuedTarget(target: string): boolean;
33
33
  * Returns false when the task is unknown or already finished.
34
34
  */
35
35
  export declare function cancelTask(id: number): boolean;
36
+ /**
37
+ * 打包桌面端宿主的 CLI 引导脚本路径(`<asar 根>/lib/desktop-cli.js`,即应用内
38
+ * pnpm 服务的 dshBootstrapPath)。宿主入口落在 app.asar 内时按 asar 根反推候选路径,
39
+ * 命中存在的那个才采用;布局不认识(官方改版)时返回 null,调用方回退原逻辑。
40
+ * 导出供单测覆盖路径推导。
41
+ */
42
+ export declare function desktopCliBootstrap(entry: string): string | null;
36
43
  /**
37
44
  * Enqueue a plugin mutation and return its task. Tasks run strictly serially:
38
45
  * the queue worker starts the next one only after the previous finishes.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-plugin",
3
- "version": "1.4.10",
3
+ "version": "1.4.11",
4
4
  "description": "A community plugin marketplace for DeepSeek Harness, built to the official plugin spec — browse, search and install 10000+ human-curated community plugins without leaving the app. · DeepSeek Harness 社区插件市场(遵循官方开发规范):10000+ 人工精选社区插件,每日更新。",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -840,10 +840,25 @@ export function mountPluginHubRoutes(webServer: WebServerService, profile: strin
840
840
  ? settings.proxy
841
841
  : (systemProxy() ?? process.env.HTTPS_PROXY ?? process.env.https_proxy ?? '')
842
842
  const isGitChannel = repoTarget !== null && target === repoTarget
843
- const probeTarget = isGitChannel
844
- ? 'https://github.com/'
845
- : `${(settings.npmRegistry.replace(/\/+$/, '') || 'https://registry.npmjs.org')}/`
846
- const net = await probeUrl(probeTarget, effectiveProxy, 6000)
843
+ const npmProbeTarget = `${(settings.npmRegistry.replace(/\/+$/, '') || 'https://registry.npmjs.org')}/`
844
+ // git 通道的探针换成克隆握手本身:git ls-remote 走的就是 pnpm 克隆前的同一套
845
+ // https 传输。curl 打 github.com 主页会被按协议/端口区分的防火墙与 TLS 复检
846
+ // 拦截(能 git 克隆、打不开网页),把可装的仓库误判成 [network] 而中止
847
+ // (见 issue #71)。握手失败时再用 curl 复核一次主页连通性:只有两者都不通
848
+ // 才判「网络不通」;仅握手失败(仓库不存在、私有仓库、需要凭据)放行,
849
+ // 交给后续预检与真实安装给出准确原因。
850
+ const gitProbeTarget = repoTarget === null ? null : repoTarget.replace(/^git\+/, '')
851
+ let net: Awaited<ReturnType<typeof probeUrl>>
852
+ if (gitProbeTarget !== null) {
853
+ net = await gitLsRemote(gitProbeTarget, effectiveProxy, 6000)
854
+ if (!net.ok) {
855
+ const reachable = await probeUrl('https://github.com/', effectiveProxy, 6000)
856
+ if (reachable.ok) net = reachable
857
+ }
858
+ } else {
859
+ net = await probeUrl(npmProbeTarget, effectiveProxy, 6000)
860
+ }
861
+ const probeTarget = gitProbeTarget ?? npmProbeTarget
847
862
  if (!net.ok) {
848
863
  // 错误消息按客户端界面语言提示:中文界面给中文、英文界面给英文,
849
864
  // 让用户一眼看懂是网络问题而非插件问题
@@ -49,6 +49,8 @@ export interface Invocation {
49
49
  prefixArgs: string[]
50
50
  cwd: string
51
51
  useShell: boolean
52
+ /** 必须叠加到子进程环境上的变量(打包桌面端要带 ELECTRON_RUN_AS_NODE) */
53
+ env?: NodeJS.ProcessEnv
52
54
  }
53
55
 
54
56
  /** 排队中的变更任务及其启动参数。 */
@@ -9,7 +9,7 @@
9
9
  */
10
10
  import { spawn, spawnSync } from 'node:child_process'
11
11
  import { resolvePackageEntry } from './package-entry.ts'
12
- import { readFileSync, statSync } from 'node:fs'
12
+ import { existsSync, readFileSync, statSync } from 'node:fs'
13
13
  import { dirname, join, resolve } from 'node:path'
14
14
  import type { InstallResult, InstallTask, Invocation, QueueItem } from './install-types.ts'
15
15
  import { CAPTURE_LIMIT_BYTES, MAX_TASKS, MAX_TASK_LINES } from './install-types.ts'
@@ -129,20 +129,55 @@ function pushLine(task: InstallTask, line: string): void {
129
129
  }
130
130
  }
131
131
 
132
- function cliInvocation(): Invocation {
132
+ function cliInvocation(profile: string): Invocation {
133
133
  const entry = process.argv[1]
134
- if (entry !== undefined && /[\\/](?:bin\.(?:js|ts)|dsh)$/.test(entry)) {
135
- const absoluteEntry = resolve(entry)
136
- return {
137
- file: process.execPath,
138
- prefixArgs: [...process.execArgv, absoluteEntry],
139
- cwd: dirname(absoluteEntry),
140
- useShell: false,
134
+ if (entry !== undefined) {
135
+ // 打包桌面端(Electron):宿主入口在 app.asar 内,机器上根本没有 `dsh` 可执行文件
136
+ //(Windows 那条 dsh.cmd shim 只存在于宿主进程自己的 PATH 里),直接回退 PATH 必然
137
+ // 报 [dsh-missing](见 issue #71)。这里改用应用自己的 CLI 引导脚本调起同一份打包
138
+ // CLI:Electron 可执行文件 + --expose-internals + desktop-cli.js,与内置终端、
139
+ // 官方插件页安装完全同一条路径 —— desktop profile 由应用独占管理的授权也在其中。
140
+ const bootstrap = desktopCliBootstrap(entry)
141
+ if (bootstrap !== null) {
142
+ return {
143
+ file: process.execPath,
144
+ prefixArgs: ['--expose-internals', bootstrap],
145
+ // 工作目录用 profile 目录(真实存在的目录):asar 内的路径不能作为 spawn 的 cwd
146
+ cwd: profileDirectory(profile),
147
+ useShell: false,
148
+ // Electron 可执行文件只有带这个变量才按 Node 运行引导脚本
149
+ env: { ELECTRON_RUN_AS_NODE: '1' },
150
+ }
151
+ }
152
+ if (/[\\/](?:bin\.(?:js|ts)|dsh)$/.test(entry)) {
153
+ const absoluteEntry = resolve(entry)
154
+ return {
155
+ file: process.execPath,
156
+ prefixArgs: [...process.execArgv, absoluteEntry],
157
+ cwd: dirname(absoluteEntry),
158
+ useShell: false,
159
+ }
141
160
  }
142
161
  }
143
162
  return { file: 'dsh', prefixArgs: [], cwd: process.cwd(), useShell: process.platform === 'win32' }
144
163
  }
145
164
 
165
+ /**
166
+ * 打包桌面端宿主的 CLI 引导脚本路径(`<asar 根>/lib/desktop-cli.js`,即应用内
167
+ * pnpm 服务的 dshBootstrapPath)。宿主入口落在 app.asar 内时按 asar 根反推候选路径,
168
+ * 命中存在的那个才采用;布局不认识(官方改版)时返回 null,调用方回退原逻辑。
169
+ * 导出供单测覆盖路径推导。
170
+ */
171
+ export function desktopCliBootstrap(entry: string): string | null {
172
+ const marker = /[\\/]app\.asar(?=[\\/]|$)/i.exec(entry)
173
+ if (marker === null) return null
174
+ const root = entry.slice(0, marker.index + marker[0].length)
175
+ for (const candidate of [join(root, 'lib', 'desktop-cli.js'), join(root, 'dsh', 'lib', 'desktop-cli.js')]) {
176
+ if (existsSync(candidate)) return candidate
177
+ }
178
+ return null
179
+ }
180
+
146
181
  /**
147
182
  * dsh 命令存在性探测:which/where 找 PATH 里的 dsh。
148
183
  * Windows shell 模式命令缺失时 cmd 只输出 GBK 乱码「不是内部或外部命令」(UTF-8 解码后
@@ -335,7 +370,7 @@ function spawnMutation(options: {
335
370
  const isGlobalNpm = (globalNpm ?? []).length > 0
336
371
  const invocation = isGlobalNpm
337
372
  ? { file: 'npm', prefixArgs: [], cwd: process.cwd(), useShell: process.platform === 'win32' }
338
- : cliInvocation()
373
+ : cliInvocation(profile)
339
374
  // 更新已安装的 npm 包:显式指定 @latest。pnpm add <pkg>(无版本)对已存在依赖
340
375
  // (尤其精确 spec 如 "1.3.0")是幂等的 —— 输出 "Already up to date" 且不改 package.json,
341
376
  // 导致「更新成功」但实际仍停留在旧版本;git 地址与全局安装不受此影响。
@@ -383,7 +418,9 @@ function spawnMutation(options: {
383
418
  }
384
419
  child = spawn(invocation.file, attemptArgs, {
385
420
  cwd: invocation.cwd,
386
- env,
421
+ // invocation.env 是「必须叠加」的变量(打包桌面端的 ELECTRON_RUN_AS_NODE):
422
+ // 没有它时保持 env 原样透传,有它时必须基于完整环境叠加,否则子进程会丢掉 PATH。
423
+ env: invocation.env === undefined ? env : { ...(env ?? process.env), ...invocation.env },
387
424
  shell: invocation.useShell,
388
425
  // detached 使子进程成为独立进程组组长:取消时能整组清理(见 stopChild),
389
426
  // 且宿主进程崩溃后安装任务不会被连带误杀
@@ -51,6 +51,9 @@ export function curlRevokeFlagUnsupported(code: number | null, stderr: string):
51
51
  return code === 2 && /ssl-revoke-best-effort/i.test(stderr) && /unknown|unrecognized/i.test(stderr)
52
52
  }
53
53
 
54
+ /** 彻底关闭证书吊销检查的兜底参数(curl ≥ 7.19),比降级参数覆盖更老的 Windows curl。 */
55
+ const NO_REVOKE_ARG = '--ssl-no-revoke'
56
+
54
57
  /** stderr 是否指向 Schannel 取不到证书吊销信息(据此归因为环境 TLS 问题,而非网络不通)。 */
55
58
  export function tlsRevocationBlocked(stderr: string): boolean {
56
59
  return /CRYPT_E_NO_REVOCATION_CHECK|CRYPT_E_REVOCATION_OFFLINE|0x80092012/i.test(stderr)
@@ -159,12 +162,23 @@ function runCurl(args: string[], env: NodeJS.ProcessEnv, timeoutMs: number): Pro
159
162
  }
160
163
 
161
164
  /** 带 TLS 兜底的 curl 调用:先按平台参数跑(Windows 带吊销检查降级),
162
- * 若本机 curl 不认这个参数(curl < 7.70)则去掉参数重跑一次,保证老版本不因此直接失败。 */
165
+ * 若本机 curl 不认这个参数(curl < 7.70)则去掉参数重跑一次,保证老版本不因此直接失败;
166
+ * 降级后仍被吊销检查拦死(CRYPT_E_NO_REVOCATION_CHECK)时,再用 --ssl-no-revoke
167
+ * 彻底关掉吊销检查跑一次 —— 该参数 curl ≥ 7.19 即存在,覆盖面比降级参数更广,
168
+ * 否则「能上网但取不到 CRL」的 Windows 机器会把所有通道误报成不可达(见 issue #71)。
169
+ * 吊销检查只影响本次探测自身的信任判断,不改变系统 TLS 配置。 */
163
170
  async function curlWithTlsFallback(args: string[], env: NodeJS.ProcessEnv, timeoutMs: number): Promise<CurlRun> {
164
171
  const tlsArgs = curlTlsArgs()
165
- const first = await runCurl([...tlsArgs, ...args], env, timeoutMs)
166
- if (tlsArgs.length === 0 || !curlRevokeFlagUnsupported(first.code, first.stderr)) return first
167
- return runCurl(args, env, timeoutMs)
172
+ let run = await runCurl([...tlsArgs, ...args], env, timeoutMs)
173
+ if (tlsArgs.length > 0 && curlRevokeFlagUnsupported(run.code, run.stderr)) {
174
+ run = await runCurl(args, env, timeoutMs)
175
+ }
176
+ if (tlsArgs.length > 0 && tlsRevocationBlocked(run.stderr)) {
177
+ const retry = await runCurl([NO_REVOKE_ARG, ...args], env, timeoutMs)
178
+ // 只在兜底本身跑起来(非「不认识该参数」)时采用其结果,否则保留原始失败线索
179
+ if (retry.code !== null && !curlRevokeFlagUnsupported(retry.code, retry.stderr)) run = retry
180
+ }
181
+ return run
168
182
  }
169
183
 
170
184
  /**