@noob-stupid/dsh-plugin-console 0.3.31 → 0.3.32
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/lib/client.js +186 -37
- package/lib/index.js +72 -20
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -6,7 +6,7 @@ window.__ModuleLoader__.load({
|
|
|
6
6
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
7
7
|
let react = require("react");
|
|
8
8
|
//#region styles
|
|
9
|
-
const css = ".pc_section{width:100%;max-width:760px;color:var(--dsw-alias-label-primary);flex-direction:column;gap:14px;display:flex}.pc_section h3{margin:0;font-size:13px;font-weight:600;line-height:20px}.pc_message{color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:20px;margin:0}.pc_messageRow{display:flex;align-items:center;gap:10px}.pc_spinner{width:14px;height:14px;border:2px solid var(--dsw-alias-border-l2);border-top-color:var(--dsw-alias-state-business-primary);border-radius:50%;animation:pcspin 1s linear infinite;flex:none}@keyframes pcspin{to{transform:rotate(360deg)}}.pc_message[data-error=true]{color:var(--dsw-alias-state-error-primary)}.pc_message[data-warn=true]{color:var(--dsw-alias-state-warning-primary)}.pc_list{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin:0;padding:0;list-style:none;display:grid}.pc_row{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;min-width:0;padding:10px 12px;flex-direction:column;gap:6px;display:flex}.pc_rowTop{align-items:center;gap:8px;display:flex}.pc_name{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.pc_tag{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-tertiary);border-radius:999px;padding:1px 8px;font-size:11px;line-height:16px;flex:none}.pc_tag[data-enabled=true]{border-color:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-state-success-primary)}.pc_tag[data-user=true]{border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_tag[data-pending=true]{border-color:var(--dsw-alias-state-warning-primary);color:var(--dsw-alias-state-warning-primary)}.pc_status[data-pending=true]{color:var(--dsw-alias-state-warning-primary)}.pc_toggle[data-pending=true]{border-color:var(--dsw-alias-state-warning-primary);color:var(--dsw-alias-state-warning-primary)}.pc_tag[data-skill=true]{border-color:var(--dsw-alias-state-warning-primary);color:var(--dsw-alias-state-warning-primary)}.pc_tag[data-system=true]{border-color:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2)}.pc_tag[data-disabled=true]{border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary)}.pc_tag[data-suite=true]{border-color:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-state-success-primary)}.pc_tag[data-error=true]{border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary)}.pc_tabGroup{display:inline-flex;gap:4px;align-items:center}.pc_meta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px;gap:6px;display:flex;align-items:center}.pc_phase[data-phase=failed]{color:var(--dsw-alias-state-error-primary)}.pc_phase[data-phase=active]{color:var(--dsw-alias-state-success-primary)}.pc_toggle{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:0 0;font:inherit;cursor:pointer;border-radius:6px;padding:4px 12px;align-self:flex-start}.pc_toggle:hover:not(:disabled){border-color:var(--dsw-alias-state-business-primary)}.pc_toggle:disabled{opacity:.5;cursor:default}.pc_search{gap:8px;display:flex}.pc_search input{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);height:34px;flex:1;color:var(--dsw-alias-label-primary);font:inherit;border-radius:8px;outline:none;padding:0 12px;font-size:13px}.pc_search input:focus-visible{border-color:var(--dsw-alias-state-business-primary)}.pc_search button{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);font:inherit;cursor:pointer;border-radius:8px;padding:0 14px;font-size:13px}.pc_search button:hover{border-color:var(--dsw-alias-state-business-primary)}.pc_market{flex-direction:column;gap:10px;margin:0;padding:0;list-style:none;display:flex}.pc_item{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;min-width:0;padding:10px 12px;flex-direction:column;gap:6px;display:flex}.pc_itemTop{align-items:center;gap:8px;display:flex}.pc_itemTop a{color:var(--dsw-alias-state-business-primary);font-size:13px;font-weight:600;text-decoration:none;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pc_stars{color:var(--dsw-alias-label-tertiary);font-size:11px;flex:none}.pc_desc{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px;margin:0}.pc_item button{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:0 0;font:inherit;cursor:pointer;border-radius:6px;padding:3px 10px;align-self:flex-start;font-size:12px}.pc_item button:hover:not(:disabled){border-color:var(--dsw-alias-state-business-primary)}.pc_item button:disabled{opacity:.5;cursor:default}.pc_detail{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;padding:10px 12px;flex-direction:column;gap:6px;display:flex}.pc_status{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px;margin:0}.pc_note{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px;margin:0}.pc_marketHead{display:flex;align-items:center;justify-content:space-between;gap:10px}.pc_descWrap{flex-direction:column;display:flex}.pc_installedHead{display:flex;align-items:center;gap:10px}.pc_backTopWrap{position:fixed;top:56px;right:20px;z-index:100;display:flex;flex-direction:column;gap:8px}.pc_backTop{width:34px;height:34px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;background:rgba(22,27,34,.72);border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);cursor:pointer;backdrop-filter:blur(4px);opacity:.7}.pc_backTop:hover{opacity:1;border-color:var(--dsw-alias-state-business-primary)}.pc_descTopbar{display:flex;justify-content:flex-end;margin:2px 0}.pc_ghpill{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-tertiary);border-radius:999px;padding:1px 10px;font-size:11px;line-height:18px}.pc_ghpill[data-on=true]{border-color:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-state-success-primary)}.pc_extraBtn{opacity:.75;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:0 0;font:inherit;cursor:pointer;border-radius:6px;padding:4px 10px;font-size:12px;line-height:16px;flex:none;transition:opacity .15s ease,border-color 1.5s ease,color 1.5s ease}.pc_extraBtn:hover{opacity:1}.pc_extraBtn[data-active=true]{opacity:1;border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_extraBtn[data-flash=true]{border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_view{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:0 0;font:inherit;cursor:pointer;border-radius:6px;padding:2px 10px;font-size:12px;line-height:18px;flex:none}.pc_floatPanel{position:fixed;left:20px;top:50%;transform:translateY(-50%);width:340px;max-height:75vh;overflow-y:auto;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;padding:12px;box-shadow:0 8px 24px rgba(0,0,0,.18);z-index:50;flex-direction:column;gap:8px;display:flex}.pc_refresh{position:sticky;bottom:14px;align-self:flex-end;margin-top:8px;z-index:60;opacity:1;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:transparent;font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_refresh:hover{opacity:.9}.pc_date{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px;flex:none}.pc_searchInner{position:relative;flex:1;display:flex;align-items:center;min-width:0}.pc_searchInner input{padding-right:32px;width:100%}.pc_starBtn{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-tertiary);cursor:pointer;font-size:13px;line-height:1;padding:4px 8px;border-radius:6px;opacity:.75;transition:opacity .15s ease;flex:none}.pc_starBtn:hover{opacity:1}.pc_starBtn[data-active=true]{opacity:1;color:var(--dsw-alias-state-business-primary)}.pc_restartBtn{position:fixed;right:20px;top:50%;transform:translateY(-50%);z-index:60;opacity:1;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:transparent;font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_restartBtn:hover{opacity:.9}.pc_relaunchFloat{position:fixed;left:20px;top:50%;transform:translateY(-50%);z-index:70;opacity:.85;border:1px solid var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_relaunchFloat:hover{opacity:1}.pc_aiToggle{position:fixed;right:20px;top:20px;z-index:70;opacity:1;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_aiToggle:hover{opacity:1}.pc_aiToggle[data-active=true]{opacity:1;border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_sourcesFloat{position:fixed;right:20px;top:104px;z-index:70;opacity:1;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_sourcesFloat:hover{opacity:1;border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_modeFloat{position:fixed;right:20px;top:204px;z-index:70;opacity:1;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_modeFloat:hover{opacity:1;border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_modeFloat[data-mode=true]{opacity:1;border-color:var(--dsw-alias-state-warning-primary);color:var(--dsw-alias-state-warning-primary)}.pc_trashBtn{border:0;background:0 0;color:var(--dsw-alias-label-tertiary);cursor:pointer;font-size:12px;line-height:16px;padding:2px 6px;flex:none;display:flex;align-items:center;border-radius:6px;transition:color .15s ease}.pc_trashBtn:hover{color:var(--dsw-alias-state-error-primary)}.pc_consentRemember{display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;color:var(--dsw-alias-label-secondary);cursor:pointer}.pc_modalBackdrop{position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:1000;display:flex;align-items:center;justify-content:center}.pc_modalCard{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:12px;padding:16px 18px;width:min(760px,calc(100vw - 64px));max-height:calc(100vh - 96px);overflow-y:auto;overscroll-behavior:contain;flex-direction:column;gap:10px;display:flex;box-shadow:0 12px 32px rgba(0,0,0,.25)}.pc_modalCard::-webkit-scrollbar{width:8px}.pc_modalCard::-webkit-scrollbar-thumb{background:var(--dsw-alias-border-l2);border-radius:4px}.pc_srcUrl{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;color:var(--dsw-alias-label-tertiary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:100%}.pc_accWrap{display:flex;flex-direction:column;gap:8px}.pc_acc{border:1px solid var(--dsw-alias-border-l2);border-radius:10px;overflow:hidden;background:var(--dsw-alias-bg-layer-2)}.pc_accHead{width:100%;text-align:left;background:transparent;border:0;color:var(--dsw-alias-label-primary);font:inherit;font-size:13px;font-weight:600;line-height:20px;padding:8px 12px;cursor:pointer;display:flex;align-items:center;gap:6px}.pc_accHead:hover{background:var(--dsw-alias-bg-layer-3)}.pc_accHead[data-open=true]{border-bottom:1px solid var(--dsw-alias-border-l2)}.pc_accBody{padding:10px 12px;display:flex;flex-direction:column;gap:8px}.pc_ghpill{background:0 0;cursor:pointer}.pc_ghwrap{position:relative;display:inline-flex}.pc_sourceMenu{position:absolute;right:0;top:calc(100% + 6px);z-index:90;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:8px;padding:4px;flex-direction:column;display:flex;min-width:120px;box-shadow:0 8px 24px rgba(0,0,0,.18)}.pc_sourceOpt{border:0;background:0 0;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;border-radius:6px;padding:6px 10px;text-align:left;font-size:12px;line-height:16px}.pc_sourceOpt[data-active=true]{color:var(--dsw-alias-state-business-primary);font-weight:600}.pc_sourceOpt:hover{background:var(--dsw-alias-bg-layer-3)}.pc_aiEmpower{position:fixed;right:20px;top:48px;z-index:70;opacity:1;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_aiEmpower:hover{opacity:.9}.pc_aiEmpower[data-busy=true]{opacity:1;border-color:var(--dsw-alias-state-warning-primary);color:var(--dsw-alias-state-warning-primary)}.pc_aiEmpower[data-active=true]{opacity:1;border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_compCard{position:fixed;left:8px;top:20px;width:320px;max-height:70vh;overflow-y:auto;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;padding:12px;box-shadow:0 8px 24px rgba(0,0,0,.18);z-index:45;flex-direction:column;gap:8px;display:flex}.pc_compCard .pc_rowTop{flex-wrap:wrap}.pc_compCard .pc_toggle{padding:3px 8px;font-size:11px}.pc_compCard[data-hidden=true]{display:none}.pc_compDrop{background:rgba(24,28,34,.92);backdrop-filter:blur(6px);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:4px;box-shadow:0 8px 24px rgba(0,0,0,.35);flex-direction:column;display:flex;gap:2px}.pc_compDropRow{border:0;background:0 0;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;border-radius:6px;padding:6px 8px;text-align:left;font-size:12px;line-height:16px;flex-direction:column;display:flex;gap:2px}.pc_compDropRow:hover{background:var(--dsw-alias-bg-layer-2)}.pc_compDropUrl{color:var(--dsw-alias-label-tertiary);font-size:11px;word-break:break-all}.pc_compToggle{position:fixed;left:336px;top:20px;z-index:46;opacity:.55;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:rgba(22,27,34,.72);font:inherit;cursor:pointer;width:20px;height:20px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:11px;line-height:1;backdrop-filter:blur(4px);transition:opacity .15s ease}.pc_compToggle:hover{opacity:1;border-color:var(--dsw-alias-state-business-primary)}.pc_toolbarMain{position:fixed;right:70px;top:20px;z-index:71;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:border-color .15s ease}.pc_toolbarMain:hover{border-color:var(--dsw-alias-state-business-primary)}.pc_toolbarMain[data-active=true]{border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_toolbarGroup{position:fixed;right:70px;top:56px;z-index:70;flex-direction:column;gap:8px;display:flex;transform-origin:top right;animation:pcDrawerIn .3s cubic-bezier(.34,1.56,.64,1)}@media (max-width:1160px){.pc_toolbarMain{top:104px}.pc_toolbarGroup{top:140px}.pc_aiToggle{top:104px}.pc_aiEmpower{top:132px}.pc_sourcesFloat{top:188px}.pc_modeFloat{top:288px}}@keyframes pcDrawerIn{from{opacity:0;transform:translateX(28px) scale(.94)}to{opacity:1;transform:translateX(0) scale(1)}}.pc_toolItem{opacity:.85;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_toolItem:hover{opacity:1;border-color:var(--dsw-alias-state-business-primary)}.pc_toolItem[data-active=true]{opacity:1;border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_toolItem[data-mode=true]{opacity:1;border-color:var(--dsw-alias-state-warning-primary);color:var(--dsw-alias-state-warning-primary)}.pc_switch{width:34px;height:18px;border-radius:999px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);position:relative;cursor:pointer;flex:none;transition:background .15s ease,border-color .15s ease}.pc_switch:hover{border-color:var(--dsw-alias-state-business-primary)}.pc_switch[data-on=true]{background:var(--dsw-alias-state-success-primary);border-color:var(--dsw-alias-state-success-primary)}.pc_switchKnob{position:absolute;top:2px;left:2px;width:12px;height:12px;border-radius:50%;background:#fff;transition:left .15s ease}.pc_switch[data-on=true] .pc_switchKnob{left:18px}.pc_aiSpinner{width:12px;height:12px;border:2px solid var(--dsw-alias-border-l2);border-top-color:var(--dsw-alias-state-business-primary);border-radius:50%;animation:pcspin 1s linear infinite;flex:none}.pc_aiSpinBtn{position:fixed;right:152px;top:20px;z-index:71;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px}.pc_aiSpinBtn:hover{border-color:var(--dsw-alias-state-business-primary)}";
|
|
9
|
+
const css = ".pc_section{width:100%;max-width:760px;color:var(--dsw-alias-label-primary);flex-direction:column;gap:14px;display:flex}.pc_section h3{margin:0;font-size:13px;font-weight:600;line-height:20px}.pc_message{color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:20px;margin:0}.pc_messageRow{display:flex;align-items:center;gap:10px}.pc_spinner{width:14px;height:14px;border:2px solid var(--dsw-alias-border-l2);border-top-color:var(--dsw-alias-state-business-primary);border-radius:50%;animation:pcspin 1s linear infinite;flex:none}@keyframes pcspin{to{transform:rotate(360deg)}}.pc_message[data-error=true]{color:var(--dsw-alias-state-error-primary)}.pc_message[data-warn=true]{color:var(--dsw-alias-state-warning-primary)}.pc_list{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin:0;padding:0;list-style:none;display:grid}.pc_row{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;min-width:0;padding:10px 12px;flex-direction:column;gap:6px;display:flex}.pc_rowTop{align-items:center;gap:8px;display:flex}.pc_name{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.pc_tag{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-tertiary);border-radius:999px;padding:1px 8px;font-size:11px;line-height:16px;flex:none}.pc_tag[data-enabled=true]{border-color:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-state-success-primary)}.pc_tag[data-user=true]{border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_tag[data-pending=true]{border-color:var(--dsw-alias-state-warning-primary);color:var(--dsw-alias-state-warning-primary)}.pc_status[data-pending=true]{color:var(--dsw-alias-state-warning-primary)}.pc_toggle[data-pending=true]{border-color:var(--dsw-alias-state-warning-primary);color:var(--dsw-alias-state-warning-primary)}.pc_tag[data-skill=true]{border-color:var(--dsw-alias-state-warning-primary);color:var(--dsw-alias-state-warning-primary)}.pc_tag[data-system=true]{border-color:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2)}.pc_tag[data-disabled=true]{border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary)}.pc_tag[data-suite=true]{border-color:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-state-success-primary)}.pc_tag[data-error=true]{border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary)}.pc_tabGroup{display:inline-flex;gap:4px;align-items:center}.pc_meta{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px;gap:6px;display:flex;align-items:center}.pc_phase[data-phase=failed]{color:var(--dsw-alias-state-error-primary)}.pc_phase[data-phase=active]{color:var(--dsw-alias-state-success-primary)}.pc_toggle{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:0 0;font:inherit;cursor:pointer;border-radius:6px;padding:4px 12px;align-self:flex-start}.pc_toggle:hover:not(:disabled){border-color:var(--dsw-alias-state-business-primary)}.pc_toggle:disabled{opacity:.5;cursor:default}.pc_search{gap:8px;display:flex}.pc_search input{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);height:34px;flex:1;color:var(--dsw-alias-label-primary);font:inherit;border-radius:8px;outline:none;padding:0 12px;font-size:13px}.pc_search input:focus-visible{border-color:var(--dsw-alias-state-business-primary)}.pc_search button{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);font:inherit;cursor:pointer;border-radius:8px;padding:0 14px;font-size:13px}.pc_search button:hover{border-color:var(--dsw-alias-state-business-primary)}.pc_market{flex-direction:column;gap:10px;margin:0;padding:0;list-style:none;display:flex}.pc_item{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;min-width:0;padding:10px 12px;flex-direction:column;gap:6px;display:flex}.pc_itemTop{align-items:center;gap:8px;display:flex}.pc_itemTop a{color:var(--dsw-alias-state-business-primary);font-size:13px;font-weight:600;text-decoration:none;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pc_stars{color:var(--dsw-alias-label-tertiary);font-size:11px;flex:none}.pc_desc{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px;margin:0}.pc_item button{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:0 0;font:inherit;cursor:pointer;border-radius:6px;padding:3px 10px;align-self:flex-start;font-size:12px}.pc_item button:hover:not(:disabled){border-color:var(--dsw-alias-state-business-primary)}.pc_item button:disabled{opacity:.5;cursor:default}.pc_detail{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;padding:10px 12px;flex-direction:column;gap:6px;display:flex}.pc_status{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px;margin:0}.pc_note{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px;margin:0}.pc_marketHead{display:flex;align-items:center;justify-content:space-between;gap:10px}.pc_descWrap{flex-direction:column;display:flex}.pc_installedHead{display:flex;align-items:center;gap:10px}.pc_backTopWrap{position:fixed;top:56px;right:20px;z-index:100;display:flex;flex-direction:column;gap:8px}.pc_backTop{width:34px;height:34px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;background:rgba(22,27,34,.72);border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);cursor:pointer;backdrop-filter:blur(4px);opacity:.7}.pc_backTop:hover{opacity:1;border-color:var(--dsw-alias-state-business-primary)}.pc_descTopbar{display:flex;justify-content:flex-end;margin:2px 0}.pc_ghpill{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-tertiary);border-radius:999px;padding:1px 10px;font-size:11px;line-height:18px}.pc_ghpill[data-on=true]{border-color:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-state-success-primary)}.pc_extraBtn{opacity:.75;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:0 0;font:inherit;cursor:pointer;border-radius:6px;padding:4px 10px;font-size:12px;line-height:16px;flex:none;transition:opacity .15s ease,border-color 1.5s ease,color 1.5s ease}.pc_extraBtn:hover{opacity:1}.pc_extraBtn[data-active=true]{opacity:1;border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_extraBtn[data-flash=true]{border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_view{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:0 0;font:inherit;cursor:pointer;border-radius:6px;padding:2px 10px;font-size:12px;line-height:18px;flex:none}.pc_floatPanel{position:fixed;left:20px;top:50%;transform:translateY(-50%);width:340px;max-height:75vh;overflow-y:auto;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;padding:12px;box-shadow:0 8px 24px rgba(0,0,0,.18);z-index:50;flex-direction:column;gap:8px;display:flex}.pc_refresh{position:sticky;bottom:14px;align-self:flex-end;margin-top:8px;z-index:60;opacity:1;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:transparent;font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_refresh:hover{opacity:.9}.pc_date{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px;flex:none}.pc_searchInner{position:relative;flex:1;display:flex;align-items:center;min-width:0}.pc_searchInner input{padding-right:32px;width:100%}.pc_starBtn{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-tertiary);cursor:pointer;font-size:13px;line-height:1;padding:4px 8px;border-radius:6px;opacity:.75;transition:opacity .15s ease;flex:none}.pc_starBtn:hover{opacity:1}.pc_starBtn[data-active=true]{opacity:1;color:var(--dsw-alias-state-business-primary)}.pc_restartBtn{position:fixed;right:20px;top:50%;transform:translateY(-50%);z-index:60;opacity:1;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:transparent;font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_restartBtn:hover{opacity:.9}.pc_relaunchFloat{position:fixed;left:20px;top:50%;transform:translateY(-50%);z-index:70;opacity:.85;border:1px solid var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_relaunchFloat:hover{opacity:1}.pc_aiToggle{position:fixed;right:20px;top:20px;z-index:70;opacity:1;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_aiToggle:hover{opacity:1}.pc_aiToggle[data-active=true]{opacity:1;border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_sourcesFloat{position:fixed;right:20px;top:104px;z-index:70;opacity:1;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_sourcesFloat:hover{opacity:1;border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_modeFloat{position:fixed;right:20px;top:204px;z-index:70;opacity:1;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_modeFloat:hover{opacity:1;border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_modeFloat[data-mode=true]{opacity:1;border-color:var(--dsw-alias-state-warning-primary);color:var(--dsw-alias-state-warning-primary)}.pc_trashBtn{border:0;background:0 0;color:var(--dsw-alias-label-tertiary);cursor:pointer;font-size:12px;line-height:16px;padding:2px 6px;flex:none;display:flex;align-items:center;border-radius:6px;transition:color .15s ease}.pc_trashBtn:hover{color:var(--dsw-alias-state-error-primary)}.pc_consentRemember{display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;color:var(--dsw-alias-label-secondary);cursor:pointer}.pc_modalBackdrop{position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:1000;display:flex;align-items:center;justify-content:center}.pc_modalCard{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:12px;padding:16px 18px;width:min(760px,calc(100vw - 64px));max-height:calc(100vh - 96px);overflow-y:auto;overscroll-behavior:contain;flex-direction:column;gap:10px;display:flex;box-shadow:0 12px 32px rgba(0,0,0,.25)}.pc_modalCard::-webkit-scrollbar{width:8px}.pc_modalCard::-webkit-scrollbar-thumb{background:var(--dsw-alias-border-l2);border-radius:4px}.pc_srcUrl{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;color:var(--dsw-alias-label-tertiary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;max-width:100%}.pc_accWrap{display:flex;flex-direction:column;gap:8px}.pc_acc{border:1px solid var(--dsw-alias-border-l2);border-radius:10px;overflow:hidden;background:var(--dsw-alias-bg-layer-2)}.pc_accHead{width:100%;text-align:left;background:transparent;border:0;color:var(--dsw-alias-label-primary);font:inherit;font-size:13px;font-weight:600;line-height:20px;padding:8px 12px;cursor:pointer;display:flex;align-items:center;gap:6px}.pc_accHead:hover{background:var(--dsw-alias-bg-layer-3)}.pc_accHead[data-open=true]{border-bottom:1px solid var(--dsw-alias-border-l2)}.pc_accBody{padding:10px 12px;display:flex;flex-direction:column;gap:8px}.pc_ghpill{background:0 0;cursor:pointer}.pc_ghwrap{position:relative;display:inline-flex}.pc_sourceMenu{position:absolute;right:0;top:calc(100% + 6px);z-index:90;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:8px;padding:4px;flex-direction:column;display:flex;min-width:120px;box-shadow:0 8px 24px rgba(0,0,0,.18)}.pc_sourceOpt{border:0;background:0 0;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;border-radius:6px;padding:6px 10px;text-align:left;font-size:12px;line-height:16px}.pc_sourceOpt[data-active=true]{color:var(--dsw-alias-state-business-primary);font-weight:600}.pc_sourceOpt:hover{background:var(--dsw-alias-bg-layer-3)}.pc_aiEmpower{position:fixed;right:20px;top:48px;z-index:70;opacity:1;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2);font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_aiEmpower:hover{opacity:.9}.pc_aiEmpower[data-busy=true]{opacity:1;border-color:var(--dsw-alias-state-warning-primary);color:var(--dsw-alias-state-warning-primary)}.pc_aiEmpower[data-active=true]{opacity:1;border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_compCard{position:fixed;left:8px;top:20px;width:320px;max-height:70vh;overflow-y:auto;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;padding:12px;box-shadow:0 8px 24px rgba(0,0,0,.18);z-index:45;flex-direction:column;gap:8px;display:flex}.pc_compCard .pc_rowTop{flex-wrap:wrap}.pc_compCard .pc_toggle{padding:3px 8px;font-size:11px}.pc_compCard[data-hidden=true]{display:none}.pc_compDrop{background:rgba(24,28,34,.92);backdrop-filter:blur(6px);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:4px;box-shadow:0 8px 24px rgba(0,0,0,.35);flex-direction:column;display:flex;gap:2px}.pc_compDropRow{border:0;background:0 0;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;border-radius:6px;padding:6px 8px;text-align:left;font-size:12px;line-height:16px;flex-direction:column;display:flex;gap:2px}.pc_compDropRow:hover{background:var(--dsw-alias-bg-layer-2)}.pc_compDropUrl{color:var(--dsw-alias-label-tertiary);font-size:11px;word-break:break-all}.pc_compToggle{position:fixed;left:336px;top:20px;z-index:46;opacity:.55;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:rgba(22,27,34,.72);font:inherit;cursor:pointer;width:20px;height:20px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:11px;line-height:1;backdrop-filter:blur(4px);transition:opacity .15s ease}.pc_compToggle:hover{opacity:1;border-color:var(--dsw-alias-state-business-primary)}.pc_toolbarMain{position:fixed;right:70px;top:20px;z-index:71;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:border-color .15s ease}.pc_toolbarMain:hover{border-color:var(--dsw-alias-state-business-primary)}.pc_toolbarMain[data-active=true]{border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_toolbarGroup{position:fixed;right:70px;top:56px;z-index:70;flex-direction:column;gap:8px;display:flex;transform-origin:top right;animation:pcDrawerIn .3s cubic-bezier(.34,1.56,.64,1)}@media (max-width:1160px){.pc_toolbarMain{top:104px}.pc_toolbarGroup{top:140px}.pc_aiToggle{top:104px}.pc_aiEmpower{top:132px}.pc_sourcesFloat{top:188px}.pc_modeFloat{top:288px}}@keyframes pcDrawerIn{from{opacity:0;transform:translateX(28px) scale(.94)}to{opacity:1;transform:translateX(0) scale(1)}}.pc_toolItem{opacity:.85;border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-3);font:inherit;cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px;transition:opacity .15s ease}.pc_toolItem:hover{opacity:1;border-color:var(--dsw-alias-state-business-primary)}.pc_toolItem[data-active=true]{opacity:1;border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.pc_toolItem[data-mode=true]{opacity:1;border-color:var(--dsw-alias-state-warning-primary);color:var(--dsw-alias-state-warning-primary)}.pc_switch{width:34px;height:18px;border-radius:999px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);position:relative;cursor:pointer;flex:none;transition:background .15s ease,border-color .15s ease}.pc_switch:hover{border-color:var(--dsw-alias-state-business-primary)}.pc_switch[data-on=true]{background:var(--dsw-alias-state-success-primary);border-color:var(--dsw-alias-state-success-primary)}.pc_switchKnob{position:absolute;top:2px;left:2px;width:12px;height:12px;border-radius:50%;background:#fff;transition:left .15s ease}.pc_switch[data-on=true] .pc_switchKnob{left:18px}.pc_aiSpinner{width:12px;height:12px;border:2px solid var(--dsw-alias-border-l2);border-top-color:var(--dsw-alias-state-business-primary);border-radius:50%;animation:pcspin 1s linear infinite;flex:none}.pc_aiSpinBtn{position:fixed;right:152px;top:20px;z-index:71;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);cursor:pointer;border-radius:8px;padding:6px 10px;display:flex;align-items:center;gap:6px;font-size:12px;line-height:16px}.pc_aiSpinBtn:hover{border-color:var(--dsw-alias-state-business-primary)}.pc_tag[data-bad=true]{border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary)}";
|
|
10
10
|
const tagId = "@noob-stupid/dsh-plugin-console/PluginConsoleTab.css";
|
|
11
11
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
12
12
|
const tag = document.createElement("style");
|
|
@@ -275,6 +275,13 @@ window.__ModuleLoader__.load({
|
|
|
275
275
|
sourcesDesc: "分工:① 软件源 = 下载 npm 包(安装用);② 索引源 = 市场首页清单 JSON;③ Git 源 = 克隆仓库代码(无 npm 包时);④ 搜索源 = 搜索时查哪个平台——搜到之后仍按 ①/③ 下载",
|
|
276
276
|
sourcePrimary: "主源",
|
|
277
277
|
setPrimary: "设为主源",
|
|
278
|
+
registryScan: "扫描软件源",
|
|
279
|
+
registryScanHint: "逐个探测每个软件源:是否可达、响应延迟、以及该源上 dsh-plugin-console 的最新版本(用于判断主源是否最优)",
|
|
280
|
+
registryScanning: "正在扫描…",
|
|
281
|
+
registryScanSummary: "扫描完成:{ok}/{total} 个可达",
|
|
282
|
+
registryScanBest: "最新版本 {version} 来自:{name}",
|
|
283
|
+
registryScanNoVersion: "该源上没有这个包",
|
|
284
|
+
registryScanFail: "不可达",
|
|
278
285
|
setPrimaryHint: "设为主源:优先使用它,失败时自动回退到其他源",
|
|
279
286
|
editSourceHint: "编辑:修改这个源的名称与地址",
|
|
280
287
|
removeSourceHint: "删除:从列表中移除这个源(不影响已安装的插件)",
|
|
@@ -611,6 +618,13 @@ window.__ModuleLoader__.load({
|
|
|
611
618
|
sourcesDesc: "Roles: ① registry = download npm packages (install); ② index sources = market list JSON; ③ git sources = clone repo code (when no npm package); ④ search sources = where to search — results are still downloaded via ①/③",
|
|
612
619
|
sourcePrimary: "Primary",
|
|
613
620
|
setPrimary: "Set primary",
|
|
621
|
+
registryScan: "Scan sources",
|
|
622
|
+
registryScanHint: "Probe each npm registry: reachability, latency, and the latest dsh-plugin-console version it serves (to pick the best primary)",
|
|
623
|
+
registryScanning: "Scanning…",
|
|
624
|
+
registryScanSummary: "Scan complete: {ok}/{total} reachable",
|
|
625
|
+
registryScanBest: "Newest {version} comes from: {name}",
|
|
626
|
+
registryScanNoVersion: "Package not on this registry",
|
|
627
|
+
registryScanFail: "unreachable",
|
|
614
628
|
setPrimaryHint: "Set primary: tried first, falls back to the others on failure",
|
|
615
629
|
editSourceHint: "Edit: change this source's name and URL",
|
|
616
630
|
removeSourceHint: "Remove: delete this source from the list (installed plugins unaffected)",
|
|
@@ -1008,23 +1022,31 @@ window.__ModuleLoader__.load({
|
|
|
1008
1022
|
return out;
|
|
1009
1023
|
}
|
|
1010
1024
|
/** 批量识别搜索结果:官方通道(根包 dsh.bundle)/ 聚合仓库(private+workspaces,子包才是插件)/ 普通项目。 */
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1025
|
+
/** 补标「官方 / 聚合」标记。每条要发网络请求(raw 多通道竞速),
|
|
1026
|
+
* 因此限制并发(默认 6 条一批),避免打满浏览器连接数拖慢整页。 */
|
|
1027
|
+
async function enrichOfficialBundle(items, concurrency = 6) {
|
|
1028
|
+
const out = [];
|
|
1029
|
+
for (let i = 0; i < items.length; i += concurrency) {
|
|
1030
|
+
const batch = items.slice(i, i + concurrency);
|
|
1031
|
+
const done = await Promise.all(batch.map(async (item) => {
|
|
1032
|
+
let official = null;
|
|
1033
|
+
let aggregate = false;
|
|
1034
|
+
const pkgText = await fetchRawText(item.fullName, item.defaultBranch, "package.json", item.source ?? "github");
|
|
1035
|
+
if (pkgText !== null) {
|
|
1036
|
+
try {
|
|
1037
|
+
const pkg = JSON.parse(pkgText);
|
|
1038
|
+
if (typeof pkg.dsh?.bundle?.patch === "string") {
|
|
1039
|
+
official = true;
|
|
1040
|
+
} else if (pkg.private === true && (Array.isArray(pkg.workspaces) || /(^|-)dsh[-/]/u.test(String(pkg.name ?? "")))) {
|
|
1041
|
+
aggregate = true;
|
|
1042
|
+
}
|
|
1043
|
+
} catch {}
|
|
1044
|
+
}
|
|
1045
|
+
return { ...item, official, aggregate };
|
|
1046
|
+
}));
|
|
1047
|
+
out.push(...done);
|
|
1048
|
+
}
|
|
1049
|
+
return out;
|
|
1028
1050
|
}
|
|
1029
1051
|
/** 源地址校验(与宿主端一致):https 任意;http 仅限本机/私网(内网源常用 http)。 */
|
|
1030
1052
|
function isAllowedSourceUrl(url) {
|
|
@@ -1071,6 +1093,87 @@ window.__ModuleLoader__.load({
|
|
|
1071
1093
|
const [indexData, setIndexData] = react.useState(null);
|
|
1072
1094
|
// 索引浏览当前展示条数(分页展示,避免一次渲染 500 条)
|
|
1073
1095
|
const [indexShown, setIndexShown] = react.useState(50);
|
|
1096
|
+
// 已补标(官方/聚合标记)到的索引位置:随「加载更多」增量推进,避免一次性发上千请求
|
|
1097
|
+
const [enrichedUpTo, setEnrichedUpTo] = react.useState(0);
|
|
1098
|
+
/** 合并一条补标结果(不动已有标记,避免 null 覆盖)。 */
|
|
1099
|
+
function mergeEnrichMark(e, b) {
|
|
1100
|
+
return {
|
|
1101
|
+
...e,
|
|
1102
|
+
official: e.official !== null ? e.official : (b?.official ?? null),
|
|
1103
|
+
aggregate: e.aggregate === true || b?.aggregate === true,
|
|
1104
|
+
aggregateInstallable: b?.aggregateInstallable === true,
|
|
1105
|
+
hasSkill: e.hasSkill === true || b?.hasSkill === true,
|
|
1106
|
+
hasSuite: e.hasSuite === true || b?.hasSuite === true,
|
|
1107
|
+
};
|
|
1108
|
+
}
|
|
1109
|
+
/** 服务端 /enrich 兜底:并发限流 12 + 24h 缓存,补齐客户端直连失败/遗漏的标记
|
|
1110
|
+
* (每次最多 30 条,按需分批;结果按位置合并回索引与当前展示切片)。 */
|
|
1111
|
+
function enrichRangeServer(from, slice) {
|
|
1112
|
+
const BATCH = 30;
|
|
1113
|
+
for (let i = 0; i < slice.length; i += BATCH) {
|
|
1114
|
+
const batch = slice.slice(i, i + BATCH);
|
|
1115
|
+
const start = from + i;
|
|
1116
|
+
call("/plugin-console/enrich", { items: batch }).then(
|
|
1117
|
+
(r) => {
|
|
1118
|
+
if (r === null || !Array.isArray(r.items)) return;
|
|
1119
|
+
const got = r.items;
|
|
1120
|
+
setIndexData((prev) => {
|
|
1121
|
+
if (prev === null || prev.loaded !== true) return prev;
|
|
1122
|
+
const items = [...prev.items];
|
|
1123
|
+
got.forEach((e, k) => {
|
|
1124
|
+
const idx = start + k;
|
|
1125
|
+
if (idx < items.length) items[idx] = mergeEnrichMark(e, items[idx]);
|
|
1126
|
+
});
|
|
1127
|
+
return { ...prev, items };
|
|
1128
|
+
});
|
|
1129
|
+
setMarket((prev) => {
|
|
1130
|
+
if (prev === null || prev.status !== "ready" || prev.fromIndex !== true) return prev;
|
|
1131
|
+
return {
|
|
1132
|
+
...prev,
|
|
1133
|
+
data: prev.data.map((it) => {
|
|
1134
|
+
const hit = got.find((e) => e.fullName === it.fullName);
|
|
1135
|
+
return hit ? mergeEnrichMark(hit, it) : it;
|
|
1136
|
+
}),
|
|
1137
|
+
};
|
|
1138
|
+
});
|
|
1139
|
+
},
|
|
1140
|
+
() => {},
|
|
1141
|
+
);
|
|
1142
|
+
}
|
|
1143
|
+
}
|
|
1144
|
+
/** 增量补标索引区间 [from, to):首屏先补前 50 条,之后随「加载更多」继续往下补。 */
|
|
1145
|
+
function enrichRange(from, to, list) {
|
|
1146
|
+
const slice = (list ?? []).slice(from, to);
|
|
1147
|
+
if (slice.length === 0) return;
|
|
1148
|
+
enrichOfficialBundle(slice).then((enriched) => {
|
|
1149
|
+
if (!Array.isArray(enriched)) return;
|
|
1150
|
+
setIndexData((prev) => {
|
|
1151
|
+
if (prev === null || prev.loaded !== true) return prev;
|
|
1152
|
+
const items = [...prev.items];
|
|
1153
|
+
enriched.forEach((e, i) => {
|
|
1154
|
+
const idx = from + i;
|
|
1155
|
+
if (idx < items.length) items[idx] = mergeEnrichMark(e, items[idx]);
|
|
1156
|
+
});
|
|
1157
|
+
return { ...prev, items };
|
|
1158
|
+
});
|
|
1159
|
+
// 同步刷新当前展示的切片(引用变化才会重渲染)
|
|
1160
|
+
setMarket((prev) => {
|
|
1161
|
+
if (prev === null || prev.status !== "ready" || prev.fromIndex !== true) return prev;
|
|
1162
|
+
return {
|
|
1163
|
+
...prev,
|
|
1164
|
+
data: prev.data.map((it) => {
|
|
1165
|
+
const hit = enriched.find((e) => e.fullName === it.fullName);
|
|
1166
|
+
return hit ? mergeEnrichMark(hit, it) : it;
|
|
1167
|
+
}),
|
|
1168
|
+
};
|
|
1169
|
+
});
|
|
1170
|
+
setEnrichedUpTo((prev) => Math.max(prev, to));
|
|
1171
|
+
});
|
|
1172
|
+
// ② 服务端 /enrich 兜底:延后 1.5 秒执行(不抢首屏带宽),走 24h 缓存 + 并发限流通道
|
|
1173
|
+
if (typeof window.setTimeout === "function") {
|
|
1174
|
+
window.setTimeout(() => enrichRangeServer(from, slice), 1500);
|
|
1175
|
+
}
|
|
1176
|
+
}
|
|
1074
1177
|
// 市场总模式:'plugins' = 插件市场 / 'skills' = 技能市场(localStorage 持久化)
|
|
1075
1178
|
const [mode, setMode] = react.useState(() => {
|
|
1076
1179
|
try { return localStorage.getItem("pc-market-mode") === "skills" ? "skills" : "plugins"; } catch { return "plugins"; }
|
|
@@ -1435,6 +1538,8 @@ window.__ModuleLoader__.load({
|
|
|
1435
1538
|
const [sourceName, setSourceName] = react.useState("");
|
|
1436
1539
|
const [sourceUrl, setSourceUrl] = react.useState("");
|
|
1437
1540
|
const [sourcesBusy, setSourcesBusy] = react.useState(false);
|
|
1541
|
+
// 软件源扫描结果:null=未扫描 / {status:'scanning'} / {status:'ready', results, scannedAt}
|
|
1542
|
+
const [regScan, setRegScan] = react.useState(null);
|
|
1438
1543
|
// registry 行内编辑
|
|
1439
1544
|
const [editReg, setEditReg] = react.useState(null);
|
|
1440
1545
|
const [indexSourceName, setIndexSourceName] = react.useState("");
|
|
@@ -1509,24 +1614,14 @@ window.__ModuleLoader__.load({
|
|
|
1509
1614
|
cachedAt: typeof data.cachedAt === "number" ? data.cachedAt : null,
|
|
1510
1615
|
sourceName: typeof data.sourceName === "string" ? data.sourceName : null,
|
|
1511
1616
|
});
|
|
1512
|
-
//
|
|
1513
|
-
|
|
1514
|
-
const
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
...e,
|
|
1521
|
-
official: e.official !== null ? e.official : (b.official ?? null),
|
|
1522
|
-
aggregate: e.aggregate === true || b.aggregate === true,
|
|
1523
|
-
aggregateInstallable: b.aggregateInstallable === true,
|
|
1524
|
-
hasSkill: e.hasSkill === true || b.hasSkill === true,
|
|
1525
|
-
hasSuite: e.hasSuite === true || b.hasSuite === true,
|
|
1526
|
-
};
|
|
1527
|
-
});
|
|
1528
|
-
setIndexData((prev) => (prev !== null && prev.loaded === true ? { ...prev, items: merged } : prev));
|
|
1529
|
-
});
|
|
1617
|
+
// ★「只看官方」需要官方标记:先补首屏 50 条,其余随「加载更多」增量补
|
|
1618
|
+
//(每条要发网络请求,全量 500 条会打满浏览器连接数,导致打开插件页明显变慢)
|
|
1619
|
+
const runEnrich = () => enrichRange(0, 50, data.items);
|
|
1620
|
+
if (typeof window.requestIdleCallback === "function") {
|
|
1621
|
+
window.requestIdleCallback(() => runEnrich(), { timeout: 2000 });
|
|
1622
|
+
} else {
|
|
1623
|
+
window.setTimeout(runEnrich, 400);
|
|
1624
|
+
}
|
|
1530
1625
|
}
|
|
1531
1626
|
},
|
|
1532
1627
|
(error) => setMessage(t("marketIndexFailed") + ":" + (error?.message ?? t("unknown"))),
|
|
@@ -1871,6 +1966,8 @@ window.__ModuleLoader__.load({
|
|
|
1871
1966
|
const more = sourceData.slice(0, indexShown + next * 50);
|
|
1872
1967
|
setMarket({ status: "ready", data: more, direct: false, source: "github", fromIndex: true });
|
|
1873
1968
|
setIndexShown(indexShown + next * 50);
|
|
1969
|
+
// 新增的这段继续补「官方/聚合」标记(与首屏同样的增量策略)
|
|
1970
|
+
if (mode !== "skills") enrichRange(enrichedUpTo, indexShown + next * 50, indexData.items);
|
|
1874
1971
|
setLoadingMore(false);
|
|
1875
1972
|
return;
|
|
1876
1973
|
}
|
|
@@ -2159,6 +2256,29 @@ window.__ModuleLoader__.load({
|
|
|
2159
2256
|
}
|
|
2160
2257
|
sourcesAction({ action: "add", name: sourceName.trim(), url: sourceUrl.trim() }, () => { setSourceName(""); setSourceUrl(""); });
|
|
2161
2258
|
};
|
|
2259
|
+
/** 软件源扫描:服务端并发探测每个源(可达性/延迟/最新版本),结果显示在源列表行内。 */
|
|
2260
|
+
const scanRegistries = () => {
|
|
2261
|
+
setRegScan({ status: "scanning" });
|
|
2262
|
+
call("/plugin-console/registry-scan", {}).then(
|
|
2263
|
+
(data) => setRegScan({ status: "ready", results: Array.isArray(data.results) ? data.results : [], scannedAt: typeof data.scannedAt === "number" ? data.scannedAt : null }),
|
|
2264
|
+
(error) => { setRegScan(null); setMessage(t("failed") + ":" + friendlyGithubError(error).message); },
|
|
2265
|
+
);
|
|
2266
|
+
};
|
|
2267
|
+
// 扫描结果派生视图:每条源的命中结果 + 可达计数 + 最新版本来自哪个源
|
|
2268
|
+
const scanRows = regScan !== null && regScan.status === "ready" ? regScan.results : [];
|
|
2269
|
+
const scanOf = (id) => scanRows.find((row) => row.id === id) ?? null;
|
|
2270
|
+
const scanOkCount = scanRows.filter((row) => row.ok === true).length;
|
|
2271
|
+
const scanBest = (() => {
|
|
2272
|
+
const withVersion = scanRows.filter((row) => row.ok === true && typeof row.latest === "string");
|
|
2273
|
+
if (withVersion.length === 0) return null;
|
|
2274
|
+
const parse = (v) => String(v).split(".").map((n) => Number.parseInt(n, 10) || 0);
|
|
2275
|
+
const newer = (a, b) => {
|
|
2276
|
+
const [pa, pb] = [parse(a), parse(b)];
|
|
2277
|
+
for (let i = 0; i < 3; i += 1) if (pa[i] !== pb[i]) return pa[i] > pb[i];
|
|
2278
|
+
return false;
|
|
2279
|
+
};
|
|
2280
|
+
return withVersion.reduce((best, row) => (best === null || newer(row.latest, best.latest) ? row : best), null);
|
|
2281
|
+
})();
|
|
2162
2282
|
const saveEditReg = () => {
|
|
2163
2283
|
if (editReg === null) return;
|
|
2164
2284
|
sourcesAction({ action: "edit", id: editReg.id, name: editReg.name, url: editReg.url }, () => setEditReg(null));
|
|
@@ -3675,7 +3795,22 @@ setMessage(t("failed") + ":" + (data?.reason ?? "未知"));
|
|
|
3675
3795
|
: el("div", { key: src.id, className: styles.rowTop, style: { justifyContent: "space-between" } },
|
|
3676
3796
|
el("div", { className: styles.rowTop, style: { flex: 1, minWidth: 0 } },
|
|
3677
3797
|
el("strong", { className: styles.name, style: { flex: "none", maxWidth: "35%" } }, src.name + (src.primary ? "(" + t("sourcePrimary") + ")" : "")),
|
|
3678
|
-
el("code", { className: styles.srcUrl }, src.url)
|
|
3798
|
+
el("code", { className: styles.srcUrl }, src.url),
|
|
3799
|
+
(() => {
|
|
3800
|
+
const hit = scanOf(src.id);
|
|
3801
|
+
if (hit === null) return null;
|
|
3802
|
+
const title = hit.ok === true
|
|
3803
|
+
? hit.url + " · " + hit.ms + "ms" + (hit.versions !== null ? " · " + hit.versions + " 个版本" : "") + (hit.latest === null ? " · " + t("registryScanNoVersion") : "")
|
|
3804
|
+
: hit.url + " · " + (hit.error ?? t("registryScanFail")) + " · " + hit.ms + "ms";
|
|
3805
|
+
return el("span", {
|
|
3806
|
+
className: styles.tag,
|
|
3807
|
+
"data-enabled": hit.ok === true ? "true" : undefined,
|
|
3808
|
+
"data-bad": hit.ok === true ? undefined : "true",
|
|
3809
|
+
title,
|
|
3810
|
+
}, hit.ok === true
|
|
3811
|
+
? "✓ " + hit.ms + "ms" + (hit.latest !== null ? " · v" + hit.latest : " · " + t("registryScanNoVersion"))
|
|
3812
|
+
: "✗ " + (hit.error ?? t("registryScanFail")));
|
|
3813
|
+
})()),
|
|
3679
3814
|
el("div", { className: styles.rowTop },
|
|
3680
3815
|
src.primary ? null : el("button", { type: "button", className: styles.toggle, title: t("setPrimaryHint"), disabled: sourcesBusy, onClick: () => sourcesAction({ action: "set-primary", id: src.id }) }, t("setPrimary")),
|
|
3681
3816
|
el("button", { type: "button", className: styles.toggle, title: t("editSourceHint"), disabled: sourcesBusy, onClick: () => setEditReg({ id: src.id, name: src.name, url: src.url }) }, t("editSource"))))),
|
|
@@ -3683,6 +3818,20 @@ setMessage(t("failed") + ":" + (data?.reason ?? "未知"));
|
|
|
3683
3818
|
el("input", { type: "text", placeholder: t("sourceName"), value: sourceName, onChange: (event) => setSourceName(event.currentTarget.value), style: { flex: 1, minWidth: 0 } }),
|
|
3684
3819
|
el("input", { type: "text", placeholder: t("sourceUrl"), value: sourceUrl, onChange: (event) => setSourceUrl(event.currentTarget.value), style: { flex: 2, minWidth: 0 } }),
|
|
3685
3820
|
el("button", { type: "button", className: styles.toggle, disabled: sourcesBusy, onClick: addSource }, t("addSource"))),
|
|
3821
|
+
el("div", { className: styles.rowTop },
|
|
3822
|
+
el("button", {
|
|
3823
|
+
type: "button",
|
|
3824
|
+
className: styles.toggle,
|
|
3825
|
+
title: t("registryScanHint"),
|
|
3826
|
+
disabled: regScan !== null && regScan.status === "scanning",
|
|
3827
|
+
onClick: scanRegistries,
|
|
3828
|
+
}, regScan !== null && regScan.status === "scanning" ? t("registryScanning") : t("registryScan")),
|
|
3829
|
+
regScan !== null && regScan.status === "scanning" ? el("span", { className: styles.spinner }) : null,
|
|
3830
|
+
regScan !== null && regScan.status === "ready"
|
|
3831
|
+
? el("span", { className: styles.message },
|
|
3832
|
+
t("registryScanSummary").replace("{ok}", String(scanOkCount)).replace("{total}", String(scanRows.length))
|
|
3833
|
+
+ (scanBest !== null ? " · " + t("registryScanBest").replace("{version}", scanBest.latest).replace("{name}", scanBest.name) : ""))
|
|
3834
|
+
: null),
|
|
3686
3835
|
]),
|
|
3687
3836
|
accSection("index", t("indexSourcesTitle"), [
|
|
3688
3837
|
el("p", { className: styles.message }, t("indexSourcesDesc")),
|
package/lib/index.js
CHANGED
|
@@ -1800,23 +1800,29 @@ async function enrichItemOne(item) {
|
|
|
1800
1800
|
const pkg = JSON.parse(pkgResult.value)
|
|
1801
1801
|
if (typeof pkg.dsh?.bundle?.patch === 'string') {
|
|
1802
1802
|
official = true
|
|
1803
|
-
} else
|
|
1804
|
-
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
const
|
|
1813
|
-
.
|
|
1814
|
-
.
|
|
1815
|
-
|
|
1816
|
-
|
|
1803
|
+
} else {
|
|
1804
|
+
// 成功读到 package.json 且没有 dsh.bundle.patch → 确定「非官方」。
|
|
1805
|
+
// 必须落成 false(而不是留 null),否则缓存条件 official !== null 永不成立,
|
|
1806
|
+
// 每个非官方插件每次打开都重新请求 → /enrich 缓存命中也要十几秒。
|
|
1807
|
+
official = false
|
|
1808
|
+
if (pkg.private === true && (Array.isArray(pkg.workspaces) || /(^|-)dsh[-/]/u.test(String(pkg.name ?? '')))) {
|
|
1809
|
+
aggregate = true
|
|
1810
|
+
try {
|
|
1811
|
+
const tree = await curlJson(`https://api.github.com/repos/${item.fullName}/git/trees/${encodeURIComponent(branch)}?recursive=1`, 6000)
|
|
1812
|
+
const pkgPaths = (tree.tree ?? [])
|
|
1813
|
+
.filter((n) => n.type === 'blob' && /^packages\/[^/]+\/package\.json$/u.test(n.path))
|
|
1814
|
+
.map((n) => n.path)
|
|
1815
|
+
.slice(0, 12)
|
|
1816
|
+
if (pkgPaths.length > 0) {
|
|
1817
|
+
const subs = await Promise.all(pkgPaths.map((p) => curlText(`https://raw.githubusercontent.com/${item.fullName}/${encodeURIComponent(branch)}/${p}`, 4000)
|
|
1818
|
+
.then((t) => { try { return JSON.parse(t) } catch { return null } })
|
|
1819
|
+
.catch(() => null)))
|
|
1820
|
+
if (subs.some((sp) => sp && typeof sp.dsh?.bundle?.patch === 'string')) {
|
|
1821
|
+
aggregateInstallable = true
|
|
1822
|
+
}
|
|
1817
1823
|
}
|
|
1818
|
-
}
|
|
1819
|
-
}
|
|
1824
|
+
} catch {}
|
|
1825
|
+
}
|
|
1820
1826
|
}
|
|
1821
1827
|
}
|
|
1822
1828
|
if (skillResult.status === 'fulfilled' && skillResult.value?.hasSkill === true) {
|
|
@@ -1845,9 +1851,13 @@ async function enrichItems(items) {
|
|
|
1845
1851
|
const key = `${item.fullName}@${item.defaultBranch ?? 'main'}`
|
|
1846
1852
|
const cached = cache[key]
|
|
1847
1853
|
try {
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1854
|
+
// official 已判定(true/false)→ 24h 缓存;判定失败(null)→ 1h 短缓存,减少无谓重试
|
|
1855
|
+
if (cached !== undefined && typeof cached?.at === 'number' && cached.data) {
|
|
1856
|
+
const ttl = cached.data.official === null ? 60 * 60 * 1000 : ENRICH_CACHE_TTL
|
|
1857
|
+
if (Date.now() - cached.at < ttl) {
|
|
1858
|
+
out[i] = { ...item, ...cached.data }
|
|
1859
|
+
continue
|
|
1860
|
+
}
|
|
1851
1861
|
}
|
|
1852
1862
|
let result = await enrichItemOne(item)
|
|
1853
1863
|
// 本次失败 → 回退缓存(哪怕已过期),避免「看天吃饭」
|
|
@@ -1859,7 +1869,16 @@ async function enrichItems(items) {
|
|
|
1859
1869
|
}
|
|
1860
1870
|
out[i] = result
|
|
1861
1871
|
} catch {
|
|
1862
|
-
|
|
1872
|
+
// 抛错的条目也必须写缓存(null 结果 + 1h 短 TTL),否则每次打开都重试同一批,
|
|
1873
|
+
// /enrich 即使「命中缓存」也要等十几秒。
|
|
1874
|
+
if (cached?.data) {
|
|
1875
|
+
out[i] = { ...item, ...cached.data }
|
|
1876
|
+
} else {
|
|
1877
|
+
const miss = { official: null, aggregate: false, aggregateInstallable: false, hasSkill: false, hasSuite: false }
|
|
1878
|
+
cache[key] = { at: Date.now(), data: miss }
|
|
1879
|
+
cacheDirty = true
|
|
1880
|
+
out[i] = { ...item, ...miss }
|
|
1881
|
+
}
|
|
1863
1882
|
}
|
|
1864
1883
|
}
|
|
1865
1884
|
}
|
|
@@ -4880,6 +4899,39 @@ async function handle(ctx, req, res) {
|
|
|
4880
4899
|
return
|
|
4881
4900
|
}
|
|
4882
4901
|
|
|
4902
|
+
// 软件源扫描:并发探测每个 npm 源的「可达性 / 延迟 / 该源上的最新版本」。
|
|
4903
|
+
// 用于判断主源是否最优(内网私服 vs 公共镜像),结果直接在前端软件源列表里显示。
|
|
4904
|
+
if (pathname === `${ROUTE_PREFIX}/registry-scan`) {
|
|
4905
|
+
const sources = readSources()
|
|
4906
|
+
const scanPkg = '@noob-stupid/dsh-plugin-console'
|
|
4907
|
+
const encoded = encodeURIComponent(scanPkg)
|
|
4908
|
+
const scanOne = async (r) => {
|
|
4909
|
+
const started = Date.now()
|
|
4910
|
+
const base = { id: r.id, name: r.name, url: r.url, primary: r.primary === true }
|
|
4911
|
+
try {
|
|
4912
|
+
const response = await fetch(`${String(r.url).replace(/\/+$/u, '')}/${encoded}`, {
|
|
4913
|
+
headers: { accept: 'application/vnd.npm.install-v1+json' },
|
|
4914
|
+
signal: AbortSignal.timeout(8000),
|
|
4915
|
+
})
|
|
4916
|
+
const ms = Date.now() - started
|
|
4917
|
+
if (!response.ok) return { ...base, ok: false, ms, status: response.status, latest: null, versions: null, error: `HTTP ${response.status}` }
|
|
4918
|
+
const data = await response.json()
|
|
4919
|
+
const latest = typeof data?.['dist-tags']?.latest === 'string' ? data['dist-tags'].latest : null
|
|
4920
|
+
const versions = data?.versions !== undefined && data.versions !== null && typeof data.versions === 'object' ? Object.keys(data.versions).length : null
|
|
4921
|
+
return { ...base, ok: true, ms, status: response.status, latest, versions, error: null }
|
|
4922
|
+
} catch (error) {
|
|
4923
|
+
const ms = Date.now() - started
|
|
4924
|
+
const message = error?.name === 'TimeoutError'
|
|
4925
|
+
? '超时(8s)'
|
|
4926
|
+
: (error instanceof Error ? error.message : String(error))
|
|
4927
|
+
return { ...base, ok: false, ms, status: null, latest: null, versions: null, error: message }
|
|
4928
|
+
}
|
|
4929
|
+
}
|
|
4930
|
+
const results = await Promise.all(sources.registries.map((r) => scanOne(r)))
|
|
4931
|
+
sendJson(res, 200, { ok: true, pkg: scanPkg, scannedAt: Date.now(), results })
|
|
4932
|
+
return
|
|
4933
|
+
}
|
|
4934
|
+
|
|
4883
4935
|
if (pathname === `${ROUTE_PREFIX}/sources`) {
|
|
4884
4936
|
const { action } = body
|
|
4885
4937
|
const sources = readSources()
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noob-stupid/dsh-plugin-console",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.32",
|
|
4
4
|
"description": "DSH plugin management panel & marketplace: one-click enable/disable, multi-source market (GitHub/Gitee/custom), static-index market (500+ plugins / 300 skills), skills, suites, and one-click framework upgrade.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|