dsh-plugin 1.4.7 → 1.4.8
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/README.en.md +1 -1
- package/README.md +1 -1
- package/client/client.js +303 -303
- package/lib/http/routes.js +11 -3
- package/lib/services/install/npm-resolve.js +14 -8
- package/lib/services/install/package-entry.js +39 -0
- package/lib/services/install/preflight.js +2 -7
- package/lib/services/install/task-queue.js +15 -7
- package/lib/types/services/install/npm-resolve.d.ts +3 -1
- package/lib/types/services/install/package-entry.d.ts +21 -0
- package/package.json +2 -2
- package/src/server/http/routes.ts +8 -3
- package/src/server/services/install/npm-resolve.ts +14 -9
- package/src/server/services/install/package-entry.ts +41 -0
- package/src/server/services/install/preflight.ts +2 -7
- package/src/server/services/install/task-queue.ts +15 -7
package/README.en.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
# DSH Plugin Hub - Download & Install DeepSeek Harness Plugins
|
|
8
8
|
|
|
9
|
-
**
|
|
9
|
+
**10000+ DeepSeek Harness (DSH) plugins indexed, 10000+ hand-verified, in one community hub, updated daily. Browse, search, download and install by category — free, human-verified, traceable.**
|
|
10
10
|
|
|
11
11
|
[](LICENSE)
|
|
12
12
|
[](https://www.npmjs.com/package/dsh-plugin)
|
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
# DSH Plugin 插件市场 - DeepSeek Harness Plugin (DSH) 下载与安装 · 插件大全
|
|
8
8
|
|
|
9
|
-
**DeepSeek Harness Plugin(DSH)插件市场与插件大全,收录
|
|
9
|
+
**DeepSeek Harness Plugin(DSH)插件市场与插件大全,收录 10000+ 插件、人工精选 10000+、每日更新,免费浏览、搜索并按分类发现、下载与安装 DSH 插件,人工验证、来源可溯。**
|
|
10
10
|
|
|
11
11
|
[](LICENSE)
|
|
12
12
|
[](https://www.npmjs.com/package/dsh-plugin)
|
package/client/client.js
CHANGED
|
@@ -696,42 +696,42 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
696
696
|
css: css$11
|
|
697
697
|
});
|
|
698
698
|
var Header_module_css_default = {
|
|
699
|
-
"langBtn": "qikqja_langBtn",
|
|
700
|
-
"tabs": "qikqja_tabs",
|
|
701
|
-
"segGroup": "qikqja_segGroup",
|
|
702
|
-
"githubLink": "qikqja_githubLink",
|
|
703
|
-
"segBtn": "qikqja_segBtn",
|
|
704
|
-
"taglineLink": "qikqja_taglineLink",
|
|
705
|
-
"adBanner": "qikqja_adBanner",
|
|
706
|
-
"copyIcon": "qikqja_copyIcon",
|
|
707
|
-
"hubUpdateBadge": "qikqja_hubUpdateBadge",
|
|
708
|
-
"aboutBtn": "qikqja_aboutBtn",
|
|
709
|
-
"githubIcon": "qikqja_githubIcon",
|
|
710
|
-
"headerTitleRow": "qikqja_headerTitleRow",
|
|
711
|
-
"segBtnActive": "qikqja_segBtnActive",
|
|
712
|
-
"tagline": "qikqja_tagline",
|
|
713
699
|
"root": "qikqja_root",
|
|
714
|
-
"
|
|
715
|
-
"
|
|
716
|
-
"
|
|
700
|
+
"search": "qikqja_search",
|
|
701
|
+
"hubUpdateBadge": "qikqja_hubUpdateBadge",
|
|
702
|
+
"controls": "qikqja_controls",
|
|
717
703
|
"tab": "qikqja_tab",
|
|
718
|
-
"
|
|
704
|
+
"title": "qikqja_title",
|
|
705
|
+
"resultCount": "qikqja_resultCount",
|
|
719
706
|
"brandTitle": "qikqja_brandTitle",
|
|
707
|
+
"version": "qikqja_version",
|
|
720
708
|
"headerRight": "qikqja_headerRight",
|
|
709
|
+
"segBtn": "qikqja_segBtn",
|
|
710
|
+
"adText": "qikqja_adText",
|
|
721
711
|
"tabsRow": "qikqja_tabsRow",
|
|
722
|
-
"
|
|
712
|
+
"taglineLink": "qikqja_taglineLink",
|
|
713
|
+
"tabs": "qikqja_tabs",
|
|
714
|
+
"aboutBtn": "qikqja_aboutBtn",
|
|
715
|
+
"logoIcon": "qikqja_logoIcon",
|
|
716
|
+
"tabActive": "qikqja_tabActive",
|
|
723
717
|
"segLabel": "qikqja_segLabel",
|
|
724
|
-
"search": "qikqja_search",
|
|
725
|
-
"version": "qikqja_version",
|
|
726
|
-
"header": "qikqja_header",
|
|
727
|
-
"versionBtn": "qikqja_versionBtn",
|
|
728
718
|
"sortGroup": "qikqja_sortGroup",
|
|
719
|
+
"versionBtn": "qikqja_versionBtn",
|
|
720
|
+
"segGroup": "qikqja_segGroup",
|
|
721
|
+
"githubIcon": "qikqja_githubIcon",
|
|
722
|
+
"langBtn": "qikqja_langBtn",
|
|
723
|
+
"githubLink": "qikqja_githubLink",
|
|
724
|
+
"headerTitleRow": "qikqja_headerTitleRow",
|
|
725
|
+
"resultSeg": "qikqja_resultSeg",
|
|
726
|
+
"segBtnActive": "qikqja_segBtnActive",
|
|
729
727
|
"searchRow": "qikqja_searchRow",
|
|
730
|
-
"
|
|
731
|
-
"
|
|
732
|
-
"
|
|
728
|
+
"header": "qikqja_header",
|
|
729
|
+
"copyIcon": "qikqja_copyIcon",
|
|
730
|
+
"adBanner": "qikqja_adBanner",
|
|
733
731
|
"adArrow": "qikqja_adArrow",
|
|
734
|
-
"
|
|
732
|
+
"tagline": "qikqja_tagline",
|
|
733
|
+
"adBadge": "qikqja_adBadge",
|
|
734
|
+
"tabCount": "qikqja_tabCount"
|
|
735
735
|
};
|
|
736
736
|
//#endregion
|
|
737
737
|
//#region \0dsh-css:src/client/styles/Modal.module.css.mjs
|
|
@@ -750,136 +750,136 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
750
750
|
css: css$10
|
|
751
751
|
});
|
|
752
752
|
var Modal_module_css_default = {
|
|
753
|
-
"noticeBadgeOk": "BiQ1zG_noticeBadgeOk",
|
|
754
|
-
"modalBody": "BiQ1zG_modalBody",
|
|
755
|
-
"queueRowBody": "BiQ1zG_queueRowBody",
|
|
756
|
-
"detailGrid": "BiQ1zG_detailGrid",
|
|
757
|
-
"queueRowTarget": "BiQ1zG_queueRowTarget",
|
|
758
|
-
"errorHint": "BiQ1zG_errorHint",
|
|
759
|
-
"modalTitle": "BiQ1zG_modalTitle",
|
|
760
|
-
"aboutModal": "BiQ1zG_aboutModal",
|
|
761
|
-
"hubUpdateNotes": "BiQ1zG_hubUpdateNotes",
|
|
762
|
-
"noticeTextFail": "BiQ1zG_noticeTextFail",
|
|
763
|
-
"detailArrow": "BiQ1zG_detailArrow",
|
|
764
|
-
"detailStatusText": "BiQ1zG_detailStatusText",
|
|
765
|
-
"modalCmdCopy": "BiQ1zG_modalCmdCopy",
|
|
766
|
-
"failKindUninstall": "BiQ1zG_failKindUninstall",
|
|
767
|
-
"detailPathActions": "BiQ1zG_detailPathActions",
|
|
768
|
-
"modalLabel": "BiQ1zG_modalLabel",
|
|
769
|
-
"detailPathBtn": "BiQ1zG_detailPathBtn",
|
|
770
|
-
"uninstallConfirm": "BiQ1zG_uninstallConfirm",
|
|
771
|
-
"queueRowDesc": "BiQ1zG_queueRowDesc",
|
|
772
|
-
"queueRowPct": "BiQ1zG_queueRowPct",
|
|
773
|
-
"modal": "BiQ1zG_modal",
|
|
774
753
|
"queueRowHead": "BiQ1zG_queueRowHead",
|
|
775
|
-
"
|
|
776
|
-
"
|
|
777
|
-
"
|
|
778
|
-
"
|
|
779
|
-
"noticeRow": "BiQ1zG_noticeRow",
|
|
780
|
-
"pendingRowActions": "BiQ1zG_pendingRowActions",
|
|
781
|
-
"modalIn": "BiQ1zG_modalIn",
|
|
782
|
-
"cliOnlyHint": "BiQ1zG_cliOnlyHint",
|
|
754
|
+
"failList": "BiQ1zG_failList",
|
|
755
|
+
"modalCmdText": "BiQ1zG_modalCmdText",
|
|
756
|
+
"modalInstall": "BiQ1zG_modalInstall",
|
|
757
|
+
"errorCopySoft": "BiQ1zG_errorCopySoft",
|
|
783
758
|
"noticeHead": "BiQ1zG_noticeHead",
|
|
784
|
-
"failRepo": "BiQ1zG_failRepo",
|
|
785
|
-
"progressHead": "BiQ1zG_progressHead",
|
|
786
|
-
"errorTitle": "BiQ1zG_errorTitle",
|
|
787
|
-
"confirmIconDanger": "BiQ1zG_confirmIconDanger",
|
|
788
759
|
"confirmIcon": "BiQ1zG_confirmIcon",
|
|
789
|
-
"
|
|
790
|
-
"
|
|
791
|
-
"
|
|
792
|
-
"
|
|
760
|
+
"aboutModal": "BiQ1zG_aboutModal",
|
|
761
|
+
"pendingRowStatus": "BiQ1zG_pendingRowStatus",
|
|
762
|
+
"queueRow": "BiQ1zG_queueRow",
|
|
763
|
+
"hubUpdateModal": "BiQ1zG_hubUpdateModal",
|
|
764
|
+
"toast": "BiQ1zG_toast",
|
|
765
|
+
"failBigIssue": "BiQ1zG_failBigIssue",
|
|
766
|
+
"errorTitle": "BiQ1zG_errorTitle",
|
|
767
|
+
"failDiagBtn": "BiQ1zG_failDiagBtn",
|
|
768
|
+
"failEmpty": "BiQ1zG_failEmpty",
|
|
769
|
+
"modalTitleQueued": "BiQ1zG_modalTitleQueued",
|
|
770
|
+
"detailPath": "BiQ1zG_detailPath",
|
|
771
|
+
"progressTrack": "BiQ1zG_progressTrack",
|
|
772
|
+
"queueSection": "BiQ1zG_queueSection",
|
|
773
|
+
"noticeVersion": "BiQ1zG_noticeVersion",
|
|
774
|
+
"detailRow": "BiQ1zG_detailRow",
|
|
793
775
|
"noticeMain": "BiQ1zG_noticeMain",
|
|
794
|
-
"
|
|
795
|
-
"
|
|
776
|
+
"detailModal": "BiQ1zG_detailModal",
|
|
777
|
+
"modalClose": "BiQ1zG_modalClose",
|
|
778
|
+
"detailValue": "BiQ1zG_detailValue",
|
|
779
|
+
"overlay": "BiQ1zG_overlay",
|
|
780
|
+
"failRepo": "BiQ1zG_failRepo",
|
|
781
|
+
"failKindInstall": "BiQ1zG_failKindInstall",
|
|
782
|
+
"queueRowStatus": "BiQ1zG_queueRowStatus",
|
|
783
|
+
"noticeList": "BiQ1zG_noticeList",
|
|
784
|
+
"failPrepareHint": "BiQ1zG_failPrepareHint",
|
|
785
|
+
"detailDim": "BiQ1zG_detailDim",
|
|
796
786
|
"dangerConfirm": "BiQ1zG_dangerConfirm",
|
|
797
|
-
"
|
|
787
|
+
"trustHint": "BiQ1zG_trustHint",
|
|
788
|
+
"noticeBadgeIcon": "BiQ1zG_noticeBadgeIcon",
|
|
789
|
+
"hubUpdateNotes": "BiQ1zG_hubUpdateNotes",
|
|
790
|
+
"queueSectionTitle": "BiQ1zG_queueSectionTitle",
|
|
791
|
+
"aboutMeta": "BiQ1zG_aboutMeta",
|
|
792
|
+
"failNetworkTarget": "BiQ1zG_failNetworkTarget",
|
|
793
|
+
"aboutContent": "BiQ1zG_aboutContent",
|
|
798
794
|
"failClear": "BiQ1zG_failClear",
|
|
799
|
-
"detailUpdateHint": "BiQ1zG_detailUpdateHint",
|
|
800
|
-
"resultCheck": "BiQ1zG_resultCheck",
|
|
801
|
-
"noticeRowOk": "BiQ1zG_noticeRowOk",
|
|
802
|
-
"failBigIssue": "BiQ1zG_failBigIssue",
|
|
803
|
-
"noticeVersion": "BiQ1zG_noticeVersion",
|
|
804
795
|
"resultTitle": "BiQ1zG_resultTitle",
|
|
805
|
-
"
|
|
796
|
+
"detailArrow": "BiQ1zG_detailArrow",
|
|
806
797
|
"modalLink": "BiQ1zG_modalLink",
|
|
807
|
-
"
|
|
808
|
-
"
|
|
809
|
-
"
|
|
798
|
+
"modalCancel": "BiQ1zG_modalCancel",
|
|
799
|
+
"resultCheck": "BiQ1zG_resultCheck",
|
|
800
|
+
"confirmIconDanger": "BiQ1zG_confirmIconDanger",
|
|
801
|
+
"queueRowPct": "BiQ1zG_queueRowPct",
|
|
802
|
+
"linkIcon": "BiQ1zG_linkIcon",
|
|
803
|
+
"queueRowBody": "BiQ1zG_queueRowBody",
|
|
804
|
+
"toastFail": "BiQ1zG_toastFail",
|
|
805
|
+
"errorHint": "BiQ1zG_errorHint",
|
|
806
|
+
"modalActions": "BiQ1zG_modalActions",
|
|
807
|
+
"failRow": "BiQ1zG_failRow",
|
|
808
|
+
"stripCancel": "BiQ1zG_stripCancel",
|
|
809
|
+
"resultCheckIcon": "BiQ1zG_resultCheckIcon",
|
|
810
|
+
"modalLabel": "BiQ1zG_modalLabel",
|
|
811
|
+
"noticeFoot": "BiQ1zG_noticeFoot",
|
|
812
|
+
"noticeUpdateGo": "BiQ1zG_noticeUpdateGo",
|
|
813
|
+
"queueRowDesc": "BiQ1zG_queueRowDesc",
|
|
814
|
+
"pendingRowActions": "BiQ1zG_pendingRowActions",
|
|
810
815
|
"result": "BiQ1zG_result",
|
|
811
|
-
"
|
|
812
|
-
"
|
|
813
|
-
"
|
|
816
|
+
"noticeRow": "BiQ1zG_noticeRow",
|
|
817
|
+
"detailStatusText": "BiQ1zG_detailStatusText",
|
|
818
|
+
"detailMono": "BiQ1zG_detailMono",
|
|
819
|
+
"modalTitleBusy": "BiQ1zG_modalTitleBusy",
|
|
820
|
+
"queuedHint": "BiQ1zG_queuedHint",
|
|
821
|
+
"progressHead": "BiQ1zG_progressHead",
|
|
822
|
+
"uninstallConfirm": "BiQ1zG_uninstallConfirm",
|
|
823
|
+
"modalDesc": "BiQ1zG_modalDesc",
|
|
824
|
+
"modalWide": "BiQ1zG_modalWide",
|
|
825
|
+
"restartNow": "BiQ1zG_restartNow",
|
|
826
|
+
"noticeBadgeFail": "BiQ1zG_noticeBadgeFail",
|
|
827
|
+
"hubUpdateMetaItem": "BiQ1zG_hubUpdateMetaItem",
|
|
828
|
+
"detailPathText": "BiQ1zG_detailPathText",
|
|
829
|
+
"confirmPrimary": "BiQ1zG_confirmPrimary",
|
|
830
|
+
"failKind": "BiQ1zG_failKind",
|
|
831
|
+
"overlayIn": "BiQ1zG_overlayIn",
|
|
814
832
|
"modalValue": "BiQ1zG_modalValue",
|
|
815
|
-
"
|
|
816
|
-
"
|
|
817
|
-
"
|
|
833
|
+
"progressText": "BiQ1zG_progressText",
|
|
834
|
+
"modalIn": "BiQ1zG_modalIn",
|
|
835
|
+
"modalCopy": "BiQ1zG_modalCopy",
|
|
836
|
+
"failedCopyHint": "BiQ1zG_failedCopyHint",
|
|
837
|
+
"modalTitle": "BiQ1zG_modalTitle",
|
|
838
|
+
"confirmIconWrap": "BiQ1zG_confirmIconWrap",
|
|
839
|
+
"toastIn": "BiQ1zG_toastIn",
|
|
818
840
|
"progressFillFail": "BiQ1zG_progressFillFail",
|
|
819
|
-
"
|
|
820
|
-
"errorModal": "BiQ1zG_errorModal",
|
|
821
|
-
"errorBox": "BiQ1zG_errorBox",
|
|
822
|
-
"failEmpty": "BiQ1zG_failEmpty",
|
|
823
|
-
"failPrepareHint": "BiQ1zG_failPrepareHint",
|
|
824
|
-
"logModal": "BiQ1zG_logModal",
|
|
825
|
-
"failRow": "BiQ1zG_failRow",
|
|
826
|
-
"queueSection": "BiQ1zG_queueSection",
|
|
827
|
-
"detailLink": "BiQ1zG_detailLink",
|
|
828
|
-
"detailDim": "BiQ1zG_detailDim",
|
|
829
|
-
"hubUpdateMeta": "BiQ1zG_hubUpdateMeta",
|
|
830
|
-
"modalClose": "BiQ1zG_modalClose",
|
|
841
|
+
"noticeRowMain": "BiQ1zG_noticeRowMain",
|
|
831
842
|
"noticeIgnore": "BiQ1zG_noticeIgnore",
|
|
832
|
-
"
|
|
833
|
-
"
|
|
843
|
+
"modalCmdCopy": "BiQ1zG_modalCmdCopy",
|
|
844
|
+
"noticeTime": "BiQ1zG_noticeTime",
|
|
845
|
+
"errorBox": "BiQ1zG_errorBox",
|
|
834
846
|
"failCopy": "BiQ1zG_failCopy",
|
|
835
|
-
"
|
|
836
|
-
"modalTitleQueued": "BiQ1zG_modalTitleQueued",
|
|
837
|
-
"queueSectionTitle": "BiQ1zG_queueSectionTitle",
|
|
838
|
-
"failKind": "BiQ1zG_failKind",
|
|
839
|
-
"noticeBadgeFail": "BiQ1zG_noticeBadgeFail",
|
|
840
|
-
"failDiagBtn": "BiQ1zG_failDiagBtn",
|
|
847
|
+
"failKindUninstall": "BiQ1zG_failKindUninstall",
|
|
841
848
|
"detailStatusPending": "BiQ1zG_detailStatusPending",
|
|
842
|
-
"
|
|
843
|
-
"
|
|
844
|
-
"
|
|
845
|
-
"
|
|
846
|
-
"noticeTime": "BiQ1zG_noticeTime",
|
|
847
|
-
"noticeRowUpdate": "BiQ1zG_noticeRowUpdate",
|
|
848
|
-
"restartNow": "BiQ1zG_restartNow",
|
|
849
|
-
"noticeRowMain": "BiQ1zG_noticeRowMain",
|
|
850
|
-
"pendingRowStatus": "BiQ1zG_pendingRowStatus",
|
|
851
|
-
"queuedHint": "BiQ1zG_queuedHint",
|
|
849
|
+
"cliOnlyHint": "BiQ1zG_cliOnlyHint",
|
|
850
|
+
"detailPathActions": "BiQ1zG_detailPathActions",
|
|
851
|
+
"detailStatusRunning": "BiQ1zG_detailStatusRunning",
|
|
852
|
+
"modal": "BiQ1zG_modal",
|
|
852
853
|
"restartNowWarning": "BiQ1zG_restartNowWarning",
|
|
853
|
-
"
|
|
854
|
-
"
|
|
855
|
-
"
|
|
856
|
-
"
|
|
857
|
-
"
|
|
854
|
+
"failHead": "BiQ1zG_failHead",
|
|
855
|
+
"modalHead": "BiQ1zG_modalHead",
|
|
856
|
+
"modalBody": "BiQ1zG_modalBody",
|
|
857
|
+
"modalCmd": "BiQ1zG_modalCmd",
|
|
858
|
+
"noticeBadgeOk": "BiQ1zG_noticeBadgeOk",
|
|
859
|
+
"logModal": "BiQ1zG_logModal",
|
|
860
|
+
"noticeRemove": "BiQ1zG_noticeRemove",
|
|
858
861
|
"helpModal": "BiQ1zG_helpModal",
|
|
859
|
-
"
|
|
860
|
-
"
|
|
861
|
-
"
|
|
862
|
+
"hubUpdateMeta": "BiQ1zG_hubUpdateMeta",
|
|
863
|
+
"progressFill": "BiQ1zG_progressFill",
|
|
864
|
+
"noticeTextFail": "BiQ1zG_noticeTextFail",
|
|
865
|
+
"restartLater": "BiQ1zG_restartLater",
|
|
866
|
+
"detailUpdateHint": "BiQ1zG_detailUpdateHint",
|
|
867
|
+
"detailGrid": "BiQ1zG_detailGrid",
|
|
868
|
+
"detailStars": "BiQ1zG_detailStars",
|
|
869
|
+
"queueRowTarget": "BiQ1zG_queueRowTarget",
|
|
870
|
+
"detailLabel": "BiQ1zG_detailLabel",
|
|
871
|
+
"detailLink": "BiQ1zG_detailLink",
|
|
872
|
+
"detailPathBtn": "BiQ1zG_detailPathBtn",
|
|
862
873
|
"noticeTextOk": "BiQ1zG_noticeTextOk",
|
|
863
|
-
"
|
|
864
|
-
"
|
|
865
|
-
"
|
|
866
|
-
"modalHead": "BiQ1zG_modalHead",
|
|
867
|
-
"overlay": "BiQ1zG_overlay",
|
|
868
|
-
"failedCopyHint": "BiQ1zG_failedCopyHint",
|
|
869
|
-
"modalDesc": "BiQ1zG_modalDesc",
|
|
870
|
-
"modalInstall": "BiQ1zG_modalInstall",
|
|
871
|
-
"toast": "BiQ1zG_toast",
|
|
872
|
-
"modalWide": "BiQ1zG_modalWide",
|
|
873
|
-
"toastIn": "BiQ1zG_toastIn",
|
|
874
|
+
"modalCloseIcon": "BiQ1zG_modalCloseIcon",
|
|
875
|
+
"resultRestarting": "BiQ1zG_resultRestarting",
|
|
876
|
+
"errorModal": "BiQ1zG_errorModal",
|
|
874
877
|
"modalRow": "BiQ1zG_modalRow",
|
|
875
|
-
"
|
|
876
|
-
"
|
|
877
|
-
"
|
|
878
|
-
"
|
|
879
|
-
"
|
|
880
|
-
"failList": "BiQ1zG_failList",
|
|
881
|
-
"failKindInstall": "BiQ1zG_failKindInstall",
|
|
882
|
-
"detailMono": "BiQ1zG_detailMono"
|
|
878
|
+
"resultDesc": "BiQ1zG_resultDesc",
|
|
879
|
+
"queueRowTrack": "BiQ1zG_queueRowTrack",
|
|
880
|
+
"progress": "BiQ1zG_progress",
|
|
881
|
+
"noticeRowUpdate": "BiQ1zG_noticeRowUpdate",
|
|
882
|
+
"noticeRowOk": "BiQ1zG_noticeRowOk"
|
|
883
883
|
};
|
|
884
884
|
//#endregion
|
|
885
885
|
//#region src/client/logic/install-command.ts
|
|
@@ -949,7 +949,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
949
949
|
* tsdown 构建时用 define 把 __PLUGIN_VERSION__ 替换成 package.json 的版本号;
|
|
950
950
|
* node --test 直接 import 本模块时该标识符不存在,typeof 守卫兜底为空串。
|
|
951
951
|
*/
|
|
952
|
-
const PLUGIN_VERSION = "1.4.
|
|
952
|
+
const PLUGIN_VERSION = "1.4.8";
|
|
953
953
|
const CATEGORY_ORDER = [
|
|
954
954
|
"interface",
|
|
955
955
|
"session",
|
|
@@ -1586,7 +1586,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
1586
1586
|
*/
|
|
1587
1587
|
const hubHasUpdate = (() => {
|
|
1588
1588
|
if (!hubUpdateInfo) return false;
|
|
1589
|
-
if (hubUpdateInfo.version === "1.4.
|
|
1589
|
+
if (hubUpdateInfo.version === "1.4.8") return false;
|
|
1590
1590
|
const publishedAt = hubUpdateInfo.publishedAt;
|
|
1591
1591
|
if (publishedAt) {
|
|
1592
1592
|
const publishedMs = Date.parse(publishedAt);
|
|
@@ -4177,40 +4177,40 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
4177
4177
|
css: css$9
|
|
4178
4178
|
});
|
|
4179
4179
|
var List_module_css_default = {
|
|
4180
|
-
"installBtnUpdate": "_3XaZHa_installBtnUpdate",
|
|
4181
|
-
"footer": "_3XaZHa_footer",
|
|
4182
|
-
"verified": "_3XaZHa_verified",
|
|
4183
|
-
"installBtnCopied": "_3XaZHa_installBtnCopied",
|
|
4184
|
-
"cardTitle": "_3XaZHa_cardTitle",
|
|
4185
4180
|
"cardSide": "_3XaZHa_cardSide",
|
|
4181
|
+
"stats": "_3XaZHa_stats",
|
|
4182
|
+
"moreSentinel": "_3XaZHa_moreSentinel",
|
|
4183
|
+
"versionBadge": "_3XaZHa_versionBadge",
|
|
4184
|
+
"star": "_3XaZHa_star",
|
|
4186
4185
|
"state": "_3XaZHa_state",
|
|
4187
|
-
"
|
|
4186
|
+
"stateDesc": "_3XaZHa_stateDesc",
|
|
4187
|
+
"categoryBadge": "_3XaZHa_categoryBadge",
|
|
4188
|
+
"cardMain": "_3XaZHa_cardMain",
|
|
4188
4189
|
"uninstallBtn": "_3XaZHa_uninstallBtn",
|
|
4189
|
-
"
|
|
4190
|
+
"desc": "_3XaZHa_desc",
|
|
4191
|
+
"list": "_3XaZHa_list",
|
|
4190
4192
|
"card": "_3XaZHa_card",
|
|
4191
|
-
"
|
|
4192
|
-
"
|
|
4193
|
-
"
|
|
4194
|
-
"
|
|
4193
|
+
"footer": "_3XaZHa_footer",
|
|
4194
|
+
"fork": "_3XaZHa_fork",
|
|
4195
|
+
"installBtnCopied": "_3XaZHa_installBtnCopied",
|
|
4196
|
+
"installBtnUpdate": "_3XaZHa_installBtnUpdate",
|
|
4197
|
+
"stateActions": "_3XaZHa_stateActions",
|
|
4198
|
+
"cardHead": "_3XaZHa_cardHead",
|
|
4199
|
+
"topics": "_3XaZHa_topics",
|
|
4200
|
+
"stateTitle": "_3XaZHa_stateTitle",
|
|
4201
|
+
"diagBtn": "_3XaZHa_diagBtn",
|
|
4202
|
+
"verified": "_3XaZHa_verified",
|
|
4203
|
+
"topic": "_3XaZHa_topic",
|
|
4204
|
+
"body": "_3XaZHa_body",
|
|
4195
4205
|
"installBtnInstalled": "_3XaZHa_installBtnInstalled",
|
|
4196
|
-
"
|
|
4197
|
-
"topics": "_3XaZHa_topics",
|
|
4198
|
-
"list": "_3XaZHa_list",
|
|
4199
|
-
"cardMain": "_3XaZHa_cardMain",
|
|
4200
|
-
"stateActions": "_3XaZHa_stateActions",
|
|
4201
|
-
"updateBadge": "_3XaZHa_updateBadge",
|
|
4202
|
-
"moreSentinel": "_3XaZHa_moreSentinel",
|
|
4206
|
+
"date": "_3XaZHa_date",
|
|
4203
4207
|
"detailBtn": "_3XaZHa_detailBtn",
|
|
4204
|
-
"star": "_3XaZHa_star",
|
|
4205
4208
|
"footLink": "_3XaZHa_footLink",
|
|
4206
|
-
"
|
|
4207
|
-
"
|
|
4208
|
-
"
|
|
4209
|
-
"
|
|
4210
|
-
"
|
|
4211
|
-
"versionBadge": "_3XaZHa_versionBadge",
|
|
4212
|
-
"categoryBadge": "_3XaZHa_categoryBadge",
|
|
4213
|
-
"stateTitle": "_3XaZHa_stateTitle"
|
|
4209
|
+
"cardTitle": "_3XaZHa_cardTitle",
|
|
4210
|
+
"actions": "_3XaZHa_actions",
|
|
4211
|
+
"updateBadge": "_3XaZHa_updateBadge",
|
|
4212
|
+
"retryBtn": "_3XaZHa_retryBtn",
|
|
4213
|
+
"installBtn": "_3XaZHa_installBtn"
|
|
4214
4214
|
};
|
|
4215
4215
|
//#endregion
|
|
4216
4216
|
//#region src/client/hooks/useIncrementalList.ts
|
|
@@ -4417,15 +4417,15 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
4417
4417
|
css: css$8
|
|
4418
4418
|
});
|
|
4419
4419
|
var SectionTabs_module_css_default = {
|
|
4420
|
-
"
|
|
4420
|
+
"tabIcon": "_7tvizq_tabIcon",
|
|
4421
|
+
"tabCount": "_7tvizq_tabCount",
|
|
4422
|
+
"root": "_7tvizq_root",
|
|
4423
|
+
"noticeIcon": "_7tvizq_noticeIcon",
|
|
4421
4424
|
"tabCountActive": "_7tvizq_tabCountActive",
|
|
4422
|
-
"noticeCount": "_7tvizq_noticeCount",
|
|
4423
4425
|
"tabActive": "_7tvizq_tabActive",
|
|
4424
|
-
"tabIcon": "_7tvizq_tabIcon",
|
|
4425
4426
|
"tab": "_7tvizq_tab",
|
|
4426
|
-
"
|
|
4427
|
-
"
|
|
4428
|
-
"tabCount": "_7tvizq_tabCount"
|
|
4427
|
+
"noticeBtn": "_7tvizq_noticeBtn",
|
|
4428
|
+
"noticeCount": "_7tvizq_noticeCount"
|
|
4429
4429
|
};
|
|
4430
4430
|
//#endregion
|
|
4431
4431
|
//#region src/client/components/layout/SectionTabs.tsx
|
|
@@ -4502,42 +4502,42 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
4502
4502
|
css: css$7
|
|
4503
4503
|
});
|
|
4504
4504
|
var InstalledView_module_css_default = {
|
|
4505
|
-
"rowDetail": "_1nXeGW_rowDetail",
|
|
4506
|
-
"rowUninstall": "_1nXeGW_rowUninstall",
|
|
4507
|
-
"rowMain": "_1nXeGW_rowMain",
|
|
4508
|
-
"rowSourceTagManual": "_1nXeGW_rowSourceTagManual",
|
|
4509
|
-
"rowDesc": "_1nXeGW_rowDesc",
|
|
4510
|
-
"rowRepo": "_1nXeGW_rowRepo",
|
|
4511
|
-
"rowUpdate": "_1nXeGW_rowUpdate",
|
|
4512
|
-
"rowMeta": "_1nXeGW_rowMeta",
|
|
4513
4505
|
"toolbar": "_1nXeGW_toolbar",
|
|
4514
|
-
"root": "_1nXeGW_root",
|
|
4515
4506
|
"empty": "_1nXeGW_empty",
|
|
4516
|
-
"
|
|
4517
|
-
"
|
|
4507
|
+
"segLabel": "_1nXeGW_segLabel",
|
|
4508
|
+
"rowMain": "_1nXeGW_rowMain",
|
|
4509
|
+
"segBtnActive": "_1nXeGW_segBtnActive",
|
|
4510
|
+
"segBtn": "_1nXeGW_segBtn",
|
|
4518
4511
|
"versionBadge": "_1nXeGW_versionBadge",
|
|
4512
|
+
"rowUpdate": "_1nXeGW_rowUpdate",
|
|
4519
4513
|
"segRow": "_1nXeGW_segRow",
|
|
4520
|
-
"rowTitle": "_1nXeGW_rowTitle",
|
|
4521
4514
|
"emptyTitle": "_1nXeGW_emptyTitle",
|
|
4522
|
-
"
|
|
4523
|
-
"
|
|
4524
|
-
"
|
|
4525
|
-
"
|
|
4526
|
-
"
|
|
4527
|
-
"rowSourceTagHub": "_1nXeGW_rowSourceTagHub",
|
|
4515
|
+
"updateBadge": "_1nXeGW_updateBadge",
|
|
4516
|
+
"root": "_1nXeGW_root",
|
|
4517
|
+
"rowSourceTag": "_1nXeGW_rowSourceTag",
|
|
4518
|
+
"rowSourceTagManual": "_1nXeGW_rowSourceTagManual",
|
|
4519
|
+
"rowActions": "_1nXeGW_rowActions",
|
|
4528
4520
|
"rowCategory": "_1nXeGW_rowCategory",
|
|
4529
|
-
"
|
|
4530
|
-
"
|
|
4531
|
-
"
|
|
4521
|
+
"rowDesc": "_1nXeGW_rowDesc",
|
|
4522
|
+
"rowSourceTagHub": "_1nXeGW_rowSourceTagHub",
|
|
4523
|
+
"rowDetail": "_1nXeGW_rowDetail",
|
|
4532
4524
|
"exampleRow": "_1nXeGW_exampleRow",
|
|
4533
|
-
"
|
|
4525
|
+
"searchInput": "_1nXeGW_searchInput",
|
|
4526
|
+
"statusDot": "_1nXeGW_statusDot",
|
|
4527
|
+
"statusPending": "_1nXeGW_statusPending",
|
|
4528
|
+
"exampleBadge": "_1nXeGW_exampleBadge",
|
|
4534
4529
|
"rowRestart": "_1nXeGW_rowRestart",
|
|
4535
|
-
"
|
|
4536
|
-
"
|
|
4530
|
+
"row": "_1nXeGW_row",
|
|
4531
|
+
"list": "_1nXeGW_list",
|
|
4537
4532
|
"searchWrap": "_1nXeGW_searchWrap",
|
|
4538
|
-
"
|
|
4539
|
-
"
|
|
4540
|
-
"
|
|
4533
|
+
"rowMeta": "_1nXeGW_rowMeta",
|
|
4534
|
+
"rowTitleLine": "_1nXeGW_rowTitleLine",
|
|
4535
|
+
"emptyDesc": "_1nXeGW_emptyDesc",
|
|
4536
|
+
"segGroup": "_1nXeGW_segGroup",
|
|
4537
|
+
"rowRepo": "_1nXeGW_rowRepo",
|
|
4538
|
+
"rowTitle": "_1nXeGW_rowTitle",
|
|
4539
|
+
"statusInactive": "_1nXeGW_statusInactive",
|
|
4540
|
+
"rowUninstall": "_1nXeGW_rowUninstall"
|
|
4541
4541
|
};
|
|
4542
4542
|
//#endregion
|
|
4543
4543
|
//#region src/client/components/views/InstalledView.tsx
|
|
@@ -4783,28 +4783,28 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
4783
4783
|
css: css$6
|
|
4784
4784
|
});
|
|
4785
4785
|
var CustomInstallView_module_css_default = {
|
|
4786
|
-
"
|
|
4787
|
-
"
|
|
4786
|
+
"installLabel": "zISxCG_installLabel",
|
|
4787
|
+
"installInput": "zISxCG_installInput",
|
|
4788
4788
|
"installError": "zISxCG_installError",
|
|
4789
4789
|
"channelOffBtn": "zISxCG_channelOffBtn",
|
|
4790
|
+
"installBtn": "zISxCG_installBtn",
|
|
4791
|
+
"installCards": "zISxCG_installCards",
|
|
4792
|
+
"installHelpBtn": "zISxCG_installHelpBtn",
|
|
4793
|
+
"desc": "zISxCG_desc",
|
|
4790
4794
|
"installCardDisabled": "zISxCG_installCardDisabled",
|
|
4791
|
-
"
|
|
4792
|
-
"
|
|
4793
|
-
"
|
|
4794
|
-
"
|
|
4795
|
+
"installCardHead": "zISxCG_installCardHead",
|
|
4796
|
+
"installRow": "zISxCG_installRow",
|
|
4797
|
+
"channelOff": "zISxCG_channelOff",
|
|
4798
|
+
"helpLine": "zISxCG_helpLine",
|
|
4795
4799
|
"helpNote": "zISxCG_helpNote",
|
|
4800
|
+
"installInsertBtn": "zISxCG_installInsertBtn",
|
|
4796
4801
|
"helpCmd": "zISxCG_helpCmd",
|
|
4802
|
+
"root": "zISxCG_root",
|
|
4797
4803
|
"installExample": "zISxCG_installExample",
|
|
4798
|
-
"
|
|
4799
|
-
"
|
|
4800
|
-
"installLabel": "zISxCG_installLabel",
|
|
4801
|
-
"installInsertBtn": "zISxCG_installInsertBtn",
|
|
4804
|
+
"installCard": "zISxCG_installCard",
|
|
4805
|
+
"installInputError": "zISxCG_installInputError",
|
|
4802
4806
|
"channelOffText": "zISxCG_channelOffText",
|
|
4803
|
-
"
|
|
4804
|
-
"installBtn": "zISxCG_installBtn",
|
|
4805
|
-
"desc": "zISxCG_desc",
|
|
4806
|
-
"installRow": "zISxCG_installRow",
|
|
4807
|
-
"installCard": "zISxCG_installCard"
|
|
4807
|
+
"helpBody": "zISxCG_helpBody"
|
|
4808
4808
|
};
|
|
4809
4809
|
//#endregion
|
|
4810
4810
|
//#region src/client/components/views/CustomInstallView.tsx
|
|
@@ -5094,30 +5094,30 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
5094
5094
|
css: css$5
|
|
5095
5095
|
});
|
|
5096
5096
|
var SettingsView_module_css_default = {
|
|
5097
|
-
"settingRowStack": "_506LLG_settingRowStack",
|
|
5098
5097
|
"controlDropdown": "_506LLG_controlDropdown",
|
|
5099
|
-
"proxyControl": "_506LLG_proxyControl",
|
|
5100
|
-
"settingLabel": "_506LLG_settingLabel",
|
|
5101
|
-
"navItemActive": "_506LLG_navItemActive",
|
|
5102
|
-
"navIcon": "_506LLG_navIcon",
|
|
5103
|
-
"proxyHintOk": "_506LLG_proxyHintOk",
|
|
5104
|
-
"content": "_506LLG_content",
|
|
5105
|
-
"settingControlStack": "_506LLG_settingControlStack",
|
|
5106
5098
|
"card": "_506LLG_card",
|
|
5107
|
-
"pageDesc": "_506LLG_pageDesc",
|
|
5108
|
-
"settingRow": "_506LLG_settingRow",
|
|
5109
|
-
"textInput": "_506LLG_textInput",
|
|
5110
|
-
"settingDesc": "_506LLG_settingDesc",
|
|
5111
|
-
"root": "_506LLG_root",
|
|
5112
|
-
"proxyHint": "_506LLG_proxyHint",
|
|
5113
5099
|
"settingTitle": "_506LLG_settingTitle",
|
|
5100
|
+
"settingControlStack": "_506LLG_settingControlStack",
|
|
5101
|
+
"settingDesc": "_506LLG_settingDesc",
|
|
5102
|
+
"pageDesc": "_506LLG_pageDesc",
|
|
5103
|
+
"settingLabel": "_506LLG_settingLabel",
|
|
5104
|
+
"pageHeader": "_506LLG_pageHeader",
|
|
5114
5105
|
"pageTitle": "_506LLG_pageTitle",
|
|
5106
|
+
"content": "_506LLG_content",
|
|
5107
|
+
"root": "_506LLG_root",
|
|
5115
5108
|
"settingControl": "_506LLG_settingControl",
|
|
5116
|
-
"
|
|
5117
|
-
"
|
|
5109
|
+
"textInput": "_506LLG_textInput",
|
|
5110
|
+
"navItem": "_506LLG_navItem",
|
|
5111
|
+
"settingRow": "_506LLG_settingRow",
|
|
5118
5112
|
"resetBtn": "_506LLG_resetBtn",
|
|
5119
5113
|
"sidebar": "_506LLG_sidebar",
|
|
5120
|
-
"
|
|
5114
|
+
"proxyControl": "_506LLG_proxyControl",
|
|
5115
|
+
"navIcon": "_506LLG_navIcon",
|
|
5116
|
+
"proxyHintOk": "_506LLG_proxyHintOk",
|
|
5117
|
+
"proxyHintFail": "_506LLG_proxyHintFail",
|
|
5118
|
+
"proxyHint": "_506LLG_proxyHint",
|
|
5119
|
+
"settingRowStack": "_506LLG_settingRowStack",
|
|
5120
|
+
"navItemActive": "_506LLG_navItemActive"
|
|
5121
5121
|
};
|
|
5122
5122
|
//#endregion
|
|
5123
5123
|
//#region \0dsh-css:src/client/styles/Dropdown.module.css.mjs
|
|
@@ -5136,18 +5136,18 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
5136
5136
|
css: css$4
|
|
5137
5137
|
});
|
|
5138
5138
|
var Dropdown_module_css_default = {
|
|
5139
|
-
"
|
|
5140
|
-
"dropdownBtn": "B_Gxsq_dropdownBtn",
|
|
5141
|
-
"dropdownArrowOpen": "B_Gxsq_dropdownArrowOpen",
|
|
5139
|
+
"dropdownCountActive": "B_Gxsq_dropdownCountActive",
|
|
5142
5140
|
"dropdownItem": "B_Gxsq_dropdownItem",
|
|
5143
|
-
"dropdownPanel": "B_Gxsq_dropdownPanel",
|
|
5144
|
-
"dropdownCount": "B_Gxsq_dropdownCount",
|
|
5145
|
-
"dropdownFill": "B_Gxsq_dropdownFill",
|
|
5146
|
-
"dropdownLabel": "B_Gxsq_dropdownLabel",
|
|
5147
5141
|
"dropdownItemLabel": "B_Gxsq_dropdownItemLabel",
|
|
5142
|
+
"dropdownBtn": "B_Gxsq_dropdownBtn",
|
|
5143
|
+
"dropdownPanel": "B_Gxsq_dropdownPanel",
|
|
5148
5144
|
"dropdown": "B_Gxsq_dropdown",
|
|
5149
|
-
"
|
|
5150
|
-
"
|
|
5145
|
+
"dropdownLabel": "B_Gxsq_dropdownLabel",
|
|
5146
|
+
"dropdownArrow": "B_Gxsq_dropdownArrow",
|
|
5147
|
+
"dropdownItemActive": "B_Gxsq_dropdownItemActive",
|
|
5148
|
+
"dropdownCount": "B_Gxsq_dropdownCount",
|
|
5149
|
+
"dropdownArrowOpen": "B_Gxsq_dropdownArrowOpen",
|
|
5150
|
+
"dropdownFill": "B_Gxsq_dropdownFill"
|
|
5151
5151
|
};
|
|
5152
5152
|
//#endregion
|
|
5153
5153
|
//#region \0dsh-css:src/client/styles/Toggle.module.css.mjs
|
|
@@ -5166,9 +5166,9 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
5166
5166
|
css: css$3
|
|
5167
5167
|
});
|
|
5168
5168
|
var Toggle_module_css_default = {
|
|
5169
|
-
"toggleOn": "k-cD4G_toggleOn",
|
|
5170
5169
|
"knob": "k-cD4G_knob",
|
|
5171
|
-
"toggle": "k-cD4G_toggle"
|
|
5170
|
+
"toggle": "k-cD4G_toggle",
|
|
5171
|
+
"toggleOn": "k-cD4G_toggleOn"
|
|
5172
5172
|
};
|
|
5173
5173
|
//#endregion
|
|
5174
5174
|
//#region src/client/components/ui/Toggle.tsx
|
|
@@ -5268,29 +5268,29 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
5268
5268
|
css: css$2
|
|
5269
5269
|
});
|
|
5270
5270
|
var DiagnosticsView_module_css_default = {
|
|
5271
|
-
"
|
|
5271
|
+
"envCopyBtn": "k9eRya_envCopyBtn",
|
|
5272
|
+
"name": "k9eRya_name",
|
|
5273
|
+
"summaryRunning": "k9eRya_summaryRunning",
|
|
5274
|
+
"badgeOk": "k9eRya_badgeOk",
|
|
5275
|
+
"envTitle": "k9eRya_envTitle",
|
|
5272
5276
|
"panel": "k9eRya_panel",
|
|
5273
|
-
"
|
|
5277
|
+
"runBtn": "k9eRya_runBtn",
|
|
5278
|
+
"row": "k9eRya_row",
|
|
5279
|
+
"badgeFail": "k9eRya_badgeFail",
|
|
5280
|
+
"head": "k9eRya_head",
|
|
5281
|
+
"diagPulse": "k9eRya_diagPulse",
|
|
5282
|
+
"summaryOk": "k9eRya_summaryOk",
|
|
5283
|
+
"envRow": "k9eRya_envRow",
|
|
5274
5284
|
"display": "k9eRya_display",
|
|
5275
|
-
"envCopyBtn": "k9eRya_envCopyBtn",
|
|
5276
5285
|
"badge": "k9eRya_badge",
|
|
5277
|
-
"badgeFail": "k9eRya_badgeFail",
|
|
5278
|
-
"badgeIdle": "k9eRya_badgeIdle",
|
|
5279
5286
|
"envLabel": "k9eRya_envLabel",
|
|
5280
|
-
"head": "k9eRya_head",
|
|
5281
5287
|
"envDesc": "k9eRya_envDesc",
|
|
5282
|
-
"
|
|
5283
|
-
"badgeOk": "k9eRya_badgeOk",
|
|
5288
|
+
"badgeRunning": "k9eRya_badgeRunning",
|
|
5284
5289
|
"summary": "k9eRya_summary",
|
|
5285
|
-
"summaryRunning": "k9eRya_summaryRunning",
|
|
5286
|
-
"diagPulse": "k9eRya_diagPulse",
|
|
5287
|
-
"envTitle": "k9eRya_envTitle",
|
|
5288
|
-
"headHint": "k9eRya_headHint",
|
|
5289
|
-
"runBtn": "k9eRya_runBtn",
|
|
5290
|
-
"meta": "k9eRya_meta",
|
|
5291
5290
|
"summaryFail": "k9eRya_summaryFail",
|
|
5292
|
-
"
|
|
5293
|
-
"
|
|
5291
|
+
"meta": "k9eRya_meta",
|
|
5292
|
+
"badgeIdle": "k9eRya_badgeIdle",
|
|
5293
|
+
"headHint": "k9eRya_headHint"
|
|
5294
5294
|
};
|
|
5295
5295
|
//#endregion
|
|
5296
5296
|
//#region src/client/components/views/DiagnosticsView.tsx
|
|
@@ -5468,57 +5468,57 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
5468
5468
|
css: css$1
|
|
5469
5469
|
});
|
|
5470
5470
|
var LogsView_module_css_default = {
|
|
5471
|
-
"
|
|
5472
|
-
"time": "_3j77BW_time",
|
|
5473
|
-
"pathDialogRow": "_3j77BW_pathDialogRow",
|
|
5474
|
-
"pathRow": "_3j77BW_pathRow",
|
|
5475
|
-
"pathDraft": "_3j77BW_pathDraft",
|
|
5476
|
-
"foot": "_3j77BW_foot",
|
|
5477
|
-
"footCount": "_3j77BW_footCount",
|
|
5478
|
-
"catBadge": "_3j77BW_catBadge",
|
|
5471
|
+
"footPath": "_3j77BW_footPath",
|
|
5479
5472
|
"catInstall": "_3j77BW_catInstall",
|
|
5473
|
+
"footActions": "_3j77BW_footActions",
|
|
5474
|
+
"time": "_3j77BW_time",
|
|
5475
|
+
"message": "_3j77BW_message",
|
|
5476
|
+
"pathDialog": "_3j77BW_pathDialog",
|
|
5480
5477
|
"catSystem": "_3j77BW_catSystem",
|
|
5478
|
+
"clearBtn": "_3j77BW_clearBtn",
|
|
5479
|
+
"pathDialogDesc": "_3j77BW_pathDialogDesc",
|
|
5481
5480
|
"linkBtn": "_3j77BW_linkBtn",
|
|
5482
|
-
"headActions": "_3j77BW_headActions",
|
|
5483
|
-
"head": "_3j77BW_head",
|
|
5484
|
-
"message": "_3j77BW_message",
|
|
5485
|
-
"pathDialogHint": "_3j77BW_pathDialogHint",
|
|
5486
|
-
"filterChip": "_3j77BW_filterChip",
|
|
5487
|
-
"badgeInfo": "_3j77BW_badgeInfo",
|
|
5488
|
-
"pathDialogFoot": "_3j77BW_pathDialogFoot",
|
|
5489
|
-
"badgeDebug": "_3j77BW_badgeDebug",
|
|
5490
|
-
"badge": "_3j77BW_badge",
|
|
5491
|
-
"catUpdate": "_3j77BW_catUpdate",
|
|
5492
|
-
"pathText": "_3j77BW_pathText",
|
|
5493
|
-
"entry": "_3j77BW_entry",
|
|
5494
|
-
"headHint": "_3j77BW_headHint",
|
|
5495
5481
|
"filterBar": "_3j77BW_filterBar",
|
|
5482
|
+
"pathText": "_3j77BW_pathText",
|
|
5483
|
+
"pathDialogReset": "_3j77BW_pathDialogReset",
|
|
5484
|
+
"catUninstall": "_3j77BW_catUninstall",
|
|
5485
|
+
"searchInput": "_3j77BW_searchInput",
|
|
5496
5486
|
"list": "_3j77BW_list",
|
|
5497
|
-
"
|
|
5498
|
-
"
|
|
5499
|
-
"badgeError": "_3j77BW_badgeError",
|
|
5500
|
-
"clearBtn": "_3j77BW_clearBtn",
|
|
5501
|
-
"search": "_3j77BW_search",
|
|
5502
|
-
"footActions": "_3j77BW_footActions",
|
|
5503
|
-
"badgeSuccess": "_3j77BW_badgeSuccess",
|
|
5504
|
-
"logList": "_3j77BW_logList",
|
|
5487
|
+
"pathRow": "_3j77BW_pathRow",
|
|
5488
|
+
"event": "_3j77BW_event",
|
|
5505
5489
|
"pathLabel": "_3j77BW_pathLabel",
|
|
5506
|
-
"
|
|
5490
|
+
"previewRow": "_3j77BW_previewRow",
|
|
5491
|
+
"search": "_3j77BW_search",
|
|
5492
|
+
"headActions": "_3j77BW_headActions",
|
|
5507
5493
|
"more": "_3j77BW_more",
|
|
5508
|
-
"
|
|
5509
|
-
"moreEnd": "_3j77BW_moreEnd",
|
|
5510
|
-
"btn": "_3j77BW_btn",
|
|
5511
|
-
"pathDialogDesc": "_3j77BW_pathDialogDesc",
|
|
5512
|
-
"footFail": "_3j77BW_footFail",
|
|
5513
|
-
"pathDialogReset": "_3j77BW_pathDialogReset",
|
|
5514
|
-
"catDiagnostics": "_3j77BW_catDiagnostics",
|
|
5515
|
-
"searchInput": "_3j77BW_searchInput",
|
|
5516
|
-
"catSettings": "_3j77BW_catSettings",
|
|
5517
|
-
"empty": "_3j77BW_empty",
|
|
5494
|
+
"pathDialogRow": "_3j77BW_pathDialogRow",
|
|
5518
5495
|
"panel": "_3j77BW_panel",
|
|
5519
|
-
"
|
|
5496
|
+
"badge": "_3j77BW_badge",
|
|
5497
|
+
"footFail": "_3j77BW_footFail",
|
|
5498
|
+
"footCount": "_3j77BW_footCount",
|
|
5499
|
+
"headHint": "_3j77BW_headHint",
|
|
5500
|
+
"entry": "_3j77BW_entry",
|
|
5501
|
+
"filterChip": "_3j77BW_filterChip",
|
|
5502
|
+
"badgeSuccess": "_3j77BW_badgeSuccess",
|
|
5503
|
+
"badgeWarn": "_3j77BW_badgeWarn",
|
|
5504
|
+
"catBadge": "_3j77BW_catBadge",
|
|
5505
|
+
"pathDialogFoot": "_3j77BW_pathDialogFoot",
|
|
5506
|
+
"moreEnd": "_3j77BW_moreEnd",
|
|
5520
5507
|
"actions": "_3j77BW_actions",
|
|
5521
|
-
"
|
|
5508
|
+
"empty": "_3j77BW_empty",
|
|
5509
|
+
"catSettings": "_3j77BW_catSettings",
|
|
5510
|
+
"pathDialogHint": "_3j77BW_pathDialogHint",
|
|
5511
|
+
"pathDraft": "_3j77BW_pathDraft",
|
|
5512
|
+
"head": "_3j77BW_head",
|
|
5513
|
+
"filterChipActive": "_3j77BW_filterChipActive",
|
|
5514
|
+
"logList": "_3j77BW_logList",
|
|
5515
|
+
"foot": "_3j77BW_foot",
|
|
5516
|
+
"catUpdate": "_3j77BW_catUpdate",
|
|
5517
|
+
"catDiagnostics": "_3j77BW_catDiagnostics",
|
|
5518
|
+
"btn": "_3j77BW_btn",
|
|
5519
|
+
"badgeError": "_3j77BW_badgeError",
|
|
5520
|
+
"badgeInfo": "_3j77BW_badgeInfo",
|
|
5521
|
+
"badgeDebug": "_3j77BW_badgeDebug"
|
|
5522
5522
|
};
|
|
5523
5523
|
//#endregion
|
|
5524
5524
|
//#region src/client/components/modals/LogsModal.tsx
|
|
@@ -6767,7 +6767,7 @@ window.__ModuleLoader__.load({ id: "dsh-plugin", factory: (require) => {
|
|
|
6767
6767
|
openSection: settingsSection,
|
|
6768
6768
|
onConsumedOpenSection: () => setSettingsSection(null)
|
|
6769
6769
|
}), showHubUpdate && (0, react.createElement)(HubUpdateModal, {
|
|
6770
|
-
info: catalog.hubUpdateInfo ?? { version: "1.4.
|
|
6770
|
+
info: catalog.hubUpdateInfo ?? { version: "1.4.8" },
|
|
6771
6771
|
lang,
|
|
6772
6772
|
t,
|
|
6773
6773
|
hasUpdate: catalog.hubHasUpdate,
|
package/lib/http/routes.js
CHANGED
|
@@ -486,15 +486,23 @@ export function mountPluginHubRoutes(webServer, profile, loader) {
|
|
|
486
486
|
const child = spawn(bin, args);
|
|
487
487
|
let out = '';
|
|
488
488
|
child.stdout.on('data', (d) => { out += String(d); });
|
|
489
|
-
|
|
490
|
-
|
|
489
|
+
// spawn 失败(如 Linux 无 zenity)会先触发 error 再触发 close(code=-2):
|
|
490
|
+
// 只允许第一个事件应答,否则第二次 sendJson 对已结束的响应再 writeHead,
|
|
491
|
+
// 抛 ERR_HTTP_HEADERS_SENT 成为宿主进程内的未捕获异常。
|
|
492
|
+
let done = false;
|
|
493
|
+
const finish = (reply) => { if (!done) {
|
|
494
|
+
done = true;
|
|
495
|
+
reply();
|
|
496
|
+
} };
|
|
497
|
+
child.on('error', () => finish(() => sendJson(response, 500, { error: 'directory picker unavailable' })));
|
|
498
|
+
child.on('close', (code) => finish(() => {
|
|
491
499
|
// macOS osascript 输出带引号(如 "/Users/x"),统一剥掉首尾空白与引号
|
|
492
500
|
const picked = out.trim().replace(/^"|"$/g, '');
|
|
493
501
|
if (code === 0 && picked !== '')
|
|
494
502
|
sendJson(response, 200, { path: picked });
|
|
495
503
|
else
|
|
496
504
|
sendJson(response, 200, { cancelled: true });
|
|
497
|
-
});
|
|
505
|
+
}));
|
|
498
506
|
}
|
|
499
507
|
catch {
|
|
500
508
|
sendJson(response, 500, { error: 'directory picker unavailable' });
|
|
@@ -12,14 +12,16 @@
|
|
|
12
12
|
* 避免同一会话内重复查询 registry。
|
|
13
13
|
*/
|
|
14
14
|
import { get } from 'node:https';
|
|
15
|
-
/** 反查缓存:repo 小写 → npm 包名(null 表示已确认无对应 npm
|
|
15
|
+
/** 反查缓存:repo 小写 → npm 包名(null 表示已确认无对应 npm 包;网络异常不缓存)。 */
|
|
16
16
|
const cache = new Map();
|
|
17
17
|
/** 单次 registry 查询超时(ms):慢网络下失败返回 null,不阻塞安装流程。 */
|
|
18
18
|
const REQUEST_TIMEOUT_MS = 8000;
|
|
19
19
|
/**
|
|
20
20
|
* 反查 repo(`owner/repo`)对应的官方 npm 包名;未命中、网络异常或超时返回 null。
|
|
21
21
|
* 返回 null 不代表仓库一定没有 npm 包,只代表本次未能确认 —— 调用方应保留
|
|
22
|
-
*
|
|
22
|
+
* 原有错误路径,反查只是额外的一次尝试。只有「已确认」的结果(包名,或 200
|
|
23
|
+
* 响应下确认无匹配)会进缓存;网络异常/超时/解析失败不缓存,同一会话内下次
|
|
24
|
+
* 安装仍会重试反查,避免一次瞬时故障把整个会话锁死在 git 通道。
|
|
23
25
|
* registry 参数:npm 镜像源地址,空串 = 官方源;与安装通道吃同一 registry,
|
|
24
26
|
* 保证「配置了镜像」时反查和安装走同一个源(镜像节点同步完整时结果一致)。
|
|
25
27
|
* 慢网络下失败不阻塞安装。
|
|
@@ -29,10 +31,14 @@ export function resolveNpmPackage(repo, registry = '') {
|
|
|
29
31
|
if (cache.has(key))
|
|
30
32
|
return Promise.resolve(cache.get(key) ?? null);
|
|
31
33
|
const name = searchRepo(repo, registry);
|
|
32
|
-
name.then((found) =>
|
|
33
|
-
|
|
34
|
+
void name.then((found) => {
|
|
35
|
+
if (found !== undefined)
|
|
36
|
+
cache.set(key, found);
|
|
37
|
+
});
|
|
38
|
+
return name.then((found) => found ?? null);
|
|
34
39
|
}
|
|
35
|
-
/** 用 npm search 接口按 repository 地址反查,并做铁证校验(包元数据必须指向该仓库)。
|
|
40
|
+
/** 用 npm search 接口按 repository 地址反查,并做铁证校验(包元数据必须指向该仓库)。
|
|
41
|
+
* 返回:包名 = 命中;null = 200 响应下确认无匹配;undefined = 本次未能确认(网络/超时/解析失败)。 */
|
|
36
42
|
function searchRepo(repo, registry) {
|
|
37
43
|
const [owner, name] = repo.split('/');
|
|
38
44
|
if (owner === undefined || name === undefined || name === '')
|
|
@@ -43,7 +49,7 @@ function searchRepo(repo, registry) {
|
|
|
43
49
|
const req = get(url, { timeout: REQUEST_TIMEOUT_MS }, (res) => {
|
|
44
50
|
if (res.statusCode !== 200) {
|
|
45
51
|
res.resume();
|
|
46
|
-
resolve(
|
|
52
|
+
resolve(undefined);
|
|
47
53
|
return;
|
|
48
54
|
}
|
|
49
55
|
let body = '';
|
|
@@ -65,11 +71,11 @@ function searchRepo(repo, registry) {
|
|
|
65
71
|
resolve(null);
|
|
66
72
|
}
|
|
67
73
|
catch {
|
|
68
|
-
resolve(
|
|
74
|
+
resolve(undefined);
|
|
69
75
|
}
|
|
70
76
|
});
|
|
71
77
|
});
|
|
72
78
|
req.on('timeout', () => req.destroy());
|
|
73
|
-
req.on('error', () => resolve(
|
|
79
|
+
req.on('error', () => resolve(undefined));
|
|
74
80
|
});
|
|
75
81
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
|
|
3
|
+
* Website: https://dsh-plugin.org
|
|
4
|
+
* GitHub: https://github.com/dshplugin/dsh-plugin-hub
|
|
5
|
+
*
|
|
6
|
+
* 包入口解析:从 package.json 的 exports["."] / main 推出用于校验的入口文件。
|
|
7
|
+
* git 通道(tar 预检)与 npm 通道(装后 statSync 校验)共用,保证两条通道
|
|
8
|
+
* 对同一个包判定一致。
|
|
9
|
+
*/
|
|
10
|
+
/** exports 条件对象里按优先级尝试的键;Node 语义下 default 最宽,import/require 次之。 */
|
|
11
|
+
const EXPORT_CONDITION_KEYS = ['default', 'import', 'require'];
|
|
12
|
+
/**
|
|
13
|
+
* 解析包的入口文件(相对包根,不带 `./` 前缀)。
|
|
14
|
+
*
|
|
15
|
+
* Node 的 exports 规范要求字符串 target 以 `./` 开头(如 `"./lib/index.js"`),
|
|
16
|
+
* 而 tar 成员名与磁盘路径都不带该前缀,因此统一剥掉;条件对象
|
|
17
|
+
* (`{ "import": ..., "require": ... }`)按 default → import → require 取第一
|
|
18
|
+
* 个字符串值。无 exports 时回退 main,再回退 index.js。
|
|
19
|
+
*/
|
|
20
|
+
export function resolvePackageEntry(meta) {
|
|
21
|
+
const dot = meta.exports?.['.'];
|
|
22
|
+
const fromExports = typeof dot === 'string'
|
|
23
|
+
? dot
|
|
24
|
+
: dot !== null && typeof dot === 'object'
|
|
25
|
+
? firstStringOf(dot)
|
|
26
|
+
: undefined;
|
|
27
|
+
const candidate = typeof fromExports === 'string' ? fromExports
|
|
28
|
+
: typeof meta.main === 'string' ? meta.main
|
|
29
|
+
: 'index.js';
|
|
30
|
+
return candidate.replace(/^\.\//u, '');
|
|
31
|
+
}
|
|
32
|
+
function firstStringOf(conditions) {
|
|
33
|
+
for (const key of EXPORT_CONDITION_KEYS) {
|
|
34
|
+
const value = conditions[key];
|
|
35
|
+
if (typeof value === 'string' && value !== '')
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
@@ -18,6 +18,7 @@ import { join } from 'node:path';
|
|
|
18
18
|
import { pipeline } from 'node:stream/promises';
|
|
19
19
|
import { promisify } from 'node:util';
|
|
20
20
|
import { githubRepoOf } from '../profile/profile.js';
|
|
21
|
+
import { resolvePackageEntry } from './package-entry.js';
|
|
21
22
|
const execFileAsync = promisify(execFile);
|
|
22
23
|
/** 单次网络操作超时(ms):git ls-remote / codeload 下载。网络不可达时不能无限挂起,
|
|
23
24
|
* 否则 `/install` 请求永远不返回、任务不入队、前端进度卡 0%。超时后放行(交给装后校验)。 */
|
|
@@ -47,13 +48,7 @@ export async function preflightTarget(target) {
|
|
|
47
48
|
const meta = await readTarJson(tar, 'package/package.json');
|
|
48
49
|
if (meta === null)
|
|
49
50
|
return { ok: true, missing: null, name: null };
|
|
50
|
-
const
|
|
51
|
-
const resolved = typeof dot === 'string'
|
|
52
|
-
? dot
|
|
53
|
-
: dot !== null && typeof dot === 'object'
|
|
54
|
-
? dot.default
|
|
55
|
-
: undefined;
|
|
56
|
-
const entry = typeof resolved === 'string' ? resolved : typeof meta.main === 'string' ? meta.main : 'index.js';
|
|
51
|
+
const entry = resolvePackageEntry(meta);
|
|
57
52
|
const inTar = await hasTarEntry(tar, `package/${entry}`);
|
|
58
53
|
return { ok: inTar, missing: inTar ? null : entry, name: typeof meta.name === 'string' ? meta.name : null };
|
|
59
54
|
}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* 输出流式收集到任务上;卸载成功时尝试从运行中 loader 即时停用(见 loader.ts)。
|
|
9
9
|
*/
|
|
10
10
|
import { spawn, spawnSync } from 'node:child_process';
|
|
11
|
+
import { resolvePackageEntry } from './package-entry.js';
|
|
11
12
|
import { readFileSync, statSync } from 'node:fs';
|
|
12
13
|
import { dirname, join, resolve } from 'node:path';
|
|
13
14
|
import { CAPTURE_LIMIT_BYTES, MAX_TASKS, MAX_TASK_LINES } from './install-types.js';
|
|
@@ -222,7 +223,19 @@ function pumpQueue() {
|
|
|
222
223
|
return;
|
|
223
224
|
const { task, options } = item;
|
|
224
225
|
task.status = 'running';
|
|
225
|
-
void runPluginMutation({ ...options, task })
|
|
226
|
+
void runPluginMutation({ ...options, task })
|
|
227
|
+
.catch((error) => {
|
|
228
|
+
// runPluginMutation 的恢复路径(如 allowBuilds 写回 pnpm-workspace.yaml)
|
|
229
|
+
// 可能抛出;落到 failed 终态并留痕,否则该 Promise 链成为未处理 rejection
|
|
230
|
+
//(Node >= 15 默认直接终止进程),而队列自身却在 finally 里继续 pump。
|
|
231
|
+
if (task.status !== 'cancelled') {
|
|
232
|
+
task.status = 'failed';
|
|
233
|
+
task.exitCode = null;
|
|
234
|
+
task.progress = 0;
|
|
235
|
+
pushLine(task, `[internal] ${error instanceof Error ? error.message : String(error)}`);
|
|
236
|
+
}
|
|
237
|
+
})
|
|
238
|
+
.finally(() => {
|
|
226
239
|
runningChildren.delete(task.id);
|
|
227
240
|
// 系统日志:任务终态(成功/失败/取消),按动作归类安装/卸载/更新日志
|
|
228
241
|
const show = task.displayTarget ?? task.target;
|
|
@@ -510,12 +523,7 @@ export function verifyInstalledEntry(profile, target) {
|
|
|
510
523
|
let entry = null;
|
|
511
524
|
try {
|
|
512
525
|
const meta = JSON.parse(readFileSync(join(pkgDir, 'package.json'), 'utf8'));
|
|
513
|
-
|
|
514
|
-
const resolved = typeof dot === 'string' ? dot
|
|
515
|
-
: dot !== null && typeof dot === 'object'
|
|
516
|
-
? dot.default
|
|
517
|
-
: undefined;
|
|
518
|
-
entry = typeof resolved === 'string' ? resolved : typeof meta.main === 'string' ? meta.main : 'index.js';
|
|
526
|
+
entry = resolvePackageEntry(meta);
|
|
519
527
|
}
|
|
520
528
|
catch {
|
|
521
529
|
return { name, missing: null };
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 反查 repo(`owner/repo`)对应的官方 npm 包名;未命中、网络异常或超时返回 null。
|
|
3
3
|
* 返回 null 不代表仓库一定没有 npm 包,只代表本次未能确认 —— 调用方应保留
|
|
4
|
-
*
|
|
4
|
+
* 原有错误路径,反查只是额外的一次尝试。只有「已确认」的结果(包名,或 200
|
|
5
|
+
* 响应下确认无匹配)会进缓存;网络异常/超时/解析失败不缓存,同一会话内下次
|
|
6
|
+
* 安装仍会重试反查,避免一次瞬时故障把整个会话锁死在 git 通道。
|
|
5
7
|
* registry 参数:npm 镜像源地址,空串 = 官方源;与安装通道吃同一 registry,
|
|
6
8
|
* 保证「配置了镜像」时反查和安装走同一个源(镜像节点同步完整时结果一致)。
|
|
7
9
|
* 慢网络下失败不阻塞安装。
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
|
|
3
|
+
* Website: https://dsh-plugin.org
|
|
4
|
+
* GitHub: https://github.com/dshplugin/dsh-plugin-hub
|
|
5
|
+
*
|
|
6
|
+
* 包入口解析:从 package.json 的 exports["."] / main 推出用于校验的入口文件。
|
|
7
|
+
* git 通道(tar 预检)与 npm 通道(装后 statSync 校验)共用,保证两条通道
|
|
8
|
+
* 对同一个包判定一致。
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* 解析包的入口文件(相对包根,不带 `./` 前缀)。
|
|
12
|
+
*
|
|
13
|
+
* Node 的 exports 规范要求字符串 target 以 `./` 开头(如 `"./lib/index.js"`),
|
|
14
|
+
* 而 tar 成员名与磁盘路径都不带该前缀,因此统一剥掉;条件对象
|
|
15
|
+
* (`{ "import": ..., "require": ... }`)按 default → import → require 取第一
|
|
16
|
+
* 个字符串值。无 exports 时回退 main,再回退 index.js。
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolvePackageEntry(meta: {
|
|
19
|
+
main?: unknown;
|
|
20
|
+
exports?: unknown;
|
|
21
|
+
}): string;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-plugin",
|
|
3
|
-
"version": "1.4.
|
|
4
|
-
"description": "A community plugin marketplace for DeepSeek Harness, built to the official plugin spec — browse, search and install
|
|
3
|
+
"version": "1.4.8",
|
|
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",
|
|
7
7
|
"types": "lib/types/index.d.ts",
|
|
@@ -495,13 +495,18 @@ export function mountPluginHubRoutes(webServer: WebServerService, profile: strin
|
|
|
495
495
|
const child = spawn(bin, args)
|
|
496
496
|
let out = ''
|
|
497
497
|
child.stdout.on('data', (d) => { out += String(d) })
|
|
498
|
-
|
|
499
|
-
|
|
498
|
+
// spawn 失败(如 Linux 无 zenity)会先触发 error 再触发 close(code=-2):
|
|
499
|
+
// 只允许第一个事件应答,否则第二次 sendJson 对已结束的响应再 writeHead,
|
|
500
|
+
// 抛 ERR_HTTP_HEADERS_SENT 成为宿主进程内的未捕获异常。
|
|
501
|
+
let done = false
|
|
502
|
+
const finish = (reply: () => void) => { if (!done) { done = true; reply() } }
|
|
503
|
+
child.on('error', () => finish(() => sendJson(response, 500, { error: 'directory picker unavailable' })))
|
|
504
|
+
child.on('close', (code) => finish(() => {
|
|
500
505
|
// macOS osascript 输出带引号(如 "/Users/x"),统一剥掉首尾空白与引号
|
|
501
506
|
const picked = out.trim().replace(/^"|"$/g, '')
|
|
502
507
|
if (code === 0 && picked !== '') sendJson(response, 200, { path: picked })
|
|
503
508
|
else sendJson(response, 200, { cancelled: true })
|
|
504
|
-
})
|
|
509
|
+
}))
|
|
505
510
|
} catch {
|
|
506
511
|
sendJson(response, 500, { error: 'directory picker unavailable' })
|
|
507
512
|
}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { get } from 'node:https'
|
|
15
15
|
|
|
16
|
-
/** 反查缓存:repo 小写 → npm 包名(null 表示已确认无对应 npm
|
|
16
|
+
/** 反查缓存:repo 小写 → npm 包名(null 表示已确认无对应 npm 包;网络异常不缓存)。 */
|
|
17
17
|
const cache = new Map<string, string | null>()
|
|
18
18
|
|
|
19
19
|
/** 单次 registry 查询超时(ms):慢网络下失败返回 null,不阻塞安装流程。 */
|
|
@@ -22,7 +22,9 @@ const REQUEST_TIMEOUT_MS = 8000
|
|
|
22
22
|
/**
|
|
23
23
|
* 反查 repo(`owner/repo`)对应的官方 npm 包名;未命中、网络异常或超时返回 null。
|
|
24
24
|
* 返回 null 不代表仓库一定没有 npm 包,只代表本次未能确认 —— 调用方应保留
|
|
25
|
-
*
|
|
25
|
+
* 原有错误路径,反查只是额外的一次尝试。只有「已确认」的结果(包名,或 200
|
|
26
|
+
* 响应下确认无匹配)会进缓存;网络异常/超时/解析失败不缓存,同一会话内下次
|
|
27
|
+
* 安装仍会重试反查,避免一次瞬时故障把整个会话锁死在 git 通道。
|
|
26
28
|
* registry 参数:npm 镜像源地址,空串 = 官方源;与安装通道吃同一 registry,
|
|
27
29
|
* 保证「配置了镜像」时反查和安装走同一个源(镜像节点同步完整时结果一致)。
|
|
28
30
|
* 慢网络下失败不阻塞安装。
|
|
@@ -31,12 +33,15 @@ export function resolveNpmPackage(repo: string, registry = ''): Promise<string |
|
|
|
31
33
|
const key = repo.toLowerCase()
|
|
32
34
|
if (cache.has(key)) return Promise.resolve(cache.get(key) ?? null)
|
|
33
35
|
const name = searchRepo(repo, registry)
|
|
34
|
-
name.then((found) =>
|
|
35
|
-
|
|
36
|
+
void name.then((found) => {
|
|
37
|
+
if (found !== undefined) cache.set(key, found)
|
|
38
|
+
})
|
|
39
|
+
return name.then((found) => found ?? null)
|
|
36
40
|
}
|
|
37
41
|
|
|
38
|
-
/** 用 npm search 接口按 repository 地址反查,并做铁证校验(包元数据必须指向该仓库)。
|
|
39
|
-
|
|
42
|
+
/** 用 npm search 接口按 repository 地址反查,并做铁证校验(包元数据必须指向该仓库)。
|
|
43
|
+
* 返回:包名 = 命中;null = 200 响应下确认无匹配;undefined = 本次未能确认(网络/超时/解析失败)。 */
|
|
44
|
+
function searchRepo(repo: string, registry: string): Promise<string | null | undefined> {
|
|
40
45
|
const [owner, name] = repo.split('/')
|
|
41
46
|
if (owner === undefined || name === undefined || name === '') return Promise.resolve(null)
|
|
42
47
|
const base = registry === '' ? 'https://registry.npmjs.org' : registry.replace(/\/+$/, '')
|
|
@@ -45,7 +50,7 @@ function searchRepo(repo: string, registry: string): Promise<string | null> {
|
|
|
45
50
|
const req = get(url, { timeout: REQUEST_TIMEOUT_MS }, (res) => {
|
|
46
51
|
if (res.statusCode !== 200) {
|
|
47
52
|
res.resume()
|
|
48
|
-
resolve(
|
|
53
|
+
resolve(undefined)
|
|
49
54
|
return
|
|
50
55
|
}
|
|
51
56
|
let body = ''
|
|
@@ -65,11 +70,11 @@ function searchRepo(repo: string, registry: string): Promise<string | null> {
|
|
|
65
70
|
}
|
|
66
71
|
resolve(null)
|
|
67
72
|
} catch {
|
|
68
|
-
resolve(
|
|
73
|
+
resolve(undefined)
|
|
69
74
|
}
|
|
70
75
|
})
|
|
71
76
|
})
|
|
72
77
|
req.on('timeout', () => req.destroy())
|
|
73
|
-
req.on('error', () => resolve(
|
|
78
|
+
req.on('error', () => resolve(undefined))
|
|
74
79
|
})
|
|
75
80
|
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
|
|
3
|
+
* Website: https://dsh-plugin.org
|
|
4
|
+
* GitHub: https://github.com/dshplugin/dsh-plugin-hub
|
|
5
|
+
*
|
|
6
|
+
* 包入口解析:从 package.json 的 exports["."] / main 推出用于校验的入口文件。
|
|
7
|
+
* git 通道(tar 预检)与 npm 通道(装后 statSync 校验)共用,保证两条通道
|
|
8
|
+
* 对同一个包判定一致。
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** exports 条件对象里按优先级尝试的键;Node 语义下 default 最宽,import/require 次之。 */
|
|
12
|
+
const EXPORT_CONDITION_KEYS = ['default', 'import', 'require'] as const
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* 解析包的入口文件(相对包根,不带 `./` 前缀)。
|
|
16
|
+
*
|
|
17
|
+
* Node 的 exports 规范要求字符串 target 以 `./` 开头(如 `"./lib/index.js"`),
|
|
18
|
+
* 而 tar 成员名与磁盘路径都不带该前缀,因此统一剥掉;条件对象
|
|
19
|
+
* (`{ "import": ..., "require": ... }`)按 default → import → require 取第一
|
|
20
|
+
* 个字符串值。无 exports 时回退 main,再回退 index.js。
|
|
21
|
+
*/
|
|
22
|
+
export function resolvePackageEntry(meta: { main?: unknown; exports?: unknown }): string {
|
|
23
|
+
const dot = (meta.exports as Record<string, unknown> | undefined)?.['.']
|
|
24
|
+
const fromExports = typeof dot === 'string'
|
|
25
|
+
? dot
|
|
26
|
+
: dot !== null && typeof dot === 'object'
|
|
27
|
+
? firstStringOf(dot as Record<string, unknown>)
|
|
28
|
+
: undefined
|
|
29
|
+
const candidate = typeof fromExports === 'string' ? fromExports
|
|
30
|
+
: typeof meta.main === 'string' ? meta.main
|
|
31
|
+
: 'index.js'
|
|
32
|
+
return candidate.replace(/^\.\//u, '')
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function firstStringOf(conditions: Record<string, unknown>): string | undefined {
|
|
36
|
+
for (const key of EXPORT_CONDITION_KEYS) {
|
|
37
|
+
const value = conditions[key]
|
|
38
|
+
if (typeof value === 'string' && value !== '') return value
|
|
39
|
+
}
|
|
40
|
+
return undefined
|
|
41
|
+
}
|
|
@@ -18,6 +18,7 @@ import { join } from 'node:path'
|
|
|
18
18
|
import { pipeline } from 'node:stream/promises'
|
|
19
19
|
import { promisify } from 'node:util'
|
|
20
20
|
import { githubRepoOf } from '../profile/profile.ts'
|
|
21
|
+
import { resolvePackageEntry } from './package-entry.ts'
|
|
21
22
|
|
|
22
23
|
const execFileAsync = promisify(execFile)
|
|
23
24
|
|
|
@@ -56,13 +57,7 @@ export async function preflightTarget(target: string): Promise<PreflightResult>
|
|
|
56
57
|
await download(`https://codeload.github.com/${owner}/${repo}/tar.gz/${commit}`, tar)
|
|
57
58
|
const meta = await readTarJson(tar, 'package/package.json')
|
|
58
59
|
if (meta === null) return { ok: true, missing: null, name: null }
|
|
59
|
-
const
|
|
60
|
-
const resolved = typeof dot === 'string'
|
|
61
|
-
? dot
|
|
62
|
-
: dot !== null && typeof dot === 'object'
|
|
63
|
-
? (dot as Record<string, unknown>).default
|
|
64
|
-
: undefined
|
|
65
|
-
const entry = typeof resolved === 'string' ? resolved : typeof meta.main === 'string' ? meta.main : 'index.js'
|
|
60
|
+
const entry = resolvePackageEntry(meta)
|
|
66
61
|
const inTar = await hasTarEntry(tar, `package/${entry}`)
|
|
67
62
|
return { ok: inTar, missing: inTar ? null : entry, name: typeof meta.name === 'string' ? meta.name : null }
|
|
68
63
|
} catch {
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* 输出流式收集到任务上;卸载成功时尝试从运行中 loader 即时停用(见 loader.ts)。
|
|
9
9
|
*/
|
|
10
10
|
import { spawn, spawnSync } from 'node:child_process'
|
|
11
|
+
import { resolvePackageEntry } from './package-entry.ts'
|
|
11
12
|
import { readFileSync, statSync } from 'node:fs'
|
|
12
13
|
import { dirname, join, resolve } from 'node:path'
|
|
13
14
|
import type { InstallResult, InstallTask, Invocation, QueueItem } from './install-types.ts'
|
|
@@ -258,7 +259,19 @@ function pumpQueue(): void {
|
|
|
258
259
|
if (!item) return
|
|
259
260
|
const { task, options } = item
|
|
260
261
|
task.status = 'running'
|
|
261
|
-
void runPluginMutation({ ...options, task })
|
|
262
|
+
void runPluginMutation({ ...options, task })
|
|
263
|
+
.catch((error) => {
|
|
264
|
+
// runPluginMutation 的恢复路径(如 allowBuilds 写回 pnpm-workspace.yaml)
|
|
265
|
+
// 可能抛出;落到 failed 终态并留痕,否则该 Promise 链成为未处理 rejection
|
|
266
|
+
//(Node >= 15 默认直接终止进程),而队列自身却在 finally 里继续 pump。
|
|
267
|
+
if (task.status !== 'cancelled') {
|
|
268
|
+
task.status = 'failed'
|
|
269
|
+
task.exitCode = null
|
|
270
|
+
task.progress = 0
|
|
271
|
+
pushLine(task, `[internal] ${error instanceof Error ? error.message : String(error)}`)
|
|
272
|
+
}
|
|
273
|
+
})
|
|
274
|
+
.finally(() => {
|
|
262
275
|
runningChildren.delete(task.id)
|
|
263
276
|
// 系统日志:任务终态(成功/失败/取消),按动作归类安装/卸载/更新日志
|
|
264
277
|
const show = task.displayTarget ?? task.target
|
|
@@ -547,12 +560,7 @@ export function verifyInstalledEntry(profile: string, target: string): { name: s
|
|
|
547
560
|
main?: unknown
|
|
548
561
|
exports?: unknown
|
|
549
562
|
}
|
|
550
|
-
|
|
551
|
-
const resolved = typeof dot === 'string' ? dot
|
|
552
|
-
: dot !== null && typeof dot === 'object'
|
|
553
|
-
? (dot as Record<string, unknown>).default
|
|
554
|
-
: undefined
|
|
555
|
-
entry = typeof resolved === 'string' ? resolved : typeof meta.main === 'string' ? meta.main : 'index.js'
|
|
563
|
+
entry = resolvePackageEntry(meta)
|
|
556
564
|
} catch {
|
|
557
565
|
return { name, missing: null }
|
|
558
566
|
}
|